diff --git a/services/wallet/transfer/block_ranges_sequential_dao.go b/services/wallet/transfer/block_ranges_sequential_dao.go index e3dcf77ab..7f91084b9 100644 --- a/services/wallet/transfer/block_ranges_sequential_dao.go +++ b/services/wallet/transfer/block_ranges_sequential_dao.go @@ -116,13 +116,17 @@ func (b *BlockRangeSequentialDAO) upsertEthRange(chainID uint64, account common. "start", blockRange.Start, "first", blockRange.FirstKnown, "last", blockRange.LastKnown) upsert, err := b.db.Prepare(`REPLACE INTO blocks_ranges_sequential - (network_id, address, blk_start, blk_first, blk_last) VALUES (?, ?, ?, ?, ?)`) + (network_id, address, blk_start, blk_first, blk_last, token_blk_start, token_blk_first, token_blk_last) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`) if err != nil { return err } - _, err = upsert.Exec(chainID, account, (*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown), - (*bigint.SQLBigInt)(blockRange.LastKnown)) + if ethTokensBlockRange.tokens == nil { + ethTokensBlockRange.tokens = NewBlockRange() + } + + _, err = upsert.Exec(chainID, account, (*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown), (*bigint.SQLBigInt)(blockRange.LastKnown), + (*bigint.SQLBigInt)(ethTokensBlockRange.tokens.Start), (*bigint.SQLBigInt)(ethTokensBlockRange.tokens.FirstKnown), (*bigint.SQLBigInt)(ethTokensBlockRange.tokens.LastKnown)) return err } @@ -145,8 +149,8 @@ func (b *BlockRangeSequentialDAO) updateTokenRange(chainID uint64, account commo return err } - _, err = update.Exec(chainID, account, (*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown), - (*bigint.SQLBigInt)(blockRange.LastKnown)) + _, err = update.Exec((*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown), + (*bigint.SQLBigInt)(blockRange.LastKnown), chainID, account) return err } diff --git a/services/wallet/transfer/block_ranges_sequential_dao_test.go b/services/wallet/transfer/block_ranges_sequential_dao_test.go new file mode 100644 index 000000000..1df80921a --- /dev/null +++ b/services/wallet/transfer/block_ranges_sequential_dao_test.go @@ -0,0 +1,141 @@ +package transfer + +import ( + "database/sql" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/status-im/status-go/t/helpers" + "github.com/status-im/status-go/walletdatabase" +) + +func setupBlockRangesTestDB(t *testing.T) (*sql.DB, func()) { + db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{}) + require.NoError(t, err) + return db, func() { + require.NoError(t, db.Close()) + } +} + +func TestBlockRangeSequentialDAO_updateTokenRange(t *testing.T) { + walletDb, stop := setupBlockRangesTestDB(t) + defer stop() + + type fields struct { + db *sql.DB + } + type args struct { + chainID uint64 + account common.Address + newBlockRange *BlockRange + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + "testTokenBlockRange", + fields{db: walletDb}, + args{ + chainID: 1, + account: common.Address{}, + newBlockRange: &BlockRange{ + LastKnown: big.NewInt(1), + }, + }, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b := &BlockRangeSequentialDAO{ + db: tt.fields.db, + } + + err := b.upsertRange(tt.args.chainID, tt.args.account, newEthTokensBlockRanges()) + require.NoError(t, err) + + if err := b.updateTokenRange(tt.args.chainID, tt.args.account, tt.args.newBlockRange); (err != nil) != tt.wantErr { + t.Errorf("BlockRangeSequentialDAO.updateTokenRange() error = %v, wantErr %v", err, tt.wantErr) + } + + ethTokensBlockRanges, err := b.getBlockRange(tt.args.chainID, tt.args.account) + require.NoError(t, err) + require.NotNil(t, ethTokensBlockRanges.tokens) + require.Equal(t, tt.args.newBlockRange.LastKnown, ethTokensBlockRanges.tokens.LastKnown) + }) + } +} + +func TestBlockRangeSequentialDAO_updateEthRange(t *testing.T) { + walletDb, stop := setupBlockRangesTestDB(t) + defer stop() + + type fields struct { + db *sql.DB + } + type args struct { + chainID uint64 + account common.Address + newBlockRange *BlockRange + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + "testEthBlockRange", + fields{db: walletDb}, + args{ + chainID: 1, + account: common.Address{}, + newBlockRange: &BlockRange{ + Start: big.NewInt(2), + FirstKnown: big.NewInt(1), + LastKnown: big.NewInt(3), + }, + }, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b := &BlockRangeSequentialDAO{ + db: tt.fields.db, + } + + // Initial insert + dummyBlockRange := NewBlockRange() + dummyBlockRange.FirstKnown = big.NewInt(2) // To confirm that it is updated it must be greater than newBlockRange.FirstKnown + if err := b.upsertEthRange(tt.args.chainID, tt.args.account, dummyBlockRange); (err != nil) != tt.wantErr { + t.Errorf("BlockRangeSequentialDAO.upsertEthRange() insert error = %v, wantErr %v", err, tt.wantErr) + } + + ethTokensBlockRanges, err := b.getBlockRange(tt.args.chainID, tt.args.account) + require.NoError(t, err) + require.NotNil(t, ethTokensBlockRanges.eth) + require.Equal(t, dummyBlockRange.Start, ethTokensBlockRanges.eth.Start) + require.Equal(t, dummyBlockRange.FirstKnown, ethTokensBlockRanges.eth.FirstKnown) + require.Equal(t, dummyBlockRange.LastKnown, ethTokensBlockRanges.eth.LastKnown) + + // Update + if err := b.upsertEthRange(tt.args.chainID, tt.args.account, tt.args.newBlockRange); (err != nil) != tt.wantErr { + t.Errorf("BlockRangeSequentialDAO.upsertEthRange() update error = %v, wantErr %v", err, tt.wantErr) + } + + ethTokensBlockRanges, err = b.getBlockRange(tt.args.chainID, tt.args.account) + require.NoError(t, err) + require.NotNil(t, ethTokensBlockRanges.eth) + require.Equal(t, tt.args.newBlockRange.Start, ethTokensBlockRanges.eth.Start) + require.Equal(t, tt.args.newBlockRange.LastKnown, ethTokensBlockRanges.eth.LastKnown) + require.Equal(t, tt.args.newBlockRange.FirstKnown, ethTokensBlockRanges.eth.FirstKnown) + }) + } +}