@bitgo-beta/sdk-coin-kaspa 0.0.1-alpha.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/LICENSE +191 -0
- package/README.md +126 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +44 -0
- package/dist/src/kaspa.d.ts +64 -0
- package/dist/src/kaspa.d.ts.map +1 -0
- package/dist/src/kaspa.js +246 -0
- package/dist/src/lib/constants.d.ts +12 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +18 -0
- package/dist/src/lib/iface.d.ts +109 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +3 -0
- package/dist/src/lib/index.d.ts +10 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +36 -0
- package/dist/src/lib/keyPair.d.ts +22 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +61 -0
- package/dist/src/lib/sighash.d.ts +25 -0
- package/dist/src/lib/sighash.d.ts.map +1 -0
- package/dist/src/lib/sighash.js +191 -0
- package/dist/src/lib/transaction.d.ts +53 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +133 -0
- package/dist/src/lib/transactionBuilder.d.ts +58 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +139 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +15 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +25 -0
- package/dist/src/lib/utils.d.ts +43 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +236 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +10 -0
- package/dist/test/fixtures/kaspa.fixtures.d.ts +29 -0
- package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -0
- package/dist/test/fixtures/kaspa.fixtures.js +90 -0
- package/dist/test/unit/coin.test.d.ts +2 -0
- package/dist/test/unit/coin.test.d.ts.map +1 -0
- package/dist/test/unit/coin.test.js +225 -0
- package/dist/test/unit/keyPair.test.d.ts +2 -0
- package/dist/test/unit/keyPair.test.d.ts.map +1 -0
- package/dist/test/unit/keyPair.test.js +90 -0
- package/dist/test/unit/transaction.test.d.ts +2 -0
- package/dist/test/unit/transaction.test.d.ts.map +1 -0
- package/dist/test/unit/transaction.test.js +206 -0
- package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.test.js +220 -0
- package/dist/test/unit/transactionFlow.test.d.ts +8 -0
- package/dist/test/unit/transactionFlow.test.d.ts.map +1 -0
- package/dist/test/unit/transactionFlow.test.js +105 -0
- package/dist/test/unit/utils.test.d.ts +2 -0
- package/dist/test/unit/utils.test.d.ts.map +1 -0
- package/dist/test/unit/utils.test.js +159 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFpRjtBQUNqRixxREFBNEM7QUFFNUMsdUNBQWlFO0FBRWpFLE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBRzlDLFlBQVksSUFBWSxFQUFFLE1BQTZCO1FBQ3JELEtBQUssQ0FBQyxFQUFFLElBQUksRUFBUyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUk7WUFDdkIsT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsVUFBa0IsRUFBRSxjQUFzQixxQkFBVztRQUN4RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGlDQUF1QixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sR0FBRyxHQUFHLGVBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2pELCtEQUErRDtZQUMvRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxlQUFlLENBQUMsU0FBaUIsRUFBRSxVQUFrQixFQUFFLGNBQXNCLHFCQUFXO1FBQ3RGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFBLGlDQUF1QixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9FLDhDQUE4QztRQUM5QyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzFFLE9BQU8sZUFBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFDLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0MsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1lBQ2xCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtTQUNqQixDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU87WUFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRTtZQUN6QixJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJO1lBQzFCLE9BQU87WUFDUCxZQUFZLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUNqQyxhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsR0FBRztZQUNqQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBWSxFQUFFLEdBQVc7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWSxFQUFFLElBQW1DO1FBQy9ELE1BQU0sTUFBTSxHQUF5QixPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RixPQUFPLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLElBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUE5SUQsa0NBOElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUtleSwgQmFzZVRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBlY2MgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgS2FzcGFUcmFuc2FjdGlvbkRhdGEsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoLCBTSUdIQVNIX0FMTCB9IGZyb20gJy4vc2lnaGFzaCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfdHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YTtcblxuICBjb25zdHJ1Y3Rvcihjb2luOiBzdHJpbmcsIHR4RGF0YT86IEthc3BhVHJhbnNhY3Rpb25EYXRhKSB7XG4gICAgc3VwZXIoeyBjb2luIH0gYXMgYW55KTtcbiAgICB0aGlzLl90eERhdGEgPSB0eERhdGEgfHwge1xuICAgICAgdmVyc2lvbjogMCxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eERhdGEuaWQgfHwgJyc7XG4gIH1cblxuICBnZXQgdHhEYXRhKCk6IEthc3BhVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fdHhEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYWxsIGlucHV0cyB3aXRoIHRoZSBnaXZlbiBwcml2YXRlIGtleSB1c2luZyBTY2hub3JyIHNpZ25hdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IDMyLWJ5dGUgcHJpdmF0ZSBrZXkgYnVmZmVyXG4gICAqIEBwYXJhbSBzaWdIYXNoVHlwZSBTaWdIYXNoIHR5cGUgKGRlZmF1bHQ6IFNJR0hBU0hfQUxMID0gMHgwMSlcbiAgICovXG4gIHNpZ24ocHJpdmF0ZUtleTogQnVmZmVyLCBzaWdIYXNoVHlwZTogbnVtYmVyID0gU0lHSEFTSF9BTEwpOiB2b2lkIHtcbiAgICBpZiAocHJpdmF0ZUtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDMyLWJ5dGUgcHJpdmF0ZSBrZXksIGdvdCAke3ByaXZhdGVLZXkubGVuZ3RofWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3R4RGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFTaWduaW5nSGFzaCh0aGlzLl90eERhdGEsIGksIHNpZ0hhc2hUeXBlKTtcbiAgICAgIGNvbnN0IHNpZyA9IGVjYy5zaWduU2Nobm9ycihzaWdIYXNoLCBwcml2YXRlS2V5KTtcbiAgICAgIC8vIDY1LWJ5dGUgc2lnbmF0dXJlOiA2NC1ieXRlIFNjaG5vcnIgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgY29uc3Qgc2lnV2l0aFR5cGUgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWcpLCBCdWZmZXIuZnJvbShbc2lnSGFzaFR5cGVdKV0pO1xuICAgICAgdGhpcy5fdHhEYXRhLmlucHV0c1tpXS5zaWduYXR1cmVTY3JpcHQgPSBzaWdXaXRoVHlwZS50b1N0cmluZygnaGV4Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgU2Nobm9yciBzaWduYXR1cmUgb24gYSBzcGVjaWZpYyBpbnB1dCBpcyB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHB1YmxpY0tleSAzMy1ieXRlIGNvbXByZXNzZWQgcHVibGljIGtleSAob3IgMzItYnl0ZSB4LW9ubHkpXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IEluZGV4IG9mIHRoZSBpbnB1dCB0byB2ZXJpZnlcbiAgICogQHBhcmFtIHNpZ0hhc2hUeXBlIFNpZ0hhc2ggdHlwZSB1c2VkIHdoZW4gc2lnbmluZ1xuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleTogQnVmZmVyLCBpbnB1dEluZGV4OiBudW1iZXIsIHNpZ0hhc2hUeXBlOiBudW1iZXIgPSBTSUdIQVNIX0FMTCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fdHhEYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBpZiAoIWlucHV0Py5zaWduYXR1cmVTY3JpcHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnQnl0ZXMgPSBCdWZmZXIuZnJvbShpbnB1dC5zaWduYXR1cmVTY3JpcHQsICdoZXgnKTtcbiAgICBpZiAoc2lnQnl0ZXMubGVuZ3RoIDwgNjUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnID0gc2lnQnl0ZXMuc2xpY2UoMCwgNjQpO1xuICAgIGNvbnN0IHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFTaWduaW5nSGFzaCh0aGlzLl90eERhdGEsIGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcbiAgICAvLyBBY2NlcHQgMzMtYnl0ZSBjb21wcmVzc2VkIG9yIDMyLWJ5dGUgeC1vbmx5XG4gICAgY29uc3QgeE9ubHlQdWIgPSBwdWJsaWNLZXkubGVuZ3RoID09PSAzMyA/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"}
|