@bitcoinerlab/descriptors 3.0.5 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/signers.d.ts DELETED
@@ -1,84 +0,0 @@
1
- import type { Psbt } from 'bitcoinjs-lib';
2
- import type { ECPairInterface } from 'ecpair';
3
- import type { BIP32Interface } from 'bip32';
4
- import { LedgerManager } from './ledger';
5
- /**
6
- * Signs a specific input of a PSBT with an ECPair.
7
- *
8
- * Unlike bitcoinjs-lib's native `psbt.signInput()`, this function automatically detects
9
- * if the input is a Taproot input and internally tweaks the key if needed.
10
- *
11
- * This behavior matches how `signInputBIP32` works, where the BIP32 node is automatically
12
- * tweaked for Taproot inputs. In contrast, bitcoinjs-lib's native implementation requires
13
- * manual pre-tweaking of ECPair signers for Taproot inputs.
14
- *
15
- * @see https://github.com/bitcoinjs/bitcoinjs-lib/pull/2137#issuecomment-2713264848
16
- *
17
- * @param {Object} params - The parameters object
18
- * @param {Psbt} params.psbt - The PSBT to sign
19
- * @param {number} params.index - The input index to sign
20
- * @param {ECPairInterface} params.ecpair - The ECPair to sign with
21
- */
22
- export declare function signInputECPair({ psbt, index, ecpair }: {
23
- psbt: Psbt;
24
- index: number;
25
- ecpair: ECPairInterface;
26
- }): void;
27
- /**
28
- * Signs all inputs of a PSBT with an ECPair.
29
- *
30
- * This function improves upon bitcoinjs-lib's native `psbt.signAllInputs()` by automatically
31
- * handling Taproot inputs. For each input, it detects if it's a Taproot input and internally
32
- * tweaks the key if needed.
33
- *
34
- * This creates consistency with the BIP32 signing methods (`signBIP32`/`signInputBIP32`),
35
- * which also automatically handle key tweaking for Taproot inputs. In contrast, bitcoinjs-lib's
36
- * native implementation requires users to manually pre-tweak ECPair signers for Taproot inputs.
37
- *
38
- * With this implementation, you can use a single ECPair to sign both Taproot and non-Taproot
39
- * inputs in the same PSBT, similar to how `signBIP32` allows using a common node for both types.
40
- *
41
- * @see https://github.com/bitcoinjs/bitcoinjs-lib/pull/2137#issuecomment-2713264848
42
- *
43
- * @param {Object} params - The parameters object
44
- * @param {Psbt} params.psbt - The PSBT to sign
45
- * @param {ECPairInterface} params.ecpair - The ECPair to sign with
46
- */
47
- export declare function signECPair({ psbt, ecpair }: {
48
- psbt: Psbt;
49
- ecpair: ECPairInterface;
50
- }): void;
51
- export declare function signInputBIP32({ psbt, index, node }: {
52
- psbt: Psbt;
53
- index: number;
54
- node: BIP32Interface;
55
- }): void;
56
- export declare function signBIP32({ psbt, masterNode }: {
57
- psbt: Psbt;
58
- masterNode: BIP32Interface;
59
- }): void;
60
- /**
61
- * Signs an input of the `psbt` where the keys are controlled by a Ledger
62
- * device.
63
- *
64
- * The function will throw an error if it's unable to sign the input.
65
- */
66
- export declare function signInputLedger({ psbt, index, ledgerManager }: {
67
- psbt: Psbt;
68
- index: number;
69
- ledgerManager: LedgerManager;
70
- }): Promise<void>;
71
- /**
72
- * Signs the inputs of the `psbt` where the keys are controlled by a Ledger
73
- * device.
74
- *
75
- * `signLedger` can sign multiple inputs of the same wallet policy in a single
76
- * pass by grouping inputs by their wallet policy type before the signing
77
- * process.
78
- *
79
- * The function will throw an error if it's unable to sign any input.
80
- */
81
- export declare function signLedger({ psbt, ledgerManager }: {
82
- psbt: Psbt;
83
- ledgerManager: LedgerManager;
84
- }): Promise<void>;
package/dist/signers.js DELETED
@@ -1,215 +0,0 @@
1
- "use strict";
2
- // Copyright (c) 2025 Jose-Luis Landabaso - https://bitcoinerlab.com
3
- // Distributed under the MIT software license
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.signInputECPair = signInputECPair;
6
- exports.signECPair = signECPair;
7
- exports.signInputBIP32 = signInputBIP32;
8
- exports.signBIP32 = signBIP32;
9
- exports.signInputLedger = signInputLedger;
10
- exports.signLedger = signLedger;
11
- const bitcoinjs_lib_internals_1 = require("./bitcoinjs-lib-internals");
12
- const ledger_1 = require("./ledger");
13
- const applyPR2137_1 = require("./applyPR2137");
14
- function range(n) {
15
- return [...Array(n).keys()];
16
- }
17
- /**
18
- * Signs a specific input of a PSBT with an ECPair.
19
- *
20
- * Unlike bitcoinjs-lib's native `psbt.signInput()`, this function automatically detects
21
- * if the input is a Taproot input and internally tweaks the key if needed.
22
- *
23
- * This behavior matches how `signInputBIP32` works, where the BIP32 node is automatically
24
- * tweaked for Taproot inputs. In contrast, bitcoinjs-lib's native implementation requires
25
- * manual pre-tweaking of ECPair signers for Taproot inputs.
26
- *
27
- * @see https://github.com/bitcoinjs/bitcoinjs-lib/pull/2137#issuecomment-2713264848
28
- *
29
- * @param {Object} params - The parameters object
30
- * @param {Psbt} params.psbt - The PSBT to sign
31
- * @param {number} params.index - The input index to sign
32
- * @param {ECPairInterface} params.ecpair - The ECPair to sign with
33
- */
34
- function signInputECPair({ psbt, index, ecpair }) {
35
- //psbt.signInput(index, ecpair); <- Replaced for the code below
36
- //that can handle taproot inputs automatically.
37
- //See https://github.com/bitcoinjs/bitcoinjs-lib/pull/2137#issuecomment-2713264848
38
- const input = psbt.data.inputs[index];
39
- if (!input)
40
- throw new Error('Invalid index');
41
- if ((0, bitcoinjs_lib_internals_1.isTaprootInput)(input)) {
42
- // If script-path (tapLeafScript present) -> DO NOT TWEAK
43
- if (input.tapLeafScript && input.tapLeafScript.length > 0)
44
- psbt.signInput(index, ecpair);
45
- else {
46
- const hash = (0, bitcoinjs_lib_internals_1.tapTweakHash)(ecpair.publicKey.slice(1, 33), undefined);
47
- const tweakedEcpair = ecpair.tweak(hash);
48
- psbt.signInput(index, tweakedEcpair);
49
- }
50
- }
51
- else
52
- psbt.signInput(index, ecpair);
53
- }
54
- /**
55
- * Signs all inputs of a PSBT with an ECPair.
56
- *
57
- * This function improves upon bitcoinjs-lib's native `psbt.signAllInputs()` by automatically
58
- * handling Taproot inputs. For each input, it detects if it's a Taproot input and internally
59
- * tweaks the key if needed.
60
- *
61
- * This creates consistency with the BIP32 signing methods (`signBIP32`/`signInputBIP32`),
62
- * which also automatically handle key tweaking for Taproot inputs. In contrast, bitcoinjs-lib's
63
- * native implementation requires users to manually pre-tweak ECPair signers for Taproot inputs.
64
- *
65
- * With this implementation, you can use a single ECPair to sign both Taproot and non-Taproot
66
- * inputs in the same PSBT, similar to how `signBIP32` allows using a common node for both types.
67
- *
68
- * @see https://github.com/bitcoinjs/bitcoinjs-lib/pull/2137#issuecomment-2713264848
69
- *
70
- * @param {Object} params - The parameters object
71
- * @param {Psbt} params.psbt - The PSBT to sign
72
- * @param {ECPairInterface} params.ecpair - The ECPair to sign with
73
- */
74
- function signECPair({ psbt, ecpair }) {
75
- //psbt.signAllInputs(ecpair); <- replaced for the code below that handles
76
- //taptoot automatically.
77
- //See https://github.com/bitcoinjs/bitcoinjs-lib/pull/2137#issuecomment-2713264848
78
- const results = [];
79
- for (const index of range(psbt.data.inputs.length)) {
80
- try {
81
- signInputECPair({ psbt, index, ecpair });
82
- results.push(true);
83
- }
84
- catch (err) {
85
- void err;
86
- results.push(false);
87
- }
88
- }
89
- if (results.every(v => v === false)) {
90
- throw new Error('No inputs were signed');
91
- }
92
- }
93
- function signInputBIP32({ psbt, index, node }) {
94
- (0, applyPR2137_1.applyPR2137)(psbt);
95
- psbt.signInputHD(index, node);
96
- }
97
- function signBIP32({ psbt, masterNode }) {
98
- (0, applyPR2137_1.applyPR2137)(psbt);
99
- psbt.signAllInputsHD(masterNode);
100
- }
101
- const ledgerSignaturesForInputIndex = (index, ledgerSignatures) => ledgerSignatures
102
- .filter(([i]) => i === index)
103
- .map(([_i, partialSignature]) => partialSignature);
104
- function addLedgerSignaturesToInput({ psbt, index, ledgerSignatures }) {
105
- const input = psbt.data.inputs[index];
106
- if (!input)
107
- throw new Error(`Error: input ${index} not available`);
108
- const signatures = ledgerSignaturesForInputIndex(index, ledgerSignatures);
109
- if (signatures.length === 0)
110
- throw new Error(`Error: no ledger signatures found for input ${index}`);
111
- if ((0, bitcoinjs_lib_internals_1.isTaprootInput)(input)) {
112
- // Ledger returns per-input signatures as [pubkey, signature, tapleafHash?].
113
- // For taproot we must map them to PSBT taproot fields (not partialSig):
114
- // - signatures with tapleafHash -> tapScriptSig[] (script-path)
115
- // - signature without tapleafHash -> tapKeySig (key-path)
116
- // A taproot input may contain script-path signatures, key-path signature,
117
- // or both in edge cases; each must be written to its corresponding field.
118
- const tapScriptSig = signatures
119
- .filter((sig) => sig.tapleafHash)
120
- .map((sig) => ({
121
- pubkey: sig.pubkey,
122
- signature: sig.signature,
123
- leafHash: sig.tapleafHash
124
- }));
125
- const tapKeySigs = signatures.filter((sig) => !sig.tapleafHash);
126
- if (tapScriptSig.length > 0) {
127
- psbt.updateInput(index, { tapScriptSig });
128
- }
129
- if (tapKeySigs.length > 1)
130
- throw new Error(`Error: expected at most one tapKeySig for input ${index}`);
131
- const tapKeySig = tapKeySigs[0]?.signature;
132
- if (tapKeySig) {
133
- psbt.updateInput(index, { tapKeySig });
134
- }
135
- if (tapScriptSig.length === 0 && !tapKeySig)
136
- throw new Error(`Error: no valid taproot ledger signatures found for input ${index}`);
137
- }
138
- else {
139
- const partialSig = signatures.map((sig) => ({
140
- pubkey: sig.pubkey,
141
- signature: sig.signature
142
- }));
143
- psbt.updateInput(index, { partialSig });
144
- }
145
- }
146
- async function signInputLedger({ psbt, index, ledgerManager }) {
147
- const { ledgerClient } = ledgerManager;
148
- const { DefaultWalletPolicy, WalletPolicy, AppClient } = (await (0, ledger_1.importAndValidateLedgerBitcoin)(ledgerClient));
149
- if (!(ledgerClient instanceof AppClient))
150
- throw new Error(`Error: pass a valid ledgerClient`);
151
- const policy = await (0, ledger_1.ledgerPolicyFromPsbtInput)({
152
- psbt,
153
- index,
154
- ledgerManager
155
- });
156
- if (!policy)
157
- throw new Error(`Error: the ledger cannot sign this pstb input`);
158
- let ledgerSignatures;
159
- if (policy.policyName && policy.policyHmac && policy.policyId) {
160
- //non-standard policy
161
- const walletPolicy = new WalletPolicy(policy.policyName, policy.ledgerTemplate, policy.keyRoots);
162
- const walletHmac = policy.policyHmac;
163
- ledgerSignatures = await ledgerClient.signPsbt(psbt.toBase64(), walletPolicy, walletHmac);
164
- }
165
- else {
166
- //standard policy
167
- ledgerSignatures = await ledgerClient.signPsbt(psbt.toBase64(), new DefaultWalletPolicy(policy.ledgerTemplate, policy.keyRoots[0]), null);
168
- }
169
- addLedgerSignaturesToInput({ psbt, index, ledgerSignatures });
170
- }
171
- async function signLedger({ psbt, ledgerManager }) {
172
- const { ledgerClient } = ledgerManager;
173
- const { DefaultWalletPolicy, WalletPolicy, AppClient } = (await (0, ledger_1.importAndValidateLedgerBitcoin)(ledgerClient));
174
- if (!(ledgerClient instanceof AppClient))
175
- throw new Error(`Error: pass a valid ledgerClient`);
176
- const ledgerPolicies = [];
177
- for (let index = 0; index < psbt.data.inputs.length; index++) {
178
- const policy = await (0, ledger_1.ledgerPolicyFromPsbtInput)({
179
- psbt,
180
- index,
181
- ledgerManager
182
- });
183
- if (policy)
184
- ledgerPolicies.push(policy);
185
- }
186
- if (ledgerPolicies.length === 0)
187
- throw new Error(`Error: there are no inputs which could be signed`);
188
- //cluster unique LedgerPolicies
189
- const uniquePolicies = [];
190
- for (const policy of ledgerPolicies) {
191
- if (!uniquePolicies.find((uniquePolicy) => (0, ledger_1.comparePolicies)(uniquePolicy, policy)))
192
- uniquePolicies.push(policy);
193
- }
194
- for (const uniquePolicy of uniquePolicies) {
195
- let ledgerSignatures;
196
- if (uniquePolicy.policyName &&
197
- uniquePolicy.policyHmac &&
198
- uniquePolicy.policyId) {
199
- //non-standard policy
200
- const walletPolicy = new WalletPolicy(uniquePolicy.policyName, uniquePolicy.ledgerTemplate, uniquePolicy.keyRoots);
201
- const walletHmac = uniquePolicy.policyHmac;
202
- ledgerSignatures = await ledgerClient.signPsbt(psbt.toBase64(), walletPolicy, walletHmac);
203
- }
204
- else {
205
- //standard policy
206
- ledgerSignatures = await ledgerClient.signPsbt(psbt.toBase64(), new DefaultWalletPolicy(uniquePolicy.ledgerTemplate, uniquePolicy.keyRoots[0]), null);
207
- }
208
- const signedIndexes = [
209
- ...new Set(ledgerSignatures.map(([index]) => index))
210
- ];
211
- for (const index of signedIndexes) {
212
- addLedgerSignaturesToInput({ psbt, index, ledgerSignatures });
213
- }
214
- }
215
- }
@@ -1,215 +0,0 @@
1
- import { Network } from 'bitcoinjs-lib';
2
- import type { BIP32API } from 'bip32';
3
- import type { ECPairAPI } from 'ecpair';
4
- import type { PartialSig, TapBip32Derivation } from 'bip174';
5
- import type { Taptree } from 'bitcoinjs-lib/src/cjs/types';
6
- import type { ExpansionMap, KeyInfo, Preimage, TimeConstraints } from './types';
7
- import type { TapLeafInfo, TapTreeInfoNode, TapTreeNode } from './tapTree';
8
- export type TapLeafExpansionOverride = {
9
- expandedExpression: string;
10
- expansionMap: ExpansionMap;
11
- tapScript: Uint8Array;
12
- };
13
- export type TaprootLeafSatisfaction = {
14
- leaf: TapLeafInfo;
15
- depth: number;
16
- tapLeafHash: Uint8Array;
17
- scriptSatisfaction: Uint8Array;
18
- stackItems: Uint8Array[];
19
- nLockTime: number | undefined;
20
- nSequence: number | undefined;
21
- totalWitnessSize: number;
22
- };
23
- export type TaprootPsbtLeafMetadata = {
24
- leaf: TapLeafInfo;
25
- depth: number;
26
- tapLeafHash: Uint8Array;
27
- controlBlock: Uint8Array;
28
- };
29
- /**
30
- * Compiles a taproot miniscript tree into per-leaf metadata.
31
- * Each leaf contains expanded expression metadata, key expansion map,
32
- * compiled tapscript and leaf version. This keeps the taproot script-path data
33
- * ready for satisfactions and witness building.
34
- *
35
- * `leafExpansionOverride` allows descriptor-level script expressions to provide:
36
- * - user-facing expanded expression metadata (for selector/template use), and
37
- * - custom expansion map and tapscript bytes for compilation.
38
- *
39
- * Example: sortedmulti_a can expose `expandedExpression=sortedmulti_a(...)`
40
- * while providing a tapscript already compiled.
41
- */
42
- export declare function buildTapTreeInfo({ tapTree, network, BIP32, ECPair, leafExpansionOverride }: {
43
- tapTree: TapTreeNode;
44
- network?: Network;
45
- BIP32: BIP32API;
46
- ECPair: ECPairAPI;
47
- leafExpansionOverride: (expression: string) => TapLeafExpansionOverride | undefined;
48
- }): TapTreeInfoNode;
49
- export declare function tapTreeInfoToScriptTree(tapTreeInfo: TapTreeInfoNode): Taptree;
50
- /**
51
- * Builds taproot PSBT leaf metadata for every leaf in a `tapTreeInfo`.
52
- *
53
- * For each leaf, this function computes:
54
- * - `tapLeafHash`: BIP341 leaf hash of tapscript + leaf version
55
- * - `depth`: leaf depth in the tree (root children have depth 1)
56
- * - `controlBlock`: script-path proof used in PSBT `tapLeafScript`
57
- *
58
- * The control block layout is:
59
- *
60
- * ```text
61
- * [1-byte (leafVersion | parity)] [32-byte internal key]
62
- * [32-byte sibling hash #1] ... [32-byte sibling hash #N]
63
- * ```
64
- *
65
- * where:
66
- * - `parity` is derived from tweaking the internal key with the tree root
67
- * - sibling hashes are the merkle path from that leaf to the root
68
- *
69
- * Example tree:
70
- *
71
- * ```text
72
- * root
73
- * / \
74
- * L1 L2
75
- * / \
76
- * L3 L4
77
- * ```
78
- *
79
- * Depths:
80
- * - L1 depth = 1
81
- * - L3 depth = 2
82
- * - L4 depth = 2
83
- *
84
- * Conceptual output:
85
- *
86
- * ```text
87
- * [
88
- * L1 -> { depth: 1, tapLeafHash: h1, controlBlock: [v|p, ik, hash(L2)] }
89
- * L3 -> { depth: 2, tapLeafHash: h3, controlBlock: [v|p, ik, hash(L4), hash(L1)] }
90
- * L4 -> { depth: 2, tapLeafHash: h4, controlBlock: [v|p, ik, hash(L3), hash(L1)] }
91
- * ]
92
- * ```
93
- *
94
- * Legend:
95
- * - `ik`: the 32-byte internal key placed in the control block.
96
- * - `hash(X)`: the merkle sibling hash at each level when proving leaf `X`.
97
- *
98
- * Note: in this diagram, `L2` is a branch node (right subtree), not a leaf,
99
- * so `hash(L2) = TapBranch(hash(L3), hash(L4))`.
100
- *
101
- * Notes:
102
- * - Leaves are returned in deterministic left-first order.
103
- * - One metadata entry is returned per leaf.
104
- * - `controlBlock.length === 33 + 32 * depth`.
105
- * - Throws if internal key is invalid or merkle path cannot be found.
106
- *
107
- * Typical usage:
108
- * - Convert this metadata into PSBT `tapLeafScript[]` entries
109
- * for all leaves.
110
- */
111
- export declare function buildTaprootLeafPsbtMetadata({ tapTreeInfo, internalPubkey }: {
112
- tapTreeInfo: TapTreeInfoNode;
113
- internalPubkey: Uint8Array;
114
- }): TaprootPsbtLeafMetadata[];
115
- /**
116
- * Builds PSBT `tapBip32Derivation` entries for taproot script-path spends.
117
- *
118
- * Leaf keys include the list of tapleaf hashes where they appear.
119
- * If `internalKeyInfo` has derivation data, it is included with empty
120
- * `leafHashes`.
121
- *
122
- * Example tree:
123
- *
124
- * ```text
125
- * root
126
- * / \
127
- * L1 L2
128
- *
129
- * L1 uses key A
130
- * L2 uses key A and key B
131
- *
132
- * h1 = tapleafHash(L1)
133
- * h2 = tapleafHash(L2)
134
- * ```
135
- *
136
- * Then output is conceptually:
137
- *
138
- * ```text
139
- * [
140
- * key A -> leafHashes [h1, h2]
141
- * key B -> leafHashes [h2]
142
- * internal key -> leafHashes []
143
- * ]
144
- * ```
145
- *
146
- * Notes:
147
- * - Keys missing `masterFingerprint` or `path` are skipped.
148
- * - Duplicate pubkeys are merged.
149
- * - If the same pubkey appears with conflicting derivation metadata,
150
- * this function throws.
151
- * - Output and `leafHashes` are sorted deterministically.
152
- */
153
- export declare function buildTaprootBip32Derivations({ tapTreeInfo, internalKeyInfo }: {
154
- tapTreeInfo: TapTreeInfoNode;
155
- internalKeyInfo?: KeyInfo;
156
- }): TapBip32Derivation[];
157
- export declare function normalizeTaprootPubkey(pubkey: Uint8Array): Uint8Array;
158
- /**
159
- * Compiles an expanded `sortedmulti_a(...)` leaf expression to its internal
160
- * `multi_a(...)` form by sorting placeholders using the resolved pubkeys from
161
- * `expansionMap`.
162
- */
163
- export declare function compileSortedMultiAExpandedExpression({ expandedExpression, expansionMap }: {
164
- expandedExpression: string;
165
- expansionMap: ExpansionMap;
166
- }): string;
167
- /**
168
- * Computes satisfactions for taproot script-path leaves.
169
- *
170
- * If `tapLeaf` is undefined, all satisfiable leaves are returned. If `tapLeaf`
171
- * is provided, only that leaf is considered.
172
- *
173
- * Callers are expected to pass real signatures, or fake signatures generated
174
- * during planning. See satisfyMiniscript() for how timeConstraints keep the
175
- * chosen leaf consistent between planning and signing.
176
- */
177
- export declare function collectTaprootLeafSatisfactions({ tapTreeInfo, preimages, signatures, timeConstraints, tapLeaf }: {
178
- tapTreeInfo: TapTreeInfoNode;
179
- preimages: Preimage[];
180
- signatures: PartialSig[];
181
- timeConstraints?: TimeConstraints;
182
- tapLeaf?: Uint8Array | string;
183
- }): TaprootLeafSatisfaction[];
184
- /**
185
- * Selects the taproot leaf satisfaction with the smallest total witness size.
186
- * Assumes the input list is in left-first tree order for deterministic ties.
187
- */
188
- export declare function selectBestTaprootLeafSatisfaction(satisfactions: TaprootLeafSatisfaction[]): TaprootLeafSatisfaction;
189
- /**
190
- * Collects a unique set of taproot leaf pubkeys (x-only) across the tree.
191
- * This is useful for building fake signatures when no signer subset is given.
192
- */
193
- export declare function collectTapTreePubkeys(tapTreeInfo: TapTreeInfoNode): Uint8Array[];
194
- /**
195
- * Returns the best satisfaction for a taproot tree, by witness size.
196
- *
197
- * If `tapLeaf` is provided, only that leaf is considered. If `tapLeaf` is a
198
- * bytes, it is treated as a tapLeafHash and must match exactly one leaf. If
199
- * `tapLeaf` is a string, it is treated as a raw leaf expression and must
200
- * match exactly one leaf (whitespace-insensitive).
201
- *
202
- * This function is typically called twice:
203
- * 1) Planning pass: call it with fake signatures (built by the caller) to
204
- * choose the best leaf without requiring user signatures.
205
- * 2) Signing pass: call it again with real signatures and the timeConstraints
206
- * returned from the first pass (see satisfyMiniscript() for why this keeps
207
- * the chosen leaf consistent between planning and signing).
208
- */
209
- export declare function satisfyTapTree({ tapTreeInfo, signatures, preimages, tapLeaf, timeConstraints }: {
210
- tapTreeInfo: TapTreeInfoNode;
211
- signatures: PartialSig[];
212
- preimages: Preimage[];
213
- tapLeaf?: Uint8Array | string;
214
- timeConstraints?: TimeConstraints;
215
- }): TaprootLeafSatisfaction;