@dynamic-labs-wallet/node-btc 1.0.106 → 1.0.107

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/index.cjs CHANGED
@@ -304,6 +304,14 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
304
304
  * Only inputs belonging to the account address are signed. Supports both TAPROOT
305
305
  * (BIP-341) and Native SegWit (BIP-143) signing methods.
306
306
  *
307
+ * ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
308
+ * hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
309
+ * is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
310
+ * commitment, and is a canonical multisig containing this wallet's public key.
311
+ * Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
312
+ * PSBT carries this wallet's partialSig and is NOT finalized — remaining
313
+ * co-signers add their signatures before finalizing.
314
+ *
307
315
  * @param transaction - The PSBT to sign as a base64 string
308
316
  * @param accountAddress - The account address (must match inputs to be signed)
309
317
  * @param network - The Bitcoin network (MAINNET or TESTNET)
@@ -313,7 +321,7 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
313
321
  * @param onError - Optional. Error callback function
314
322
  * @returns Promise resolving to the signed PSBT as a base64 string
315
323
  * @throws Error if required parameters are missing, no inputs belong to account address, or signing fails
316
- */ async signTransaction({ transaction, walletMetadata, network, password = undefined, externalServerKeyShares, context, onError, signingIndexes, allowedSighash }) {
324
+ */ async signTransaction({ transaction, walletMetadata, network, password = undefined, externalServerKeyShares, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
317
325
  const { accountAddress } = walletMetadata;
318
326
  try {
319
327
  if (!accountAddress) {
@@ -345,24 +353,21 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
345
353
  }
346
354
  const pubKey = btcUtils.normalizePublicKey(derivedPublicKey, addressType);
347
355
  const tx = psbt.__CACHE.__TX;
348
- // Filter inputs to only sign those that belong to the current address
356
+ const isTaproot = addressType === core.BitcoinAddressType.TAPROOT;
357
+ // Filter inputs to only sign those that belong to the current address.
358
+ // P2WSH (multisig) inputs are opt-in: matched only when the caller
359
+ // allowlisted the witnessScript and it contains this wallet's key —
360
+ // ECDSA wallets only.
361
+ const walletPubKey = isTaproot ? undefined : pubKey;
362
+ const p2wshAllowlist = isTaproot ? undefined : allowedWitnessScripts;
349
363
  let inputsToSign = psbt.data.inputs.map((input, i)=>({
350
364
  input,
351
365
  index: i
352
- })).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, accountAddress, network));
353
- if (signingIndexes == null ? void 0 : signingIndexes.length) {
354
- const walletOwnedIndexSet = new Set(inputsToSign.map(({ index })=>index));
355
- const invalidIndexes = signingIndexes.filter((i)=>!walletOwnedIndexSet.has(i));
356
- if (invalidIndexes.length > 0) {
357
- throw new Error(`signingIndexes contains indexes that do not belong to the signing address: ${invalidIndexes.join(', ')}`);
358
- }
359
- const requestedIndexSet = new Set(signingIndexes);
360
- inputsToSign = inputsToSign.filter(({ index })=>requestedIndexSet.has(index));
361
- }
366
+ })).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, accountAddress, network, walletPubKey, p2wshAllowlist));
367
+ inputsToSign = btcUtils.filterInputsBySigningIndexes(inputsToSign, signingIndexes);
362
368
  if (inputsToSign.length === 0) {
363
369
  throw new Error('No inputs found that belong to the account address');
364
370
  }
365
- const isTaproot = addressType === core.BitcoinAddressType.TAPROOT;
366
371
  btcUtils.assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
367
372
  if (isTaproot) {
368
373
  const tweak = btcUtils.calculateTaprootTweak(pubKey);
@@ -410,14 +415,9 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
410
415
  throw new Error(`Input ${i} missing witnessUtxo`);
411
416
  }
412
417
  const { script, value } = input.witnessUtxo;
413
- const p2pkh = bitcoin__namespace.payments.p2pkh({
414
- hash: script.slice(2),
415
- network: btcUtils.getBitcoinNetwork(network)
416
- });
417
- const scriptCode = p2pkh.output;
418
- if (!scriptCode) {
419
- throw new Error('Failed to generate scriptCode');
420
- }
418
+ // Shared with extractPsbtSighashes; re-verifies the P2WSH
419
+ // commitment at the signer, independent of the ownership filter.
420
+ const scriptCode = btcUtils.getSegwitV0ScriptCode(input, script, i, btcUtils.getBitcoinNetwork(network));
421
421
  const sigHashType = btcUtils.getSigHashType(input, false);
