Skip to content

Commit a5918b0

Browse files
authored
feat: add new_wsh_sortedmulti and new_pk
1 parent db10ef7 commit a5918b0

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
88

99
### Added
1010
- Expose miniscript `has_wildcard` and `sanity_check` methods on `Descriptor` type #945
11+
- Expose `new_wsh_sortedmulti` and `new_pk` methods on `Descriptor` type #949
1112

1213
## [v2.3.0]
1314

bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/DescriptorTest.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,37 @@ class DescriptorTest {
4141
Descriptor("tr($MAINNET_EXTENDED_PRIVKEY/$BIP86_MAINNET_RECEIVE_PATH/0)", Network.BITCOIN)
4242
}
4343

44+
// Create a multisig descriptor.
45+
@Test
46+
fun createMultisigDescriptor() {
47+
val pkList = listOf(
48+
"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
49+
"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
50+
"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB"
51+
)
52+
val wshDescriptor = Descriptor.newWshSortedmulti(2u, pkList);
53+
54+
assertEquals(wshDescriptor.descType(), DescriptorType.WSH_SORTED_MULTI)
55+
}
56+
57+
@Test
58+
fun createInvalidMutlisigDescriptor() {
59+
val invalidPkList = listOf(
60+
"invalid_xpub",
61+
"1111111111111",
62+
"***"
63+
)
64+
assertFails {
65+
Descriptor.newWshSortedmulti(2u, invalidPkList);
66+
}
67+
}
68+
69+
@Test
70+
fun createSingleKeyDescriptor() {
71+
val newPkDescriptor = Descriptor.newPk("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB")
72+
assertEquals(newPkDescriptor.descType(), DescriptorType.BARE)
73+
}
74+
4475
// Cannot create addr() descriptor.
4576
@Test
4677
fun cannotCreateAddrDescriptor() {

bdk-ffi/src/descriptor.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,51 @@ impl Descriptor {
305305
}
306306
}
307307

308+
/// Create a new wsh sorted multi descriptor
309+
/// Errors when miniscript exceeds resource limits under p2sh context
310+
#[uniffi::constructor]
311+
pub fn new_wsh_sortedmulti(k: u32, pks: Vec<String>) -> Result<Self, DescriptorError> {
312+
let bdk_pks: Vec<BdkDescriptorPublicKey> = pks
313+
.iter()
314+
.map(|pk| {
315+
BdkDescriptorPublicKey::from_str(pk).map_err(|e| DescriptorError::Key {
316+
error_message: e.to_string(),
317+
})
318+
})
319+
.collect::<Result<Vec<BdkDescriptorPublicKey>, DescriptorError>>()?;
320+
let miniscript_descriptor =
321+
match bdk_wallet::miniscript::Descriptor::new_wsh_sortedmulti(k as usize, bdk_pks) {
322+
Ok(descriptor) => descriptor,
323+
Err(e) => {
324+
return Err(DescriptorError::Miniscript {
325+
error_message: e.to_string(),
326+
})
327+
}
328+
};
329+
let extended_descriptor = ExtendedDescriptor::from(miniscript_descriptor);
330+
331+
Ok(Self {
332+
extended_descriptor,
333+
key_map: KeyMap::new(),
334+
})
335+
}
336+
337+
/// Create a new pay-to-pubkey descriptor from a public key string.
338+
#[uniffi::constructor]
339+
pub fn new_pk(pk: String) -> Result<Self, DescriptorError> {
340+
let key = BdkDescriptorPublicKey::from_str(&pk).map_err(|e| DescriptorError::Key {
341+
error_message: e.to_string(),
342+
})?;
343+
344+
let miniscript_descriptor = bdk_wallet::miniscript::Descriptor::new_pk(key);
345+
let extended_descriptor = ExtendedDescriptor::from(miniscript_descriptor);
346+
347+
Ok(Self {
348+
extended_descriptor,
349+
key_map: KeyMap::new(),
350+
})
351+
}
352+
308353
/// Dangerously convert the descriptor to a string.
309354
pub fn to_string_with_secret(&self) -> String {
310355
let descriptor = &self.extended_descriptor;

0 commit comments

Comments
 (0)