github.com/status-im/status-go@v1.1.0/services/wallet/transfer/database_test.go (about) 1 package transfer 2 3 import ( 4 "context" 5 "math/big" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 10 "github.com/ethereum/go-ethereum/common" 11 "github.com/ethereum/go-ethereum/core/types" 12 13 "github.com/status-im/status-go/services/wallet/bigint" 14 w_common "github.com/status-im/status-go/services/wallet/common" 15 "github.com/status-im/status-go/services/wallet/thirdparty" 16 "github.com/status-im/status-go/t/helpers" 17 "github.com/status-im/status-go/walletdatabase" 18 ) 19 20 func setupTestDB(t *testing.T) (*Database, *BlockDAO, func()) { 21 db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{}) 22 require.NoError(t, err) 23 return NewDB(db), &BlockDAO{db}, func() { 24 require.NoError(t, db.Close()) 25 } 26 } 27 28 func TestDBSaveBlocks(t *testing.T) { 29 db, _, stop := setupTestDB(t) 30 defer stop() 31 address := common.Address{1} 32 blocks := []*DBHeader{ 33 { 34 Number: big.NewInt(1), 35 Hash: common.Hash{1}, 36 Address: address, 37 }, 38 { 39 Number: big.NewInt(2), 40 Hash: common.Hash{2}, 41 Address: address, 42 }} 43 require.NoError(t, db.SaveBlocks(777, blocks)) 44 transfers := []Transfer{ 45 { 46 ID: common.Hash{1}, 47 Type: w_common.EthTransfer, 48 BlockHash: common.Hash{2}, 49 BlockNumber: big.NewInt(1), 50 Address: address, 51 Timestamp: 123, 52 From: address, 53 }, 54 } 55 tx, err := db.client.BeginTx(context.Background(), nil) 56 require.NoError(t, err) 57 58 require.NoError(t, saveTransfersMarkBlocksLoaded(tx, 777, address, transfers, []*big.Int{big.NewInt(1), big.NewInt(2)})) 59 require.NoError(t, tx.Commit()) 60 } 61 62 func TestDBSaveTransfers(t *testing.T) { 63 db, _, stop := setupTestDB(t) 64 defer stop() 65 address := common.Address{1} 66 header := &DBHeader{ 67 Number: big.NewInt(1), 68 Hash: common.Hash{1}, 69 Address: address, 70 } 71 tx := types.NewTransaction(1, address, nil, 10, big.NewInt(10), nil) 72 transfers := []Transfer{ 73 { 74 ID: common.Hash{1}, 75 Type: w_common.EthTransfer, 76 BlockHash: header.Hash, 77 BlockNumber: header.Number, 78 Transaction: tx, 79 Receipt: types.NewReceipt(nil, false, 100), 80 Address: address, 81 MultiTransactionID: 0, 82 }, 83 } 84 require.NoError(t, db.SaveBlocks(777, []*DBHeader{header})) 85 require.NoError(t, saveTransfersMarkBlocksLoaded(db.client, 777, address, transfers, []*big.Int{header.Number})) 86 } 87 88 func TestDBGetTransfersFromBlock(t *testing.T) { 89 db, _, stop := setupTestDB(t) 90 defer stop() 91 headers := []*DBHeader{} 92 transfers := []Transfer{} 93 address := common.Address{1} 94 blockNumbers := []*big.Int{} 95 for i := 1; i < 10; i++ { 96 header := &DBHeader{ 97 Number: big.NewInt(int64(i)), 98 Hash: common.Hash{byte(i)}, 99 Address: address, 100 } 101 headers = append(headers, header) 102 blockNumbers = append(blockNumbers, header.Number) 103 tx := types.NewTransaction(uint64(i), address, nil, 10, big.NewInt(10), nil) 104 receipt := types.NewReceipt(nil, false, 100) 105 receipt.Logs = []*types.Log{} 106 transfer := Transfer{ 107 ID: tx.Hash(), 108 Type: w_common.EthTransfer, 109 BlockNumber: header.Number, 110 BlockHash: header.Hash, 111 Transaction: tx, 112 Receipt: receipt, 113 Address: address, 114 } 115 transfers = append(transfers, transfer) 116 } 117 require.NoError(t, db.SaveBlocks(777, headers)) 118 require.NoError(t, saveTransfersMarkBlocksLoaded(db.client, 777, address, transfers, blockNumbers)) 119 rst, err := db.GetTransfers(777, big.NewInt(7), nil) 120 require.NoError(t, err) 121 require.Len(t, rst, 1) 122 } 123 124 func TestGetTransfersForIdentities(t *testing.T) { 125 db, _, stop := setupTestDB(t) 126 defer stop() 127 128 trs, _, _ := GenerateTestTransfers(t, db.client, 1, 4) 129 for i := range trs { 130 InsertTestTransfer(t, db.client, trs[i].To, &trs[i]) 131 } 132 133 entries, err := db.GetTransfersForIdentities(context.Background(), []TransactionIdentity{ 134 TransactionIdentity{trs[1].ChainID, trs[1].Hash, trs[1].To}, 135 TransactionIdentity{trs[3].ChainID, trs[3].Hash, trs[3].To}}) 136 require.NoError(t, err) 137 require.Equal(t, 2, len(entries)) 138 require.Equal(t, trs[1].Hash, entries[0].ID) 139 require.Equal(t, trs[3].Hash, entries[1].ID) 140 require.Equal(t, trs[1].From, entries[0].From) 141 require.Equal(t, trs[3].From, entries[1].From) 142 require.Equal(t, trs[1].To, entries[0].Address) 143 require.Equal(t, trs[3].To, entries[1].Address) 144 require.Equal(t, big.NewInt(trs[1].BlkNumber), entries[0].BlockNumber) 145 require.Equal(t, big.NewInt(trs[3].BlkNumber), entries[1].BlockNumber) 146 require.Equal(t, uint64(trs[1].Timestamp), entries[0].Timestamp) 147 require.Equal(t, uint64(trs[3].Timestamp), entries[1].Timestamp) 148 require.Equal(t, uint64(trs[1].ChainID), entries[0].NetworkID) 149 require.Equal(t, uint64(trs[3].ChainID), entries[1].NetworkID) 150 require.Equal(t, w_common.MultiTransactionIDType(0), entries[0].MultiTransactionID) 151 require.Equal(t, w_common.MultiTransactionIDType(0), entries[1].MultiTransactionID) 152 } 153 154 func TestGetLatestCollectibleTransfer(t *testing.T) { 155 db, _, stop := setupTestDB(t) 156 defer stop() 157 158 trs, _, _ := GenerateTestTransfers(t, db.client, 1, len(TestCollectibles)) 159 160 collectible := TestCollectibles[0] 161 collectibleID := thirdparty.CollectibleUniqueID{ 162 ContractID: thirdparty.ContractID{ 163 ChainID: collectible.ChainID, 164 Address: collectible.TokenAddress, 165 }, 166 TokenID: &bigint.BigInt{Int: collectible.TokenID}, 167 } 168 firstTr := trs[0] 169 lastTr := firstTr 170 171 // ExtraTrs is a sequence of send+receive of the same collectible 172 extraTrs, _, _ := GenerateTestTransfers(t, db.client, len(trs)+1, 2) 173 for i := range extraTrs { 174 if i%2 == 0 { 175 extraTrs[i].From = firstTr.To 176 extraTrs[i].To = firstTr.From 177 } else { 178 extraTrs[i].From = firstTr.From 179 extraTrs[i].To = firstTr.To 180 } 181 extraTrs[i].ChainID = collectible.ChainID 182 } 183 184 for i := range trs { 185 collectibleData := TestCollectibles[i] 186 trs[i].ChainID = collectibleData.ChainID 187 InsertTestTransferWithOptions(t, db.client, trs[i].To, &trs[i], &TestTransferOptions{ 188 TokenAddress: collectibleData.TokenAddress, 189 TokenID: collectibleData.TokenID, 190 }) 191 } 192 193 foundTx, err := db.GetLatestCollectibleTransfer(lastTr.To, collectibleID) 194 require.NoError(t, err) 195 require.NotEmpty(t, foundTx) 196 require.Equal(t, lastTr.Hash, foundTx.ID) 197 198 for i := range extraTrs { 199 InsertTestTransferWithOptions(t, db.client, firstTr.To, &extraTrs[i], &TestTransferOptions{ 200 TokenAddress: collectible.TokenAddress, 201 TokenID: collectible.TokenID, 202 }) 203 } 204 205 lastTr = extraTrs[len(extraTrs)-1] 206 207 foundTx, err = db.GetLatestCollectibleTransfer(lastTr.To, collectibleID) 208 require.NoError(t, err) 209 require.NotEmpty(t, foundTx) 210 require.Equal(t, lastTr.Hash, foundTx.ID) 211 }