@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.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 (61) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +126 -0
  3. package/dist/src/index.d.ts +5 -0
  4. package/dist/src/index.d.ts.map +1 -0
  5. package/dist/src/index.js +44 -0
  6. package/dist/src/kaspa.d.ts +64 -0
  7. package/dist/src/kaspa.d.ts.map +1 -0
  8. package/dist/src/kaspa.js +246 -0
  9. package/dist/src/lib/constants.d.ts +12 -0
  10. package/dist/src/lib/constants.d.ts.map +1 -0
  11. package/dist/src/lib/constants.js +18 -0
  12. package/dist/src/lib/iface.d.ts +109 -0
  13. package/dist/src/lib/iface.d.ts.map +1 -0
  14. package/dist/src/lib/iface.js +3 -0
  15. package/dist/src/lib/index.d.ts +10 -0
  16. package/dist/src/lib/index.d.ts.map +1 -0
  17. package/dist/src/lib/index.js +36 -0
  18. package/dist/src/lib/keyPair.d.ts +22 -0
  19. package/dist/src/lib/keyPair.d.ts.map +1 -0
  20. package/dist/src/lib/keyPair.js +61 -0
  21. package/dist/src/lib/sighash.d.ts +25 -0
  22. package/dist/src/lib/sighash.d.ts.map +1 -0
  23. package/dist/src/lib/sighash.js +191 -0
  24. package/dist/src/lib/transaction.d.ts +53 -0
  25. package/dist/src/lib/transaction.d.ts.map +1 -0
  26. package/dist/src/lib/transaction.js +133 -0
  27. package/dist/src/lib/transactionBuilder.d.ts +58 -0
  28. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  29. package/dist/src/lib/transactionBuilder.js +139 -0
  30. package/dist/src/lib/transactionBuilderFactory.d.ts +15 -0
  31. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  32. package/dist/src/lib/transactionBuilderFactory.js +25 -0
  33. package/dist/src/lib/utils.d.ts +43 -0
  34. package/dist/src/lib/utils.d.ts.map +1 -0
  35. package/dist/src/lib/utils.js +236 -0
  36. package/dist/src/register.d.ts +3 -0
  37. package/dist/src/register.d.ts.map +1 -0
  38. package/dist/src/register.js +10 -0
  39. package/dist/test/fixtures/kaspa.fixtures.d.ts +29 -0
  40. package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -0
  41. package/dist/test/fixtures/kaspa.fixtures.js +90 -0
  42. package/dist/test/unit/coin.test.d.ts +2 -0
  43. package/dist/test/unit/coin.test.d.ts.map +1 -0
  44. package/dist/test/unit/coin.test.js +225 -0
  45. package/dist/test/unit/keyPair.test.d.ts +2 -0
  46. package/dist/test/unit/keyPair.test.d.ts.map +1 -0
  47. package/dist/test/unit/keyPair.test.js +90 -0
  48. package/dist/test/unit/transaction.test.d.ts +2 -0
  49. package/dist/test/unit/transaction.test.d.ts.map +1 -0
  50. package/dist/test/unit/transaction.test.js +206 -0
  51. package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
  52. package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
  53. package/dist/test/unit/transactionBuilder.test.js +220 -0
  54. package/dist/test/unit/transactionFlow.test.d.ts +8 -0
  55. package/dist/test/unit/transactionFlow.test.d.ts.map +1 -0
  56. package/dist/test/unit/transactionFlow.test.js +105 -0
  57. package/dist/test/unit/utils.test.d.ts +2 -0
  58. package/dist/test/unit/utils.test.d.ts.map +1 -0
  59. package/dist/test/unit/utils.test.js +159 -0
  60. package/dist/tsconfig.tsbuildinfo +1 -0
  61. package/package.json +53 -0
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCRIPT_PUBLIC_KEY_VERSION = exports.OP_CHECKSIG_SCHNORR = exports.SIGHASH_ANYONECANPAY = exports.SIGHASH_SINGLE = exports.SIGHASH_NONE = exports.SIGHASH_ALL = void 0;
4
+ exports.buildP2PKScriptPublicKey = buildP2PKScriptPublicKey;
5
+ exports.compressedToXOnly = compressedToXOnly;
6
+ exports.computeKaspaSigningHash = computeKaspaSigningHash;
7
+ /**
8
+ * Kaspa transaction sighash computation.
9
+ *
10
+ * BIP-143-like scheme using Blake2b-256. All integer fields are little-endian.
11
+ *
12
+ * Reference (authoritative implementation):
13
+ * https://github.com/kaspanet/rusty-kaspa/blob/master/consensus/core/src/hashing/sighash.rs
14
+ */
15
+ const blakejs_1 = require("blakejs");
16
+ // SigHash type flags
17
+ exports.SIGHASH_ALL = 0x01;
18
+ exports.SIGHASH_NONE = 0x02;
19
+ exports.SIGHASH_SINGLE = 0x04;
20
+ exports.SIGHASH_ANYONECANPAY = 0x80;
21
+ // Script constants
22
+ exports.OP_CHECKSIG_SCHNORR = 0xab; // Kaspa Schnorr checksig opcode
23
+ exports.SCRIPT_PUBLIC_KEY_VERSION = 0; // Standard P2PK version
24
+ function blake2b256(data) {
25
+ return Buffer.from((0, blakejs_1.blake2b)(data, undefined, 32));
26
+ }
27
+ /**
28
+ * Build P2PK Schnorr scriptPublicKey from a 32-byte x-only public key.
29
+ * Format: DATA_32(0x20) + xOnlyPubKey(32 bytes) + OP_CHECKSIG_SCHNORR(0xAB)
30
+ */
31
+ function buildP2PKScriptPublicKey(xOnlyPubKey) {
32
+ if (xOnlyPubKey.length !== 32) {
33
+ throw new Error(`Expected 32-byte x-only pubkey, got ${xOnlyPubKey.length}`);
34
+ }
35
+ return Buffer.concat([Buffer.from([0x20]), xOnlyPubKey, Buffer.from([exports.OP_CHECKSIG_SCHNORR])]);
36
+ }
37
+ /**
38
+ * Derive x-only public key from 33-byte compressed public key.
39
+ */
40
+ function compressedToXOnly(compressedPubKey) {
41
+ if (compressedPubKey.length !== 33) {
42
+ throw new Error(`Expected 33-byte compressed pubkey, got ${compressedPubKey.length}`);
43
+ }
44
+ return compressedPubKey.slice(1); // drop the 02/03 prefix byte
45
+ }
46
+ // --- Intermediate hash helpers ---
47
+ function hashPreviousOutputs(inputs) {
48
+ const parts = inputs.map((inp) => {
49
+ const buf = Buffer.alloc(36);
50
+ Buffer.from(inp.transactionId, 'hex').copy(buf, 0);
51
+ buf.writeUInt32LE(inp.transactionIndex, 32);
52
+ return buf;
53
+ });
54
+ return blake2b256(Buffer.concat(parts));
55
+ }
56
+ function hashSequences(inputs) {
57
+ const buf = Buffer.alloc(inputs.length * 8);
58
+ inputs.forEach((inp, i) => {
59
+ buf.writeBigUInt64LE(BigInt(inp.sequence || '0'), i * 8);
60
+ });
61
+ return blake2b256(buf);
62
+ }
63
+ function hashSigOpCounts(inputs) {
64
+ const bytes = inputs.map((inp) => inp.sigOpCount ?? 1);
65
+ return blake2b256(Buffer.from(bytes));
66
+ }
67
+ function serializeOutput(output) {
68
+ const scriptBytes = Buffer.from(output.scriptPublicKey || '', 'hex');
69
+ const spkVersion = 0; // standard P2PK
70
+ // value (u64 LE, 8) + spk_version (u16 LE, 2) + script_length (u64 LE, 8) + script
71
+ const buf = Buffer.alloc(8 + 2 + 8 + scriptBytes.length);
72
+ let offset = 0;
73
+ buf.writeBigUInt64LE(BigInt(output.amount), offset);
74
+ offset += 8;
75
+ buf.writeUInt16LE(spkVersion, offset);
76
+ offset += 2;
77
+ buf.writeBigUInt64LE(BigInt(scriptBytes.length), offset);
78
+ offset += 8;
79
+ scriptBytes.copy(buf, offset);
80
+ return buf;
81
+ }
82
+ function hashOutputs(tx, inputIndex, sigHashType) {
83
+ const baseType = sigHashType & 0x1f;
84
+ if (baseType === exports.SIGHASH_NONE) {
85
+ return Buffer.alloc(32); // zero hash
86
+ }
87
+ if (baseType === exports.SIGHASH_SINGLE) {
88
+ if (inputIndex >= tx.outputs.length) {
89
+ return Buffer.alloc(32);
90
+ }
91
+ return blake2b256(serializeOutput(tx.outputs[inputIndex]));
92
+ }
93
+ // SIGHASH_ALL
94
+ const parts = tx.outputs.map(serializeOutput);
95
+ return blake2b256(Buffer.concat(parts));
96
+ }
97
+ function hashPayload(tx) {
98
+ const subnetId = Buffer.from(tx.subnetworkId || '0000000000000000000000000000000000000000', 'hex');
99
+ // If subnetwork is native (all zeros), payloadHash is zero
100
+ if (subnetId.every((b) => b === 0)) {
101
+ return Buffer.alloc(32);
102
+ }
103
+ return blake2b256(Buffer.from(tx.payload || '', 'hex'));
104
+ }
105
+ /**
106
+ * Compute the Kaspa sighash for a specific input.
107
+ *
108
+ * @param tx Full transaction data
109
+ * @param inputIndex Index of the input being signed
110
+ * @param sigHashType SigHash type flags (use SIGHASH_ALL = 0x01 for standard)
111
+ */
112
+ function computeKaspaSigningHash(tx, inputIndex, sigHashType = exports.SIGHASH_ALL) {
113
+ const anyoneCanPay = !!(sigHashType & exports.SIGHASH_ANYONECANPAY);
114
+ const baseType = sigHashType & 0x1f;
115
+ const input = tx.inputs[inputIndex];
116
+ if (!input) {
117
+ throw new Error(`Input index ${inputIndex} out of range`);
118
+ }
119
+ // Conditional intermediate hashes
120
+ const prevOutputsHash = anyoneCanPay ? Buffer.alloc(32) : hashPreviousOutputs(tx.inputs);
121
+ const seqHash = anyoneCanPay || baseType === exports.SIGHASH_SINGLE || baseType === exports.SIGHASH_NONE
122
+ ? Buffer.alloc(32)
123
+ : hashSequences(tx.inputs);
124
+ const sigOpHash = anyoneCanPay ? Buffer.alloc(32) : hashSigOpCounts(tx.inputs);
125
+ const outsHash = hashOutputs(tx, inputIndex, sigHashType);
126
+ const payloadHash = hashPayload(tx);
127
+ // Parse the current input's script public key
128
+ const scriptBytes = Buffer.from(input.scriptPublicKey || '', 'hex');
129
+ const spkVersion = 0; // standard P2PK
130
+ const subnetId = Buffer.from(tx.subnetworkId || '0000000000000000000000000000000000000000', 'hex');
131
+ // Build the preimage
132
+ const fixedSize = 2 + 32 + 32 + 32 + 32 + 4 + 2 + 8 + 8 + 8 + 1 + 32 + 8 + 20 + 8 + 32 + 1;
133
+ const preimage = Buffer.alloc(fixedSize + scriptBytes.length);
134
+ let offset = 0;
135
+ // 1. version
136
+ preimage.writeUInt16LE(tx.version ?? 0, offset);
137
+ offset += 2;
138
+ // 2. previousOutputsHash
139
+ prevOutputsHash.copy(preimage, offset);
140
+ offset += 32;
141
+ // 3. sequencesHash
142
+ seqHash.copy(preimage, offset);
143
+ offset += 32;
144
+ // 4. sigOpCountsHash
145
+ sigOpHash.copy(preimage, offset);
146
+ offset += 32;
147
+ // 5. current input's previous outpoint txId
148
+ Buffer.from(input.transactionId, 'hex').copy(preimage, offset);
149
+ offset += 32;
150
+ // 6. current input's previous outpoint index
151
+ preimage.writeUInt32LE(input.transactionIndex, offset);
152
+ offset += 4;
153
+ // 7. scriptPublicKey version
154
+ preimage.writeUInt16LE(spkVersion, offset);
155
+ offset += 2;
156
+ // 8. scriptPublicKey length (u64 LE)
157
+ preimage.writeBigUInt64LE(BigInt(scriptBytes.length), offset);
158
+ offset += 8;
159
+ // 9. scriptPublicKey bytes
160
+ scriptBytes.copy(preimage, offset);
161
+ offset += scriptBytes.length;
162
+ // 10. value (amount in sompi, u64 LE)
163
+ preimage.writeBigUInt64LE(BigInt(input.amount), offset);
164
+ offset += 8;
165
+ // 11. sequence (u64 LE)
166
+ preimage.writeBigUInt64LE(BigInt(input.sequence || '0'), offset);
167
+ offset += 8;
168
+ // 12. sigOpCount (u8)
169
+ preimage.writeUInt8(input.sigOpCount ?? 1, offset);
170
+ offset += 1;
171
+ // 13. outputsHash
172
+ outsHash.copy(preimage, offset);
173
+ offset += 32;
174
+ // 14. locktime (u64 LE)
175
+ preimage.writeBigUInt64LE(BigInt(tx.lockTime || '0'), offset);
176
+ offset += 8;
177
+ // 15. subnetworkId (20 bytes)
178
+ subnetId.copy(preimage, offset);
179
+ offset += 20;
180
+ // 16. gas (u64 LE) — always 0 for native KASPA
181
+ preimage.writeBigUInt64LE(0n, offset);
182
+ offset += 8;
183
+ // 17. payloadHash
184
+ payloadHash.copy(preimage, offset);
185
+ offset += 32;
186
+ // 18. sigHashType (u8)
187
+ preimage.writeUInt8(sigHashType, offset);
188
+ offset += 1;
189
+ return blake2b256(preimage.slice(0, offset));
190
+ }
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnaGFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvc2lnaGFzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2QkEsNERBS0M7QUFLRCw4Q0FLQztBQTJFRCwwREEwR0M7QUFqT0Q7Ozs7Ozs7R0FPRztBQUNILHFDQUFrQztBQUdsQyxxQkFBcUI7QUFDUixRQUFBLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDbkIsUUFBQSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLFFBQUEsY0FBYyxHQUFHLElBQUksQ0FBQztBQUN0QixRQUFBLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QyxtQkFBbUI7QUFDTixRQUFBLG1CQUFtQixHQUFHLElBQUksQ0FBQyxDQUFDLGdDQUFnQztBQUM1RCxRQUFBLHlCQUF5QixHQUFHLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtBQUVwRSxTQUFTLFVBQVUsQ0FBQyxJQUFZO0lBQzlCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFBLGlCQUFPLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxXQUFtQjtJQUMxRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsMkJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxn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TUFBTSxJQUFJLENBQUMsQ0FBQztJQUVaLGtCQUFrQjtJQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBRWIsd0JBQXdCO0lBQ3hCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5RCxNQUFNLElBQUksQ0FBQyxDQUFDO0lBRVosOEJBQThCO0lBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFYiwrQ0FBK0M7SUFDL0MsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0QyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBRVosa0JBQWtCO0lBQ2xCLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFYix1QkFBdUI7SUFDdkIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsTUFBTSxJQUFJLENBQUMsQ0FBQztJQUVaLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2FzcGEgdHJhbnNhY3Rpb24gc2lnaGFzaCBjb21wdXRhdGlvbi5cbiAqXG4gKiBCSVAtMTQzLWxpa2Ugc2NoZW1lIHVzaW5nIEJsYWtlMmItMjU2LiBBbGwgaW50ZWdlciBmaWVsZHMgYXJlIGxpdHRsZS1lbmRpYW4uXG4gKlxuICogUmVmZXJlbmNlIChhdXRob3JpdGF0aXZlIGltcGxlbWVudGF0aW9uKTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rYXNwYW5ldC9ydXN0eS1rYXNwYS9ibG9iL21hc3Rlci9jb25zZW5zdXMvY29yZS9zcmMvaGFzaGluZy9zaWdoYXNoLnJzXG4gKi9cbmltcG9ydCB7IGJsYWtlMmIgfSBmcm9tICdibGFrZWpzJztcbmltcG9ydCB7IEthc3BhVHJhbnNhY3Rpb25EYXRhLCBLYXNwYVV0eG9JbnB1dCwgS2FzcGFUcmFuc2FjdGlvbk91dHB1dCB9IGZyb20gJy4vaWZhY2UnO1xuXG4vLyBTaWdIYXNoIHR5cGUgZmxhZ3NcbmV4cG9ydCBjb25zdCBTSUdIQVNIX0FMTCA9IDB4MDE7XG5leHBvcnQgY29uc3QgU0lHSEFTSF9OT05FID0gMHgwMjtcbmV4cG9ydCBjb25zdCBTSUdIQVNIX1NJTkdMRSA9IDB4MDQ7XG5leHBvcnQgY29uc3QgU0lHSEFTSF9BTllPTkVDQU5QQVkgPSAweDgwO1xuXG4vLyBTY3JpcHQgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgT1BfQ0hFQ0tTSUdfU0NITk9SUiA9IDB4YWI7IC8vIEthc3BhIFNjaG5vcnIgY2hlY2tzaWcgb3Bjb2RlXG5leHBvcnQgY29uc3QgU0NSSVBUX1BVQkxJQ19LRVlfVkVSU0lPTiA9IDA7IC8vIFN0YW5kYXJkIFAyUEsgdmVyc2lvblxuXG5mdW5jdGlvbiBibGFrZTJiMjU2KGRhdGE6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShibGFrZTJiKGRhdGEsIHVuZGVmaW5lZCwgMzIpKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBQMlBLIFNjaG5vcnIgc2NyaXB0UHVibGljS2V5IGZyb20gYSAzMi1ieXRlIHgtb25seSBwdWJsaWMga2V5LlxuICogRm9ybWF0OiBEQVRBXzMyKDB4MjApICsgeE9ubHlQdWJLZXkoMzIgYnl0ZXMpICsgT1BfQ0hFQ0tTSUdfU0NITk9SUigweEFCKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQMlBLU2NyaXB0UHVibGljS2V5KHhPbmx5UHViS2V5OiBCdWZmZXIpOiBCdWZmZXIge1xuICBpZiAoeE9ubHlQdWJLZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgMzItYnl0ZSB4LW9ubHkgcHVia2V5LCBnb3QgJHt4T25seVB1YktleS5sZW5ndGh9YCk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFsweDIwXSksIHhPbmx5UHViS2V5LCBCdWZmZXIuZnJvbShbT1BfQ0hFQ0tTSUdfU0NITk9SUl0pXSk7XG59XG5cbi8qKlxuICogRGVyaXZlIHgtb25seSBwdWJsaWMga2V5IGZyb20gMzMtYnl0ZSBjb21wcmVzc2VkIHB1YmxpYyBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc2VkVG9YT25seShjb21wcmVzc2VkUHViS2V5OiBCdWZmZXIpOiBCdWZmZXIge1xuICBpZiAoY29tcHJlc3NlZFB1YktleS5sZW5ndGggIT09IDMzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAzMy1ieXRlIGNvbXByZXNzZWQgcHVia2V5LCBnb3QgJHtjb21wcmVzc2VkUHViS2V5Lmxlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4gY29tcHJlc3NlZFB1YktleS5zbGljZSgxKTsgLy8gZHJvcCB0aGUgMDIvMDMgcHJlZml4IGJ5dGVcbn1cblxuLy8gLS0tIEludGVybWVkaWF0ZSBoYXNoIGhlbHBlcnMgLS0tXG5cbmZ1bmN0aW9uIGhhc2hQcmV2aW91c091dHB1dHMoaW5wdXRzOiBLYXNwYVV0eG9JbnB1dFtdKTogQnVmZmVyIHtcbiAgY29uc3QgcGFydHMgPSBpbnB1dHMubWFwKChpbnApID0+IHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoMzYpO1xuICAgIEJ1ZmZlci5mcm9tKGlucC50cmFuc2FjdGlvbklkLCAnaGV4JykuY29weShidWYsIDApO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFKGlucC50cmFuc2FjdGlvbkluZGV4LCAzMik7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfSk7XG4gIHJldHVybiBibGFrZTJiMjU2KEJ1ZmZlci5jb25jYXQocGFydHMpKTtcbn1cblxuZnVuY3Rpb24gaGFzaFNlcXVlbmNlcyhpbnB1dHM6IEthc3BhVXR4b0lucHV0W10pOiBCdWZmZXIge1xuICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoaW5wdXRzLmxlbmd0aCAqIDgpO1xuICBpbnB1dHMuZm9yRWFjaCgoaW5wLCBpKSA9PiB7XG4gICAgYnVmLndyaXRlQmlnVUludDY0TEUoQmlnSW50KGlucC5zZXF1ZW5jZSB8fCAnMCcpLCBpICogOCk7XG4gIH0pO1xuICByZXR1cm4gYmxha2UyYjI1NihidWYpO1xufVxuXG5mdW5jdGlvbiBoYXNoU2lnT3BDb3VudHMoaW5wdXRzOiBLYXNwYVV0eG9JbnB1dFtdKTogQnVmZmVyIHtcbiAgY29uc3QgYnl0ZXMgPSBpbnB1dHMubWFwKChpbnApID0+IGlucC5zaWdPcENvdW50ID8/IDEpO1xuICByZXR1cm4gYmxha2UyYjI1NihCdWZmZXIuZnJvbShieXRlcykpO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVPdXRwdXQob3V0cHV0OiBLYXNwYVRyYW5zYWN0aW9uT3V0cHV0KTogQnVmZmVyIHtcbiAgY29uc3Qgc2NyaXB0Qnl0ZXMgPSBCdWZmZXIuZnJvbShvdXRwdXQuc2NyaXB0UHVibGljS2V5IHx8ICcnLCAnaGV4Jyk7XG4gIGNvbnN0IHNwa1ZlcnNpb24gPSAwOyAvLyBzdGFuZGFyZCBQMlBLXG4gIC8vIHZhbHVlICh1NjQgTEUsIDgpICsgc3BrX3ZlcnNpb24gKHUxNiBMRSwgMikgKyBzY3JpcHRfbGVuZ3RoICh1NjQgTEUsIDgpICsgc2NyaXB0XG4gIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYyg4ICsgMiArIDggKyBzY3JpcHRCeXRlcy5sZW5ndGgpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgYnVmLndyaXRlQmlnVUludDY0TEUoQmlnSW50KG91dHB1dC5hbW91bnQpLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gODtcbiAgYnVmLndyaXRlVUludDE2TEUoc3BrVmVyc2lvbiwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDI7XG4gIGJ1Zi53cml0ZUJpZ1VJbnQ2NExFKEJpZ0ludChzY3JpcHRCeXRlcy5sZW5ndGgpLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gODtcbiAgc2NyaXB0Qnl0ZXMuY29weShidWYsIG9mZnNldCk7XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGhhc2hPdXRwdXRzKHR4OiBLYXNwYVRyYW5zYWN0aW9uRGF0YSwgaW5wdXRJbmRleDogbnVtYmVyLCBzaWdIYXNoVHlwZTogbnVtYmVyKTogQnVmZmVyIHtcbiAgY29uc3QgYmFzZVR5cGUgPSBzaWdIYXNoVHlwZSAmIDB4MWY7XG4gIGlmIChiYXNlVHlwZSA9PT0gU0lHSEFTSF9OT05FKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygzMik7IC8vIHplcm8gaGFzaFxuICB9XG4gIGlmIChiYXNlVHlwZSA9PT0gU0lHSEFTSF9TSU5HTEUpIHtcbiAgICBpZiAoaW5wdXRJbmRleCA+PSB0eC5vdXRwdXRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygzMik7XG4gICAgfVxuICAgIHJldHVybiBibGFrZTJiMjU2KHNlcmlhbGl6ZU91dHB1dCh0eC5vdXRwdXRzW2lucHV0SW5kZXhdKSk7XG4gIH1cbiAgLy8gU0lHSEFTSF9BTExcbiAgY29uc3QgcGFydHMgPSB0eC5vdXRwdXRzLm1hcChzZXJpYWxpemVPdXRwdXQpO1xuICByZXR1cm4gYmxha2UyYjI1NihCdWZmZXIuY29uY2F0KHBhcnRzKSk7XG59XG5cbmZ1bmN0aW9uIGhhc2hQYXlsb2FkKHR4OiBLYXNwYVRyYW5zYWN0aW9uRGF0YSk6IEJ1ZmZlciB7XG4gIGNvbnN0IHN1Ym5ldElkID0gQnVmZmVyLmZyb20odHguc3VibmV0d29ya0lkIHx8ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgJ2hleCcpO1xuICAvLyBJZiBzdWJuZXR3b3JrIGlzIG5hdGl2ZSAoYWxsIHplcm9zKSwgcGF5bG9hZEhhc2ggaXMgemVyb1xuICBpZiAoc3VibmV0SWQuZXZlcnkoKGIpID0+IGIgPT09IDApKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygzMik7XG4gIH1cbiAgcmV0dXJuIGJsYWtlMmIyNTYoQnVmZmVyLmZyb20odHgucGF5bG9hZCB8fCAnJywgJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBLYXNwYSBzaWdoYXNoIGZvciBhIHNwZWNpZmljIGlucHV0LlxuICpcbiAqIEBwYXJhbSB0eCAgICAgICAgRnVsbCB0cmFuc2FjdGlvbiBkYXRhXG4gKiBAcGFyYW0gaW5wdXRJbmRleCBJbmRleCBvZiB0aGUgaW5wdXQgYmVpbmcgc2lnbmVkXG4gKiBAcGFyYW0gc2lnSGFzaFR5cGUgU2lnSGFzaCB0eXBlIGZsYWdzICh1c2UgU0lHSEFTSF9BTEwgPSAweDAxIGZvciBzdGFuZGFyZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoKFxuICB0eDogS2FzcGFUcmFuc2FjdGlvbkRhdGEsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgc2lnSGFzaFR5cGU6IG51bWJlciA9IFNJR0hBU0hfQUxMXG4pOiBCdWZmZXIge1xuICBjb25zdCBhbnlvbmVDYW5QYXkgPSAhIShzaWdIYXNoVHlwZSAmIFNJR0hBU0hfQU5ZT05FQ0FOUEFZKTtcbiAgY29uc3QgYmFzZVR5cGUgPSBzaWdIYXNoVHlwZSAmIDB4MWY7XG5cbiAgY29uc3QgaW5wdXQgPSB0eC5pbnB1dHNbaW5wdXRJbmRleF07XG4gIGlmICghaW5wdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IGluZGV4ICR7aW5wdXRJbmRleH0gb3V0IG9mIHJhbmdlYCk7XG4gIH1cblxuICAvLyBDb25kaXRpb25hbCBpbnRlcm1lZGlhdGUgaGFzaGVzXG4gIGNvbnN0IHByZXZPdXRwdXRzSGFzaCA9IGFueW9uZUNhblBheSA/IEJ1ZmZlci5hbGxvYygzMikgOiBoYXNoUHJldmlvdXNPdXRwdXRzKHR4LmlucHV0cyk7XG4gIGNvbnN0IHNlcUhhc2ggPVxuICAgIGFueW9uZUNhblBheSB8fCBiYXNlVHlwZSA9PT0gU0lHSEFTSF9TSU5HTEUgfHwgYmFzZVR5cGUgPT09IFNJR0hBU0hfTk9ORVxuICAgICAgPyBCdWZmZXIuYWxsb2MoMzIpXG4gICAgICA6IGhhc2hTZXF1ZW5jZXModHguaW5wdXRzKTtcbiAgY29uc3Qgc2lnT3BIYXNoID0gYW55b25lQ2FuUGF5ID8gQnVmZmVyLmFsbG9jKDMyKSA6IGhhc2hTaWdPcENvdW50cyh0eC5pbnB1dHMpO1xuICBjb25zdCBvdXRzSGFzaCA9IGhhc2hPdXRwdXRzKHR4LCBpbnB1dEluZGV4LCBzaWdIYXNoVHlwZSk7XG4gIGNvbnN0IHBheWxvYWRIYXNoID0gaGFzaFBheWxvYWQodHgpO1xuXG4gIC8vIFBhcnNlIHRoZSBjdXJyZW50IGlucHV0J3Mgc2NyaXB0IHB1YmxpYyBrZXlcbiAgY29uc3Qgc2NyaXB0Qnl0ZXMgPSBCdWZmZXIuZnJvbShpbnB1dC5zY3JpcHRQdWJsaWNLZXkgfHwgJycsICdoZXgnKTtcbiAgY29uc3Qgc3BrVmVyc2lvbiA9IDA7IC8vIHN0YW5kYXJkIFAyUEtcbiAgY29uc3Qgc3VibmV0SWQgPSBCdWZmZXIuZnJvbSh0eC5zdWJuZXR3b3JrSWQgfHwgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG5cbiAgLy8gQnVpbGQgdGhlIHByZWltYWdlXG4gIGNvbnN0IGZpeGVkU2l6ZSA9IDIgKyAzMiArIDMyICsgMzIgKyAzMiArIDQgKyAyICsgOCArIDggKyA4ICsgMSArIDMyICsgOCArIDIwICsgOCArIDMyICsgMTtcbiAgY29uc3QgcHJlaW1hZ2UgPSBCdWZmZXIuYWxsb2MoZml4ZWRTaXplICsgc2NyaXB0Qnl0ZXMubGVuZ3RoKTtcbiAgbGV0IG9mZnNldCA9IDA7XG5cbiAgLy8gMS4gdmVyc2lvblxuICBwcmVpbWFnZS53cml0ZVVJbnQxNkxFKHR4LnZlcnNpb24gPz8gMCwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDI7XG5cbiAgLy8gMi4gcHJldmlvdXNPdXRwdXRzSGFzaFxuICBwcmV2T3V0cHV0c0hhc2guY29weShwcmVpbWFnZSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDMyO1xuXG4gIC8vIDMuIHNlcXVlbmNlc0hhc2hcbiAgc2VxSGFzaC5jb3B5KHByZWltYWdlLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gMzI7XG5cbiAgLy8gNC4gc2lnT3BDb3VudHNIYXNoXG4gIHNpZ09wSGFzaC5jb3B5KHByZWltYWdlLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gMzI7XG5cbiAgLy8gNS4gY3VycmVudCBpbnB1dCdzIHByZXZpb3VzIG91dHBvaW50IHR4SWRcbiAgQnVmZmVyLmZyb20oaW5wdXQudHJhbnNhY3Rpb25JZCwgJ2hleCcpLmNvcHkocHJlaW1hZ2UsIG9mZnNldCk7XG4gIG9mZnNldCArPSAzMjtcblxuICAvLyA2LiBjdXJyZW50IGlucHV0J3MgcHJldmlvdXMgb3V0cG9pbnQgaW5kZXhcbiAgcHJlaW1hZ2Uud3JpdGVVSW50MzJMRShpbnB1dC50cmFuc2FjdGlvbkluZGV4LCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gNDtcblxuICAvLyA3LiBzY3JpcHRQdWJsaWNLZXkgdmVyc2lvblxuICBwcmVpbWFnZS53cml0ZVVJbnQxNkxFKHNwa1ZlcnNpb24sIG9mZnNldCk7XG4gIG9mZnNldCArPSAyO1xuXG4gIC8vIDguIHNjcmlwdFB1YmxpY0tleSBsZW5ndGggKHU2NCBMRSlcbiAgcHJlaW1hZ2Uud3JpdGVCaWdVSW50NjRMRShCaWdJbnQoc2NyaXB0Qnl0ZXMubGVuZ3RoKSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgLy8gOS4gc2NyaXB0UHVibGljS2V5IGJ5dGVzXG4gIHNjcmlwdEJ5dGVzLmNvcHkocHJlaW1hZ2UsIG9mZnNldCk7XG4gIG9mZnNldCArPSBzY3JpcHRCeXRlcy5sZW5ndGg7XG5cbiAgLy8gMTAuIHZhbHVlIChhbW91bnQgaW4gc29tcGksIHU2NCBMRSlcbiAgcHJlaW1hZ2Uud3JpdGVCaWdVSW50NjRMRShCaWdJbnQoaW5wdXQuYW1vdW50KSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgLy8gMTEuIHNlcXVlbmNlICh1NjQgTEUpXG4gIHByZWltYWdlLndyaXRlQmlnVUludDY0TEUoQmlnSW50KGlucHV0LnNlcXVlbmNlIHx8ICcwJyksIG9mZnNldCk7XG4gIG9mZnNldCArPSA4O1xuXG4gIC8vIDEyLiBzaWdPcENvdW50ICh1OClcbiAgcHJlaW1hZ2Uud3JpdGVVSW50OChpbnB1dC5zaWdPcENvdW50ID8/IDEsIG9mZnNldCk7XG4gIG9mZnNldCArPSAxO1xuXG4gIC8vIDEzLiBvdXRwdXRzSGFzaFxuICBvdXRzSGFzaC5jb3B5KHByZWltYWdlLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gMzI7XG5cbiAgLy8gMTQuIGxvY2t0aW1lICh1NjQgTEUpXG4gIHByZWltYWdlLndyaXRlQmlnVUludDY0TEUoQmlnSW50KHR4LmxvY2tUaW1lIHx8ICcwJyksIG9mZnNldCk7XG4gIG9mZnNldCArPSA4O1xuXG4gIC8vIDE1LiBzdWJuZXR3b3JrSWQgKDIwIGJ5dGVzKVxuICBzdWJuZXRJZC5jb3B5KHByZWltYWdlLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gMjA7XG5cbiAgLy8gMTYuIGdhcyAodTY0IExFKSDigJQgYWx3YXlzIDAgZm9yIG5hdGl2ZSBLQVNQQVxuICBwcmVpbWFnZS53cml0ZUJpZ1VJbnQ2NExFKDBuLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gODtcblxuICAvLyAxNy4gcGF5bG9hZEhhc2hcbiAgcGF5bG9hZEhhc2guY29weShwcmVpbWFnZSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDMyO1xuXG4gIC8vIDE4LiBzaWdIYXNoVHlwZSAodTgpXG4gIHByZWltYWdlLndyaXRlVUludDgoc2lnSGFzaFR5cGUsIG9mZnNldCk7XG4gIG9mZnNldCArPSAxO1xuXG4gIHJldHVybiBibGFrZTJiMjU2KHByZWltYWdlLnNsaWNlKDAsIG9mZnNldCkpO1xufVxuIl19
@@ -0,0 +1,53 @@
1
+ import { BaseKey, BaseTransaction } from '@bitgo-beta/sdk-core';
2
+ import { KaspaTransactionData, TransactionExplanation } from './iface';
3
+ export declare class Transaction extends BaseTransaction {
4
+ protected _txData: KaspaTransactionData;
5
+ constructor(coin: string, txData?: KaspaTransactionData);
6
+ /** @inheritDoc */
7
+ get id(): string;
8
+ get txData(): KaspaTransactionData;
9
+ /**
10
+ * Sign all inputs with the given private key using Schnorr signatures.
11
+ *
12
+ * @param privateKey 32-byte private key buffer
13
+ * @param sigHashType SigHash type (default: SIGHASH_ALL = 0x01)
14
+ */
15
+ sign(privateKey: Buffer, sigHashType?: number): void;
16
+ /**
17
+ * Verify that a Schnorr signature on a specific input is valid.
18
+ *
19
+ * @param publicKey 33-byte compressed public key (or 32-byte x-only)
20
+ * @param inputIndex Index of the input to verify
21
+ * @param sigHashType SigHash type used when signing
22
+ */
23
+ verifySignature(publicKey: Buffer, inputIndex: number, sigHashType?: number): boolean;
24
+ /**
25
+ * Explain the transaction in a human-readable format.
26
+ */
27
+ explainTransaction(): TransactionExplanation;
28
+ /**
29
+ * Serialize the transaction to a JSON string (broadcast format).
30
+ */
31
+ toBroadcastFormat(): string;
32
+ /**
33
+ * Serialize transaction to hex (JSON-encoded then hex-encoded).
34
+ */
35
+ toHex(): string;
36
+ /**
37
+ * Return transaction data as a plain object.
38
+ */
39
+ toJson(): KaspaTransactionData;
40
+ /**
41
+ * Deserialize from hex.
42
+ */
43
+ static fromHex(coin: string, hex: string): Transaction;
44
+ /**
45
+ * Deserialize from JSON string or object.
46
+ */
47
+ static fromJson(coin: string, data: string | KaspaTransactionData): Transaction;
48
+ /** @inheritDoc */
49
+ get signature(): string[];
50
+ /** @inheritDoc */
51
+ canSign(_key: BaseKey): boolean;
52
+ }
53
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAmB,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAGvE,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,OAAO,EAAE,oBAAoB,CAAC;gBAE5B,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,oBAAoB;IASvD,kBAAkB;IAClB,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,MAAM,IAAI,oBAAoB,CAEjC;IAED;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,GAAE,MAAoB,GAAG,IAAI;IAajE;;;;;;OAMG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAE,MAAoB,GAAG,OAAO;IAgBlG;;OAEG;IACH,kBAAkB,IAAI,sBAAsB;IA8B5C;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,MAAM,IAAI,oBAAoB;IAI9B;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW;IAKtD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,WAAW;IAK/E,kBAAkB;IAClB,IAAI,SAAS,IAAI,MAAM,EAAE,CAExB;IAED,kBAAkB;IAClB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;CAGhC"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Transaction = void 0;
4
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
5
+ const secp256k1_1 = require("@bitgo-beta/secp256k1");
6
+ const sighash_1 = require("./sighash");
7
+ class Transaction extends sdk_core_1.BaseTransaction {
8
+ constructor(coin, txData) {
9
+ super({ coin });
10
+ this._txData = txData || {
11
+ version: 0,
12
+ inputs: [],
13
+ outputs: [],
14
+ };
15
+ }
16
+ /** @inheritDoc */
17
+ get id() {
18
+ return this._txData.id || '';
19
+ }
20
+ get txData() {
21
+ return this._txData;
22
+ }
23
+ /**
24
+ * Sign all inputs with the given private key using Schnorr signatures.
25
+ *
26
+ * @param privateKey 32-byte private key buffer
27
+ * @param sigHashType SigHash type (default: SIGHASH_ALL = 0x01)
28
+ */
29
+ sign(privateKey, sigHashType = sighash_1.SIGHASH_ALL) {
30
+ if (privateKey.length !== 32) {
31
+ throw new Error(`Expected 32-byte private key, got ${privateKey.length}`);
32
+ }
33
+ for (let i = 0; i < this._txData.inputs.length; i++) {
34
+ const sigHash = (0, sighash_1.computeKaspaSigningHash)(this._txData, i, sigHashType);
35
+ const sig = secp256k1_1.ecc.signSchnorr(sigHash, privateKey);
36
+ // 65-byte signature: 64-byte Schnorr sig + 1-byte sighash type
37
+ const sigWithType = Buffer.concat([Buffer.from(sig), Buffer.from([sigHashType])]);
38
+ this._txData.inputs[i].signatureScript = sigWithType.toString('hex');
39
+ }
40
+ }
41
+ /**
42
+ * Verify that a Schnorr signature on a specific input is valid.
43
+ *
44
+ * @param publicKey 33-byte compressed public key (or 32-byte x-only)
45
+ * @param inputIndex Index of the input to verify
46
+ * @param sigHashType SigHash type used when signing
47
+ */
48
+ verifySignature(publicKey, inputIndex, sigHashType = sighash_1.SIGHASH_ALL) {
49
+ const input = this._txData.inputs[inputIndex];
50
+ if (!input?.signatureScript) {
51
+ return false;
52
+ }
53
+ const sigBytes = Buffer.from(input.signatureScript, 'hex');
54
+ if (sigBytes.length < 65) {
55
+ return false;
56
+ }
57
+ const sig = sigBytes.slice(0, 64);
58
+ const sigHash = (0, sighash_1.computeKaspaSigningHash)(this._txData, inputIndex, sigHashType);
59
+ // Accept 33-byte compressed or 32-byte x-only
60
+ const xOnlyPub = publicKey.length === 33 ? publicKey.slice(1) : publicKey;
61
+ return secp256k1_1.ecc.verifySchnorr(sigHash, xOnlyPub, sig);
62
+ }
63
+ /**
64
+ * Explain the transaction in a human-readable format.
65
+ */
66
+ explainTransaction() {
67
+ let totalIn = BigInt(0);
68
+ let totalOut = BigInt(0);
69
+ for (const input of this._txData.inputs) {
70
+ totalIn += BigInt(input.amount);
71
+ }
72
+ for (const output of this._txData.outputs) {
73
+ totalOut += BigInt(output.amount);
74
+ }
75
+ const fee = (totalIn - totalOut).toString();
76
+ const outputs = this._txData.outputs.map((o) => ({
77
+ address: o.address,
78
+ amount: o.amount,
79
+ }));
80
+ return {
81
+ id: this._txData.id || '',
82
+ type: sdk_core_1.TransactionType.Send,
83
+ outputs,
84
+ outputAmount: totalOut.toString(),
85
+ changeOutputs: [],
86
+ changeAmount: '0',
87
+ fee: { fee: this._txData.fee || fee },
88
+ inputs: this._txData.inputs,
89
+ };
90
+ }
91
+ /**
92
+ * Serialize the transaction to a JSON string (broadcast format).
93
+ */
94
+ toBroadcastFormat() {
95
+ return JSON.stringify(this._txData);
96
+ }
97
+ /**
98
+ * Serialize transaction to hex (JSON-encoded then hex-encoded).
99
+ */
100
+ toHex() {
101
+ return Buffer.from(this.toBroadcastFormat()).toString('hex');
102
+ }
103
+ /**
104
+ * Return transaction data as a plain object.
105
+ */
106
+ toJson() {
107
+ return { ...this._txData };
108
+ }
109
+ /**
110
+ * Deserialize from hex.
111
+ */
112
+ static fromHex(coin, hex) {
113
+ const json = JSON.parse(Buffer.from(hex, 'hex').toString());
114
+ return new Transaction(coin, json);
115
+ }
116
+ /**
117
+ * Deserialize from JSON string or object.
118
+ */
119
+ static fromJson(coin, data) {
120
+ const txData = typeof data === 'string' ? JSON.parse(data) : data;
121
+ return new Transaction(coin, txData);
122
+ }
123
+ /** @inheritDoc */
124
+ get signature() {
125
+ return this._txData.inputs.map((i) => i.signatureScript || '');
126
+ }
127
+ /** @inheritDoc */
128
+ canSign(_key) {
129
+ return true;
130
+ }
131
+ }
132
+ exports.Transaction = Transaction;
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFpRjtBQUNqRixxREFBNEM7QUFFNUMsdUNBQWlFO0FBRWpFLE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBRzlDLFlBQVksSUFBWSxFQUFFLE1BQTZCO1FBQ3JELEtBQUssQ0FBQyxFQUFFLElBQUksRUFBUyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUk7WUFDdkIsT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsVUFBa0IsRUFBRSxjQUFzQixxQkFBVztRQUN4RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGlDQUF1QixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sR0FBRyxHQUFH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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLElBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUE5SUQsa0NBOElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUtleSwgQmFzZVRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBlY2MgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgS2FzcGFUcmFuc2FjdGlvbkRhdGEsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoLCBTSUdIQVNIX0FMTCB9IGZyb20gJy4vc2lnaGFzaCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfdHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YTtcblxuICBjb25zdHJ1Y3Rvcihjb2luOiBzdHJpbmcsIHR4RGF0YT86IEthc3BhVHJhbnNhY3Rpb25EYXRhKSB7XG4gICAgc3VwZXIoeyBjb2luIH0gYXMgYW55KTtcbiAgICB0aGlzLl90eERhdGEgPSB0eERhdGEgfHwge1xuICAgICAgdmVyc2lvbjogMCxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eERhdGEuaWQgfHwgJyc7XG4gIH1cblxuICBnZXQgdHhEYXRhKCk6IEthc3BhVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fdHhEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYWxsIGlucHV0cyB3aXRoIHRoZSBnaXZlbiBwcml2YXRlIGtleSB1c2luZyBTY2hub3JyIHNpZ25hdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IDMyLWJ5dGUgcHJpdmF0ZSBrZXkgYnVmZmVyXG4gICAqIEBwYXJhbSBzaWdIYXNoVHlwZSBTaWdIYXNoIHR5cGUgKGRlZmF1bHQ6IFNJR0hBU0hfQUxMID0gMHgwMSlcbiAgICovXG4gIHNpZ24ocHJpdmF0ZUtleTogQnVmZmVyLCBzaWdIYXNoVHlwZTogbnVtYmVyID0gU0lHSEFTSF9BTEwpOiB2b2lkIHtcbiAgICBpZiAocHJpdmF0ZUtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDMyLWJ5dGUgcHJpdmF0ZSBrZXksIGdvdCAke3ByaXZhdGVLZXkubGVuZ3RofWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3R4RGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFTaWduaW5nSGFzaCh0aGlzLl90eERhdGEsIGksIHNpZ0hhc2hUeXBlKTtcbiAgICAgIGNvbnN0IHNpZyA9IGVjYy5zaWduU2Nobm9ycihzaWdIYXNoLCBwcml2YXRlS2V5KTtcbiAgICAgIC8vIDY1LWJ5dGUgc2lnbmF0dXJlOiA2NC1ieXRlIFNjaG5vcnIgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgY29uc3Qgc2lnV2l0aFR5cGUgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWcpLCBCdWZmZXIuZnJvbShbc2lnSGFzaFR5cGVdKV0pO1xuICAgICAgdGhpcy5fdHhEYXRhLmlucHV0c1tpXS5zaWduYXR1cmVTY3JpcHQgPSBzaWdXaXRoVHlwZS50b1N0cmluZygnaGV4Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgU2Nobm9yciBzaWduYXR1cmUgb24gYSBzcGVjaWZpYyBpbnB1dCBpcyB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHB1YmxpY0tleSAzMy1ieXRlIGNvbXByZXNzZWQgcHVibGljIGtleSAob3IgMzItYnl0ZSB4LW9ubHkpXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IEluZGV4IG9mIHRoZSBpbnB1dCB0byB2ZXJpZnlcbiAgICogQHBhcmFtIHNpZ0hhc2hUeXBlIFNpZ0hhc2ggdHlwZSB1c2VkIHdoZW4gc2lnbmluZ1xuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleTogQnVmZmVyLCBpbnB1dEluZGV4OiBudW1iZXIsIHNpZ0hhc2hUeXBlOiBudW1iZXIgPSBTSUdIQVNIX0FMTCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fdHhEYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBpZiAoIWlucHV0Py5zaWduYXR1cmVTY3JpcHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnQnl0ZXMgPSBCdWZmZXIuZnJvbShpbnB1dC5zaWduYXR1cmVTY3JpcHQsICdoZXgnKTtcbiAgICBpZiAoc2lnQnl0ZXMubGVuZ3RoIDwgNjUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnID0gc2lnQnl0ZXMuc2xpY2UoMCwgNjQpO1xuICAgIGNvbnN0IHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFTaWduaW5nSGFzaCh0aGlzLl90eERhdGEsIGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcbiAgICAvLyBBY2NlcHQgMzMtYnl0ZSBjb21wcmVzc2VkIG9yIDMyLWJ5dGUgeC1vbmx5XG4gICAgY29uc3QgeE9ubHlQdWIgPSBwdWJsaWNLZXkubGVuZ3RoID09PSAzMyA/IHB1YmxpY0tleS5zbGljZSgxKSA6IHB1YmxpY0tleTtcbiAgICByZXR1cm4gZWNjLnZlcmlmeVNjaG5vcnIoc2lnSGFzaCwgeE9ubHlQdWIsIHNpZyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbiB0aGUgdHJhbnNhY3Rpb24gaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuXG4gICAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgbGV0IHRvdGFsSW4gPSBCaWdJbnQoMCk7XG4gICAgbGV0IHRvdGFsT3V0ID0gQmlnSW50KDApO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLl90eERhdGEuaW5wdXRzKSB7XG4gICAgICB0b3RhbEluICs9IEJpZ0ludChpbnB1dC5hbW91bnQpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0aGlzLl90eERhdGEub3V0cHV0cykge1xuICAgICAgdG90YWxPdXQgKz0gQmlnSW50KG91dHB1dC5hbW91bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGZlZSA9ICh0b3RhbEluIC0gdG90YWxPdXQpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5fdHhEYXRhLm91dHB1dHMubWFwKChvKSA9PiAoe1xuICAgICAgYWRkcmVzczogby5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBvLmFtb3VudCxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuX3R4RGF0YS5pZCB8fCAnJyxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIG91dHB1dEFtb3VudDogdG90YWxPdXQudG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBmZWU6IHsgZmVlOiB0aGlzLl90eERhdGEuZmVlIHx8IGZlZSB9LFxuICAgICAgaW5wdXRzOiB0aGlzLl90eERhdGEuaW5wdXRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvbiB0byBhIEpTT04gc3RyaW5nIChicm9hZGNhc3QgZm9ybWF0KS5cbiAgICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3R4RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRyYW5zYWN0aW9uIHRvIGhleCAoSlNPTi1lbmNvZGVkIHRoZW4gaGV4LWVuY29kZWQpLlxuICAgKi9cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy50b0Jyb2FkY2FzdEZvcm1hdCgpKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRyYW5zYWN0aW9uIGRhdGEgYXMgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICB0b0pzb24oKTogS2FzcGFUcmFuc2FjdGlvbkRhdGEge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3R4RGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGZyb20gaGV4LlxuICAgKi9cbiAgc3RhdGljIGZyb21IZXgoY29pbjogc3RyaW5nLCBoZXg6IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShoZXgsICdoZXgnKS50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKGNvaW4sIGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGZyb20gSlNPTiBzdHJpbmcgb3Igb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGZyb21Kc29uKGNvaW46IHN0cmluZywgZGF0YTogc3RyaW5nIHwgS2FzcGFUcmFuc2FjdGlvbkRhdGEpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZGF0YSkgOiBkYXRhO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oY29pbiwgdHhEYXRhKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdHhEYXRhLmlucHV0cy5tYXAoKGkpID0+IGkuc2lnbmF0dXJlU2NyaXB0IHx8ICcnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBjYW5TaWduKF9rZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,58 @@
1
+ import { BaseTransactionBuilder, BaseTransaction, BaseKey } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import BigNumber from 'bignumber.js';
4
+ import { Transaction } from './transaction';
5
+ import { KaspaUtxoInput, KaspaTransactionOutput } from './iface';
6
+ export declare class TransactionBuilder extends BaseTransactionBuilder {
7
+ protected _transaction: Transaction;
8
+ protected _inputs: KaspaUtxoInput[];
9
+ protected _outputs: KaspaTransactionOutput[];
10
+ protected _fee: string;
11
+ protected _fromAddress: string;
12
+ constructor(coinConfig: Readonly<CoinConfig>);
13
+ /** @inheritDoc */
14
+ protected get transaction(): BaseTransaction;
15
+ /** @inheritDoc */
16
+ protected set transaction(tx: BaseTransaction);
17
+ /**
18
+ * Set the sender address.
19
+ */
20
+ sender(address: string): this;
21
+ /**
22
+ * Add a recipient output.
23
+ */
24
+ to(address: string, amount: string): this;
25
+ /**
26
+ * Set transaction fee in sompi.
27
+ */
28
+ fee(fee: string): this;
29
+ /**
30
+ * Add a UTXO input.
31
+ */
32
+ addInput(utxo: KaspaUtxoInput): this;
33
+ /**
34
+ * Add multiple UTXO inputs.
35
+ */
36
+ addInputs(utxos: KaspaUtxoInput[]): this;
37
+ /** @inheritDoc */
38
+ protected fromImplementation(rawTransaction: string): Transaction;
39
+ /** @inheritDoc */
40
+ protected buildImplementation(): Promise<BaseTransaction>;
41
+ /** @inheritDoc */
42
+ protected signImplementation({ key }: BaseKey): BaseTransaction;
43
+ /** @inheritDoc */
44
+ validateTransaction(_transaction?: BaseTransaction): void;
45
+ /** @inheritDoc */
46
+ validateKey(key: {
47
+ key: string;
48
+ }): void;
49
+ /** @inheritDoc */
50
+ validateAddress(address: {
51
+ address: string;
52
+ }): void;
53
+ /** @inheritDoc */
54
+ validateRawTransaction(rawTransaction: string): void;
55
+ /** @inheritDoc */
56
+ validateValue(value: BigNumber): void;
57
+ }
58
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,OAAO,EAAgB,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAwB,cAAc,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAKvF,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,CAAM;IACzC,SAAS,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAM;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,CAAe;IACrC,SAAS,CAAC,YAAY,SAAM;gBAEhB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,eAAe,CAE3C;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,EAAE,EAAE,eAAe,EAE5C;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ7B;;OAEG;IACH,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQzC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQpC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKxC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IASjE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IAe/D,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,eAAe;IAU/D,kBAAkB;IAClB,mBAAmB,CAAC,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI;IASzD,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIvC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMnD,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;CAKtC"}