422
422
  const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
423
423
  const signature = await this.sign({
package/index.esm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createLogError, DynamicWalletClient, getMPCChainConfig, WalletOperation } from '@dynamic-labs-wallet/node';
2
2
  import { BitcoinNetwork, BitcoinAddressType } from '@dynamic-labs-wallet/core';
3
- import { initEccLib, normalizePublicKey, publicKeyToBitcoinAddress, getAddressTypeFromDerivationPath, extractPublicKeyHex, calculateBip322Hash, calculateTaprootTweak, encodeBip322Signature, doesInputBelongToAddress, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getBitcoinNetwork, convertSignatureToDER, privateKeyToWIF, wifToPrivateKey, getPublicKeyFromPrivateKey } from '@dynamic-labs-wallet/btc-utils';
3
+ import { initEccLib, normalizePublicKey, publicKeyToBitcoinAddress, getAddressTypeFromDerivationPath, extractPublicKeyHex, calculateBip322Hash, calculateTaprootTweak, encodeBip322Signature, doesInputBelongToAddress, filterInputsBySigningIndexes, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getSegwitV0ScriptCode, getBitcoinNetwork, convertSignatureToDER, privateKeyToWIF, wifToPrivateKey, getPublicKeyFromPrivateKey } from '@dynamic-labs-wallet/btc-utils';
4
4
  import * as bitcoin from 'bitcoinjs-lib';
5
5
  import * as ecc from 'tiny-secp256k1';
6
6
 
@@ -282,6 +282,14 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
282
282
  * Only inputs belonging to the account address are signed. Supports both TAPROOT
283
283
  * (BIP-341) and Native SegWit (BIP-143) signing methods.
284
284
  *
285
+ * ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
286
+ * hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
287
+ * is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
288
+ * commitment, and is a canonical multisig containing this wallet's public key.
289
+ * Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
290
+ * PSBT carries this wallet's partialSig and is NOT finalized — remaining
291
+ * co-signers add their signatures before finalizing.
292
+ *
285
293
  * @param transaction - The PSBT to sign as a base64 string
286
294
  * @param accountAddress - The account address (must match inputs to be signed)
287
295
  * @param network - The Bitcoin network (MAINNET or TESTNET)
@@ -291,7 +299,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
291
299
  * @param onError - Optional. Error callback function
292
300
  * @returns Promise resolving to the signed PSBT as a base64 string
293
301
  * @throws Error if required parameters are missing, no inputs belong to account address, or signing fails
294
- */ async signTransaction({ transaction, walletMetadata, network, password = undefined, externalServerKeyShares, context, onError, signingIndexes, allowedSighash }) {
302
+ */ async signTransaction({ transaction, walletMetadata, network, password = undefined, externalServerKeyShares, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
295
303
  const { accountAddress } = walletMetadata;
296
304
  try {
297
305
  if (!accountAddress) {
@@ -323,24 +331,21 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
323
331
  }
324
332
  const pubKey = normalizePublicKey(derivedPublicKey, addressType);
325
333
  const tx = psbt.__CACHE.__TX;
326
- // Filter inputs to only sign those that belong to the current address
334
+ const isTaproot = addressType === BitcoinAddressType.TAPROOT;
335
+ // Filter inputs to only sign those that belong to the current address.
336
+ // P2WSH (multisig) inputs are opt-in: matched only when the caller
337
+ // allowlisted the witnessScript and it contains this wallet's key —
338
+ // ECDSA wallets only.
339
+ const walletPubKey = isTaproot ? undefined : pubKey;
340
+ const p2wshAllowlist = isTaproot ? undefined : allowedWitnessScripts;
327
341
  let inputsToSign = psbt.data.inputs.map((input, i)=>({
328
342
  input,
329
343
  index: i
330
- })).filter(({ input })=>doesInputBelongToAddress(input, accountAddress, network));
331
- if (signingIndexes == null ? void 0 : signingIndexes.length) {
332
- const walletOwnedIndexSet = new Set(inputsToSign.map(({ index })=>index));
333
- const invalidIndexes = signingIndexes.filter((i)=>!walletOwnedIndexSet.has(i));
334
- if (invalidIndexes.length > 0) {
335
- throw new Error(`signingIndexes contains indexes that do not belong to the signing address: ${invalidIndexes.join(', ')}`);
336
- }
337
- const requestedIndexSet = new Set(signingIndexes);
338
- inputsToSign = inputsToSign.filter(({ index })=>requestedIndexSet.has(index));
339
- }
344
+ })).filter(({ input })=>doesInputBelongToAddress(input, accountAddress, network, walletPubKey, p2wshAllowlist));
345
+ inputsToSign = filterInputsBySigningIndexes(inputsToSign, signingIndexes);
340
346
  if (inputsToSign.length === 0) {
341
347
  throw new Error('No inputs found that belong to the account address');
342
348
  }
343
- const isTaproot = addressType === BitcoinAddressType.TAPROOT;
344
349
  assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
345
350
  if (isTaproot) {
346
351
  const tweak = calculateTaprootTweak(pubKey);
@@ -388,14 +393,9 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
388
393
  throw new Error(`Input ${i} missing witnessUtxo`);
389
394
  }
390
395
  const { script, value } = input.witnessUtxo;
391
- const p2pkh = bitcoin.payments.p2pkh({
392
- hash: script.slice(2),
393
- network: getBitcoinNetwork(network)
394
- });
395
- const scriptCode = p2pkh.output;
396
- if (!scriptCode) {
397
- throw new Error('Failed to generate scriptCode');
398
- }
396
+ // Shared with extractPsbtSighashes; re-verifies the P2WSH
397
+ // commitment at the signer, independent of the ownership filter.
398
+ const scriptCode = getSegwitV0ScriptCode(input, script, i, getBitcoinNetwork(network));
399
399
  const sigHashType = getSigHashType(input, false);
400
400
  const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
401
401
  const signature = await this.sign({
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/node-btc",
3
- "version": "1.0.106",
3
+ "version": "1.0.107",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
7
- "@dynamic-labs-wallet/core": "1.0.106",
8
- "@dynamic-labs-wallet/node": "1.0.106",
9
- "@dynamic-labs-wallet/btc-utils": "1.0.106",
7
+ "@dynamic-labs-wallet/core": "1.0.107",
8
+ "@dynamic-labs-wallet/node": "1.0.107",
9
+ "@dynamic-labs-wallet/btc-utils": "1.0.107",
10
10
  "@dynamic-labs/sdk-api-core": "^0.0.1093",
11
11
  "bitcoinjs-lib": "^7.0.0",
12
12
  "tiny-secp256k1": "^2.2.3"
@@ -93,6 +93,14 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
93
93
  * Only inputs belonging to the account address are signed. Supports both TAPROOT
94
94
  * (BIP-341) and Native SegWit (BIP-143) signing methods.
95
95
  *
96
+ * ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
97
+ * hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
98
+ * is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
99
+ * commitment, and is a canonical multisig containing this wallet's public key.
100
+ * Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
101
+ * PSBT carries this wallet's partialSig and is NOT finalized — remaining
102
+ * co-signers add their signatures before finalizing.
103
+ *
96
104
  * @param transaction - The PSBT to sign as a base64 string
97
105
  * @param accountAddress - The account address (must match inputs to be signed)
98
106
  * @param network - The Bitcoin network (MAINNET or TESTNET)
@@ -103,7 +111,7 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
103
111
  * @returns Promise resolving to the signed PSBT as a base64 string
104
112
  * @throws Error if required parameters are missing, no inputs belong to account address, or signing fails
105
113
  */
106
- signTransaction({ transaction, walletMetadata, network, password, externalServerKeyShares, context, onError, signingIndexes, allowedSighash, }: {
114
+ signTransaction({ transaction, walletMetadata, network, password, externalServerKeyShares, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts, }: {
107
115
  transaction: string;
108
116
  walletMetadata: WalletMetadata;
109
117
  network: BitcoinNetwork;
@@ -113,6 +121,8 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
113
121
  onError?: (error: Error) => void;
114
122
  signingIndexes?: number[];
115
123
  allowedSighash?: number[];
124
+ /** Hex-encoded witnessScripts the wallet may co-sign (P2WSH opt-in). */
125
+ allowedWitnessScripts?: string[];
116
126
  }): Promise<string>;
117
127
  /**
118
128
  * Exports the private key for a wallet
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}