|
|
@ -741,7 +741,7 @@ type CallArgs struct { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ToMessage converts CallArgs to the Message type used by the core evm
|
|
|
|
// 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.
|
|
|
|
// Set sender address or use zero address if none specified.
|
|
|
|
var addr common.Address |
|
|
|
var addr common.Address |
|
|
|
if args.From != nil { |
|
|
|
if args.From != nil { |
|
|
@ -753,9 +753,9 @@ func (args *CallArgs) ToMessage(globalGasCap *big.Int) types.Message { |
|
|
|
if args.Gas != nil { |
|
|
|
if args.Gas != nil { |
|
|
|
gas = uint64(*args.Gas) |
|
|
|
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) |
|
|
|
log.Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap) |
|
|
|
gas = globalGasCap.Uint64() |
|
|
|
gas = globalGasCap |
|
|
|
} |
|
|
|
} |
|
|
|
gasPrice := new(big.Int) |
|
|
|
gasPrice := new(big.Int) |
|
|
|
if args.GasPrice != nil { |
|
|
|
if args.GasPrice != nil { |
|
|
@ -790,7 +790,7 @@ type account struct { |
|
|
|
StateDiff *map[common.Hash]common.Hash `json:"stateDiff"` |
|
|
|
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()) |
|
|
|
defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) |
|
|
|
|
|
|
|
|
|
|
|
state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) |
|
|
|
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() { |
|
|
|
if evm.Cancelled() { |
|
|
|
return nil, fmt.Errorf("execution aborted (timeout = %v)", timeout) |
|
|
|
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 { |
|
|
|
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 |
|
|
|
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
|
|
|
|
// Binary search the gas requirement, as it may be higher than the amount used
|
|
|
|
var ( |
|
|
|
var ( |
|
|
|
lo uint64 = params.TxGas - 1 |
|
|
|
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.
|
|
|
|
// 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) |
|
|
|
log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", gasCap) |
|
|
|
hi = gasCap.Uint64() |
|
|
|
hi = gasCap |
|
|
|
} |
|
|
|
} |
|
|
|
cap = hi |
|
|
|
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) |
|
|
|
result, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap) |
|
|
|
if err != nil { |
|
|
|
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, nil // Special case, raise gas limit
|
|
|
|
} |
|
|
|
} |
|
|
|
return true, nil, err // Bail out
|
|
|
|
return true, nil, err // Bail out
|
|
|
|