Skip to content

Commit 9f02ec0

Browse files
committed
Use BDK events in update_payment_store instead of scanning all transactions
Replace the full transaction list scan in `update_payment_store` with handling of BDK's `WalletEvent` stream during sync. This leverages the new events in BDK 2.2, reduces redundant work, and prepares the foundation for reliable RBF/CPFP tracking via `WalletEvent::TxReplaced`
1 parent 17f80ba commit 9f02ec0

File tree

2 files changed

+237
-55
lines changed

2 files changed

+237
-55
lines changed

src/builder.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,14 @@ use crate::gossip::GossipSource;
5555
use crate::io::sqlite_store::SqliteStore;
5656
use crate::io::utils::{
5757
read_event_queue, read_external_pathfinding_scores_from_cache, read_network_graph,
58-
read_node_metrics, read_output_sweeper, read_payments, read_peer_info, read_scorer,
59-
write_node_metrics,
58+
read_node_metrics, read_output_sweeper, read_payments, read_peer_info, read_pending_payments,
59+
read_scorer, write_node_metrics,
6060
};
6161
use crate::io::vss_store::VssStoreBuilder;
6262
use crate::io::{
6363
self, PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE, PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE,
64+
PENDING_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE,
65+
PENDING_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE,
6466
};
6567
use crate::liquidity::{
6668
LSPS1ClientConfig, LSPS2ClientConfig, LSPS2ServiceConfig, LiquiditySourceBuilder,
@@ -73,8 +75,8 @@ use crate::runtime::{Runtime, RuntimeSpawner};
7375
use crate::tx_broadcaster::TransactionBroadcaster;
7476
use crate::types::{
7577
AsyncPersister, ChainMonitor, ChannelManager, DynStore, DynStoreWrapper, GossipSync, Graph,
76-
KeysManager, MessageRouter, OnionMessenger, PaymentStore, PeerManager, Persister,
77-
SyncAndAsyncKVStore,
78+
KeysManager, MessageRouter, OnionMessenger, PaymentStore, PeerManager, PendingPaymentStore,
79+
Persister, SyncAndAsyncKVStore,
7880
};
7981
use crate::wallet::persist::KVStoreWalletPersister;
8082
use crate::wallet::Wallet;
@@ -1057,12 +1059,14 @@ fn build_with_store_internal(
10571059

10581060
let kv_store_ref = Arc::clone(&kv_store);
10591061
let logger_ref = Arc::clone(&logger);
1060-
let (payment_store_res, node_metris_res) = runtime.block_on(async move {
1061-
tokio::join!(
1062-
read_payments(&*kv_store_ref, Arc::clone(&logger_ref)),
1063-
read_node_metrics(&*kv_store_ref, Arc::clone(&logger_ref)),
1064-
)
1065-
});
1062+
let (payment_store_res, node_metris_res, pending_payment_store_res) =
1063+
runtime.block_on(async move {
1064+
tokio::join!(
1065+
read_payments(&*kv_store_ref, Arc::clone(&logger_ref)),
1066+
read_node_metrics(&*kv_store_ref, Arc::clone(&logger_ref)),
1067+
read_pending_payments(&*kv_store_ref, Arc::clone(&logger_ref))
1068+
)
1069+
});
10661070

10671071
// Initialize the status fields.
10681072
let node_metrics = match node_metris_res {
@@ -1243,6 +1247,20 @@ fn build_with_store_internal(
12431247
},
12441248
};
12451249

1250+
let pending_payment_store = match pending_payment_store_res {
1251+
Ok(pending_payments) => Arc::new(PendingPaymentStore::new(
1252+
pending_payments,
1253+
PENDING_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE.to_string(),
1254+
PENDING_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE.to_string(),
1255+
Arc::clone(&kv_store),
1256+
Arc::clone(&logger),
1257+
)),
1258+
Err(e) => {
1259+
log_error!(logger, "Failed to read pending payment data from store: {}", e);
1260+
return Err(BuildError::ReadFailed);
1261+
},
1262+
};
1263+
12461264
let wallet = Arc::new(Wallet::new(
12471265
bdk_wallet,
12481266
wallet_persister,
@@ -1251,6 +1269,7 @@ fn build_with_store_internal(
12511269
Arc::clone(&payment_store),
12521270
Arc::clone(&config),
12531271
Arc::clone(&logger),
1272+
Arc::clone(&pending_payment_store),
12541273
));
12551274

12561275
// Initialize the KeysManager

0 commit comments

Comments
 (0)