@ledgerhq/psbtv2 0.1.0

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.
Files changed (46) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/LICENSE.txt +21 -0
  3. package/README.md +91 -0
  4. package/jest.config.js +26 -0
  5. package/lib/buffertools.d.ts +29 -0
  6. package/lib/buffertools.d.ts.map +1 -0
  7. package/lib/buffertools.js +129 -0
  8. package/lib/buffertools.js.map +1 -0
  9. package/lib/index.d.ts +4 -0
  10. package/lib/index.d.ts.map +1 -0
  11. package/lib/index.js +18 -0
  12. package/lib/index.js.map +1 -0
  13. package/lib/psbtParsing.d.ts +15 -0
  14. package/lib/psbtParsing.d.ts.map +1 -0
  15. package/lib/psbtParsing.js +52 -0
  16. package/lib/psbtParsing.js.map +1 -0
  17. package/lib/psbtv2.d.ts +200 -0
  18. package/lib/psbtv2.d.ts.map +1 -0
  19. package/lib/psbtv2.js +647 -0
  20. package/lib/psbtv2.js.map +1 -0
  21. package/lib-es/buffertools.d.ts +29 -0
  22. package/lib-es/buffertools.d.ts.map +1 -0
  23. package/lib-es/buffertools.js +119 -0
  24. package/lib-es/buffertools.js.map +1 -0
  25. package/lib-es/index.d.ts +4 -0
  26. package/lib-es/index.d.ts.map +1 -0
  27. package/lib-es/index.js +4 -0
  28. package/lib-es/index.js.map +1 -0
  29. package/lib-es/psbtParsing.d.ts +15 -0
  30. package/lib-es/psbtParsing.d.ts.map +1 -0
  31. package/lib-es/psbtParsing.js +48 -0
  32. package/lib-es/psbtParsing.js.map +1 -0
  33. package/lib-es/psbtv2.d.ts +200 -0
  34. package/lib-es/psbtv2.d.ts.map +1 -0
  35. package/lib-es/psbtv2.js +641 -0
  36. package/lib-es/psbtv2.js.map +1 -0
  37. package/package.json +78 -0
  38. package/src/buffertools.test.ts +116 -0
  39. package/src/buffertools.ts +137 -0
  40. package/src/fromV0.test.ts +577 -0
  41. package/src/index.ts +3 -0
  42. package/src/psbtParsing.test.ts +86 -0
  43. package/src/psbtParsing.ts +51 -0
  44. package/src/psbtv2.test.ts +441 -0
  45. package/src/psbtv2.ts +740 -0
  46. package/tsconfig.json +9 -0
