@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,4 @@
1
+
2
+ > @ledgerhq/psbtv2@0.1.0 build /home/runner/work/ledger-live/ledger-live/libs/psbtv2
3
+ > tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es
4
+
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
@@ -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"}
@@ -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":"AAKA,oBAAY,UAAU;IACpB,UAAU,IAAO;IACjB,iBAAiB,IAAO;IACxB,WAAW,IAAO;IAClB,YAAY,IAAO;IACnB,aAAa,IAAO;IACpB,OAAO,MAAO;CACf;AACD,oBAAY,MAAM;IAChB,gBAAgB,IAAO;IACvB,YAAY,IAAO;IACnB,WAAW,IAAO;IAClB,YAAY,IAAO;IACnB,aAAa,IAAO;IACpB,gBAAgB,IAAO;IACvB,eAAe,IAAO;IACtB,mBAAmB,IAAO;IAC1B,aAAa,KAAO;IACpB,YAAY,KAAO;IACnB,QAAQ,KAAO;IACf,WAAW,KAAO;IAClB,oBAAoB,KAAO;CAC5B;AACD,oBAAY,OAAO;IACjB,aAAa,IAAO;IACpB,iBAAiB,IAAO;IACxB,MAAM,IAAO;IACb,MAAM,IAAO;IACb,oBAAoB,IAAO;CAC5B;AAID,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,MAAM;IACjB,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACrD,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAM;IAChD,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAM;IAEjD,kBAAkB,CAAC,OAAO,EAAE,MAAM;IAGlC,kBAAkB,IAAI,MAAM;IAG5B,yBAAyB,CAAC,QAAQ,EAAE,MAAM;IAG1C,yBAAyB,IAAI,MAAM,GAAG,SAAS;IAG/C,mBAAmB,CAAC,UAAU,EAAE,MAAM;IAGtC,mBAAmB,IAAI,MAAM;IAG7B,oBAAoB,CAAC,WAAW,EAAE,MAAM;IAGxC,oBAAoB,IAAI,MAAM;IAG9B,qBAAqB,CAAC,IAAI,EAAE,MAAM;IAGlC,qBAAqB,IAAI,MAAM,GAAG,SAAS;IAG3C,oBAAoB,CAAC,WAAW,EAAE,MAAM;IAGxC,oBAAoB,IAAI,MAAM;IAI9B,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAG9D,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG9D,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAM5E,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAM7F,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAGxE,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG1E,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAG3D,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3D,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAG7D,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG5D,uBAAuB,CACrB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,MAAM,EAAE;IAUhB,uBAAuB,CACrB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS;IAK5D,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAG5D,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG9D,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAGpE,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAGtD,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAGrD,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAGhD,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAG3D,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAG/C,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAGrD,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAG5C,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAGjD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAGzD,0BAA0B,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,MAAM,EAAE;IAMhB,0BAA0B,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAIlE,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/D,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAG/D,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAGlD,wBAAwB,CACtB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,MAAM,EAAE;IAShB,wBAAwB,CACtB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAIhD,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAGnD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI5C,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAGzD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAG5C,2BAA2B,CACzB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE;IAKhB,2BAA2B,CACzB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAKlE,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;IASzD,IAAI,CAAC,EAAE,EAAE,MAAM;IAKf,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;IAO/D,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAG1D,SAAS,IAAI,MAAM;IAYnB,WAAW,CAAC,IAAI,EAAE,MAAM;IAgBxB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAyBjD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,UAAQ,GAAG,MAAM;IAsB7D,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAiB/B,OAAO,CAAC,MAAM,CAAC,eAAe;IAwC9B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAyB/B,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAUxC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAevC,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,iBAAiB;IAGzB,OAAO,CAAC,QAAQ;IAGhB,OAAO,CAAC,QAAQ;IAGhB,OAAO,CAAC,gBAAgB;IAGxB,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,wBAAwB;CAcjC;AAwFD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAarD"}