@dynamic-labs-wallet/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
@@ -490,6 +490,14 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
490
490
  /**
491
491
  * Sign a Bitcoin Transaction (PSBT)
492
492
  *
493
+ * ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
494
+ * hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
495
+ * is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
496
+ * commitment, and is a canonical multisig containing this wallet's public key.
497
+ * Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
498
+ * PSBT carries this wallet's partialSig and is NOT finalized — remaining
499
+ * co-signers add their signatures before finalizing.
500
+ *
493
501
  * @param transaction - The PSBT to sign in hex format
494
502
  * @param senderAddress - The address of the sender
495
503
  * @param password - The password to use for the transaction
@@ -503,7 +511,7 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
503
511
  * from the PSBT; this only restricts which declared types are accepted. An empty
504
512
  * array permits nothing; omit the parameter to permit any declared type
505
513
  * @returns The signed PSBT
506
- */ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash }) {
514
+ */ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
507
515
  try {
508
516
  await this.verifyPassword({
509
517
  accountAddress: senderAddress,
@@ -548,32 +556,29 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
548
556
  }
549
557
  const pubKey = btcUtils.normalizePublicKey(derivedPublicKey, addressType);
550
558
  const tx = psbt.__CACHE.__TX;
551
- // Filter inputs to only sign those that belong to the current address
559
+ const isTaproot = addressType === browser.BitcoinAddressType.TAPROOT;
560
+ // Filter inputs to only sign those that belong to the current address.
561
+ // P2WSH (multisig) inputs are opt-in: matched only when the caller
562
+ // allowlisted the witnessScript and it contains this wallet's key —
563
+ // ECDSA wallets only.
564
+ const walletPubKey = isTaproot ? undefined : pubKey;
565
+ const p2wshAllowlist = isTaproot ? undefined : allowedWitnessScripts;
552
566
  let inputsToSign = psbt.data.inputs.map((input, i)=>({
553
567
  input,
554
568
  index: i
555
- })).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, senderAddress, network));
569
+ })).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, senderAddress, network, walletPubKey, p2wshAllowlist));
556
570
  this.logger.debug('[BTC Client] signTransaction - Filtering inputs', {
557
571
  totalInputs: psbt.data.inputs.length,
558
572
  inputsToSign: inputsToSign.length,
559
573
  senderAddress
560
574
  });
561
- if (signingIndexes == null ? void 0 : signingIndexes.length) {
562
- const walletOwnedIndexSet = new Set(inputsToSign.map(({ index })=>index));
563
- const invalidIndexes = signingIndexes.filter((i)=>!walletOwnedIndexSet.has(i));
564
- if (invalidIndexes.length > 0) {
565
- throw new Error(`signingIndexes contains indexes that do not belong to the signing address: ${invalidIndexes.join(', ')}`);
566
- }
567
- const requestedIndexSet = new Set(signingIndexes);
568
- inputsToSign = inputsToSign.filter(({ index })=>requestedIndexSet.has(index));
569
- }
575
+ inputsToSign = btcUtils.filterInputsBySigningIndexes(inputsToSign, signingIndexes);
570
576
  if (inputsToSign.length === 0) {
571
577
  this.logger.warn('[BTC Client] signTransaction - No inputs found for address', {
572
578
  senderAddress,
573
579
  totalInputs: psbt.data.inputs.length
574
580
  });
575
581
  }
576
- const isTaproot = addressType === browser.BitcoinAddressType.TAPROOT;
577
582
  btcUtils.assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
578
583
  if (isTaproot) {
579
584
  const tweak = btcUtils.calculateTaprootTweak(pubKey);
@@ -623,12 +628,9 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
623
628
  throw new Error(`Input ${i} missing witnessUtxo`);
624
629
  }
625
630
  const { script, value } = input.witnessUtxo;
626
- const p2pkh = bitcoin__namespace.payments.p2pkh({
627
- hash: script.slice(2),
628
- network: btcUtils.getBitcoinNetwork(network)
629
- });
630
- const scriptCode = p2pkh.output;
631
- if (!scriptCode) throw new Error('Failed to generate scriptCode');
631
+ // Shared with extractPsbtSighashes; re-verifies the P2WSH
632
+ // commitment at the signer, independent of the ownership filter.
633
+ const scriptCode = btcUtils.getSegwitV0ScriptCode(input, script, i, btcUtils.getBitcoinNetwork(network));
632
634
  const sigHashType = btcUtils.getSigHashType(input, false);
