Skip to content

Commit c17c995

Browse files
committed
Test we can recover on-chain funds from seed-only
We add a test that makes sure a completely new node is able to recover any previously-confirmed on-chain funds from the seed only.
1 parent ae07195 commit c17c995

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

tests/integration_tests_rust.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ use ldk_node::{Builder, Event, NodeError};
2121
use lightning::ln::channelmanager::PaymentId;
2222
use lightning::util::persist::KVStore;
2323

24+
use bitcoincore_rpc::RpcApi;
25+
2426
use bitcoin::Amount;
2527

2628
use std::sync::Arc;
@@ -315,6 +317,98 @@ fn onchain_spend_receive() {
315317
assert!(node_b.list_balances().spendable_onchain_balance_sats < 100000);
316318
}
317319

320+
#[test]
321+
fn onchain_wallet_recovery() {
322+
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
323+
324+
let chain_source = TestChainSource::Esplora(&electrsd);
325+
326+
let seed_bytes = vec![42u8; 64];
327+
328+
let original_config = random_config(true);
329+
let original_node = setup_node(&chain_source, original_config, Some(seed_bytes.clone()));
330+
331+
let premine_amount_sat = 100_000;
332+
333+
let addr_1 = original_node.onchain_payment().new_address().unwrap();
334+
335+
premine_and_distribute_funds(
336+
&bitcoind.client,
337+
&electrsd.client,
338+
vec![addr_1],
339+
Amount::from_sat(premine_amount_sat),
340+
);
341+
original_node.sync_wallets().unwrap();
342+
assert_eq!(original_node.list_balances().spendable_onchain_balance_sats, premine_amount_sat);
343+
344+
let addr_2 = original_node.onchain_payment().new_address().unwrap();
345+
346+
let txid = bitcoind
347+
.client
348+
.send_to_address(
349+
&addr_2,
350+
Amount::from_sat(premine_amount_sat),
351+
None,
352+
None,
353+
None,
354+
None,
355+
None,
356+
None,
357+
)
358+
.unwrap();
359+
wait_for_tx(&electrsd.client, txid);
360+
361+
generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 1);
362+
363+
original_node.sync_wallets().unwrap();
364+
assert_eq!(
365+
original_node.list_balances().spendable_onchain_balance_sats,
366+
premine_amount_sat * 2
367+
);
368+
369+
original_node.stop().unwrap();
370+
drop(original_node);
371+
372+
// Now we start from scratch, only the seed remains the same.
373+
let recovered_config = random_config(true);
374+
let recovered_node = setup_node(&chain_source, recovered_config, Some(seed_bytes));
375+
376+
recovered_node.sync_wallets().unwrap();
377+
assert_eq!(
378+
recovered_node.list_balances().spendable_onchain_balance_sats,
379+
premine_amount_sat * 2
380+
);
381+
382+
// Check we sync even when skipping some addresses.
383+
let _addr_3 = recovered_node.onchain_payment().new_address().unwrap();
384+
let _addr_4 = recovered_node.onchain_payment().new_address().unwrap();
385+
let _addr_5 = recovered_node.onchain_payment().new_address().unwrap();
386+
let addr_6 = recovered_node.onchain_payment().new_address().unwrap();
387+
388+
let txid = bitcoind
389+
.client
390+
.send_to_address(
391+
&addr_6,
392+
Amount::from_sat(premine_amount_sat),
393+
None,
394+
None,
395+
None,
396+
None,
397+
None,
398+
None,
399+
)
400+
.unwrap();
401+
wait_for_tx(&electrsd.client, txid);
402+
403+
generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 1);
404+
405+
recovered_node.sync_wallets().unwrap();
406+
assert_eq!(
407+
recovered_node.list_balances().spendable_onchain_balance_sats,
408+
premine_amount_sat * 3
409+
);
410+
}
411+
318412
#[test]
319413
fn sign_verify_msg() {
320414
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();

0 commit comments

Comments
 (0)