Merge pull request #23027 from karalabe/1559-call
core, internal: support various eth_call invocations post 1559
This commit is contained in:
9 files changed
+62
-51
No files matched your search
+21
-19
@@ -221,23 +221,26 @@ func (st *StateTransition) preCheck() error {
|
||||
}
|
||||
// Make sure that transaction gasFeeCap is greater than the baseFee (post london)
|
||||
if st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) {
|
||||
if l := st.gasFeeCap.BitLen(); l > 256 {
|
||||
return fmt.Errorf("%w: address %v, maxFeePerGas bit length: %d", ErrFeeCapVeryHigh,
|
||||
st.msg.From().Hex(), l)
|
||||
}
|
||||
if l := st.gasTipCap.BitLen(); l > 256 {
|
||||
return fmt.Errorf("%w: address %v, maxPriorityFeePerGas bit length: %d", ErrTipVeryHigh,
|
||||
st.msg.From().Hex(), l)
|
||||
}
|
||||
if st.gasFeeCap.Cmp(st.gasTipCap) < 0 {
|
||||
return fmt.Errorf("%w: address %v, maxPriorityFeePerGas: %s, maxFeePerGas: %s", ErrTipAboveFeeCap,
|
||||
st.msg.From().Hex(), st.gasTipCap, st.gasFeeCap)
|
||||
}
|
||||
// This will panic if baseFee is nil, but basefee presence is verified
|
||||
// as part of header validation.
|
||||
if st.gasFeeCap.Cmp(st.evm.Context.BaseFee) < 0 {
|
||||
return fmt.Errorf("%w: address %v, maxFeePerGas: %s baseFee: %s", ErrFeeCapTooLow,
|
||||
st.msg.From().Hex(), st.gasFeeCap, st.evm.Context.BaseFee)
|
||||
// Skip the checks if gas fields are zero and baseFee was explicitly disabled (eth_call)
|
||||
if !st.evm.Config.NoBaseFee || st.gasFeeCap.BitLen() > 0 || st.gasTipCap.BitLen() > 0 {
|
||||
if l := st.gasFeeCap.BitLen(); l > 256 {
|
||||
return fmt.Errorf("%w: address %v, maxFeePerGas bit length: %d", ErrFeeCapVeryHigh,
|
||||
st.msg.From().Hex(), l)
|
||||
}
|
||||
if l := st.gasTipCap.BitLen(); l > 256 {
|
||||
return fmt.Errorf("%w: address %v, maxPriorityFeePerGas bit length: %d", ErrTipVeryHigh,
|
||||
st.msg.From().Hex(), l)
|
||||
}
|
||||
if st.gasFeeCap.Cmp(st.gasTipCap) < 0 {
|
||||
return fmt.Errorf("%w: address %v, maxPriorityFeePerGas: %s, maxFeePerGas: %s", ErrTipAboveFeeCap,
|
||||
st.msg.From().Hex(), st.gasTipCap, st.gasFeeCap)
|
||||
}
|
||||
// This will panic if baseFee is nil, but basefee presence is verified
|
||||
// as part of header validation.
|
||||
if st.gasFeeCap.Cmp(st.evm.Context.BaseFee) < 0 {
|
||||
return fmt.Errorf("%w: address %v, maxFeePerGas: %s baseFee: %s", ErrFeeCapTooLow,
|
||||
st.msg.From().Hex(), st.gasFeeCap, st.evm.Context.BaseFee)
|
||||
}
|
||||
}
|
||||
}
|
||||
return st.buyGas()
|
||||
@@ -275,7 +278,6 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
|
||||
sender := vm.AccountRef(msg.From())
|
||||
homestead := st.evm.ChainConfig().IsHomestead(st.evm.Context.BlockNumber)
|
||||
istanbul := st.evm.ChainConfig().IsIstanbul(st.evm.Context.BlockNumber)
|
||||
eip3529 := st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber)
|
||||
contractCreation := msg.To() == nil
|
||||
|
||||
// Check clauses 4-5, subtract intrinsic gas if everything is correct
|
||||
@@ -308,7 +310,7 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
|
||||
st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
|
||||
ret, st.gas, vmerr = st.evm.Call(sender, st.to(), st.data, st.gas, st.value)
|
||||
}
|
||||
if !eip3529 {
|
||||
if !st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) {
|
||||
// Before EIP-3529: refunds were capped to gasUsed / 2
|
||||
st.refundGas(params.RefundQuotient)
|
||||
} else {
|
||||
|
||||
+19
-19
@@ -128,7 +128,7 @@ type EVM struct {
|
||||
chainRules params.Rules
|
||||
// virtual machine configuration options used to initialise the
|
||||
// evm.
|
||||
vmConfig Config
|
||||
Config Config
|
||||
// global (to this context) ethereum virtual machine
|
||||
// used throughout the execution of the tx.
|
||||
interpreters []Interpreter
|
||||
@@ -144,12 +144,12 @@ type EVM struct {
|
||||
|
||||
// NewEVM returns a new EVM. The returned EVM is not thread safe and should
|
||||
// only ever be used *once*.
|
||||
func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig *params.ChainConfig, vmConfig Config) *EVM {
|
||||
func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig *params.ChainConfig, config Config) *EVM {
|
||||
evm := &EVM{
|
||||
Context: blockCtx,
|
||||
TxContext: txCtx,
|
||||
StateDB: statedb,
|
||||
vmConfig: vmConfig,
|
||||
Config: config,
|
||||
chainConfig: chainConfig,
|
||||
chainRules: chainConfig.Rules(blockCtx.BlockNumber),
|
||||
interpreters: make([]Interpreter, 0, 1),
|
||||
@@ -173,7 +173,7 @@ func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig
|
||||
|
||||
// vmConfig.EVMInterpreter will be used by EVM-C, it won't be checked here
|
||||
// as we always want to have the built-in EVM as the failover option.
|
||||
evm.interpreters = append(evm.interpreters, NewEVMInterpreter(evm, vmConfig))
|
||||
evm.interpreters = append(evm.interpreters, NewEVMInterpreter(evm, config))
|
||||
evm.interpreter = evm.interpreters[0]
|
||||
|
||||
return evm
|
||||
@@ -207,7 +207,7 @@ func (evm *EVM) Interpreter() Interpreter {
|
||||
// the necessary steps to create accounts and reverses the state in case of an
|
||||
// execution error or failed value transfer.
|
||||
func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) {
|
||||
if evm.vmConfig.NoRecursion && evm.depth > 0 {
|
||||
if evm.Config.NoRecursion && evm.depth > 0 {
|
||||
return nil, gas, nil
|
||||
}
|
||||
// Fail if we're trying to execute above the call depth limit
|
||||
@@ -224,9 +224,9 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
|
||||
if !evm.StateDB.Exist(addr) {
|
||||
if !isPrecompile && evm.chainRules.IsEIP158 && value.Sign() == 0 {
|
||||
// Calling a non existing account, don't do anything, but ping the tracer
|
||||
if evm.vmConfig.Debug && evm.depth == 0 {
|
||||
evm.vmConfig.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value)
|
||||
evm.vmConfig.Tracer.CaptureEnd(ret, 0, 0, nil)
|
||||
if evm.Config.Debug && evm.depth == 0 {
|
||||
evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value)
|
||||
evm.Config.Tracer.CaptureEnd(ret, 0, 0, nil)
|
||||
}
|
||||
return nil, gas, nil
|
||||
}
|
||||
@@ -235,10 +235,10 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
|
||||
evm.Context.Transfer(evm.StateDB, caller.Address(), addr, value)
|
||||
|
||||
// Capture the tracer start/end events in debug mode
|
||||
if evm.vmConfig.Debug && evm.depth == 0 {
|
||||
evm.vmConfig.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value)
|
||||
if evm.Config.Debug && evm.depth == 0 {
|
||||
evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value)
|
||||
defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters
|
||||
evm.vmConfig.Tracer.CaptureEnd(ret, startGas-gas, time.Since(startTime), err)
|
||||
evm.Config.Tracer.CaptureEnd(ret, startGas-gas, time.Since(startTime), err)
|
||||
}(gas, time.Now())
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
|
||||
// CallCode differs from Call in the sense that it executes the given address'
|
||||
// code with the caller as context.
|
||||
func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) {
|
||||
if evm.vmConfig.NoRecursion && evm.depth > 0 {
|
||||
if evm.Config.NoRecursion && evm.depth > 0 {
|
||||
return nil, gas, nil
|
||||
}
|
||||
// Fail if we're trying to execute above the call depth limit
|
||||
@@ -326,7 +326,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte,
|
||||
// DelegateCall differs from CallCode in the sense that it executes the given address'
|
||||
// code with the caller as context and the caller is set to the caller of the caller.
|
||||
func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) {
|
||||
if evm.vmConfig.NoRecursion && evm.depth > 0 {
|
||||
if evm.Config.NoRecursion && evm.depth > 0 {
|
||||
return nil, gas, nil
|
||||
}
|
||||
// Fail if we're trying to execute above the call depth limit
|
||||
@@ -360,7 +360,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by
|
||||
// Opcodes that attempt to perform such modifications will result in exceptions
|
||||
// instead of performing the modifications.
|
||||
func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) {
|
||||
if evm.vmConfig.NoRecursion && evm.depth > 0 {
|
||||
if evm.Config.NoRecursion && evm.depth > 0 {
|
||||
return nil, gas, nil
|
||||
}
|
||||
// Fail if we're trying to execute above the call depth limit
|
||||
@@ -453,12 +453,12 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64,
|
||||
contract := NewContract(caller, AccountRef(address), value, gas)
|
||||
contract.SetCodeOptionalHash(&address, codeAndHash)
|
||||
|
||||
if evm.vmConfig.NoRecursion && evm.depth > 0 {
|
||||
if evm.Config.NoRecursion && evm.depth > 0 {
|
||||
return nil, address, gas, nil
|
||||
}
|
||||
|
||||
if evm.vmConfig.Debug && evm.depth == 0 {
|
||||
evm.vmConfig.Tracer.CaptureStart(evm, caller.Address(), address, true, codeAndHash.code, gas, value)
|
||||
if evm.Config.Debug && evm.depth == 0 {
|
||||
evm.Config.Tracer.CaptureStart(evm, caller.Address(), address, true, codeAndHash.code, gas, value)
|
||||
}
|
||||
start := time.Now()
|
||||
|
||||
@@ -497,8 +497,8 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64,
|
||||
}
|
||||
}
|
||||
|
||||
if evm.vmConfig.Debug && evm.depth == 0 {
|
||||
evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)
|
||||
if evm.Config.Debug && evm.depth == 0 {
|
||||
evm.Config.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)
|
||||
}
|
||||
return ret, address, contract.Gas, err
|
||||
}
|
||||
|
||||
@@ -244,7 +244,7 @@ func opSha3(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byt
|
||||
interpreter.hasher.Read(interpreter.hasherBuf[:])
|
||||
|
||||
evm := interpreter.evm
|
||||
if evm.vmConfig.EnablePreimageRecording {
|
||||
if evm.Config.EnablePreimageRecording {
|
||||
evm.StateDB.AddPreimage(interpreter.hasherBuf, data)
|
||||
}
|
||||
|
||||
|
||||
@@ -194,7 +194,7 @@ func TestAddMod(t *testing.T) {
|
||||
var (
|
||||
env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{})
|
||||
stack = newstack()
|
||||
evmInterpreter = NewEVMInterpreter(env, env.vmConfig)
|
||||
evmInterpreter = NewEVMInterpreter(env, env.Config)
|
||||
pc = uint64(0)
|
||||
)
|
||||
tests := []struct {
|
||||
@@ -283,7 +283,7 @@ func opBenchmark(bench *testing.B, op executionFunc, args ...string) {
|
||||
var (
|
||||
env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{})
|
||||
stack = newstack()
|
||||
evmInterpreter = NewEVMInterpreter(env, env.vmConfig)
|
||||
evmInterpreter = NewEVMInterpreter(env, env.Config)
|
||||
)
|
||||
|
||||
env.interpreter = evmInterpreter
|
||||
@@ -518,7 +518,7 @@ func TestOpMstore(t *testing.T) {
|
||||
env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{})
|
||||
stack = newstack()
|
||||
mem = NewMemory()
|
||||
evmInterpreter = NewEVMInterpreter(env, env.vmConfig)
|
||||
evmInterpreter = NewEVMInterpreter(env, env.Config)
|
||||
)
|
||||
|
||||
env.interpreter = evmInterpreter
|
||||
@@ -542,7 +542,7 @@ func BenchmarkOpMstore(bench *testing.B) {
|
||||
env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{})
|
||||
stack = newstack()
|
||||
mem = NewMemory()
|
||||
evmInterpreter = NewEVMInterpreter(env, env.vmConfig)
|
||||
evmInterpreter = NewEVMInterpreter(env, env.Config)
|
||||
)
|
||||
|
||||
env.interpreter = evmInterpreter
|
||||
@@ -563,7 +563,7 @@ func BenchmarkOpSHA3(bench *testing.B) {
|
||||
env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{})
|
||||
stack = newstack()
|
||||
mem = NewMemory()
|
||||
evmInterpreter = NewEVMInterpreter(env, env.vmConfig)
|
||||
evmInterpreter = NewEVMInterpreter(env, env.Config)
|
||||
)
|
||||
env.interpreter = evmInterpreter
|
||||
mem.Resize(32)
|
||||
|
||||
@@ -30,6 +30,7 @@ type Config struct {
|
||||
Debug bool // Enables debugging
|
||||
Tracer Tracer // Opcode logger
|
||||
NoRecursion bool // Disables call, callcode, delegate call and create
|
||||
NoBaseFee bool // Forces the EIP-1559 baseFee to 0 (needed for 0 price calls)
|
||||
EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages
|
||||
|
||||
JumpTable [256]*operation // EVM instruction table, automatically populated if unset
|
||||
|
||||
@@ -849,7 +849,7 @@ func DoCall(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
evm, vmError, err := b.GetEVM(ctx, msg, state, header, nil)
|
||||
evm, vmError, err := b.GetEVM(ctx, msg, state, header, &vm.Config{NoBaseFee: true})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -158,7 +158,9 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ToMessage converts TransactionArgs to the Message type used by the core evm
|
||||
// ToMessage converts th transaction arguments to the Message type used by the
|
||||
// core evm. This method is used in calls and traces that do not require a real
|
||||
// live transaction.
|
||||
func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (types.Message, error) {
|
||||
// Reject invalid combinations of pre- and post-1559 fee styles
|
||||
if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) {
|
||||
@@ -194,9 +196,11 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (t
|
||||
} else {
|
||||
// A basefee is provided, necessitating 1559-type execution
|
||||
if args.GasPrice != nil {
|
||||
// User specified the legacy gas field, convert to 1559 gas typing
|
||||
gasPrice = args.GasPrice.ToInt()
|
||||
gasFeeCap, gasTipCap = gasPrice, gasPrice
|
||||
} else {
|
||||
// User specified 1559 gas feilds (or none), use those
|
||||
gasFeeCap = new(big.Int)
|
||||
if args.MaxFeePerGas != nil {
|
||||
gasFeeCap = args.MaxFeePerGas.ToInt()
|
||||
@@ -205,7 +209,11 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (t
|
||||
if args.MaxPriorityFeePerGas != nil {
|
||||
gasTipCap = args.MaxPriorityFeePerGas.ToInt()
|
||||
}
|
||||
gasPrice = math.BigMin(new(big.Int).Add(gasTipCap, baseFee), gasFeeCap)
|
||||
// Backfill the legacy gasPrice for EVM execution, unless we're all zeroes
|
||||
gasPrice = new(big.Int)
|
||||
if gasFeeCap.BitLen() > 0 || gasTipCap.BitLen() > 0 {
|
||||
gasPrice = math.BigMin(new(big.Int).Add(gasTipCap, baseFee), gasFeeCap)
|
||||
}
|
||||
}
|
||||
}
|
||||
value := new(big.Int)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by go-bindata. DO NOT EDIT.
|
||||
// sources:
|
||||
// bignumber.js (17.314kB)
|
||||
// web3.js (401.627kB)
|
||||
// web3.js (401.667kB)
|
||||
|
||||
package deps
|
||||
|
||||
@@ -90,7 +90,7 @@ func bignumberJs() (*asset, error) {
|
||||
return a, nil
|
||||
}
|
||||
|
||||
var _web3Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x7b\x13\x39\xd2\x38\x0e\xbf\xcf\xa7\x10\x7e\xee\x07\xdb\xc4\xd8\x39\x0d\xc3\x38\x93\x61\x43\x60\x86\xec\x0d\x84\x0b\xc8\xce\xee\x9d\xcd\x72\xb5\xdd\xb2\xdd\x43\xbb\xdb\xbf\xee\x76\x0e\x43\xf2\xdd\xff\x97\x4a\xa7\xd2\xa1\x0f\x4e\xc2\x9c\x36\x79\x01\x6e\xa9\x74\x2a\x95\x4a\xa5\x52\xa9\x2a\xa3\xff\x6f\x19\x65\x74\xaf\x33\x59\x26\xe3\x22\x4a\x13\x42\x3b\x45\x2f\xe9\x65\xdd\x2f\x2a\x25\xef\xa4\xbd\x65\xf7\x4b\x34\xe9\x3c\x48\x4e\xd2\x53\xfe\xab\x80\x5f\x67\x41\x46\x82\xbd\xe2\x72\x41\xd3\x09\x91\x75\xed\xb5\x64\xd1\xd6\xc3\x87\x22\x71\x97\x95\x59\x3e\x7c\x18\x74\x33\x5a\x2c\xb3\x84\x04\x9d\xb4\xf7\x60\xa3\xcb\xd2\x23\x99\x16\x89\x34\x56\xeb\x64\x2f\xa1\xe7\xe4\x65\x96\xa5\x59\xa7\x75\x10\x24\x49\x5a\x90\x49\x94\x84\x64\x9e\x86\xcb\x98\x92\x76\x6b\x3d\x5d\x6f\xb5\x5b\xdd\xdd\x62\x96\xa5\xe7\x64\xd2\x1f\xa7\x21\xdd\x6b\xbd\x39\x7a\x71\xfc\xfa\xe5\xa7\xb7\x47\x1f\x3f\xfd\x78\x74\xfc\xf6\x45\xab\x37\xb9\x66\xf5\xc5\x7b\xac\xef\x7b\x5f\xe8\xc5\x22\xcd\x8a\x7c\xf8\xe5\xfa\x7a\x97\x8d\xe1\x64\xe3\xb4\x3f\x0e\xe2\xb8\x13\xf7\x45\x56\x4f\xf6\xbe\x43\xf9\x00\x93\x3d\x00\xdc\x3c\x3d\xa1\xa7\xbb\xa2\xab\x79\x27\x79\x96\x0c\x69\xf7\xba\x17\xf7\x74\x49\xda\xe3\xb8\xbb\x16\x50\xac\x49\x99\x09\xbd\x88\x1a\xe1\x6a\x92\x66\x1d\x06\x9d\xee\x6d\xec\xa6\xdf\x67\xfd\x98\x26\xd3\x62\xb6\x9b\xae\xaf\x77\xf3\x4e\xc6\x10\xaf\xba\x71\xdd\xed\x7c\xd9\x1c\x9e\xa8\x2e\x8b\x2a\x7a\x1c\x4b\x3d\xd1\x76\xf7\xcb\x1a\x4f\x90\x9d\xd9\x3b\x59\x23\xe4\xcb\x1a\x21\x84\xb4\xc6\x69\x92\x17\x41\x52\xb4\x86\xa4\xc8\x96\xb4\xc7\x53\xa3\x64\xb1\x2c\xf2\xd6\x90\x9c\xc0\xb7\x84\x86\xbc\x24\x98\xd3\xd6\x90\xb4\x3e\xa5\xe7\x09\xcd\x5a\x3d\x9d\xc3\x46\xc7\x72\x82\x30\xcc\x68\x9e\xb7\x44\xce\x35\xfc\x7f\x2a\xaa\x96\xc5\xe1\x7f\x91\x96\x2e\x8b\xfa\xf6\xd2\x4f\xa8\x88\xd1\xde\xe8\xb2\xa0\xf9\xf6\x96\xbf\x3d\x09\xa4\x30\xbd\x46\xc8\x75\xef\x4e\x10\x70\xa3\xfe\xa8\xe1\x20\xec\x35\x43\xc0\xca\xa8\xfe\xa3\x0e\x7d\x9c\x26\x05\x4d\x8a\x5b\x0f\xfe\x4f\x39\xef\x6c\xc6\xfe\x30\xd3\x3e\x09\xe2\xfc\xb7\x1b\x7a\x46\x73\x9a\x9d\xf9\x56\xfd\x1f\x7d\xd2\xf2\xe5\xe8\x3d\x9d\x46\x79\x91\x05\xff\x05\x93\xd7\xab\xaa\x83\x9e\x1f\xdd\x8a\xef\x17\x59\x90\xe4\x13\x2f\xeb\xfb\xb3\xe0\x20\xb3\x48\x61\x75\x24\xe4\xb4\xf8\x50\x4d\x52\x77\x86\x0b\xbb\xe9\xdf\xa4\xd1\xaf\x3c\x01\x41\x13\xc4\x57\x55\xb0\xc8\xa2\x79\x90\x5d\x7a\xfb\x91\xa6\x71\xed\xe4\xed\x8b\xb6\xfe\xbc\x28\x34\xf7\xe0\xca\x6a\xca\x90\x70\x50\xba\x8d\xff\x91\x90\xe0\xed\x7d\x18\xe5\xe9\x79\x72\x8b\x9e\x07\x49\x9a\x5c\xce\xd3\x65\xbe\x42\xd7\xa3\x24\xa4\x17\x34\x34\xf6\xae\x3b\x9b\x58\x5d\x39\xea\x8e\x59\xfb\x79\x94\xdc\x86\x71\xef\x2f\x01\x13\x2f\x93\x90\x86\x2d\x0b\x4d\xf4\x8c\x11\xc2\x5f\x00\x47\xa3\x28\x0c\x9b\xe1\xe8\x66\xf5\x9f\x05\xf1\xd2\xdb\xfd\x65\x94\x14\x5b\xdf\x3c\xa9\x9e\x82\xb7\xf4\xfc\x79\xf4\x3b\x22\xff\x56\x6b\xee\x60\x16\x24\xd3\xdf\x93\x74\xee\x84\x72\x4a\xea\x46\x52\x7d\x25\xd5\x78\x31\xf3\x8e\xef\x46\xb5\x08\x5a\x3b\x5d\x5b\xbb\xee\x7d\xb9\x3e\xed\x6d\xfd\x6e\x87\xfe\xbf\xd0\x99\xf7\x77\x92\x1d\x27\xcb\x24\xbc\x31\xa9\xdc\x7a\xe3\xba\x3f\xf6\xfe\xb9\x8f\xbd\xf7\x87\xbe\x3f\xf2\x99\xc3\x3b\x78\x71\x5e\xf8\xa3\x49\x9b\x5f\x77\x33\xd7\x7b\xd5\xf6\x9d\xed\x55\xab\xce\xfb\x24\x4b\xe7\xb7\x9c\xf6\x22\xbd\xe5\x51\xf3\x76\x02\xdf\xef\xbb\x6e\xfe\x08\xf8\x8b\x92\x30\xca\xe8\xb8\x38\xf4\xee\x99\x2b\xf4\xe4\x76\x13\x11\x8d\x83\xc5\xc7\xdf\x75\x32\xfc\x98\x6c\x76\xda\xa5\x8b\x34\x8f\xaa\x0e\xea\x8b\xe0\x32\x18\xc5\xd4\x14\x0a\x7e\x17\xae\x54\x46\x73\x77\x72\xfc\xba\x1d\x0d\xec\xcb\xf1\xbe\x30\xf1\xf9\xdb\x9f\x64\xee\x04\x49\x25\x75\x37\xa3\xb3\xdf\x01\xfd\x7f\x58\xac\xdf\xc5\xf9\xf1\xc6\x7c\xf2\x6b\x63\xdd\x66\x7a\xf7\x68\x6f\x88\xf6\x5b\x6f\x5c\x5f\x7b\x66\x0f\x3d\x5b\x5a\x95\x1c\xb7\xd3\x44\x8e\x03\xe3\x0d\xb2\x27\x2d\x1c\x3a\xed\xfe\x60\x92\x66\xf3\xa0\x28\x68\x96\xb7\xbb\xbb\x00\xf0\x21\x8d\xa3\x30\x2a\x2e\x3f\x5e\x2e\xa8\x09\xcb\xda\x67\x50\x6b\x83\x47\x8f\xd6\xc8\x23\x03\x52\xe8\xdc\x49\x94\x93\x80\x2c\xb2\x34\x65\xc0\xa4\x98\x05\x05\xc9\xe8\x82\x1d\xb2\x92\x22\x27\x62\xee\x08\xcb\x64\x35\x1c\x16\x64\x1e\x14\xe3\x19\xcd\x87\xec\x53\x64\xa3\x9f\x27\xa7\xf8\x63\xc7\xf8\x3a\x35\x33\xb7\xad\xef\xd3\x93\x27\xa7\x27\xa7\x3d\xd2\xef\xf7\xd7\xc8\xa3\x81\x33\x36\xd9\xe3\x3d\xa2\xac\x69\x3a\x5d\x31\xc5\xc5\x2c\xca\xfb\x9f\x60\x61\xfc\x28\x11\xc4\x00\xfb\x1c\x5d\x87\x2c\xe3\x30\x29\x76\x11\x30\xdf\xb7\x7d\xd0\x47\x90\x23\x9a\xdb\x5d\xbb\xde\x5d\x5b\xf3\xf4\xa3\xbf\xc8\xd2\x82\x63\x6d\x8f\x24\xf4\xdc\xe8\x6b\xe7\xcb\x75\x77\xb7\xba\x54\x1f\xa4\x97\x6c\x39\x2e\x52\xd6\xb8\x07\xb6\xae\xdd\x7e\x94\x8b\x39\xd7\x08\x61\xe4\x28\x91\x22\xec\x5a\x1e\x3c\x60\x89\x7d\x98\xb7\xce\x40\x60\xbb\xf3\xef\x93\xce\xc9\xc6\xe3\xef\x4e\x1f\x75\xff\x7d\xda\x7d\x36\xe8\xf2\x71\x9a\x07\x87\xd2\x6e\x5d\xf7\xbe\xb4\x30\x29\xb6\x86\xdf\xf5\x5a\x9c\xde\x5a\xc3\xcd\x9d\xeb\xd3\xde\x37\xbf\x33\x79\x3f\x4f\xd3\xb8\x86\xb6\x47\x0c\xa4\x84\xb0\x59\x9e\xfc\x9f\x53\x29\xfc\xda\xd1\x3f\x4f\x51\xf2\x36\xfe\xa8\x23\x63\xe8\xd9\x4d\x69\x98\x15\x5e\x85\x88\x39\xbc\x4d\xc1\x2c\x75\x45\xf2\Line truncated
|
||||
var _web3Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x7b\x13\x39\xd2\x38\x0e\xbf\xcf\xa7\x10\x7e\xee\x07\xdb\xc4\xd8\x39\x0d\xc3\x38\x93\x61\x43\x60\x86\xec\x0d\x84\x0b\xc8\xce\xee\x9d\xcd\x72\xb5\xdd\xb2\xdd\x43\xbb\xdb\xbf\xee\x76\x0e\x43\xf2\xdd\xff\x97\x4a\xa7\xd2\xa1\x0f\x4e\xc2\x9c\x36\x79\x01\x6e\xa9\x74\x2a\x95\x4a\xa5\x52\xa9\x2a\xa3\xff\x6f\x19\x65\x74\xaf\x33\x59\x26\xe3\x22\x4a\x13\x42\x3b\x45\x2f\xe9\x65\xdd\x2f\x2a\x25\xef\xa4\xbd\x65\xf7\x4b\x34\xe9\x3c\x48\x4e\xd2\x53\xfe\xab\x80\x5f\x67\x41\x46\x82\xbd\xe2\x72\x41\xd3\x09\x91\x75\xed\xb5\x64\xd1\xd6\xc3\x87\x22\x71\x97\x95\x59\x3e\x7c\x18\x74\x33\x5a\x2c\xb3\x84\x04\x9d\xb4\xf7\x60\xa3\xcb\xd2\x23\x99\x16\x89\x34\x56\xeb\x64\x2f\xa1\xe7\xe4\x65\x96\xa5\x59\xa7\x75\x10\x24\x49\x5a\x90\x49\x94\x84\x64\x9e\x86\xcb\x98\x92\x76\x6b\x3d\x5d\x6f\xb5\x5b\xdd\xdd\x62\x96\xa5\xe7\x64\xd2\x1f\xa7\x21\xdd\x6b\xbd\x39\x7a\x71\xfc\xfa\xe5\xa7\xb7\x47\x1f\x3f\xfd\x78\x74\xfc\xf6\x45\xab\x37\xb9\x66\xf5\xc5\x7b\xac\xef\x7b\x5f\xe8\xc5\x22\xcd\x8a\x7c\xf8\xe5\xfa\x7a\x97\x8d\xe1\x64\xe3\xb4\x3f\x0e\xe2\xb8\x13\xf7\x45\x56\x4f\xf6\xbe\x43\xf9\x00\x93\x3d\x00\xdc\x3c\x3d\xa1\xa7\xbb\xa2\xab\x79\x27\x79\x96\x0c\x69\xf7\xba\x17\xf7\x74\x49\xda\xe3\xb8\xbb\x16\x50\xac\x49\x99\x09\xbd\x88\x1a\xe1\x6a\x92\x66\x1d\x06\x9d\xee\x6d\xec\xa6\xdf\x67\xfd\x98\x26\xd3\x62\xb6\x9b\xae\xaf\x77\xf3\x4e\xc6\x10\xaf\xba\x71\xdd\xed\x7c\xd9\x1c\x9e\xa8\x2e\x8b\x2a\x7a\x1c\x4b\x3d\xd1\x76\xf7\xcb\x1a\x4f\x90\x9d\xd9\x3b\x59\x23\xe4\xcb\x1a\x21\x84\xb4\xc6\x69\x92\x17\x41\x52\xb4\x86\xa4\xc8\x96\xb4\xc7\x53\xa3\x64\xb1\x2c\xf2\xd6\x90\x9c\xc0\xb7\x84\x86\xbc\x24\x98\xd3\xd6\x90\xb4\x3e\xa5\xe7\x09\xcd\x5a\x3d\x9d\xc3\x46\xc7\x72\x82\x30\xcc\x68\x9e\xb7\x44\xce\x35\xfc\x7f\x2a\xaa\x96\xc5\xe1\x7f\x91\x96\x2e\x8b\xfa\xf6\xd2\x4f\xa8\x88\xd1\xde\xe8\xb2\xa0\xf9\xf6\x96\xbf\x3d\x09\xa4\x30\xbd\x46\xc8\x75\xef\x4e\x10\x70\xa3\xfe\xa8\xe1\x20\xec\x35\x43\xc0\xca\xa8\xfe\xa3\x0e\x7d\x9c\x26\x05\x4d\x8a\x5b\x0f\xfe\x4f\x39\xef\x6c\xc6\xfe\x30\xd3\x3e\x09\xe2\xfc\xb7\x1b\x7a\x46\x73\x9a\x9d\xf9\x56\xfd\x1f\x7d\xd2\xf2\xe5\xe8\x3d\x9d\x46\x79\x91\x05\xff\x05\x93\xd7\xab\xaa\x83\x9e\x1f\xdd\x8a\xef\x17\x59\x90\xe4\x13\x2f\xeb\xfb\xb3\xe0\x20\xb3\x48\x61\x75\x24\xe4\xb4\xf8\x50\x4d\x52\x77\x86\x0b\xbb\xe9\xdf\xa4\xd1\xaf\x3c\x01\x41\x13\xc4\x57\x55\xb0\xc8\xa2\x79\x90\x5d\x7a\xfb\x91\xa6\x71\xed\xe4\xed\x8b\xb6\xfe\xbc\x28\x34\xf7\xe0\xca\x6a\xca\x90\x70\x50\xba\x8d\xff\x91\x90\xe0\xed\x7d\x18\xe5\xe9\x79\x72\x8b\x9e\x07\x49\x9a\x5c\xce\xd3\x65\xbe\x42\xd7\xa3\x24\xa4\x17\x34\x34\xf6\xae\x3b\x9b\x58\x5d\x39\xea\x8e\x59\xfb\x79\x94\xdc\x86\x71\xef\x2f\x01\x13\x2f\x93\x90\x86\x2d\x0b\x4d\xf4\x8c\x11\xc2\x5f\x00\x47\xa3\x28\x0c\x9b\xe1\xe8\x66\xf5\x9f\x05\xf1\xd2\xdb\xfd\x65\x94\x14\x5b\xdf\x3c\xa9\x9e\x82\xb7\xf4\xfc\x79\xf4\x3b\x22\xff\x56\x6b\xee\x60\x16\x24\xd3\xdf\x93\x74\xee\x84\x72\x4a\xea\x46\x52\x7d\x25\xd5\x78\x31\xf3\x8e\xef\x46\xb5\x08\x5a\x3b\x5d\x5b\xbb\xee\x7d\xb9\x3e\xed\x6d\xfd\x6e\x87\xfe\xbf\xd0\x99\xf7\x77\x92\x1d\x27\xcb\x24\xbc\x31\xa9\xdc\x7a\xe3\xba\x3f\xf6\xfe\xb9\x8f\xbd\xf7\x87\xbe\x3f\xf2\x99\xc3\x3b\x78\x71\x5e\xf8\xa3\x49\x9b\x5f\x77\x33\xd7\x7b\xd5\xf6\x9d\xed\x55\xab\xce\xfb\x24\x4b\xe7\xb7\x9c\xf6\x22\xbd\xe5\x51\xf3\x76\x02\xdf\xef\xbb\x6e\xfe\x08\xf8\x8b\x92\x30\xca\xe8\xb8\x38\xf4\xee\x99\x2b\xf4\xe4\x76\x13\x11\x8d\x83\xc5\xc7\xdf\x75\x32\xfc\x98\x6c\x76\xda\xa5\x8b\x34\x8f\xaa\x0e\xea\x8b\xe0\x32\x18\xc5\xd4\x14\x0a\x7e\x17\xae\x54\x46\x73\x77\x72\xfc\xba\x1d\x0d\xec\xcb\xf1\xbe\x30\xf1\xf9\xdb\x9f\x64\xee\x04\x49\x25\x75\x37\xa3\xb3\xdf\x01\xfd\x7f\x58\xac\xdf\xc5\xf9\xf1\xc6\x7c\xf2\x6b\x63\xdd\x66\x7a\xf7\x68\x6f\x88\xf6\x5b\x6f\x5c\x5f\x7b\x66\x0f\x3d\x5b\x5a\x95\x1c\xb7\xd3\x44\x8e\x03\xe3\x0d\xb2\x27\x2d\x1c\x3a\xed\xfe\x60\x92\x66\xf3\xa0\x28\x68\x96\xb7\xbb\xbb\x00\xf0\x21\x8d\xa3\x30\x2a\x2e\x3f\x5e\x2e\xa8\x09\xcb\xda\x67\x50\x6b\x83\x47\x8f\xd6\xc8\x23\x03\x52\xe8\xdc\x49\x94\x93\x80\x2c\xb2\x34\x65\xc0\xa4\x98\x05\x05\xc9\xe8\x82\x1d\xb2\x92\x22\x27\x62\xee\x08\xcb\x64\x35\x1c\x16\x64\x1e\x14\xe3\x19\xcd\x87\xec\x53\x64\xa3\x9f\x27\xa7\xf8\x63\xc7\xf8\x3a\x35\x33\xb7\xad\xef\xd3\x93\x27\xa7\x27\xa7\x3d\xd2\xef\xf7\xd7\xc8\xa3\x81\x33\x36\xd9\xe3\x3d\xa2\xac\x69\x3a\x5d\x31\xc5\xc5\x2c\xca\xfb\x9f\x60\x61\xfc\x28\x11\xc4\x00\xfb\x1c\x5d\x87\x2c\xe3\x30\x29\x76\x11\x30\xdf\xb7\x7d\xd0\x47\x90\x23\x9a\xdb\x5d\xbb\xde\x5d\x5b\xf3\xf4\xa3\xbf\xc8\xd2\x82\x63\x6d\x8f\x24\xf4\xdc\xe8\x6b\xe7\xcb\x75\x77\xb7\xba\x54\x1f\xa4\x97\x6c\x39\x2e\x52\xd6\xb8\x07\xb6\xae\xdd\x7e\x94\x8b\x39\xd7\x08\x61\xe4\x28\x91\x22\xec\x5a\x1e\x3c\x60\x89\x7d\x98\xb7\xce\x40\x60\xbb\xf3\xef\x93\xce\xc9\xc6\xe3\xef\x4e\x1f\x75\xff\x7d\xda\x7d\x36\xe8\xf2\x71\x9a\x07\x87\xd2\x6e\x5d\xf7\xbe\xb4\x30\x29\xb6\x86\xdf\xf5\x5a\x9c\xde\x5a\xc3\xcd\x9d\xeb\xd3\xde\x37\xbf\x33\x79\x3f\x4f\xd3\xb8\x86\xb6\x47\x0c\xa4\x84\xb0\x59\x9e\xfc\x9f\x53\x29\xfc\xda\xd1\x3f\x4f\x51\xf2\x36\xfe\xa8\x23\x63\xe8\xd9\x4d\x69\x98\x15\x5e\x85\x88\x39\xbc\x4d\xc1\x2c\x75\x45\xf2\Line truncated
|
||||
|
||||
func web3JsBytes() ([]byte, error) {
|
||||
return bindataRead(
|
||||
@@ -106,7 +106,7 @@ func web3Js() (*asset, error) {
|
||||
}
|
||||
|
||||
info := bindataFileInfo{name: "web3.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
|
||||
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xe8, 0x7a, 0x64, 0xe9, 0xba, 0x34, 0x54, 0x9a, 0x11, 0x5d, 0x39, 0xcb, 0x63, 0x13, 0x52, 0x4e, 0x9d, 0xfa, 0xae, 0xfd, 0xc0, 0x43, 0x92, 0x91, 0xdb, 0x4e, 0xd6, 0xd9, 0x3, 0x45, 0xb8}}
|
||||
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0x89, 0xb5, 0xa2, 0x49, 0xb6, 0x9b, 0xb3, 0x1e, 0x9e, 0x8c, 0x4, 0x7e, 0x35, 0x1e, 0x68, 0x5b, 0x32, 0x15, 0x9c, 0xab, 0x52, 0x45, 0xfc, 0x3b, 0x3a, 0x73, 0x35, 0xde, 0xd9, 0x2a, 0xf6}}
|
||||
return a, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -3734,7 +3734,7 @@ var inputCallFormatter = function (options){
|
||||
options.to = inputAddressFormatter(options.to);
|
||||
}
|
||||
|
||||
['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
|
||||
['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
|
||||
return options[key] !== undefined;
|
||||
}).forEach(function(key){
|
||||
options[key] = utils.fromDecimal(options[key]);
|
||||
|
||||
Reference in new issue
Block a user