mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-17 22:14:26 +01:00
Improve performance of on chain transaction listing for big wallets
This commit is contained in:
@@ -27,7 +27,6 @@ public class StoreRecentTransactions : ViewComponent
|
||||
private readonly BTCPayWalletProvider _walletProvider;
|
||||
|
||||
public BTCPayNetworkProvider NetworkProvider { get; }
|
||||
public NBXplorerConnectionFactory ConnectionFactory { get; }
|
||||
|
||||
public StoreRecentTransactions(
|
||||
StoreRepository storeRepo,
|
||||
@@ -38,7 +37,6 @@ public class StoreRecentTransactions : ViewComponent
|
||||
{
|
||||
_storeRepo = storeRepo;
|
||||
NetworkProvider = networkProvider;
|
||||
ConnectionFactory = connectionFactory;
|
||||
_walletProvider = walletProvider;
|
||||
_dbContextFactory = dbContextFactory;
|
||||
CryptoCode = networkProvider.DefaultNetwork.CryptoCode;
|
||||
@@ -52,57 +50,20 @@ public class StoreRecentTransactions : ViewComponent
|
||||
var transactions = new List<StoreRecentTransactionViewModel>();
|
||||
if (derivationSettings?.AccountDerivation is not null)
|
||||
{
|
||||
if (ConnectionFactory.Available)
|
||||
{
|
||||
var wallet_id = derivationSettings.GetNBXWalletId();
|
||||
await using var conn = await ConnectionFactory.OpenConnection();
|
||||
var rows = await conn.QueryAsync(
|
||||
"SELECT t.tx_id, t.seen_at, to_btc(balance_change::NUMERIC) balance_change, (t.blk_id IS NOT NULL) confirmed " +
|
||||
"FROM get_wallets_recent(@wallet_id, @code, @interval, 5, 0) " +
|
||||
"JOIN txs t USING (code, tx_id) " +
|
||||
"ORDER BY seen_at DESC;",
|
||||
new
|
||||
{
|
||||
wallet_id,
|
||||
code = CryptoCode,
|
||||
interval = TimeSpan.FromDays(31)
|
||||
});
|
||||
var network = derivationSettings.Network;
|
||||
foreach (var r in rows)
|
||||
var network = derivationSettings.Network;
|
||||
var wallet = _walletProvider.GetWallet(network);
|
||||
var allTransactions = await wallet.FetchTransactionHistory(derivationSettings.AccountDerivation, 0, 5, TimeSpan.FromDays(31.0));
|
||||
transactions = allTransactions
|
||||
.Select(tx => new StoreRecentTransactionViewModel
|
||||
{
|
||||
var seenAt = new DateTimeOffset(((DateTime)r.seen_at));
|
||||
var balanceChange = new Money((decimal)r.balance_change, MoneyUnit.BTC);
|
||||
transactions.Add(new StoreRecentTransactionViewModel()
|
||||
{
|
||||
Timestamp = seenAt,
|
||||
Id = r.tx_id,
|
||||
Balance = balanceChange.ShowMoney(network),
|
||||
IsConfirmed = r.confirmed,
|
||||
Link = string.Format(CultureInfo.InvariantCulture, network.BlockExplorerLink, r.tx_id),
|
||||
Positive = balanceChange.GetValue(network) >= 0,
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var network = derivationSettings.Network;
|
||||
var wallet = _walletProvider.GetWallet(network);
|
||||
var allTransactions = await wallet.FetchTransactions(derivationSettings.AccountDerivation);
|
||||
transactions = allTransactions.UnconfirmedTransactions.Transactions
|
||||
.Concat(allTransactions.ConfirmedTransactions.Transactions).ToArray()
|
||||
.OrderByDescending(t => t.Timestamp)
|
||||
.Take(5)
|
||||
.Select(tx => new StoreRecentTransactionViewModel
|
||||
{
|
||||
Id = tx.TransactionId.ToString(),
|
||||
Positive = tx.BalanceChange.GetValue(network) >= 0,
|
||||
Balance = tx.BalanceChange.ShowMoney(network),
|
||||
IsConfirmed = tx.Confirmations != 0,
|
||||
Link = string.Format(CultureInfo.InvariantCulture, network.BlockExplorerLink, tx.TransactionId.ToString()),
|
||||
Timestamp = tx.Timestamp
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
Id = tx.TransactionId.ToString(),
|
||||
Positive = tx.BalanceChange.GetValue(network) >= 0,
|
||||
Balance = tx.BalanceChange.ShowMoney(network),
|
||||
IsConfirmed = tx.Confirmations != 0,
|
||||
Link = string.Format(CultureInfo.InvariantCulture, network.BlockExplorerLink, tx.TransactionId.ToString()),
|
||||
Timestamp = tx.SeenAt
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user