@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,206 @@
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
+ const assert_1 = __importDefault(require("assert"));
7
+ const transaction_1 = require("../../src/lib/transaction");
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const sighash_1 = require("../../src/lib/sighash");
10
+ const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
11
+ const COIN = 'kaspa';
12
+ describe('Kaspa Transaction', function () {
13
+ describe('Constructor', function () {
14
+ it('should create an empty transaction', function () {
15
+ const tx = new transaction_1.Transaction(COIN);
16
+ assert_1.default.ok(tx);
17
+ assert_1.default.deepEqual(tx.txData.inputs, []);
18
+ assert_1.default.deepEqual(tx.txData.outputs, []);
19
+ });
20
+ it('should create a transaction from txData', function () {
21
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
22
+ assert_1.default.equal(tx.txData.inputs.length, 1);
23
+ assert_1.default.equal(tx.txData.outputs.length, 1);
24
+ assert_1.default.equal(tx.txData.fee, '2000');
25
+ });
26
+ });
27
+ describe('id getter', function () {
28
+ it('should return empty string when no id is set', function () {
29
+ const tx = new transaction_1.Transaction(COIN);
30
+ assert_1.default.equal(tx.id, '');
31
+ });
32
+ it('should return the transaction id if set', function () {
33
+ const txData = { ...kaspa_fixtures_1.TRANSACTIONS.simple, id: 'deadbeef' + '00'.repeat(30) };
34
+ const tx = new transaction_1.Transaction(COIN, txData);
35
+ assert_1.default.equal(tx.id, txData.id);
36
+ });
37
+ });
38
+ describe('signature getter', function () {
39
+ it('should return empty signatures for unsigned tx', function () {
40
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
41
+ const sigs = tx.signature;
42
+ assert_1.default.equal(sigs.length, kaspa_fixtures_1.TRANSACTIONS.simple.inputs.length);
43
+ assert_1.default.ok(sigs.every((s) => s === ''));
44
+ });
45
+ it('should return signature scripts after signing', function () {
46
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
47
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
48
+ tx.sign(privKey);
49
+ const sigs = tx.signature;
50
+ assert_1.default.equal(sigs.length, 1);
51
+ assert_1.default.ok(sigs[0].length > 0);
52
+ });
53
+ });
54
+ describe('canSign', function () {
55
+ it('should always return true', function () {
56
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
57
+ assert_1.default.ok(tx.canSign({ key: kaspa_fixtures_1.KEYS.prv }));
58
+ });
59
+ });
60
+ describe('sign', function () {
61
+ it('should throw on non-32-byte private key', function () {
62
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
63
+ assert_1.default.throws(() => {
64
+ tx.sign(Buffer.from('0102', 'hex'));
65
+ }, /32-byte/);
66
+ });
67
+ it('should sign all inputs with a valid private key', function () {
68
+ const tx = new transaction_1.Transaction(COIN, { ...kaspa_fixtures_1.TRANSACTIONS.simple });
69
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
70
+ tx.sign(privKey);
71
+ for (const input of tx.txData.inputs) {
72
+ assert_1.default.ok(input.signatureScript, 'Each input should have a signatureScript');
73
+ assert_1.default.ok(input.signatureScript.length > 0);
74
+ }
75
+ });
76
+ it('should sign multiple inputs', function () {
77
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
78
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
79
+ tx.sign(privKey);
80
+ assert_1.default.equal(tx.txData.inputs.length, 2);
81
+ for (const input of tx.txData.inputs) {
82
+ assert_1.default.ok(input.signatureScript && input.signatureScript.length > 0);
83
+ }
84
+ });
85
+ it('should produce 65-byte signatures (64 Schnorr + 1 sighash type)', function () {
86
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
87
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
88
+ tx.sign(privKey);
89
+ const sigHex = tx.txData.inputs[0].signatureScript;
90
+ // 65 bytes = 130 hex chars
91
+ assert_1.default.equal(sigHex.length, 130);
92
+ // Last byte is sighash type (0x01 = SIGHASH_ALL)
93
+ const lastByte = parseInt(sigHex.slice(-2), 16);
94
+ assert_1.default.equal(lastByte, sighash_1.SIGHASH_ALL);
95
+ });
96
+ });
97
+ describe('verifySignature', function () {
98
+ it('should return false for unsigned input', function () {
99
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
100
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
101
+ assert_1.default.equal(tx.verifySignature(pubKey, 0), false);
102
+ });
103
+ it('should return true after signing with matching key', function () {
104
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
105
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
106
+ tx.sign(privKey);
107
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
108
+ assert_1.default.ok(tx.verifySignature(pubKey, 0));
109
+ });
110
+ it('should accept x-only (32-byte) public key', function () {
111
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
112
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
113
+ tx.sign(privKey);
114
+ const xOnlyPub = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex').slice(1);
115
+ assert_1.default.ok(tx.verifySignature(xOnlyPub, 0));
116
+ });
117
+ it('should return false for wrong public key', function () {
118
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
119
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
120
+ tx.sign(privKey);
121
+ const wrongPub = Buffer.from('02' + 'ab'.repeat(32), 'hex');
122
+ assert_1.default.equal(tx.verifySignature(wrongPub, 0), false);
123
+ });
124
+ it('should return false for out-of-range input index', function () {
125
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
126
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
127
+ tx.sign(privKey);
128
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
129
+ assert_1.default.equal(tx.verifySignature(pubKey, 99), false);
130
+ });
131
+ });
132
+ describe('explainTransaction', function () {
133
+ it('should return a TransactionExplanation with correct fields', function () {
134
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
135
+ const explanation = tx.explainTransaction();
136
+ assert_1.default.equal(explanation.id, '');
137
+ assert_1.default.equal(explanation.type, sdk_core_1.TransactionType.Send);
138
+ assert_1.default.equal(explanation.outputs.length, 1);
139
+ assert_1.default.equal(explanation.outputs[0].amount, '99998000');
140
+ assert_1.default.equal(explanation.inputs.length, 1);
141
+ assert_1.default.equal(explanation.inputs[0].amount, '100000000');
142
+ });
143
+ it('should calculate the fee as totalIn - totalOut', function () {
144
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
145
+ const explanation = tx.explainTransaction();
146
+ // fee = 100000000 - 99998000 = 2000
147
+ assert_1.default.equal(explanation.fee.fee, '2000');
148
+ });
149
+ it('should sum all outputs in outputAmount', function () {
150
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.multiInput);
151
+ const explanation = tx.explainTransaction();
152
+ assert_1.default.equal(explanation.outputAmount, '299998000');
153
+ });
154
+ });
155
+ describe('Serialization', function () {
156
+ it('toJson should return a copy of txData', function () {
157
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
158
+ const json = tx.toJson();
159
+ assert_1.default.deepEqual(json, kaspa_fixtures_1.TRANSACTIONS.simple);
160
+ assert_1.default.notEqual(json, tx.txData);
161
+ });
162
+ it('toBroadcastFormat should return a JSON string', function () {
163
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
164
+ const broadcast = tx.toBroadcastFormat();
165
+ assert_1.default.equal(typeof broadcast, 'string');
166
+ const parsed = JSON.parse(broadcast);
167
+ assert_1.default.equal(parsed.version, 0);
168
+ assert_1.default.equal(parsed.inputs.length, 1);
169
+ });
170
+ it('toHex should return hex-encoded JSON', function () {
171
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
172
+ const hex = tx.toHex();
173
+ assert_1.default.ok(/^[0-9a-fA-F]+$/.test(hex));
174
+ const decoded = Buffer.from(hex, 'hex').toString();
175
+ const parsed = JSON.parse(decoded);
176
+ assert_1.default.equal(parsed.version, 0);
177
+ });
178
+ it('fromHex should reconstruct the transaction', function () {
179
+ const original = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
180
+ const hex = original.toHex();
181
+ const restored = transaction_1.Transaction.fromHex(COIN, hex);
182
+ assert_1.default.deepEqual(restored.toJson(), original.toJson());
183
+ });
184
+ it('fromJson should reconstruct from object', function () {
185
+ const original = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
186
+ const json = original.toJson();
187
+ const restored = transaction_1.Transaction.fromJson(COIN, json);
188
+ assert_1.default.deepEqual(restored.toJson(), json);
189
+ });
190
+ it('fromJson should reconstruct from string', function () {
191
+ const original = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
192
+ const jsonStr = JSON.stringify(original.toJson());
193
+ const restored = transaction_1.Transaction.fromJson(COIN, jsonStr);
194
+ assert_1.default.deepEqual(restored.toJson(), original.toJson());
195
+ });
196
+ it('round-trip through toHex/fromHex should preserve signatures', function () {
197
+ const tx = new transaction_1.Transaction(COIN, kaspa_fixtures_1.TRANSACTIONS.simple);
198
+ const privKey = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
199
+ tx.sign(privKey);
200
+ const hex = tx.toHex();
201
+ const restored = transaction_1.Transaction.fromHex(COIN, hex);
202
+ assert_1.default.deepEqual(restored.signature, tx.signature);
203
+ });
204
+ });
205
+ });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJEQUF3RDtBQUN4RCxtREFBdUQ7QUFDdkQsbURBQW9EO0FBQ3BELCtEQUFnRTtBQUVoRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7QUFFckIsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNkLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsNkJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0s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TyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVoRCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgU0lHSEFTSF9BTEwgfSBmcm9tICcuLi8uLi9zcmMvbGliL3NpZ2hhc2gnO1xuaW1wb3J0IHsgS0VZUywgVFJBTlNBQ1RJT05TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBDT0lOID0gJ2thc3BhJztcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOKTtcbiAgICAgIGFzc2VydC5vayh0eCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHR4LnR4RGF0YS5pbnB1dHMsIFtdKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodHgudHhEYXRhLm91dHB1dHMsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGEgdHJhbnNhY3Rpb24gZnJvbSB0eERhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuZmVlLCAnMjAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaWQgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGVuIG5vIGlkIGlzIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdHJhbnNhY3Rpb24gaWQgaWYgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhEYXRhID0geyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlLCBpZDogJ2RlYWRiZWVmJyArICcwMCcucmVwZWF0KDMwKSB9O1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgdHhEYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgdHhEYXRhLmlkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25hdHVyZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgc2lnbmF0dXJlcyBmb3IgdW5zaWduZWQgdHgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIFRSQU5TQUNUSU9OUy5zaW1wbGUuaW5wdXRzLmxlbmd0aCk7XG4gICAgICBhc3NlcnQub2soc2lncy5ldmVyeSgocykgPT4gcyA9PT0gJycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHNpZ25hdHVyZSBzY3JpcHRzIGFmdGVyIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHNpZ3MgPSB0eC5zaWduYXR1cmU7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lncy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ3NbMF0ubGVuZ3RoID4gMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5TaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQub2sodHguY2FuU2lnbih7IGtleTogS0VZUy5wcnYgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIG5vbi0zMi1ieXRlIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHguc2lnbihCdWZmZXIuZnJvbSgnMDEwMicsICdoZXgnKSk7XG4gICAgICB9LCAvMzItYnl0ZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGFsbCBpbnB1dHMgd2l0aCBhIHZhbGlkIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgeyAuLi5UUkFOU0FDVElPTlMuc2ltcGxlIH0pO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC50eERhdGEuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQsICdFYWNoIGlucHV0IHNob3VsZCBoYXZlIGEgc2lnbmF0dXJlU2NyaXB0Jyk7XG4gICAgICAgIGFzc2VydC5vayhpbnB1dC5zaWduYXR1cmVTY3JpcHQhLmxlbmd0aCA+IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIG11bHRpcGxlIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5tdWx0aUlucHV0KTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMik7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHR4LnR4RGF0YS5pbnB1dHMpIHtcbiAgICAgICAgYXNzZXJ0Lm9rKGlucHV0LnNpZ25hdHVyZVNjcmlwdCAmJiBpbnB1dC5zaWduYXR1cmVTY3JpcHQubGVuZ3RoID4gMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgNjUtYnl0ZSBzaWduYXR1cmVzICg2NCBTY2hub3JyICsgMSBzaWdoYXNoIHR5cGUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCBzaWdIZXggPSB0eC50eERhdGEuaW5wdXRzWzBdLnNpZ25hdHVyZVNjcmlwdCE7XG4gICAgICAvLyA2NSBieXRlcyA9IDEzMCBoZXggY2hhcnNcbiAgICAgIGFzc2VydC5lcXVhbChzaWdIZXgubGVuZ3RoLCAxMzApO1xuICAgICAgLy8gTGFzdCBieXRlIGlzIHNpZ2hhc2ggdHlwZSAoMHgwMSA9IFNJR0hBU0hfQUxMKVxuICAgICAgY29uc3QgbGFzdEJ5dGUgPSBwYXJzZUludChzaWdIZXguc2xpY2UoLTIpLCAxNik7XG4gICAgICBhc3NlcnQuZXF1YWwobGFzdEJ5dGUsIFNJR0hBU0hfQUxMKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcmlmeVNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgdW5zaWduZWQgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgYWZ0ZXIgc2lnbmluZyB3aXRoIG1hdGNoaW5nIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgcHJpdktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHJ2LCAnaGV4Jyk7XG4gICAgICB0eC5zaWduKHByaXZLZXkpO1xuICAgICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAwKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB4LW9ubHkgKDMyLWJ5dGUpIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IHByaXZLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuICAgICAgdHguc2lnbihwcml2S2V5KTtcbiAgICAgIGNvbnN0IHhPbmx5UHViID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKS5zbGljZSgxKTtcbiAgICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUoeE9ubHlQdWIsIDApKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciB3cm9uZyBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCB3cm9uZ1B1YiA9IEJ1ZmZlci5mcm9tKCcwMicgKyAnYWInLnJlcGVhdCgzMiksICdoZXgnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC52ZXJpZnlTaWduYXR1cmUod3JvbmdQdWIsIDApLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igb3V0LW9mLXJhbmdlIGlucHV0IGluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG4gICAgICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbShLRVlTLnB1YiwgJ2hleCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnZlcmlmeVNpZ25hdHVyZShwdWJLZXksIDk5KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZXhwbGFpblRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB3aXRoIGNvcnJlY3QgZmllbGRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24uaWQsICcnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYW1vdW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5pbnB1dHNbMF0uYW1vdW50LCAnMTAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0aGUgZmVlIGFzIHRvdGFsSW4gLSB0b3RhbE91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIC8vIGZlZSA9IDEwMDAwMDAwMCAtIDk5OTk4MDAwID0gMjAwMFxuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLmZlZS5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1bSBhbGwgb3V0cHV0cyBpbiBvdXRwdXRBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMubXVsdGlJbnB1dCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCwgJzI5OTk5ODAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2VyaWFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndG9Kc29uIHNob3VsZCByZXR1cm4gYSBjb3B5IG9mIHR4RGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChqc29uLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGFzc2VydC5ub3RFcXVhbChqc29uLCB0eC50eERhdGEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvQnJvYWRjYXN0Rm9ybWF0IHNob3VsZCByZXR1cm4gYSBKU09OIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKENPSU4sIFRSQU5TQUNUSU9OUy5zaW1wbGUpO1xuICAgICAgY29uc3QgYnJvYWRjYXN0ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgYnJvYWRjYXN0LCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGJyb2FkY2FzdCk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkLnZlcnNpb24sIDApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0hleCBzaG91bGQgcmV0dXJuIGhleC1lbmNvZGVkIEpTT04nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGhleCA9IHR4LnRvSGV4KCk7XG4gICAgICBhc3NlcnQub2soL15bMC05YS1mQS1GXSskLy50ZXN0KGhleCkpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRlY29kZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZC52ZXJzaW9uLCAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tSGV4IHNob3VsZCByZWNvbnN0cnVjdCB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGhleCA9IG9yaWdpbmFsLnRvSGV4KCk7XG4gICAgICBjb25zdCByZXN0b3JlZCA9IFRyYW5zYWN0aW9uLmZyb21IZXgoQ09JTiwgaGV4KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzdG9yZWQudG9Kc29uKCksIG9yaWdpbmFsLnRvSnNvbigpKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tSnNvbiBzaG91bGQgcmVjb25zdHJ1Y3QgZnJvbSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGpzb24gPSBvcmlnaW5hbC50b0pzb24oKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gVHJhbnNhY3Rpb24uZnJvbUpzb24oQ09JTiwganNvbik7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3RvcmVkLnRvSnNvbigpLCBqc29uKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tSnNvbiBzaG91bGQgcmVjb25zdHJ1Y3QgZnJvbSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG5ldyBUcmFuc2FjdGlvbihDT0lOLCBUUkFOU0FDVElPTlMuc2ltcGxlKTtcbiAgICAgIGNvbnN0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbC50b0pzb24oKSk7XG4gICAgICBjb25zdCByZXN0b3JlZCA9IFRyYW5zYWN0aW9uLmZyb21Kc29uKENPSU4sIGpzb25TdHIpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN0b3JlZC50b0pzb24oKSwgb3JpZ2luYWwudG9Kc29uKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JvdW5kLXRyaXAgdGhyb3VnaCB0b0hleC9mcm9tSGV4IHNob3VsZCBwcmVzZXJ2ZSBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oQ09JTiwgVFJBTlNBQ1RJT05TLnNpbXBsZSk7XG4gICAgICBjb25zdCBwcml2S2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wcnYsICdoZXgnKTtcbiAgICAgIHR4LnNpZ24ocHJpdktleSk7XG5cbiAgICAgIGNvbnN0IGhleCA9IHR4LnRvSGV4KCk7XG4gICAgICBjb25zdCByZXN0b3JlZCA9IFRyYW5zYWN0aW9uLmZyb21IZXgoQ09JTiwgaGV4KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN0b3JlZC5zaWduYXR1cmUsIHR4LnNpZ25hdHVyZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transactionBuilder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.test.d.ts","sourceRoot":"","sources":["../../../test/unit/transactionBuilder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,220 @@
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
+ const assert_1 = __importDefault(require("assert"));
7
+ const statics_1 = require("@bitgo-beta/statics");
8
+ const transaction_1 = require("../../src/lib/transaction");
9
+ const transactionBuilder_1 = require("../../src/lib/transactionBuilder");
10
+ const transactionBuilderFactory_1 = require("../../src/lib/transactionBuilderFactory");
11
+ const constants_1 = require("../../src/lib/constants");
12
+ const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
13
+ const coinConfig = statics_1.coins.get('kaspa');
14
+ describe('Kaspa TransactionBuilder', function () {
15
+ let builder;
16
+ beforeEach(function () {
17
+ builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
18
+ });
19
+ describe('sender', function () {
20
+ it('should set the sender address and return this (fluent)', function () {
21
+ const result = builder.sender(kaspa_fixtures_1.ADDRESSES.sender);
22
+ assert_1.default.equal(result, builder);
23
+ });
24
+ it('should throw on invalid sender address', function () {
25
+ assert_1.default.throws(() => {
26
+ builder.sender(kaspa_fixtures_1.ADDRESSES.invalid);
27
+ }, /Invalid Kaspa address/);
28
+ });
29
+ });
30
+ describe('to', function () {
31
+ it('should add an output and return this (fluent)', function () {
32
+ const result = builder.to(kaspa_fixtures_1.ADDRESSES.recipient, '1000');
33
+ assert_1.default.equal(result, builder);
34
+ });
35
+ it('should throw on invalid recipient address', function () {
36
+ assert_1.default.throws(() => {
37
+ builder.to('notanaddress', '1000');
38
+ }, /Invalid Kaspa/);
39
+ });
40
+ });
41
+ describe('fee', function () {
42
+ it('should set the fee and return this', function () {
43
+ const result = builder.fee('5000');
44
+ assert_1.default.equal(result, builder);
45
+ });
46
+ it('should default to DEFAULT_FEE', async function () {
47
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000');
48
+ const tx = (await builder.build());
49
+ assert_1.default.equal(tx.txData.fee, constants_1.DEFAULT_FEE);
50
+ });
51
+ });
52
+ describe('addInput', function () {
53
+ it('should add a UTXO input and return this', function () {
54
+ const result = builder.addInput(kaspa_fixtures_1.UTXOS.simple);
55
+ assert_1.default.equal(result, builder);
56
+ });
57
+ it('should throw when transactionId is missing', function () {
58
+ assert_1.default.throws(() => {
59
+ builder.addInput({ ...kaspa_fixtures_1.UTXOS.simple, transactionId: '' });
60
+ }, /Invalid UTXO/);
61
+ });
62
+ it('should throw when transactionIndex is undefined', function () {
63
+ assert_1.default.throws(() => {
64
+ builder.addInput({ ...kaspa_fixtures_1.UTXOS.simple, transactionIndex: undefined });
65
+ }, /Invalid UTXO/);
66
+ });
67
+ });
68
+ describe('addInputs', function () {
69
+ it('should add multiple inputs', function () {
70
+ builder.addInputs([kaspa_fixtures_1.UTXOS.simple, kaspa_fixtures_1.UTXOS.second]);
71
+ });
72
+ });
73
+ describe('validateTransaction', function () {
74
+ it('should throw when no inputs are set', function () {
75
+ builder.to(kaspa_fixtures_1.ADDRESSES.recipient, '1000');
76
+ assert_1.default.throws(() => {
77
+ builder.validateTransaction();
78
+ }, /At least one UTXO input/);
79
+ });
80
+ it('should throw when no outputs are set', function () {
81
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple);
82
+ assert_1.default.throws(() => {
83
+ builder.validateTransaction();
84
+ }, /At least one output/);
85
+ });
86
+ it('should not throw with valid inputs and outputs', function () {
87
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000');
88
+ assert_1.default.doesNotThrow(() => {
89
+ builder.validateTransaction();
90
+ });
91
+ });
92
+ });
93
+ describe('validateAddress', function () {
94
+ it('should not throw for a valid address', function () {
95
+ assert_1.default.doesNotThrow(() => {
96
+ builder.validateAddress({ address: kaspa_fixtures_1.ADDRESSES.valid });
97
+ });
98
+ });
99
+ it('should throw for an invalid address', function () {
100
+ assert_1.default.throws(() => {
101
+ builder.validateAddress({ address: 'invalid' });
102
+ }, /Invalid Kaspa address/);
103
+ });
104
+ });
105
+ describe('validateRawTransaction', function () {
106
+ it('should not throw for valid hex', async function () {
107
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000');
108
+ const tx = (await builder.build());
109
+ const hex = tx.toHex();
110
+ assert_1.default.doesNotThrow(() => {
111
+ builder.validateRawTransaction(hex);
112
+ });
113
+ });
114
+ it('should throw for invalid hex', function () {
115
+ assert_1.default.throws(() => {
116
+ builder.validateRawTransaction('notvalidhex!!');
117
+ }, /Invalid raw Kaspa/);
118
+ });
119
+ });
120
+ describe('validateValue', function () {
121
+ it('should not throw for non-negative value', function () {
122
+ const BigNumber = require('bignumber.js').default ?? require('bignumber.js');
123
+ assert_1.default.doesNotThrow(() => {
124
+ builder.validateValue(new BigNumber(0));
125
+ });
126
+ assert_1.default.doesNotThrow(() => {
127
+ builder.validateValue(new BigNumber(1000000));
128
+ });
129
+ });
130
+ it('should throw for negative value', function () {
131
+ const BigNumber = require('bignumber.js').default ?? require('bignumber.js');
132
+ assert_1.default.throws(() => {
133
+ builder.validateValue(new BigNumber(-1));
134
+ }, /negative/);
135
+ });
136
+ });
137
+ describe('build', function () {
138
+ it('should build a valid transaction from inputs + outputs', async function () {
139
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
140
+ const tx = (await builder.build());
141
+ assert_1.default.ok(tx instanceof transaction_1.Transaction);
142
+ assert_1.default.equal(tx.txData.version, 0);
143
+ assert_1.default.equal(tx.txData.inputs.length, 1);
144
+ assert_1.default.equal(tx.txData.outputs.length, 1);
145
+ assert_1.default.equal(tx.txData.outputs[0].amount, '99998000');
146
+ assert_1.default.equal(tx.txData.fee, '2000');
147
+ });
148
+ it('should build a multi-input transaction', async function () {
149
+ builder.addInputs([kaspa_fixtures_1.UTXOS.simple, kaspa_fixtures_1.UTXOS.second]).to(kaspa_fixtures_1.ADDRESSES.recipient, '299998000').fee('2000');
150
+ const tx = (await builder.build());
151
+ assert_1.default.equal(tx.txData.inputs.length, 2);
152
+ assert_1.default.equal(tx.txData.outputs.length, 1);
153
+ });
154
+ it('should include all standard fields', async function () {
155
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000');
156
+ const tx = (await builder.build());
157
+ assert_1.default.equal(tx.txData.version, 0);
158
+ assert_1.default.equal(tx.txData.lockTime, '0');
159
+ assert_1.default.equal(tx.txData.subnetworkId, '0000000000000000000000000000000000000000');
160
+ });
161
+ });
162
+ describe('sign', function () {
163
+ it('should sign the built transaction via signImplementation', async function () {
164
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
165
+ const tx = (await builder.build());
166
+ builder.sign({ key: kaspa_fixtures_1.KEYS.prv });
167
+ assert_1.default.ok(tx.signature[0].length > 0, 'input should be signed');
168
+ assert_1.default.equal(tx.signature[0].length, 130, 'Schnorr sig should be 65 bytes / 130 hex chars');
169
+ });
170
+ it('should sign all inputs of a multi-input transaction', async function () {
171
+ builder.addInputs([kaspa_fixtures_1.UTXOS.simple, kaspa_fixtures_1.UTXOS.second]).to(kaspa_fixtures_1.ADDRESSES.recipient, '299998000').fee('2000');
172
+ const tx = (await builder.build());
173
+ builder.sign({ key: kaspa_fixtures_1.KEYS.prv });
174
+ assert_1.default.equal(tx.signature.length, 2);
175
+ assert_1.default.ok(tx.signature.every((s) => s.length === 130));
176
+ });
177
+ it('should throw SigningError when private key is missing', async function () {
178
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000');
179
+ await builder.build();
180
+ assert_1.default.throws(() => {
181
+ builder.sign({ key: '' });
182
+ });
183
+ });
184
+ });
185
+ describe('from (rebuild from hex)', function () {
186
+ it('should reconstruct a builder from a serialized transaction', async function () {
187
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
188
+ const tx = (await builder.build());
189
+ const hex = tx.toHex();
190
+ const newBuilder = new transactionBuilder_1.TransactionBuilder(coinConfig);
191
+ newBuilder.from(hex);
192
+ const rebuilt = (await newBuilder.build());
193
+ assert_1.default.deepEqual(rebuilt.toJson(), tx.toJson());
194
+ });
195
+ });
196
+ });
197
+ describe('Kaspa TransactionBuilderFactory', function () {
198
+ let factory;
199
+ beforeEach(function () {
200
+ factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
201
+ });
202
+ describe('getBuilder', function () {
203
+ it('should return a new TransactionBuilder', function () {
204
+ const builder = factory.getBuilder();
205
+ assert_1.default.ok(builder instanceof transactionBuilder_1.TransactionBuilder);
206
+ });
207
+ });
208
+ describe('from', function () {
209
+ it('should reconstruct a builder from a serialized transaction hex', async function () {
210
+ const originalBuilder = factory.getBuilder();
211
+ originalBuilder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
212
+ const tx = (await originalBuilder.build());
213
+ const hex = tx.toHex();
214
+ const rebuiltBuilder = factory.from(hex);
215
+ const rebuiltTx = (await rebuiltBuilder.build());
216
+ assert_1.default.deepEqual(rebuiltTx.toJson(), tx.toJson());
217
+ });
218
+ });
219
+ });
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLDJEQUF3RDtBQUN4RCx5RUFBc0U7QUFDdEUsdUZBQW9GO0FBQ3BGLHVEQUFzRDtBQUN0RCwrREFBb0U7QUFFcEUsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV0QyxRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDbkMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRTtRQUNqQixFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQywwQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsMEJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLElBQUksRUFBRTtRQUNiLEVBQUUsQ0FBQywrQ0FBK0MsRUFBRTtZQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMs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TUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztZQUMxRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFdkIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1lBRWhFLGdCQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgREVGQVVMVF9GRUUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBRERSRVNTRVMsIEtFWVMsIFVUWE9TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCdrYXNwYScpO1xuXG5kZXNjcmliZSgnS2FzcGEgVHJhbnNhY3Rpb25CdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VuZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHRoZSBzZW5kZXIgYWRkcmVzcyBhbmQgcmV0dXJuIHRoaXMgKGZsdWVudCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnNlbmRlcihBRERSRVNTRVMuc2VuZGVyKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBpbnZhbGlkIHNlbmRlciBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuc2VuZGVyKEFERFJFU1NFUy5pbnZhbGlkKTtcbiAgICAgIH0sIC9JbnZhbGlkIEthc3BhIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIGFuIG91dHB1dCBhbmQgcmV0dXJuIHRoaXMgKGZsdWVudCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICcxMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKCdub3RhbmFkZHJlc3MnLCAnMTAwMCcpO1xuICAgICAgfSwgL0ludmFsaWQgS2FzcGEvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZlZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB0aGUgZmVlIGFuZCByZXR1cm4gdGhpcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuZmVlKCc1MDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVmYXVsdCB0byBERUZBVUxUX0ZFRScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmZlZSwgREVGQVVMVF9GRUUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkSW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBVVFhPIGlucHV0IGFuZCByZXR1cm4gdGhpcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRyYW5zYWN0aW9uSWQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZElucHV0KHsgLi4uVVRYT1Muc2ltcGxlLCB0cmFuc2FjdGlvbklkOiAnJyB9KTtcbiAgICAgIH0sIC9JbnZhbGlkIFVUWE8vKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0cmFuc2FjdGlvbkluZGV4IGlzIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZElucHV0KHsgLi4uVVRYT1Muc2ltcGxlLCB0cmFuc2FjdGlvbkluZGV4OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBudW1iZXIgfSk7XG4gICAgICB9LCAvSW52YWxpZCBVVFhPLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRJbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgbXVsdGlwbGUgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5hZGRJbnB1dHMoW1VUWE9TLnNpbXBsZSwgVVRYT1Muc2Vjb25kXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBubyBpbnB1dHMgYXJlIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzEwMDAnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIC9BdCBsZWFzdCBvbmUgVVRYTyBpbnB1dC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIG5vIG91dHB1dHMgYXJlIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIC9BdCBsZWFzdCBvbmUgb3V0cHV0Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCB0aHJvdyB3aXRoIHZhbGlkIGlucHV0cyBhbmQgb3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGVBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IGZvciBhIHZhbGlkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiBBRERSRVNTRVMudmFsaWQgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGFuIGludmFsaWQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6ICdpbnZhbGlkJyB9KTtcbiAgICAgIH0sIC9JbnZhbGlkIEthc3BhIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlUmF3VHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgZm9yIHZhbGlkIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihoZXgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oJ25vdHZhbGlkaGV4ISEnKTtcbiAgICAgIH0sIC9JbnZhbGlkIHJhdyBLYXNwYS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGVWYWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIG5vdCB0aHJvdyBmb3Igbm9uLW5lZ2F0aXZlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgQmlnTnVtYmVyID0gcmVxdWlyZSgnYmlnbnVtYmVyLmpzJykuZGVmYXVsdCA/PyByZXF1aXJlKCdiaWdudW1iZXIuanMnKTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigwKSk7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigxMDAwMDAwKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIG5lZ2F0aXZlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgQmlnTnVtYmVyID0gcmVxdWlyZSgnYmlnbnVtYmVyLmpzJykuZGVmYXVsdCA/PyByZXF1aXJlKCdiaWdudW1iZXIuanMnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigtMSkpO1xuICAgICAgfSwgL25lZ2F0aXZlLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdmFsaWQgdHJhbnNhY3Rpb24gZnJvbSBpbnB1dHMgKyBvdXRwdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgICAgYXNzZXJ0Lm9rKHR4IGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS52ZXJzaW9uLCAwKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0c1swXS5hbW91bnQsICc5OTk5ODAwMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5mZWUsICcyMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgbXVsdGktaW5wdXQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0cyhbVVRYT1Muc2ltcGxlLCBVVFhPUy5zZWNvbmRdKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnMjk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgYWxsIHN0YW5kYXJkIGZpZWxkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEudmVyc2lvbiwgMCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHhEYXRhLmxvY2tUaW1lLCAnMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5zdWJuZXR3b3JrSWQsICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2lnbiB0aGUgYnVpbHQgdHJhbnNhY3Rpb24gdmlhIHNpZ25JbXBsZW1lbnRhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IEtFWVMucHJ2IH0pO1xuICAgICAgYXNzZXJ0Lm9rKHR4LnNpZ25hdHVyZVswXS5sZW5ndGggPiAwLCAnaW5wdXQgc2hvdWxkIGJlIHNpZ25lZCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnNpZ25hdHVyZVswXS5sZW5ndGgsIDEzMCwgJ1NjaG5vcnIgc2lnIHNob3VsZCBiZSA2NSBieXRlcyAvIDEzMCBoZXggY2hhcnMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBhbGwgaW5wdXRzIG9mIGEgbXVsdGktaW5wdXQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmFkZElucHV0cyhbVVRYT1Muc2ltcGxlLCBVVFhPUy5zZWNvbmRdKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnMjk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBLRVlTLnBydiB9KTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5vayh0eC5zaWduYXR1cmUuZXZlcnkoKHMpID0+IHMubGVuZ3RoID09PSAxMzApKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgU2lnbmluZ0Vycm9yIHdoZW4gcHJpdmF0ZSBrZXkgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6ICcnIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmcm9tIChyZWJ1aWxkIGZyb20gaGV4KScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlY29uc3RydWN0IGEgYnVpbGRlciBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBoZXggPSB0eC50b0hleCgpO1xuXG4gICAgICBjb25zdCBuZXdCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2luQ29uZmlnKTtcbiAgICAgIG5ld0J1aWxkZXIuZnJvbShoZXgpO1xuICAgICAgY29uc3QgcmVidWlsdCA9IChhd2FpdCBuZXdCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlYnVpbHQudG9Kc29uKCksIHR4LnRvSnNvbigpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0thc3BhIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBmYWN0b3J5OiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0QnVpbGRlcigpO1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkJ1aWxkZXIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlY29uc3RydWN0IGEgYnVpbGRlciBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkZXIgPSBmYWN0b3J5LmdldEJ1aWxkZXIoKTtcbiAgICAgIG9yaWdpbmFsQnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgb3JpZ2luYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgaGV4ID0gdHgudG9IZXgoKTtcblxuICAgICAgY29uc3QgcmVidWlsdEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oaGV4KTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCByZWJ1aWx0QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWJ1aWx0VHgudG9Kc29uKCksIHR4LnRvSnNvbigpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Kaspa End-to-End Transaction Flow
3
+ *
4
+ * Covers: build → sign → serialize → deserialize → verify
5
+ * All operations are offline (no live RPC calls).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=transactionFlow.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionFlow.test.d.ts","sourceRoot":"","sources":["../../../test/unit/transactionFlow.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}