@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 +21 -21
- package/index.esm.js +22 -22
- package/package.json +4 -4
- package/src/client/client.d.ts +11 -1
- package/src/client/client.d.ts.map +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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.
|
|
3
|
+
"version": "1.0.107",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dynamic-labs-wallet/core": "1.0.
|
|
8
|
-
"@dynamic-labs-wallet/node": "1.0.
|
|
9
|
-
"@dynamic-labs-wallet/btc-utils": "1.0.
|
|
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"
|
package/src/client/client.d.ts
CHANGED
|
@@ -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":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EAEnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAItB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|