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), &ethReceipt)
   418  	require.NoError(t, err)
   419  
   420  	err = scanNextData()
   421  	require.NoError(t, err)
   422  	validateTransaction(&zeroTestTx, w_common.EthTransfer, nil)
   423  	validateReceipt(&ethReceipt, 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), &ethOriginalTestTx)
   436  	require.NoError(t, err)
   437  
   438  	err = scanNextData()
   439  	require.NoError(t, err)
   440  	validateTransaction(&ethOriginalTestTx, w_common.EthTransfer, nil)
   441  	validateReceipt(&ethReceipt, 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  }