@@ -21,6 +21,8 @@ use ldk_node::{Builder, Event, NodeError};
2121use lightning:: ln:: channelmanager:: PaymentId ;
2222use lightning:: util:: persist:: KVStore ;
2323
24+ use bitcoincore_rpc:: RpcApi ;
25+
2426use bitcoin:: Amount ;
2527
2628use std:: sync:: Arc ;
@@ -315,12 +317,104 @@ 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]
319413fn sign_verify_msg ( ) {
320414 let ( _bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
321415 let config = random_config ( true ) ;
322416 let chain_source = TestChainSource :: Esplora ( & electrsd) ;
323- let node = setup_node ( & chain_source, config) ;
417+ let node = setup_node ( & chain_source, config, None ) ;
324418
325419 // Tests arbitrary message signing and later verification
326420 let msg = "OK computer" . as_bytes ( ) ;
0 commit comments