@@ -34,6 +34,24 @@ pub fn get_test_spk() -> ScriptBuf {
3434 ScriptBuf :: new_p2tr ( & secp, pk, None )
3535}
3636
37+ pub fn test_addresses ( ) -> Vec < Address > {
38+ [
39+ "bcrt1qj9f7r8r3p2y0sqf4r3r62qysmkuh0fzep473d2ar7rcz64wqvhssjgf0z4" ,
40+ "bcrt1qmm5t0ch7vh2hryx9ctq3mswexcugqe4atkpkl2tetm8merqkthas3w7q30" ,
41+ "bcrt1qut9p7ej7l7lhyvekj28xknn8gnugtym4d5qvnp5shrsr4nksmfqsmyn87g" ,
42+ "bcrt1qqz0xtn3m235p2k96f5wa2dqukg6shxn9n3txe8arlrhjh5p744hsd957ww" ,
43+ "bcrt1q9c0t62a8l6wfytmf2t9lfj35avadk3mm8g4p3l84tp6rl66m48sqrme7wu" ,
44+ "bcrt1qkmh8yrk2v47cklt8dytk8f3ammcwa4q7dzattedzfhqzvfwwgyzsg59zrh" ,
45+ "bcrt1qvgrsrzy07gjkkfr5luplt0azxtfwmwq5t62gum5jr7zwcvep2acs8hhnp2" ,
46+ "bcrt1qw57edarcg50ansq8mk3guyrk78rk0fwvrds5xvqeupteu848zayq549av8" ,
47+ "bcrt1qvtve5ekf6e5kzs68knvnt2phfw6a0yjqrlgat392m6zt9jsvyxhqfx67ef" ,
48+ "bcrt1qw03ddumfs9z0kcu76ln7jrjfdwam20qtffmkcral3qtza90sp9kqm787uk" ,
49+ ]
50+ . into_iter ( )
51+ . map ( |s| Address :: from_str ( s) . unwrap ( ) . assume_checked ( ) )
52+ . collect ( )
53+ }
54+
3755fn get_balance (
3856 recv_chain : & LocalChain ,
3957 recv_graph : & IndexedTxGraph < ConfirmationBlockTime , SpkTxOutIndex < ( ) > > ,
@@ -383,23 +401,7 @@ pub fn test_update_tx_graph_stop_gap() -> anyhow::Result<()> {
383401 let client = BdkElectrumClient :: new ( electrum_client) ;
384402 let _block_hashes = env. mine_blocks ( 101 , None ) ?;
385403
386- // Now let's test the gap limit. First of all get a chain of 10 addresses.
387- let addresses = [
388- "bcrt1qj9f7r8r3p2y0sqf4r3r62qysmkuh0fzep473d2ar7rcz64wqvhssjgf0z4" ,
389- "bcrt1qmm5t0ch7vh2hryx9ctq3mswexcugqe4atkpkl2tetm8merqkthas3w7q30" ,
390- "bcrt1qut9p7ej7l7lhyvekj28xknn8gnugtym4d5qvnp5shrsr4nksmfqsmyn87g" ,
391- "bcrt1qqz0xtn3m235p2k96f5wa2dqukg6shxn9n3txe8arlrhjh5p744hsd957ww" ,
392- "bcrt1q9c0t62a8l6wfytmf2t9lfj35avadk3mm8g4p3l84tp6rl66m48sqrme7wu" ,
393- "bcrt1qkmh8yrk2v47cklt8dytk8f3ammcwa4q7dzattedzfhqzvfwwgyzsg59zrh" ,
394- "bcrt1qvgrsrzy07gjkkfr5luplt0azxtfwmwq5t62gum5jr7zwcvep2acs8hhnp2" ,
395- "bcrt1qw57edarcg50ansq8mk3guyrk78rk0fwvrds5xvqeupteu848zayq549av8" ,
396- "bcrt1qvtve5ekf6e5kzs68knvnt2phfw6a0yjqrlgat392m6zt9jsvyxhqfx67ef" ,
397- "bcrt1qw03ddumfs9z0kcu76ln7jrjfdwam20qtffmkcral3qtza90sp9kqm787uk" ,
398- ] ;
399- let addresses: Vec < _ > = addresses
400- . into_iter ( )
401- . map ( |s| Address :: from_str ( s) . unwrap ( ) . assume_checked ( ) )
402- . collect ( ) ;
404+ let addresses = test_addresses ( ) ;
403405 let spks: Vec < _ > = addresses
404406 . iter ( )
405407 . enumerate ( )
@@ -490,6 +492,47 @@ pub fn test_update_tx_graph_stop_gap() -> anyhow::Result<()> {
490492 Ok ( ( ) )
491493}
492494
495+ /// Test that `full_scan` always scans the revealed range before applying `stop_gap`.
496+ #[ test]
497+ pub fn test_stop_gap_past_last_revealed ( ) -> anyhow:: Result < ( ) > {
498+ let env = TestEnv :: new ( ) ?;
499+ let electrum_client = electrum_client:: Client :: new ( env. electrsd . electrum_url . as_str ( ) ) ?;
500+ let client = BdkElectrumClient :: new ( electrum_client) ;
501+ let _block_hashes = env. mine_blocks ( 101 , None ) ?;
502+
503+ let addresses = test_addresses ( ) ;
504+ let spks: Vec < _ > = addresses
505+ . iter ( )
506+ . enumerate ( )
507+ . map ( |( i, addr) | ( i as u32 , addr. script_pubkey ( ) ) )
508+ . collect ( ) ;
509+
510+ // Receive coins beyond stop_gap of 3.
511+ let txid_last_addr = env
512+ . bitcoind
513+ . client
514+ . send_to_address ( & addresses[ 9 ] , Amount :: from_sat ( 10000 ) ) ?
515+ . txid ( ) ?;
516+ env. mine_blocks ( 1 , None ) ?;
517+ env. wait_until_electrum_sees_block ( Duration :: from_secs ( 6 ) ) ?;
518+
519+ let cp_tip = env. make_checkpoint_tip ( ) ;
520+
521+ let request = FullScanRequest :: builder ( )
522+ . chain_tip ( cp_tip. clone ( ) )
523+ . spks_for_keychain ( 0 , spks. clone ( ) )
524+ . last_revealed_for_keychain ( 0 , 9 ) ;
525+ let response = client. full_scan ( request, 3 , 1 , false ) ?;
526+
527+ assert_eq ! (
528+ response. tx_update. txs. first( ) . unwrap( ) . compute_txid( ) ,
529+ txid_last_addr
530+ ) ;
531+ assert_eq ! ( response. last_active_indices[ & 0 ] , 9 ) ;
532+
533+ Ok ( ( ) )
534+ }
535+
493536/// Ensure that [`BdkElectrumClient::sync`] can confirm previously unconfirmed transactions in both
494537/// reorg and no-reorg situations. After the transaction is confirmed after reorg, check if floating
495538/// txouts for previous outputs were inserted for transaction fee calculation.
0 commit comments