diff --git a/crates/electrum/src/electrum_ext.rs b/crates/electrum/src/electrum_ext.rs index 5501b1495..3ff467fce 100644 --- a/crates/electrum/src/electrum_ext.rs +++ b/crates/electrum/src/electrum_ext.rs @@ -40,15 +40,11 @@ impl RelevantTxids { pub fn into_tx_graph( self, client: &Client, - seen_at: Option, missing: Vec, ) -> Result, Error> { let new_txs = client.batch_transaction_get(&missing)?; let mut graph = TxGraph::::new(new_txs); for (txid, anchors) in self.0 { - if let Some(seen_at) = seen_at { - let _ = graph.insert_seen_at(txid, seen_at); - } for anchor in anchors { let _ = graph.insert_anchor(txid, anchor); } @@ -67,10 +63,9 @@ impl RelevantTxids { pub fn into_confirmation_time_tx_graph( self, client: &Client, - seen_at: Option, missing: Vec, ) -> Result, Error> { - let graph = self.into_tx_graph(client, seen_at, missing)?; + let graph = self.into_tx_graph(client, missing)?; let relevant_heights = { let mut visited_heights = HashSet::new(); diff --git a/crates/electrum/tests/test_electrum.rs b/crates/electrum/tests/test_electrum.rs index 0dc80ac61..e6c93651d 100644 --- a/crates/electrum/tests/test_electrum.rs +++ b/crates/electrum/tests/test_electrum.rs @@ -68,7 +68,7 @@ fn scan_detects_confirmed_tx() -> Result<()> { } = client.sync(recv_chain.tip(), [spk_to_track], None, None, 5)?; let missing = relevant_txids.missing_full_txs(recv_graph.graph()); - let graph_update = relevant_txids.into_confirmation_time_tx_graph(&client, None, missing)?; + let graph_update = relevant_txids.into_confirmation_time_tx_graph(&client, missing)?; let _ = recv_chain .apply_update(chain_update) .map_err(|err| anyhow::anyhow!("LocalChain update error: {:?}", err))?; @@ -134,7 +134,7 @@ fn tx_can_become_unconfirmed_after_reorg() -> Result<()> { } = client.sync(recv_chain.tip(), [spk_to_track.clone()], None, None, 5)?; let missing = relevant_txids.missing_full_txs(recv_graph.graph()); - let graph_update = relevant_txids.into_confirmation_time_tx_graph(&client, None, missing)?; + let graph_update = relevant_txids.into_confirmation_time_tx_graph(&client, missing)?; let _ = recv_chain .apply_update(chain_update) .map_err(|err| anyhow::anyhow!("LocalChain update error: {:?}", err))?; @@ -164,8 +164,7 @@ fn tx_can_become_unconfirmed_after_reorg() -> Result<()> { } = client.sync(recv_chain.tip(), [spk_to_track.clone()], None, None, 5)?; let missing = relevant_txids.missing_full_txs(recv_graph.graph()); - let graph_update = - relevant_txids.into_confirmation_time_tx_graph(&client, None, missing)?; + let graph_update = relevant_txids.into_confirmation_time_tx_graph(&client, missing)?; let _ = recv_chain .apply_update(chain_update) .map_err(|err| anyhow::anyhow!("LocalChain update error: {:?}", err))?; diff --git a/example-crates/example_electrum/src/main.rs b/example-crates/example_electrum/src/main.rs index df34795bd..f651b85e2 100644 --- a/example-crates/example_electrum/src/main.rs +++ b/example-crates/example_electrum/src/main.rs @@ -299,12 +299,12 @@ fn main() -> anyhow::Result<()> { relevant_txids.missing_full_txs(graph.graph()) }; + let mut graph_update = relevant_txids.into_tx_graph(&client, missing_txids)?; let now = std::time::UNIX_EPOCH .elapsed() .expect("must get time") .as_secs(); - - let graph_update = relevant_txids.into_tx_graph(&client, Some(now), missing_txids)?; + let _ = graph_update.update_last_seen_unconfirmed(now); let db_changeset = { let mut chain = chain.lock().unwrap(); diff --git a/example-crates/example_esplora/src/main.rs b/example-crates/example_esplora/src/main.rs index e92205706..1d11cc68f 100644 --- a/example-crates/example_esplora/src/main.rs +++ b/example-crates/example_esplora/src/main.rs @@ -189,10 +189,14 @@ fn main() -> anyhow::Result<()> { // is reached. It returns a `TxGraph` update (`graph_update`) and a structure that // represents the last active spk derivation indices of keychains // (`keychain_indices_update`). - let (graph_update, last_active_indices) = client + let (mut graph_update, last_active_indices) = client .full_scan(keychain_spks, *stop_gap, scan_options.parallel_requests) .context("scanning for transactions")?; + // We want to keep track of the latest time a transaction was seen unconfirmed. + let now = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs(); + let _ = graph_update.update_last_seen_unconfirmed(now); + let mut graph = graph.lock().expect("mutex must not be poisoned"); // Because we did a stop gap based scan we are likely to have some updates to our // deriviation indices. Usually before a scan you are on a fresh wallet with no @@ -307,9 +311,13 @@ fn main() -> anyhow::Result<()> { } } - let graph_update = + let mut graph_update = client.sync(spks, txids, outpoints, scan_options.parallel_requests)?; + // Update last seen unconfirmed + let now = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs(); + let _ = graph_update.update_last_seen_unconfirmed(now); + graph.lock().unwrap().apply_update(graph_update) } }; diff --git a/example-crates/wallet_electrum/src/main.rs b/example-crates/wallet_electrum/src/main.rs index 4f8aba9fd..e53e19d4f 100644 --- a/example-crates/wallet_electrum/src/main.rs +++ b/example-crates/wallet_electrum/src/main.rs @@ -66,7 +66,9 @@ fn main() -> Result<(), anyhow::Error> { println!(); let missing = relevant_txids.missing_full_txs(wallet.as_ref()); - let graph_update = relevant_txids.into_confirmation_time_tx_graph(&client, None, missing)?; + let mut graph_update = relevant_txids.into_confirmation_time_tx_graph(&client, missing)?; + let now = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs(); + let _ = graph_update.update_last_seen_unconfirmed(now); let wallet_update = Update { last_active_indices: keychain_update, diff --git a/example-crates/wallet_esplora_async/src/main.rs b/example-crates/wallet_esplora_async/src/main.rs index 690cd87e2..02dde7e5b 100644 --- a/example-crates/wallet_esplora_async/src/main.rs +++ b/example-crates/wallet_esplora_async/src/main.rs @@ -53,9 +53,12 @@ async fn main() -> Result<(), anyhow::Error> { (k, k_spks) }) .collect(); - let (update_graph, last_active_indices) = client + let (mut update_graph, last_active_indices) = client .full_scan(keychain_spks, STOP_GAP, PARALLEL_REQUESTS) .await?; + + let now = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs(); + let _ = update_graph.update_last_seen_unconfirmed(now); let missing_heights = update_graph.missing_heights(wallet.local_chain()); let chain_update = client.update_local_chain(prev_tip, missing_heights).await?; let update = Update { diff --git a/example-crates/wallet_esplora_blocking/src/main.rs b/example-crates/wallet_esplora_blocking/src/main.rs index 73bfdd559..653f768b9 100644 --- a/example-crates/wallet_esplora_blocking/src/main.rs +++ b/example-crates/wallet_esplora_blocking/src/main.rs @@ -53,8 +53,11 @@ fn main() -> Result<(), anyhow::Error> { }) .collect(); - let (update_graph, last_active_indices) = + let (mut update_graph, last_active_indices) = client.full_scan(keychain_spks, STOP_GAP, PARALLEL_REQUESTS)?; + + let now = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs(); + let _ = update_graph.update_last_seen_unconfirmed(now); let missing_heights = update_graph.missing_heights(wallet.local_chain()); let chain_update = client.update_local_chain(prev_tip, missing_heights)?; let update = Update {