github.com/cryptotooltop/go-ethereum@v0.0.0-20231103184714-151d1922f3e5/eth/tracers/api_blocktrace_test.go (about) 1 package tracers 2 3 import ( 4 "context" 5 "encoding/json" 6 "math/big" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 11 "github.com/scroll-tech/go-ethereum/accounts/abi/bind" 12 "github.com/scroll-tech/go-ethereum/common" 13 "github.com/scroll-tech/go-ethereum/common/hexutil" 14 "github.com/scroll-tech/go-ethereum/core" 15 "github.com/scroll-tech/go-ethereum/core/types" 16 "github.com/scroll-tech/go-ethereum/params" 17 "github.com/scroll-tech/go-ethereum/rpc" 18 ) 19 20 // erc20MetaData contains all meta data concerning the ERC20 contract. 21 var erc20MetaData = &bind.MetaData{ 22 ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pauser\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimal\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"new_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"new_pauser\",\"type\":\"address\"}],\"name\":\"changeUser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", 23 Sigs: map[string]string{ 24 "dd62ed3e": "allowance(address,address)", 25 "095ea7b3": "approve(address,uint256)", 26 "70a08231": "balanceOf(address)", 27 "9dc29fac": "burn(address,uint256)", 28 "8e50817a": "changeUser(address,address)", 29 "313ce567": "decimals()", 30 "a457c2d7": "decreaseAllowance(address,uint256)", 31 "39509351": "increaseAllowance(address,uint256)", 32 "40c10f19": "mint(address,uint256)", 33 "06fdde03": "name()", 34 "8456cb59": "pause()", 35 "5c975abb": "paused()", 36 "95d89b41": "symbol()", 37 "18160ddd": "totalSupply()", 38 "a9059cbb": "transfer(address,uint256)", 39 "23b872dd": "transferFrom(address,address,uint256)", 40 "3f4ba83a": "unpause()", 41 }, 42 Bin: "0x60806040523480156200001157600080fd5b50604051620014b2380380620014b2833981810160405260a08110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b5060405260209081015185519093508592508491620001c8916003918501906200026b565b508051620001de9060049060208401906200026b565b50506005805461ff001960ff1990911660121716905550600680546001600160a01b038088166001600160a01b0319928316179092556007805492871692909116919091179055620002308162000255565b50506005805462010000600160b01b0319163362010000021790555062000307915050565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ae57805160ff1916838001178555620002de565b82800160010185558215620002de579182015b82811115620002de578251825591602001919060010190620002c1565b50620002ec929150620002f0565b5090565b5b80821115620002ec5760008155600101620002f1565b61119b80620003176000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80635c975abb116100a257806395d89b411161007157806395d89b41146103015780639dc29fac14610309578063a457c2d714610335578063a9059cbb14610361578063dd62ed3e1461038d5761010b565b80635c975abb1461029d57806370a08231146102a55780638456cb59146102cb5780638e50817a146102d35761010b565b8063313ce567116100de578063313ce5671461021d578063395093511461023b5780633f4ba83a1461026757806340c10f19146102715761010b565b806306fdde0314610110578063095ea7b31461018d57806318160ddd146101cd57806323b872dd146101e7575b600080fd5b6101186103bb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015257818101518382015260200161013a565b50505050905090810190601f16801561017f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b9600480360360408110156101a357600080fd5b506001600160a01b038135169060200135610451565b604080519115158252519081900360200190f35b6101d561046e565b60408051918252519081900360200190f35b6101b9600480360360608110156101fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610474565b6102256104fb565b6040805160ff9092168252519081900360200190f35b6101b96004803603604081101561025157600080fd5b506001600160a01b038135169060200135610504565b61026f610552565b005b61026f6004803603604081101561028757600080fd5b506001600160a01b0381351690602001356105a9565b6101b9610654565b6101d5600480360360208110156102bb57600080fd5b50356001600160a01b0316610662565b61026f61067d565b61026f600480360360408110156102e957600080fd5b506001600160a01b03813581169160200135166106d2565b610118610757565b61026f6004803603604081101561031f57600080fd5b506001600160a01b0381351690602001356107b8565b6101b96004803603604081101561034b57600080fd5b506001600160a01b03813516906020013561085f565b6101b96004803603604081101561037757600080fd5b506001600160a01b0381351690602001356108c7565b6101d5600480360360408110156103a357600080fd5b506001600160a01b03813581169160200135166108db565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b820191906000526020600020905b81548152906001019060200180831161042a57829003601f168201915b5050505050905090565b600061046561045e610906565b848461090a565b50600192915050565b60025490565b60006104818484846109f6565b6104f18461048d610906565b6104ec85604051806060016040528060288152602001611085602891396001600160a01b038a166000908152600160205260408120906104cb610906565b6001600160a01b031681526020810191909152604001600020549190610b51565b61090a565b5060019392505050565b60055460ff1690565b6000610465610511610906565b846104ec8560016000610522610906565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610be8565b6007546001600160a01b0316331461059f576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610c49565b565b600554610100900460ff16156105f9576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610646576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610ced565b5050565b600554610100900460ff1690565b6001600160a01b031660009081526020819052604090205490565b6007546001600160a01b031633146106ca576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610ddd565b6005546201000090046001600160a01b03163314610726576040805162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920466163746f727960a01b604482015290519081900360640190fd5b600780546001600160a01b039283166001600160a01b03199182161790915560068054939092169216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b600554610100900460ff1615610808576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610855576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610e65565b600061046561086c610906565b846104ec856040518060600160405280602581526020016111176025913960016000610896610906565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610b51565b60006104656108d4610906565b84846109f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661094f5760405162461bcd60e51b81526004018080602001828103825260248152602001806110f36024913960400191505060405180910390fd5b6001600160a01b0382166109945760405162461bcd60e51b815260040180806020018281038252602281526020018061103d6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610a3b5760405162461bcd60e51b81526004018080602001828103825260258152602001806110ce6025913960400191505060405180910390fd5b6001600160a01b038216610a805760405162461bcd60e51b8152600401808060200182810382526023815260200180610ff86023913960400191505060405180910390fd5b610a8b838383610f61565b610ac88160405180606001604052806026815260200161105f602691396001600160a01b0386166000908152602081905260409020549190610b51565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610af79082610be8565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610be05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ba5578181015183820152602001610b8d565b50505050905090810190601f168015610bd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610c42576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600554610100900460ff16610c9c576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610cd0610906565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038216610d48576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610d5460008383610f61565b600254610d619082610be8565b6002556001600160a01b038216600090815260208190526040902054610d879082610be8565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600554610100900460ff1615610e2d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610cd0610906565b6001600160a01b038216610eaa5760405162461bcd60e51b81526004018080602001828103825260218152602001806110ad6021913960400191505060405180910390fd5b610eb682600083610f61565b610ef38160405180606001604052806022815260200161101b602291396001600160a01b0385166000908152602081905260409020549190610b51565b6001600160a01b038316600090815260208190526040902055600254610f199082610fb5565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b610f6c838383610fb0565b610f74610654565b15610fb05760405162461bcd60e51b815260040180806020018281038252602a81526020018061113c602a913960400191505060405180910390fd5b505050565b6000610c4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b5156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f45524332305061757361626c653a20746f6b656e207472616e73666572207768696c6520706175736564a2646970667358221220e96342bec8f6c2bf72815a39998973b64c3bed57770f402e9a7b7eeda0265d4c64736f6c634300060c0033", 43 } 44 45 func TestAPI_GetBlockTraceByNumberOrHash(t *testing.T) { 46 t.Parallel() 47 erc20Abi, err := erc20MetaData.GetAbi() 48 assert.NoError(t, err) 49 50 var ( 51 accounts = createAccounts(5) 52 genesis = &core.Genesis{Alloc: core.GenesisAlloc{ 53 accounts[0].From: {Balance: big.NewInt(params.Ether)}, 54 accounts[1].From: {Balance: big.NewInt(params.Ether)}, 55 accounts[2].From: {Balance: big.NewInt(params.Ether)}, 56 accounts[3].From: {Balance: big.NewInt(params.Ether)}, 57 accounts[4].From: {Balance: big.NewInt(params.Ether)}, 58 }} 59 60 txs = make([]*types.Transaction, 0, 6) 61 ) 62 63 // deploy erc20 contract 64 backend := newTestBackend(t, 1, genesis, func(i int, b *core.BlockGen) { 65 // deploy erc20 contract 66 tx, err := createTx(b, accounts[0], nil, nil, common.FromHex(erc20MetaData.Bin)) 67 assert.NoError(t, err) 68 txs = append(txs, tx) 69 }) 70 parent, err := backend.BlockByNumber(context.Background(), 1) 71 assert.NoError(t, err) 72 73 // mint erc20 balance 74 blocks, _ := core.GenerateChain(backend.chainConfig, parent, backend.engine, backend.chaindb, 1, func(i int, gen *core.BlockGen) { 75 // mint erc20 tokens 76 for _, acc := range accounts { 77 to := common.BigToAddress(big.NewInt(int64(i))) 78 data, err := erc20Abi.Pack("mint", acc.From, big.NewInt(1e18)) 79 assert.NoError(t, err) 80 tx, err := createTx(gen, acc, &to, nil, data) 81 assert.NoError(t, err) 82 txs = append(txs, tx) 83 } 84 }) 85 _, err = backend.chain.InsertChain(blocks) 86 assert.NoError(t, err) 87 88 block, err := backend.BlockByNumber(context.Background(), 2) 89 assert.NoError(t, err) 90 91 api := NewAPI(backend) 92 // get trace 93 hash := block.Hash() 94 blockTrace, err := api.GetBlockTraceByNumberOrHash(context.Background(), rpc.BlockNumberOrHash{ 95 BlockHash: &hash, 96 }, nil) 97 assert.NoError(t, err) 98 99 // check chain status 100 checkChainAndProof(t, backend, parent, block, blockTrace) 101 102 // check txs. 103 checkTxs(t, block.Transactions(), blockTrace.Transactions) 104 105 txTraces, err := api.TraceBlockByNumber(context.Background(), 2, nil) 106 assert.NoError(t, err) 107 108 // check executionResults 109 checkStructLogs(t, txTraces, blockTrace.ExecutionResults) 110 111 // check coinbase 112 checkCoinbase(t, backend, blockTrace.Coinbase) 113 } 114 115 func verifyProof(t *testing.T, expect [][]byte, actual []hexutil.Bytes) { 116 assert.Equal(t, true, actual != nil) 117 assert.Equal(t, len(expect), len(actual)) 118 for i, val := range expect { 119 assert.Equal(t, hexutil.Encode(val), actual[i].String()) 120 } 121 } 122 123 func checkChainAndProof(t *testing.T, b *testBackend, parent *types.Block, block *types.Block, blockTrace *types.BlockTrace) { 124 assert.Equal(t, parent.Hash(), block.ParentHash()) 125 storgeTrace := blockTrace.StorageTrace 126 assert.Equal(t, parent.Root().String(), storgeTrace.RootBefore.String()) 127 assert.Equal(t, block.Root().String(), storgeTrace.RootAfter.String()) 128 129 statedb, err := b.chain.StateAt(parent.Root()) 130 assert.NoError(t, err) 131 132 storageProof := blockTrace.StorageTrace.StorageProofs 133 for _, tx := range blockTrace.Transactions { 134 for _, addr := range []common.Address{tx.From, *tx.To} { 135 // verify proofs 136 if data2, ok := storgeTrace.Proofs[addr.String()]; ok { 137 data1, err := statedb.GetProof(addr) 138 assert.NoError(t, err) 139 verifyProof(t, data1, data2) 140 } 141 // verify storage proofs 142 for addr, wrappedProof := range storageProof { 143 for keyStr, data2 := range wrappedProof { 144 data1, err := statedb.GetStorageProof(common.HexToAddress(addr), common.HexToHash(keyStr)) 145 if len(data2) > 0 { 146 assert.NoError(t, err) 147 } 148 verifyProof(t, data1, data2) 149 } 150 } 151 } 152 } 153 } 154 155 func checkTxs(t *testing.T, expect []*types.Transaction, actual []*types.TransactionData) { 156 assert.Equal(t, len(expect), len(actual)) 157 for i := range expect { 158 eTx, aTx := expect[i], actual[i] 159 assert.Equal(t, eTx.Hash().String(), aTx.TxHash) 160 assert.Equal(t, eTx.Gas(), aTx.Gas) 161 } 162 } 163 164 func checkStructLogs(t *testing.T, expect []*txTraceResult, actual []*types.ExecutionResult) { 165 // assert executionResults 166 assert.Equal(t, len(expect), len(actual)) 167 for i, val := range expect { 168 trace1, trace2 := val.Result.(*types.ExecutionResult), actual[i] 169 assert.Equal(t, trace1.L1DataFee, trace2.L1DataFee) 170 assert.Equal(t, trace1.Failed, trace2.Failed) 171 assert.Equal(t, trace1.Gas, trace2.Gas) 172 assert.Equal(t, trace1.ReturnValue, trace2.ReturnValue) 173 assert.Equal(t, len(trace1.StructLogs), len(trace2.StructLogs)) 174 // TODO: compare other fields 175 176 for i, opcode := range trace1.StructLogs { 177 data1, err := json.Marshal(opcode) 178 assert.NoError(t, err) 179 data2, err := json.Marshal(trace2.StructLogs[i]) 180 assert.NoError(t, err) 181 assert.Equal(t, string(data1), string(data2)) 182 } 183 } 184 } 185 186 func checkCoinbase(t *testing.T, b *testBackend, wrapper *types.AccountWrapper) { 187 var coinbase common.Address 188 if b.chainConfig.Scroll.FeeVaultEnabled() { 189 coinbase = *b.chainConfig.Scroll.FeeVaultAddress 190 } else { 191 header, err := b.HeaderByNumber(context.Background(), 1) 192 assert.NoError(t, err) 193 coinbase, err = b.engine.Author(header) 194 assert.NoError(t, err) 195 } 196 assert.Equal(t, true, coinbase.String() == wrapper.Address.String()) 197 } 198 199 func createAccounts(n int) (auths []*bind.TransactOpts) { 200 accounts := newAccounts(5) 201 for _, acc := range accounts { 202 auth, _ := bind.NewKeyedTransactorWithChainID(acc.key, big.NewInt(1)) 203 auth.Nonce = big.NewInt(0) 204 auths = append(auths, auth) 205 } 206 return 207 } 208 209 func createTx(b *core.BlockGen, auth *bind.TransactOpts, to *common.Address, value *big.Int, data []byte) (*types.Transaction, error) { 210 nonce := auth.Nonce.Uint64() 211 tx := types.NewTx(&types.LegacyTx{ 212 Nonce: nonce, 213 To: to, 214 Value: value, 215 Gas: 200000, 216 GasPrice: b.BaseFee(), 217 Data: data, 218 }) 219 signedTx, err := auth.Signer(auth.From, tx) 220 if err == nil { 221 auth.Nonce = big.NewInt(int64(nonce + 1)) 222 b.AddTx(signedTx) 223 } 224 return signedTx, err 225 }