@@ -0,0 +1,641 @@
1
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
+ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
3
+ import { Psbt, Transaction } from "bitcoinjs-lib";
4
+ import { BufferReader, BufferWriter, unsafeFrom64bitLE, unsafeTo64bitLE } from "./buffertools";
5
+ export var psbtGlobal;
6
+ (function (psbtGlobal) {
7
+ psbtGlobal[psbtGlobal["TX_VERSION"] = 2] = "TX_VERSION";
8
+ psbtGlobal[psbtGlobal["FALLBACK_LOCKTIME"] = 3] = "FALLBACK_LOCKTIME";
9
+ psbtGlobal[psbtGlobal["INPUT_COUNT"] = 4] = "INPUT_COUNT";
10
+ psbtGlobal[psbtGlobal["OUTPUT_COUNT"] = 5] = "OUTPUT_COUNT";
11
+ psbtGlobal[psbtGlobal["TX_MODIFIABLE"] = 6] = "TX_MODIFIABLE";
12
+ psbtGlobal[psbtGlobal["VERSION"] = 251] = "VERSION";
13
+ })(psbtGlobal || (psbtGlobal = {}));
14
+ export var psbtIn;
15
+ (function (psbtIn) {
16
+ psbtIn[psbtIn["NON_WITNESS_UTXO"] = 0] = "NON_WITNESS_UTXO";
17
+ psbtIn[psbtIn["WITNESS_UTXO"] = 1] = "WITNESS_UTXO";
18
+ psbtIn[psbtIn["PARTIAL_SIG"] = 2] = "PARTIAL_SIG";
19
+ psbtIn[psbtIn["SIGHASH_TYPE"] = 3] = "SIGHASH_TYPE";
20
+ psbtIn[psbtIn["REDEEM_SCRIPT"] = 4] = "REDEEM_SCRIPT";
21
+ psbtIn[psbtIn["BIP32_DERIVATION"] = 6] = "BIP32_DERIVATION";
22
+ psbtIn[psbtIn["FINAL_SCRIPTSIG"] = 7] = "FINAL_SCRIPTSIG";
23
+ psbtIn[psbtIn["FINAL_SCRIPTWITNESS"] = 8] = "FINAL_SCRIPTWITNESS";
24
+ psbtIn[psbtIn["PREVIOUS_TXID"] = 14] = "PREVIOUS_TXID";
25
+ psbtIn[psbtIn["OUTPUT_INDEX"] = 15] = "OUTPUT_INDEX";
26
+ psbtIn[psbtIn["SEQUENCE"] = 16] = "SEQUENCE";
27
+ psbtIn[psbtIn["TAP_KEY_SIG"] = 19] = "TAP_KEY_SIG";
28
+ psbtIn[psbtIn["TAP_BIP32_DERIVATION"] = 22] = "TAP_BIP32_DERIVATION";
29
+ })(psbtIn || (psbtIn = {}));
30
+ export var psbtOut;
31
+ (function (psbtOut) {
32
+ psbtOut[psbtOut["REDEEM_SCRIPT"] = 0] = "REDEEM_SCRIPT";
33
+ psbtOut[psbtOut["BIP_32_DERIVATION"] = 2] = "BIP_32_DERIVATION";
34
+ psbtOut[psbtOut["AMOUNT"] = 3] = "AMOUNT";
35
+ psbtOut[psbtOut["SCRIPT"] = 4] = "SCRIPT";
36
+ psbtOut[psbtOut["TAP_BIP32_DERIVATION"] = 7] = "TAP_BIP32_DERIVATION";
37
+ })(psbtOut || (psbtOut = {}));
38
+ const PSBT_MAGIC_BYTES = Buffer.from([0x70, 0x73, 0x62, 0x74, 0xff]);
39
+ export class NoSuchEntry extends Error {
40
+ }
41
+ /**
42
+ * Implements Partially Signed Bitcoin Transaction version 2, BIP370, as
43
+ * documented at https://github.com/bitcoin/bips/blob/master/bip-0370.mediawiki
44
+ * and https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
45
+ *
46
+ * A psbt is a data structure that can carry all relevant information about a
47
+ * transaction through all stages of the signing process. From constructing an
48
+ * unsigned transaction to extracting the final serialized transaction ready for
49
+ * broadcast.
50
+ *
51
+ * This implementation is limited to what's needed in ledgerjs to carry out its
52
+ * duties, which means that support for features like multisig or taproot script
53
+ * path spending are not implemented. Specifically, it supports p2pkh,
54
+ * p2wpkhWrappedInP2sh, p2wpkh and p2tr key path spending.
55
+ *
56
+ * This class is made purposefully dumb, so it's easy to add support for
57
+ * complemantary fields as needed in the future.
58
+ */
59
+ export class PsbtV2 {
60
+ globalMap = new Map();
61
+ inputMaps = [];
62
+ outputMaps = [];
63
+ setGlobalTxVersion(version) {
64
+ this.setGlobal(psbtGlobal.TX_VERSION, uint32LE(version));
65
+ }
66
+ getGlobalTxVersion() {
67
+ return this.getGlobal(psbtGlobal.TX_VERSION).readUInt32LE(0);
68
+ }
69
+ setGlobalFallbackLocktime(locktime) {
70
+ this.setGlobal(psbtGlobal.FALLBACK_LOCKTIME, uint32LE(locktime));
71
+ }
72
+ getGlobalFallbackLocktime() {
73
+ return this.getGlobalOptional(psbtGlobal.FALLBACK_LOCKTIME)?.readUInt32LE(0);
74
+ }
75
+ setGlobalInputCount(inputCount) {
76
+ this.setGlobal(psbtGlobal.INPUT_COUNT, varint(inputCount));
77
+ }
78
+ getGlobalInputCount() {
79
+ return fromVarint(this.getGlobal(psbtGlobal.INPUT_COUNT));
80
+ }
81
+ setGlobalOutputCount(outputCount) {
82
+ this.setGlobal(psbtGlobal.OUTPUT_COUNT, varint(outputCount));
83
+ }
84
+ getGlobalOutputCount() {
85
+ return fromVarint(this.getGlobal(psbtGlobal.OUTPUT_COUNT));
86
+ }
87
+ setGlobalTxModifiable(byte) {
88
+ this.setGlobal(psbtGlobal.TX_MODIFIABLE, byte);
89
+ }
90
+ getGlobalTxModifiable() {
91
+ return this.getGlobalOptional(psbtGlobal.TX_MODIFIABLE);
92
+ }
93
+ setGlobalPsbtVersion(psbtVersion) {
94
+ this.setGlobal(psbtGlobal.VERSION, uint32LE(psbtVersion));
95
+ }
96
+ getGlobalPsbtVersion() {
97
+ return this.getGlobal(psbtGlobal.VERSION).readUInt32LE(0);
98
+ }
99
+ setInputNonWitnessUtxo(inputIndex, transaction) {
100
+ this.setInput(inputIndex, psbtIn.NON_WITNESS_UTXO, b(), transaction);
101
+ }
102
+ getInputNonWitnessUtxo(inputIndex) {
103
+ return this.getInputOptional(inputIndex, psbtIn.NON_WITNESS_UTXO, b());
104
+ }
105
+ setInputWitnessUtxo(inputIndex, amount, scriptPubKey) {
106
+ const buf = new BufferWriter();
107
+ buf.writeSlice(amount);
108
+ buf.writeVarSlice(scriptPubKey);
109
+ this.setInput(inputIndex, psbtIn.WITNESS_UTXO, b(), buf.buffer());
110
+ }
111
+ getInputWitnessUtxo(inputIndex) {
112
+ const utxo = this.getInputOptional(inputIndex, psbtIn.WITNESS_UTXO, b());
113
+ if (!utxo)
114
+ return undefined;
115
+ const buf = new BufferReader(utxo);
116
+ return { amount: buf.readSlice(8), scriptPubKey: buf.readVarSlice() };
117
+ }
118
+ setInputPartialSig(inputIndex, pubkey, signature) {
119
+ this.setInput(inputIndex, psbtIn.PARTIAL_SIG, pubkey, signature);
120
+ }
121
+ getInputPartialSig(inputIndex, pubkey) {
122
+ return this.getInputOptional(inputIndex, psbtIn.PARTIAL_SIG, pubkey);
123
+ }
124
+ setInputSighashType(inputIndex, sigHashtype) {
125
+ this.setInput(inputIndex, psbtIn.SIGHASH_TYPE, b(), uint32LE(sigHashtype));
126
+ }
127
+ getInputSighashType(inputIndex) {
128
+ const result = this.getInputOptional(inputIndex, psbtIn.SIGHASH_TYPE, b());
129
+ if (!result)
130
+ return undefined;
131
+ return result.readUInt32LE(0);
132
+ }
133
+ setInputRedeemScript(inputIndex, redeemScript) {
134
+ this.setInput(inputIndex, psbtIn.REDEEM_SCRIPT, b(), redeemScript);
135
+ }
136
+ getInputRedeemScript(inputIndex) {
137
+ return this.getInputOptional(inputIndex, psbtIn.REDEEM_SCRIPT, b());
138
+ }
139
+ setInputBip32Derivation(inputIndex, pubkey, masterFingerprint, path) {
140
+ if (pubkey.length != 33)
141
+ throw new Error("Invalid pubkey length: " + pubkey.length);
142
+ this.setInput(inputIndex, psbtIn.BIP32_DERIVATION, pubkey, this.encodeBip32Derivation(masterFingerprint, path));
143
+ }
144
+ getInputBip32Derivation(inputIndex, pubkey) {
145
+ const buf = this.getInputOptional(inputIndex, psbtIn.BIP32_DERIVATION, pubkey);
146
+ if (!buf)
147
+ return undefined;
148
+ return this.decodeBip32Derivation(buf);
149
+ }
150
+ setInputFinalScriptsig(inputIndex, scriptSig) {
151
+ this.setInput(inputIndex, psbtIn.FINAL_SCRIPTSIG, b(), scriptSig);
152
+ }
153
+ getInputFinalScriptsig(inputIndex) {
154
+ return this.getInputOptional(inputIndex, psbtIn.FINAL_SCRIPTSIG, b());
155
+ }
156
+ setInputFinalScriptwitness(inputIndex, scriptWitness) {
157
+ this.setInput(inputIndex, psbtIn.FINAL_SCRIPTWITNESS, b(), scriptWitness);
158
+ }
159
+ getInputFinalScriptwitness(inputIndex) {
160
+ return this.getInput(inputIndex, psbtIn.FINAL_SCRIPTWITNESS, b());
161
+ }
162
+ setInputPreviousTxId(inputIndex, txid) {
163
+ this.setInput(inputIndex, psbtIn.PREVIOUS_TXID, b(), txid);
164
+ }
165
+ getInputPreviousTxid(inputIndex) {
166
+ return this.getInput(inputIndex, psbtIn.PREVIOUS_TXID, b());
167
+ }
168
+ setInputOutputIndex(inputIndex, outputIndex) {
169
+ this.setInput(inputIndex, psbtIn.OUTPUT_INDEX, b(), uint32LE(outputIndex));
170
+ }
171
+ getInputOutputIndex(inputIndex) {
172
+ return this.getInput(inputIndex, psbtIn.OUTPUT_INDEX, b()).readUInt32LE(0);
173
+ }
174
+ setInputSequence(inputIndex, sequence) {
175
+ this.setInput(inputIndex, psbtIn.SEQUENCE, b(), uint32LE(sequence));
176
+ }
177
+ getInputSequence(inputIndex) {
178
+ return this.getInputOptional(inputIndex, psbtIn.SEQUENCE, b())?.readUInt32LE(0) ?? 0xffffffff;
179
+ }
180
+ setInputTapKeySig(inputIndex, sig) {
181
+ this.setInput(inputIndex, psbtIn.TAP_KEY_SIG, b(), sig);
182
+ }
183
+ getInputTapKeySig(inputIndex) {
184
+ return this.getInputOptional(inputIndex, psbtIn.TAP_KEY_SIG, b());
185
+ }
186
+ setInputTapBip32Derivation(inputIndex, pubkey, hashes, masterFingerprint, path) {
187
+ if (pubkey.length != 32)
188
+ throw new Error("Invalid pubkey length: " + pubkey.length);
189
+ const buf = this.encodeTapBip32Derivation(hashes, masterFingerprint, path);
190
+ this.setInput(inputIndex, psbtIn.TAP_BIP32_DERIVATION, pubkey, buf);
191
+ }
192
+ getInputTapBip32Derivation(inputIndex, pubkey) {
193
+ const buf = this.getInput(inputIndex, psbtIn.TAP_BIP32_DERIVATION, pubkey);
194
+ return this.decodeTapBip32Derivation(buf);
195
+ }
196
+ getInputKeyDatas(inputIndex, keyType) {
197
+ return this.getKeyDatas(this.inputMaps[inputIndex], keyType);
198
+ }
199
+ setOutputRedeemScript(outputIndex, redeemScript) {
200
+ this.setOutput(outputIndex, psbtOut.REDEEM_SCRIPT, b(), redeemScript);
201
+ }
202
+ getOutputRedeemScript(outputIndex) {
203
+ return this.getOutput(outputIndex, psbtOut.REDEEM_SCRIPT, b());
204
+ }
205
+ setOutputBip32Derivation(outputIndex, pubkey, masterFingerprint, path) {
206
+ this.setOutput(outputIndex, psbtOut.BIP_32_DERIVATION, pubkey, this.encodeBip32Derivation(masterFingerprint, path));
207
+ }
208
+ getOutputBip32Derivation(outputIndex, pubkey) {
209
+ const buf = this.getOutput(outputIndex, psbtOut.BIP_32_DERIVATION, pubkey);
210
+ return this.decodeBip32Derivation(buf);
211
+ }
212
+ setOutputAmount(outputIndex, amount) {
213
+ this.setOutput(outputIndex, psbtOut.AMOUNT, b(), uint64LE(amount));
214
+ }
215
+ getOutputAmount(outputIndex) {
216
+ const buf = this.getOutput(outputIndex, psbtOut.AMOUNT, b());
217
+ return unsafeFrom64bitLE(buf);
218
+ }
219
+ setOutputScript(outputIndex, scriptPubKey) {
220
+ this.setOutput(outputIndex, psbtOut.SCRIPT, b(), scriptPubKey);
221
+ }
222
+ getOutputScript(outputIndex) {
223
+ return this.getOutput(outputIndex, psbtOut.SCRIPT, b());
224
+ }
225
+ setOutputTapBip32Derivation(outputIndex, pubkey, hashes, fingerprint, path) {
226
+ const buf = this.encodeTapBip32Derivation(hashes, fingerprint, path);
227
+ this.setOutput(outputIndex, psbtOut.TAP_BIP32_DERIVATION, pubkey, buf);
228
+ }
229
+ getOutputTapBip32Derivation(outputIndex, pubkey) {
230
+ const buf = this.getOutput(outputIndex, psbtOut.TAP_BIP32_DERIVATION, pubkey);
231
+ return this.decodeTapBip32Derivation(buf);
232
+ }
233
+ deleteInputEntries(inputIndex, keyTypes) {
234
+ const map = this.inputMaps[inputIndex];
235
+ map.forEach((_v, k, m) => {
236
+ if (this.isKeyType(k, keyTypes)) {
237
+ m.delete(k);
238
+ }
239
+ });
240
+ }
241
+ copy(to) {
242
+ this.copyMap(this.globalMap, to.globalMap);
243
+ this.copyMaps(this.inputMaps, to.inputMaps);
244
+ this.copyMaps(this.outputMaps, to.outputMaps);
245
+ }
246
+ copyMaps(from, to) {
247
+ from.forEach((m, index) => {
248
+ const to_index = new Map();
249
+ this.copyMap(m, to_index);
250
+ to[index] = to_index;
251
+ });
252
+ }
253
+ copyMap(from, to) {
254
+ from.forEach((v, k) => to.set(k, Buffer.from(v)));
255
+ }
256
+ serialize() {
257
+ const buf = new BufferWriter();
258
+ buf.writeSlice(PSBT_MAGIC_BYTES);
259
+ serializeMap(buf, this.globalMap);
260
+ this.inputMaps.forEach(map => {
261
+ serializeMap(buf, map);
262
+ });
263
+ this.outputMaps.forEach(map => {
264
+ serializeMap(buf, map);
265
+ });
266
+ return buf.buffer();
267
+ }
268
+ deserialize(psbt) {
269
+ const buf = new BufferReader(psbt);
270
+ if (!buf.readSlice(5).equals(PSBT_MAGIC_BYTES)) {
271
+ throw new Error("Invalid magic bytes");
272
+ }
273
+ while (this.readKeyPair(this.globalMap, buf))
274
+ ;
275
+ for (let i = 0; i < this.getGlobalInputCount(); i++) {
276
+ this.inputMaps[i] = new Map();
277
+ while (this.readKeyPair(this.inputMaps[i], buf))
278
+ ;
279
+ }
280
+ for (let i = 0; i < this.getGlobalOutputCount(); i++) {
281
+ this.outputMaps[i] = new Map();
282
+ while (this.readKeyPair(this.outputMaps[i], buf))
283
+ ;
284
+ }
285
+ }
286
+ /**
287
+ * Attempts to extract the version number as uint32LE from raw psbt regardless
288
+ * of psbt validity.
289
+ *
290
+ * @param psbt - PSBT buffer to extract version from
291
+ * @returns The PSBT version number, or 0 if no version field is found (indicating PSBTv0)
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * const psbtBuffer = Buffer.from('cHNidP8BAH...', 'base64');
296
+ * const version = PsbtV2.getPsbtVersionNumber(psbtBuffer);
297
+ * if (version === 2) {
298
+ * // Handle PSBTv2
299
+ * } else {
300
+ * // Handle PSBTv0
301
+ * }
302
+ * ```
303
+ */
304
+ static getPsbtVersionNumber(psbt) {
305
+ const map = new Map();
306
+ const buf = new BufferReader(psbt.subarray(PSBT_MAGIC_BYTES.length));
307
+ // Read global map key-value pairs
308
+ while (buf.available() > 0) {
309
+ const keyLen = buf.readVarInt();
310
+ if (keyLen === 0)
311
+ break; // End of global map
312
+ const keyType = buf.readUInt8();
313
+ const keyData = keyLen > 1 ? buf.readSlice(keyLen - 1) : Buffer.alloc(0);
314
+ const key = Buffer.concat([Buffer.from([keyType]), keyData]).toString("hex");
315
+ const valueLen = buf.readVarInt();
316
+ const value = valueLen > 0 ? buf.readSlice(valueLen) : Buffer.alloc(0);
317
+ map.set(key, value);
318
+ }
319
+ // Look for PSBT version field (0xfb)
320
+ const versionKey = Buffer.from([psbtGlobal.VERSION]).toString("hex");
321
+ const versionValue = map.get(versionKey);
322
+ return versionValue ? versionValue.readUInt32LE(0) : 0;
323
+ }
324
+ /**
325
+ * Converts a PSBTv0 (from bitcoinjs-lib) to PSBTv2.
326
+ *
327
+ * This method deserializes a PSBTv0 buffer and converts it
328
+ * to the PSBTv2 format, preserving all relevant fields including:
329
+ * - Transaction version and locktime
330
+ * - Inputs (UTXOs, derivation paths, sequences, signatures)
331
+ * - Outputs (amounts, scripts, derivation paths)
332
+ * - Finalized scripts (if present)
333
+ *
334
+ * The method follows the PSBT role saga defined in BIP174:
335
+ * 1. Creator Role - Initialize PSBTv2 with version and counts
336
+ * 2. Constructor Role - Add inputs and outputs
337
+ * 3. Signer Role - Transfer partial signatures
338
+ * 4. Input Finalizer - Transfer finalized scripts
339
+ *
340
+ * @param psbt - PSBTv0 as Buffer
341
+ * @param allowTxnVersion1 - Allow transaction version 1 (default: false).
342
+ * Version 2 is recommended per BIP68.
343
+ * @returns A new PsbtV2 instance with converted data
344
+ * @throws Error if PSBT is invalid or contains unsupported features
345
+ *
346
+ * @example
347
+ * ```typescript
348
+ * const psbtV0Buffer = Buffer.from('cHNidP8BAH...', 'base64');
349
+ * const psbtV2 = PsbtV2.fromV0(psbtV0Buffer);
350
+ * ```
351
+ */
352
+ static fromV0(psbt, allowTxnVersion1 = false) {
353
+ const psbtv0 = Psbt.fromBuffer(psbt);
354
+ // Creator Role - Initialize PSBTv2
355
+ const psbtv2 = new PsbtV2();
356
+ PsbtV2.initializeFromV0(psbtv2, psbtv0, allowTxnVersion1);
357
+ // Constructor Role - Add inputs and outputs
358
+ const txBuffer = psbtv0.data.getTransaction();
359
+ const tx = Transaction.fromBuffer(txBuffer);
360
+ PsbtV2.addInputsFromV0(psbtv2, psbtv0, tx);
361
+ PsbtV2.addOutputsFromV0(psbtv2, psbtv0, tx);
362
+ // Signer Role - Transfer partial signatures
363
+ PsbtV2.transferPartialSignatures(psbtv2, psbtv0);
364
+ // Input Finalizer - Transfer finalized scripts
365
+ PsbtV2.transferFinalizedScripts(psbtv2, psbtv0);
366
+ return psbtv2;
367
+ }
368
+ static initializeFromV0(psbtv2, psbtv0, allowTxnVersion1) {
369
+ const txVersion = psbtv0.data.getTransaction().readInt32LE(0);
370
+ if (txVersion === 1 && !allowTxnVersion1) {
371
+ throw new Error("Transaction version 1 detected. PSBTv2 recommends version 2 for BIP68 sequence support. " +
372
+ "Pass allowTxnVersion1=true to override.");
373
+ }
374
+ psbtv2.setGlobalTxVersion(txVersion);
375
+ psbtv2.setGlobalFallbackLocktime(psbtv0.locktime);
376
+ psbtv2.setGlobalInputCount(psbtv0.data.inputs.length);
377
+ psbtv2.setGlobalOutputCount(psbtv0.data.outputs.length);
378
+ psbtv2.setGlobalPsbtVersion(2);
379
+ }
380
+ static addInputsFromV0(psbtv2, psbtv0, tx) {
381
+ for (const [index, input] of psbtv0.data.inputs.entries()) {
382
+ // Required fields for PSBTv2 - get from the embedded transaction
383
+ psbtv2.setInputPreviousTxId(index, Buffer.from(tx.ins[index].hash).reverse());
384
+ psbtv2.setInputOutputIndex(index, tx.ins[index].index);
385
+ psbtv2.setInputSequence(index, tx.ins[index].sequence);
386
+ // Optional UTXO information
387
+ if (input.nonWitnessUtxo) {
388
+ psbtv2.setInputNonWitnessUtxo(index, input.nonWitnessUtxo);
389
+ }
390
+ if (input.witnessUtxo) {
391
+ // Convert bitcoinjs-lib format {value, script} to PSBTv2 format {amount, scriptPubKey}
392
+ const amount = unsafeTo64bitLE(input.witnessUtxo.value);
393
+ psbtv2.setInputWitnessUtxo(index, amount, input.witnessUtxo.script);
394
+ }
395
+ // Optional scripts and derivation
396
+ if (input.redeemScript) {
397
+ psbtv2.setInputRedeemScript(index, input.redeemScript);
398
+ }
399
+ if (input.sighashType !== undefined) {
400
+ psbtv2.setInputSighashType(index, input.sighashType);
401
+ }
402
+ if (input.bip32Derivation) {
403
+ for (const deriv of input.bip32Derivation) {
404
+ psbtv2.setInputBip32Derivation(index, deriv.pubkey, deriv.masterFingerprint, parseBip32Path(deriv.path));
405
+ }
406
+ }
407
+ }
408
+ }
409
+ static addOutputsFromV0(psbtv2, psbtv0, tx) {
410
+ // Constructor Role - Add outputs
411
+ for (const [index, output] of psbtv0.data.outputs.entries()) {
412
+ // Required fields for PSBTv2 - get from the embedded transaction
413
+ psbtv2.setOutputAmount(index, tx.outs[index].value);
414
+ psbtv2.setOutputScript(index, tx.outs[index].script);
415
+ // Optional fields
416
+ if (output.redeemScript) {
417
+ psbtv2.setOutputRedeemScript(index, output.redeemScript);
418
+ }
419
+ if (output.bip32Derivation) {
420
+ for (const deriv of output.bip32Derivation) {
421
+ psbtv2.setOutputBip32Derivation(index, deriv.pubkey, deriv.masterFingerprint, parseBip32Path(deriv.path));
422
+ }
423
+ }
424
+ }
425
+ }
426
+ static transferPartialSignatures(psbtv2, psbtv0) {
427
+ for (const [index, input] of psbtv0.data.inputs.entries()) {
428
+ if (input.partialSig) {
429
+ for (const sig of input.partialSig) {
430
+ psbtv2.setInputPartialSig(index, sig.pubkey, sig.signature);
431
+ }
432
+ }
433
+ }
434
+ }
435
+ static transferFinalizedScripts(psbtv2, psbtv0) {
436
+ // Input Finalizer - Transfer finalized scripts
437
+ // Note: Per BIP174, the Input Finalizer should remove other fields after
438
+ // finalization, but we preserve them for compatibility with the source PSBTv0
439
+ for (const [index, input] of psbtv0.data.inputs.entries()) {
440
+ if (input.finalScriptSig) {
441
+ psbtv2.setInputFinalScriptsig(index, input.finalScriptSig);
442
+ }
443
+ if (input.finalScriptWitness) {
444
+ psbtv2.setInputFinalScriptwitness(index, input.finalScriptWitness);
445
+ }
446
+ }
447
+ }
448
+ readKeyPair(map, buf) {
449
+ const keyLen = buf.readVarInt();
450
+ if (keyLen == 0) {
451
+ return false;
452
+ }
453
+ const keyType = buf.readUInt8();
454
+ const keyData = buf.readSlice(keyLen - 1);
455
+ const value = buf.readVarSlice();
456
+ set(map, keyType, keyData, value);
457
+ return true;
458
+ }
459
+ getKeyDatas(map, keyType) {
460
+ const result = [];
461
+ map.forEach((_v, k) => {
462
+ if (this.isKeyType(k, [keyType])) {
463
+ result.push(Buffer.from(k.substring(2), "hex"));
464
+ }
465
+ });
466
+ return result;
467
+ }
468
+ isKeyType(hexKey, keyTypes) {
469
+ const keyType = Buffer.from(hexKey.substring(0, 2), "hex").readUInt8(0);
470
+ return keyTypes.some(k => k == keyType);
471
+ }
472
+ setGlobal(keyType, value) {
473
+ const key = new Key(keyType, Buffer.from([]));
474
+ this.globalMap.set(key.toString(), value);
475
+ }
476
+ getGlobal(keyType) {
477
+ return get(this.globalMap, keyType, b(), false);
478
+ }
479
+ getGlobalOptional(keyType) {
480
+ return get(this.globalMap, keyType, b(), true);
481
+ }
482
+ setInput(index, keyType, keyData, value) {
483
+ set(this.getMap(index, this.inputMaps), keyType, keyData, value);
484
+ }
485
+ getInput(index, keyType, keyData) {
486
+ return get(this.inputMaps[index], keyType, keyData, false);
487
+ }
488
+ getInputOptional(index, keyType, keyData) {
489
+ return get(this.inputMaps[index], keyType, keyData, true);
490
+ }
491
+ setOutput(index, keyType, keyData, value) {
492
+ set(this.getMap(index, this.outputMaps), keyType, keyData, value);
493
+ }
494
+ getOutput(index, keyType, keyData) {
495
+ return get(this.outputMaps[index], keyType, keyData, false);
496
+ }
497
+ getMap(index, maps) {
498
+ if (!maps[index]) {
499
+ maps[index] = new Map();
500
+ }
501
+ return maps[index];
502
+ }
503
+ encodeBip32Derivation(masterFingerprint, path) {
504
+ const buf = new BufferWriter();
505
+ this.writeBip32Derivation(buf, masterFingerprint, path);
506
+ return buf.buffer();
507
+ }
508
+ decodeBip32Derivation(buffer) {
509
+ const buf = new BufferReader(buffer);
510
+ return this.readBip32Derivation(buf);
511
+ }
512
+ writeBip32Derivation(buf, masterFingerprint, path) {
513
+ buf.writeSlice(masterFingerprint);
514
+ path.forEach(element => {
515
+ buf.writeUInt32(element);
516
+ });
517
+ }
518
+ readBip32Derivation(buf) {
519
+ const masterFingerprint = buf.readSlice(4);
520
+ const path = [];
521
+ while (buf.offset < buf.buffer.length) {
522
+ path.push(buf.readUInt32());
523
+ }
524
+ return { masterFingerprint, path };
525
+ }
526
+ encodeTapBip32Derivation(hashes, masterFingerprint, path) {
527
+ const buf = new BufferWriter();
528
+ buf.writeVarInt(hashes.length);
529
+ hashes.forEach(h => {
530
+ buf.writeSlice(h);
531
+ });
532
+ this.writeBip32Derivation(buf, masterFingerprint, path);
533
+ return buf.buffer();
534
+ }
535
+ decodeTapBip32Derivation(buffer) {
536
+ const buf = new BufferReader(buffer);
537
+ const hashCount = buf.readVarInt();
538
+ const hashes = [];
539
+ for (let i = 0; i < hashCount; i++) {
540
+ hashes.push(buf.readSlice(32));
541
+ }
542
+ const deriv = this.readBip32Derivation(buf);
543
+ return { hashes, ...deriv };
544
+ }
545
+ }
546
+ function get(map, keyType, keyData, acceptUndefined) {
547
+ if (!map)
548
+ throw new Error("No such map");
549
+ const key = new Key(keyType, keyData);
550
+ const value = map.get(key.toString());
551
+ if (!value) {
552
+ if (acceptUndefined) {
553
+ return undefined;
554
+ }
555
+ throw new NoSuchEntry(key.toString());
556
+ }
557
+ // Make sure to return a copy, to protect the underlying data.
558
+ return Buffer.from(value);
559
+ }
560
+ class Key {
561
+ keyType;
562
+ keyData;
563
+ constructor(keyType, keyData) {
564
+ this.keyType = keyType;
565
+ this.keyData = keyData;
566
+ }
567
+ toString() {
568
+ const buf = new BufferWriter();
569
+ this.toBuffer(buf);
570
+ return buf.buffer().toString("hex");
571
+ }
572
+ serialize(buf) {
573
+ buf.writeVarInt(1 + this.keyData.length);
574
+ this.toBuffer(buf);
575
+ }
576
+ toBuffer(buf) {
577
+ buf.writeUInt8(this.keyType);
578
+ buf.writeSlice(this.keyData);
579
+ }
580
+ }
581
+ class KeyPair {
582
+ key;
583
+ value;
584
+ constructor(key, value) {
585
+ this.key = key;
586
+ this.value = value;
587
+ }
588
+ serialize(buf) {
589
+ this.key.serialize(buf);
590
+ buf.writeVarSlice(this.value);
591
+ }
592
+ }
593
+ function createKey(buf) {
594
+ return new Key(buf.readUInt8(0), buf.subarray(1));
595
+ }
596
+ function serializeMap(buf, map) {
597
+ for (const k of map.keys()) {
598
+ const value = map.get(k);
599
+ const keyPair = new KeyPair(createKey(Buffer.from(k, "hex")), value);
600
+ keyPair.serialize(buf);
601
+ }
602
+ buf.writeUInt8(0);
603
+ }
604
+ function b() {
605
+ return Buffer.from([]);
606
+ }
607
+ function set(map, keyType, keyData, value) {
608
+ const key = new Key(keyType, keyData);
609
+ map.set(key.toString(), value);
610
+ }
611
+ function uint32LE(n) {
612
+ const b = Buffer.alloc(4);
613
+ b.writeUInt32LE(n, 0);
614
+ return b;
615
+ }
616
+ function uint64LE(n) {
617
+ return unsafeTo64bitLE(n);
618
+ }
619
+ function varint(n) {
620
+ const b = new BufferWriter();
621
+ b.writeVarInt(n);
622
+ return b.buffer();
623
+ }
624
+ function fromVarint(buf) {
625
+ return new BufferReader(buf).readVarInt();
626
+ }
627
+ export function parseBip32Path(path) {
628
+ return path
629
+ .split("/")
630
+ .slice(1)
631
+ .map(s => {
632
+ const hardened = s.endsWith("'") || s.endsWith("h");
633
+ const base = hardened ? s.slice(0, -1) : s;
634
+ const num = Number(base);
635
+ if (Number.isNaN(num)) {
636
+ throw new TypeError(`Invalid BIP32 path segment: ${path}`);
637
+ }
638
+ return hardened ? num + 0x80000000 : num;
639
+ });
640
+ }
641
+ //# sourceMappingURL=psbtv2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psbtv2.js","sourceRoot":"","sources":["../src/psbtv2.ts"],"names":[],"mappings":"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"}