What is missing
tests/test_offline_descriptor.py currently contains a single test:
test_descriptor_bip86 — tests Descriptor.new_bip86() for the external keychain only
bdkpython exposes 8 BIP descriptor template constructors (from bdk_wallet::template)
across 4 standards, each with a private key variant (DescriptorSecretKey) and a
watch-only public key variant (DescriptorPublicKey), plus 3 miniscript multisig
constructors. None of the following have test coverage today:
| Constructor |
Standard |
Script type |
Tested? |
Descriptor.new_bip44() |
BIP44 |
pkh(...) |
No |
Descriptor.new_bip44_public() |
BIP44 |
pkh(...) |
No |
Descriptor.new_bip49() |
BIP49 |
sh(wpkh(...)) |
No |
Descriptor.new_bip49_public() |
BIP49 |
sh(wpkh(...)) |
No |
Descriptor.new_bip84() |
BIP84 |
wpkh(...) |
No |
Descriptor.new_bip84_public() |
BIP84 |
wpkh(...) |
No |
Descriptor.new_bip86() internal |
BIP86 |
tr(...) |
No |
Descriptor.new_bip86_public() |
BIP86 |
tr(...) |
No |
Descriptor.new_wsh_sortedmulti() |
miniscript |
wsh(sortedmulti(...)) |
No |
Descriptor.new_sh_sortedmulti() |
miniscript |
sh(sortedmulti(...)) |
No |
Descriptor.new_sh_wsh_sortedmulti() |
miniscript |
sh(wsh(sortedmulti(...))) |
No |
What I propose to add
13 new tests in tests/test_offline_descriptor.py covering:
- BIP44 — external keychain, internal keychain, and watch-only (
new_bip44_public) variant
- BIP49 — external keychain, internal keychain, and watch-only (
new_bip49_public) variant
- BIP84 — external keychain, internal keychain, and watch-only (
new_bip84_public) variant
- BIP86 — internal keychain and watch-only (
new_bip86_public) variant (external already exists)
- Multisig —
new_wsh_sortedmulti and new_sh_sortedmulti 2-of-3
I am intentionally leaving new_sh_wsh_sortedmulti out of this PR to keep the scope
focused, and can follow up with a separate issue if the maintainers consider it worthwhile.
All tests will be:
- Fully offline — no network access required
- Deterministic — fixed test mnemonic so expected outputs are independently verifiable
with any compatible BIP32/BIP44/BIP49/BIP84/BIP86 implementation
- Following the same pattern as the existing test: fixed mnemonic → derive key → assert full descriptor string including checksum
Why this matters
Descriptor construction is the first thing every bdkpython user does — it is required
to create a Wallet. Without test coverage for these constructors, a regression in the
FFI layer (e.g. wrong derivation path, wrong script type, wrong network prefix, wrong
checksum) would go undetected until a user reports it in production.
Each test pins the full descriptor output string to a known-correct value, which means
any future change to the FFI type conversion or the bdk_wallet::template behavior
that silently produces wrong output will immediately fail CI.
This is a pure Python addition — no changes to the Rust layer.
Checklist before I open a PR
What is missing
tests/test_offline_descriptor.pycurrently contains a single test:bdkpythonexposes 8 BIP descriptor template constructors (frombdk_wallet::template)across 4 standards, each with a private key variant (
DescriptorSecretKey) and awatch-only public key variant (
DescriptorPublicKey), plus 3 miniscript multisigconstructors. None of the following have test coverage today:
Descriptor.new_bip44()pkh(...)Descriptor.new_bip44_public()pkh(...)Descriptor.new_bip49()sh(wpkh(...))Descriptor.new_bip49_public()sh(wpkh(...))Descriptor.new_bip84()wpkh(...)Descriptor.new_bip84_public()wpkh(...)Descriptor.new_bip86()internaltr(...)Descriptor.new_bip86_public()tr(...)Descriptor.new_wsh_sortedmulti()wsh(sortedmulti(...))Descriptor.new_sh_sortedmulti()sh(sortedmulti(...))Descriptor.new_sh_wsh_sortedmulti()sh(wsh(sortedmulti(...)))What I propose to add
13 new tests in
tests/test_offline_descriptor.pycovering:new_bip44_public) variantnew_bip49_public) variantnew_bip84_public) variantnew_bip86_public) variant (external already exists)new_wsh_sortedmultiandnew_sh_sortedmulti2-of-3I am intentionally leaving
new_sh_wsh_sortedmultiout of this PR to keep the scopefocused, and can follow up with a separate issue if the maintainers consider it worthwhile.
All tests will be:
with any compatible BIP32/BIP44/BIP49/BIP84/BIP86 implementation
Why this matters
Descriptor construction is the first thing every
bdkpythonuser does — it is requiredto create a
Wallet. Without test coverage for these constructors, a regression in theFFI layer (e.g. wrong derivation path, wrong script type, wrong network prefix, wrong
checksum) would go undetected until a user reports it in production.
Each test pins the full descriptor output string to a known-correct value, which means
any future change to the FFI type conversion or the
bdk_wallet::templatebehaviorthat silently produces wrong output will immediately fail CI.
This is a pure Python addition — no changes to the Rust layer.
Checklist before I open a PR
tests/test_offline_descriptor.py