- The KeychainTxOutIndex's internal SpkIterator now uses DescriptorId instead of K. The DescriptorId -> K translation is made at the KeychainTxOutIndex level. - The keychain::Changeset is now a struct, which includes a map for last revealed indexes, and one for newly added keychains and their descriptor. API changes in bdk: - Wallet::keychains returns a `impl Iterator` instead of `BTreeMap` - Wallet::load doesn't take descriptors anymore, since they're stored in the db - Wallet::new_or_load checks if the loaded descriptor from db is the same as the provided one API changes in bdk_chain: - `ChangeSet` is now a struct, which includes a map for last revealed indexes, and one for keychains and descriptors. - `KeychainTxOutIndex::inner` returns a `SpkIterator<(DescriptorId, u32)>` - `KeychainTxOutIndex::outpoints` returns a `impl Iterator` instead of `&BTreeSet` - `KeychainTxOutIndex::keychains` returns a `impl Iterator` instead of `&BTreeMap` - `KeychainTxOutIndex::txouts` doesn't return a ExactSizeIterator anymore - `KeychainTxOutIndex::unbounded_spk_iter` returns an `Option` - `KeychainTxOutIndex::next_index` returns an `Option` - `KeychainTxOutIndex::last_revealed_indices` returns a `BTreeMap` instead of `&BTreeMap` - `KeychainTxOutIndex::reveal_to_target` returns an `Option` - `KeychainTxOutIndex::reveal_next_spk` returns an `Option` - `KeychainTxOutIndex::next_unused_spk` returns an `Option` - `KeychainTxOutIndex::add_keychain` has been renamed to `KeychainTxOutIndex::insert_descriptor`, and now it returns a ChangeSet
45 lines
1.6 KiB
Rust
45 lines
1.6 KiB
Rust
use crate::{
|
|
alloc::{string::ToString, vec::Vec},
|
|
miniscript::{Descriptor, DescriptorPublicKey},
|
|
};
|
|
use bitcoin::hashes::{hash_newtype, sha256, Hash};
|
|
|
|
hash_newtype! {
|
|
/// Represents the ID of a descriptor, defined as the sha256 hash of
|
|
/// the descriptor string, checksum excluded.
|
|
///
|
|
/// This is useful for having a fixed-length unique representation of a descriptor,
|
|
/// in particular, we use it to persist application state changes related to the
|
|
/// descriptor without having to re-write the whole descriptor each time.
|
|
///
|
|
pub struct DescriptorId(pub sha256::Hash);
|
|
}
|
|
|
|
/// A trait to extend the functionality of a miniscript descriptor.
|
|
pub trait DescriptorExt {
|
|
/// Returns the minimum value (in satoshis) at which an output is broadcastable.
|
|
/// Panics if the descriptor wildcard is hardened.
|
|
fn dust_value(&self) -> u64;
|
|
|
|
/// Returns the descriptor id, calculated as the sha256 of the descriptor, checksum not
|
|
/// included.
|
|
fn descriptor_id(&self) -> DescriptorId;
|
|
}
|
|
|
|
impl DescriptorExt for Descriptor<DescriptorPublicKey> {
|
|
fn dust_value(&self) -> u64 {
|
|
self.at_derivation_index(0)
|
|
.expect("descriptor can't have hardened derivation")
|
|
.script_pubkey()
|
|
.dust_value()
|
|
.to_sat()
|
|
}
|
|
|
|
fn descriptor_id(&self) -> DescriptorId {
|
|
let desc = self.to_string();
|
|
let desc_without_checksum = desc.split('#').next().expect("Must be here");
|
|
let descriptor_bytes = <Vec<u8>>::from(desc_without_checksum.as_bytes());
|
|
DescriptorId(sha256::Hash::hash(&descriptor_bytes))
|
|
}
|
|
}
|