@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.
- 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,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 @@
|
|
|
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
|