@dynamic-labs-wallet/node-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 +30 -17
- package/index.esm.js +31 -18
- package/package.json +4 -4
- package/src/client/client.d.ts +13 -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 }) {
|
|
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,15 +353,23 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
|
|
|
345
353
|
}
|
|
346
354
|
const pubKey = btcUtils.normalizePublicKey(derivedPublicKey, addressType);
|
|
347
355
|
const tx = psbt.__CACHE.__TX;
|
|
348
|
-
|
|
349
|
-
|
|
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;
|
|
363
|
+
let inputsToSign = psbt.data.inputs.map((input, i)=>({
|
|
350
364
|
input,
|
|
351
365
|
index: i
|
|
352
|
-
})).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, accountAddress, network));
|
|
366
|
+
})).filter(({ input })=>btcUtils.doesInputBelongToAddress(input, accountAddress, network, walletPubKey, p2wshAllowlist));
|
|
367
|
+
inputsToSign = btcUtils.filterInputsBySigningIndexes(inputsToSign, signingIndexes);
|
|
353
368
|
if (inputsToSign.length === 0) {
|
|
354
369
|
throw new Error('No inputs found that belong to the account address');
|
|
355
370
|
}
|
|
356
|
-
|
|
371
|
+
btcUtils.assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
|
|
372
|
+
if (isTaproot) {
|
|
357
373
|
const tweak = btcUtils.calculateTaprootTweak(pubKey);
|
|
358
374
|
const completeBitcoinConfig = _extends({}, bitcoinConfig, {
|
|
359
375
|
addressType,
|
|
@@ -364,7 +380,8 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
|
|
|
364
380
|
if (!input.witnessUtxo) {
|
|
365
381
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
366
382
|
}
|
|
367
|
-
const
|
|
383
|
+
const sigHashType = btcUtils.getSigHashType(input, true);
|
|
384
|
+
const hash = Buffer.from(tx.hashForWitnessV1(i, prevOutScripts, values, sigHashType));
|
|
368
385
|
const signature = await this.sign({
|
|
369
386
|
message: new Uint8Array(hash),
|
|
370
387
|
accountAddress,
|
|
@@ -383,7 +400,7 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
|
|
|
383
400
|
walletMetadata,
|
|
384
401
|
passwordPreVerified: !(externalServerKeyShares == null ? void 0 : externalServerKeyShares.length) && !!password
|
|
385
402
|
});
|
|
386
|
-
const sigBuffer = btcUtils.convertSignatureToTaprootBuffer(signature);
|
|
403
|
+
const sigBuffer = btcUtils.convertSignatureToTaprootBuffer(signature, sigHashType);
|
|
387
404
|
psbt.updateInput(i, {
|
|
388
405
|
tapKeySig: sigBuffer
|
|
389
406
|
});
|
|
@@ -398,15 +415,11 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
|
|
|
398
415
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
399
416
|
}
|
|
400
417
|
const { script, value } = input.witnessUtxo;
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
const
|
|
406
|
-
if (!scriptCode) {
|
|
407
|
-
throw new Error('Failed to generate scriptCode');
|
|
408
|
-
}
|
|
409
|
-
const hash = tx.hashForWitnessV0(i, scriptCode, value, bitcoin__namespace.Transaction.SIGHASH_ALL);
|
|
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
|
+
const sigHashType = btcUtils.getSigHashType(input, false);
|
|
422
|
+
const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
|
|
410
423
|
const signature = await this.sign({
|
|
411
424
|
message: new Uint8Array(hash),
|
|
412
425
|
accountAddress,
|
|
@@ -425,7 +438,7 @@ class DynamicBtcWalletClient extends node.DynamicWalletClient {
|
|
|
425
438
|
walletMetadata,
|
|
426
439
|
passwordPreVerified: !(externalServerKeyShares == null ? void 0 : externalServerKeyShares.length) && !!password
|
|
427
440
|
});
|
|
428
|
-
const derSignature = btcUtils.convertSignatureToDER(signature);
|
|
441
|
+
const derSignature = btcUtils.convertSignatureToDER(signature, sigHashType);
|
|
429
442
|
psbt.updateInput(i, {
|
|
430
443
|
partialSig: [
|
|
431
444
|
{
|
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, collectPSBTInputData, 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 }) {
|
|
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,15 +331,23 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
323
331
|
}
|
|
324
332
|
const pubKey = normalizePublicKey(derivedPublicKey, addressType);
|
|
325
333
|
const tx = psbt.__CACHE.__TX;
|
|
326
|
-
|
|
327
|
-
|
|
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;
|
|
341
|
+
let inputsToSign = psbt.data.inputs.map((input, i)=>({
|
|
328
342
|
input,
|
|
329
343
|
index: i
|
|
330
|
-
})).filter(({ input })=>doesInputBelongToAddress(input, accountAddress, network));
|
|
344
|
+
})).filter(({ input })=>doesInputBelongToAddress(input, accountAddress, network, walletPubKey, p2wshAllowlist));
|
|
345
|
+
inputsToSign = filterInputsBySigningIndexes(inputsToSign, signingIndexes);
|
|
331
346
|
if (inputsToSign.length === 0) {
|
|
332
347
|
throw new Error('No inputs found that belong to the account address');
|
|
333
348
|
}
|
|
334
|
-
|
|
349
|
+
assertSighashAllowed(inputsToSign, isTaproot, allowedSighash);
|
|
350
|
+
if (isTaproot) {
|
|
335
351
|
const tweak = calculateTaprootTweak(pubKey);
|
|
336
352
|
const completeBitcoinConfig = _extends({}, bitcoinConfig, {
|
|
337
353
|
addressType,
|
|
@@ -342,7 +358,8 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
342
358
|
if (!input.witnessUtxo) {
|
|
343
359
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
344
360
|
}
|
|
345
|
-
const
|
|
361
|
+
const sigHashType = getSigHashType(input, true);
|
|
362
|
+
const hash = Buffer.from(tx.hashForWitnessV1(i, prevOutScripts, values, sigHashType));
|
|
346
363
|
const signature = await this.sign({
|
|
347
364
|
message: new Uint8Array(hash),
|
|
348
365
|
accountAddress,
|
|
@@ -361,7 +378,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
361
378
|
walletMetadata,
|
|
362
379
|
passwordPreVerified: !(externalServerKeyShares == null ? void 0 : externalServerKeyShares.length) && !!password
|
|
363
380
|
});
|
|
364
|
-
const sigBuffer = convertSignatureToTaprootBuffer(signature);
|
|
381
|
+
const sigBuffer = convertSignatureToTaprootBuffer(signature, sigHashType);
|
|
365
382
|
psbt.updateInput(i, {
|
|
366
383
|
tapKeySig: sigBuffer
|
|
367
384
|
});
|
|
@@ -376,15 +393,11 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
376
393
|
throw new Error(`Input ${i} missing witnessUtxo`);
|
|
377
394
|
}
|
|
378
395
|
const { script, value } = input.witnessUtxo;
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
const
|
|
384
|
-
if (!scriptCode) {
|
|
385
|
-
throw new Error('Failed to generate scriptCode');
|
|
386
|
-
}
|
|
387
|
-
const hash = tx.hashForWitnessV0(i, scriptCode, value, bitcoin.Transaction.SIGHASH_ALL);
|
|
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
|
+
const sigHashType = getSigHashType(input, false);
|
|
400
|
+
const hash = tx.hashForWitnessV0(i, scriptCode, value, sigHashType);
|
|
388
401
|
const signature = await this.sign({
|
|
389
402
|
message: new Uint8Array(hash),
|
|
390
403
|
accountAddress,
|
|
@@ -403,7 +416,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
403
416
|
walletMetadata,
|
|
404
417
|
passwordPreVerified: !(externalServerKeyShares == null ? void 0 : externalServerKeyShares.length) && !!password
|
|
405
418
|
});
|
|
406
|
-
const derSignature = convertSignatureToDER(signature);
|
|
419
|
+
const derSignature = convertSignatureToDER(signature, sigHashType);
|
|
407
420
|
psbt.updateInput(i, {
|
|
408
421
|
partialSig: [
|
|
409
422
|
{
|
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, }: {
|
|
114
|
+
signTransaction({ transaction, walletMetadata, network, password, externalServerKeyShares, context, onError, signingIndexes, allowedSighash, allowedWitnessScripts, }: {
|
|
107
115
|
transaction: string;
|
|
108
116
|
walletMetadata: WalletMetadata;
|
|
109
117
|
network: BitcoinNetwork;
|
|
@@ -111,6 +119,10 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
111
119
|
externalServerKeyShares?: ServerKeyShare[];
|
|
112
120
|
context?: SignMessageContext;
|
|
113
121
|
onError?: (error: Error) => void;
|
|
122
|
+
signingIndexes?: number[];
|
|
123
|
+
allowedSighash?: number[];
|
|
124
|
+
/** Hex-encoded witnessScripts the wallet may co-sign (P2WSH opt-in). */
|
|
125
|
+
allowedWitnessScripts?: string[];
|
|
114
126
|
}): Promise<string>;
|
|
115
127
|
/**
|
|
116
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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"}
|