diff --git a/cmd/stellar-rpc/internal/methods/get_transaction_test.go b/cmd/stellar-rpc/internal/methods/get_transaction_test.go index f88ebbd6..7bec688a 100644 --- a/cmd/stellar-rpc/internal/methods/get_transaction_test.go +++ b/cmd/stellar-rpc/internal/methods/get_transaction_test.go @@ -337,6 +337,45 @@ func txMetaWithEvents(acctSeq uint32, successful bool) xdr.LedgerCloseMeta { return meta } +func emptyTxMeta(acctSeq uint32) xdr.LedgerCloseMeta { + txProcessing := []xdr.TransactionResultMeta{} + components := []xdr.TxSetComponent{ + { + Type: xdr.TxSetComponentTypeTxsetCompTxsMaybeDiscountedFee, + TxsMaybeDiscountedFee: &xdr.TxSetComponentTxsMaybeDiscountedFee{ + BaseFee: nil, + Txs: []xdr.TransactionEnvelope{}, + }, + }, + } + return xdr.LedgerCloseMeta{ + V: 1, + V1: &xdr.LedgerCloseMetaV1{ + LedgerHeader: xdr.LedgerHeaderHistoryEntry{ + Header: xdr.LedgerHeader{ + ScpValue: xdr.StellarValue{ + CloseTime: xdr.TimePoint(ledgerCloseTime(acctSeq + 100)), + }, + LedgerSeq: xdr.Uint32(acctSeq + 100), + }, + }, + TxProcessing: txProcessing, + TxSet: xdr.GeneralizedTransactionSet{ + V: 1, + V1TxSet: &xdr.TransactionSetV1{ + PreviousLedgerHash: xdr.Hash{1}, + Phases: []xdr.TransactionPhase{ + { + V: 0, + V0Components: &components, + }, + }, + }, + }, + }, + } +} + func TestGetTransaction_JSONFormat(t *testing.T) { mockDBReader := db.NewMockTransactionStore(NetworkPassphrase) mockLedgerReader := db.NewMockLedgerReader(mockDBReader) diff --git a/cmd/stellar-rpc/internal/methods/get_transactions.go b/cmd/stellar-rpc/internal/methods/get_transactions.go index bb8c2bf4..4436c203 100644 --- a/cmd/stellar-rpc/internal/methods/get_transactions.go +++ b/cmd/stellar-rpc/internal/methods/get_transactions.go @@ -216,7 +216,7 @@ func (h transactionsRPCHandler) getTransactionsByLedgerSequence(ctx context.Cont // Iterate through each ledger and its transactions until limit or end range is reached. // The latest ledger acts as the end ledger range for the request. - var txns []protocol.TransactionInfo + txns := make([]protocol.TransactionInfo, 0, limit) var done bool cursor := toid.New(0, 0, 0) for ledgerSeq := start.LedgerSequence; ledgerSeq <= int32(ledgerRange.LastLedger.Sequence); ledgerSeq++ { diff --git a/cmd/stellar-rpc/internal/methods/get_transactions_test.go b/cmd/stellar-rpc/internal/methods/get_transactions_test.go index 839daaee..accf3e8e 100644 --- a/cmd/stellar-rpc/internal/methods/get_transactions_test.go +++ b/cmd/stellar-rpc/internal/methods/get_transactions_test.go @@ -38,40 +38,6 @@ var expectedTransactionInfo = protocol.TransactionInfo{ LedgerCloseTime: 125, } -// createTestLedger Creates a test ledger with 2 transactions -func createTestLedger(sequence uint32) xdr.LedgerCloseMeta { - sequence -= 100 - meta := txMeta(sequence, true) - meta.V1.TxProcessing = append(meta.V1.TxProcessing, xdr.TransactionResultMeta{ - TxApplyProcessing: xdr.TransactionMeta{ - V: 3, - Operations: &[]xdr.OperationMeta{}, - V3: &xdr.TransactionMetaV3{}, - }, - Result: xdr.TransactionResultPair{ - TransactionHash: txHash(sequence), - Result: transactionResult(false), - }, - }) - return meta -} - -func setupDB(t *testing.T, numLedgers int, skipLedger int) *db.DB { - testDB := NewTestDB(t) - daemon := interfaces.MakeNoOpDeamon() - for sequence := 1; sequence <= numLedgers; sequence++ { - if sequence == skipLedger { - continue - } - ledgerCloseMeta := createTestLedger(uint32(sequence)) - tx, err := db.NewReadWriter(log.DefaultLogger, testDB, daemon, 150, 100, passphrase).NewTx(context.Background()) - require.NoError(t, err) - require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) - require.NoError(t, tx.Commit(ledgerCloseMeta)) - } - return testDB -} - func TestGetTransactions_DefaultLimit(t *testing.T) { //nolint:dupl testDB := setupDB(t, 10, 0) handler := transactionsRPCHandler{ @@ -293,3 +259,76 @@ func TestGetTransactions_JSONFormat(t *testing.T) { require.Nilf(t, tx["resultMetaXdr"], "field: 'resultMetaXdr'") require.NotNilf(t, tx["resultMetaJson"], "field: 'resultMetaJson'") } + +func TestGetTransactions_NoResults(t *testing.T) { + testDB := setupDBNoTxs(t, 5) + handler := transactionsRPCHandler{ + ledgerReader: db.NewLedgerReader(testDB), + maxLimit: 100, + defaultLimit: 10, + networkPassphrase: NetworkPassphrase, + } + + request := protocol.GetTransactionsRequest{ + StartLedger: 1, + } + + txns, err := handler.getTransactionsByLedgerSequence(context.TODO(), request) + require.NoError(t, err) + require.NotNil(t, txns.Transactions) + require.Empty(t, txns.Transactions) +} + +// createTestLedger Creates a test ledger with 2 transactions +func createTestLedger(sequence uint32) xdr.LedgerCloseMeta { + sequence -= 100 + meta := txMeta(sequence, true) + meta.V1.TxProcessing = append(meta.V1.TxProcessing, xdr.TransactionResultMeta{ + TxApplyProcessing: xdr.TransactionMeta{ + V: 3, + Operations: &[]xdr.OperationMeta{}, + V3: &xdr.TransactionMetaV3{}, + }, + Result: xdr.TransactionResultPair{ + TransactionHash: txHash(sequence), + Result: transactionResult(false), + }, + }) + return meta +} + +// createTestLedger Creates a test ledger with 2 transactions +func createEmptyTestLedger(sequence uint32) xdr.LedgerCloseMeta { + sequence -= 100 + return emptyTxMeta(sequence) +} + +func setupDB(t *testing.T, numLedgers int, skipLedger int) *db.DB { + testDB := NewTestDB(t) + daemon := interfaces.MakeNoOpDeamon() + for sequence := 1; sequence <= numLedgers; sequence++ { + if sequence == skipLedger { + continue + } + ledgerCloseMeta := createTestLedger(uint32(sequence)) + tx, err := db.NewReadWriter(log.DefaultLogger, testDB, daemon, 150, 100, passphrase).NewTx(context.Background()) + require.NoError(t, err) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) + } + return testDB +} + +func setupDBNoTxs(t *testing.T, numLedgers int) *db.DB { + testDB := NewTestDB(t) + daemon := interfaces.MakeNoOpDeamon() + for sequence := 1; sequence <= numLedgers; sequence++ { + ledgerCloseMeta := createEmptyTestLedger(uint32(sequence)) + + tx, err := db.NewReadWriter(log.DefaultLogger, testDB, daemon, 150, 100, passphrase).NewTx(context.Background()) + require.NoError(t, err) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) + } + return testDB +}