From c04d07ffb387de74350f9a4eb516a02b71360a78 Mon Sep 17 00:00:00 2001 From: Matt Black Date: Thu, 9 Jul 2026 11:26:24 -0500 Subject: [PATCH 1/2] feat: bump node-dlc to 1.2.0, add taproot test --- package.json | 8 +- packages/bitcoin-dlc-provider/package.json | 10 +- .../bitcoin-js-wallet-provider/package.json | 2 +- packages/bitcoin-wallet-provider/package.json | 2 +- packages/client/package.json | 4 +- packages/types/package.json | 6 +- pnpm-lock.yaml | 152 +++++++++--------- tests/integration/config.ts | 2 +- tests/integration/dlc/dlc.test.ts | 148 +++++++++++++++++ 9 files changed, 241 insertions(+), 93 deletions(-) diff --git a/package.json b/package.json index 193f9b34..b23e07ea 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,10 @@ "devDependencies": { "@bennyblader/ddk-ts": "^0.3.42", "@changesets/cli": "^2.22.0", - "@node-dlc/bitcoin": "1.1.9", - "@node-dlc/bufio": "1.1.9", - "@node-dlc/core": "1.1.9", - "@node-dlc/messaging": "1.1.9", + "@node-dlc/bitcoin": "1.2.0", + "@node-dlc/bufio": "1.2.0", + "@node-dlc/core": "1.2.0", + "@node-dlc/messaging": "1.2.0", "@swc-node/register": "^0.1.12", "@swc/cli": "^0.1.57", "@swc/core": "^1.13.3", diff --git a/packages/bitcoin-dlc-provider/package.json b/packages/bitcoin-dlc-provider/package.json index cadcb01c..2441ca6c 100644 --- a/packages/bitcoin-dlc-provider/package.json +++ b/packages/bitcoin-dlc-provider/package.json @@ -19,11 +19,11 @@ "@atomicfinance/provider": "^4.3.1", "@atomicfinance/types": "^4.3.1", "@atomicfinance/utils": "^4.3.1", - "@node-dlc/bitcoin": "1.1.9", - "@node-dlc/bufio": "1.1.9", - "@node-dlc/core": "1.1.9", - "@node-dlc/crypto": "1.1.9", - "@node-dlc/messaging": "1.1.9", + "@node-dlc/bitcoin": "1.2.0", + "@node-dlc/bufio": "1.2.0", + "@node-dlc/core": "1.2.0", + "@node-dlc/crypto": "1.2.0", + "@node-dlc/messaging": "1.2.0", "bignumber.js": "^9.0.1", "bip-schnorr": "0.6.2", "bitcoin-network": "0.1.0", diff --git a/packages/bitcoin-js-wallet-provider/package.json b/packages/bitcoin-js-wallet-provider/package.json index 1151eda7..b37d6485 100644 --- a/packages/bitcoin-js-wallet-provider/package.json +++ b/packages/bitcoin-js-wallet-provider/package.json @@ -30,7 +30,7 @@ "@atomicfinance/types": "^4.3.1", "@atomicfinance/utils": "^4.3.1", "@babel/runtime": "^7.12.1", - "@node-dlc/core": "1.1.9", + "@node-dlc/core": "1.2.0", "bip32": "^2.0.6", "bip39": "^3.0.2", "bitcoin-network": "0.1.0", diff --git a/packages/bitcoin-wallet-provider/package.json b/packages/bitcoin-wallet-provider/package.json index 79208883..71348254 100644 --- a/packages/bitcoin-wallet-provider/package.json +++ b/packages/bitcoin-wallet-provider/package.json @@ -20,7 +20,7 @@ "@atomicfinance/provider": "^4.3.1", "@atomicfinance/types": "^4.3.1", "@atomicfinance/utils": "^4.3.1", - "@node-dlc/core": "1.1.9", + "@node-dlc/core": "1.2.0", "bip32": "^2.0.6", "bitcoin-network": "0.1.0", "bitcoinjs-lib": "6.1.7", diff --git a/packages/client/package.json b/packages/client/package.json index 40e21e83..f0839d14 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -19,8 +19,8 @@ "@atomicfinance/errors": "^4.3.1", "@atomicfinance/provider": "^4.3.1", "@atomicfinance/types": "^4.3.1", - "@node-dlc/bitcoin": "1.1.9", - "@node-dlc/messaging": "1.1.9", + "@node-dlc/bitcoin": "1.2.0", + "@node-dlc/messaging": "1.2.0", "ajv": "^6.10.0", "lodash": "^4.17.20" }, diff --git a/packages/types/package.json b/packages/types/package.json index 29217cdf..0a616da7 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -15,9 +15,9 @@ "lint:fix": "../../node_modules/.bin/eslint --fix ." }, "dependencies": { - "@node-dlc/bitcoin": "1.1.9", - "@node-dlc/messaging": "1.1.9", - "@node-dlc/noise": "1.1.9", + "@node-dlc/bitcoin": "1.2.0", + "@node-dlc/messaging": "1.2.0", + "@node-dlc/noise": "1.2.0", "lodash": "^4.17.20" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e6ff03b..490de49d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,17 +19,17 @@ importers: specifier: ^2.22.0 version: 2.29.5 '@node-dlc/bitcoin': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/bufio': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/core': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/messaging': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@swc-node/register': specifier: ^0.1.12 version: 0.1.12 @@ -308,20 +308,20 @@ importers: specifier: ^2.2.0 version: 2.2.4 '@node-dlc/bitcoin': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/bufio': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/core': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/crypto': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/messaging': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 bignumber.js: specifier: ^9.0.1 version: 9.3.1 @@ -455,8 +455,8 @@ importers: specifier: ^2.2.0 version: 2.2.4 '@node-dlc/core': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 bip32: specifier: ^2.0.6 version: 2.0.6 @@ -627,8 +627,8 @@ importers: specifier: ^4.3.1 version: link:../utils '@node-dlc/core': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 bip32: specifier: ^2.0.6 version: 2.0.6 @@ -667,11 +667,11 @@ importers: specifier: ^4.3.1 version: link:../types '@node-dlc/bitcoin': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/messaging': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 ajv: specifier: ^6.10.0 version: 6.12.6 @@ -786,14 +786,14 @@ importers: packages/types: dependencies: '@node-dlc/bitcoin': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/messaging': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 '@node-dlc/noise': - specifier: 1.1.9 - version: 1.1.9 + specifier: 1.2.0 + version: 1.2.0 lodash: specifier: ^4.17.20 version: 4.17.21 @@ -1682,56 +1682,56 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} - /@node-dlc/bitcoin@1.1.9: - resolution: {integrity: sha512-hT2v/V84ocYETML45gDrHcoAIgG2oF9uETqnBrObhAv3wv0qV5eyl71BaAH062ghe0wgnVswAvLqPYtPWY+QCw==} + /@node-dlc/bitcoin@1.2.0: + resolution: {integrity: sha512-S5xR9+kpJPGnzNvH2Gmmpy7TElAQ/LYddzRfjrhWUH/1xulCPFeH+oQw8QBZmhCE5pzbDs+15m/rpEA9cDermA==} dependencies: - '@node-dlc/bufio': 1.1.9 - '@node-dlc/crypto': 1.1.9 + '@node-dlc/bufio': 1.2.0 + '@node-dlc/crypto': 1.2.0 - /@node-dlc/bufio@1.1.9: - resolution: {integrity: sha512-NIGmVyheYE9wtdihdzOwP10aD96TaF28x486dcqysl5cPHNb4VX1EMBDH2aCl1ZpgHgYXhHQl8S7dDrMEu0LpA==} + /@node-dlc/bufio@1.2.0: + resolution: {integrity: sha512-0z2lutHiO/XFIprRNdnu23pf7Y+x1+hdBqYe4wg65giEp94nSqXI5FyyAc2KkgiHES16g0rAR9lAZURUPBtalA==} dependencies: decimal.js: 10.6.0 - /@node-dlc/checksum@1.1.9: - resolution: {integrity: sha512-RZyPvc4MZvcXXEeCn3Cc3cTM9JIKnQILzfNlQ+8Abm6hcko9jzpaNCmryaAMle3TmF9IsYNrxhyZO+CRY88Mbg==} + /@node-dlc/checksum@1.2.0: + resolution: {integrity: sha512-vKkOe0OR9AAbNk+68P6VYJs3SUb+WTXzwHe3aexxTFRZQaGpfB3AtgE3sg206JdVkVbzRANcvgV6UfFsIp46qg==} - /@node-dlc/common@1.1.9: - resolution: {integrity: sha512-F/kcjnBrM3q8luBbjzndayHH/QZ33vr7zYZs4jf668Y371amSQWktxvak9Qt4ocSr/J4aeTcO6XlvKINZZI8jw==} + /@node-dlc/common@1.2.0: + resolution: {integrity: sha512-zyX8PNpsfGcsGmGp98EicoclyHK92/KgD8T3CjcIwGQ4T3MPXn6fG9HGYY1pPiH0DbPX4Vt4LUWM2EYuhGh7rg==} dependencies: - '@node-dlc/bitcoin': 1.1.9 - '@node-dlc/bufio': 1.1.9 + '@node-dlc/bitcoin': 1.2.0 + '@node-dlc/bufio': 1.2.0 - /@node-dlc/core@1.1.9: - resolution: {integrity: sha512-cFx7kaZC5bbC7oo8WejQAe7a/CzVqyM+aFUdWw0aNyRQ1N0RyP79zda0agCMq2lh6TCPLvV0i2eLpZiaF8Y6AA==} + /@node-dlc/core@1.2.0: + resolution: {integrity: sha512-ZaPSsFekMaU6i7LdWwMlWUipOjlno+1OBpjfvchK4s0c4jJOEFUkGgRF+UtzbAtA8SSL83vKyVHtWTtpUq2G9A==} dependencies: - '@node-dlc/bitcoin': 1.1.9 - '@node-dlc/bufio': 1.1.9 - '@node-dlc/common': 1.1.9 - '@node-dlc/crypto': 1.1.9 - '@node-dlc/messaging': 1.1.9 + '@node-dlc/bitcoin': 1.2.0 + '@node-dlc/bufio': 1.2.0 + '@node-dlc/common': 1.2.0 + '@node-dlc/crypto': 1.2.0 + '@node-dlc/messaging': 1.2.0 bignumber.js: 9.3.1 bitcoin-network: 0.1.0 decimal.js: 10.6.0 - /@node-dlc/crypto@1.1.9: - resolution: {integrity: sha512-UmEmHSFdONK05gAvTWcpvMIMmG/ECd+ThhiNsLX0Rh8Yc3Xt0SrU7unuo2szDCWfRthakn6TbaomoLLMiV31Eg==} + /@node-dlc/crypto@1.2.0: + resolution: {integrity: sha512-mbcf3TKf17lBwBV+bjfeaSKc+tAS9ddrxw2iDt+R+8q2wRnWA+CWyV9m67ZgGhWhzrHEdgoFEGD1k8Okku0JnA==} engines: {node: '>=10.17'} dependencies: secp256k1: 5.0.1 - /@node-dlc/logger@1.1.9: - resolution: {integrity: sha512-sUJUEAxkhM39SRcZoxIfKtGG/jvF8QAVY4/mB4LLXSxcrVlMV9oGauWyqESLSueJ0CPmWMJMOLQKcWQ6g/5qhg==} + /@node-dlc/logger@1.2.0: + resolution: {integrity: sha512-OMZvWhG2V1E6lA6oKh5swYkG4SO0IkCBuXHBj80c70De61tW3LzkH7IGKAi/JFIWQ+PV2GCTrR9+6sNp2N/2Bw==} - /@node-dlc/messaging@1.1.9: - resolution: {integrity: sha512-T41rENz1y3mjg6EiJBYgGm1KBYiHoTipheuf+hBhpp4+KUDP7WTPK92uqbEyMLVyK4NbA9kXlWnguXc36ATzlQ==} + /@node-dlc/messaging@1.2.0: + resolution: {integrity: sha512-SEcmnA1IRsSQFOXTW/9L4WAsAoqKJERUM0mUwI+IgXdzGMFmEXkbXCScBFTQhDpuLnogE1IUCv5BuveT9r+rDQ==} dependencies: - '@node-dlc/bitcoin': 1.1.9 - '@node-dlc/bufio': 1.1.9 - '@node-dlc/checksum': 1.1.9 - '@node-dlc/common': 1.1.9 - '@node-dlc/crypto': 1.1.9 - '@node-dlc/wire': 1.1.9 + '@node-dlc/bitcoin': 1.2.0 + '@node-dlc/bufio': 1.2.0 + '@node-dlc/checksum': 1.2.0 + '@node-dlc/common': 1.2.0 + '@node-dlc/crypto': 1.2.0 + '@node-dlc/wire': 1.2.0 '@types/json-bigint': 1.0.4 bip-schnorr: 0.6.3 bitcoin-network: 0.1.0 @@ -1740,22 +1740,22 @@ packages: json-bigint: 1.0.0 secp256k1: 5.0.1 - /@node-dlc/noise@1.1.9: - resolution: {integrity: sha512-oyU5oadK83zcisboua4s/Mna0cpH7PXJpvA2UcXuY2v+LWA8/sCLQljQUnuKc7moz1Vg62aPHEYcGouGbo+UhA==} + /@node-dlc/noise@1.2.0: + resolution: {integrity: sha512-hcN708qe7N8sAFUDjVJUpnpBwprVwtclLLTHRlde74iKZRgH566XlMsH5EcF/khuro6iXWXw1Kt6JZMdi8DIOQ==} dependencies: - '@node-dlc/crypto': 1.1.9 - '@node-dlc/logger': 1.1.9 + '@node-dlc/crypto': 1.2.0 + '@node-dlc/logger': 1.2.0 - /@node-dlc/wire@1.1.9: - resolution: {integrity: sha512-sNTAD8Y2/eihUT+AABhJpRPjYalH0mHdoQYgPODLFFrg6e3edlCcfq7TTpxES615Rx1hw6huJO6tl9J4DoTgsg==} + /@node-dlc/wire@1.2.0: + resolution: {integrity: sha512-2bWe94PNoVR2qZGbXjHo/DFQn3shy+apHNPNa2Ft5JnP8db3aVNoM79Loruy8XCPd0LmhSl4ylSCSU65fnftaw==} dependencies: - '@node-dlc/bitcoin': 1.1.9 - '@node-dlc/bufio': 1.1.9 - '@node-dlc/checksum': 1.1.9 - '@node-dlc/common': 1.1.9 - '@node-dlc/crypto': 1.1.9 - '@node-dlc/logger': 1.1.9 - '@node-dlc/noise': 1.1.9 + '@node-dlc/bitcoin': 1.2.0 + '@node-dlc/bufio': 1.2.0 + '@node-dlc/checksum': 1.2.0 + '@node-dlc/common': 1.2.0 + '@node-dlc/crypto': 1.2.0 + '@node-dlc/logger': 1.2.0 + '@node-dlc/noise': 1.2.0 /@node-rs/helper@0.2.1: resolution: {integrity: sha512-DEPYwfkkhJlVLFu6hWVGZi96jUCBahi1WoHZAC7gSFoeoJtxwJ+FrJSDx/8c9aIwAf477NnKj8bRJzFm98Me3A==} diff --git a/tests/integration/config.ts b/tests/integration/config.ts index b3b6615a..f50344c1 100644 --- a/tests/integration/config.ts +++ b/tests/integration/config.ts @@ -7,7 +7,7 @@ dotenv.config({ path: findConfig('.env') }); export default { bitcoin: { rpc: { - host: 'http://localhost:18443', + host: process.env.RPC_HOST || 'http://localhost:18443', username: process.env.RPC_USER || 'admin1', password: process.env.RPC_PASS || '123', }, diff --git a/tests/integration/dlc/dlc.test.ts b/tests/integration/dlc/dlc.test.ts index 4cb85f08..e4d4316b 100644 --- a/tests/integration/dlc/dlc.test.ts +++ b/tests/integration/dlc/dlc.test.ts @@ -1,5 +1,6 @@ import 'mocha'; +import * as ecc from '@bitcoin-js/tiny-secp256k1-asmjs'; import { Sequence, Tx, Value } from '@node-dlc/bitcoin'; import { StreamReader } from '@node-dlc/bufio'; import { @@ -32,6 +33,7 @@ import { import BN from 'bignumber.js'; import { math } from 'bip-schnorr'; import { BitcoinNetworks, chainHashFromNetwork } from 'bitcoin-network'; +import { initEccLib } from 'bitcoinjs-lib'; import * as chai from 'chai'; import chaiAsPromised from 'chai-as-promised'; import * as crypto from 'crypto'; @@ -60,6 +62,9 @@ import { chai.use(chaiAsPromised); const expect = chai.expect; +// Required for bitcoinjs-lib to parse taproot (P2TR) scripts in message validation +initEccLib(ecc); + const chain = chains.bitcoinWithJs; const alice = chain.client; @@ -303,6 +308,149 @@ describe('dlc provider', () => { expect((sighashes as string[])[0]).to.equal(details[0].sighash); }); + it('should fund and execute enum DLC with taproot change output', async () => { + const oracle = new Oracle('olivia'); + + const ddkInput = await getInput(ddk); + const ddk2Input = await getInput(ddk2); + + const eventId = 'trump-vs-kamala'; + + const oliviaInfo = oracle.GetOracleInfo(); + + const eventDescriptor = new EnumEventDescriptor(); + eventDescriptor.outcomes = ['trump', 'kamala', 'neither']; + + const event = new OracleEvent(); + event.oracleNonces = oliviaInfo.rValues.map((rValue) => + Buffer.from(rValue, 'hex'), + ); + event.eventMaturityEpoch = 1617170572; + event.eventDescriptor = eventDescriptor; + event.eventId = eventId; + + const announcement = new OracleAnnouncement(); + announcement.announcementSig = Buffer.from( + oracle.GetSignature( + math + .taggedHash('DLC/oracle/announcement/v0', event.serialize()) + .toString('hex'), + ), + 'hex', + ); + announcement.oraclePublicKey = Buffer.from(oliviaInfo.publicKey, 'hex'); + announcement.oracleEvent = event; + + const oracleInfo = new SingleOracleInfo(); + oracleInfo.announcement = announcement; + + const contractDescriptor = new EnumeratedDescriptor(); + contractDescriptor.outcomes = [ + { + outcome: sha256(Buffer.from('trump')).toString('hex'), + localPayout: BigInt(1e6), + }, + { + outcome: sha256(Buffer.from('kamala')).toString('hex'), + localPayout: BigInt(0), + }, + { + outcome: sha256(Buffer.from('neither')).toString('hex'), + localPayout: BigInt(500000), + }, + ]; + + const totalCollateral = BigInt(1e6); + + const contractInfo = new SingleContractInfo(); + contractInfo.totalCollateral = totalCollateral; + contractInfo.contractDescriptor = contractDescriptor; + contractInfo.oracleInfo = oracleInfo; + + const feeRatePerVb = BigInt(10); + const cetLocktime = 1617170572; + const refundLocktime = 1617170573; + + const taprootDlcOffer = await ddk.dlc.createDlcOffer( + contractInfo, + totalCollateral - BigInt(2000), + feeRatePerVb, + cetLocktime, + refundLocktime, + [ddkInput], + ); + + // Override the change output with a P2TR script (OP_1 <32-byte x-only key>) + // to verify the funding flow supports taproot outputs end to end + const taprootSpk = Buffer.concat([ + Buffer.from([0x51, 0x20]), + taprootDlcOffer.fundingPubkey.subarray(1, 33), + ]); + taprootDlcOffer.changeSpk = taprootSpk; + + DlcOffer.deserialize(taprootDlcOffer.serialize()).validate(); + + const taprootAcceptResponse: AcceptDlcOfferResponse = + await ddk2.dlc.acceptDlcOffer(taprootDlcOffer, [ddk2Input]); + + const taprootDlcAccept = taprootAcceptResponse.dlcAccept; + const taprootDlcTransactions = taprootAcceptResponse.dlcTransactions; + + DlcAccept.deserialize(taprootDlcAccept.serialize()).validate(); + + const taprootSignResponse: SignDlcAcceptResponse = + await ddk.dlc.signDlcAccept(taprootDlcOffer, taprootDlcAccept); + + const taprootDlcSign = taprootSignResponse.dlcSign; + + const fundTx = await ddk2.dlc.finalizeDlcSign( + taprootDlcOffer, + taprootDlcAccept, + taprootDlcSign, + taprootDlcTransactions, + ); + + const taprootChangeOutput = fundTx.outputs.find((output) => + output.scriptPubKey.serializeCmds().equals(taprootSpk), + ); + expect(taprootChangeOutput).to.not.be.undefined; + + const fundTxId = await ddk2.chain.sendRawTransaction( + fundTx.serialize().toString('hex'), + ); + expect(fundTxId).to.not.be.undefined; + + const fundTxDetails = await ddk.getMethod('getTransactionByHash')( + fundTxId, + ); + const taprootVout = fundTxDetails._raw.vout.find( + (vout) => vout.scriptPubKey.hex === taprootSpk.toString('hex'), + ); + expect(taprootVout).to.not.be.undefined; + expect(taprootVout.scriptPubKey.type).to.equal('witness_v1_taproot'); + + const taprootOracleAttestation = + generateDdkCompatibleEnumOracleAttestation( + 'trump', + oracle, + announcement.getEventId(), + ); + + const cet = await ddk2.dlc.execute( + taprootDlcOffer, + taprootDlcAccept, + taprootDlcSign, + taprootDlcTransactions, + taprootOracleAttestation, + false, + ); + + const cetTxId = await ddk2.chain.sendRawTransaction( + cet.serialize().toString('hex'), + ); + expect(cetTxId).to.not.be.undefined; + }); + it('should fund and refund enum DLC', async () => { const oracle = new Oracle('olivia'); From 4891e997e62fec6d40ae8fa94877ca94a9587fc1 Mon Sep 17 00:00:00 2001 From: Matt Black Date: Thu, 9 Jul 2026 11:31:36 -0500 Subject: [PATCH 2/2] chore: add changeset for node-dlc 1.2.0 bump --- .changeset/brave-taproot-outputs.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .changeset/brave-taproot-outputs.md diff --git a/.changeset/brave-taproot-outputs.md b/.changeset/brave-taproot-outputs.md new file mode 100644 index 00000000..00252774 --- /dev/null +++ b/.changeset/brave-taproot-outputs.md @@ -0,0 +1,24 @@ +--- +'@atomicfinance/bitcoin-js-wallet-provider': patch +'@atomicfinance/bitcoin-wallet-provider': patch +'@atomicfinance/bitcoin-dlc-provider': patch +'@atomicfinance/client': patch +'@atomicfinance/types': patch +'@atomicfinance/bitcoin-cfd-address-derivation-provider': patch +'@atomicfinance/bitcoin-cfd-provider': patch +'@atomicfinance/bitcoin-ddk-address-derivation-provider': patch +'@atomicfinance/bitcoin-ddk-provider': patch +'@atomicfinance/bitcoin-esplora-api-provider': patch +'@atomicfinance/bitcoin-esplora-batch-api-provider': patch +'@atomicfinance/bitcoin-node-wallet-provider': patch +'@atomicfinance/bitcoin-rpc-provider': patch +'@atomicfinance/bitcoin-utils': patch +'@atomicfinance/crypto': patch +'@atomicfinance/errors': patch +'@atomicfinance/jsonrpc-provider': patch +'@atomicfinance/node-provider': patch +'@atomicfinance/provider': patch +'@atomicfinance/utils': patch +--- + +Bump @node-dlc to 1.2.0, which preserves raw DLC change scripts (taproot change output support)