package types import ( "fmt" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" evmtypes "github.com/tharsis/ethermint/x/evm/types" ) // Copied the Account and StorageResult types since they are registered under an // internal pkg on geth. // AccountResult struct for account proof type AccountResult struct { Address common.Address `json:"address"` AccountProof []string `json:"accountProof"` Balance *hexutil.Big `json:"balance"` CodeHash common.Hash `json:"codeHash"` Nonce hexutil.Uint64 `json:"nonce"` StorageHash common.Hash `json:"storageHash"` StorageProof []StorageResult `json:"storageProof"` } // StorageResult defines the format for storage proof return type StorageResult struct { Key string `json:"key"` Value *hexutil.Big `json:"value"` Proof []string `json:"proof"` } // RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction type RPCTransaction struct { BlockHash *common.Hash `json:"blockHash"` BlockNumber *hexutil.Big `json:"blockNumber"` From common.Address `json:"from"` Gas hexutil.Uint64 `json:"gas"` GasPrice *hexutil.Big `json:"gasPrice"` Hash common.Hash `json:"hash"` Input hexutil.Bytes `json:"input"` Nonce hexutil.Uint64 `json:"nonce"` To *common.Address `json:"to"` TransactionIndex *hexutil.Uint64 `json:"transactionIndex"` Value *hexutil.Big `json:"value"` Type hexutil.Uint64 `json:"type"` Accesses *ethtypes.AccessList `json:"accessList,omitempty"` ChainID *hexutil.Big `json:"chainId,omitempty"` V *hexutil.Big `json:"v"` R *hexutil.Big `json:"r"` S *hexutil.Big `json:"s"` } // SendTxArgs represents the arguments to submit a new transaction into the transaction pool. // Duplicate struct definition since geth struct is in internal package // Ref: https://github.com/ethereum/go-ethereum/blob/release/1.9/internal/ethapi/api.go#L1346 type SendTxArgs struct { From common.Address `json:"from"` To *common.Address `json:"to"` Gas *hexutil.Uint64 `json:"gas"` GasPrice *hexutil.Big `json:"gasPrice"` Value *hexutil.Big `json:"value"` Nonce *hexutil.Uint64 `json:"nonce"` // We accept "data" and "input" for backwards-compatibility reasons. "input" is the // newer name and should be preferred by clients. Data *hexutil.Bytes `json:"data"` Input *hexutil.Bytes `json:"input"` // For non-legacy transactions AccessList *ethtypes.AccessList `json:"accessList,omitempty"` ChainID *hexutil.Big `json:"chainId,omitempty"` } // String return the struct in a string format func (args *SendTxArgs) String() string { // Todo: There is currently a bug with hexutil.Big when the value its nil, printing would trigger an exception return fmt.Sprintf("SendTxArgs{From:%v, To:%v, Gas:%v,"+ " Nonce:%v, Data:%v, Input:%v, AccessList:%v}", args.From, args.To, args.Gas, args.Nonce, args.Data, args.Input, args.AccessList) } // ToTransaction converts the arguments to an ethereum transaction. // This assumes that setTxDefaults has been called. func (args *SendTxArgs) ToTransaction() *evmtypes.MsgEthereumTx { var ( input []byte chainID, value, gasPrice *big.Int gas, nonce uint64 ) if args.Input != nil { input = *args.Input } else if args.Data != nil { input = *args.Data } if args.ChainID != nil { chainID = args.ChainID.ToInt() } if args.Nonce != nil { nonce = uint64(*args.Nonce) } if args.Gas != nil { gas = uint64(*args.Gas) } if args.GasPrice != nil { gasPrice = args.GasPrice.ToInt() } if args.Value != nil { value = args.Value.ToInt() } tx := evmtypes.NewTx(chainID, nonce, args.To, value, gas, gasPrice, input, args.AccessList) tx.From = args.From.Hex() return tx } // StateOverride is the collection of overridden accounts. type StateOverride map[common.Address]OverrideAccount // OverrideAccount 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 // set, message execution will only use the data in the given state. Otherwise // if statDiff is set, all diff will be applied first and then execute the call // message. type OverrideAccount struct { Nonce *hexutil.Uint64 `json:"nonce"` Code *hexutil.Bytes `json:"code"` Balance **hexutil.Big `json:"balance"` State *map[common.Hash]common.Hash `json:"state"` StateDiff *map[common.Hash]common.Hash `json:"stateDiff"` }