|
|
@@ -739,6 +739,42 @@ type CallArgs struct {
|
|
|
Data *hexutil.Bytes `json:"data"`
|
|
|
}
|
|
|
|
|
|
+// ToMessage converts CallArgs to the Message type used by the core evm
|
|
|
+func (args *CallArgs) ToMessage(globalGasCap *big.Int) types.Message {
|
|
|
+ // Set sender address or use zero address if none specified.
|
|
|
+ var addr common.Address
|
|
|
+ if args.From != nil {
|
|
|
+ addr = *args.From
|
|
|
+ }
|
|
|
+
|
|
|
+ // Set default gas & gas price if none were set
|
|
|
+ gas := uint64(math.MaxUint64 / 2)
|
|
|
+ if args.Gas != nil {
|
|
|
+ gas = uint64(*args.Gas)
|
|
|
+ }
|
|
|
+ if globalGasCap != nil && globalGasCap.Uint64() < gas {
|
|
|
+ log.Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap)
|
|
|
+ gas = globalGasCap.Uint64()
|
|
|
+ }
|
|
|
+ gasPrice := new(big.Int)
|
|
|
+ if args.GasPrice != nil {
|
|
|
+ gasPrice = args.GasPrice.ToInt()
|
|
|
+ }
|
|
|
+
|
|
|
+ value := new(big.Int)
|
|
|
+ if args.Value != nil {
|
|
|
+ value = args.Value.ToInt()
|
|
|
+ }
|
|
|
+
|
|
|
+ var data []byte
|
|
|
+ if args.Data != nil {
|
|
|
+ data = []byte(*args.Data)
|
|
|
+ }
|
|
|
+
|
|
|
+ msg := types.NewMessage(addr, args.To, 0, value, gas, gasPrice, data, false)
|
|
|
+ return msg
|
|
|
+}
|
|
|
+
|
|
|
// account indicates the overriding fields of account during the execution of
|
|
|
// a message call.
|
|
|
// Note, state and stateDiff can't be specified at the same time. If state is
|
|
|
@@ -761,12 +797,6 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.Blo
|
|
|
return nil, 0, false, err
|
|
|
}
|
|
|
|
|
|
- // Set sender address or use zero address if none specified.
|
|
|
- var addr common.Address
|
|
|
- if args.From != nil {
|
|
|
- addr = *args.From
|
|
|
- }
|
|
|
-
|
|
|
// Override the fields of specified contracts before execution.
|
|
|
for addr, account := range overrides {
|
|
|
// Override account nonce.
|
|
|
@@ -795,32 +825,6 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.Blo
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // Set default gas & gas price if none were set
|
|
|
- gas := uint64(math.MaxUint64 / 2)
|
|
|
- if args.Gas != nil {
|
|
|
- gas = uint64(*args.Gas)
|
|
|
- }
|
|
|
- if globalGasCap != nil && globalGasCap.Uint64() < gas {
|
|
|
- log.Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap)
|
|
|
- gas = globalGasCap.Uint64()
|
|
|
- }
|
|
|
- gasPrice := new(big.Int)
|
|
|
- if args.GasPrice != nil {
|
|
|
- gasPrice = args.GasPrice.ToInt()
|
|
|
- }
|
|
|
-
|
|
|
- value := new(big.Int)
|
|
|
- if args.Value != nil {
|
|
|
- value = args.Value.ToInt()
|
|
|
- }
|
|
|
-
|
|
|
- var data []byte
|
|
|
- if args.Data != nil {
|
|
|
- data = []byte(*args.Data)
|
|
|
- }
|
|
|
-
|
|
|
- // Create new call message
|
|
|
- msg := types.NewMessage(addr, args.To, 0, value, gas, gasPrice, data, false)
|
|
|
|
|
|
// Setup context so it may be cancelled the call has completed
|
|
|
// or, in case of unmetered gas, setup a context with a timeout.
|
|
|
@@ -835,6 +839,7 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.Blo
|
|
|
defer cancel()
|
|
|
|
|
|
// Get a new instance of the EVM.
|
|
|
+ msg := args.ToMessage(globalGasCap)
|
|
|
evm, vmError, err := b.GetEVM(ctx, msg, state, header)
|
|
|
if err != nil {
|
|
|
return nil, 0, false, err
|