node icon indicating copy to clipboard operation
node copied to clipboard

Return proper ABI types in precompiles (prototype and staking)

Open fbac opened this issue 1 year ago • 0 comments

Describe the Bug Currently the prototype and staking precompiles doesn't return the expected values from a smart contract perspective in case of failure.

Example in the following snippet, look at the if execErr != nil statement:

	case GetAllValidatorsMethodName:
		var res []byte
		execErr := stateDB.ExecuteNativeAction(contract.Address(), nil, func(ctx sdk.Context) error {
			res, err = c.GetAllValidators(ctx, method)
			return err
		})
		if execErr != nil {
			return nil, err
		}
		return res, nil

Returning nil, err looks like an unexpected revert from another smart contract calling the precompile.

Instead of this, we should do return method.Outputs.Pack(SANE_ERROR_VALUE), where a sane error value is false, 0 or any values that applies.

Affected precompiles: prototype, staking.

fbac avatar Sep 23 '24 12:09 fbac