@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.
- package/.turbo/turbo-build.log +4 -0
- package/LICENSE.txt +21 -0
- package/README.md +91 -0
- package/jest.config.js +26 -0
- package/lib/buffertools.d.ts +29 -0
- package/lib/buffertools.d.ts.map +1 -0
- package/lib/buffertools.js +129 -0
- package/lib/buffertools.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/index.js.map +1 -0
- package/lib/psbtParsing.d.ts +15 -0
- package/lib/psbtParsing.d.ts.map +1 -0
- package/lib/psbtParsing.js +52 -0
- package/lib/psbtParsing.js.map +1 -0
- package/lib/psbtv2.d.ts +200 -0
- package/lib/psbtv2.d.ts.map +1 -0
- package/lib/psbtv2.js +647 -0
- package/lib/psbtv2.js.map +1 -0
- package/lib-es/buffertools.d.ts +29 -0
- package/lib-es/buffertools.d.ts.map +1 -0
- package/lib-es/buffertools.js +119 -0
- package/lib-es/buffertools.js.map +1 -0
- package/lib-es/index.d.ts +4 -0
- package/lib-es/index.d.ts.map +1 -0
- package/lib-es/index.js +4 -0
- package/lib-es/index.js.map +1 -0
- package/lib-es/psbtParsing.d.ts +15 -0
- package/lib-es/psbtParsing.d.ts.map +1 -0
- package/lib-es/psbtParsing.js +48 -0
- package/lib-es/psbtParsing.js.map +1 -0
- package/lib-es/psbtv2.d.ts +200 -0
- package/lib-es/psbtv2.d.ts.map +1 -0
- package/lib-es/psbtv2.js +641 -0
- package/lib-es/psbtv2.js.map +1 -0
- package/package.json +78 -0
- package/src/buffertools.test.ts +116 -0
- package/src/buffertools.ts +137 -0
- package/src/fromV0.test.ts +577 -0
- package/src/index.ts +3 -0
- package/src/psbtParsing.test.ts +86 -0
- package/src/psbtParsing.ts +51 -0
- package/src/psbtv2.test.ts +441 -0
- package/src/psbtv2.ts +740 -0
- package/tsconfig.json +9 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2017-present Ledger https://www.ledger.com/
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# @ledgerhq/psbtv2
|
|
2
|
+
|
|
3
|
+
Partially Signed Bitcoin Transaction version 2 (PSBT v2) implementation following BIP370 and BIP174.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This package provides a TypeScript implementation of PSBT v2, which is a data structure that carries all relevant information about a Bitcoin transaction through all stages of the signing process - from constructing an unsigned transaction to extracting the final serialized transaction ready for broadcast.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- Full PSBT v2 support (BIP370)
|
|
12
|
+
- Backward compatible with PSBT v0 (BIP174)
|
|
13
|
+
- Support for various address types:
|
|
14
|
+
- P2PKH (Legacy)
|
|
15
|
+
- P2WPKH-in-P2SH (Nested SegWit)
|
|
16
|
+
- P2WPKH (Native SegWit)
|
|
17
|
+
- P2TR (Taproot key path spending)
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { PsbtV2 } from "@ledgerhq/psbtv2";
|
|
23
|
+
|
|
24
|
+
// Create a new PSBT
|
|
25
|
+
const psbt = new PsbtV2();
|
|
26
|
+
|
|
27
|
+
// Deserialize from buffer
|
|
28
|
+
psbt.deserialize(psbtBuffer);
|
|
29
|
+
|
|
30
|
+
// Convert from PSBT v0 to v2
|
|
31
|
+
const psbtV0Buffer = Buffer.from("cHNidP8BAH...", "base64");
|
|
32
|
+
const psbtV2 = PsbtV2.fromV0(psbtV0Buffer);
|
|
33
|
+
|
|
34
|
+
// Allow transaction version 1 (version 2 is recommended per BIP68)
|
|
35
|
+
const psbtV2WithV1 = PsbtV2.fromV0(psbtV0Buffer, true);
|
|
36
|
+
|
|
37
|
+
// Access global fields
|
|
38
|
+
const version = psbt.getGlobalTxVersion();
|
|
39
|
+
const inputCount = psbt.getGlobalInputCount();
|
|
40
|
+
const outputCount = psbt.getGlobalOutputCount();
|
|
41
|
+
|
|
42
|
+
// Access input fields
|
|
43
|
+
const previousTxid = psbt.getInputPreviousTxid(0);
|
|
44
|
+
const outputIndex = psbt.getInputOutputIndex(0);
|
|
45
|
+
|
|
46
|
+
// Access output fields
|
|
47
|
+
const amount = psbt.getOutputAmount(0);
|
|
48
|
+
const script = psbt.getOutputScript(0);
|
|
49
|
+
|
|
50
|
+
// Serialize back to buffer
|
|
51
|
+
const serialized = psbt.serialize();
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## API
|
|
55
|
+
|
|
56
|
+
### Global Fields
|
|
57
|
+
|
|
58
|
+
- Transaction version
|
|
59
|
+
- Fallback locktime
|
|
60
|
+
- Input count
|
|
61
|
+
- Output count
|
|
62
|
+
- TX modifiable flags
|
|
63
|
+
- PSBT version
|
|
64
|
+
|
|
65
|
+
### Input Fields
|
|
66
|
+
|
|
67
|
+
- Non-witness UTXO
|
|
68
|
+
- Witness UTXO
|
|
69
|
+
- Partial signatures
|
|
70
|
+
- Sighash type
|
|
71
|
+
- Redeem script
|
|
72
|
+
- BIP32 derivation paths
|
|
73
|
+
- Final scriptsig
|
|
74
|
+
- Final scriptwitness
|
|
75
|
+
- Previous transaction ID
|
|
76
|
+
- Output index
|
|
77
|
+
- Sequence
|
|
78
|
+
- Taproot key signatures
|
|
79
|
+
- Taproot BIP32 derivation
|
|
80
|
+
|
|
81
|
+
### Output Fields
|
|
82
|
+
|
|
83
|
+
- Redeem script
|
|
84
|
+
- BIP32 derivation paths
|
|
85
|
+
- Amount
|
|
86
|
+
- Script pubkey
|
|
87
|
+
- Taproot BIP32 derivation
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
Apache-2.0
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
testEnvironment: "node",
|
|
3
|
+
testPathIgnorePatterns: ["lib/", "lib-es/"],
|
|
4
|
+
roots: ["<rootDir>/src"],
|
|
5
|
+
testMatch: ["**/*.test.ts"],
|
|
6
|
+
transform: {
|
|
7
|
+
"^.+\\.(t|j)sx?$": [
|
|
8
|
+
"@swc/jest",
|
|
9
|
+
{
|
|
10
|
+
jsc: {
|
|
11
|
+
target: "esnext",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
collectCoverageFrom: ["src/**/*.ts", "!src/index.ts", "!src/**/*.d.ts", "!src/**/*.test.ts"],
|
|
17
|
+
coverageReporters: ["json", ["lcov", { file: "lcov.info", projectRoot: "../../" }], "text"],
|
|
18
|
+
reporters: [
|
|
19
|
+
"default",
|
|
20
|
+
["jest-sonar", { outputName: "sonar-executionTests-report.xml", reportedFilePath: "absolute" }],
|
|
21
|
+
],
|
|
22
|
+
moduleNameMapper: {
|
|
23
|
+
"^@ledgerhq/live-env$": "<rootDir>/src/__mocks__/live-env.ts",
|
|
24
|
+
"^@ledgerhq/(.*)$": "<rootDir>/../../libs/$1/src",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare function unsafeTo64bitLE(n: number): Buffer;
|
|
2
|
+
export declare function unsafeFrom64bitLE(byteArray: Buffer): number;
|
|
3
|
+
export declare class BufferWriter {
|
|
4
|
+
private readonly bufs;
|
|
5
|
+
write(alloc: number, fn: (b: Buffer) => void): void;
|
|
6
|
+
writeUInt8(i: number): void;
|
|
7
|
+
writeInt32(i: number): void;
|
|
8
|
+
writeUInt32(i: number): void;
|
|
9
|
+
writeUInt64(i: number): void;
|
|
10
|
+
writeVarInt(i: number): void;
|
|
11
|
+
writeSlice(slice: Buffer): void;
|
|
12
|
+
writeVarSlice(slice: Buffer): void;
|
|
13
|
+
buffer(): Buffer;
|
|
14
|
+
}
|
|
15
|
+
export declare class BufferReader {
|
|
16
|
+
buffer: Buffer;
|
|
17
|
+
offset: number;
|
|
18
|
+
constructor(buffer: Buffer, offset?: number);
|
|
19
|
+
available(): number;
|
|
20
|
+
readUInt8(): number;
|
|
21
|
+
readInt32(): number;
|
|
22
|
+
readUInt32(): number;
|
|
23
|
+
readUInt64(): number;
|
|
24
|
+
readVarInt(): number;
|
|
25
|
+
readSlice(n: number): Buffer;
|
|
26
|
+
readVarSlice(): Buffer;
|
|
27
|
+
readVector(): Buffer[];
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=buffertools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffertools.d.ts","sourceRoot":"","sources":["../src/buffertools.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAe3D;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IAErC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAMnD,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK5B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlC,MAAM,IAAI,MAAM;CAGjB;AAED,qBAAa,YAAY;IAEd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;gBADd,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAU;IAG3B,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,MAAM;IAMnB,SAAS,IAAI,MAAM;IAMnB,UAAU,IAAI,MAAM;IAMpB,UAAU,IAAI,MAAM;IAMpB,UAAU,IAAI,MAAM;IAMpB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAS5B,YAAY,IAAI,MAAM;IAItB,UAAU,IAAI,MAAM,EAAE;CAMvB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BufferReader = exports.BufferWriter = void 0;
|
|
7
|
+
exports.unsafeTo64bitLE = unsafeTo64bitLE;
|
|
8
|
+
exports.unsafeFrom64bitLE = unsafeFrom64bitLE;
|
|
9
|
+
const varuint_bitcoin_1 = __importDefault(require("varuint-bitcoin"));
|
|
10
|
+
function unsafeTo64bitLE(n) {
|
|
11
|
+
// we want to represent the input as a 8-bytes array
|
|
12
|
+
if (n > Number.MAX_SAFE_INTEGER) {
|
|
13
|
+
throw new Error("Can't convert numbers > MAX_SAFE_INT");
|
|
14
|
+
}
|
|
15
|
+
const byteArray = Buffer.alloc(8, 0);
|
|
16
|
+
for (let index = 0; index < byteArray.length; index++) {
|
|
17
|
+
const byte = n & 0xff;
|
|
18
|
+
byteArray[index] = byte;
|
|
19
|
+
n = (n - byte) / 256;
|
|
20
|
+
}
|
|
21
|
+
return byteArray;
|
|
22
|
+
}
|
|
23
|
+
function unsafeFrom64bitLE(byteArray) {
|
|
24
|
+
let value = 0;
|
|
25
|
+
if (byteArray.length != 8) {
|
|
26
|
+
throw new Error("Expected Buffer of length 8");
|
|
27
|
+
}
|
|
28
|
+
if (byteArray[7] != 0) {
|
|
29
|
+
throw new Error("Can't encode numbers > MAX_SAFE_INT");
|
|
30
|
+
}
|
|
31
|
+
if (byteArray[6] > 0x1f) {
|
|
32
|
+
throw new Error("Can't encode numbers > MAX_SAFE_INT");
|
|
33
|
+
}
|
|
34
|
+
for (let i = byteArray.length - 1; i >= 0; i--) {
|
|
35
|
+
value = value * 256 + byteArray[i];
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
class BufferWriter {
|
|
40
|
+
bufs = [];
|
|
41
|
+
write(alloc, fn) {
|
|
42
|
+
const b = Buffer.alloc(alloc);
|
|
43
|
+
fn(b);
|
|
44
|
+
this.bufs.push(b);
|
|
45
|
+
}
|
|
46
|
+
writeUInt8(i) {
|
|
47
|
+
this.write(1, b => b.writeUInt8(i, 0));
|
|
48
|
+
}
|
|
49
|
+
writeInt32(i) {
|
|
50
|
+
this.write(4, b => b.writeInt32LE(i, 0));
|
|
51
|
+
}
|
|
52
|
+
writeUInt32(i) {
|
|
53
|
+
this.write(4, b => b.writeUInt32LE(i, 0));
|
|
54
|
+
}
|
|
55
|
+
writeUInt64(i) {
|
|
56
|
+
const bytes = unsafeTo64bitLE(i);
|
|
57
|
+
this.writeSlice(bytes);
|
|
58
|
+
}
|
|
59
|
+
writeVarInt(i) {
|
|
60
|
+
this.bufs.push(varuint_bitcoin_1.default.encode(i));
|
|
61
|
+
}
|
|
62
|
+
writeSlice(slice) {
|
|
63
|
+
this.bufs.push(Buffer.from(slice));
|
|
64
|
+
}
|
|
65
|
+
writeVarSlice(slice) {
|
|
66
|
+
this.writeVarInt(slice.length);
|
|
67
|
+
this.writeSlice(slice);
|
|
68
|
+
}
|
|
69
|
+
buffer() {
|
|
70
|
+
return Buffer.concat(this.bufs);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.BufferWriter = BufferWriter;
|
|
74
|
+
class BufferReader {
|
|
75
|
+
buffer;
|
|
76
|
+
offset;
|
|
77
|
+
constructor(buffer, offset = 0) {
|
|
78
|
+
this.buffer = buffer;
|
|
79
|
+
this.offset = offset;
|
|
80
|
+
}
|
|
81
|
+
available() {
|
|
82
|
+
return this.buffer.length - this.offset;
|
|
83
|
+
}
|
|
84
|
+
readUInt8() {
|
|
85
|
+
const result = this.buffer.readUInt8(this.offset);
|
|
86
|
+
this.offset++;
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
readInt32() {
|
|
90
|
+
const result = this.buffer.readInt32LE(this.offset);
|
|
91
|
+
this.offset += 4;
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
readUInt32() {
|
|
95
|
+
const result = this.buffer.readUInt32LE(this.offset);
|
|
96
|
+
this.offset += 4;
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
readUInt64() {
|
|
100
|
+
const buf = this.readSlice(8);
|
|
101
|
+
const n = unsafeFrom64bitLE(buf);
|
|
102
|
+
return n;
|
|
103
|
+
}
|
|
104
|
+
readVarInt() {
|
|
105
|
+
const vi = varuint_bitcoin_1.default.decode(this.buffer, this.offset);
|
|
106
|
+
this.offset += varuint_bitcoin_1.default.decode.bytes;
|
|
107
|
+
return vi;
|
|
108
|
+
}
|
|
109
|
+
readSlice(n) {
|
|
110
|
+
if (this.buffer.length < this.offset + n) {
|
|
111
|
+
throw new Error("Cannot read slice out of bounds");
|
|
112
|
+
}
|
|
113
|
+
const result = this.buffer.slice(this.offset, this.offset + n);
|
|
114
|
+
this.offset += n;
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
readVarSlice() {
|
|
118
|
+
return this.readSlice(this.readVarInt());
|
|
119
|
+
}
|
|
120
|
+
readVector() {
|
|
121
|
+
const count = this.readVarInt();
|
|
122
|
+
const vector = [];
|
|
123
|
+
for (let i = 0; i < count; i++)
|
|
124
|
+
vector.push(this.readVarSlice());
|
|
125
|
+
return vector;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.BufferReader = BufferReader;
|
|
129
|
+
//# sourceMappingURL=buffertools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffertools.js","sourceRoot":"","sources":["../src/buffertools.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { PsbtV2, psbtGlobal, psbtIn, psbtOut, NoSuchEntry } from "./psbtv2";
|
|
2
|
+
export { BufferReader, BufferWriter, unsafeTo64bitLE, unsafeFrom64bitLE } from "./buffertools";
|
|
3
|
+
export { normalizeToBuffer, parsePsbt } from "./psbtParsing";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePsbt = exports.normalizeToBuffer = exports.unsafeFrom64bitLE = exports.unsafeTo64bitLE = exports.BufferWriter = exports.BufferReader = exports.NoSuchEntry = exports.psbtOut = exports.psbtIn = exports.psbtGlobal = exports.PsbtV2 = void 0;
|
|
4
|
+
var psbtv2_1 = require("./psbtv2");
|
|
5
|
+
Object.defineProperty(exports, "PsbtV2", { enumerable: true, get: function () { return psbtv2_1.PsbtV2; } });
|
|
6
|
+
Object.defineProperty(exports, "psbtGlobal", { enumerable: true, get: function () { return psbtv2_1.psbtGlobal; } });
|
|
7
|
+
Object.defineProperty(exports, "psbtIn", { enumerable: true, get: function () { return psbtv2_1.psbtIn; } });
|
|
8
|
+
Object.defineProperty(exports, "psbtOut", { enumerable: true, get: function () { return psbtv2_1.psbtOut; } });
|
|
9
|
+
Object.defineProperty(exports, "NoSuchEntry", { enumerable: true, get: function () { return psbtv2_1.NoSuchEntry; } });
|
|
10
|
+
var buffertools_1 = require("./buffertools");
|
|
11
|
+
Object.defineProperty(exports, "BufferReader", { enumerable: true, get: function () { return buffertools_1.BufferReader; } });
|
|
12
|
+
Object.defineProperty(exports, "BufferWriter", { enumerable: true, get: function () { return buffertools_1.BufferWriter; } });
|
|
13
|
+
Object.defineProperty(exports, "unsafeTo64bitLE", { enumerable: true, get: function () { return buffertools_1.unsafeTo64bitLE; } });
|
|
14
|
+
Object.defineProperty(exports, "unsafeFrom64bitLE", { enumerable: true, get: function () { return buffertools_1.unsafeFrom64bitLE; } });
|
|
15
|
+
var psbtParsing_1 = require("./psbtParsing");
|
|
16
|
+
Object.defineProperty(exports, "normalizeToBuffer", { enumerable: true, get: function () { return psbtParsing_1.normalizeToBuffer; } });
|
|
17
|
+
Object.defineProperty(exports, "parsePsbt", { enumerable: true, get: function () { return psbtParsing_1.parsePsbt; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA4E;AAAnE,gGAAA,MAAM,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,iGAAA,OAAO,OAAA;AAAE,qGAAA,WAAW,OAAA;AACzD,6CAA+F;AAAtF,2GAAA,YAAY,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,gHAAA,iBAAiB,OAAA;AACvE,6CAA6D;AAApD,gHAAA,iBAAiB,OAAA;AAAE,wGAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize possible PSBT inputs: base64 (with whitespace/URL-safe), or raw hex.
|
|
3
|
+
*
|
|
4
|
+
* This is a low-level helper; callers that need strict validation and
|
|
5
|
+
* user-facing error messages should use `parsePsbt` instead.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeToBuffer(psbtMaybe: string): Buffer | null;
|
|
8
|
+
/**
|
|
9
|
+
* Parse a PSBT string into a Buffer, throwing on clearly invalid inputs.
|
|
10
|
+
*
|
|
11
|
+
* This wraps `normalizeToBuffer` but preserves existing error messages used in
|
|
12
|
+
* ledger-live when encountering invalid PSBT payloads.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parsePsbt(psbt: string): Buffer;
|
|
15
|
+
//# sourceMappingURL=psbtParsing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psbtParsing.d.ts","sourceRoot":"","sources":["../src/psbtParsing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBlE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY9C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeToBuffer = normalizeToBuffer;
|
|
4
|
+
exports.parsePsbt = parsePsbt;
|
|
5
|
+
/**
|
|
6
|
+
* Normalize possible PSBT inputs: base64 (with whitespace/URL-safe), or raw hex.
|
|
7
|
+
*
|
|
8
|
+
* This is a low-level helper; callers that need strict validation and
|
|
9
|
+
* user-facing error messages should use `parsePsbt` instead.
|
|
10
|
+
*/
|
|
11
|
+
function normalizeToBuffer(psbtMaybe) {
|
|
12
|
+
if (!psbtMaybe)
|
|
13
|
+
return null;
|
|
14
|
+
const s = psbtMaybe.trim();
|
|
15
|
+
// If hex (even length, only [0-9a-fA-F]) treat as hex
|
|
16
|
+
if (/^[0-9a-fA-F]+$/.test(s) && s.length % 2 === 0) {
|
|
17
|
+
try {
|
|
18
|
+
return Buffer.from(s, "hex");
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
/* ignore and fall through to base64 */
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Treat as base64: strip whitespace and convert URL-safe to standard
|
|
25
|
+
const b64 = s.replaceAll(/\s+/g, "").replaceAll("-", "+").replaceAll("_", "/");
|
|
26
|
+
// pad base64
|
|
27
|
+
const pad = b64.length % 4;
|
|
28
|
+
const padded = pad ? b64 + "=".repeat(4 - pad) : b64;
|
|
29
|
+
try {
|
|
30
|
+
return Buffer.from(padded, "base64");
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse a PSBT string into a Buffer, throwing on clearly invalid inputs.
|
|
38
|
+
*
|
|
39
|
+
* This wraps `normalizeToBuffer` but preserves existing error messages used in
|
|
40
|
+
* ledger-live when encountering invalid PSBT payloads.
|
|
41
|
+
*/
|
|
42
|
+
function parsePsbt(psbt) {
|
|
43
|
+
const buf = normalizeToBuffer(psbt);
|
|
44
|
+
if (!buf) {
|
|
45
|
+
throw new Error("Invalid PSBT: not valid base64");
|
|
46
|
+
}
|
|
47
|
+
if (!buf.length) {
|
|
48
|
+
throw new Error("Invalid PSBT: empty buffer");
|
|
49
|
+
}
|
|
50
|
+
return buf;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=psbtParsing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psbtParsing.js","sourceRoot":"","sources":["../src/psbtParsing.ts"],"names":[],"mappings":";;AAMA,8CAwBC;AAQD,8BAYC;AAlDD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAE3B,wDAAwD;IACxD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/E,aAAa;IACb,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAErD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/lib/psbtv2.d.ts
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
export declare enum psbtGlobal {
|
|
2
|
+
TX_VERSION = 2,
|
|
3
|
+
FALLBACK_LOCKTIME = 3,
|
|
4
|
+
INPUT_COUNT = 4,
|
|
5
|
+
OUTPUT_COUNT = 5,
|
|
6
|
+
TX_MODIFIABLE = 6,
|
|
7
|
+
VERSION = 251
|
|
8
|
+
}
|
|
9
|
+
export declare enum psbtIn {
|
|
10
|
+
NON_WITNESS_UTXO = 0,
|
|
11
|
+
WITNESS_UTXO = 1,
|
|
12
|
+
PARTIAL_SIG = 2,
|
|
13
|
+
SIGHASH_TYPE = 3,
|
|
14
|
+
REDEEM_SCRIPT = 4,
|
|
15
|
+
BIP32_DERIVATION = 6,
|
|
16
|
+
FINAL_SCRIPTSIG = 7,
|
|
17
|
+
FINAL_SCRIPTWITNESS = 8,
|
|
18
|
+
PREVIOUS_TXID = 14,
|
|
19
|
+
OUTPUT_INDEX = 15,
|
|
20
|
+
SEQUENCE = 16,
|
|
21
|
+
TAP_KEY_SIG = 19,
|
|
22
|
+
TAP_BIP32_DERIVATION = 22
|
|
23
|
+
}
|
|
24
|
+
export declare enum psbtOut {
|
|
25
|
+
REDEEM_SCRIPT = 0,
|
|
26
|
+
BIP_32_DERIVATION = 2,
|
|
27
|
+
AMOUNT = 3,
|
|
28
|
+
SCRIPT = 4,
|
|
29
|
+
TAP_BIP32_DERIVATION = 7
|
|
30
|
+
}
|
|
31
|
+
export declare class NoSuchEntry extends Error {
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Implements Partially Signed Bitcoin Transaction version 2, BIP370, as
|
|
35
|
+
* documented at https://github.com/bitcoin/bips/blob/master/bip-0370.mediawiki
|
|
36
|
+
* and https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
|
|
37
|
+
*
|
|
38
|
+
* A psbt is a data structure that can carry all relevant information about a
|
|
39
|
+
* transaction through all stages of the signing process. From constructing an
|
|
40
|
+
* unsigned transaction to extracting the final serialized transaction ready for
|
|
41
|
+
* broadcast.
|
|
42
|
+
*
|
|
43
|
+
* This implementation is limited to what's needed in ledgerjs to carry out its
|
|
44
|
+
* duties, which means that support for features like multisig or taproot script
|
|
45
|
+
* path spending are not implemented. Specifically, it supports p2pkh,
|
|
46
|
+
* p2wpkhWrappedInP2sh, p2wpkh and p2tr key path spending.
|
|
47
|
+
*
|
|
48
|
+
* This class is made purposefully dumb, so it's easy to add support for
|
|
49
|
+
* complemantary fields as needed in the future.
|
|
50
|
+
*/
|
|
51
|
+
export declare class PsbtV2 {
|
|
52
|
+
protected globalMap: Map<string, Buffer>;
|
|
53
|
+
protected inputMaps: Map<string, Buffer>[];
|
|
54
|
+
protected outputMaps: Map<string, Buffer>[];
|
|
55
|
+
setGlobalTxVersion(version: number): void;
|
|
56
|
+
getGlobalTxVersion(): number;
|
|
57
|
+
setGlobalFallbackLocktime(locktime: number): void;
|
|
58
|
+
getGlobalFallbackLocktime(): number | undefined;
|
|
59
|
+
setGlobalInputCount(inputCount: number): void;
|
|
60
|
+
getGlobalInputCount(): number;
|
|
61
|
+
setGlobalOutputCount(outputCount: number): void;
|
|
62
|
+
getGlobalOutputCount(): number;
|
|
63
|
+
setGlobalTxModifiable(byte: Buffer): void;
|
|
64
|
+
getGlobalTxModifiable(): Buffer | undefined;
|
|
65
|
+
setGlobalPsbtVersion(psbtVersion: number): void;
|
|
66
|
+
getGlobalPsbtVersion(): number;
|
|
67
|
+
setInputNonWitnessUtxo(inputIndex: number, transaction: Buffer): void;
|
|
68
|
+
getInputNonWitnessUtxo(inputIndex: number): Buffer | undefined;
|
|
69
|
+
setInputWitnessUtxo(inputIndex: number, amount: Buffer, scriptPubKey: Buffer): void;
|
|
70
|
+
getInputWitnessUtxo(inputIndex: number): {
|
|
71
|
+
amount: Buffer;
|
|
72
|
+
scriptPubKey: Buffer;
|
|
73
|
+
} | undefined;
|
|
74
|
+
setInputPartialSig(inputIndex: number, pubkey: Buffer, signature: Buffer): void;
|
|
75
|
+
getInputPartialSig(inputIndex: number, pubkey: Buffer): Buffer | undefined;
|
|
76
|
+
setInputSighashType(inputIndex: number, sigHashtype: number): void;
|
|
77
|
+
getInputSighashType(inputIndex: number): number | undefined;
|
|
78
|
+
setInputRedeemScript(inputIndex: number, redeemScript: Buffer): void;
|
|
79
|
+
getInputRedeemScript(inputIndex: number): Buffer | undefined;
|
|
80
|
+
setInputBip32Derivation(inputIndex: number, pubkey: Buffer, masterFingerprint: Buffer, path: number[]): void;
|
|
81
|
+
getInputBip32Derivation(inputIndex: number, pubkey: Buffer): {
|
|
82
|
+
masterFingerprint: Buffer;
|
|
83
|
+
path: number[];
|
|
84
|
+
} | undefined;
|
|
85
|
+
setInputFinalScriptsig(inputIndex: number, scriptSig: Buffer): void;
|
|
86
|
+
getInputFinalScriptsig(inputIndex: number): Buffer | undefined;
|
|
87
|
+
setInputFinalScriptwitness(inputIndex: number, scriptWitness: Buffer): void;
|
|
88
|
+
getInputFinalScriptwitness(inputIndex: number): Buffer;
|
|
89
|
+
setInputPreviousTxId(inputIndex: number, txid: Buffer): void;
|
|
90
|
+
getInputPreviousTxid(inputIndex: number): Buffer;
|
|
91
|
+
setInputOutputIndex(inputIndex: number, outputIndex: number): void;
|
|
92
|
+
getInputOutputIndex(inputIndex: number): number;
|
|
93
|
+
setInputSequence(inputIndex: number, sequence: number): void;
|
|
94
|
+
getInputSequence(inputIndex: number): number;
|
|
95
|
+
setInputTapKeySig(inputIndex: number, sig: Buffer): void;
|
|
96
|
+
getInputTapKeySig(inputIndex: number): Buffer | undefined;
|
|
97
|
+
setInputTapBip32Derivation(inputIndex: number, pubkey: Buffer, hashes: Buffer[], masterFingerprint: Buffer, path: number[]): void;
|
|
98
|
+
getInputTapBip32Derivation(inputIndex: number, pubkey: Buffer): {
|
|
99
|
+
hashes: Buffer[];
|
|
100
|
+
masterFingerprint: Buffer;
|
|
101
|
+
path: number[];
|
|
102
|
+
};
|
|
103
|
+
getInputKeyDatas(inputIndex: number, keyType: number): Buffer[];
|
|
104
|
+
setOutputRedeemScript(outputIndex: number, redeemScript: Buffer): void;
|
|
105
|
+
getOutputRedeemScript(outputIndex: number): Buffer;
|
|
106
|
+
setOutputBip32Derivation(outputIndex: number, pubkey: Buffer, masterFingerprint: Buffer, path: number[]): void;
|
|
107
|
+
getOutputBip32Derivation(outputIndex: number, pubkey: Buffer): {
|
|
108
|
+
masterFingerprint: Buffer;
|
|
109
|
+
path: number[];
|
|
110
|
+
};
|
|
111
|
+
setOutputAmount(outputIndex: number, amount: number): void;
|
|
112
|
+
getOutputAmount(outputIndex: number): number;
|
|
113
|
+
setOutputScript(outputIndex: number, scriptPubKey: Buffer): void;
|
|
114
|
+
getOutputScript(outputIndex: number): Buffer;
|
|
115
|
+
setOutputTapBip32Derivation(outputIndex: number, pubkey: Buffer, hashes: Buffer[], fingerprint: Buffer, path: number[]): void;
|
|
116
|
+
getOutputTapBip32Derivation(outputIndex: number, pubkey: Buffer): {
|
|
117
|
+
hashes: Buffer[];
|
|
118
|
+
masterFingerprint: Buffer;
|
|
119
|
+
path: number[];
|
|
120
|
+
};
|
|
121
|
+
deleteInputEntries(inputIndex: number, keyTypes: psbtIn[]): void;
|
|
122
|
+
copy(to: PsbtV2): void;
|
|
123
|
+
copyMaps(from: Map<string, Buffer>[], to: Map<string, Buffer>[]): void;
|
|
124
|
+
copyMap(from: Map<string, Buffer>, to: Map<string, Buffer>): void;
|
|
125
|
+
serialize(): Buffer;
|
|
126
|
+
deserialize(psbt: Buffer): void;
|
|
127
|
+
/**
|
|
128
|
+
* Attempts to extract the version number as uint32LE from raw psbt regardless
|
|
129
|
+
* of psbt validity.
|
|
130
|
+
*
|
|
131
|
+
* @param psbt - PSBT buffer to extract version from
|
|
132
|
+
* @returns The PSBT version number, or 0 if no version field is found (indicating PSBTv0)
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* const psbtBuffer = Buffer.from('cHNidP8BAH...', 'base64');
|
|
137
|
+
* const version = PsbtV2.getPsbtVersionNumber(psbtBuffer);
|
|
138
|
+
* if (version === 2) {
|
|
139
|
+
* // Handle PSBTv2
|
|
140
|
+
* } else {
|
|
141
|
+
* // Handle PSBTv0
|
|
142
|
+
* }
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
static getPsbtVersionNumber(psbt: Buffer): number;
|
|
146
|
+
/**
|
|
147
|
+
* Converts a PSBTv0 (from bitcoinjs-lib) to PSBTv2.
|
|
148
|
+
*
|
|
149
|
+
* This method deserializes a PSBTv0 buffer and converts it
|
|
150
|
+
* to the PSBTv2 format, preserving all relevant fields including:
|
|
151
|
+
* - Transaction version and locktime
|
|
152
|
+
* - Inputs (UTXOs, derivation paths, sequences, signatures)
|
|
153
|
+
* - Outputs (amounts, scripts, derivation paths)
|
|
154
|
+
* - Finalized scripts (if present)
|
|
155
|
+
*
|
|
156
|
+
* The method follows the PSBT role saga defined in BIP174:
|
|
157
|
+
* 1. Creator Role - Initialize PSBTv2 with version and counts
|
|
158
|
+
* 2. Constructor Role - Add inputs and outputs
|
|
159
|
+
* 3. Signer Role - Transfer partial signatures
|
|
160
|
+
* 4. Input Finalizer - Transfer finalized scripts
|
|
161
|
+
*
|
|
162
|
+
* @param psbt - PSBTv0 as Buffer
|
|
163
|
+
* @param allowTxnVersion1 - Allow transaction version 1 (default: false).
|
|
164
|
+
* Version 2 is recommended per BIP68.
|
|
165
|
+
* @returns A new PsbtV2 instance with converted data
|
|
166
|
+
* @throws Error if PSBT is invalid or contains unsupported features
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* const psbtV0Buffer = Buffer.from('cHNidP8BAH...', 'base64');
|
|
171
|
+
* const psbtV2 = PsbtV2.fromV0(psbtV0Buffer);
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
static fromV0(psbt: Buffer, allowTxnVersion1?: boolean): PsbtV2;
|
|
175
|
+
private static initializeFromV0;
|
|
176
|
+
private static addInputsFromV0;
|
|
177
|
+
private static addOutputsFromV0;
|
|
178
|
+
private static transferPartialSignatures;
|
|
179
|
+
private static transferFinalizedScripts;
|
|
180
|
+
private readKeyPair;
|
|
181
|
+
private getKeyDatas;
|
|
182
|
+
private isKeyType;
|
|
183
|
+
private setGlobal;
|
|
184
|
+
private getGlobal;
|
|
185
|
+
private getGlobalOptional;
|
|
186
|
+
private setInput;
|
|
187
|
+
private getInput;
|
|
188
|
+
private getInputOptional;
|
|
189
|
+
private setOutput;
|
|
190
|
+
private getOutput;
|
|
191
|
+
private getMap;
|
|
192
|
+
private encodeBip32Derivation;
|
|
193
|
+
private decodeBip32Derivation;
|
|
194
|
+
private writeBip32Derivation;
|
|
195
|
+
private readBip32Derivation;
|
|
196
|
+
private encodeTapBip32Derivation;
|
|
197
|
+
private decodeTapBip32Derivation;
|
|
198
|
+
}
|
|
199
|
+
export declare function parseBip32Path(path: string): number[];
|
|
200
|
+
//# sourceMappingURL=psbtv2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psbtv2.d.ts","sourceRoot":"","sources":["../src/psbtv2.ts"],"names":[],"mappings":"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"}
|