633
635
  const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
634
636
  const signature = await this.sign({
package/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { DynamicWalletClient, BitcoinNetwork, BitcoinAddressType, getMPCChainConfig, ERROR_CREATE_WALLET_ACCOUNT, ERROR_PASSWORD_MISMATCH, ERROR_MULTIPLE_WALLETS_PER_CHAIN, ERROR_ACCOUNT_ADDRESS_REQUIRED, ERROR_SIGN_MESSAGE, ERROR_IMPORT_PRIVATE_KEY } from '@dynamic-labs-wallet/browser';
2
2
  import * as bitcoin from 'bitcoinjs-lib';
3
3
  import ecc from '@bitcoinerlab/secp256k1';
4
- import { extractPublicKeyHex, normalizePublicKey, publicKeyToBitcoinAddress, getAddressTypeFromDerivationPath, calculateBip322Hash, calculateTaprootTweak, encodeBip322Signature, wifToPrivateKey, getPublicKeyFromPrivateKey, privateKeyToWIF, doesInputBelongToAddress, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getBitcoinNetwork, convertSignatureToDER, getFeeRates, getUTXOs, selectUTXOs, getDefaultRpcUrl, initEccLib } from '@dynamic-labs-wallet/btc-utils';
4
+ import { extractPublicKeyHex, normalizePublicKey, publicKeyToBitcoinAddress, getAddressTypeFromDerivationPath, calculateBip322Hash, calculateTaprootTweak, encodeBip322Signature, wifToPrivateKey, getPublicKeyFromPrivateKey, privateKeyToWIF, doesInputBelongToAddress, filterInputsBySigningIndexes, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getSegwitV0ScriptCode, getBitcoinNetwork, convertSignatureToDER, getFeeRates, getUTXOs, selectUTXOs, getDefaultRpcUrl, initEccLib } from '@dynamic-labs-wallet/btc-utils';
5
5
 
6
6
  function _extends() {
7
7
  _extends = Object.assign || function assign(target) {
@@ -469,6 +469,14 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
469
469
  /**
470
470
  * Sign a Bitcoin Transaction (PSBT)
471
471
  *
472
+ * ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
473
+ * hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
474
+ * is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
475
+ * commitment, and is a canonical multisig containing this wallet's public key.
476
+ * Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
477
+ * PSBT carries this wallet's partialSig and is NOT finalized — remaining
478
+ * co-signers add their signatures before finalizing.
479
+ *
472
480
  * @param transaction - The PSBT to sign in hex format
473
481
  * @param senderAddress - The address of the sender
474
482
  * @param password - The password to use for the transaction
@@ -482,7 +490,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
482
490
  * from the PSBT; this only restricts which declared types are accepted. An empty
483
491
  * array permits nothing; omit the parameter to permit any declared type
484
492
  * @returns The signed PSBT
485
- */ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash }) {
493
+ */ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
486
494
  try {
487
495
  await this.verifyPassword({
488
496
  accountAddress: senderAddress,
@@ -527,32 +535,29 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
527
535
  }
528
536
  const pubKey = normalizePublicKey(derivedPublicKey, addressType);
529
537
  const tx = psbt.__CACHE.__TX;
530
- // Filter inputs to only sign those that belong to the current address
538
+ const isTaproot = addressType === BitcoinAddressType.TAPROOT;
539
+ // Filter inputs to only sign those that belong to the current address.
540
+ // P2WSH (multisig) inputs are opt-in: matched only when the caller
541
+ // allowlisted the witnessScript and it contains this wallet's key —
542
+ // ECDSA wallets only.
543
+ const walletPubKey = isTaproot ? undefined : pubKey;
544
+ const p2wshAllowlist = isTaproot ? undefined : allowedWitnessScripts;
531
545
  let inputsToSign = psbt.data.inputs.map((input, i)=>({
532
546
  input,
533
547
  index: i
534
- })).filter(({ input })=>doesInputBelongToAddress(input, senderAddress, network));
548
+ })).filter(({ input })=>doesInputBelongToAddress(input, senderAddress, network, walletPubKey, p2wshAllowlist));
535
549
  this.logger.debug('[BTC Client] signTransaction - Filtering inputs', {
536
550
  totalInputs: psbt.data.inputs.length,
537
551
  inputsToSign: inputsToSign.length,
538
552
  senderAddress
539
553
  });
540
- if (signingIndexes == null ? void 0 : signingIndexes.length) {
541
- const walletOwnedIndexSet = new Set(inputsToSign.map(({ index })=>index));
542
- const invalidIndexes = signingIndexes.filter((i)=>!walletOwnedIndexSet.has(i));
543
- if (invalidIndexes.length > 0) {
544
- throw new Error(`signingIndexes contains indexes that do not belong to the signing address: ${invalidIndexes.join(', ')}`);
545
- }
546
- const requestedIndexSet = new Set(signingIndexes);
547
- inputsToSign = inputsToSign.filter(({ index })=>requestedIndexSet.has(index));
548
- }
554
+ inputsToSign = filterInputsBySigningIndexes(inputsToSign, signingIndexes);
549
555
  if (inputsToSign.length === 0) {
550
556
  this.logger.warn('[BTC Client] signTransaction - No inputs found for address', {
551
557
  senderAddress,
552
558
  totalInputs: psbt.data.inputs.length
553
559
  });
554
560
  }
555
- const isTaproot = addressType === BitcoinAddressType.TAPROOT;
556
561
  assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
557
562
  if (isTaproot) {
558
563
  const tweak = calculateTaprootTweak(pubKey);
@@ -602,12 +607,9 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
602
607
  throw new Error(`Input ${i} missing witnessUtxo`);
603
608
  }
604
609
  const { script, value } = input.witnessUtxo;
605
- const p2pkh = bitcoin.payments.p2pkh({
606
- hash: script.slice(2),
607
- network: getBitcoinNetwork(network)
608
- });
609
- const scriptCode = p2pkh.output;
610
- if (!scriptCode) throw new Error('Failed to generate scriptCode');
610
+ // Shared with extractPsbtSighashes; re-verifies the P2WSH
611
+ // commitment at the signer, independent of the ownership filter.
612
+ const scriptCode = getSegwitV0ScriptCode(input, script, i, getBitcoinNetwork(network));
611
613
  const sigHashType = getSigHashType(input, false);
612
614
  const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
613
615
  const signature = await this.sign({
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/btc",
3
- "version": "1.0.106",
3
+ "version": "1.0.107",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "dependencies": {
8
8
  "@dynamic-labs/sdk-api-core": "^0.0.1093",
9
- "@dynamic-labs-wallet/browser": "1.0.106",
10
- "@dynamic-labs-wallet/btc-utils": "1.0.106",
9
+ "@dynamic-labs-wallet/browser": "1.0.107",
10
+ "@dynamic-labs-wallet/btc-utils": "1.0.107",
11
11
  "@bitcoinerlab/secp256k1": "^1.2.0",
12
12
  "bitcoinjs-lib": "^7.0.0"
13
13
  },
@@ -130,6 +130,14 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
130
130
  /**
131
131
  * Sign a Bitcoin Transaction (PSBT)
132
132
  *
133
+ * ECDSA wallets can also co-sign P2WSH multisig inputs, but only opt-in: pass the
134
+ * hex-encoded witnessScripts you constructed via `allowedWitnessScripts`. An input
135
+ * is signed when its witnessScript is allowlisted, hashes to the scriptPubKey
136
+ * commitment, and is a canonical multisig containing this wallet's public key.
137
+ * Omitting `allowedWitnessScripts` disables P2WSH signing entirely. The returned
138
+ * PSBT carries this wallet's partialSig and is NOT finalized — remaining
139
+ * co-signers add their signatures before finalizing.
140
+ *
133
141
  * @param transaction - The PSBT to sign in hex format
134
142
  * @param senderAddress - The address of the sender
135
143
  * @param password - The password to use for the transaction
@@ -144,7 +152,7 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
144
152
  * array permits nothing; omit the parameter to permit any declared type
145
153
  * @returns The signed PSBT
146
154
  */
147
- signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, }: {
155
+ signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts, }: {
148
156
  transaction: string;
149
157
  senderAddress: string;
150
158
  network: BitcoinNetwork;
@@ -156,6 +164,8 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
156
164
  onError?: (error: Error) => void;
157
165
  signingIndexes?: number[];
158
166
  allowedSighash?: number[];
167
+ /** Hex-encoded witnessScripts the wallet may co-sign (P2WSH opt-in). */
168
+ allowedWitnessScripts?: string[];
159
169
  }): Promise<string>;
160
170
  /**
161
171
  * Creates a PSBT for a transaction
@@ -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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"}