Skip to content

Commit 429ff42

Browse files
temp 2: peek addresses for any number of descriptors
1 parent 330739d commit 429ff42

File tree

4 files changed

+43
-13
lines changed

4 files changed

+43
-13
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
resolver = "2"
33
members = [
44
"wallet",
5-
"examples/example_wallet_n_keychains"
65
# "examples/example_wallet_electrum",
76
# "examples/example_wallet_esplora_blocking",
87
# "examples/example_wallet_esplora_async",

wallet/examples/n_keychains.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,36 @@
1+
use bdk_chain::DescriptorId;
12
use bdk_wallet::{KeyRing, Wallet};
23
use bdk_wallet::bitcoin::Network;
34
use bdk_wallet::KeychainKind;
45

56
const EXTERNAL_DESC: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/0/*)";
67
const OTHER_DESC_21: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/21/*)";
7-
const OTHER_DESC_33: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/33/*)";
8-
const OTHER_DESC_44: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/44/*)";
8+
const OTHER_DESC_31: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/33/*)";
9+
const OTHER_DESC_41: &str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/44/*)";
910

1011
fn main() -> Result<(), anyhow::Error> {
12+
// Create a keyring with a single, default descriptor (aka the KeychainKind::External from the 1.2.0 API)
1113
let mut keyring = KeyRing::new(EXTERNAL_DESC, Network::Testnet4);
12-
// keyring.add_other_descriptor(OTHER_DESC_21);
13-
// let keychains = keyring.list_keychains();
14-
// println!("{:?}", keychains);
1514

15+
// Add 3 new custom descriptors
16+
keyring.add_other_descriptor(OTHER_DESC_21);
17+
keyring.add_other_descriptor(OTHER_DESC_31);
18+
keyring.add_other_descriptor(OTHER_DESC_41);
19+
20+
let keychain_ids: Vec<DescriptorId> = keyring.list_keychain_ids();
21+
println!("{:?}", keychain_ids);
22+
23+
// Create the wallet and peek addresses on each of the descriptors
1624
let wallet: Wallet = Wallet::new(keyring).create_wallet_no_persist()?;
1725
let address_1 = wallet.peek_address(KeychainKind::Default, 0).unwrap();
18-
// let address_2 = wallet.peek_address((KeychainKind::Other(), 0).unwrap();
26+
let address_2 = wallet.peek_address(KeychainKind::Other(keychain_ids[1]), 0).unwrap();
27+
let address_3 = wallet.peek_address(KeychainKind::Other(keychain_ids[2]), 0).unwrap();
28+
let address_4 = wallet.peek_address(KeychainKind::Other(keychain_ids[3]), 0).unwrap();
1929

20-
println!("Address {:?} at index {:?} on keychain {:?}", address_1.address, address_1.index, address_1.keychain);
30+
println!("Address 1 {:?} at index {:?} on keychain {:?}", address_1.address, address_1.index, address_1.keychain);
31+
println!("Address 2 {:?} at index {:?} on keychain {:?}", address_2.address, address_2.index, address_2.keychain);
32+
println!("Address 3 {:?} at index {:?} on keychain {:?}", address_3.address, address_3.index, address_3.keychain);
33+
println!("Address 4 {:?} at index {:?} on keychain {:?}", address_4.address, address_4.index, address_4.keychain);
2134

2235
Ok(())
2336
}

wallet/src/types.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,17 @@ impl KeyRing {
131131
&self.keychains
132132
}
133133

134+
pub fn list_keychain_ids(&self) -> Vec<DescriptorId> {
135+
self.keychains
136+
.iter()
137+
.map(|keychain| match keychain.0 {
138+
KeychainKind::Other(descriptor_id) => descriptor_id,
139+
KeychainKind::Default => keychain.1.0.descriptor_id(),
140+
KeychainKind::Change => keychain.1.0.descriptor_id(),
141+
})
142+
.collect()
143+
}
144+
134145
// pub fn add_change_keychain(&mut self, keychain: (DescriptorToExtract, KeyMap), keychain_identifier: KeychainIdentifier) {
135146
//
136147
// }

wallet/src/wallet/mod.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2544,7 +2544,7 @@ fn new_local_utxo(
25442544
}
25452545

25462546
fn create_indexer(
2547-
keychain_set: KeyRing,
2547+
keyring: KeyRing,
25482548
// descriptor: ExtendedDescriptor,
25492549
// change_descriptor: Option<ExtendedDescriptor>,
25502550
lookahead: u32,
@@ -2553,10 +2553,17 @@ fn create_indexer(
25532553

25542554
// let (descriptor, keymap) = descriptor;
25552555
// let signers = Arc::new(SignersContainer::build(keymap, &descriptor, secp));
2556-
let default_keychain = keychain_set.get_default_keychain().clone();
2557-
assert!(indexer
2558-
.insert_descriptor(default_keychain.0, default_keychain.1.0)
2559-
.expect("first descriptor introduced must succeed"));
2556+
let default_keychain = keyring.get_default_keychain().clone();
2557+
// TODO: KeyRings always have at least one descriptor, so I think we don't need this assert
2558+
// assert!(indexer
2559+
// .insert_descriptor(default_keychain.0, default_keychain.1.0)
2560+
// .expect("first descriptor introduced must succeed"));
2561+
2562+
// TODO: I'm here, May 2
2563+
keyring.list_keychains().iter().for_each(|k| {
2564+
indexer.insert_descriptor(k.0, k.1.0.clone()).expect("This should work");
2565+
dbg!("Inserting descriptor into indexer");
2566+
});
25602567

25612568
// let (descriptor, keymap) = change_descriptor;
25622569
// let change_signers = Arc::new(SignersContainer::build(keymap, &descriptor, secp));

0 commit comments

Comments
 (0)