@ -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