github.com/status-im/status-go@v1.1.0/appdatabase/database_test.go (about) 1 package appdatabase 2 3 import ( 4 "database/sql" 5 "encoding/json" 6 "errors" 7 "fmt" 8 "math/big" 9 "strconv" 10 "testing" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/ethereum/go-ethereum/common" 15 "github.com/ethereum/go-ethereum/core/types" 16 17 "github.com/status-im/status-go/appdatabase/migrations" 18 migrationsprevnodecfg "github.com/status-im/status-go/appdatabase/migrationsprevnodecfg" 19 "github.com/status-im/status-go/common/dbsetup" 20 "github.com/status-im/status-go/nodecfg" 21 "github.com/status-im/status-go/services/wallet/bigint" 22 w_common "github.com/status-im/status-go/services/wallet/common" 23 "github.com/status-im/status-go/sqlite" 24 "github.com/status-im/status-go/t/helpers" 25 ) 26 27 func Test_GetDBFilename(t *testing.T) { 28 // Test with a temp file instance 29 db, stop, err := helpers.SetupTestSQLDB(DbInitializer{}, "test") 30 require.NoError(t, err) 31 defer func() { 32 require.NoError(t, stop()) 33 }() 34 35 fn, err := dbsetup.GetDBFilename(db) 36 require.NoError(t, err) 37 require.True(t, len(fn) > 0) 38 39 // Test with in memory instance 40 mdb, err := helpers.SetupTestMemorySQLDB(DbInitializer{}) 41 require.NoError(t, err) 42 defer func() { 43 require.NoError(t, mdb.Close()) 44 }() 45 46 fn, err = dbsetup.GetDBFilename(mdb) 47 require.NoError(t, err) 48 require.Equal(t, "", fn) 49 } 50 51 const ( 52 erc20ReceiptTestDataTemplate = `{"type":"0x2","root":"0x","status":"0x%d","cumulativeGasUsed":"0x10f8d2c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000001008000000000000000000000000000000000000002000000000020000000000000000000800000000000000000000000010000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000800000000000000000000","logs":[{"address":"0x98339d8c260052b7ad81c28c16c0b98420f2b46a","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e2d622c817878da5143bbe06866ca8e35273ba8a"],"data":"0x0000000000000000000000000000000000000000000000000000000000989680","blockNumber":"0x825527","transactionHash":"0xdcaa0fc7fe2e0d1f1343d1f36807344bb4fd26cda62ad8f9d8700e2c458cc79a","transactionIndex":"0x6c","blockHash":"0x69e0f829a557052c134cd7e21c220507d91bc35c316d3c47217e9bd362270274","logIndex":"0xcd","removed":false}],"transactionHash":"0xdcaa0fc7fe2e0d1f1343d1f36807344bb4fd26cda62ad8f9d8700e2c458cc79a","contractAddress":"0x0000000000000000000000000000000000000000","gasUsed":"0x8623","blockHash":"0x69e0f829a557052c134cd7e21c220507d91bc35c316d3c47217e9bd362270274","blockNumber":"0x825527","transactionIndex":"0x6c"}` 53 erc20TxTestData = `{"type":"0x2","nonce":"0x3d","gasPrice":"0x0","maxPriorityFeePerGas":"0x8c347c90","maxFeePerGas":"0x45964d43a4","gas":"0x8623","value":"0x0","input":"0x40c10f19000000000000000000000000e2d622c817878da5143bbe06866ca8e35273ba8a0000000000000000000000000000000000000000000000000000000000989680","v":"0x0","r":"0xbcac4bb290d48b467bb18ac67e98050b5f316d2c66b2f75dcc1d63a45c905d21","s":"0x10c15517ea9cabd7fe134b270daabf5d2e8335e935d3e021f54a4efaffb37cd2","to":"0x98339d8c260052b7ad81c28c16c0b98420f2b46a","chainId":"0x5","accessList":[],"hash":"0xdcaa0fc7fe2e0d1f1343d1f36807344bb4fd26cda62ad8f9d8700e2c458cc79a"}` 54 55 erc20LogTestData = `{"address":"0x98339d8c260052b7ad81c28c16c0b98420f2b46a","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e2d622c817878da5143bbe06866ca8e35273ba8a"],"data":"0x0000000000000000000000000000000000000000000000000000000000989680","blockNumber":"0x825527","transactionHash":"0xdcaa0fc7fe2e0d1f1343d1f36807344bb4fd26cda62ad8f9d8700e2c458cc79a","transactionIndex":"0x6c","blockHash":"0x69e0f829a557052c134cd7e21c220507d91bc35c316d3c47217e9bd362270274","logIndex":"0xcd","removed":false}` 56 ethReceiptTestData = `{ 57 "type": "0x2", 58 "root": "0x", 59 "status": "0x1", 60 "cumulativeGasUsed": "0x2b461", 61 "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 62 "logs": [], 63 "transactionHash": "0x4ac700ee2a1702f82b3cfdc88fd4d91f767b87fea9b929bd6223c6471a5e05b4", 64 "contractAddress": "0x0000000000000000000000000000000000000000", 65 "gasUsed": "0x5208", 66 "blockHash": "0x25fe164361c1cb4ed1b46996f7b5236d3118144529b31fca037fcda1d8ee684d", 67 "blockNumber": "0x5e3294", 68 "transactionIndex": "0x3" 69 }` 70 ethTxTestData = `{ 71 "type": "0x2", 72 "nonce": "0x1", 73 "gasPrice": "0x0", 74 "maxPriorityFeePerGas": "0x33", 75 "maxFeePerGas": "0x3b9aca00", 76 "gas": "0x55f0", 77 "value": "0x%s", 78 "input": "0x", 79 "v": "0x0", 80 "r": "0xacc277ce156382d6f333cc8d75a56250778b17f1c6d1676af63cf68d53713986", 81 "s": "0x32417261484e9796390abb8db13f993965d917836be5cd96df25b9b581de91ec", 82 "to": "0xbd54a96c0ae19a220c8e1234f54c940dfab34639", 83 "chainId": "0x1a4", 84 "accessList": [], 85 "hash": "0x4ac700ee2a1702f82b3cfdc88fd4d91f767b87fea9b929bd6223c6471a5e05b4" 86 }` 87 88 erc721TxTestData = `{"type":"0x2","nonce":"0x2f","gasPrice":"0x0","maxPriorityFeePerGas":"0x3b9aca00","maxFeePerGas":"0x2f691e609","gas":"0x1abc3","value":"0x0","input":"0x42842e0e000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c630000000000000000000000001c9751e0fbf5081849b56b522d50fb7f163b8080000000000000000000000000000000000000000000000000000000003ba7b95e360c6ebe","v":"0x1","r":"0xead469c32ffda3aa933f9aed814df411fb07893153c775b50596660036bbb5da","s":"0x73edadd4e4a7f0895f686b68e16101d195c0bb1b5f248f16b21557800b95bdf8","to":"0x85f0e02cb992aa1f9f47112f815f519ef1a59e2d","chainId":"0x1","accessList":[],"hash":"0x1dd936499e35ece8747bc481e476ac43eb4555a3a82e8cb93b7e429219bdd371"}` 89 erc721ReceiptTestData = `{"type":"0x2","root":"0x","status":"0x1","cumulativeGasUsed":"0x54cadb","logsBloom":"0x00000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200200000000000000000000000000008000000000000080000000000000000000000002000200000020000000200000000000800000000000000000000000010000000000000000000000040000000000000000000000000000000000000000000000000020000000000000000000040010000000000000000000000000000000800000000000002020000000000000000000000000000000000000000000000000020000010000000000000000000004000000000000000000000000000000000000000","logs":[{"address":"0x85f0e02cb992aa1f9f47112f815f519ef1a59e2d","topics":["0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c63","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000003ba7b95e"],"data":"0x","blockNumber":"0xf57974","transactionHash":"0x1dd936499e35ece8747bc481e476ac43eb4555a3a82e8cb93b7e429219bdd371","transactionIndex":"0x44","blockHash":"0x9228724ff5c19f9b1586e19b13102f94798d1ee32b5f14d5cbcdf74cc32eb732","logIndex":"0x86","removed":false},{"address":"0x85f0e02cb992aa1f9f47112f815f519ef1a59e2d","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c63","0x0000000000000000000000001c9751e0fbf5081849b56b522d50fb7f163b8080","0x000000000000000000000000000000000000000000000000000000003ba7b95e"],"data":"0x","blockNumber":"0xf57974","transactionHash":"0x1dd936499e35ece8747bc481e476ac43eb4555a3a82e8cb93b7e429219bdd371","transactionIndex":"0x44","blockHash":"0x9228724ff5c19f9b1586e19b13102f94798d1ee32b5f14d5cbcdf74cc32eb732","logIndex":"0x87","removed":false}],"transactionHash":"0x1dd936499e35ece8747bc481e476ac43eb4555a3a82e8cb93b7e429219bdd371","contractAddress":"0x0000000000000000000000000000000000000000","gasUsed":"0x18643","blockHash":"0x9228724ff5c19f9b1586e19b13102f94798d1ee32b5f14d5cbcdf74cc32eb732","blockNumber":"0xf57974","transactionIndex":"0x44"}` 90 erc721LogTestData = `{"address":"0x85f0e02cb992aa1f9f47112f815f519ef1a59e2d","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c63","0x0000000000000000000000001c9751e0fbf5081849b56b522d50fb7f163b8080","0x000000000000000000000000000000000000000000000000000000003ba7b95e"],"data":"0x","blockNumber":"0xf57974","transactionHash":"0x1dd936499e35ece8747bc481e476ac43eb4555a3a82e8cb93b7e429219bdd371","transactionIndex":"0x44","blockHash":"0x9228724ff5c19f9b1586e19b13102f94798d1ee32b5f14d5cbcdf74cc32eb732","logIndex":"0x87","removed":false}` 91 92 uniswapV2TxTestData = `{"type":"0x2","nonce":"0x42","gasPrice":"0x0","maxPriorityFeePerGas":"0x3b9aca00","maxFeePerGas":"0x13c6f691f2","gas":"0x2ed0d","value":"0xa688906bd8b0000","input":"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006440875700000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000a688906bd8b0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000a688906bd8b000000000000000000000000000000000000000000001188be846e642b0ae4ae055e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933","v":"0x1","r":"0xeb7b527c2bfd3d26ea8e21951f537f4603867a11532081ba77fde9465696c20a","s":"0x5c120e64973a3b83a80d8b045a2228b9d1421065c1d480d2c1e322dad3b76c0f","to":"0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","chainId":"0x1","accessList":[],"hash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa"}` 93 uniswapV2ReceiptTestData = `{"type":"0x2","root":"0x","status":"0x1","cumulativeGasUsed":"0x1ba15e","logsBloom":"0x00200000000000000000000080400000000000000000000000000000000000000000000000000000000000000000000002000000080000000000000200000000000000080000000000000008000000200000000000000000000000008000000000000000000000000000000000000000000000000000000000000010000000000000000000008000000000000000040000000001000000080000004200000000000800000000000000000000008000000000000000000000000000000800000001000012000000000000000000000000400000000000001000000000000000000000200001000000020000000000000000000000000000400000000080000000","logs":[{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],"data":"0x0000000000000000000000000000000000000000000000000a688906bd8b0000","blockNumber":"0x104ae90","transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","transactionIndex":"0x4","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","logIndex":"0x2b","removed":false},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],"data":"0x0000000000000000000000000000000000000000000000000a688906bd8b0000","blockNumber":"0x104ae90","transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","transactionIndex":"0x4","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","logIndex":"0x2c","removed":false},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","0x000000000000000000000000a43fe16908251ee70ef74718545e4fe6c5ccec9f"],"data":"0x0000000000000000000000000000000000000000000000000a688906bd8b0000","blockNumber":"0x104ae90","transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","transactionIndex":"0x4","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","logIndex":"0x2d","removed":false},{"address":"0x6982508145454ce325ddbe47a25d4ec3d2311933","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000a43fe16908251ee70ef74718545e4fe6c5ccec9f","0x000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c63"],"data":"0x000000000000000000000000000000000000000011b2e784030a3a65a3559087","blockNumber":"0x104ae90","transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","transactionIndex":"0x4","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","logIndex":"0x2e","removed":false},{"address":"0xa43fe16908251ee70ef74718545e4fe6c5ccec9f","topics":["0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1"],"data":"0x000000000000000000000000000000000000003bdd991fe0c766723fa956e323000000000000000000000000000000000000000000000023240d303bb8bbb575","blockNumber":"0x104ae90","transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","transactionIndex":"0x4","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","logIndex":"0x2f","removed":false},{"address":"0xa43fe16908251ee70ef74718545e4fe6c5ccec9f","topics":["0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","0x000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c63"],"data":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a688906bd8b0000000000000000000000000000000000000000000011b2e784030a3a65a35590870000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x104ae90","transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","transactionIndex":"0x4","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","logIndex":"0x30","removed":false}],"transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","contractAddress":"0x0000000000000000000000000000000000000000","gasUsed":"0x1ec85","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","blockNumber":"0x104ae90","transactionIndex":"0x4"}` 94 uniswapV2LogTestData = `{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],"data":"0x0000000000000000000000000000000000000000000000000a688906bd8b0000","blockNumber":"0x104ae90","transactionHash":"0x6d70a0b14e2fe1ba28d6cb910ffc4aa787264dff6c273e20509136461ac587aa","transactionIndex":"0x4","blockHash":"0x49e3ef5a17eb5563b327fffdf315dd9269c5a5676eec1f5c15897c4ef61623df","logIndex":"0x2b","removed":false}` 95 96 uniswapV3TxTestData = `{"type":"0x2","nonce":"0x41","gasPrice":"0x0","maxPriorityFeePerGas":"0x3b9aca00","maxFeePerGas":"0x92abb2610","gas":"0x34389","value":"0x1f161421c8e0000","input":"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643e278300000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000001f161421c8e00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000001f161421c8e000000000000000000000000000000000000000000000002488dd50cfbb0a2a15abb00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20027105026f006b85729a8b14553fae6af249ad16c9aab000000000000000000000000000000000000000000","v":"0x1","r":"0x4fca68a439e7f841bdbe6d108bebd3d4c405f739cae203e61422152c4a0a057c","s":"0x597bd6d3848d31357207df1f92df77580310b7ad31f178575f0dae7f36934b39","to":"0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","chainId":"0x1","accessList":[],"hash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b"}` 97 uniswapV3ReceiptTestData = `{"type":"0x2","root":"0x","status":"0x1","cumulativeGasUsed":"0x6c1b8a","logsBloom":"0x00000000000000000000000000400000000000000000000200000000000000000000000000000000000000000000000002000000080020000000000200000000000004000000000800000028000000000000000000000000240000008000000000000000000000800000000000000000000000000000000000000010000800000000000000000000000000080000000000000001000000000000000000000000000800000000000000000000000000000000000000000000000000000800002000000002000000000000000000000000400000000000000000000000000000000000200000000000000000000000000000000400000000400000000080000000","logs":[{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],"data":"0x00000000000000000000000000000000000000000000000001f161421c8e0000","blockNumber":"0x1047cc4","transactionHash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b","transactionIndex":"0x4a","blockHash":"0x95c685d5165471e878aea2aaaa719bf4357cdbcd22722df4338e3e54f4e6c5d5","logIndex":"0xd8","removed":false},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],"data":"0x00000000000000000000000000000000000000000000000001f161421c8e0000","blockNumber":"0x1047cc4","transactionHash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b","transactionIndex":"0x4a","blockHash":"0x95c685d5165471e878aea2aaaa719bf4357cdbcd22722df4338e3e54f4e6c5d5","logIndex":"0xd9","removed":false},{"address":"0x5026f006b85729a8b14553fae6af249ad16c9aab","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000007316f8dd242974f0fd7b16dbcc68920b96bc4db1","0x000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c63"],"data":"0x000000000000000000000000000000000000000000024cc783fc216d1e77f90d","blockNumber":"0x1047cc4","transactionHash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b","transactionIndex":"0x4a","blockHash":"0x95c685d5165471e878aea2aaaa719bf4357cdbcd22722df4338e3e54f4e6c5d5","logIndex":"0xda","removed":false},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","0x0000000000000000000000007316f8dd242974f0fd7b16dbcc68920b96bc4db1"],"data":"0x00000000000000000000000000000000000000000000000001f161421c8e0000","blockNumber":"0x1047cc4","transactionHash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b","transactionIndex":"0x4a","blockHash":"0x95c685d5165471e878aea2aaaa719bf4357cdbcd22722df4338e3e54f4e6c5d5","logIndex":"0xdb","removed":false},{"address":"0x7316f8dd242974f0fd7b16dbcc68920b96bc4db1","topics":["0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","0x000000000000000000000000165eeecc32dcb623f51fc6c1ddd9e2aea1575c63"],"data":"0xfffffffffffffffffffffffffffffffffffffffffffdb3387c03de92e18806f300000000000000000000000000000000000000000000000001f161421c8e00000000000000000000000000000000000000000000000ea9ed3658a1ccb7e6d1cc000000000000000000000000000000000000000000001e5ab304463cab4cd155fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6f54","blockNumber":"0x1047cc4","transactionHash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b","transactionIndex":"0x4a","blockHash":"0x95c685d5165471e878aea2aaaa719bf4357cdbcd22722df4338e3e54f4e6c5d5","logIndex":"0xdc","removed":false}],"transactionHash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b","contractAddress":"0x0000000000000000000000000000000000000000","gasUsed":"0x22478","blockHash":"0x95c685d5165471e878aea2aaaa719bf4357cdbcd22722df4338e3e54f4e6c5d5","blockNumber":"0x1047cc4","transactionIndex":"0x4a"}` 98 uniswapV3LogTestData = `{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","topics":["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c","0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b"],"data":"0x00000000000000000000000000000000000000000000000001f161421c8e0000","blockNumber":"0x1047cc4","transactionHash":"0x5c5bca1291d1f09c07a9b66e56e78cc23da41b3e69e330dcd46a71ef6176df8b","transactionIndex":"0x4a","blockHash":"0x95c685d5165471e878aea2aaaa719bf4357cdbcd22722df4338e3e54f4e6c5d5","logIndex":"0xd8","removed":false}` 99 ) 100 101 func TestMigrateWalletJsonBlobs(t *testing.T) { 102 openDB := func() (*sql.DB, error) { 103 return sqlite.OpenDB(sqlite.InMemoryPath, "1234567890", dbsetup.ReducedKDFIterationsNumber) 104 } 105 db, err := openDB() 106 require.NoError(t, err) 107 108 // Execute the old migrations 109 err = migrationsprevnodecfg.Migrate(db) 110 require.NoError(t, err) 111 112 err = nodecfg.MigrateNodeConfig(db) 113 require.NoError(t, err) 114 115 // Migrate until 1682393575_sync_ens_name.up 116 err = migrations.MigrateTo(db, customSteps, 1682393575) 117 require.NoError(t, err) 118 119 // Validate that transfers table has no status column 120 exists, err := helpers.ColumnExists(db, "transfers", "status") 121 require.NoError(t, err) 122 require.False(t, exists) 123 124 exists, err = helpers.ColumnExists(db, "transfers", "status") 125 require.NoError(t, err) 126 require.False(t, exists) 127 128 insertTestTransaction := func(index int, txBlob string, receiptBlob string, logBlob string, ethType bool) error { 129 indexStr := strconv.Itoa(index) 130 senderStr := strconv.Itoa(index + 1) 131 132 var txValue *string 133 if txBlob != "" { 134 txValue = &txBlob 135 } 136 var receiptValue *string 137 if receiptBlob != "" { 138 receiptValue = &receiptBlob 139 } 140 var logValue *string 141 if logBlob != "" { 142 logValue = &logBlob 143 } 144 entryType := "eth" 145 if !ethType { 146 entryType = "erc20" 147 } 148 _, err = db.Exec(`INSERT OR IGNORE INTO blocks(network_id, address, blk_number, blk_hash) VALUES (?, ?, ?, ?); 149 INSERT INTO transfers (hash, address, sender, network_id, tx, receipt, log, blk_hash, type, blk_number, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, 150 index, common.HexToAddress(indexStr), index, common.HexToHash(indexStr), 151 common.HexToHash(indexStr), common.HexToAddress(indexStr), common.HexToAddress(senderStr), index, txValue, receiptValue, logValue, common.HexToHash(indexStr), entryType, index, index) 152 return err 153 } 154 155 // Empty transaction, found the usecase in the test DB 156 err = insertTestTransaction(1, "", "", "", true) 157 require.NoError(t, err) 158 159 erc20FailReceiptJSON := fmt.Sprintf(erc20ReceiptTestDataTemplate, 0) 160 erc20SuccessReceiptJSON := fmt.Sprintf(erc20ReceiptTestDataTemplate, 1) 161 err = insertTestTransaction(2, erc20TxTestData, erc20FailReceiptJSON, erc20LogTestData, false) 162 require.NoError(t, err) 163 164 err = insertTestTransaction(3, erc20TxTestData, erc20SuccessReceiptJSON, erc20LogTestData, false) 165 require.NoError(t, err) 166 167 err = insertTestTransaction(4, erc721TxTestData, erc721ReceiptTestData, erc721LogTestData, false) 168 require.NoError(t, err) 169 170 ethZeroValueTxTestData := fmt.Sprintf(ethTxTestData, "0") 171 ethVeryBigValueTxTestData := fmt.Sprintf(ethTxTestData, "12345678901234567890") 172 ethOriginalTxTestData := fmt.Sprintf(ethTxTestData, "2386f26fc10000") 173 174 err = insertTestTransaction(5, ethZeroValueTxTestData, ethReceiptTestData, "", true) 175 require.NoError(t, err) 176 err = insertTestTransaction(6, ethVeryBigValueTxTestData, "", "", true) 177 require.NoError(t, err) 178 err = insertTestTransaction(7, ethOriginalTxTestData, ethReceiptTestData, "", true) 179 require.NoError(t, err) 180 181 err = insertTestTransaction(8, uniswapV2TxTestData, uniswapV2ReceiptTestData, uniswapV2LogTestData, false) 182 require.NoError(t, err) 183 184 err = insertTestTransaction(9, uniswapV3TxTestData, uniswapV3ReceiptTestData, uniswapV3LogTestData, false) 185 require.NoError(t, err) 186 187 failMigrationSteps := []*sqlite.PostStep{ 188 { 189 Version: customSteps[1].Version, 190 CustomMigration: func(sqlTx *sql.Tx) error { 191 return errors.New("failed to run custom migration") 192 }, 193 RollBackVersion: customSteps[1].RollBackVersion, 194 }, 195 } 196 197 // Attempt to run test migration 1686048341 and fail in custom step 198 err = migrations.MigrateTo(db, failMigrationSteps, customSteps[1].Version) 199 require.Error(t, err) 200 201 exists, err = helpers.ColumnExists(db, "transfers", "status") 202 require.NoError(t, err) 203 require.False(t, exists) 204 205 // Run test migration 1686048341_transfers_receipt_json_blob_out.<up/down>.sql 206 err = migrations.MigrateTo(db, customSteps, customSteps[2].Version) 207 require.NoError(t, err) 208 209 // Validate that the migration was run and transfers table has now status column 210 exists, err = helpers.ColumnExists(db, "transfers", "status") 211 require.NoError(t, err) 212 require.True(t, exists) 213 214 // Run test migration 1687193315.<up/down>.sql 215 err = migrations.MigrateTo(db, customSteps, customSteps[1].Version) 216 require.NoError(t, err) 217 218 // Validate that the migration was run and transfers table has now txFrom column 219 exists, err = helpers.ColumnExists(db, "transfers", "tx_from_address") 220 require.NoError(t, err) 221 require.True(t, exists) 222 223 var ( 224 status, receiptType, cumulativeGasUsed, gasUsed, txIndex sql.NullInt64 225 gasLimit, gasPriceClamped64, gasTipCapClamped64 sql.NullInt64 226 gasFeeCapClamped64, accountNonce, size, logIndex, txType sql.NullInt64 227 228 protected sql.NullBool 229 amount128Hex sql.NullString 230 contractAddress, tokenAddress *common.Address 231 txFrom, txTo *common.Address 232 txHash, blockHash []byte 233 entryType string 234 isTokenIDNull bool 235 ) 236 237 tokenID := new(big.Int) 238 rows, err := db.Query(`SELECT status, receipt_type, tx_hash, log_index, block_hash, cumulative_gas_used, contract_address, gas_used, tx_index, 239 tx_type, protected, gas_limit, gas_price_clamped64, gas_tip_cap_clamped64, gas_fee_cap_clamped64, amount_padded128hex, account_nonce, size, token_address, token_id, type, 240 tx_from_address, tx_to_address, 241 242 CASE 243 WHEN token_id IS NULL THEN 1 244 ELSE 0 245 END as token_id_status 246 247 FROM transfers ORDER BY timestamp ASC`) 248 require.NoError(t, err) 249 250 scanNextData := func() error { 251 rows.Next() 252 if rows.Err() != nil { 253 return rows.Err() 254 } 255 err := rows.Scan(&status, &receiptType, &txHash, &logIndex, &blockHash, &cumulativeGasUsed, &contractAddress, &gasUsed, &txIndex, 256 &txType, &protected, &gasLimit, &gasPriceClamped64, &gasTipCapClamped64, &gasFeeCapClamped64, &amount128Hex, &accountNonce, &size, &tokenAddress, (*bigint.SQLBigIntBytes)(tokenID), &entryType, &txFrom, &txTo, &isTokenIDNull) 257 if err != nil { 258 return err 259 } 260 return nil 261 } 262 263 validateTransaction := func(tt *types.Transaction, expectedEntryType w_common.Type, tl *types.Log) { 264 if tt == nil { 265 require.False(t, txType.Valid) 266 require.False(t, protected.Valid) 267 require.False(t, gasLimit.Valid) 268 require.False(t, gasPriceClamped64.Valid) 269 require.False(t, gasTipCapClamped64.Valid) 270 require.False(t, gasFeeCapClamped64.Valid) 271 require.False(t, amount128Hex.Valid) 272 require.False(t, accountNonce.Valid) 273 require.False(t, size.Valid) 274 require.Empty(t, tokenAddress) 275 require.True(t, isTokenIDNull) 276 require.Equal(t, string(w_common.EthTransfer), entryType) 277 } else { 278 require.True(t, txType.Valid) 279 require.Equal(t, tt.Type(), uint8(txType.Int64)) 280 require.True(t, protected.Valid) 281 require.Equal(t, tt.Protected(), protected.Bool) 282 require.True(t, gasLimit.Valid) 283 require.Equal(t, tt.Gas(), uint64(gasLimit.Int64)) 284 require.True(t, gasPriceClamped64.Valid) 285 require.Equal(t, *sqlite.BigIntToClampedInt64(tt.GasPrice()), gasPriceClamped64.Int64) 286 require.True(t, gasTipCapClamped64.Valid) 287 require.Equal(t, *sqlite.BigIntToClampedInt64(tt.GasTipCap()), gasTipCapClamped64.Int64) 288 require.True(t, gasFeeCapClamped64.Valid) 289 require.Equal(t, *sqlite.BigIntToClampedInt64(tt.GasFeeCap()), gasFeeCapClamped64.Int64) 290 require.True(t, accountNonce.Valid) 291 require.Equal(t, tt.Nonce(), uint64(accountNonce.Int64)) 292 require.True(t, size.Valid) 293 require.Equal(t, int64(tt.Size()), size.Int64) 294 295 if expectedEntryType == w_common.EthTransfer { 296 require.True(t, amount128Hex.Valid) 297 require.Equal(t, *sqlite.BigIntToPadded128BitsStr(tt.Value()), amount128Hex.String) 298 require.True(t, isTokenIDNull) 299 } else { 300 actualEntryType, expectedTokenAddress, _, _ := w_common.ExtractTokenTransferData(expectedEntryType, tl, tt) 301 if actualEntryType == w_common.Erc20Transfer { 302 expectedFrom, expectedTo, expectedValue := w_common.ParseErc20TransferLog(tl) 303 require.True(t, amount128Hex.Valid) 304 require.Equal(t, *sqlite.BigIntToPadded128BitsStr(expectedValue), amount128Hex.String) 305 require.True(t, isTokenIDNull) 306 require.Equal(t, *expectedTokenAddress, *tokenAddress) 307 require.Equal(t, expectedFrom, *txFrom) 308 require.Equal(t, expectedTo, *txTo) 309 } else if actualEntryType == w_common.Erc721Transfer { 310 expectedFrom, expectedTo, expectedTokenID := w_common.ParseErc721TransferLog(tl) 311 require.True(t, amount128Hex.Valid) 312 require.Equal(t, *sqlite.BigIntToPadded128BitsStr(big.NewInt(1)), amount128Hex.String) 313 require.False(t, isTokenIDNull) 314 require.Equal(t, expectedTokenID, expectedTokenID) 315 require.Equal(t, *expectedTokenAddress, *tokenAddress) 316 require.Equal(t, expectedFrom, *txFrom) 317 require.Equal(t, expectedTo, *txTo) 318 } else { 319 require.False(t, amount128Hex.Valid) 320 require.True(t, isTokenIDNull) 321 require.Empty(t, tokenAddress) 322 require.Empty(t, txFrom) 323 require.Empty(t, txTo) 324 } 325 326 require.Equal(t, expectedEntryType, actualEntryType) 327 } 328 } 329 } 330 331 validateReceipt := func(tr *types.Receipt, tl *types.Log) { 332 if tr == nil { 333 require.False(t, status.Valid) 334 require.False(t, receiptType.Valid) 335 require.Equal(t, []byte(nil), txHash) 336 require.Equal(t, []byte(nil), blockHash) 337 require.False(t, cumulativeGasUsed.Valid) 338 require.Empty(t, contractAddress) 339 require.False(t, gasUsed.Valid) 340 require.False(t, txIndex.Valid) 341 } else { 342 require.True(t, status.Valid) 343 require.Equal(t, tr.Status, uint64(status.Int64)) 344 require.True(t, receiptType.Valid) 345 require.Equal(t, int64(tr.Type), receiptType.Int64) 346 require.Equal(t, tr.TxHash, common.BytesToHash(txHash)) 347 require.Equal(t, tr.BlockHash, common.BytesToHash(blockHash)) 348 require.True(t, cumulativeGasUsed.Valid) 349 require.Equal(t, int64(tr.CumulativeGasUsed), cumulativeGasUsed.Int64) 350 require.Equal(t, tr.ContractAddress, *contractAddress) 351 require.True(t, gasUsed.Valid) 352 require.Equal(t, int64(tr.GasUsed), gasUsed.Int64) 353 require.True(t, txIndex.Valid) 354 require.Equal(t, int64(tr.TransactionIndex), txIndex.Int64) 355 } 356 if tl == nil { 357 require.False(t, logIndex.Valid) 358 } else { 359 require.True(t, logIndex.Valid) 360 require.Equal(t, uint(logIndex.Int64), tl.Index) 361 } 362 } 363 364 err = scanNextData() 365 require.NoError(t, err) 366 validateTransaction(nil, w_common.EthTransfer, nil) 367 validateReceipt(nil, nil) 368 369 var successReceipt types.Receipt 370 err = json.Unmarshal([]byte(erc20SuccessReceiptJSON), &successReceipt) 371 require.NoError(t, err) 372 373 var failReceipt types.Receipt 374 err = json.Unmarshal([]byte(erc20FailReceiptJSON), &failReceipt) 375 require.NoError(t, err) 376 377 var erc20Log types.Log 378 err = json.Unmarshal([]byte(erc20LogTestData), &erc20Log) 379 require.NoError(t, err) 380 381 var erc20Tx types.Transaction 382 err = json.Unmarshal([]byte(erc20TxTestData), &erc20Tx) 383 require.NoError(t, err) 384 385 err = scanNextData() 386 require.NoError(t, err) 387 validateTransaction(&erc20Tx, w_common.Erc20Transfer, &erc20Log) 388 validateReceipt(&failReceipt, &erc20Log) 389 390 err = scanNextData() 391 require.NoError(t, err) 392 validateTransaction(&erc20Tx, w_common.Erc20Transfer, &erc20Log) 393 validateReceipt(&successReceipt, &erc20Log) 394 395 var erc721Receipt types.Receipt 396 err = json.Unmarshal([]byte(erc721ReceiptTestData), &erc721Receipt) 397 require.NoError(t, err) 398 399 var erc721Log types.Log 400 err = json.Unmarshal([]byte(erc721LogTestData), &erc721Log) 401 require.NoError(t, err) 402 403 var erc721Tx types.Transaction 404 err = json.Unmarshal([]byte(erc721TxTestData), &erc721Tx) 405 require.NoError(t, err) 406 407 err = scanNextData() 408 require.NoError(t, err) 409 validateTransaction(&erc721Tx, w_common.Erc721Transfer, &erc721Log) 410 validateReceipt(&erc721Receipt, &erc721Log) 411 412 var zeroTestTx types.Transaction 413 err = json.Unmarshal([]byte(ethZeroValueTxTestData), &zeroTestTx) 414 require.NoError(t, err) 415 416 var ethReceipt types.Receipt 417 err = json.Unmarshal([]byte(ethReceiptTestData), ðReceipt) 418 require.NoError(t, err) 419 420 err = scanNextData() 421 require.NoError(t, err) 422 validateTransaction(&zeroTestTx, w_common.EthTransfer, nil) 423 validateReceipt(ðReceipt, nil) 424 425 var bigTestTx types.Transaction 426 err = json.Unmarshal([]byte(ethVeryBigValueTxTestData), &bigTestTx) 427 require.NoError(t, err) 428 429 err = scanNextData() 430 require.NoError(t, err) 431 validateTransaction(&bigTestTx, w_common.EthTransfer, nil) 432 validateReceipt(nil, nil) 433 434 var ethOriginalTestTx types.Transaction 435 err = json.Unmarshal([]byte(ethOriginalTxTestData), ðOriginalTestTx) 436 require.NoError(t, err) 437 438 err = scanNextData() 439 require.NoError(t, err) 440 validateTransaction(ðOriginalTestTx, w_common.EthTransfer, nil) 441 validateReceipt(ðReceipt, nil) 442 443 var uniswapV2Receipt types.Receipt 444 err = json.Unmarshal([]byte(uniswapV2ReceiptTestData), &uniswapV2Receipt) 445 require.NoError(t, err) 446 447 var uniswapV2Log types.Log 448 err = json.Unmarshal([]byte(uniswapV2LogTestData), &uniswapV2Log) 449 require.NoError(t, err) 450 451 var uniswapV2Tx types.Transaction 452 err = json.Unmarshal([]byte(uniswapV2TxTestData), &uniswapV2Tx) 453 require.NoError(t, err) 454 455 var uniswapV3Receipt types.Receipt 456 err = json.Unmarshal([]byte(uniswapV3ReceiptTestData), &uniswapV3Receipt) 457 require.NoError(t, err) 458 459 var uniswapV3Log types.Log 460 err = json.Unmarshal([]byte(uniswapV3LogTestData), &uniswapV3Log) 461 require.NoError(t, err) 462 463 var uniswapV3Tx types.Transaction 464 err = json.Unmarshal([]byte(uniswapV3TxTestData), &uniswapV3Tx) 465 require.NoError(t, err) 466 467 err = scanNextData() 468 require.NoError(t, err) 469 validateTransaction(&uniswapV2Tx, w_common.UniswapV2Swap, &uniswapV2Log) 470 validateReceipt(&uniswapV2Receipt, &uniswapV2Log) 471 472 err = scanNextData() 473 require.NoError(t, err) 474 validateTransaction(&uniswapV3Tx, w_common.UniswapV3Swap, &uniswapV3Log) 475 validateReceipt(&uniswapV3Receipt, &uniswapV3Log) 476 477 err = scanNextData() 478 // Validate that we processed all data (no more rows expected) 479 require.Error(t, err) 480 481 db.Close() 482 }