Skip to content

Commit

Permalink
refactor(wallet)!: remove redundant get_descriptor_for_keychain
Browse files Browse the repository at this point in the history
Simplify Wallet::public_descriptor() and update Wallet internals to use
public_descriptor() instead of get_descriptor_for_keychain().
  • Loading branch information
gnapoli23 committed Jul 6, 2024
1 parent a112b4d commit e7ec5a8
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 28 deletions.
4 changes: 2 additions & 2 deletions crates/wallet/src/wallet/export.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ impl FullyNodedExport {
include_blockheight: bool,
) -> Result<Self, &'static str> {
let descriptor = wallet
.get_descriptor_for_keychain(KeychainKind::External)
.public_descriptor(KeychainKind::External)
.to_string_with_secret(
&wallet
.get_signers(KeychainKind::External)
Expand Down Expand Up @@ -144,7 +144,7 @@ impl FullyNodedExport {

let change_descriptor = {
let descriptor = wallet
.get_descriptor_for_keychain(KeychainKind::Internal)
.public_descriptor(KeychainKind::Internal)
.to_string_with_secret(
&wallet
.get_signers(KeychainKind::Internal)
Expand Down
30 changes: 12 additions & 18 deletions crates/wallet/src/wallet/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1595,7 +1595,7 @@ impl Wallet {
let weighted_utxo = match txout_index.index_of_spk(&txout.script_pubkey) {
Some(&(keychain, derivation_index)) => {
let satisfaction_weight = self
.get_descriptor_for_keychain(keychain)
.public_descriptor(keychain)
.max_weight_to_satisfy()
.unwrap();
WeightedUtxo {
Expand Down Expand Up @@ -1763,16 +1763,15 @@ impl Wallet {
)
}

/// Return the "public" version of the wallet's descriptor, meaning a new descriptor that has
/// the same structure but with every secret key removed
/// Returns the descriptor used to create addresses for a particular `keychain`.
/// It's the "public" version of the wallet's descriptor, meaning a new descriptor that has
/// the same structure but with the all secret keys replaced by their corresponding public key.
///
/// This can be used to build a watch-only version of a wallet
/// This can be used to build a watch-only version of a wallet.
pub fn public_descriptor(&self, keychain: KeychainKind) -> &ExtendedDescriptor {
self.indexed_graph
.index
.keychains()
.find(|(k, _)| *k == &keychain)
.map(|(_, d)| d)
.get_descriptor(&keychain)
.expect("keychain must exist")
}

Expand Down Expand Up @@ -1878,11 +1877,6 @@ impl Wallet {
&self.secp
}

/// Returns the descriptor used to create addresses for a particular `keychain`.
pub fn get_descriptor_for_keychain(&self, keychain: KeychainKind) -> &ExtendedDescriptor {
self.public_descriptor(keychain)
}

/// The derivation index of this wallet. It will return `None` if it has not derived any addresses.
/// Otherwise, it will return the index of the highest address it has derived.
pub fn derivation_index(&self, keychain: KeychainKind) -> Option<u32> {
Expand Down Expand Up @@ -1918,7 +1912,7 @@ impl Wallet {
.indexed_graph
.index
.index_of_spk(&txout.script_pubkey)?;
let descriptor = self.get_descriptor_for_keychain(keychain);
let descriptor = self.public_descriptor(keychain);
descriptor.at_derivation_index(child).ok()
}

Expand All @@ -1927,7 +1921,7 @@ impl Wallet {
.map(|utxo| {
let keychain = utxo.keychain;
(utxo, {
self.get_descriptor_for_keychain(keychain)
self.public_descriptor(keychain)
.max_weight_to_satisfy()
.unwrap()
})
Expand Down Expand Up @@ -2140,7 +2134,7 @@ impl Wallet {
..psbt::Input::default()
};

let desc = self.get_descriptor_for_keychain(keychain);
let desc = self.public_descriptor(keychain);
let derived_descriptor = desc
.at_derivation_index(child)
.expect("child can't be hardened");
Expand Down Expand Up @@ -2180,7 +2174,7 @@ impl Wallet {
if let Some(&(keychain, child)) =
self.indexed_graph.index.index_of_spk(&out.script_pubkey)
{
let desc = self.get_descriptor_for_keychain(keychain);
let desc = self.public_descriptor(keychain);
let desc = desc
.at_derivation_index(child)
.expect("child can't be hardened");
Expand All @@ -2200,9 +2194,9 @@ impl Wallet {

/// Return the checksum of the public descriptor associated to `keychain`
///
/// Internally calls [`Self::get_descriptor_for_keychain`] to fetch the right descriptor
/// Internally calls [`Self::public_descriptor`] to fetch the right descriptor
pub fn descriptor_checksum(&self, keychain: KeychainKind) -> String {
self.get_descriptor_for_keychain(keychain)
self.public_descriptor(keychain)
.to_string()
.split_once('#')
.unwrap()
Expand Down
2 changes: 1 addition & 1 deletion crates/wallet/src/wallet/tx_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ impl<'a, Cs> TxBuilder<'a, Cs> {
.collect::<Result<Vec<_>, _>>()?;

for utxo in utxos {
let descriptor = wallet.get_descriptor_for_keychain(utxo.keychain);
let descriptor = wallet.public_descriptor(utxo.keychain);
let satisfaction_weight = descriptor.max_weight_to_satisfy().unwrap();
self.params.utxos.push(WeightedUtxo {
satisfaction_weight,
Expand Down
14 changes: 7 additions & 7 deletions crates/wallet/tests/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ fn load_recovers_wallet() -> anyhow::Result<()> {
);
let secp = Secp256k1::new();
assert_eq!(
*wallet.get_descriptor_for_keychain(KeychainKind::External),
*wallet.public_descriptor(KeychainKind::External),
desc.into_wallet_descriptor(&secp, wallet.network())
.unwrap()
.0
Expand Down Expand Up @@ -1402,7 +1402,7 @@ fn test_add_foreign_utxo() {
.assume_checked();
let utxo = wallet2.list_unspent().next().expect("must take!");
let foreign_utxo_satisfaction = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
.public_descriptor(KeychainKind::External)
.max_weight_to_satisfy()
.unwrap();

Expand Down Expand Up @@ -1478,7 +1478,7 @@ fn test_calculate_fee_with_missing_foreign_utxo() {
.assume_checked();
let utxo = wallet2.list_unspent().next().expect("must take!");
let foreign_utxo_satisfaction = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
.public_descriptor(KeychainKind::External)
.max_weight_to_satisfy()
.unwrap();

Expand All @@ -1503,7 +1503,7 @@ fn test_add_foreign_utxo_invalid_psbt_input() {
let (mut wallet, _) = get_funded_wallet_wpkh();
let outpoint = wallet.list_unspent().next().expect("must exist").outpoint;
let foreign_utxo_satisfaction = wallet
.get_descriptor_for_keychain(KeychainKind::External)
.public_descriptor(KeychainKind::External)
.max_weight_to_satisfy()
.unwrap();

Expand All @@ -1524,7 +1524,7 @@ fn test_add_foreign_utxo_where_outpoint_doesnt_match_psbt_input() {
let tx2 = wallet2.get_tx(txid2).unwrap().tx_node.tx.clone();

let satisfaction_weight = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
.public_descriptor(KeychainKind::External)
.max_weight_to_satisfy()
.unwrap();

Expand Down Expand Up @@ -1568,7 +1568,7 @@ fn test_add_foreign_utxo_only_witness_utxo() {
let utxo2 = wallet2.list_unspent().next().unwrap();

let satisfaction_weight = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
.public_descriptor(KeychainKind::External)
.max_weight_to_satisfy()
.unwrap();

Expand Down Expand Up @@ -3400,7 +3400,7 @@ fn test_taproot_foreign_utxo() {
let utxo = wallet2.list_unspent().next().unwrap();
let psbt_input = wallet2.get_psbt_input(utxo.clone(), None, false).unwrap();
let foreign_utxo_satisfaction = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
.public_descriptor(KeychainKind::External)
.max_weight_to_satisfy()
.unwrap();

Expand Down

0 comments on commit e7ec5a8

Please sign in to comment.