github.com/lmittmann/w3@v0.20.0/module/eth/block_test.go (about) 1 package eth_test 2 3 import ( 4 "errors" 5 "math/big" 6 "testing" 7 8 "github.com/ethereum/go-ethereum/common" 9 "github.com/ethereum/go-ethereum/core/types" 10 "github.com/lmittmann/w3" 11 "github.com/lmittmann/w3/module/eth" 12 "github.com/lmittmann/w3/rpctest" 13 ) 14 15 func TestBlockByHash(t *testing.T) { 16 rpctest.RunTestCases(t, []rpctest.TestCase[*types.Block]{ 17 { 18 Golden: "get_block_by_hash__1", 19 Call: eth.BlockByHash(w3.H("0x88e96d4537bea4d9c05d12549907b32561d3bf31f45aae734cdc119f13406cb6")), 20 WantRet: types.NewBlockWithHeader(&types.Header{ 21 ParentHash: w3.H("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"), 22 UncleHash: w3.H("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), 23 Coinbase: w3.A("0x05a56E2D52c817161883f50c441c3228CFe54d9f"), 24 Root: w3.H("0xd67e4d450343046425ae4271474353857ab860dbc0a1dde64b41b5cd3a532bf3"), 25 TxHash: w3.H("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), 26 ReceiptHash: w3.H("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), 27 Bloom: types.BytesToBloom(w3.B("0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")), 28 Difficulty: w3.I("0x3ff800000"), 29 Number: w3.I("0x1"), 30 GasLimit: 0x1388, 31 GasUsed: 0x0, 32 Time: 0x55ba4224, 33 Extra: w3.B("0x476574682f76312e302e302f6c696e75782f676f312e342e32"), 34 MixDigest: w3.H("0x969b900de27b6ac6a67742365dd65f55a0526c41fd18e1b16f1a1215c2e66f59"), 35 Nonce: types.EncodeNonce(0x539bd4979fef1ec4), 36 }), 37 }, 38 { 39 Golden: "get_block_by_hash__46147", 40 Call: eth.BlockByHash(w3.H("0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd")), 41 WantRet: types.NewBlockWithHeader(&types.Header{ 42 ParentHash: w3.H("0x5a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfc"), 43 UncleHash: w3.H("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), 44 Coinbase: w3.A("0xe6A7a1d47ff21B6321162AEA7C6CB457D5476Bca"), 45 Root: w3.H("0x0e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169"), 46 TxHash: w3.H("0x4513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598"), 47 ReceiptHash: w3.H("0xfe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4"), 48 Bloom: types.BytesToBloom(w3.B("0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")), 49 Difficulty: w3.I("0x153886c1bbd"), 50 Number: w3.I("0xb443"), 51 GasLimit: 0x520b, 52 GasUsed: 0x5208, 53 Time: 0x55c42659, 54 Extra: w3.B("0x657468706f6f6c2e6f7267"), 55 MixDigest: w3.H("0xb48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf4"), 56 Nonce: types.EncodeNonce(0xba4f8ecd18aab215), 57 }).WithBody(types.Body{ 58 Transactions: types.Transactions{ 59 types.NewTx(&types.LegacyTx{ 60 Nonce: 0x0, 61 GasPrice: w3.I("0x2d79883d2000"), 62 Gas: 0x5208, 63 To: w3.APtr("0x5DF9B87991262F6BA471F09758CDE1c0FC1De734"), 64 Value: w3.I("0x7a69"), 65 V: w3.I("0x1c"), 66 R: w3.I("0x88ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0"), 67 S: w3.I("0x45e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33a"), 68 }), 69 }, 70 }), 71 }, 72 { 73 Golden: "get_block_by_hash__0x00", 74 Call: eth.BlockByHash(common.Hash{}), 75 WantErr: errors.New("w3: call failed: not found"), 76 }, 77 { 78 Golden: "get_block_by_hash__18000000", 79 Call: eth.BlockByHash(w3.H("0x95b198e154acbfc64109dfd22d8224fe927fd8dfdedfae01587674482ba4baf3")), 80 WantRet: types.NewBlockWithHeader(&types.Header{ 81 BaseFee: w3.I("0x50ead8e39"), 82 Difficulty: w3.I("0x0"), 83 Extra: w3.B("0x496c6c756d696e61746520446d6f63726174697a6520447374726962757465"), 84 GasLimit: 0x1c9c380, 85 GasUsed: 0xf7e9ab, 86 Bloom: types.BytesToBloom(w3.B("0x53f146f2484e1cb4b24d5a028329290bd702c80fe8465d9e55e900682e28809f405df83fd48d530900908f3c62de69000a530db688092c03d9406056852a0152220084ec4f8daa3c2c226e9878b08578163190e80b482ad30604c3649c25002037100c2086aaa3291c0407418431ebaa851804a6212996a206840875360bd84d2123065273780b9d04e4950c029a40d3e062b2697b048e4f3629824234ba00318a680d70eab6a9d740e38de89394d492c4c2ad6424bac19d4bcf08ca4044435aca49069e6907893082841ca20446b2220f4053121e7cc4b8cb84095f1a32320e105a20c821f675418c0d13308a896040d67550322ac88444e20080b364670401")), 87 Coinbase: w3.A("0xdafea492d9c6733ae3d56b7ed1adb60692c98bc5"), 88 MixDigest: w3.H("0x8b14d8532c673877dcc735caf93392bd05603456b7745fc3f012a3e3b156acfa"), 89 Nonce: types.EncodeNonce(0x0000000000000000), 90 Number: w3.I("0x112a880"), 91 ParentHash: w3.H("0x198723e0ddf20153951c6304093cbd97fd306c5db03287c5586c0430a986080d"), 92 ReceiptHash: w3.H("0xd925652022fa6da2ca5b9781ab2fd50cb05d3b4741a327f52322e2b7917d3a2f"), 93 UncleHash: w3.H("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), 94 Root: w3.H("0x08b7443c83a93d4711f5c63e738c27c54a932522405b37b4ca7868a944105deb"), 95 Time: 0x64ea268f, 96 TxHash: w3.H("0x97dd0200249a35da2c73b366612c2d9c3d112e83ef5e0277cded1352c66628ba"), 97 WithdrawalsHash: ptr(w3.H("0x5362ee94b61e8cef92bf61353e62744b4fe6d1f2482aade614054527e6d5de7d")), 98 }).WithBody(types.Body{ 99 Withdrawals: []*types.Withdrawal{ 100 {Index: 0xeb9b8c, Validator: 0xa474b, Address: w3.A("0xd7a0b38496064412a8d6b1f77bc30ada93e7b7a5"), Amount: 0xeb0d50}, 101 }, 102 }), 103 }, 104 }) 105 } 106 107 func TestBlockByNumber(t *testing.T) { 108 rpctest.RunTestCases(t, []rpctest.TestCase[*types.Block]{ 109 { 110 Golden: "get_block_by_number__1", 111 Call: eth.BlockByNumber(big.NewInt(1)), 112 WantRet: types.NewBlockWithHeader(&types.Header{ 113 ParentHash: w3.H("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"), 114 UncleHash: w3.H("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), 115 Coinbase: w3.A("0x05a56E2D52c817161883f50c441c3228CFe54d9f"), 116 Root: w3.H("0xd67e4d450343046425ae4271474353857ab860dbc0a1dde64b41b5cd3a532bf3"), 117 TxHash: w3.H("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), 118 ReceiptHash: w3.H("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), 119 Bloom: types.BytesToBloom(w3.B("0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")), 120 Difficulty: w3.I("0x3ff800000"), 121 Number: w3.I("0x1"), 122 GasLimit: 0x1388, 123 GasUsed: 0x0, 124 Time: 0x55ba4224, 125 Extra: w3.B("0x476574682f76312e302e302f6c696e75782f676f312e342e32"), 126 MixDigest: w3.H("0x969b900de27b6ac6a67742365dd65f55a0526c41fd18e1b16f1a1215c2e66f59"), 127 Nonce: types.EncodeNonce(0x539bd4979fef1ec4), 128 }), 129 }, 130 { 131 Golden: "get_block_by_number__46147", 132 Call: eth.BlockByNumber(big.NewInt(46147)), 133 WantRet: types.NewBlockWithHeader(&types.Header{ 134 ParentHash: w3.H("0x5a41d0e66b4120775176c09fcf39e7c0520517a13d2b57b18d33d342df038bfc"), 135 UncleHash: w3.H("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), 136 Coinbase: w3.A("0xe6A7a1d47ff21B6321162AEA7C6CB457D5476Bca"), 137 Root: w3.H("0x0e0df2706b0a4fb8bd08c9246d472abbe850af446405d9eba1db41db18b4a169"), 138 TxHash: w3.H("0x4513310fcb9f6f616972a3b948dc5d547f280849a87ebb5af0191f98b87be598"), 139 ReceiptHash: w3.H("0xfe2bf2a941abf41d72637e5b91750332a30283efd40c424dc522b77e6f0ed8c4"), 140 Bloom: types.BytesToBloom(w3.B("0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")), 141 Difficulty: w3.I("0x153886c1bbd"), 142 Number: w3.I("0xb443"), 143 GasLimit: 0x520b, 144 GasUsed: 0x5208, 145 Time: 0x55c42659, 146 Extra: w3.B("0x657468706f6f6c2e6f7267"), 147 MixDigest: w3.H("0xb48c515a9dde8d346c3337ea520aa995a4738bb595495506125449c1149d6cf4"), 148 Nonce: types.EncodeNonce(0xba4f8ecd18aab215), 149 }).WithBody(types.Body{ 150 Transactions: types.Transactions{ 151 types.NewTx(&types.LegacyTx{ 152 Nonce: 0x0, 153 GasPrice: w3.I("0x2d79883d2000"), 154 Gas: 0x5208, 155 To: w3.APtr("0x5DF9B87991262F6BA471F09758CDE1c0FC1De734"), 156 Value: w3.I("0x7a69"), 157 V: w3.I("0x1c"), 158 R: w3.I("0x88ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0"), 159 S: w3.I("0x45e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33a"), 160 }), 161 }, 162 }), 163 }, 164 { 165 Golden: "get_block_by_number__999999999", 166 Call: eth.BlockByNumber(big.NewInt(999999999)), 167 WantErr: errors.New("w3: call failed: not found"), 168 }, 169 }) 170 } 171 172 func TestBlockTxCountByHash(t *testing.T) { 173 rpctest.RunTestCases(t, []rpctest.TestCase[uint]{ 174 { 175 Golden: "block_transaction_count_by_hash__15050000", 176 Call: eth.BlockTxCountByHash(w3.H("0xc43d35f6a64f8a64f046c8deb4069572d622dfe7f028f62301b186f08f0e96f2")), 177 WantRet: 32, 178 }, 179 { 180 Golden: "block_transaction_count_by_hash__0x00", 181 Call: eth.BlockTxCountByHash(common.Hash{}), 182 WantErr: errors.New("w3: call failed: not found"), 183 }, 184 }) 185 } 186 187 func TestBlockTxCountByNumber(t *testing.T) { 188 rpctest.RunTestCases(t, []rpctest.TestCase[uint]{ 189 { 190 Golden: "block_transaction_count_by_number__15050000", 191 Call: eth.BlockTxCountByNumber(big.NewInt(15050000)), 192 WantRet: 32, 193 }, 194 }) 195 } 196 197 func TestHeaderByHash(t *testing.T) { 198 rpctest.RunTestCases(t, []rpctest.TestCase[*types.Header]{ 199 { 200 Golden: "get_block_by_hash__12965000", 201 Call: eth.HeaderByHash(w3.H("0x9b83c12c69edb74f6c8dd5d052765c1adf940e320bd1291696e6fa07829eee71")), 202 WantRet: &types.Header{ 203 ParentHash: w3.H("0x3de6bb3849a138e6ab0b83a3a00dc7433f1e83f7fd488e4bba78f2fe2631a633"), 204 UncleHash: w3.H("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), 205 Coinbase: w3.A("0x7777788200B672A42421017F65EDE4Fc759564C8"), 206 Root: w3.H("0x41cf6e8e60fd087d2b00360dc29e5bfb21959bce1f4c242fd1ad7c4da968eb87"), 207 TxHash: w3.H("0xdfcb68d3a3c41096f4a77569db7956e0a0e750fad185948e54789ea0e51779cb"), 208 ReceiptHash: w3.H("0x8a8865cd785e2e9dfce7da83aca010b10b9af2abbd367114b236f149534c821d"), 209 Bloom: types.BytesToBloom(w3.B("0x24e74ad77d9a2b27bdb8f6d6f7f1cffdd8cfb47fdebd433f011f7dfcfbb7db638fadd5ff66ed134ede2879ce61149797fbcdf7b74f6b7de153ec61bdaffeeb7b59c3ed771a2fe9eaed8ac70e335e63ff2bfe239eaff8f94ca642fdf7ee5537965be99a440f53d2ce057dbf9932be9a7b9a82ffdffe4eeee1a66c4cfb99fe4540fbff936f97dde9f6bfd9f8cefda2fc174d23dfdb7d6f7dfef5f754fe6a7eec92efdbff779b5feff3beafebd7fd6e973afebe4f5d86f3aafb1f73bf1e1d0cdd796d89827edeffe8fb6ae6d7bf639ec5f5ff4c32f31f6b525b676c7cdf5e5c75bfd5b7bd1928b6f43aac7fa0f6336576e5f7b7dfb9e8ebbe6f6efe2f9dfe8b3f56")), 210 Difficulty: w3.I("0x1b81c1fe05b218"), 211 Number: w3.I("0xc5d488"), 212 GasLimit: 0x1ca3542, 213 GasUsed: 0x1ca2629, 214 Time: 0x610bdaa6, 215 Extra: w3.B("0x68747470733a2f2f7777772e6b7279707465782e6f7267"), 216 MixDigest: w3.H("0x9620b46a81a4795cf4449d48e3270419f58b09293a5421205f88179b563f815a"), 217 Nonce: types.EncodeNonce(0xb223da049adf2216), 218 BaseFee: w3.I("0x3b9aca00"), 219 }, 220 }, 221 }) 222 } 223 224 func TestHeaderByNumber(t *testing.T) { 225 rpctest.RunTestCases(t, []rpctest.TestCase[*types.Header]{ 226 { 227 Golden: "get_block_by_number__12965000", 228 Call: eth.HeaderByNumber(big.NewInt(12965000)), 229 WantRet: &types.Header{ 230 ParentHash: w3.H("0x3de6bb3849a138e6ab0b83a3a00dc7433f1e83f7fd488e4bba78f2fe2631a633"), 231 UncleHash: w3.H("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), 232 Coinbase: w3.A("0x7777788200B672A42421017F65EDE4Fc759564C8"), 233 Root: w3.H("0x41cf6e8e60fd087d2b00360dc29e5bfb21959bce1f4c242fd1ad7c4da968eb87"), 234 TxHash: w3.H("0xdfcb68d3a3c41096f4a77569db7956e0a0e750fad185948e54789ea0e51779cb"), 235 ReceiptHash: w3.H("0x8a8865cd785e2e9dfce7da83aca010b10b9af2abbd367114b236f149534c821d"), 236 Bloom: types.BytesToBloom(w3.B("0x24e74ad77d9a2b27bdb8f6d6f7f1cffdd8cfb47fdebd433f011f7dfcfbb7db638fadd5ff66ed134ede2879ce61149797fbcdf7b74f6b7de153ec61bdaffeeb7b59c3ed771a2fe9eaed8ac70e335e63ff2bfe239eaff8f94ca642fdf7ee5537965be99a440f53d2ce057dbf9932be9a7b9a82ffdffe4eeee1a66c4cfb99fe4540fbff936f97dde9f6bfd9f8cefda2fc174d23dfdb7d6f7dfef5f754fe6a7eec92efdbff779b5feff3beafebd7fd6e973afebe4f5d86f3aafb1f73bf1e1d0cdd796d89827edeffe8fb6ae6d7bf639ec5f5ff4c32f31f6b525b676c7cdf5e5c75bfd5b7bd1928b6f43aac7fa0f6336576e5f7b7dfb9e8ebbe6f6efe2f9dfe8b3f56")), 237 Difficulty: w3.I("0x1b81c1fe05b218"), 238 Number: w3.I("0xc5d488"), 239 GasLimit: 0x1ca3542, 240 GasUsed: 0x1ca2629, 241 Time: 0x610bdaa6, 242 Extra: w3.B("0x68747470733a2f2f7777772e6b7279707465782e6f7267"), 243 MixDigest: w3.H("0x9620b46a81a4795cf4449d48e3270419f58b09293a5421205f88179b563f815a"), 244 Nonce: types.EncodeNonce(0xb223da049adf2216), 245 BaseFee: w3.I("0x3b9aca00"), 246 }, 247 }, 248 }) 249 } 250 251 func ptr[T any](v T) *T { return &v }