|
|
@@ -741,7 +741,7 @@ type CallArgs struct {
|
|
|
}
|
|
|
|
|
|
// ToMessage converts CallArgs to the Message type used by the core evm
|
|
|
-func (args *CallArgs) ToMessage(globalGasCap *big.Int) types.Message {
|
|
|
+func (args *CallArgs) ToMessage(globalGasCap uint64) types.Message {
|
|
|
// Set sender address or use zero address if none specified.
|
|
|
var addr common.Address
|
|
|
if args.From != nil {
|
|
|
@@ -753,9 +753,9 @@ func (args *CallArgs) ToMessage(globalGasCap *big.Int) types.Message {
|
|
|
if args.Gas != nil {
|
|
|
gas = uint64(*args.Gas)
|
|
|
}
|
|
|
- if globalGasCap != nil && globalGasCap.Uint64() < gas {
|
|
|
+ if globalGasCap != 0 && globalGasCap < gas {
|
|
|
log.Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap)
|
|
|
- gas = globalGasCap.Uint64()
|
|
|
+ gas = globalGasCap
|
|
|
}
|
|
|
gasPrice := new(big.Int)
|
|
|
if args.GasPrice != nil {
|
|
|
@@ -790,7 +790,7 @@ type account struct {
|
|
|
StateDiff *map[common.Hash]common.Hash `json:"stateDiff"`
|
|
|
}
|
|
|
|
|
|
-func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides map[common.Address]account, vmCfg vm.Config, timeout time.Duration, globalGasCap *big.Int) (*core.ExecutionResult, error) {
|
|
|
+func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides map[common.Address]account, vmCfg vm.Config, timeout time.Duration, globalGasCap uint64) (*core.ExecutionResult, error) {
|
|
|
defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now())
|
|
|
|
|
|
state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
|
|
|
@@ -861,7 +861,10 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.Blo
|
|
|
if evm.Cancelled() {
|
|
|
return nil, fmt.Errorf("execution aborted (timeout = %v)", timeout)
|
|
|
}
|
|
|
- return result, err
|
|
|
+ if err != nil {
|
|
|
+ return result, fmt.Errorf("err: %w (supplied gas %d)", err, msg.Gas())
|
|
|
+ }
|
|
|
+ return result, nil
|
|
|
}
|
|
|
|
|
|
func newRevertError(result *core.ExecutionResult) *revertError {
|
|
|
@@ -916,7 +919,7 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNrOr
|
|
|
return result.Return(), result.Err
|
|
|
}
|
|
|
|
|
|
-func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap *big.Int) (hexutil.Uint64, error) {
|
|
|
+func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap uint64) (hexutil.Uint64, error) {
|
|
|
// Binary search the gas requirement, as it may be higher than the amount used
|
|
|
var (
|
|
|
lo uint64 = params.TxGas - 1
|
|
|
@@ -964,9 +967,9 @@ func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash
|
|
|
}
|
|
|
}
|
|
|
// Recap the highest gas allowance with specified gascap.
|
|
|
- if gasCap != nil && hi > gasCap.Uint64() {
|
|
|
+ if gasCap != 0 && hi > gasCap {
|
|
|
log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", gasCap)
|
|
|
- hi = gasCap.Uint64()
|
|
|
+ hi = gasCap
|
|
|
}
|
|
|
cap = hi
|
|
|
|
|
|
@@ -976,7 +979,7 @@ func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash
|
|
|
|
|
|
result, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap)
|
|
|
if err != nil {
|
|
|
- if err == core.ErrIntrinsicGas {
|
|
|
+ if errors.Is(err, core.ErrIntrinsicGas) {
|
|
|
return true, nil, nil // Special case, raise gas limit
|
|
|
}
|
|
|
return true, nil, err // Bail out
|