Skip to content

Commit 4bab1c2

Browse files
feat: add desc_type method to Descriptor type
1 parent 8f6eedd commit 4bab1c2

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

bdk-ffi/src/bdk.udl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,6 +1098,9 @@ interface Descriptor {
10981098
/// "parallel" paths. For regular descriptors it will just return itself.
10991099
[Throws=MiniscriptError]
11001100
sequence<Descriptor> to_single_descriptors();
1101+
1102+
/// Get the DescriptorType of Descriptor
1103+
DescriptorType desc_type();
11011104
};
11021105

11031106
// ------------------------------------------------------------------------
@@ -1460,3 +1463,23 @@ dictionary OutPoint {
14601463
string txid;
14611464
u32 vout;
14621465
};
1466+
1467+
// ------------------------------------------------------------------------
1468+
// bdk_wallet crate - miniscript re-exports
1469+
// ------------------------------------------------------------------------
1470+
1471+
/// Descriptor Type of the descriptor.
1472+
[Remote]
1473+
enum DescriptorType {
1474+
"Bare",
1475+
"Sh",
1476+
"Pkh",
1477+
"Wpkh",
1478+
"Wsh",
1479+
"ShWsh",
1480+
"ShWpkh",
1481+
"ShSortedMulti",
1482+
"WshSortedMulti",
1483+
"ShWshSortedMulti",
1484+
"Tr",
1485+
};

bdk-ffi/src/descriptor.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use bdk_wallet::template::{
1515
use bdk_wallet::KeychainKind;
1616

1717
use crate::error::MiniscriptError;
18+
use bdk_wallet::miniscript::descriptor::DescriptorType;
1819
use std::fmt::Display;
1920
use std::str::FromStr;
2021
use std::sync::Arc;
@@ -290,6 +291,10 @@ impl Descriptor {
290291
.collect()
291292
})
292293
}
294+
295+
pub(crate) fn desc_type(&self) -> DescriptorType {
296+
self.extended_descriptor.desc_type()
297+
}
293298
}
294299

295300
impl Display for Descriptor {

bdk-ffi/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ use crate::wallet::Wallet;
9191

9292
use bdk_wallet::bitcoin::Network;
9393
use bdk_wallet::keys::bip39::WordCount;
94+
use bdk_wallet::miniscript::descriptor::DescriptorType;
9495
use bdk_wallet::tx_builder::ChangeSpendPolicy;
9596
use bdk_wallet::ChangeSet;
9697
use bdk_wallet::KeychainKind;

bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/OfflineDescriptorTest.kt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,68 @@ class OfflineDescriptorTest {
1515
actual = descriptor.toString()
1616
)
1717
}
18+
19+
@Test
20+
fun testDescriptorTypes() {
21+
// Taken from the BIPs: https://github.com/bitcoin/bips/blob/master/bip-0380.mediawiki
22+
23+
val descriptor1 = Descriptor("pk(L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", Network.SIGNET)
24+
val descriptor2 = Descriptor("pkh([deadbeef/1/2'/3/4']L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1)", Network.SIGNET)
25+
val descriptor3 = Descriptor("sh(pk(03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd))", Network.SIGNET)
26+
val descriptor4 = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET)
27+
val descriptor5 = Descriptor("sh(wpkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/10/20/30/40/*h))", Network.BITCOIN)
28+
val descriptor6 = Descriptor("multi(1,L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1,5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss)", Network.BITCOIN)
29+
// val descriptor7 = Descriptor("sortedmulti(1,04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235,03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", Network.BITCOIN)
30+
// val descriptor8 = Descriptor("combo(04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235)", Network.BITCOIN)
31+
// val descriptor9 = Descriptor("raw(512103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd4104a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea23552ae)", Network.BITCOIN)
32+
// val descriptor10 = Descriptor("addr(3PUNyaW7M55oKWJ3kDukwk9bsKvryra15j)", Network.BITCOIN)
33+
val descriptor11 = Descriptor("tr(a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd)", Network.BITCOIN)
34+
val descriptor12 = Descriptor("sh(multi(2,[00000000/111'/222]xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc,xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L/0))", Network.BITCOIN)
35+
36+
println(descriptor1.descType())
37+
println(descriptor2.descType())
38+
println(descriptor3.descType())
39+
println(descriptor4.descType())
40+
println(descriptor5.descType())
41+
println(descriptor6.descType())
42+
// println(descriptor7.descType())
43+
// println(descriptor8.descType())
44+
// println(descriptor9.descType())
45+
// println(descriptor10.descType())
46+
println(descriptor11.descType())
47+
println(descriptor12.descType())
48+
49+
assertEquals(
50+
expected = DescriptorType.BARE,
51+
actual = descriptor1.descType()
52+
)
53+
assertEquals(
54+
expected = DescriptorType.PKH,
55+
actual = descriptor2.descType()
56+
)
57+
assertEquals(
58+
expected = DescriptorType.SH,
59+
actual = descriptor3.descType()
60+
)
61+
assertEquals(
62+
expected = DescriptorType.WPKH,
63+
actual = descriptor4.descType()
64+
)
65+
assertEquals(
66+
expected = DescriptorType.SH_WPKH,
67+
actual = descriptor5.descType()
68+
)
69+
assertEquals(
70+
expected = DescriptorType.BARE,
71+
actual = descriptor6.descType()
72+
)
73+
assertEquals(
74+
expected = DescriptorType.TR,
75+
actual = descriptor11.descType()
76+
)
77+
assertEquals(
78+
expected = DescriptorType.SH,
79+
actual = descriptor12.descType()
80+
)
81+
}
1882
}

0 commit comments

Comments
 (0)