From cd1df4ac3436be86a6f2ad2b59139bbd45c7def8 Mon Sep 17 00:00:00 2001 From: Abdullahi Yunus Date: Sun, 11 Aug 2024 16:24:45 +0100 Subject: [PATCH] multi: modify listtxn definition This commit modifies listtransactiondetails method definition to take in additional params: index_offset and maxTxn --- lnrpc/walletrpc/walletkit_server.go | 2 +- lntest/mock/walletcontroller.go | 2 +- lnwallet/btcwallet/btcwallet.go | 20 ++++++++++++++++++-- lnwallet/interface.go | 3 ++- lnwallet/mock.go | 2 +- lnwallet/test/test_interface.go | 16 +++++++++++----- rpcserver.go | 3 ++- 7 files changed, 36 insertions(+), 12 deletions(-) diff --git a/lnrpc/walletrpc/walletkit_server.go b/lnrpc/walletrpc/walletkit_server.go index b15012f0c..d6e23e666 100644 --- a/lnrpc/walletrpc/walletkit_server.go +++ b/lnrpc/walletrpc/walletkit_server.go @@ -1378,7 +1378,7 @@ func (w *WalletKit) ListSweeps(ctx context.Context, // the default wallet account. transactions, err := w.cfg.Wallet.ListTransactionDetails( in.StartHeight, btcwallet.UnconfirmedHeight, - lnwallet.DefaultAccountName, + lnwallet.DefaultAccountName, 0, 0, ) if err != nil { return nil, err diff --git a/lntest/mock/walletcontroller.go b/lntest/mock/walletcontroller.go index fd4a43348..e6fbcd45b 100644 --- a/lntest/mock/walletcontroller.go +++ b/lntest/mock/walletcontroller.go @@ -187,7 +187,7 @@ func (w *WalletController) ListUnspentWitness(int32, int32, // ListTransactionDetails currently returns dummy values. func (w *WalletController) ListTransactionDetails(int32, int32, - string) ([]*lnwallet.TransactionDetail, error) { + string, uint32, uint32) ([]*lnwallet.TransactionDetail, error) { return nil, nil } diff --git a/lnwallet/btcwallet/btcwallet.go b/lnwallet/btcwallet/btcwallet.go index d0444edd5..94007ddd9 100644 --- a/lnwallet/btcwallet/btcwallet.go +++ b/lnwallet/btcwallet/btcwallet.go @@ -1554,7 +1554,8 @@ func unminedTransactionsToDetail( // // This is a part of the WalletController interface. func (b *BtcWallet) ListTransactionDetails(startHeight, endHeight int32, - accountFilter string) ([]*lnwallet.TransactionDetail, error) { + accountFilter string, indexOffset uint32, + maxTransactons uint32) ([]*lnwallet.TransactionDetail, error) { // Grab the best block the wallet knows of, we'll use this to calculate // # of confirmations shortly below. @@ -1594,7 +1595,22 @@ func (b *BtcWallet) ListTransactionDetails(startHeight, endHeight int32, txDetails = append(txDetails, detail) } - return txDetails, nil + // Return empty transaction list, if offset is more than all + // transactions. + if int(indexOffset) >= len(txDetails) { + return []*lnwallet.TransactionDetail{}, nil + } + + if maxTransactons == 0 { + return txDetails[indexOffset:], nil + } + + end := indexOffset + maxTransactons + if int(end) > len(txDetails) { + end = uint32(len(txDetails)) + } + + return txDetails[indexOffset:end], nil } // txSubscriptionClient encapsulates the transaction notification client from diff --git a/lnwallet/interface.go b/lnwallet/interface.go index e2e491c73..d25556a79 100644 --- a/lnwallet/interface.go +++ b/lnwallet/interface.go @@ -402,7 +402,8 @@ type WalletController interface { // retrieve the transactions relevant to a specific account. When // empty, transactions of all wallet accounts are returned. ListTransactionDetails(startHeight, endHeight int32, - accountFilter string) ([]*TransactionDetail, error) + accountFilter string, indexOffset uint32, + maxTransactions uint32) ([]*TransactionDetail, error) // LeaseOutput locks an output to the given ID, preventing it from being // available for any future coin selection attempts. The absolute time diff --git a/lnwallet/mock.go b/lnwallet/mock.go index 6623d8014..f97f9b974 100644 --- a/lnwallet/mock.go +++ b/lnwallet/mock.go @@ -198,7 +198,7 @@ func (w *mockWalletController) ListUnspentWitness(int32, int32, // ListTransactionDetails currently returns dummy values. func (w *mockWalletController) ListTransactionDetails(int32, int32, - string) ([]*TransactionDetail, error) { + string, uint32, uint32) ([]*TransactionDetail, error) { return nil, nil } diff --git a/lnwallet/test/test_interface.go b/lnwallet/test/test_interface.go index 9910caefe..0d06de17c 100644 --- a/lnwallet/test/test_interface.go +++ b/lnwallet/test/test_interface.go @@ -199,7 +199,9 @@ func assertTxInWallet(t *testing.T, w *lnwallet.LightningWallet, // We'll fetch all of our transaction and go through each one until // finding the expected transaction with its expected confirmation // status. - txs, err := w.ListTransactionDetails(0, btcwallet.UnconfirmedHeight, "") + txs, err := w.ListTransactionDetails( + 0, btcwallet.UnconfirmedHeight, "", 0, 1000, + ) require.NoError(t, err, "unable to retrieve transactions") for _, tx := range txs { if tx.Hash != txHash { @@ -1102,7 +1104,7 @@ func testListTransactionDetails(miner *rpctest.Harness, err = waitForWalletSync(miner, alice) require.NoError(t, err, "Couldn't sync Alice's wallet") txDetails, err := alice.ListTransactionDetails( - startHeight, chainTip, "", + startHeight, chainTip, "", 0, 1000, ) require.NoError(t, err, "unable to fetch tx details") @@ -1214,7 +1216,7 @@ func testListTransactionDetails(miner *rpctest.Harness, // with a confirmation height of 0, indicating that it has not been // mined yet. txDetails, err = alice.ListTransactionDetails( - chainTip, btcwallet.UnconfirmedHeight, "", + chainTip, btcwallet.UnconfirmedHeight, "", 0, 1000, ) require.NoError(t, err, "unable to fetch tx details") var mempoolTxFound bool @@ -1266,7 +1268,9 @@ func testListTransactionDetails(miner *rpctest.Harness, // transactions from the last block. err = waitForWalletSync(miner, alice) require.NoError(t, err, "Couldn't sync Alice's wallet") - txDetails, err = alice.ListTransactionDetails(chainTip, chainTip, "") + txDetails, err = alice.ListTransactionDetails( + chainTip, chainTip, "", 0, 1000, + ) require.NoError(t, err, "unable to fetch tx details") var burnTxFound bool for _, txDetail := range txDetails { @@ -1307,7 +1311,9 @@ func testListTransactionDetails(miner *rpctest.Harness, // Query for transactions only in the latest block. We do not expect // any transactions to be returned. - txDetails, err = alice.ListTransactionDetails(chainTip, chainTip, "") + txDetails, err = alice.ListTransactionDetails( + chainTip, chainTip, "", 0, 1000, + ) require.NoError(t, err, "unexpected error") if len(txDetails) != 0 { t.Fatalf("expected 0 transactions, got: %v", len(txDetails)) diff --git a/rpcserver.go b/rpcserver.go index efb6cf54f..cebbdd7c4 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -6477,7 +6477,8 @@ func (r *rpcServer) GetTransactions(ctx context.Context, } transactions, err := r.server.cc.Wallet.ListTransactionDetails( - req.StartHeight, endHeight, req.Account, + req.StartHeight, endHeight, req.Account, req.IndexOffset, + req.MaxTransactions, ) if err != nil { return nil, err