@dynamic-labs-wallet/btc 1.0.105 → 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 +34 -15
- package/index.esm.js +35 -16
- package/package.json +3 -3
- package/src/client/client.d.ts +17 -1
- package/src/client/client.d.ts.map +1 -1
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
|
|
@@ -498,8 +506,12 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
498
506
|
* @param mfaToken - The MFA token to use for the transaction
|
|
499
507
|
* @param context - The context to use for the transaction
|
|
500
508
|
* @param onError - The error handler
|
|
509
|
+
* @param signingIndexes - Optional subset of PSBT input indexes to sign (must belong to senderAddress)
|
|
510
|
+
* @param allowedSighash - Optional allow-list of sighash types. The type itself is read
|
|
511
|
+
* from the PSBT; this only restricts which declared types are accepted. An empty
|
|
512
|
+
* array permits nothing; omit the parameter to permit any declared type
|
|
501
513
|
* @returns The signed PSBT
|
|
502
|
-
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError }) {
|
|
514
|
+
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
|
|
503
515
|
try {
|
|
504
516
|
await this.verifyPassword({
|
|
505
517
|
accountAddress: senderAddress,
|
|
@@ -544,23 +556,31 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
544
556
|
}
|
|
545
557
|
const pubKey = btcUtils.normalizePublicKey(derivedPublicKey, addressType);
|
|
546
558
|
const tx = psbt.__CACHE.__TX;
|
|
547
|
-
|
|
548
|
-
|
|
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;
|
|
566
|
+
let inputsToSign = psbt.data.inputs.map((input, i)=>({
|
|
549
567
|
input,
|
|
550
568
|
index: i
|
|
551
|
-
})).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, senderAddress, network));
|
|
569
|
+
})).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, senderAddress, network, walletPubKey, p2wshAllowlist));
|
|
552
570
|
this.logger.debug('[BTC Client] signTransaction - Filtering inputs', {
|
|
553
571
|
totalInputs: psbt.data.inputs.length,
|
|
554
572
|
inputsToSign: inputsToSign.length,
|
|
555
573
|
senderAddress
|
|
556
574
|
});
|
|
575
|
+
inputsToSign = btcUtils.filterInputsBySigningIndexes(inputsToSign, signingIndexes);
|
|
557
576
|
if (inputsToSign.length === 0) {
|
|
558
577
|
this.logger.warn('[BTC Client] signTransaction - No inputs found for address', {
|
|
559
578
|
senderAddress,
|
|
560
579
|
totalInputs: psbt.data.inputs.length
|
|
561
580
|
});
|
|
562
581
|
}
|
|
563
|
-
|
|
582
|
+
btcUtils.assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
|
|
583
|
+
if (isTaproot) {
|
|
564
584
|
const tweak = btcUtils.calculateTaprootTweak(pubKey);
|
|
565
585
|
const completeBitcoinConfig = _extends({}, bitcoinConfig, {
|
|
566
586
|
addressType: addressType,
|
|
@@ -571,7 +591,8 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
571
591
|
if (!input.witnessUtxo) {
|
|
572
592
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
573
593
|
}
|
|
574
|
-
const
|
|
594
|
+
const sigHashType = btcUtils.getSigHashType(input, true);
|
|
595
|
+
const hash = Buffer.from(tx.hashForWitnessV1(i, prevOutScripts, values, sigHashType));
|
|
575
596
|
const signature = await this.sign({
|
|
576
597
|
message: new Uint8Array(hash),
|
|
577
598
|
accountAddress: senderAddress,
|
|
@@ -590,7 +611,7 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
590
611
|
bitcoinConfig: completeBitcoinConfig,
|
|
591
612
|
onError
|
|
592
613
|
});
|
|
593
|
-
const sigBuffer = btcUtils.convertSignatureToTaprootBuffer(signature);
|
|
614
|
+
const sigBuffer = btcUtils.convertSignatureToTaprootBuffer(signature, sigHashType);
|
|
594
615
|
psbt.updateInput(i, {
|
|
595
616
|
tapKeySig: sigBuffer
|
|
596
617
|
});
|
|
@@ -607,13 +628,11 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
607
628
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
608
629
|
}
|
|
609
630
|
const { script, value } = input.witnessUtxo;
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
const
|
|
615
|
-
if (!scriptCode) throw new Error('Failed to generate scriptCode');
|
|
616
|
-
const hash = tx.hashForWitnessV0(i, scriptCode, value, bitcoin__namespace.Transaction.SIGHASH_ALL);
|
|
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));
|
|
634
|
+
const sigHashType = btcUtils.getSigHashType(input, false);
|
|
635
|
+
const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
|
|
617
636
|
const signature = await this.sign({
|
|
618
637
|
message: new Uint8Array(hash),
|
|
619
638
|
accountAddress: senderAddress,
|
|
@@ -632,7 +651,7 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
632
651
|
bitcoinConfig: completeBitcoinConfig,
|
|
633
652
|
onError
|
|
634
653
|
});
|
|
635
|
-
const derSignature = btcUtils.convertSignatureToDER(signature);
|
|
654
|
+
const derSignature = btcUtils.convertSignatureToDER(signature, sigHashType);
|
|
636
655
|
psbt.updateInput(i, {
|
|
637
656
|
partialSig: [
|
|
638
657
|
{
|
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, collectPSBTInputData, 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
|
|
@@ -477,8 +485,12 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
477
485
|
* @param mfaToken - The MFA token to use for the transaction
|
|
478
486
|
* @param context - The context to use for the transaction
|
|
479
487
|
* @param onError - The error handler
|
|
488
|
+
* @param signingIndexes - Optional subset of PSBT input indexes to sign (must belong to senderAddress)
|
|
489
|
+
* @param allowedSighash - Optional allow-list of sighash types. The type itself is read
|
|
490
|
+
* from the PSBT; this only restricts which declared types are accepted. An empty
|
|
491
|
+
* array permits nothing; omit the parameter to permit any declared type
|
|
480
492
|
* @returns The signed PSBT
|
|
481
|
-
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError }) {
|
|
493
|
+
*/ async signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts }) {
|
|
482
494
|
try {
|
|
483
495
|
await this.verifyPassword({
|
|
484
496
|
accountAddress: senderAddress,
|
|
@@ -523,23 +535,31 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
523
535
|
}
|
|
524
536
|
const pubKey = normalizePublicKey(derivedPublicKey, addressType);
|
|
525
537
|
const tx = psbt.__CACHE.__TX;
|
|
526
|
-
|
|
527
|
-
|
|
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;
|
|
545
|
+
let inputsToSign = psbt.data.inputs.map((input, i)=>({
|
|
528
546
|
input,
|
|
529
547
|
index: i
|
|
530
|
-
})).filter(({ input })=>doesInputBelongToAddress(input, senderAddress, network));
|
|
548
|
+
})).filter(({ input })=>doesInputBelongToAddress(input, senderAddress, network, walletPubKey, p2wshAllowlist));
|
|
531
549
|
this.logger.debug('[BTC Client] signTransaction - Filtering inputs', {
|
|
532
550
|
totalInputs: psbt.data.inputs.length,
|
|
533
551
|
inputsToSign: inputsToSign.length,
|
|
534
552
|
senderAddress
|
|
535
553
|
});
|
|
554
|
+
inputsToSign = filterInputsBySigningIndexes(inputsToSign, signingIndexes);
|
|
536
555
|
if (inputsToSign.length === 0) {
|
|
537
556
|
this.logger.warn('[BTC Client] signTransaction - No inputs found for address', {
|
|
538
557
|
senderAddress,
|
|
539
558
|
totalInputs: psbt.data.inputs.length
|
|
540
559
|
});
|
|
541
560
|
}
|
|
542
|
-
|
|
561
|
+
assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
|
|
562
|
+
if (isTaproot) {
|
|
543
563
|
const tweak = calculateTaprootTweak(pubKey);
|
|
544
564
|
const completeBitcoinConfig = _extends({}, bitcoinConfig, {
|
|
545
565
|
addressType: addressType,
|
|
@@ -550,7 +570,8 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
550
570
|
if (!input.witnessUtxo) {
|
|
551
571
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
552
572
|
}
|
|
553
|
-
const
|
|
573
|
+
const sigHashType = getSigHashType(input, true);
|
|
574
|
+
const hash = Buffer.from(tx.hashForWitnessV1(i, prevOutScripts, values, sigHashType));
|
|
554
575
|
const signature = await this.sign({
|
|
555
576
|
message: new Uint8Array(hash),
|
|
556
577
|
accountAddress: senderAddress,
|
|
@@ -569,7 +590,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
569
590
|
bitcoinConfig: completeBitcoinConfig,
|
|
570
591
|
onError
|
|
571
592
|
});
|
|
572
|
-
const sigBuffer = convertSignatureToTaprootBuffer(signature);
|
|
593
|
+
const sigBuffer = convertSignatureToTaprootBuffer(signature, sigHashType);
|
|
573
594
|
psbt.updateInput(i, {
|
|
574
595
|
tapKeySig: sigBuffer
|
|
575
596
|
});
|
|
@@ -586,13 +607,11 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
586
607
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
587
608
|
}
|
|
588
609
|
const { script, value } = input.witnessUtxo;
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
const
|
|
594
|
-
if (!scriptCode) throw new Error('Failed to generate scriptCode');
|
|
595
|
-
const hash = tx.hashForWitnessV0(i, scriptCode, value, bitcoin.Transaction.SIGHASH_ALL);
|
|
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));
|
|
613
|
+
const sigHashType = getSigHashType(input, false);
|
|
614
|
+
const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
|
|
596
615
|
const signature = await this.sign({
|
|
597
616
|
message: new Uint8Array(hash),
|
|
598
617
|
accountAddress: senderAddress,
|
|
@@ -611,7 +630,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
611
630
|
bitcoinConfig: completeBitcoinConfig,
|
|
612
631
|
onError
|
|
613
632
|
});
|
|
614
|
-
const derSignature = convertSignatureToDER(signature);
|
|
633
|
+
const derSignature = convertSignatureToDER(signature, sigHashType);
|
|
615
634
|
psbt.updateInput(i, {
|
|
616
635
|
partialSig: [
|
|
617
636
|
{
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-wallet/btc",
|
|
3
|
-
"version": "1.0.
|
|
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.
|
|
10
|
-
"@dynamic-labs-wallet/btc-utils": "1.0.
|
|
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
|
},
|
package/src/client/client.d.ts
CHANGED
|
@@ -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
|
|
@@ -138,9 +146,13 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
138
146
|
* @param mfaToken - The MFA token to use for the transaction
|
|
139
147
|
* @param context - The context to use for the transaction
|
|
140
148
|
* @param onError - The error handler
|
|
149
|
+
* @param signingIndexes - Optional subset of PSBT input indexes to sign (must belong to senderAddress)
|
|
150
|
+
* @param allowedSighash - Optional allow-list of sighash types. The type itself is read
|
|
151
|
+
* from the PSBT; this only restricts which declared types are accepted. An empty
|
|
152
|
+
* array permits nothing; omit the parameter to permit any declared type
|
|
141
153
|
* @returns The signed PSBT
|
|
142
154
|
*/
|
|
143
|
-
signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, }: {
|
|
155
|
+
signTransaction({ transaction, senderAddress, network, password, signedSessionId, mfaToken, elevatedAccessToken, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts, }: {
|
|
144
156
|
transaction: string;
|
|
145
157
|
senderAddress: string;
|
|
146
158
|
network: BitcoinNetwork;
|
|
@@ -150,6 +162,10 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
150
162
|
elevatedAccessToken?: string;
|
|
151
163
|
context?: SignMessageContext;
|
|
152
164
|
onError?: (error: Error) => void;
|
|
165
|
+
signingIndexes?: number[];
|
|
166
|
+
allowedSighash?: number[];
|
|
167
|
+
/** Hex-encoded witnessScripts the wallet may co-sign (P2WSH opt-in). */
|
|
168
|
+
allowedWitnessScripts?: string[];
|
|
153
169
|
}): Promise<string>;
|
|
154
170
|
/**
|
|
155
171
|
* Creates a PSBT for a transaction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EAQnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|