@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,105 @@
1
+ "use strict";
2
+ /**
3
+ * Kaspa End-to-End Transaction Flow
4
+ *
5
+ * Covers: build → sign → serialize → deserialize → verify
6
+ * All operations are offline (no live RPC calls).
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const assert_1 = __importDefault(require("assert"));
13
+ const statics_1 = require("@bitgo-beta/statics");
14
+ const transactionBuilder_1 = require("../../src/lib/transactionBuilder");
15
+ const transaction_1 = require("../../src/lib/transaction");
16
+ const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
17
+ const coinConfig = statics_1.coins.get('kaspa');
18
+ const PRV_KEY_BUF = Buffer.from(kaspa_fixtures_1.KEYS.prv, 'hex');
19
+ describe('Kaspa — End-to-End Transaction Flow', function () {
20
+ it('should build, sign, serialize, deserialize, and verify a simple transaction', async function () {
21
+ // Step 1: Build
22
+ const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
23
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
24
+ const tx = (await builder.build());
25
+ assert_1.default.ok(tx instanceof transaction_1.Transaction, 'build() should return a Transaction');
26
+ assert_1.default.equal(tx.txData.inputs.length, 1, 'should have 1 input');
27
+ assert_1.default.equal(tx.txData.outputs.length, 1, 'should have 1 output');
28
+ assert_1.default.equal(tx.txData.outputs[0].amount, '99998000');
29
+ // Step 2: Sign
30
+ tx.sign(PRV_KEY_BUF);
31
+ const sigs = tx.signature;
32
+ assert_1.default.ok(sigs.length > 0, 'should have signatures after signing');
33
+ assert_1.default.ok(sigs[0].length > 0, 'signature should be non-empty');
34
+ // Step 3: Verify signature with public key
35
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
36
+ assert_1.default.ok(tx.verifySignature(pubKey, 0), 'signature should verify against correct pubkey');
37
+ // Step 4: Serialize to broadcast format
38
+ const broadcastPayload = tx.toBroadcastFormat();
39
+ assert_1.default.ok(broadcastPayload, 'toBroadcastFormat should return a non-empty string');
40
+ assert_1.default.doesNotThrow(() => JSON.parse(broadcastPayload), 'broadcast format should be valid JSON');
41
+ // Step 5: Serialize to hex
42
+ const hex = tx.toHex();
43
+ assert_1.default.ok(/^[0-9a-fA-F]+$/.test(hex), 'toHex should return valid hex');
44
+ // Step 6: Deserialize and verify round-trip
45
+ const reloaded = transaction_1.Transaction.fromHex(coinConfig.name, hex);
46
+ assert_1.default.deepEqual(reloaded.txData.inputs, tx.txData.inputs);
47
+ assert_1.default.deepEqual(reloaded.txData.outputs, tx.txData.outputs);
48
+ assert_1.default.equal(reloaded.txData.fee, tx.txData.fee);
49
+ // Step 7: Explain the transaction
50
+ const explanation = tx.explainTransaction();
51
+ assert_1.default.ok(explanation.outputs.length > 0, 'explanation should have outputs');
52
+ assert_1.default.equal(explanation.outputs[0].amount, '99998000');
53
+ assert_1.default.ok(explanation.fee, 'explanation should have fee');
54
+ });
55
+ it('should NOT be considered fully signed when unsigned', async function () {
56
+ const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
57
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
58
+ const tx = (await builder.build());
59
+ const sigs = tx.signature;
60
+ assert_1.default.ok(sigs.every((s) => s === ''), 'unsigned transaction should have empty signature scripts');
61
+ const payload = tx.toBroadcastFormat();
62
+ const parsed = JSON.parse(payload);
63
+ assert_1.default.ok(!parsed.inputs[0].signatureScript, 'inputs should not have signatureScript when unsigned');
64
+ });
65
+ it('should sign multiple inputs independently', async function () {
66
+ const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
67
+ builder.addInputs([kaspa_fixtures_1.UTXOS.simple, kaspa_fixtures_1.UTXOS.second]).to(kaspa_fixtures_1.ADDRESSES.recipient, '299998000').fee('2000');
68
+ const tx = (await builder.build());
69
+ tx.sign(PRV_KEY_BUF);
70
+ const pubKey = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
71
+ assert_1.default.equal(tx.txData.inputs.length, 2);
72
+ assert_1.default.ok(tx.verifySignature(pubKey, 0), 'first input signature should verify');
73
+ assert_1.default.ok(tx.verifySignature(pubKey, 1), 'second input signature should verify');
74
+ });
75
+ it('should rebuild from serialized hex and produce identical broadcast format', async function () {
76
+ const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
77
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
78
+ const tx = (await builder.build());
79
+ tx.sign(PRV_KEY_BUF);
80
+ const originalHex = tx.toHex();
81
+ const originalPayload = tx.toBroadcastFormat();
82
+ const rebuilt = transaction_1.Transaction.fromHex(coinConfig.name, originalHex);
83
+ const rebuiltPayload = rebuilt.toBroadcastFormat();
84
+ assert_1.default.equal(rebuiltPayload, originalPayload, 'serialization should be deterministic');
85
+ });
86
+ it('should produce a valid RPC-submittable JSON broadcast payload', async function () {
87
+ const builder = new transactionBuilder_1.TransactionBuilder(coinConfig);
88
+ builder.addInput(kaspa_fixtures_1.UTXOS.simple).to(kaspa_fixtures_1.ADDRESSES.recipient, '99998000').fee('2000');
89
+ const tx = (await builder.build());
90
+ tx.sign(PRV_KEY_BUF);
91
+ const payload = tx.toBroadcastFormat();
92
+ assert_1.default.ok(payload.length > 0, 'payload must be non-empty');
93
+ const parsed = JSON.parse(payload);
94
+ assert_1.default.ok(parsed.version !== undefined, 'must have version');
95
+ assert_1.default.ok(Array.isArray(parsed.inputs), 'must have inputs array');
96
+ assert_1.default.ok(Array.isArray(parsed.outputs), 'must have outputs array');
97
+ assert_1.default.ok(parsed.inputs.length > 0, 'must have at least one input');
98
+ assert_1.default.ok(parsed.outputs.length > 0, 'must have at least one output');
99
+ for (const input of parsed.inputs) {
100
+ assert_1.default.ok(input.signatureScript, 'signed input must have signatureScript');
101
+ assert_1.default.equal(input.signatureScript.length, 130, 'Schnorr sig should be 65 bytes = 130 hex chars');
102
+ }
103
+ });
104
+ });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25GbG93LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25GbG93LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7OztBQUVILG9EQUE0QjtBQUM1QixpREFBNEM7QUFDNUMseUVBQXNFO0FBQ3RFLDJEQUF3RDtBQUN4RCwrREFBb0U7QUFFcEUsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRWpELFFBQVEsQ0FBQyxxQ0FBcUMsRUFBRTtJQUM5QyxFQUFFLENBQUMsNkVBQTZFLEVBQUUsS0FBSztRQUNyRixnQkFBZ0I7UUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSx1Q0FBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxPQUFPLENBQUMsUUFBUSxDQUFDLHNCQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLDBCQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ2xELGdCQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSx5QkFBVyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFDNUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFD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TSxFQUFFLENBQUM7WUFDbEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzNFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBLYXNwYSBFbmQtdG8tRW5kIFRyYW5zYWN0aW9uIEZsb3dcbiAqXG4gKiBDb3ZlcnM6IGJ1aWxkIOKGkiBzaWduIOKGkiBzZXJpYWxpemUg4oaSIGRlc2VyaWFsaXplIOKGkiB2ZXJpZnlcbiAqIEFsbCBvcGVyYXRpb25zIGFyZSBvZmZsaW5lIChubyBsaXZlIFJQQyBjYWxscykuXG4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLRVlTLCBBRERSRVNTRVMsIFVUWE9TIH0gZnJvbSAnLi4vZml4dHVyZXMva2FzcGEuZml4dHVyZXMnO1xuXG5jb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCdrYXNwYScpO1xuY29uc3QgUFJWX0tFWV9CVUYgPSBCdWZmZXIuZnJvbShLRVlTLnBydiwgJ2hleCcpO1xuXG5kZXNjcmliZSgnS2FzcGEg4oCUIEVuZC10by1FbmQgVHJhbnNhY3Rpb24gRmxvdycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCwgc2lnbiwgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSwgYW5kIHZlcmlmeSBhIHNpbXBsZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdGVwIDE6IEJ1aWxkXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuXG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBhc3NlcnQub2sodHggaW5zdGFuY2VvZiBUcmFuc2FjdGlvbiwgJ2J1aWxkKCkgc2hvdWxkIHJldHVybiBhIFRyYW5zYWN0aW9uJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHMubGVuZ3RoLCAxLCAnc2hvdWxkIGhhdmUgMSBpbnB1dCcpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0cy5sZW5ndGgsIDEsICdzaG91bGQgaGF2ZSAxIG91dHB1dCcpO1xuICAgIGFzc2VydC5lcXVhbCh0eC50eERhdGEub3V0cHV0c1swXS5hbW91bnQsICc5OTk5ODAwMCcpO1xuXG4gICAgLy8gU3RlcCAyOiBTaWduXG4gICAgdHguc2lnbihQUlZfS0VZX0JVRik7XG4gICAgY29uc3Qgc2lncyA9IHR4LnNpZ25hdHVyZTtcbiAgICBhc3NlcnQub2soc2lncy5sZW5ndGggPiAwLCAnc2hvdWxkIGhhdmUgc2lnbmF0dXJlcyBhZnRlciBzaWduaW5nJyk7XG4gICAgYXNzZXJ0Lm9rKHNpZ3NbMF0ubGVuZ3RoID4gMCwgJ3NpZ25hdHVyZSBzaG91bGQgYmUgbm9uLWVtcHR5Jyk7XG5cbiAgICAvLyBTdGVwIDM6IFZlcmlmeSBzaWduYXR1cmUgd2l0aCBwdWJsaWMga2V5XG4gICAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksICdzaWduYXR1cmUgc2hvdWxkIHZlcmlmeSBhZ2FpbnN0IGNvcnJlY3QgcHVia2V5Jyk7XG5cbiAgICAvLyBTdGVwIDQ6IFNlcmlhbGl6ZSB0byBicm9hZGNhc3QgZm9ybWF0XG4gICAgY29uc3QgYnJvYWRjYXN0UGF5bG9hZCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgYXNzZXJ0Lm9rKGJyb2FkY2FzdFBheWxvYWQsICd0b0Jyb2FkY2FzdEZvcm1hdCBzaG91bGQgcmV0dXJuIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gSlNPTi5wYXJzZShicm9hZGNhc3RQYXlsb2FkKSwgJ2Jyb2FkY2FzdCBmb3JtYXQgc2hvdWxkIGJlIHZhbGlkIEpTT04nKTtcblxuICAgIC8vIFN0ZXAgNTogU2VyaWFsaXplIHRvIGhleFxuICAgIGNvbnN0IGhleCA9IHR4LnRvSGV4KCk7XG4gICAgYXNzZXJ0Lm9rKC9eWzAtOWEtZkEtRl0rJC8udGVzdChoZXgpLCAndG9IZXggc2hvdWxkIHJldHVybiB2YWxpZCBoZXgnKTtcblxuICAgIC8vIFN0ZXAgNjogRGVzZXJpYWxpemUgYW5kIHZlcmlmeSByb3VuZC10cmlwXG4gICAgY29uc3QgcmVsb2FkZWQgPSBUcmFuc2FjdGlvbi5mcm9tSGV4KGNvaW5Db25maWcubmFtZSwgaGV4KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHJlbG9hZGVkLnR4RGF0YS5pbnB1dHMsIHR4LnR4RGF0YS5pbnB1dHMpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwocmVsb2FkZWQudHhEYXRhLm91dHB1dHMsIHR4LnR4RGF0YS5vdXRwdXRzKTtcbiAgICBhc3NlcnQuZXF1YWwocmVsb2FkZWQudHhEYXRhLmZlZSwgdHgudHhEYXRhLmZlZSk7XG5cbiAgICAvLyBTdGVwIDc6IEV4cGxhaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICBhc3NlcnQub2soZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggPiAwLCAnZXhwbGFuYXRpb24gc2hvdWxkIGhhdmUgb3V0cHV0cycpO1xuICAgIGFzc2VydC5lcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFtb3VudCwgJzk5OTk4MDAwJyk7XG4gICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLmZlZSwgJ2V4cGxhbmF0aW9uIHNob3VsZCBoYXZlIGZlZScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIE5PVCBiZSBjb25zaWRlcmVkIGZ1bGx5IHNpZ25lZCB3aGVuIHVuc2lnbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5Db25maWcpO1xuICAgIGJ1aWxkZXIuYWRkSW5wdXQoVVRYT1Muc2ltcGxlKS50byhBRERSRVNTRVMucmVjaXBpZW50LCAnOTk5OTgwMDAnKS5mZWUoJzIwMDAnKTtcblxuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgc2lncyA9IHR4LnNpZ25hdHVyZTtcblxuICAgIGFzc2VydC5vayhcbiAgICAgIHNpZ3MuZXZlcnkoKHMpID0+IHMgPT09ICcnKSxcbiAgICAgICd1bnNpZ25lZCB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBlbXB0eSBzaWduYXR1cmUgc2NyaXB0cydcbiAgICApO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcbiAgICBhc3NlcnQub2soIXBhcnNlZC5pbnB1dHNbMF0uc2lnbmF0dXJlU2NyaXB0LCAnaW5wdXRzIHNob3VsZCBub3QgaGF2ZSBzaWduYXR1cmVTY3JpcHQgd2hlbiB1bnNpZ25lZCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNpZ24gbXVsdGlwbGUgaW5wdXRzIGluZGVwZW5kZW50bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dHMoW1VUWE9TLnNpbXBsZSwgVVRYT1Muc2Vjb25kXSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzI5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuXG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICB0eC5zaWduKFBSVl9LRVlfQlVGKTtcblxuICAgIGNvbnN0IHB1YktleSA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgYXNzZXJ0LmVxdWFsKHR4LnR4RGF0YS5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICBhc3NlcnQub2sodHgudmVyaWZ5U2lnbmF0dXJlKHB1YktleSwgMCksICdmaXJzdCBpbnB1dCBzaWduYXR1cmUgc2hvdWxkIHZlcmlmeScpO1xuICAgIGFzc2VydC5vayh0eC52ZXJpZnlTaWduYXR1cmUocHViS2V5LCAxKSwgJ3NlY29uZCBpbnB1dCBzaWduYXR1cmUgc2hvdWxkIHZlcmlmeScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlYnVpbGQgZnJvbSBzZXJpYWxpemVkIGhleCBhbmQgcHJvZHVjZSBpZGVudGljYWwgYnJvYWRjYXN0IGZvcm1hdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2luQ29uZmlnKTtcbiAgICBidWlsZGVyLmFkZElucHV0KFVUWE9TLnNpbXBsZSkudG8oQUREUkVTU0VTLnJlY2lwaWVudCwgJzk5OTk4MDAwJykuZmVlKCcyMDAwJyk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICB0eC5zaWduKFBSVl9LRVlfQlVGKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsSGV4ID0gdHgudG9IZXgoKTtcbiAgICBjb25zdCBvcmlnaW5hbFBheWxvYWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgcmVidWlsdCA9IFRyYW5zYWN0aW9uLmZyb21IZXgoY29pbkNvbmZpZy5uYW1lLCBvcmlnaW5hbEhleCk7XG4gICAgY29uc3QgcmVidWlsdFBheWxvYWQgPSByZWJ1aWx0LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICBhc3NlcnQuZXF1YWwocmVidWlsdFBheWxvYWQsIG9yaWdpbmFsUGF5bG9hZCwgJ3NlcmlhbGl6YXRpb24gc2hvdWxkIGJlIGRldGVybWluaXN0aWMnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcm9kdWNlIGEgdmFsaWQgUlBDLXN1Ym1pdHRhYmxlIEpTT04gYnJvYWRjYXN0IHBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5hZGRJbnB1dChVVFhPUy5zaW1wbGUpLnRvKEFERFJFU1NFUy5yZWNpcGllbnQsICc5OTk5ODAwMCcpLmZlZSgnMjAwMCcpO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgdHguc2lnbihQUlZfS0VZX0JVRik7XG5cbiAgICBjb25zdCBwYXlsb2FkID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGFzc2VydC5vayhwYXlsb2FkLmxlbmd0aCA+IDAsICdwYXlsb2FkIG11c3QgYmUgbm9uLWVtcHR5Jyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcblxuICAgIGFzc2VydC5vayhwYXJzZWQudmVyc2lvbiAhPT0gdW5kZWZpbmVkLCAnbXVzdCBoYXZlIHZlcnNpb24nKTtcbiAgICBhc3NlcnQub2soQXJyYXkuaXNBcnJheShwYXJzZWQuaW5wdXRzKSwgJ211c3QgaGF2ZSBpbnB1dHMgYXJyYXknKTtcbiAgICBhc3NlcnQub2soQXJyYXkuaXNBcnJheShwYXJzZWQub3V0cHV0cyksICdtdXN0IGhhdmUgb3V0cHV0cyBhcnJheScpO1xuICAgIGFzc2VydC5vayhwYXJzZWQuaW5wdXRzLmxlbmd0aCA+IDAsICdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGlucHV0Jyk7XG4gICAgYXNzZXJ0Lm9rKHBhcnNlZC5vdXRwdXRzLmxlbmd0aCA+IDAsICdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG91dHB1dCcpO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBwYXJzZWQuaW5wdXRzKSB7XG4gICAgICBhc3NlcnQub2soaW5wdXQuc2lnbmF0dXJlU2NyaXB0LCAnc2lnbmVkIGlucHV0IG11c3QgaGF2ZSBzaWduYXR1cmVTY3JpcHQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChpbnB1dC5zaWduYXR1cmVTY3JpcHQubGVuZ3RoLCAxMzAsICdTY2hub3JyIHNpZyBzaG91bGQgYmUgNjUgYnl0ZXMgPSAxMzAgaGV4IGNoYXJzJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,159 @@
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 utils_1 = require("../../src/lib/utils");
8
+ const keyPair_1 = require("../../src/lib/keyPair");
9
+ const kaspa_fixtures_1 = require("../fixtures/kaspa.fixtures");
10
+ describe('Kaspa Utils', function () {
11
+ describe('isValidKaspaAddress', function () {
12
+ it('should accept a valid mainnet address', function () {
13
+ assert_1.default.ok((0, utils_1.isValidKaspaAddress)(kaspa_fixtures_1.ADDRESSES.valid));
14
+ });
15
+ it('should accept a valid testnet address', function () {
16
+ assert_1.default.ok((0, utils_1.isValidKaspaAddress)(kaspa_fixtures_1.ADDRESSES.testnet));
17
+ });
18
+ it('should reject an empty string', function () {
19
+ assert_1.default.equal((0, utils_1.isValidKaspaAddress)(''), false);
20
+ });
21
+ it('should reject a non-kaspa address format', function () {
22
+ assert_1.default.equal((0, utils_1.isValidKaspaAddress)('bitcoin:qp9dksrqz9'), false);
23
+ });
24
+ it('should reject a plain invalid string', function () {
25
+ assert_1.default.equal((0, utils_1.isValidKaspaAddress)('notanaddress'), false);
26
+ });
27
+ it('should reject null-like input', function () {
28
+ assert_1.default.equal((0, utils_1.isValidKaspaAddress)(null), false);
29
+ });
30
+ });
31
+ describe('isValidMainnetAddress', function () {
32
+ it('should accept a valid mainnet address', function () {
33
+ assert_1.default.ok((0, utils_1.isValidMainnetAddress)(kaspa_fixtures_1.ADDRESSES.valid));
34
+ });
35
+ it('should reject a testnet address', function () {
36
+ assert_1.default.equal((0, utils_1.isValidMainnetAddress)(kaspa_fixtures_1.ADDRESSES.testnet), false);
37
+ });
38
+ it('should reject an empty string', function () {
39
+ assert_1.default.equal((0, utils_1.isValidMainnetAddress)(''), false);
40
+ });
41
+ });
42
+ describe('isValidTestnetAddress', function () {
43
+ it('should accept a valid testnet address', function () {
44
+ assert_1.default.ok((0, utils_1.isValidTestnetAddress)(kaspa_fixtures_1.ADDRESSES.testnet));
45
+ });
46
+ it('should reject a mainnet address', function () {
47
+ assert_1.default.equal((0, utils_1.isValidTestnetAddress)(kaspa_fixtures_1.ADDRESSES.valid), false);
48
+ });
49
+ it('should reject an empty string', function () {
50
+ assert_1.default.equal((0, utils_1.isValidTestnetAddress)(''), false);
51
+ });
52
+ });
53
+ describe('pubKeyToKaspaAddress', function () {
54
+ it('should derive a valid mainnet address from compressed public key', function () {
55
+ const pubKeyBuffer = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
56
+ const address = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspa');
57
+ assert_1.default.ok(address.startsWith('kaspa:'));
58
+ assert_1.default.ok((0, utils_1.isValidKaspaAddress)(address));
59
+ });
60
+ it('should derive a valid testnet address from compressed public key', function () {
61
+ const pubKeyBuffer = Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex');
62
+ const address = (0, utils_1.pubKeyToKaspaAddress)(pubKeyBuffer, 'kaspatest');
63
+ assert_1.default.ok(address.startsWith('kaspatest:'));
64
+ assert_1.default.ok((0, utils_1.isValidKaspaAddress)(address));
65
+ });
66
+ it('should accept hex string public key', function () {
67
+ const address = (0, utils_1.pubKeyToKaspaAddress)(kaspa_fixtures_1.KEYS.pub, 'kaspa');
68
+ assert_1.default.ok(address.startsWith('kaspa:'));
69
+ });
70
+ it('should throw for non-33-byte public key', function () {
71
+ assert_1.default.throws(() => {
72
+ (0, utils_1.pubKeyToKaspaAddress)(Buffer.from('0102030405', 'hex'), 'kaspa');
73
+ });
74
+ });
75
+ it('should produce same address as KeyPair.getAddress', function () {
76
+ const kp = new keyPair_1.KeyPair({ pub: kaspa_fixtures_1.KEYS.pub });
77
+ const fromKp = kp.getAddress('mainnet');
78
+ const fromUtil = (0, utils_1.pubKeyToKaspaAddress)(Buffer.from(kaspa_fixtures_1.KEYS.pub, 'hex'), 'kaspa');
79
+ assert_1.default.equal(fromUtil, fromKp);
80
+ });
81
+ });
82
+ describe('isValidPublicKey', function () {
83
+ it('should accept a valid compressed 33-byte public key', function () {
84
+ assert_1.default.ok((0, utils_1.isValidPublicKey)(kaspa_fixtures_1.KEYS.pub));
85
+ });
86
+ it('should reject an empty string', function () {
87
+ assert_1.default.equal((0, utils_1.isValidPublicKey)(''), false);
88
+ });
89
+ it('should reject a string that is not hex', function () {
90
+ assert_1.default.equal((0, utils_1.isValidPublicKey)('not_a_key'), false);
91
+ });
92
+ it('should reject incorrect key length', function () {
93
+ assert_1.default.equal((0, utils_1.isValidPublicKey)('0102030405'), false);
94
+ });
95
+ it('should accept uncompressed 65-byte public key', function () {
96
+ const fakeUncompressed = '04' + 'ab'.repeat(64);
97
+ assert_1.default.ok((0, utils_1.isValidPublicKey)(fakeUncompressed));
98
+ });
99
+ it('should reject a null-like value', function () {
100
+ assert_1.default.equal((0, utils_1.isValidPublicKey)(null), false);
101
+ });
102
+ });
103
+ describe('isValidPrivateKey', function () {
104
+ it('should accept a valid 32-byte hex private key', function () {
105
+ assert_1.default.ok((0, utils_1.isValidPrivateKey)(kaspa_fixtures_1.KEYS.prv));
106
+ });
107
+ it('should reject an empty string', function () {
108
+ assert_1.default.equal((0, utils_1.isValidPrivateKey)(''), false);
109
+ });
110
+ it('should reject a non-hex string', function () {
111
+ assert_1.default.equal((0, utils_1.isValidPrivateKey)('not_a_key'), false);
112
+ });
113
+ it('should reject null-like value', function () {
114
+ assert_1.default.equal((0, utils_1.isValidPrivateKey)(null), false);
115
+ });
116
+ });
117
+ describe('isValidTransactionId', function () {
118
+ it('should accept a valid 64-char hex transaction ID', function () {
119
+ assert_1.default.ok((0, utils_1.isValidTransactionId)(kaspa_fixtures_1.UTXOS.simple.transactionId));
120
+ });
121
+ it('should reject short hex strings', function () {
122
+ assert_1.default.equal((0, utils_1.isValidTransactionId)('abcdef1234'), false);
123
+ });
124
+ it('should reject non-hex strings', function () {
125
+ assert_1.default.equal((0, utils_1.isValidTransactionId)('xyz' + 'a'.repeat(61)), false);
126
+ });
127
+ it('should reject empty string', function () {
128
+ assert_1.default.equal((0, utils_1.isValidTransactionId)(''), false);
129
+ });
130
+ });
131
+ describe('Utils class', function () {
132
+ const utils = new utils_1.Utils();
133
+ it('isValidAddress should delegate to isValidKaspaAddress', function () {
134
+ assert_1.default.ok(utils.isValidAddress(kaspa_fixtures_1.ADDRESSES.valid));
135
+ assert_1.default.equal(utils.isValidAddress('invalid'), false);
136
+ });
137
+ it('isValidBlockId should accept 64-char hex', function () {
138
+ assert_1.default.ok(utils.isValidBlockId(kaspa_fixtures_1.UTXOS.simple.transactionId));
139
+ assert_1.default.equal(utils.isValidBlockId('short'), false);
140
+ });
141
+ it('isValidPrivateKey should accept valid key', function () {
142
+ assert_1.default.ok(utils.isValidPrivateKey(kaspa_fixtures_1.KEYS.prv));
143
+ });
144
+ it('isValidPublicKey should accept valid key', function () {
145
+ assert_1.default.ok(utils.isValidPublicKey(kaspa_fixtures_1.KEYS.pub));
146
+ });
147
+ it('isValidSignature should accept 128-char hex', function () {
148
+ const sig = 'ab'.repeat(64);
149
+ assert_1.default.ok(utils.isValidSignature(sig));
150
+ });
151
+ it('isValidSignature should reject short strings', function () {
152
+ assert_1.default.equal(utils.isValidSignature('abcd'), false);
153
+ });
154
+ it('isValidTransactionId should accept 64-char hex', function () {
155
+ assert_1.default.ok(utils.isValidTransactionId(kaspa_fixtures_1.UTXOS.simple.transactionId));
156
+ });
157
+ });
158
+ });
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlscy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLCtDQVM2QjtBQUM3QixtREFBZ0Q7QUFDaEQsK0RBQW9FO0FBRXBFLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLHFCQUFxQixFQUFFO1FBQzlCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFBLDJCQUFtQixFQUFDLDBCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFBLDJCQUFtQixFQUFDLDBCQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtZQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1lBQzdDLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUEsMkJBQW1CLEVBQUMsb0JBQW9CLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFO1lBQ2xDLGdCQUFNLENBQUMsS0FBSyxDQUFD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QUFFLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLHNCQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtcbiAgaXNWYWxpZEthc3BhQWRkcmVzcyxcbiAgaXNWYWxpZE1haW5uZXRBZGRyZXNzLFxuICBpc1ZhbGlkVGVzdG5ldEFkZHJlc3MsXG4gIGlzVmFsaWRQdWJsaWNLZXksXG4gIGlzVmFsaWRQcml2YXRlS2V5LFxuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCxcbiAgcHViS2V5VG9LYXNwYUFkZHJlc3MsXG4gIFV0aWxzLFxufSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL2tleVBhaXInO1xuaW1wb3J0IHsgS0VZUywgQUREUkVTU0VTLCBVVFhPUyB9IGZyb20gJy4uL2ZpeHR1cmVzL2thc3BhLmZpeHR1cmVzJztcblxuZGVzY3JpYmUoJ0thc3BhIFV0aWxzJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnaXNWYWxpZEthc3BhQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIG1haW5uZXQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkS2FzcGFBZGRyZXNzKEFERFJFU1NFUy52YWxpZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSB2YWxpZCB0ZXN0bmV0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZEthc3BhQWRkcmVzcyhBRERSRVNTRVMudGVzdG5ldCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRLYXNwYUFkZHJlc3MoJycpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG5vbi1rYXNwYSBhZGRyZXNzIGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkS2FzcGFBZGRyZXNzKCdiaXRjb2luOnFwOWRrc3JxejknKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBwbGFpbiBpbnZhbGlkIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkS2FzcGFBZGRyZXNzKCdub3RhbmFkZHJlc3MnKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgbnVsbC1saWtlIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRLYXNwYUFkZHJlc3MobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRNYWlubmV0QWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIG1haW5uZXQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkTWFpbm5ldEFkZHJlc3MoQUREUkVTU0VTLnZhbGlkKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHRlc3RuZXQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkTWFpbm5ldEFkZHJlc3MoQUREUkVTU0VTLnRlc3RuZXQpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZE1haW5uZXRBZGRyZXNzKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFRlc3RuZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgdGVzdG5ldCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGlzVmFsaWRUZXN0bmV0QWRkcmVzcyhBRERSRVNTRVMudGVzdG5ldCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBtYWlubmV0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFRlc3RuZXRBZGRyZXNzKEFERFJFU1NFUy52YWxpZCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkVGVzdG5ldEFkZHJlc3MoJycpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwdWJLZXlUb0thc3BhQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGRlcml2ZSBhIHZhbGlkIG1haW5uZXQgYWRkcmVzcyBmcm9tIGNvbXByZXNzZWQgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4Jyk7XG4gICAgICBjb25zdCBhZGRyZXNzID0gcHViS2V5VG9LYXNwYUFkZHJlc3MocHViS2V5QnVmZmVyLCAna2FzcGEnKTtcbiAgICAgIGFzc2VydC5vayhhZGRyZXNzLnN0YXJ0c1dpdGgoJ2thc3BhOicpKTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVyaXZlIGEgdmFsaWQgdGVzdG5ldCBhZGRyZXNzIGZyb20gY29tcHJlc3NlZCBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHViS2V5QnVmZmVyID0gQnVmZmVyLmZyb20oS0VZUy5wdWIsICdoZXgnKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBwdWJLZXlUb0thc3BhQWRkcmVzcyhwdWJLZXlCdWZmZXIsICdrYXNwYXRlc3QnKTtcbiAgICAgIGFzc2VydC5vayhhZGRyZXNzLnN0YXJ0c1dpdGgoJ2thc3BhdGVzdDonKSk7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBoZXggc3RyaW5nIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gcHViS2V5VG9LYXNwYUFkZHJlc3MoS0VZUy5wdWIsICdrYXNwYScpO1xuICAgICAgYXNzZXJ0Lm9rKGFkZHJlc3Muc3RhcnRzV2l0aCgna2FzcGE6JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3Igbm9uLTMzLWJ5dGUgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBwdWJLZXlUb0thc3BhQWRkcmVzcyhCdWZmZXIuZnJvbSgnMDEwMjAzMDQwNScsICdoZXgnKSwgJ2thc3BhJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBzYW1lIGFkZHJlc3MgYXMgS2V5UGFpci5nZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHB1YjogS0VZUy5wdWIgfSk7XG4gICAgICBjb25zdCBmcm9tS3AgPSBrcC5nZXRBZGRyZXNzKCdtYWlubmV0Jyk7XG4gICAgICBjb25zdCBmcm9tVXRpbCA9IHB1YktleVRvS2FzcGFBZGRyZXNzKEJ1ZmZlci5mcm9tKEtFWVMucHViLCAnaGV4JyksICdrYXNwYScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGZyb21VdGlsLCBmcm9tS3ApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIGNvbXByZXNzZWQgMzMtYnl0ZSBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGlzVmFsaWRQdWJsaWNLZXkoS0VZUy5wdWIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHVibGljS2V5KCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBzdHJpbmcgdGhhdCBpcyBub3QgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRQdWJsaWNLZXkoJ25vdF9hX2tleScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbmNvcnJlY3Qga2V5IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHVibGljS2V5KCcwMTAyMDMwNDA1JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHVuY29tcHJlc3NlZCA2NS1ieXRlIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWtlVW5jb21wcmVzc2VkID0gJzA0JyArICdhYicucmVwZWF0KDY0KTtcbiAgICAgIGFzc2VydC5vayhpc1ZhbGlkUHVibGljS2V5KGZha2VVbmNvbXByZXNzZWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbnVsbC1saWtlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRQdWJsaWNLZXkobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQcml2YXRlS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgMzItYnl0ZSBoZXggcHJpdmF0ZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZFByaXZhdGVLZXkoS0VZUy5wcnYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkUHJpdmF0ZUtleSgnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbm9uLWhleCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFByaXZhdGVLZXkoJ25vdF9hX2tleScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBudWxsLWxpa2UgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoaXNWYWxpZFByaXZhdGVLZXkobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRUcmFuc2FjdGlvbklkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgNjQtY2hhciBoZXggdHJhbnNhY3Rpb24gSUQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soaXNWYWxpZFRyYW5zYWN0aW9uSWQoVVRYT1Muc2ltcGxlLnRyYW5zYWN0aW9uSWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHNob3J0IGhleCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRUcmFuc2FjdGlvbklkKCdhYmNkZWYxMjM0JyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5vbi1oZXggc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChpc1ZhbGlkVHJhbnNhY3Rpb25JZCgneHl6JyArICdhJy5yZXBlYXQoNjEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGlzVmFsaWRUcmFuc2FjdGlvbklkKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVXRpbHMgY2xhc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuICAgIGl0KCdpc1ZhbGlkQWRkcmVzcyBzaG91bGQgZGVsZWdhdGUgdG8gaXNWYWxpZEthc3BhQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBRERSRVNTRVMudmFsaWQpKTtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcygnaW52YWxpZCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZEJsb2NrSWQgc2hvdWxkIGFjY2VwdCA2NC1jaGFyIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkQmxvY2tJZChVVFhPUy5zaW1wbGUudHJhbnNhY3Rpb25JZCkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKCdzaG9ydCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFByaXZhdGVLZXkgc2hvdWxkIGFjY2VwdCB2YWxpZCBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2sodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoS0VZUy5wcnYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpc1ZhbGlkUHVibGljS2V5IHNob3VsZCBhY2NlcHQgdmFsaWQga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoS0VZUy5wdWIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpc1ZhbGlkU2lnbmF0dXJlIHNob3VsZCBhY2NlcHQgMTI4LWNoYXIgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnID0gJ2FiJy5yZXBlYXQoNjQpO1xuICAgICAgYXNzZXJ0Lm9rKHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoc2lnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFNpZ25hdHVyZSBzaG91bGQgcmVqZWN0IHNob3J0IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwodXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnYWJjZCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXNWYWxpZFRyYW5zYWN0aW9uSWQgc2hvdWxkIGFjY2VwdCA2NC1jaGFyIGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayh1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZChVVFhPUy5zaW1wbGUudHJhbnNhY3Rpb25JZCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19