mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
create ToMessage method
This commit is contained in:
parent
f15849cf00
commit
56462e721a
1 changed files with 37 additions and 32 deletions
|
|
@ -739,6 +739,42 @@ type CallArgs struct {
|
||||||
Data *hexutil.Bytes `json:"data"`
|
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
|
// account indicates the overriding fields of account during the execution of
|
||||||
// a message call.
|
// a message call.
|
||||||
// Note, state and stateDiff can't be specified at the same time. If state is
|
// 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
|
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.
|
// Override the fields of specified contracts before execution.
|
||||||
for addr, account := range overrides {
|
for addr, account := range overrides {
|
||||||
// Override account nonce.
|
// 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
|
// Setup context so it may be cancelled the call has completed
|
||||||
// or, in case of unmetered gas, setup a context with a timeout.
|
// 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()
|
defer cancel()
|
||||||
|
|
||||||
// Get a new instance of the EVM.
|
// Get a new instance of the EVM.
|
||||||
|
msg := args.ToMessage(globalGasCap)
|
||||||
evm, vmError, err := b.GetEVM(ctx, msg, state, header)
|
evm, vmError, err := b.GetEVM(ctx, msg, state, header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, false, err
|
return nil, 0, false, err
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue