code.vegaprotocol.io/vega@v0.79.0/datanode/sqlstore/deposits_test.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package sqlstore_test
    17  
    18  import (
    19  	"context"
    20  	"encoding/hex"
    21  	"fmt"
    22  	"strconv"
    23  	"testing"
    24  	"time"
    25  
    26  	"code.vegaprotocol.io/vega/datanode/entities"
    27  	"code.vegaprotocol.io/vega/datanode/sqlstore"
    28  	vgrand "code.vegaprotocol.io/vega/libs/rand"
    29  	"code.vegaprotocol.io/vega/protos/vega"
    30  
    31  	"github.com/georgysavva/scany/pgxscan"
    32  	"github.com/stretchr/testify/assert"
    33  	"github.com/stretchr/testify/require"
    34  )
    35  
    36  const testAmount = "1000"
    37  
    38  var testID = hex.EncodeToString([]byte(vgrand.RandomStr(5)))
    39  
    40  func TestDeposits(t *testing.T) {
    41  	t.Run("Upsert should insert deposits if one doesn't exist for the block", testAddDepositForNewBlock)
    42  	t.Run("Upsert should update deposits if one already exists for the block", testUpdateDepositForBlockIfExists)
    43  	t.Run("Upsert should insert deposit updates if the same deposit id is inserted in a different block", testInsertDepositUpdatesIfNewBlock)
    44  	t.Run("GetByID should retrieve the latest state of the deposit with the given ID", testDepositsGetByID)
    45  	t.Run("GetByParty should retrieve the latest state of all deposits for a given party", testDepositsGetByParty)
    46  	t.Run("GetByTxHash", testDepositsGetTxhash)
    47  }
    48  
    49  func TestDepositsPagination(t *testing.T) {
    50  	t.Run("should return all deposits if no pagination is specified", testDepositsPaginationNoPagination)
    51  	t.Run("should return the first page of results if first is provided", testDepositsPaginationFirst)
    52  	t.Run("should return the last page of results if last is provided", testDepositsPaginationLast)
    53  	t.Run("should return the specified page of results if first and after are provided", testDepositsPaginationFirstAfter)
    54  	t.Run("should return the specified page of results if last and before are provided", testDepositsPaginationLastBefore)
    55  
    56  	t.Run("should return all deposits if no pagination is specified - newest first", testDepositsPaginationNoPaginationNewestFirst)
    57  	t.Run("should return the first page of results if first is provided - newest first", testDepositsPaginationFirstNewestFirst)
    58  	t.Run("should return the last page of results if last is provided - newest first", testDepositsPaginationLastNewestFirst)
    59  	t.Run("should return the specified page of results if first and after are provided - newest first", testDepositsPaginationFirstAfterNewestFirst)
    60  	t.Run("should return the specified page of results if last and before are provided - newest first", testDepositsPaginationLastBeforeNewestFirst)
    61  
    62  	t.Run("should return all deposits between dates if no pagination is specified", testDepositsPaginationBetweenDatesNoPagination)
    63  	t.Run("should return the first page of results between dates if first is provided", testDepositsPaginationBetweenDatesFirst)
    64  	t.Run("should return the last page of results between dates if last is provided", testDepositsPaginationBetweenDatesLast)
    65  	t.Run("should return the specified page of results between dates if first and after are provided", testDepositsPaginationBetweenDatesFirstAfter)
    66  	t.Run("should return the specified page of results between dates if last and before are provided", testDepositsPaginationBetweenDatesLastBefore)
    67  
    68  	t.Run("should return all deposits between dates if no pagination is specified - newest first", testDepositsPaginationBetweenDatesNoPaginationNewestFirst)
    69  	t.Run("should return the first page of results between dates if first is provided - newest first", testDepositsPaginationBetweenDatesFirstNewestFirst)
    70  	t.Run("should return the last page of results between dates if last is provided - newest first", testDepositsPaginationBetweenDatesLastNewestFirst)
    71  	t.Run("should return the specified page of results between dates if first and after are provided - newest first", testDepositsPaginationBetweenDatesFirstAfterNewestFirst)
    72  	t.Run("should return the specified page of results between dates if last and before are provided - newest first", testDepositsPaginationBetweenDatesLastBeforeNewestFirst)
    73  }
    74  
    75  func setupDepositStoreTests(t *testing.T) (*sqlstore.Blocks, *sqlstore.Deposits, sqlstore.Connection) {
    76  	t.Helper()
    77  	bs := sqlstore.NewBlocks(connectionSource)
    78  	ds := sqlstore.NewDeposits(connectionSource)
    79  	return bs, ds, connectionSource
    80  }
    81  
    82  func testAddDepositForNewBlock(t *testing.T) {
    83  	ctx := tempTransaction(t)
    84  
    85  	bs, ds, conn := setupDepositStoreTests(t)
    86  
    87  	var rowCount int
    88  
    89  	err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
    90  	require.NoError(t, err)
    91  	assert.Equal(t, 0, rowCount)
    92  
    93  	block := addTestBlock(t, ctx, bs)
    94  
    95  	depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano())
    96  
    97  	deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime)
    98  	require.NoError(t, err, "Converting market proto to database entity")
    99  
   100  	err = ds.Upsert(ctx, deposit)
   101  	require.NoError(t, err)
   102  	err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   103  	assert.NoError(t, err)
   104  	assert.Equal(t, 1, rowCount)
   105  }
   106  
   107  func testUpdateDepositForBlockIfExists(t *testing.T) {
   108  	ctx := tempTransaction(t)
   109  
   110  	bs, ds, conn := setupDepositStoreTests(t)
   111  
   112  	var rowCount int
   113  
   114  	err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   115  	require.NoError(t, err)
   116  	assert.Equal(t, 0, rowCount)
   117  
   118  	block := addTestBlock(t, ctx, bs)
   119  	depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano())
   120  
   121  	deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime)
   122  	require.NoError(t, err, "Converting market proto to database entity")
   123  
   124  	err = ds.Upsert(ctx, deposit)
   125  	require.NoError(t, err)
   126  	err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   127  	assert.NoError(t, err)
   128  	assert.Equal(t, 1, rowCount)
   129  
   130  	deposit.Status = entities.DepositStatus(vega.Deposit_STATUS_FINALIZED)
   131  
   132  	err = ds.Upsert(ctx, deposit)
   133  	require.NoError(t, err)
   134  	err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   135  	assert.NoError(t, err)
   136  	assert.Equal(t, 1, rowCount)
   137  
   138  	var status entities.DepositStatus
   139  	err = pgxscan.Get(ctx, conn, &status, `select status from deposits where id = $1 and vega_time = $2`, deposit.ID, deposit.VegaTime)
   140  	assert.NoError(t, err)
   141  	assert.Equal(t, entities.DepositStatusFinalized, status)
   142  }
   143  
   144  func testInsertDepositUpdatesIfNewBlock(t *testing.T) {
   145  	ctx := tempTransaction(t)
   146  
   147  	bs, ds, conn := setupDepositStoreTests(t)
   148  
   149  	var rowCount int
   150  
   151  	err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   152  	require.NoError(t, err)
   153  	assert.Equal(t, 0, rowCount)
   154  
   155  	source := &testBlockSource{bs, time.Now()}
   156  	block := source.getNextBlock(t, ctx)
   157  	depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano())
   158  
   159  	deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime)
   160  	require.NoError(t, err, "Converting market proto to database entity")
   161  
   162  	err = ds.Upsert(ctx, deposit)
   163  	require.NoError(t, err)
   164  	err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   165  	assert.NoError(t, err)
   166  	assert.Equal(t, 1, rowCount)
   167  
   168  	block = source.getNextBlock(t, ctx)
   169  	depositProto.Status = vega.Deposit_STATUS_FINALIZED
   170  	deposit, err = entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime)
   171  	require.NoError(t, err, "Converting market proto to database entity")
   172  
   173  	err = ds.Upsert(ctx, deposit)
   174  	require.NoError(t, err)
   175  	err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   176  	assert.NoError(t, err)
   177  	assert.Equal(t, 2, rowCount)
   178  
   179  	var status entities.DepositStatus
   180  	err = pgxscan.Get(ctx, conn, &status, `select status from deposits where id = $1 and vega_time = $2`, deposit.ID, deposit.VegaTime)
   181  	assert.NoError(t, err)
   182  	assert.Equal(t, entities.DepositStatusFinalized, status)
   183  }
   184  
   185  func testDepositsGetByID(t *testing.T) {
   186  	ctx := tempTransaction(t)
   187  
   188  	bs, ds, conn := setupDepositStoreTests(t)
   189  	var rowCount int
   190  
   191  	err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   192  	require.NoError(t, err)
   193  	assert.Equal(t, 0, rowCount)
   194  
   195  	source := &testBlockSource{bs, time.Now()}
   196  	block := source.getNextBlock(t, ctx)
   197  	depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano())
   198  
   199  	deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime)
   200  	require.NoError(t, err, "Converting market proto to database entity")
   201  
   202  	err = ds.Upsert(ctx, deposit)
   203  	require.NoError(t, err)
   204  	err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   205  	assert.NoError(t, err)
   206  	assert.Equal(t, 1, rowCount)
   207  
   208  	block = source.getNextBlock(t, ctx)
   209  	depositProto.Status = vega.Deposit_STATUS_FINALIZED
   210  	deposit, err = entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime)
   211  	require.NoError(t, err, "Converting market proto to database entity")
   212  
   213  	err = ds.Upsert(ctx, deposit)
   214  	require.NoError(t, err)
   215  
   216  	got, err := ds.GetByID(ctx, depositProto.Id)
   217  	assert.NoError(t, err)
   218  
   219  	// We need to truncate the timestamp because the postgres database will truncate to microseconds
   220  	deposit.CreatedTimestamp = deposit.CreatedTimestamp.Truncate(time.Microsecond)
   221  	deposit.CreditedTimestamp = deposit.CreditedTimestamp.Truncate(time.Microsecond)
   222  
   223  	assert.Equal(t, *deposit, got)
   224  }
   225  
   226  func testDepositsGetByParty(t *testing.T) {
   227  	ctx := tempTransaction(t)
   228  
   229  	bs, ds, conn := setupDepositStoreTests(t)
   230  
   231  	var rowCount int
   232  
   233  	err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   234  	require.NoError(t, err)
   235  	assert.Equal(t, 0, rowCount)
   236  
   237  	source := &testBlockSource{bs, time.Now()}
   238  	block := source.getNextBlock(t, ctx)
   239  	depositProto1 := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano())
   240  	depositProto1.Id = "deadbeef01"
   241  
   242  	depositProto2 := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano())
   243  	depositProto2.Id = "deadbeef02"
   244  
   245  	want := make([]entities.Deposit, 0)
   246  
   247  	deposit, err := entities.DepositFromProto(depositProto1, generateTxHash(), block.VegaTime)
   248  	require.NoError(t, err, "Converting market proto to database entity")
   249  
   250  	err = ds.Upsert(ctx, deposit)
   251  	require.NoError(t, err)
   252  
   253  	block = source.getNextBlock(t, ctx)
   254  	depositProto1.Status = vega.Deposit_STATUS_FINALIZED
   255  	deposit, err = entities.DepositFromProto(depositProto1, generateTxHash(), block.VegaTime)
   256  	require.NoError(t, err, "Converting market proto to database entity")
   257  
   258  	err = ds.Upsert(ctx, deposit)
   259  	require.NoError(t, err)
   260  
   261  	deposit.CreatedTimestamp = deposit.CreatedTimestamp.Truncate(time.Microsecond)
   262  	deposit.CreditedTimestamp = deposit.CreditedTimestamp.Truncate(time.Microsecond)
   263  
   264  	want = append(want, *deposit)
   265  
   266  	block = source.getNextBlock(t, ctx)
   267  	deposit, err = entities.DepositFromProto(depositProto2, generateTxHash(), block.VegaTime)
   268  	require.NoError(t, err, "Converting market proto to database entity")
   269  
   270  	err = ds.Upsert(ctx, deposit)
   271  	require.NoError(t, err)
   272  
   273  	block = source.getNextBlock(t, ctx)
   274  	deposit, err = entities.DepositFromProto(depositProto2, generateTxHash(), block.VegaTime)
   275  	depositProto2.Status = vega.Deposit_STATUS_FINALIZED
   276  	require.NoError(t, err, "Converting market proto to database entity")
   277  
   278  	err = ds.Upsert(ctx, deposit)
   279  	require.NoError(t, err)
   280  
   281  	deposit.CreatedTimestamp = deposit.CreatedTimestamp.Truncate(time.Microsecond)
   282  	deposit.CreditedTimestamp = deposit.CreditedTimestamp.Truncate(time.Microsecond)
   283  
   284  	want = append(want, *deposit)
   285  
   286  	got, _, err := ds.GetByParty(ctx, depositProto1.PartyId, false, entities.CursorPagination{}, entities.DateRange{})
   287  	assert.NoError(t, err)
   288  	assert.Equal(t, want, got)
   289  }
   290  
   291  func testDepositsGetTxhash(t *testing.T) {
   292  	ctx := tempTransaction(t)
   293  
   294  	bs, ds, conn := setupDepositStoreTests(t)
   295  
   296  	var rowCount int
   297  
   298  	err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount)
   299  	require.NoError(t, err)
   300  	assert.Equal(t, 0, rowCount)
   301  
   302  	block := addTestBlock(t, ctx, bs)
   303  	depositProto1 := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano())
   304  	depositProto1.Id = "deadbeef01"
   305  
   306  	deposit, err := entities.DepositFromProto(depositProto1, generateTxHash(), block.VegaTime)
   307  	require.NoError(t, err, "Converting market proto to database entity")
   308  
   309  	err = ds.Upsert(ctx, deposit)
   310  	require.NoError(t, err)
   311  
   312  	deposits, err := ds.GetByTxHash(ctx, deposit.TxHash)
   313  	assert.NoError(t, err)
   314  	assert.Equal(t, *deposit, deposits[0])
   315  }
   316  
   317  func getTestDeposit(id, party, asset, amount, txHash string, ts int64) *vega.Deposit {
   318  	return &vega.Deposit{
   319  		Id:                id,
   320  		Status:            vega.Deposit_STATUS_OPEN,
   321  		PartyId:           party,
   322  		Asset:             asset,
   323  		Amount:            amount,
   324  		TxHash:            txHash,
   325  		CreditedTimestamp: ts,
   326  		CreatedTimestamp:  ts,
   327  	}
   328  }
   329  
   330  func addDeposits(ctx context.Context, t *testing.T, bs *sqlstore.Blocks, ds *sqlstore.Deposits) []entities.Deposit {
   331  	t.Helper()
   332  	vegaTime := time.Now().Truncate(time.Microsecond)
   333  	amount := int64(1000)
   334  	deposits := make([]entities.Deposit, 0, 10)
   335  	source := &testBlockSource{bs, time.Now()}
   336  	for i := 0; i < 10; i++ {
   337  		source.getNextBlock(t, ctx)
   338  		depositProto := getTestDeposit(fmt.Sprintf("deadbeef%02d", i+1), testID, testID,
   339  			strconv.FormatInt(amount, 10), GenerateID(), vegaTime.UnixNano())
   340  		deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), vegaTime)
   341  		require.NoError(t, err, "Converting deposit proto to database entity")
   342  		err = ds.Upsert(ctx, deposit)
   343  		deposits = append(deposits, *deposit)
   344  		require.NoError(t, err)
   345  
   346  		vegaTime = vegaTime.Add(time.Second)
   347  		amount += 100
   348  	}
   349  
   350  	return deposits
   351  }
   352  
   353  func testDepositsPaginationNoPagination(t *testing.T) {
   354  	ctx := tempTransaction(t)
   355  
   356  	bs, ds, _ := setupDepositStoreTests(t)
   357  
   358  	testDeposits := addDeposits(ctx, t, bs, ds)
   359  
   360  	pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, false)
   361  	require.NoError(t, err)
   362  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   363  
   364  	require.NoError(t, err)
   365  	assert.Equal(t, testDeposits, got)
   366  	assert.Equal(t, entities.PageInfo{
   367  		HasNextPage:     false,
   368  		HasPreviousPage: false,
   369  		StartCursor:     testDeposits[0].Cursor().Encode(),
   370  		EndCursor:       testDeposits[9].Cursor().Encode(),
   371  	}, pageInfo)
   372  }
   373  
   374  func testDepositsPaginationFirst(t *testing.T) {
   375  	ctx := tempTransaction(t)
   376  
   377  	bs, ds, _ := setupDepositStoreTests(t)
   378  
   379  	testDeposits := addDeposits(ctx, t, bs, ds)
   380  
   381  	first := int32(3)
   382  	pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, false)
   383  	require.NoError(t, err)
   384  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   385  
   386  	require.NoError(t, err)
   387  	want := testDeposits[:3]
   388  	assert.Equal(t, want, got)
   389  	assert.Equal(t, entities.PageInfo{
   390  		HasNextPage:     true,
   391  		HasPreviousPage: false,
   392  		StartCursor:     testDeposits[0].Cursor().Encode(),
   393  		EndCursor:       testDeposits[2].Cursor().Encode(),
   394  	}, pageInfo)
   395  }
   396  
   397  func testDepositsPaginationLast(t *testing.T) {
   398  	ctx := tempTransaction(t)
   399  
   400  	bs, ds, _ := setupDepositStoreTests(t)
   401  
   402  	testDeposits := addDeposits(ctx, t, bs, ds)
   403  
   404  	last := int32(3)
   405  	pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, false)
   406  	require.NoError(t, err)
   407  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   408  
   409  	require.NoError(t, err)
   410  	want := testDeposits[7:]
   411  	assert.Equal(t, want, got)
   412  	assert.Equal(t, entities.PageInfo{
   413  		HasNextPage:     false,
   414  		HasPreviousPage: true,
   415  		StartCursor:     testDeposits[7].Cursor().Encode(),
   416  		EndCursor:       testDeposits[9].Cursor().Encode(),
   417  	}, pageInfo)
   418  }
   419  
   420  func testDepositsPaginationFirstAfter(t *testing.T) {
   421  	ctx := tempTransaction(t)
   422  
   423  	bs, ds, _ := setupDepositStoreTests(t)
   424  
   425  	testDeposits := addDeposits(ctx, t, bs, ds)
   426  
   427  	first := int32(3)
   428  	after := testDeposits[2].Cursor().Encode()
   429  	pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, false)
   430  	require.NoError(t, err)
   431  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   432  
   433  	require.NoError(t, err)
   434  	want := testDeposits[3:6]
   435  	assert.Equal(t, want, got)
   436  	assert.Equal(t, entities.PageInfo{
   437  		HasNextPage:     true,
   438  		HasPreviousPage: true,
   439  		StartCursor:     testDeposits[3].Cursor().Encode(),
   440  		EndCursor:       testDeposits[5].Cursor().Encode(),
   441  	}, pageInfo)
   442  }
   443  
   444  func testDepositsPaginationLastBefore(t *testing.T) {
   445  	ctx := tempTransaction(t)
   446  
   447  	bs, ds, _ := setupDepositStoreTests(t)
   448  
   449  	testDeposits := addDeposits(ctx, t, bs, ds)
   450  
   451  	last := int32(3)
   452  	before := testDeposits[7].Cursor().Encode()
   453  	pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, false)
   454  	require.NoError(t, err)
   455  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   456  
   457  	require.NoError(t, err)
   458  	want := testDeposits[4:7]
   459  	assert.Equal(t, want, got)
   460  	assert.Equal(t, entities.PageInfo{
   461  		HasNextPage:     true,
   462  		HasPreviousPage: true,
   463  		StartCursor:     testDeposits[4].Cursor().Encode(),
   464  		EndCursor:       testDeposits[6].Cursor().Encode(),
   465  	}, pageInfo)
   466  }
   467  
   468  func testDepositsPaginationNoPaginationNewestFirst(t *testing.T) {
   469  	ctx := tempTransaction(t)
   470  
   471  	bs, ds, _ := setupDepositStoreTests(t)
   472  
   473  	testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds))
   474  
   475  	pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true)
   476  	require.NoError(t, err)
   477  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   478  
   479  	require.NoError(t, err)
   480  	assert.Equal(t, testDeposits, got)
   481  	assert.Equal(t, entities.PageInfo{
   482  		HasNextPage:     false,
   483  		HasPreviousPage: false,
   484  		StartCursor:     testDeposits[0].Cursor().Encode(),
   485  		EndCursor:       testDeposits[9].Cursor().Encode(),
   486  	}, pageInfo)
   487  }
   488  
   489  func testDepositsPaginationFirstNewestFirst(t *testing.T) {
   490  	ctx := tempTransaction(t)
   491  
   492  	bs, ds, _ := setupDepositStoreTests(t)
   493  
   494  	testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds))
   495  
   496  	first := int32(3)
   497  	pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, true)
   498  	require.NoError(t, err)
   499  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   500  
   501  	require.NoError(t, err)
   502  	want := testDeposits[:3]
   503  	assert.Equal(t, want, got)
   504  	assert.Equal(t, entities.PageInfo{
   505  		HasNextPage:     true,
   506  		HasPreviousPage: false,
   507  		StartCursor:     testDeposits[0].Cursor().Encode(),
   508  		EndCursor:       testDeposits[2].Cursor().Encode(),
   509  	}, pageInfo)
   510  }
   511  
   512  func testDepositsPaginationLastNewestFirst(t *testing.T) {
   513  	ctx := tempTransaction(t)
   514  
   515  	bs, ds, _ := setupDepositStoreTests(t)
   516  
   517  	testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds))
   518  
   519  	last := int32(3)
   520  	pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, true)
   521  	require.NoError(t, err)
   522  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   523  
   524  	require.NoError(t, err)
   525  	want := testDeposits[7:]
   526  	assert.Equal(t, want, got)
   527  	assert.Equal(t, entities.PageInfo{
   528  		HasNextPage:     false,
   529  		HasPreviousPage: true,
   530  		StartCursor:     testDeposits[7].Cursor().Encode(),
   531  		EndCursor:       testDeposits[9].Cursor().Encode(),
   532  	}, pageInfo)
   533  }
   534  
   535  func testDepositsPaginationFirstAfterNewestFirst(t *testing.T) {
   536  	ctx := tempTransaction(t)
   537  
   538  	bs, ds, _ := setupDepositStoreTests(t)
   539  
   540  	testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds))
   541  
   542  	first := int32(3)
   543  	after := testDeposits[2].Cursor().Encode()
   544  	pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, true)
   545  	require.NoError(t, err)
   546  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   547  
   548  	require.NoError(t, err)
   549  	want := testDeposits[3:6]
   550  	assert.Equal(t, want, got)
   551  	assert.Equal(t, entities.PageInfo{
   552  		HasNextPage:     true,
   553  		HasPreviousPage: true,
   554  		StartCursor:     testDeposits[3].Cursor().Encode(),
   555  		EndCursor:       testDeposits[5].Cursor().Encode(),
   556  	}, pageInfo)
   557  }
   558  
   559  func testDepositsPaginationLastBeforeNewestFirst(t *testing.T) {
   560  	ctx := tempTransaction(t)
   561  
   562  	bs, ds, _ := setupDepositStoreTests(t)
   563  
   564  	testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds))
   565  
   566  	last := int32(3)
   567  	before := testDeposits[7].Cursor().Encode()
   568  	pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, true)
   569  	require.NoError(t, err)
   570  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{})
   571  
   572  	require.NoError(t, err)
   573  	want := testDeposits[4:7]
   574  	assert.Equal(t, want, got)
   575  	assert.Equal(t, entities.PageInfo{
   576  		HasNextPage:     true,
   577  		HasPreviousPage: true,
   578  		StartCursor:     testDeposits[4].Cursor().Encode(),
   579  		EndCursor:       testDeposits[6].Cursor().Encode(),
   580  	}, pageInfo)
   581  }
   582  
   583  func testDepositsPaginationBetweenDatesNoPagination(t *testing.T) {
   584  	ctx := tempTransaction(t)
   585  
   586  	bs, ds, _ := setupDepositStoreTests(t)
   587  
   588  	testDeposits := addDeposits(ctx, t, bs, ds)
   589  
   590  	pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, false)
   591  	require.NoError(t, err)
   592  
   593  	startDate := testDeposits[3].VegaTime
   594  	endDate := testDeposits[8].VegaTime
   595  
   596  	t.Run("Between start and end dates", func(t *testing.T) {
   597  		got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   598  			Start: &startDate,
   599  			End:   &endDate,
   600  		})
   601  
   602  		want := testDeposits[3:8]
   603  
   604  		require.NoError(t, err)
   605  		assert.Equal(t, want, got)
   606  		assert.Equal(t, entities.PageInfo{
   607  			HasNextPage:     false,
   608  			HasPreviousPage: false,
   609  			StartCursor:     testDeposits[3].Cursor().Encode(),
   610  			EndCursor:       testDeposits[7].Cursor().Encode(),
   611  		}, pageInfo)
   612  	})
   613  
   614  	t.Run("From start date only", func(t *testing.T) {
   615  		got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   616  			Start: &startDate,
   617  		})
   618  
   619  		want := testDeposits[3:]
   620  
   621  		require.NoError(t, err)
   622  		assert.Equal(t, want, got)
   623  		assert.Equal(t, entities.PageInfo{
   624  			HasNextPage:     false,
   625  			HasPreviousPage: false,
   626  			StartCursor:     testDeposits[3].Cursor().Encode(),
   627  			EndCursor:       testDeposits[9].Cursor().Encode(),
   628  		}, pageInfo)
   629  	})
   630  
   631  	t.Run("To end date only", func(t *testing.T) {
   632  		got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   633  			End: &endDate,
   634  		})
   635  
   636  		want := testDeposits[:8]
   637  
   638  		require.NoError(t, err)
   639  		assert.Equal(t, want, got)
   640  		assert.Equal(t, entities.PageInfo{
   641  			HasNextPage:     false,
   642  			HasPreviousPage: false,
   643  			StartCursor:     testDeposits[0].Cursor().Encode(),
   644  			EndCursor:       testDeposits[7].Cursor().Encode(),
   645  		}, pageInfo)
   646  	})
   647  }
   648  
   649  func testDepositsPaginationBetweenDatesFirst(t *testing.T) {
   650  	ctx := tempTransaction(t)
   651  
   652  	bs, ds, _ := setupDepositStoreTests(t)
   653  
   654  	testDeposits := addDeposits(ctx, t, bs, ds)
   655  
   656  	first := int32(3)
   657  	pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, false)
   658  	require.NoError(t, err)
   659  
   660  	startDate := testDeposits[2].VegaTime
   661  	endDate := testDeposits[8].VegaTime
   662  
   663  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   664  		Start: &startDate,
   665  		End:   &endDate,
   666  	})
   667  
   668  	require.NoError(t, err)
   669  	want := testDeposits[2:5]
   670  	assert.Equal(t, want, got)
   671  	assert.Equal(t, entities.PageInfo{
   672  		HasNextPage:     true,
   673  		HasPreviousPage: false,
   674  		StartCursor:     testDeposits[2].Cursor().Encode(),
   675  		EndCursor:       testDeposits[4].Cursor().Encode(),
   676  	}, pageInfo)
   677  }
   678  
   679  func testDepositsPaginationBetweenDatesLast(t *testing.T) {
   680  	ctx := tempTransaction(t)
   681  
   682  	bs, ds, _ := setupDepositStoreTests(t)
   683  
   684  	testDeposits := addDeposits(ctx, t, bs, ds)
   685  
   686  	last := int32(3)
   687  	pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, false)
   688  	require.NoError(t, err)
   689  
   690  	startDate := testDeposits[2].VegaTime
   691  	endDate := testDeposits[8].VegaTime
   692  
   693  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   694  		Start: &startDate,
   695  		End:   &endDate,
   696  	})
   697  
   698  	require.NoError(t, err)
   699  	want := testDeposits[5:8]
   700  	assert.Equal(t, want, got)
   701  	assert.Equal(t, entities.PageInfo{
   702  		HasNextPage:     false,
   703  		HasPreviousPage: true,
   704  		StartCursor:     testDeposits[5].Cursor().Encode(),
   705  		EndCursor:       testDeposits[7].Cursor().Encode(),
   706  	}, pageInfo)
   707  }
   708  
   709  func testDepositsPaginationBetweenDatesFirstAfter(t *testing.T) {
   710  	ctx := tempTransaction(t)
   711  
   712  	bs, ds, _ := setupDepositStoreTests(t)
   713  
   714  	testDeposits := addDeposits(ctx, t, bs, ds)
   715  
   716  	first := int32(3)
   717  	after := testDeposits[4].Cursor().Encode()
   718  	pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, false)
   719  	require.NoError(t, err)
   720  
   721  	startDate := testDeposits[2].VegaTime
   722  	endDate := testDeposits[8].VegaTime
   723  
   724  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   725  		Start: &startDate,
   726  		End:   &endDate,
   727  	})
   728  
   729  	require.NoError(t, err)
   730  	want := testDeposits[5:8]
   731  	assert.Equal(t, want, got)
   732  	assert.Equal(t, entities.PageInfo{
   733  		HasNextPage:     false,
   734  		HasPreviousPage: true,
   735  		StartCursor:     testDeposits[5].Cursor().Encode(),
   736  		EndCursor:       testDeposits[7].Cursor().Encode(),
   737  	}, pageInfo)
   738  }
   739  
   740  func testDepositsPaginationBetweenDatesLastBefore(t *testing.T) {
   741  	ctx := tempTransaction(t)
   742  
   743  	bs, ds, _ := setupDepositStoreTests(t)
   744  
   745  	testDeposits := addDeposits(ctx, t, bs, ds)
   746  
   747  	last := int32(3)
   748  	before := testDeposits[6].Cursor().Encode()
   749  	pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, false)
   750  	require.NoError(t, err)
   751  
   752  	startDate := testDeposits[2].VegaTime
   753  	endDate := testDeposits[8].VegaTime
   754  
   755  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   756  		Start: &startDate,
   757  		End:   &endDate,
   758  	})
   759  
   760  	require.NoError(t, err)
   761  	want := testDeposits[3:6]
   762  	assert.Equal(t, want, got)
   763  	assert.Equal(t, entities.PageInfo{
   764  		HasNextPage:     true,
   765  		HasPreviousPage: true,
   766  		StartCursor:     testDeposits[3].Cursor().Encode(),
   767  		EndCursor:       testDeposits[5].Cursor().Encode(),
   768  	}, pageInfo)
   769  }
   770  
   771  func testDepositsPaginationBetweenDatesNoPaginationNewestFirst(t *testing.T) {
   772  	ctx := tempTransaction(t)
   773  
   774  	bs, ds, _ := setupDepositStoreTests(t)
   775  
   776  	testDeposits := addDeposits(ctx, t, bs, ds)
   777  	startDate := testDeposits[2].VegaTime
   778  	endDate := testDeposits[8].VegaTime
   779  	want := entities.ReverseSlice(testDeposits[2:8])
   780  
   781  	pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true)
   782  	require.NoError(t, err)
   783  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   784  		Start: &startDate,
   785  		End:   &endDate,
   786  	})
   787  
   788  	require.NoError(t, err)
   789  	assert.Equal(t, want, got)
   790  	assert.Equal(t, entities.PageInfo{
   791  		HasNextPage:     false,
   792  		HasPreviousPage: false,
   793  		StartCursor:     want[0].Cursor().Encode(),
   794  		EndCursor:       want[5].Cursor().Encode(),
   795  	}, pageInfo)
   796  }
   797  
   798  func testDepositsPaginationBetweenDatesFirstNewestFirst(t *testing.T) {
   799  	ctx := tempTransaction(t)
   800  
   801  	bs, ds, _ := setupDepositStoreTests(t)
   802  
   803  	testDeposits := addDeposits(ctx, t, bs, ds)
   804  	startDate := testDeposits[2].VegaTime
   805  	endDate := testDeposits[8].VegaTime
   806  	want := entities.ReverseSlice(testDeposits[2:8])
   807  
   808  	first := int32(3)
   809  	pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, true)
   810  	require.NoError(t, err)
   811  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   812  		Start: &startDate,
   813  		End:   &endDate,
   814  	})
   815  
   816  	require.NoError(t, err)
   817  	want = want[:3]
   818  	assert.Equal(t, want, got)
   819  	assert.Equal(t, entities.PageInfo{
   820  		HasNextPage:     true,
   821  		HasPreviousPage: false,
   822  		StartCursor:     want[0].Cursor().Encode(),
   823  		EndCursor:       want[2].Cursor().Encode(),
   824  	}, pageInfo)
   825  }
   826  
   827  func testDepositsPaginationBetweenDatesLastNewestFirst(t *testing.T) {
   828  	ctx := tempTransaction(t)
   829  
   830  	bs, ds, _ := setupDepositStoreTests(t)
   831  
   832  	testDeposits := addDeposits(ctx, t, bs, ds)
   833  
   834  	last := int32(3)
   835  	pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, true)
   836  	require.NoError(t, err)
   837  
   838  	startDate := testDeposits[2].VegaTime
   839  	endDate := testDeposits[8].VegaTime
   840  
   841  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   842  		Start: &startDate,
   843  		End:   &endDate,
   844  	})
   845  	want := entities.ReverseSlice(testDeposits[2:8])
   846  
   847  	require.NoError(t, err)
   848  	want = want[3:]
   849  	assert.Equal(t, want, got)
   850  	assert.Equal(t, entities.PageInfo{
   851  		HasNextPage:     false,
   852  		HasPreviousPage: true,
   853  		StartCursor:     want[0].Cursor().Encode(),
   854  		EndCursor:       want[2].Cursor().Encode(),
   855  	}, pageInfo)
   856  }
   857  
   858  func testDepositsPaginationBetweenDatesFirstAfterNewestFirst(t *testing.T) {
   859  	ctx := tempTransaction(t)
   860  
   861  	bs, ds, _ := setupDepositStoreTests(t)
   862  
   863  	testDeposits := addDeposits(ctx, t, bs, ds)
   864  	want := entities.ReverseSlice(testDeposits[2:8])
   865  
   866  	first := int32(3)
   867  	after := want[1].Cursor().Encode()
   868  	pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, true)
   869  	require.NoError(t, err)
   870  
   871  	startDate := testDeposits[2].VegaTime
   872  	endDate := testDeposits[8].VegaTime
   873  
   874  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   875  		Start: &startDate,
   876  		End:   &endDate,
   877  	})
   878  
   879  	require.NoError(t, err)
   880  	want = want[2:5]
   881  	assert.Equal(t, want, got)
   882  	assert.Equal(t, entities.PageInfo{
   883  		HasNextPage:     true,
   884  		HasPreviousPage: true,
   885  		StartCursor:     want[0].Cursor().Encode(),
   886  		EndCursor:       want[2].Cursor().Encode(),
   887  	}, pageInfo)
   888  }
   889  
   890  func testDepositsPaginationBetweenDatesLastBeforeNewestFirst(t *testing.T) {
   891  	ctx := tempTransaction(t)
   892  
   893  	bs, ds, _ := setupDepositStoreTests(t)
   894  
   895  	testDeposits := addDeposits(ctx, t, bs, ds)
   896  	want := entities.ReverseSlice(testDeposits[2:8])
   897  
   898  	last := int32(3)
   899  	before := want[4].Cursor().Encode()
   900  	pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, true)
   901  	require.NoError(t, err)
   902  
   903  	startDate := testDeposits[2].VegaTime
   904  	endDate := testDeposits[8].VegaTime
   905  
   906  	got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{
   907  		Start: &startDate,
   908  		End:   &endDate,
   909  	})
   910  
   911  	require.NoError(t, err)
   912  	want = want[1:4]
   913  	assert.Equal(t, want, got)
   914  	assert.Equal(t, entities.PageInfo{
   915  		HasNextPage:     true,
   916  		HasPreviousPage: true,
   917  		StartCursor:     want[0].Cursor().Encode(),
   918  		EndCursor:       want[2].Cursor().Encode(),
   919  	}, pageInfo)
   920  }
   921  
   922  func TestDeposits_DepositStatusEnum(t *testing.T) {
   923  	var depositStatus vega.Deposit_Status
   924  
   925  	states := getEnums(t, depositStatus)
   926  	assert.Len(t, states, 5)
   927  	for e, state := range states {
   928  		t.Run(state, func(t *testing.T) {
   929  			ctx := tempTransaction(t)
   930  			bs, ds, _ := setupDepositStoreTests(t)
   931  			block := addTestBlock(t, ctx, bs)
   932  			amount := int64(1000)
   933  
   934  			depositProto := getTestDeposit(fmt.Sprintf("deadbeef%02d", e), testID, testID,
   935  				strconv.FormatInt(amount, 10), GenerateID(), block.VegaTime.UnixNano())
   936  			depositProto.Status = vega.Deposit_Status(e)
   937  
   938  			deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime)
   939  			require.NoError(t, err, "Converting deposit proto to database entity")
   940  			require.NoError(t, ds.Upsert(ctx, deposit))
   941  
   942  			got, err := ds.GetByID(ctx, depositProto.Id)
   943  			require.NoError(t, err)
   944  			assert.Equal(t, deposit.Status, got.Status)
   945  		})
   946  	}
   947  }