From 5fc05e2b17ce8272360b8b6774ac12c907c3e231 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Wed, 23 Sep 2026 15:21:20 +0200 Subject: [PATCH 1/5] bip138: generalize key-selection test vectors Rename keys_types.json to recipient_keys.json and generalize the format to support multiple descriptors and multiple recipient keys: - "key": a single key-expression string becomes "descriptors": an array of complete descriptor strings. - "expected": an x-only key string becomes "expected_keys": an array containing that key; null remains null. Convert the nine existing cases by wrapping each key expression in tr(), except the uncompressed literal uses pk(), since tr() does not accept it. Each case has one descriptor. --- bip-0138.md | 7 ++- bip-0138/test_vectors/keys_types.json | 47 -------------- bip-0138/test_vectors/recipient_keys.json | 75 +++++++++++++++++++++++ 3 files changed, 80 insertions(+), 49 deletions(-) delete mode 100644 bip-0138/test_vectors/keys_types.json create mode 100644 bip-0138/test_vectors/recipient_keys.json diff --git a/bip-0138.md b/bip-0138.md index 8c5d6cda..4bf4eb52 100644 --- a/bip-0138.md +++ b/bip-0138.md @@ -590,8 +590,11 @@ The version field enables possible future enhancements: ### Test Vectors -[key_types.json](./bip-0138/test_vectors/keys_types.json) contains test -vectors for key serialisations. +[recipient_keys.json](./bip-0138/test_vectors/recipient_keys.json) contains +test vectors for recipient selection. `descriptors` lists the payload's descriptor +strings; `expected_keys` lists the sorted, deduplicated x-only recipient roots +before application-specific exclusions. `null` requires refusing to encode. + [content_type.json](./bip-0138/test_vectors/content_type.json) contains test vectors for content types serialisations. [payload.json](./bip-0138/test_vectors/payload.json) contains test vectors for payload parsing. diff --git a/bip-0138/test_vectors/keys_types.json b/bip-0138/test_vectors/keys_types.json deleted file mode 100644 index a2346e0b..00000000 --- a/bip-0138/test_vectors/keys_types.json +++ /dev/null @@ -1,47 +0,0 @@ -[ - { - "description": "Xpub with origin and multipath wildcard", - "key": "[58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/<0;1>/*", - "expected": "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" - }, - { - "description": "Xpub with single-path wildcard", - "key": "[58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/0/*", - "expected": "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" - }, - { - "description": "Xpub with bare wildcard (no preceding path)", - "key": "[58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/*", - "expected": "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" - }, - { - "description": "Xpub with fixed deep derivation, no wildcard", - "key": "[58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/0/5", - "expected": "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" - }, - { - "description": "Xpub with multipath, no wildcard", - "key": "[58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/<0;1>", - "expected": "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" - }, - { - "description": "Bare xpub (no derivation, no wildcard); DISALLOWED", - "key": "[d4ab66f1/48'/1'/1'/2']tpubDFTxBKyUCgkwp5enwZh3t2FJ5AMJqmCWoh1NRT13qNYQb1iKTUrAG6u5gpsDYhG8cZGXouYWuQtzcuSVjPStTc4dwU6JqPMFtgaLGvSQXhi", - "expected": null - }, - { - "description": "Compressed literal pubkey; DISALLOWED", - "key": "02ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708", - "expected": null - }, - { - "description": "X-only literal pubkey; DISALLOWED", - "key": "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708", - "expected": null - }, - { - "description": "Uncompressed literal pubkey; DISALLOWED", - "key": "04ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b517089e956909c4c07e8529f45f3ff8904d28df5a181619e21bdf748a896322530039", - "expected": null - } -] diff --git a/bip-0138/test_vectors/recipient_keys.json b/bip-0138/test_vectors/recipient_keys.json new file mode 100644 index 00000000..de127951 --- /dev/null +++ b/bip-0138/test_vectors/recipient_keys.json @@ -0,0 +1,75 @@ +[ + { + "description": "Xpub with origin and multipath wildcard", + "descriptors": [ + "tr([58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/<0;1>/*)" + ], + "expected_keys": [ + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] + }, + { + "description": "Xpub with single-path wildcard", + "descriptors": [ + "tr([58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/0/*)" + ], + "expected_keys": [ + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] + }, + { + "description": "Xpub with bare wildcard (no preceding path)", + "descriptors": [ + "tr([58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/*)" + ], + "expected_keys": [ + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] + }, + { + "description": "Xpub with fixed deep derivation, no wildcard", + "descriptors": [ + "tr([58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/0/5)" + ], + "expected_keys": [ + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] + }, + { + "description": "Xpub with multipath, no wildcard", + "descriptors": [ + "tr([58b7f8dc/48'/1'/0'/2']tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/<0;1>)" + ], + "expected_keys": [ + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] + }, + { + "description": "Bare xpub (no derivation, no wildcard); DISALLOWED", + "descriptors": [ + "tr([d4ab66f1/48'/1'/1'/2']tpubDFTxBKyUCgkwp5enwZh3t2FJ5AMJqmCWoh1NRT13qNYQb1iKTUrAG6u5gpsDYhG8cZGXouYWuQtzcuSVjPStTc4dwU6JqPMFtgaLGvSQXhi)" + ], + "expected_keys": null + }, + { + "description": "Compressed literal pubkey; DISALLOWED", + "descriptors": [ + "tr(02ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708)" + ], + "expected_keys": null + }, + { + "description": "X-only literal pubkey; DISALLOWED", + "descriptors": [ + "tr(ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708)" + ], + "expected_keys": null + }, + { + "description": "Uncompressed literal pubkey; DISALLOWED", + "descriptors": [ + "pk(04ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b517089e956909c4c07e8529f45f3ff8904d28df5a181619e21bdf748a896322530039)" + ], + "expected_keys": null + } +] From 11a3be74588576bbf20953afed3a2265da3873cd Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Tue, 22 Sep 2026 14:52:10 +0200 Subject: [PATCH 2/5] bip138: clarify MuSig participant eligibility MuSig aggregation hides participant keys, so account xpubs do not need individual trailing derivation. Specify that encryption uses participant roots rather than the aggregate key. Add MuSig2 test vectors: one for a bare aggregate and one for aggregate derivation. --- bip-0138.md | 23 +++++++++++++++-------- bip-0138/test_vectors/recipient_keys.json | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/bip-0138.md b/bip-0138.md index 4bf4eb52..f1f2a268 100644 --- a/bip-0138.md +++ b/bip-0138.md @@ -11,7 +11,7 @@ https://groups.google.com/g/bitcoindev/c/5NgJbpVDgEc/m/TtGK9sF9BgAJ https://github.com/bitcoin/bips/pull/1951 Version: 0.1.2 - Requires: 32, 340, 380, 388, 389 + Requires: 32, 340, 380, 388, 389, 390 ``` ## Introduction @@ -138,8 +138,8 @@ accounts whose xpub was never sent to such a server, such as BIP48 or BIP87 acco ### Descriptor key requirements -Only key expressions of the extended-public-key type with a trailing -derivation step or wildcard contribute to $\{p_1, \dots, p_n\}$. Without +Outside `musig()`, only key expressions of the extended-public-key type with a +trailing derivation step or wildcard contribute to $\{p_1, \dots, p_n\}$. Without that derivation, the xpub's root pubkey, used to seed $s$, would also be the on-chain pubkey of every spend, so observing one spend would let anyone recompute $s$ and decrypt the backup.[^trailing-derivation] The @@ -150,9 +150,9 @@ rule generalizes to any network prefix (`xpub`/`tpub`/`Vpub`/...). a wildcard, breaks the identity between the xpub root pubkey and the on-chain pubkey. Fixed-derivation expressions like `xpub.../0/5` are allowed because the on-chain key (`xpub/0/5`) already differs from the - encryption seed (the xpub root). Literal pubkeys and bare xpubs are - disallowed for the same reason: the literal value is exactly what goes - on-chain, so $s$ would become recoverable from a single observed spend. + encryption seed (the xpub root). Outside `musig()`, literal pubkeys and + bare xpubs are disallowed for the same reason: the literal value is exactly + what goes on-chain, so $s$ would become recoverable from a single observed spend. Allowed forms (origin information `[...]` is optional and orthogonal): @@ -163,11 +163,18 @@ Allowed forms (origin information `[...]` is optional and orthogonal): | `//*` (fixed derivation followed by a wildcard) | `xpub.../0/*` | | `/` (multipath, no wildcard) | `xpub.../<0;1>` | | `//*` (multipath followed by a wildcard) | `xpub.../<0;1>/*` | +| `` (only as a `musig()` participant) | `xpub...` | + +Within a [BIP390](bip-0390.mediawiki) `musig()` expression, participant xpubs +are allowed with or without trailing derivation: the aggregate on-chain key +does not reveal the individual participant keys. For encryption, use each +participant's xpub root rather than the aggregate key. Literal public-key +participants remain excluded. Implementations: -- MUST exclude every other form (literal pubkeys, bare xpubs, ...) from - $\{p_1, \dots, p_n\}$. +- MUST exclude every other form (literal pubkeys, bare xpubs outside `musig()`, + ...) from $\{p_1, \dots, p_n\}$. - MUST refuse to encode a backup if the resulting set is empty. - MUST make the user aware of each excluded expression, since the cosigner holding that key will be unable to decrypt the backup with diff --git a/bip-0138/test_vectors/recipient_keys.json b/bip-0138/test_vectors/recipient_keys.json index de127951..05f4c8f0 100644 --- a/bip-0138/test_vectors/recipient_keys.json +++ b/bip-0138/test_vectors/recipient_keys.json @@ -71,5 +71,25 @@ "pk(04ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b517089e956909c4c07e8529f45f3ff8904d28df5a181619e21bdf748a896322530039)" ], "expected_keys": null + }, + { + "description": "Bare MuSig participant xpubs", + "descriptors": [ + "tr(musig(tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw,tpubDC5FSnBiZDMmhiuCmWAYsLwgLYrrT9rAqvTySfuCCrgsWz8wxMXUS9Tb9iVMvcRbvFcAHGkMD5Kx8koh4GquNGNTfohfk7pgjhaPCdXpoba))" + ], + "expected_keys": [ + "8b42cd4776376c82791b494155151f56c2d7b471e0c7a526a7ce60dd872e3867", + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] + }, + { + "description": "Derivation after MuSig aggregation", + "descriptors": [ + "tr(musig(tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw,tpubDC5FSnBiZDMmhiuCmWAYsLwgLYrrT9rAqvTySfuCCrgsWz8wxMXUS9Tb9iVMvcRbvFcAHGkMD5Kx8koh4GquNGNTfohfk7pgjhaPCdXpoba)/<0;1>/*)" + ], + "expected_keys": [ + "8b42cd4776376c82791b494155151f56c2d7b471e0c7a526a7ce60dd872e3867", + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] } ] From bde776ecb8afc18e0f320d53c6f516105a18d6e8 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Tue, 22 Sep 2026 14:52:10 +0200 Subject: [PATCH 3/5] bip138: collect and deduplicate recipient keys across the backup --- bip-0138.md | 3 ++- bip-0138/test_vectors/recipient_keys.json | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/bip-0138.md b/bip-0138.md index f1f2a268..e44571c3 100644 --- a/bip-0138.md +++ b/bip-0138.md @@ -98,7 +98,8 @@ Note: in the following sections, the operator ⊕ refers to the bitwise XOR oper ### Secret generation -- Let $p_1, p_2, \dots, p_n$, be the public keys in the descriptor/wallet policy, in +- Let $p_1, p_2, \dots, p_n$, be the distinct public keys across all descriptor + and policy sets and all content items in the payload, in increasing lexicographical order. The scheme is defined for any $n \geq 1$, in particular it supports single-signature descriptors ($n = 1$). Each $p_i$ is the x-only-normalized root public key of one *allowed* key expression diff --git a/bip-0138/test_vectors/recipient_keys.json b/bip-0138/test_vectors/recipient_keys.json index 05f4c8f0..5105a7e7 100644 --- a/bip-0138/test_vectors/recipient_keys.json +++ b/bip-0138/test_vectors/recipient_keys.json @@ -91,5 +91,17 @@ "8b42cd4776376c82791b494155151f56c2d7b471e0c7a526a7ce60dd872e3867", "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" ] + }, + { + "description": "Same root in several descriptor sets contributes once", + "descriptors": [ + "tr(tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/0/*)", + "tr(tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/1/*)", + "tr(tpubDC5FSnBiZDMmhiuCmWAYsLwgLYrrT9rAqvTySfuCCrgsWz8wxMXUS9Tb9iVMvcRbvFcAHGkMD5Kx8koh4GquNGNTfohfk7pgjhaPCdXpoba/*)" + ], + "expected_keys": [ + "8b42cd4776376c82791b494155151f56c2d7b471e0c7a526a7ce60dd872e3867", + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] } ] From 299442b7ded6c58c64fce45f6972795a2d9f3109 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Tue, 22 Sep 2026 14:52:10 +0200 Subject: [PATCH 4/5] bip138: exclude roots exposed by another expression A root selected through a derived xpub can also appear bare or as a literal key. Once a spend reveals it, anyone could decrypt the backup. Exclude such cases. --- bip-0138.md | 15 +++++++++----- bip-0138/test_vectors/recipient_keys.json | 24 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/bip-0138.md b/bip-0138.md index e44571c3..39f7739c 100644 --- a/bip-0138.md +++ b/bip-0138.md @@ -114,8 +114,8 @@ hash construction from [BIP340](bip-0340.mediawiki#design). Because $s$ and $s_i$ use distinct domain-separation tags, $s \neq s_i$ and therefore $c_i$ is never the all-zero string. -Keys published on chain are already kept out of $\{p_1, \dots, p_n\}$ by the -[Descriptor key requirements](#descriptor-key-requirements). +The [Descriptor key requirements](#descriptor-key-requirements) exclude +keys exposed by literal or bare-xpub expressions in the backed-up scripts. Implementations MUST exclude the key with x coordinate `50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0` (the BIP341 NUMS point). Applications MAY exclude any further key they know to be public. @@ -172,14 +172,19 @@ does not reveal the individual participant keys. For encryption, use each participant's xpub root rather than the aggregate key. Literal public-key participants remain excluded. +A candidate root MUST be excluded if its x-coordinate matches a literal key +or a bare xpub root used outside `musig()` in any descriptor or resolved +policy in the payload. For example, +`wsh(or_i(pk(X/0/*),pk(X)))` exposes the root of xpub `X` on spending, so that +root must be excluded even though `X/0/*` is otherwise eligible. + Implementations: - MUST exclude every other form (literal pubkeys, bare xpubs outside `musig()`, ...) from $\{p_1, \dots, p_n\}$. - MUST refuse to encode a backup if the resulting set is empty. -- MUST make the user aware of each excluded expression, since the - cosigner holding that key will be unable to decrypt the backup with - their key. +- MUST make the user aware of each excluded expression and candidate root, + since its holder may be unable to decrypt the backup with that key. ### Key Normalization diff --git a/bip-0138/test_vectors/recipient_keys.json b/bip-0138/test_vectors/recipient_keys.json index 5105a7e7..f12adb0b 100644 --- a/bip-0138/test_vectors/recipient_keys.json +++ b/bip-0138/test_vectors/recipient_keys.json @@ -103,5 +103,29 @@ "8b42cd4776376c82791b494155151f56c2d7b471e0c7a526a7ce60dd872e3867", "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" ] + }, + { + "description": "Root used both bare and derived is excluded", + "descriptors": [ + "wsh(or_i(pk(tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/0/*),pk(tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw)))" + ], + "expected_keys": null + }, + { + "description": "Xpub root (03ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708) excluded by an opposite-parity literal in another descriptor set", + "descriptors": [ + "tr(tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw/*)", + "wpkh(02ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708)" + ], + "expected_keys": null + }, + { + "description": "MuSig participant exposed in a script leaf", + "descriptors": [ + "tr(musig(tpubDC5FSnBiZDMmhiuCmWAYsLwgLYrrT9rAqvTySfuCCrgsWz8wxMXUS9Tb9iVMvcRbvFcAHGkMD5Kx8koh4GquNGNTfohfk7pgjhaPCdXpoba,tpubDEPBvXvhta3pjVaKokqC3eeMQnszj9ehFaA2zD5nSdkaccwGAizu8jVB2NeSpvmP2P52MBoZvNCixqXRJnTyXx51FQzARR63tjxQSyP3Btw)/0/*,pk(tpubDC5FSnBiZDMmhiuCmWAYsLwgLYrrT9rAqvTySfuCCrgsWz8wxMXUS9Tb9iVMvcRbvFcAHGkMD5Kx8koh4GquNGNTfohfk7pgjhaPCdXpoba))" + ], + "expected_keys": [ + "ebd252ca0877aae09b9d058219682775aa3cbcd049c12f07832f2cf6a3b51708" + ] } ] From 346008db8943cb90c1e091eaac8277066d4dbee7 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Wed, 23 Sep 2026 13:10:00 +0200 Subject: [PATCH 5/5] bip138: record recipients clarifications in changelog --- bip-0138.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bip-0138.md b/bip-0138.md index 39f7739c..0801acc8 100644 --- a/bip-0138.md +++ b/bip-0138.md @@ -10,7 +10,7 @@ Discussion: https://delvingbitcoin.org/t/a-simple-backup-scheme-for-wallet-accounts/1607 https://groups.google.com/g/bitcoindev/c/5NgJbpVDgEc/m/TtGK9sF9BgAJ https://github.com/bitcoin/bips/pull/1951 - Version: 0.1.2 + Version: 0.1.3 Requires: 32, 340, 380, 388, 389, 390 ``` @@ -649,6 +649,10 @@ their reviews and suggestions. ## Changelog +* __0.1.3__ (2026-09-24): + * Rename, generalize and expand the key-selection test vectors. + * Clarify MuSig participant eligibility and recipient selection across the payload. + * Exclude roots exposed by another key expression. * __0.1.2__ (2026-09-24): * Specify empty AEAD associated data. * Clarify that `0x00` ends payload parsing and add test vectors.