Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

internal/ethapi: CallArgs.ToMessage method #20854

Merged
merged 3 commits into from
Apr 3, 2020
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 37 additions & 32 deletions internal/ethapi/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,42 @@ type CallArgs struct {
Data *hexutil.Bytes `json:"data"`
}

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)
}

// Create new call message
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
Expand All @@ -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.
Expand Down Expand Up @@ -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.
Expand All @@ -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
Expand Down