From 2c02a44586c67d1ec9720f17a3748f28c1d18643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=97=E5=AE=87?= Date: Sat, 9 Jul 2022 20:29:58 +0800 Subject: [PATCH] Test: No address reuse for single descriptor This test is to ensure there are no regressions when we later change internal logic of `Wallet`. A single descriptor wallet should always get a new address with `AddressIndex::New` even if we alternate grabbing internal/external keychains. --- src/wallet/mod.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index cab3b020..5c16984e 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -4490,6 +4490,34 @@ pub(crate) mod test { ); } + #[test] + fn test_get_address_no_reuse_single_descriptor() { + use crate::descriptor::template::Bip84; + use std::collections::HashSet; + + let key = bitcoin::util::bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); + let wallet = Wallet::new( + Bip84(key, KeychainKind::External), + None, + Network::Regtest, + MemoryDatabase::default(), + ) + .unwrap(); + + let mut used_set = HashSet::new(); + + (0..3).for_each(|_| { + let external_addr = wallet.get_address(AddressIndex::New).unwrap().address; + assert!(used_set.insert(external_addr)); + + let internal_addr = wallet + .get_internal_address(AddressIndex::New) + .unwrap() + .address; + assert!(used_set.insert(internal_addr)); + }); + } + #[test] fn test_taproot_psbt_populate_tap_key_origins() { let (wallet, _, _) = get_funded_wallet(get_test_tr_single_sig_xprv());