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  }