@@ -21,6 +21,8 @@ use ldk_node::{Builder, Event, NodeError};
21
21
use lightning:: ln:: channelmanager:: PaymentId ;
22
22
use lightning:: util:: persist:: KVStore ;
23
23
24
+ use bitcoincore_rpc:: RpcApi ;
25
+
24
26
use bitcoin:: Amount ;
25
27
26
28
use std:: sync:: Arc ;
@@ -315,12 +317,104 @@ fn onchain_spend_receive() {
315
317
assert ! ( node_b. list_balances( ) . spendable_onchain_balance_sats < 100000 ) ;
316
318
}
317
319
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
+
318
412
#[ test]
319
413
fn sign_verify_msg ( ) {
320
414
let ( _bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
321
415
let config = random_config ( true ) ;
322
416
let chain_source = TestChainSource :: Esplora ( & electrsd) ;
323
- let node = setup_node ( & chain_source, config) ;
417
+ let node = setup_node ( & chain_source, config, None ) ;
324
418
325
419
// Tests arbitrary message signing and later verification
326
420
let msg = "OK computer" . as_bytes ( ) ;
0 commit comments