@bitgo-beta/sdk-coin-tempo 1.0.1-beta.31 → 1.0.1-beta.310
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/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/constants.d.ts +21 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +25 -5
- package/dist/src/lib/index.d.ts +4 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -1
- package/dist/src/lib/keyPair.d.ts +5 -25
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -97
- package/dist/src/lib/tip20Abi.d.ts +98 -0
- package/dist/src/lib/tip20Abi.d.ts.map +1 -0
- package/dist/src/lib/tip20Abi.js +62 -0
- package/dist/src/lib/transaction.d.ts +144 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +216 -0
- package/dist/src/lib/transactionBuilder.d.ts +139 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +408 -0
- package/dist/src/lib/types.d.ts +27 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +3 -0
- package/dist/src/lib/utils.d.ts +70 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +148 -16
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/tempo.d.ts +95 -41
- package/dist/src/tempo.d.ts.map +1 -1
- package/dist/src/tempo.js +447 -76
- package/dist/src/tip20Token.d.ts +83 -0
- package/dist/src/tip20Token.d.ts.map +1 -0
- package/dist/src/tip20Token.js +202 -0
- package/dist/test/integration/tip20.d.ts +7 -0
- package/dist/test/integration/tip20.d.ts.map +1 -0
- package/dist/test/integration/tip20.js +178 -0
- package/dist/test/resources/tempo.d.ts +61 -0
- package/dist/test/resources/tempo.d.ts.map +1 -0
- package/dist/test/resources/tempo.js +79 -0
- package/dist/test/unit/index.js +172 -3
- package/dist/test/unit/tempo.d.ts +2 -0
- package/dist/test/unit/tempo.d.ts.map +1 -0
- package/dist/test/unit/tempo.js +207 -0
- package/dist/test/unit/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.js +858 -0
- package/dist/test/unit/utils.js +6 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -7
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test resources for Tempo SDK
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ERROR_MESSAGES = exports.MEMO_TEST_CASES = exports.SIGNATURE_TEST_DATA = exports.TX_PARAMS = exports.TEST_RECIPIENT_ADDRESS = exports.TESTNET_TOKENS = void 0;
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// TIP-20 Token Addresses (Tempo Testnet)
|
|
9
|
+
// ============================================================================
|
|
10
|
+
exports.TESTNET_TOKENS = {
|
|
11
|
+
pathUSD: {
|
|
12
|
+
address: '0x20c0000000000000000000000000000000000000',
|
|
13
|
+
name: 'ttempo:pathusd',
|
|
14
|
+
},
|
|
15
|
+
alphaUSD: {
|
|
16
|
+
address: '0x20c0000000000000000000000000000000000001',
|
|
17
|
+
name: 'ttempo:alphausd',
|
|
18
|
+
},
|
|
19
|
+
betaUSD: {
|
|
20
|
+
address: '0x20c0000000000000000000000000000000000002',
|
|
21
|
+
name: 'ttempo:betausd',
|
|
22
|
+
},
|
|
23
|
+
thetaUSD: {
|
|
24
|
+
address: '0x20c0000000000000000000000000000000000003',
|
|
25
|
+
name: 'ttempo:thetausd',
|
|
26
|
+
},
|
|
27
|
+
usd1: {
|
|
28
|
+
address: '0x20c00000000000000000000008bb598f4db17f78',
|
|
29
|
+
name: 'ttempo:usd1',
|
|
30
|
+
},
|
|
31
|
+
stgUSD1: {
|
|
32
|
+
address: '0x20c000000000000000000000e4662b69291ab60a',
|
|
33
|
+
name: 'ttempo:stgusd1',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
// Valid checksummed test recipient address
|
|
37
|
+
exports.TEST_RECIPIENT_ADDRESS = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Transaction Parameters
|
|
40
|
+
// ============================================================================
|
|
41
|
+
exports.TX_PARAMS = {
|
|
42
|
+
defaultGas: BigInt('100000'),
|
|
43
|
+
defaultMaxFeePerGas: BigInt('2000000000'),
|
|
44
|
+
defaultMaxPriorityFeePerGas: BigInt('1000000000'),
|
|
45
|
+
};
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Signature Test Data
|
|
48
|
+
// ============================================================================
|
|
49
|
+
exports.SIGNATURE_TEST_DATA = {
|
|
50
|
+
validSignature: {
|
|
51
|
+
r: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
|
|
52
|
+
s: '0xfedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321',
|
|
53
|
+
yParity: 0,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Memo Test Cases
|
|
58
|
+
// ============================================================================
|
|
59
|
+
exports.MEMO_TEST_CASES = {
|
|
60
|
+
valid: [
|
|
61
|
+
{ input: '12345', description: 'numeric' },
|
|
62
|
+
{ input: 'INV-001', description: 'alphanumeric with dash' },
|
|
63
|
+
{ input: 'a'.repeat(32), description: 'max length 32 bytes' },
|
|
64
|
+
{ input: '', description: 'empty string' },
|
|
65
|
+
],
|
|
66
|
+
invalid: [{ input: 'a'.repeat(33), description: '33 bytes - exceeds limit' }],
|
|
67
|
+
};
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// Error Messages
|
|
70
|
+
// ============================================================================
|
|
71
|
+
exports.ERROR_MESSAGES = {
|
|
72
|
+
noOperations: /At least one operation or raw call is required/,
|
|
73
|
+
missingNonce: /Nonce is required/,
|
|
74
|
+
missingGas: /Gas limit is required/,
|
|
75
|
+
missingMaxFeePerGas: /maxFeePerGas is required/,
|
|
76
|
+
missingMaxPriorityFeePerGas: /maxPriorityFeePerGas is required/,
|
|
77
|
+
invalidMemo: /Invalid memo/,
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3Jlc291cmNlcy90ZW1wby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQUVILCtFQUErRTtBQUMvRSx5Q0FBeUM7QUFDekMsK0VBQStFO0FBRWxFLFFBQUEsY0FBYyxHQUFHO0lBQzVCLE9BQU8sRUFBRTtRQUNQLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGdCQUFnQjtLQUN2QjtJQUNELFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGlCQUFpQjtLQUN4QjtJQUNELE9BQU8sRUFBRTtRQUNQLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGdCQUFnQjtLQUN2QjtJQUNELFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGlCQUFpQjtLQUN4QjtJQUNELElBQUksRUFBRTtRQUNKLE9BQU8sRUFBRSw0Q0FBNEM7UUFDckQsSUFBSSxFQUFFLGFBQWE7S0FDcEI7SUFDRCxPQUFPLEVBQUU7UUFDUCxPQUFPLEVBQUUsNENBQTRDO1FBQ3JELElBQUksRUFBRSxnQkFBZ0I7S0FDdkI7Q0FDRixDQUFDO0FBRUYsMkNBQTJDO0FBQzlCLFFBQUEsc0JBQXNCLEdBQUcsNENBQTRDLENBQUM7QUFFbkYsK0VBQStFO0FBQy9FLHlCQUF5QjtBQUN6QiwrRUFBK0U7QUFFbEUsUUFBQSxTQUFTLEdBQUc7SUFDdkIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDNUIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUN6QywyQkFBMkIsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDO0NBQ2xELENBQUM7QUFFRiwrRUFBK0U7QUFDL0Usc0JBQXNCO0FBQ3RCLCtFQUErRTtBQUVsRSxRQUFBLG1CQUFtQixHQUFHO0lBQ2pDLGNBQWMsRUFBRTtRQUNkLENBQUMsRUFBRSxvRUFBcUY7UUFDeEYsQ0FBQyxFQUFFLG9FQUFxRjtRQUN4RixPQUFPLEVBQUUsQ0FBQztLQUNYO0NBQ0YsQ0FBQztBQUVGLCtFQUErRTtBQUMvRSxrQkFBa0I7QUFDbEIsK0VBQStFO0FBRWxFLFFBQUEsZUFBZSxHQUFHO0lBQzdCLEtBQUssRUFBRTtRQUNMLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFO1FBQzFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7UUFDM0QsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUU7UUFDN0QsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7S0FDM0M7SUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSwwQkFBMEIsRUFBRSxDQUFDO0NBQzlFLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLCtFQUErRTtBQUVsRSxRQUFBLGNBQWMsR0FBRztJQUM1QixZQUFZLEVBQUUsZ0RBQWdEO0lBQzlELFlBQVksRUFBRSxtQkFBbUI7SUFDakMsVUFBVSxFQUFFLHVCQUF1QjtJQUNuQyxtQkFBbUIsRUFBRSwwQkFBMEI7SUFDL0MsMkJBQTJCLEVBQUUsa0NBQWtDO0lBQy9ELFdBQVcsRUFBRSxjQUFjO0NBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlc3QgcmVzb3VyY2VzIGZvciBUZW1wbyBTREtcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUSVAtMjAgVG9rZW4gQWRkcmVzc2VzIChUZW1wbyBUZXN0bmV0KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgVEVTVE5FVF9UT0tFTlMgPSB7XG4gIHBhdGhVU0Q6IHtcbiAgICBhZGRyZXNzOiAnMHgyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICBuYW1lOiAndHRlbXBvOnBhdGh1c2QnLFxuICB9LFxuICBhbHBoYVVTRDoge1xuICAgIGFkZHJlc3M6ICcweDIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLFxuICAgIG5hbWU6ICd0dGVtcG86YWxwaGF1c2QnLFxuICB9LFxuICBiZXRhVVNEOiB7XG4gICAgYWRkcmVzczogJzB4MjBjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMicsXG4gICAgbmFtZTogJ3R0ZW1wbzpiZXRhdXNkJyxcbiAgfSxcbiAgdGhldGFVU0Q6IHtcbiAgICBhZGRyZXNzOiAnMHgyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzJyxcbiAgICBuYW1lOiAndHRlbXBvOnRoZXRhdXNkJyxcbiAgfSxcbiAgdXNkMToge1xuICAgIGFkZHJlc3M6ICcweDIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4YmI1OThmNGRiMTdmNzgnLFxuICAgIG5hbWU6ICd0dGVtcG86dXNkMScsXG4gIH0sXG4gIHN0Z1VTRDE6IHtcbiAgICBhZGRyZXNzOiAnMHgyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDBlNDY2MmI2OTI5MWFiNjBhJyxcbiAgICBuYW1lOiAndHRlbXBvOnN0Z3VzZDEnLFxuICB9LFxufTtcblxuLy8gVmFsaWQgY2hlY2tzdW1tZWQgdGVzdCByZWNpcGllbnQgYWRkcmVzc1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVDSVBJRU5UX0FERFJFU1MgPSAnMHg3NDJkMzVDYzY2MzRDMDUzMjkyNWEzYjg0NEJjNDU0ZTQ0MzhmNDRlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHJhbnNhY3Rpb24gUGFyYW1ldGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgVFhfUEFSQU1TID0ge1xuICBkZWZhdWx0R2FzOiBCaWdJbnQoJzEwMDAwMCcpLFxuICBkZWZhdWx0TWF4RmVlUGVyR2FzOiBCaWdJbnQoJzIwMDAwMDAwMDAnKSxcbiAgZGVmYXVsdE1heFByaW9yaXR5RmVlUGVyR2FzOiBCaWdJbnQoJzEwMDAwMDAwMDAnKSxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNpZ25hdHVyZSBUZXN0IERhdGFcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFNJR05BVFVSRV9URVNUX0RBVEEgPSB7XG4gIHZhbGlkU2lnbmF0dXJlOiB7XG4gICAgcjogJzB4MTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZicgYXMgYDB4JHtzdHJpbmd9YCxcbiAgICBzOiAnMHhmZWRjYmEwOTg3NjU0MzIxZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzIxJyBhcyBgMHgke3N0cmluZ31gLFxuICAgIHlQYXJpdHk6IDAsXG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZW1vIFRlc3QgQ2FzZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IE1FTU9fVEVTVF9DQVNFUyA9IHtcbiAgdmFsaWQ6IFtcbiAgICB7IGlucHV0OiAnMTIzNDUnLCBkZXNjcmlwdGlvbjogJ251bWVyaWMnIH0sXG4gICAgeyBpbnB1dDogJ0lOVi0wMDEnLCBkZXNjcmlwdGlvbjogJ2FscGhhbnVtZXJpYyB3aXRoIGRhc2gnIH0sXG4gICAgeyBpbnB1dDogJ2EnLnJlcGVhdCgzMiksIGRlc2NyaXB0aW9uOiAnbWF4IGxlbmd0aCAzMiBieXRlcycgfSxcbiAgICB7IGlucHV0OiAnJywgZGVzY3JpcHRpb246ICdlbXB0eSBzdHJpbmcnIH0sXG4gIF0sXG4gIGludmFsaWQ6IFt7IGlucHV0OiAnYScucmVwZWF0KDMzKSwgZGVzY3JpcHRpb246ICczMyBieXRlcyAtIGV4Y2VlZHMgbGltaXQnIH1dLFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXJyb3IgTWVzc2FnZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IEVSUk9SX01FU1NBR0VTID0ge1xuICBub09wZXJhdGlvbnM6IC9BdCBsZWFzdCBvbmUgb3BlcmF0aW9uIG9yIHJhdyBjYWxsIGlzIHJlcXVpcmVkLyxcbiAgbWlzc2luZ05vbmNlOiAvTm9uY2UgaXMgcmVxdWlyZWQvLFxuICBtaXNzaW5nR2FzOiAvR2FzIGxpbWl0IGlzIHJlcXVpcmVkLyxcbiAgbWlzc2luZ01heEZlZVBlckdhczogL21heEZlZVBlckdhcyBpcyByZXF1aXJlZC8sXG4gIG1pc3NpbmdNYXhQcmlvcml0eUZlZVBlckdhczogL21heFByaW9yaXR5RmVlUGVyR2FzIGlzIHJlcXVpcmVkLyxcbiAgaW52YWxpZE1lbW86IC9JbnZhbGlkIG1lbW8vLFxufTtcbiJdfQ==
|
package/dist/test/unit/index.js
CHANGED
|
@@ -1,9 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
const tempo_1 = require("../../src/tempo");
|
|
4
37
|
const ttempo_1 = require("../../src/ttempo");
|
|
5
38
|
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
6
39
|
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
40
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
+
const should = __importStar(require("should"));
|
|
7
42
|
describe('Tempo Coin', function () {
|
|
8
43
|
let bitgo;
|
|
9
44
|
let basecoin;
|
|
@@ -34,7 +69,138 @@ describe('Tempo Coin', function () {
|
|
|
34
69
|
it('should return the correct coin name', function () {
|
|
35
70
|
basecoin.getChain().should.equal('tempo');
|
|
36
71
|
basecoin.getFullName().should.equal('Tempo');
|
|
37
|
-
basecoin.getBaseFactor().should.equal(
|
|
72
|
+
basecoin.getBaseFactor().should.equal(1e6);
|
|
73
|
+
});
|
|
74
|
+
describe('Address Validation', function () {
|
|
75
|
+
it('should validate plain EVM address', function () {
|
|
76
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f').should.equal(true);
|
|
77
|
+
basecoin.isValidAddress('0x0000000000000000000000000000000000000000').should.equal(true);
|
|
78
|
+
});
|
|
79
|
+
it('should validate address with memoId', function () {
|
|
80
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8').should.equal(true);
|
|
81
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=0').should.equal(true);
|
|
82
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=12345').should.equal(true);
|
|
83
|
+
});
|
|
84
|
+
it('should reject invalid addresses', function () {
|
|
85
|
+
basecoin.isValidAddress('invalid').should.equal(false);
|
|
86
|
+
basecoin.isValidAddress('').should.equal(false);
|
|
87
|
+
basecoin.isValidAddress('0x123').should.equal(false); // Too short
|
|
88
|
+
});
|
|
89
|
+
it('should reject address with invalid memoId', function () {
|
|
90
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=abc').should.equal(false);
|
|
91
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=-1').should.equal(false);
|
|
92
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1.5').should.equal(false);
|
|
93
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=01').should.equal(false); // Leading zero
|
|
94
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=').should.equal(false); // Empty memoId
|
|
95
|
+
});
|
|
96
|
+
it('should reject address with unknown query parameters', function () {
|
|
97
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?invalid=123').should.equal(false);
|
|
98
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?foo=bar').should.equal(false);
|
|
99
|
+
});
|
|
100
|
+
it('should reject address with multiple memoId parameters', function () {
|
|
101
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&memoId=2').should.equal(false);
|
|
102
|
+
});
|
|
103
|
+
it('should reject address with extra query parameters besides memoId', function () {
|
|
104
|
+
basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&foo=bar').should.equal(false);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('getAddressDetails', function () {
|
|
108
|
+
it('should get address details without memoId', function () {
|
|
109
|
+
const addressDetails = basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f');
|
|
110
|
+
addressDetails.address.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
|
|
111
|
+
addressDetails.baseAddress.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
|
|
112
|
+
should.not.exist(addressDetails.memoId);
|
|
113
|
+
});
|
|
114
|
+
it('should get address details with memoId', function () {
|
|
115
|
+
const addressDetails = basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8');
|
|
116
|
+
addressDetails.address.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8');
|
|
117
|
+
addressDetails.baseAddress.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
|
|
118
|
+
addressDetails.memoId.should.equal('8');
|
|
119
|
+
});
|
|
120
|
+
it('should throw on invalid memoId address', function () {
|
|
121
|
+
(() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=abc')).should.throw(sdk_core_1.InvalidMemoIdError);
|
|
122
|
+
});
|
|
123
|
+
it('should throw on multiple memoId address', function () {
|
|
124
|
+
(() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&memoId=2')).should.throw(sdk_core_1.InvalidAddressError);
|
|
125
|
+
});
|
|
126
|
+
it('should throw on unknown query parameters', function () {
|
|
127
|
+
(() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?invalid=8')).should.throw(sdk_core_1.InvalidAddressError);
|
|
128
|
+
});
|
|
129
|
+
it('should throw on empty memoId', function () {
|
|
130
|
+
(() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=')).should.throw(sdk_core_1.InvalidAddressError);
|
|
131
|
+
});
|
|
132
|
+
it('should throw on extra query parameters besides memoId', function () {
|
|
133
|
+
(() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&foo=bar')).should.throw(sdk_core_1.InvalidAddressError);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('isValidMemoId', function () {
|
|
137
|
+
it('should validate correct memoIds', function () {
|
|
138
|
+
basecoin.isValidMemoId('0').should.equal(true);
|
|
139
|
+
basecoin.isValidMemoId('1').should.equal(true);
|
|
140
|
+
basecoin.isValidMemoId('12345').should.equal(true);
|
|
141
|
+
basecoin.isValidMemoId('999999999999').should.equal(true);
|
|
142
|
+
});
|
|
143
|
+
it('should reject invalid memoIds', function () {
|
|
144
|
+
basecoin.isValidMemoId('').should.equal(false);
|
|
145
|
+
basecoin.isValidMemoId('-1').should.equal(false);
|
|
146
|
+
basecoin.isValidMemoId('1.5').should.equal(false);
|
|
147
|
+
basecoin.isValidMemoId('abc').should.equal(false);
|
|
148
|
+
basecoin.isValidMemoId('01').should.equal(false); // Leading zero
|
|
149
|
+
basecoin.isValidMemoId('00').should.equal(false);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe('isWalletAddress', function () {
|
|
153
|
+
const baseAddress = '0x2476602c78e9a5e0563320c78878faa3952b256f';
|
|
154
|
+
it('should verify a plain address matching the base address', async function () {
|
|
155
|
+
const result = await basecoin.isWalletAddress({
|
|
156
|
+
address: baseAddress,
|
|
157
|
+
baseAddress,
|
|
158
|
+
coinSpecific: {},
|
|
159
|
+
});
|
|
160
|
+
result.should.equal(true);
|
|
161
|
+
});
|
|
162
|
+
it('should verify a memoId address whose base matches the wallet base address', async function () {
|
|
163
|
+
const result = await basecoin.isWalletAddress({
|
|
164
|
+
address: `${baseAddress}?memoId=8`,
|
|
165
|
+
baseAddress,
|
|
166
|
+
coinSpecific: {},
|
|
167
|
+
});
|
|
168
|
+
result.should.equal(true);
|
|
169
|
+
});
|
|
170
|
+
it('should verify using rootAddress when baseAddress is not provided', async function () {
|
|
171
|
+
const result = await basecoin.isWalletAddress({
|
|
172
|
+
address: `${baseAddress}?memoId=42`,
|
|
173
|
+
rootAddress: baseAddress,
|
|
174
|
+
coinSpecific: {},
|
|
175
|
+
});
|
|
176
|
+
result.should.equal(true);
|
|
177
|
+
});
|
|
178
|
+
it('should reject address with mismatched base address', async function () {
|
|
179
|
+
await basecoin
|
|
180
|
+
.isWalletAddress({
|
|
181
|
+
address: '0x0000000000000000000000000000000000000001?memoId=8',
|
|
182
|
+
baseAddress,
|
|
183
|
+
coinSpecific: {},
|
|
184
|
+
})
|
|
185
|
+
.should.be.rejectedWith(sdk_core_1.UnexpectedAddressError);
|
|
186
|
+
});
|
|
187
|
+
it('should reject an invalid address', async function () {
|
|
188
|
+
await basecoin
|
|
189
|
+
.isWalletAddress({
|
|
190
|
+
address: 'not-a-valid-address',
|
|
191
|
+
baseAddress,
|
|
192
|
+
coinSpecific: {},
|
|
193
|
+
})
|
|
194
|
+
.should.be.rejectedWith(sdk_core_1.InvalidAddressError);
|
|
195
|
+
});
|
|
196
|
+
it('should not require forwarderVersion (no forwarder contracts)', async function () {
|
|
197
|
+
const result = await basecoin.isWalletAddress({
|
|
198
|
+
address: `${baseAddress}?memoId=100`,
|
|
199
|
+
baseAddress,
|
|
200
|
+
coinSpecific: { forwarderVersion: undefined },
|
|
201
|
+
});
|
|
202
|
+
result.should.equal(true);
|
|
203
|
+
});
|
|
38
204
|
});
|
|
39
205
|
describe('Testnet', function () {
|
|
40
206
|
let testnetBasecoin;
|
|
@@ -48,8 +214,11 @@ describe('Tempo Coin', function () {
|
|
|
48
214
|
it('should return the correct testnet coin name', function () {
|
|
49
215
|
testnetBasecoin.getChain().should.equal('ttempo');
|
|
50
216
|
testnetBasecoin.getFullName().should.equal('Testnet Tempo');
|
|
51
|
-
testnetBasecoin.getBaseFactor().should.equal(
|
|
217
|
+
testnetBasecoin.getBaseFactor().should.equal(1e6);
|
|
218
|
+
});
|
|
219
|
+
it('should validate address with memoId on testnet', function () {
|
|
220
|
+
testnetBasecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8').should.equal(true);
|
|
52
221
|
});
|
|
53
222
|
});
|
|
54
223
|
});
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBd0M7QUFDeEMsNkNBQTBDO0FBQzFDLGlEQUErQztBQUMvQyxtREFBK0Q7QUFJL0QsUUFBUSxDQUFDLFlBQVksRUFBRTtJQUNyQixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxTQUF1QyxFQUFRLEVBQUU7UUFDbkYsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDNUMsNkJBQTZCO1lBQzdCLE1BQU0sZUFBZSxHQUE4QjtnQkFDakQsSUFBSTtnQkFDSixRQUFRLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlO2dCQUN0RCxPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDeEM7Z0JBQ1IsUUFBUSxFQUFFLEVBQUU7YUFDTixDQUFDO1lBQ1QsT0FBTyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFLLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLElBQUksZUFBZSxDQUFDO1FBRXBCLE1BQU0sQ0FBQztZQUNMLFlBQVksQ0FBQyxRQUFRLEVBQUUsZUFBTSxDQUFDLENBQUM7WUFDL0IsZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7WUFDeEMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFNLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RCxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbyB9IGZyb20gJy4uLy4uL3NyYy90ZW1wbyc7XG5pbXBvcnQgeyBUdGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdHRlbXBvJztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnVGVtcG8gQ29pbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjtcblxuICBjb25zdCByZWdpc3RlckNvaW4gPSAobmFtZTogc3RyaW5nLCBjb2luQ2xhc3M6IHR5cGVvZiBUZW1wbyB8IHR5cGVvZiBUdGVtcG8pOiB2b2lkID0+IHtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIobmFtZSwgKGJpdGdvOiBCaXRHb0Jhc2UpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG1vY2sgc3RhdGljcyBjb2luXG4gICAgICBjb25zdCBtb2NrU3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4gPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZ1bGxOYW1lOiBuYW1lID09PSAndGVtcG8nID8gJ1RlbXBvJyA6ICdUZXN0bmV0IFRlbXBvJyxcbiAgICAgICAgbmV0d29yazoge1xuICAgICAgICAgIHR5cGU6IG5hbWUgPT09ICd0ZW1wbycgPyAnbWFpbm5ldCcgOiAndGVzdG5ldCcsXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICB9IGFzIGFueTtcbiAgICAgIHJldHVybiBjb2luQ2xhc3MuY3JlYXRlSW5zdGFuY2UoYml0Z28sIG1vY2tTdGF0aWNzQ29pbik7XG4gICAgfSk7XG4gIH07XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICByZWdpc3RlckNvaW4oJ3RlbXBvJywgVGVtcG8pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RlbXBvJyk7XG4gICAgYmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVGVtcG8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RlbXBvJyk7XG4gICAgYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1RlbXBvJyk7XG4gICAgYmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3RuZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRlc3RuZXRCYXNlY29pbjtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlckNvaW4oJ3R0ZW1wbycsIFR0ZW1wbyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4gPSBiaXRnby5jb2luKCd0dGVtcG8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIHRlc3RuZXQgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3RuZXRCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUdGVtcG8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdGVzdG5ldCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0ZW1wbycpO1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IFRlbXBvJyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBd0M7QUFDeEMsNkNBQTBDO0FBQzFDLGlEQUErQztBQUMvQyxtREFBK0Q7QUFDL0QsbURBQWtIO0FBRWxILCtDQUFpQztBQUVqQyxRQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQVEsQ0FBQztJQUViLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQXVDLEVBQVEsRUFBRTtRQUNuRixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUM1Qyw2QkFBNkI7WUFDN0IsTUFBTSxlQUFlLEdBQThCO2dCQUNqRCxJQUFJO2dCQUNKLFFBQVEsRUFBRSxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWU7Z0JBQ3RELE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUN4QztnQkFDUixRQUFRLEVBQUUsRUFBRTthQUNOLENBQUM7WUFDVCxPQUFPLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxZQUFZLENBQUMsT0FBTyxFQUFFLGFBQUssQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxrQkFBa0IsRUFB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LENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUQsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsZUFBZSxDQUFDLGNBQWMsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0csQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdGVtcG8nO1xuaW1wb3J0IHsgVHRlbXBvIH0gZnJvbSAnLi4vLi4vc3JjL3R0ZW1wbyc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UsIEludmFsaWRBZGRyZXNzRXJyb3IsIEludmFsaWRNZW1vSWRFcnJvciwgVW5leHBlY3RlZEFkZHJlc3NFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmRlc2NyaWJlKCdUZW1wbyBDb2luJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGNvbnN0IHJlZ2lzdGVyQ29pbiA9IChuYW1lOiBzdHJpbmcsIGNvaW5DbGFzczogdHlwZW9mIFRlbXBvIHwgdHlwZW9mIFR0ZW1wbyk6IHZvaWQgPT4ge1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcihuYW1lLCAoYml0Z286IEJpdEdvQmFzZSkgPT4ge1xuICAgICAgLy8gQ3JlYXRlIGEgbW9jayBzdGF0aWNzIGNvaW5cbiAgICAgIGNvbnN0IG1vY2tTdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPiA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZnVsbE5hbWU6IG5hbWUgPT09ICd0ZW1wbycgPyAnVGVtcG8nIDogJ1Rlc3RuZXQgVGVtcG8nLFxuICAgICAgICBuZXR3b3JrOiB7XG4gICAgICAgICAgdHlwZTogbmFtZSA9PT0gJ3RlbXBvJyA/ICdtYWlubmV0JyA6ICd0ZXN0bmV0JyxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgIH0gYXMgYW55O1xuICAgICAgcmV0dXJuIGNvaW5DbGFzcy5jcmVhdGVJbnN0YW5jZShiaXRnbywgbW9ja1N0YXRpY3NDb2luKTtcbiAgICB9KTtcbiAgfTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIHJlZ2lzdGVyQ29pbigndGVtcG8nLCBUZW1wbyk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmFzZWNvaW4gPSBiaXRnby5jb2luKCd0ZW1wbycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKTtcbiAgICBiYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUZW1wbyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGNvaW4gbmFtZScsIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgndGVtcG8nKTtcbiAgICBiYXNlY29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVtcG8nKTtcbiAgICBiYXNlY29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlNik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBZGRyZXNzIFZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwbGFpbiBFVk0gYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmYnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzIHdpdGggbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9OCcpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTAnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0xMjM0NScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ2ludmFsaWQnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgxMjMnKS5zaG91bGQuZXF1YWwoZmFsc2UpOyAvLyBUb28gc2hvcnRcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3Mgd2l0aCBpbnZhbGlkIG1lbW9JZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPWFiYycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0tMScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0xLjUnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9MDEnKS5zaG91bGQuZXF1YWwoZmFsc2UpOyAvLyBMZWFkaW5nIHplcm9cbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPScpLnNob3VsZC5lcXVhbChmYWxzZSk7IC8vIEVtcHR5IG1lbW9JZFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzcyB3aXRoIHVua25vd24gcXVlcnkgcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/aW52YWxpZD0xMjMnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9mb289YmFyJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3Mgd2l0aCBtdWx0aXBsZSBtZW1vSWQgcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTEmbWVtb0lkPTInKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzcyB3aXRoIGV4dHJhIHF1ZXJ5IHBhcmFtZXRlcnMgYmVzaWRlcyBtZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0xJmZvbz1iYXInKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QWRkcmVzc0RldGFpbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYWRkcmVzcyBkZXRhaWxzIHdpdGhvdXQgbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5iYXNlQWRkcmVzcy5zaG91bGQuZXF1YWwoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2ZicpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChhZGRyZXNzRGV0YWlscy5tZW1vSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYWRkcmVzcyBkZXRhaWxzIHdpdGggbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD04Jyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD04Jyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5iYXNlQWRkcmVzcy5zaG91bGQuZXF1YWwoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2ZicpO1xuICAgICAgYWRkcmVzc0RldGFpbHMubWVtb0lkLnNob3VsZC5lcXVhbCgnOCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBpbnZhbGlkIG1lbW9JZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPWFiYycpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRNZW1vSWRFcnJvclxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gbXVsdGlwbGUgbWVtb0lkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9MSZtZW1vSWQ9MicpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRBZGRyZXNzRXJyb3JcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIHVua25vd24gcXVlcnkgcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP2ludmFsaWQ9OCcpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRBZGRyZXNzRXJyb3JcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGVtcHR5IG1lbW9JZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0nKSkuc2hvdWxkLnRocm93KFxuICAgICAgICBJbnZhbGlkQWRkcmVzc0Vycm9yXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBleHRyYSBxdWVyeSBwYXJhbWV0ZXJzIGJlc2lkZXMgbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTEmZm9vPWJhcicpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRBZGRyZXNzRXJyb3JcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkTWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBtZW1vSWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnMCcpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzEnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcxMjM0NScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzk5OTk5OTk5OTk5OScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgbWVtb0lkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCctMScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcxLjUnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnYWJjJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzAxJykuc2hvdWxkLmVxdWFsKGZhbHNlKTsgLy8gTGVhZGluZyB6ZXJvXG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcwMCcpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1dhbGxldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSAnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJztcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgcGxhaW4gYWRkcmVzcyBtYXRjaGluZyB0aGUgYmFzZSBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHtcbiAgICAgICAgYWRkcmVzczogYmFzZUFkZHJlc3MsXG4gICAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBtZW1vSWQgYWRkcmVzcyB3aG9zZSBiYXNlIG1hdGNoZXMgdGhlIHdhbGxldCBiYXNlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3Moe1xuICAgICAgICBhZGRyZXNzOiBgJHtiYXNlQWRkcmVzc30/bWVtb0lkPThgLFxuICAgICAgICBiYXNlQWRkcmVzcyxcbiAgICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHVzaW5nIHJvb3RBZGRyZXNzIHdoZW4gYmFzZUFkZHJlc3MgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHtcbiAgICAgICAgYWRkcmVzczogYCR7YmFzZUFkZHJlc3N9P21lbW9JZD00MmAsXG4gICAgICAgIHJvb3RBZGRyZXNzOiBiYXNlQWRkcmVzcyxcbiAgICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3Mgd2l0aCBtaXNtYXRjaGVkIGJhc2UgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5pc1dhbGxldEFkZHJlc3Moe1xuICAgICAgICAgIGFkZHJlc3M6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE/bWVtb0lkPTgnLFxuICAgICAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gaW52YWxpZCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgICAgYWRkcmVzczogJ25vdC1hLXZhbGlkLWFkZHJlc3MnLFxuICAgICAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKEludmFsaWRBZGRyZXNzRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVxdWlyZSBmb3J3YXJkZXJWZXJzaW9uIChubyBmb3J3YXJkZXIgY29udHJhY3RzKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgIGFkZHJlc3M6IGAke2Jhc2VBZGRyZXNzfT9tZW1vSWQ9MTAwYCxcbiAgICAgICAgYmFzZUFkZHJlc3MsXG4gICAgICAgIGNvaW5TcGVjaWZpYzogeyBmb3J3YXJkZXJWZXJzaW9uOiB1bmRlZmluZWQgfSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3RuZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRlc3RuZXRCYXNlY29pbjtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlckNvaW4oJ3R0ZW1wbycsIFR0ZW1wbyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4gPSBiaXRnby5jb2luKCd0dGVtcG8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIHRlc3RuZXQgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3RuZXRCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUdGVtcG8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdGVzdG5ldCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0ZW1wbycpO1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IFRlbXBvJyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzIHdpdGggbWVtb0lkIG9uIHRlc3RuZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9OCcpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../../test/unit/tempo.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,207 @@
|
|
|
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 sinon_1 = __importDefault(require("sinon"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
9
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
10
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
11
|
+
const tempo_1 = require("../../src/tempo");
|
|
12
|
+
const PATH_USD_ADDRESS = '0x20c0000000000000000000000000000000000000';
|
|
13
|
+
// secp256k1 generator point G (33 bytes) + 32-byte chaincode — valid commonKeyChain for deriveUnhardened
|
|
14
|
+
const TEST_BACKUP_KEY = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798' +
|
|
15
|
+
'0000000000000000000000000000000000000000000000000000000000000001';
|
|
16
|
+
const TEST_RECOVERY_DESTINATION = '0x80151ebf635e6ec8a5455258f617be6cda1fbd7e';
|
|
17
|
+
describe('Tempo Recovery', function () {
|
|
18
|
+
let bitgo;
|
|
19
|
+
let basecoin;
|
|
20
|
+
let sandbox;
|
|
21
|
+
before(function () {
|
|
22
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
|
|
23
|
+
bitgo.safeRegister('tempo', (b) => {
|
|
24
|
+
const mockStaticsCoin = {
|
|
25
|
+
name: 'tempo',
|
|
26
|
+
fullName: 'Tempo',
|
|
27
|
+
family: statics_1.CoinFamily.TEMPO,
|
|
28
|
+
network: { type: 'mainnet' },
|
|
29
|
+
features: [],
|
|
30
|
+
};
|
|
31
|
+
return tempo_1.Tempo.createInstance(b, mockStaticsCoin);
|
|
32
|
+
});
|
|
33
|
+
bitgo.initializeTestVars();
|
|
34
|
+
basecoin = bitgo.coin('tempo');
|
|
35
|
+
});
|
|
36
|
+
beforeEach(function () {
|
|
37
|
+
sandbox = sinon_1.default.createSandbox();
|
|
38
|
+
});
|
|
39
|
+
afterEach(function () {
|
|
40
|
+
sandbox.restore();
|
|
41
|
+
});
|
|
42
|
+
describe('queryTempoRpc (via recoveryBlockchainExplorerQuery)', function () {
|
|
43
|
+
function mockFetch(responseBody) {
|
|
44
|
+
return sandbox.stub(global, 'fetch').resolves({
|
|
45
|
+
ok: true,
|
|
46
|
+
json: async () => responseBody,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
it('returns { result: "0" } for account/balance without calling RPC', async function () {
|
|
50
|
+
const fetchStub = mockFetch({});
|
|
51
|
+
const result = await basecoin.recoveryBlockchainExplorerQuery({
|
|
52
|
+
module: 'account',
|
|
53
|
+
action: 'balance',
|
|
54
|
+
address: '0xabc',
|
|
55
|
+
});
|
|
56
|
+
result.should.deepEqual({ result: '0' });
|
|
57
|
+
fetchStub.called.should.equal(false);
|
|
58
|
+
});
|
|
59
|
+
it('calls eth_call with balanceOf selector for account/tokenbalance', async function () {
|
|
60
|
+
const fetchStub = mockFetch({ result: '0x4e20' }); // 20000 decimal
|
|
61
|
+
const result = await basecoin.recoveryBlockchainExplorerQuery({
|
|
62
|
+
module: 'account',
|
|
63
|
+
action: 'tokenbalance',
|
|
64
|
+
address: '0x1234567890123456789012345678901234567890',
|
|
65
|
+
contractaddress: PATH_USD_ADDRESS,
|
|
66
|
+
tag: 'latest',
|
|
67
|
+
});
|
|
68
|
+
result.should.deepEqual({ result: '20000' });
|
|
69
|
+
const body = JSON.parse(fetchStub.firstCall.args[1].body);
|
|
70
|
+
body.method.should.equal('eth_call');
|
|
71
|
+
body.params[0].data.should.startWith('0x70a08231');
|
|
72
|
+
});
|
|
73
|
+
it('calls eth_getTransactionCount for account/txlist and parses nonce', async function () {
|
|
74
|
+
mockFetch({ result: '0x5' });
|
|
75
|
+
const result = await basecoin.recoveryBlockchainExplorerQuery({
|
|
76
|
+
module: 'account',
|
|
77
|
+
action: 'txlist',
|
|
78
|
+
address: '0xabc',
|
|
79
|
+
});
|
|
80
|
+
result.should.deepEqual({ nonce: 5 });
|
|
81
|
+
});
|
|
82
|
+
it('returns { result: "0" } when RPC returns null body.result', async function () {
|
|
83
|
+
mockFetch({ result: null });
|
|
84
|
+
const result = await basecoin.recoveryBlockchainExplorerQuery({
|
|
85
|
+
module: 'account',
|
|
86
|
+
action: 'tokenbalance',
|
|
87
|
+
address: '0xabc',
|
|
88
|
+
contractaddress: PATH_USD_ADDRESS,
|
|
89
|
+
});
|
|
90
|
+
result.should.deepEqual({ result: '0' });
|
|
91
|
+
});
|
|
92
|
+
it('returns { result: "0" } when RPC returns malformed body.result', async function () {
|
|
93
|
+
mockFetch({ result: 'not-a-number' });
|
|
94
|
+
const result = await basecoin.recoveryBlockchainExplorerQuery({
|
|
95
|
+
module: 'account',
|
|
96
|
+
action: 'tokenbalance',
|
|
97
|
+
address: '0xabc',
|
|
98
|
+
contractaddress: PATH_USD_ADDRESS,
|
|
99
|
+
});
|
|
100
|
+
result.should.deepEqual({ result: '0' });
|
|
101
|
+
});
|
|
102
|
+
it('throws when the RPC returns an error field', async function () {
|
|
103
|
+
mockFetch({ error: { message: 'execution reverted' } });
|
|
104
|
+
await basecoin
|
|
105
|
+
.recoveryBlockchainExplorerQuery({
|
|
106
|
+
module: 'account',
|
|
107
|
+
action: 'tokenbalance',
|
|
108
|
+
address: '0xabc',
|
|
109
|
+
contractaddress: PATH_USD_ADDRESS,
|
|
110
|
+
})
|
|
111
|
+
.should.be.rejectedWith('Tempo RPC error: execution reverted');
|
|
112
|
+
});
|
|
113
|
+
it('throws for unsupported module/action', async function () {
|
|
114
|
+
await basecoin
|
|
115
|
+
.recoveryBlockchainExplorerQuery({ module: 'proxy', action: 'eth_blockNumber' })
|
|
116
|
+
.should.be.rejectedWith('queryTempoRpc: unsupported module=proxy action=eth_blockNumber');
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('buildUnsignedSweepTxnTSS — gas margin calculation', function () {
|
|
120
|
+
function stubBalanceAndNonce(balance, nonce = 0) {
|
|
121
|
+
sandbox.stub(basecoin, 'queryAddressTokenBalance').resolves(balance);
|
|
122
|
+
sandbox.stub(basecoin, 'getAddressNonce').resolves(nonce);
|
|
123
|
+
}
|
|
124
|
+
it('deducts gasLimit × maxFeePerGas / 10^12 from pathUSD balance', async function () {
|
|
125
|
+
// gasMargin = 1_000_000 * 20_000_000_000 * 1.75 / 10^12 = 35_000
|
|
126
|
+
// sweepAmount = 1_000_000 - 35_000 = 965_000
|
|
127
|
+
stubBalanceAndNonce('1000000');
|
|
128
|
+
const result = (await basecoin.buildUnsignedSweepTxnTSS({
|
|
129
|
+
backupKey: TEST_BACKUP_KEY,
|
|
130
|
+
recoveryDestination: TEST_RECOVERY_DESTINATION,
|
|
131
|
+
tokenContractAddress: PATH_USD_ADDRESS,
|
|
132
|
+
gasLimit: 1000000,
|
|
133
|
+
eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
|
|
134
|
+
}));
|
|
135
|
+
should_1.default.exist(result.txRequests);
|
|
136
|
+
result.txRequests[0].transactions[0].unsignedTx.should.have.property('serializedTxHex');
|
|
137
|
+
});
|
|
138
|
+
it('uses smaller margin when gasLimit is halved', async function () {
|
|
139
|
+
// gasMargin = 500_000 * 20_000_000_000 * 1.75 / 10^12 = 17_500
|
|
140
|
+
// sweepAmount = 50_000 - 17_500 = 32_500
|
|
141
|
+
stubBalanceAndNonce('50000');
|
|
142
|
+
const result = (await basecoin.buildUnsignedSweepTxnTSS({
|
|
143
|
+
backupKey: TEST_BACKUP_KEY,
|
|
144
|
+
recoveryDestination: TEST_RECOVERY_DESTINATION,
|
|
145
|
+
tokenContractAddress: PATH_USD_ADDRESS,
|
|
146
|
+
gasLimit: 500000,
|
|
147
|
+
eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
|
|
148
|
+
}));
|
|
149
|
+
should_1.default.exist(result.txRequests);
|
|
150
|
+
});
|
|
151
|
+
it('throws when balance exactly equals the gas margin', async function () {
|
|
152
|
+
// gasMargin = 1_000_000 * 20_000_000_000 / 10^12 = 20_000; balance = 20_000 → sweepAmount = 0
|
|
153
|
+
stubBalanceAndNonce('20000');
|
|
154
|
+
await basecoin
|
|
155
|
+
.buildUnsignedSweepTxnTSS({
|
|
156
|
+
backupKey: TEST_BACKUP_KEY,
|
|
157
|
+
recoveryDestination: TEST_RECOVERY_DESTINATION,
|
|
158
|
+
tokenContractAddress: PATH_USD_ADDRESS,
|
|
159
|
+
gasLimit: 1000000,
|
|
160
|
+
eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
|
|
161
|
+
})
|
|
162
|
+
.should.be.rejectedWith(/Insufficient balance/);
|
|
163
|
+
});
|
|
164
|
+
it('does not deduct margin when sweeping a non-pathUSD token', async function () {
|
|
165
|
+
const otherToken = '0x1111111111111111111111111111111111111111';
|
|
166
|
+
stubBalanceAndNonce('500');
|
|
167
|
+
const result = (await basecoin.buildUnsignedSweepTxnTSS({
|
|
168
|
+
backupKey: TEST_BACKUP_KEY,
|
|
169
|
+
recoveryDestination: TEST_RECOVERY_DESTINATION,
|
|
170
|
+
tokenContractAddress: otherToken,
|
|
171
|
+
gasLimit: 1000000,
|
|
172
|
+
eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
|
|
173
|
+
}));
|
|
174
|
+
// Full balance of 500 swept; no margin deducted
|
|
175
|
+
should_1.default.exist(result.txRequests);
|
|
176
|
+
});
|
|
177
|
+
it('returns correct UnsignedSweepTxMPCv2 structure', async function () {
|
|
178
|
+
stubBalanceAndNonce('1000000');
|
|
179
|
+
const result = (await basecoin.buildUnsignedSweepTxnTSS({
|
|
180
|
+
backupKey: TEST_BACKUP_KEY,
|
|
181
|
+
recoveryDestination: TEST_RECOVERY_DESTINATION,
|
|
182
|
+
tokenContractAddress: PATH_USD_ADDRESS,
|
|
183
|
+
gasLimit: 1000000,
|
|
184
|
+
eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
|
|
185
|
+
}));
|
|
186
|
+
const tx = result.txRequests[0].transactions[0];
|
|
187
|
+
tx.unsignedTx.derivationPath.should.equal('m/0');
|
|
188
|
+
tx.unsignedTx.coinSpecific.commonKeyChain.should.equal(TEST_BACKUP_KEY);
|
|
189
|
+
tx.signatureShares.should.deepEqual([]);
|
|
190
|
+
tx.nonce.should.equal(0);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe('recoverTSS — unsigned sweep dispatch', function () {
|
|
194
|
+
it('routes to buildUnsignedSweepTxnTSS when keys are plain public keys', async function () {
|
|
195
|
+
const buildStub = sandbox.stub(basecoin, 'buildUnsignedSweepTxnTSS').resolves({ txRequests: [] });
|
|
196
|
+
sandbox.stub(basecoin, 'validateRecoveryParams').returns(undefined);
|
|
197
|
+
await basecoin.recoverTSS({
|
|
198
|
+
userKey: TEST_BACKUP_KEY,
|
|
199
|
+
backupKey: TEST_BACKUP_KEY,
|
|
200
|
+
isTss: true,
|
|
201
|
+
recoveryDestination: TEST_RECOVERY_DESTINATION,
|
|
202
|
+
});
|
|
203
|
+
buildStub.calledOnce.should.equal(true);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLGlEQUErQztBQUMvQyxtREFBK0Q7QUFFL0QsaURBQThFO0FBQzlFLDJDQUF3QztBQUN4QyxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO0FBRXRFLHlHQUF5RztBQUN6RyxNQUFNLGVBQWUsR0FDbkIsb0VBQW9FO0lBQ3BFLGtFQUFrRSxDQUFDO0FBQ3JFLE1BQU0seUJBQXlCLEdBQUcsNENBQTRDLENBQUM7QUFFL0UsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWUsQ0FBQztJQUNwQixJQUFJLE9BQTJCLENBQUM7SUFFaEMsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQVksRUFBRSxFQUFFO1lBQzNDLE1BQU0sZUFBZSxHQUE4QjtnQkFDakQsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE1BQU0sRUFBRSxvQkFBVSxDQUFDLEtBQUs7Z0JBQ3hCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQzVCLFFBQVEsRUFBRSxFQUFFO2FBQ04sQ0FBQztZQUNULE9BQU8sYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQVUsQ0FB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QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0NBQXNDLEVBQUU7UUFDL0MsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEtBQUs7WUFDNUUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFlLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQWUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUzRSxNQUFPLFFBQWdCLENBQUMsVUFBVSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2dCQUNYLG1CQUFtQixFQUFFLHlCQUF5QjthQUMvQyxDQUFDLENBQUM7WUFFSCxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgQ29pbkZhbWlseSB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdGVtcG8nO1xuY29uc3QgUEFUSF9VU0RfQUREUkVTUyA9ICcweDIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuXG4vLyBzZWNwMjU2azEgZ2VuZXJhdG9yIHBvaW50IEcgKDMzIGJ5dGVzKSArIDMyLWJ5dGUgY2hhaW5jb2RlIOKAlCB2YWxpZCBjb21tb25LZXlDaGFpbiBmb3IgZGVyaXZlVW5oYXJkZW5lZFxuY29uc3QgVEVTVF9CQUNLVVBfS0VZID1cbiAgJzAyNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcgK1xuICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSc7XG5jb25zdCBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OID0gJzB4ODAxNTFlYmY2MzVlNmVjOGE1NDU1MjU4ZjYxN2JlNmNkYTFmYmQ3ZSc7XG5cbmRlc2NyaWJlKCdUZW1wbyBSZWNvdmVyeScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGVtcG87XG4gIGxldCBzYW5kYm94OiBzaW5vbi5TaW5vblNhbmRib3g7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RlbXBvJywgKGI6IEJpdEdvQmFzZSkgPT4ge1xuICAgICAgY29uc3QgbW9ja1N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+ID0ge1xuICAgICAgICBuYW1lOiAndGVtcG8nLFxuICAgICAgICBmdWxsTmFtZTogJ1RlbXBvJyxcbiAgICAgICAgZmFtaWx5OiBDb2luRmFtaWx5LlRFTVBPLFxuICAgICAgICBuZXR3b3JrOiB7IHR5cGU6ICdtYWlubmV0JyB9LFxuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICB9IGFzIGFueTtcbiAgICAgIHJldHVybiBUZW1wby5jcmVhdGVJbnN0YW5jZShiLCBtb2NrU3RhdGljc0NvaW4pO1xuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKSBhcyBUZW1wbztcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3F1ZXJ5VGVtcG9ScGMgKHZpYSByZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KScsIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBtb2NrRmV0Y2gocmVzcG9uc2VCb2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHNpbm9uLlNpbm9uU3R1YiB7XG4gICAgICByZXR1cm4gc2FuZGJveC5zdHViKGdsb2JhbCwgJ2ZldGNoJyBhcyBhbnkpLnJlc29sdmVzKHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGpzb246IGFzeW5jICgpID0+IHJlc3BvbnNlQm9keSxcbiAgICAgIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSBmb3IgYWNjb3VudC9iYWxhbmNlIHdpdGhvdXQgY2FsbGluZyBSUEMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goe30pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICdiYWxhbmNlJyxcbiAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICAgIGZldGNoU3R1Yi5jYWxsZWQuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBldGhfY2FsbCB3aXRoIGJhbGFuY2VPZiBzZWxlY3RvciBmb3IgYWNjb3VudC90b2tlbmJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDRlMjAnIH0pOyAvLyAyMDAwMCBkZWNpbWFsXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIHRhZzogJ2xhdGVzdCcsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMjAwMDAnIH0pO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZmV0Y2hTdHViLmZpcnN0Q2FsbC5hcmdzWzFdLmJvZHkpO1xuICAgICAgYm9keS5tZXRob2Quc2hvdWxkLmVxdWFsKCdldGhfY2FsbCcpO1xuICAgICAgYm9keS5wYXJhbXNbMF0uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDcwYTA4MjMxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgZXRoX2dldFRyYW5zYWN0aW9uQ291bnQgZm9yIGFjY291bnQvdHhsaXN0IGFuZCBwYXJzZXMgbm9uY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDUnIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0eGxpc3QnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IG5vbmNlOiA1IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgeyByZXN1bHQ6IFwiMFwiIH0gd2hlbiBSUEMgcmV0dXJucyBudWxsIGJvZHkucmVzdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0ZldGNoKHsgcmVzdWx0OiBudWxsIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0b2tlbmJhbGFuY2UnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSB3aGVuIFJQQyByZXR1cm5zIG1hbGZvcm1lZCBib2R5LnJlc3VsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tGZXRjaCh7IHJlc3VsdDogJ25vdC1hLW51bWJlcicgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweGFiYycsXG4gICAgICAgIGNvbnRyYWN0YWRkcmVzczogUEFUSF9VU0RfQUREUkVTUyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiB0aGUgUlBDIHJldHVybnMgYW4gZXJyb3IgZmllbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyBlcnJvcjogeyBtZXNzYWdlOiAnZXhlY3V0aW9uIHJldmVydGVkJyB9IH0pO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoe1xuICAgICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUZW1wbyBSUEMgZXJyb3I6IGV4ZWN1dGlvbiByZXZlcnRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBmb3IgdW5zdXBwb3J0ZWQgbW9kdWxlL2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHsgbW9kdWxlOiAncHJveHknLCBhY3Rpb246ICdldGhfYmxvY2tOdW1iZXInIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdxdWVyeVRlbXBvUnBjOiB1bnN1cHBvcnRlZCBtb2R1bGU9cHJveHkgYWN0aW9uPWV0aF9ibG9ja051bWJlcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTIOKAlCBnYXMgbWFyZ2luIGNhbGN1bGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHN0dWJCYWxhbmNlQW5kTm9uY2UoYmFsYW5jZTogc3RyaW5nLCBub25jZSA9IDApIHtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdxdWVyeUFkZHJlc3NUb2tlbkJhbGFuY2UnKS5yZXNvbHZlcyhiYWxhbmNlKTtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdnZXRBZGRyZXNzTm9uY2UnKS5yZXNvbHZlcyhub25jZSk7XG4gICAgfVxuXG4gICAgaXQoJ2RlZHVjdHMgZ2FzTGltaXQgw5cgbWF4RmVlUGVyR2FzIC8gMTBeMTIgZnJvbSBwYXRoVVNEIGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSAxXzAwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAqIDEuNzUgLyAxMF4xMiA9IDM1XzAwMFxuICAgICAgLy8gc3dlZXBBbW91bnQgPSAxXzAwMF8wMDAgLSAzNV8wMDAgPSA5NjVfMDAwXG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogMV8wMDBfMDAwLFxuICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgfSkpIGFzIGFueTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQudHhSZXF1ZXN0cyk7XG4gICAgICByZXN1bHQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc2VyaWFsaXplZFR4SGV4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBzbWFsbGVyIG1hcmdpbiB3aGVuIGdhc0xpbWl0IGlzIGhhbHZlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGdhc01hcmdpbiA9IDUwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAqIDEuNzUgLyAxMF4xMiA9IDE3XzUwMFxuICAgICAgLy8gc3dlZXBBbW91bnQgPSA1MF8wMDAgLSAxN181MDAgPSAzMl81MDBcbiAgICAgIHN0dWJCYWxhbmNlQW5kTm9uY2UoJzUwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogNTAwXzAwMCxcbiAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgIH0pKSBhcyBhbnk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIGJhbGFuY2UgZXhhY3RseSBlcXVhbHMgdGhlIGdhcyBtYXJnaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSAxXzAwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAvIDEwXjEyID0gMjBfMDAwOyBiYWxhbmNlID0gMjBfMDAwIOKGkiBzd2VlcEFtb3VudCA9IDBcbiAgICAgIHN0dWJCYWxhbmNlQW5kTm9uY2UoJzIwMDAwJyk7XG4gICAgICBhd2FpdCAoYmFzZWNvaW4gYXMgYW55KVxuICAgICAgICAuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICAgIGdhc0xpbWl0OiAxXzAwMF8wMDAsXG4gICAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0luc3VmZmljaWVudCBiYWxhbmNlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgZGVkdWN0IG1hcmdpbiB3aGVuIHN3ZWVwaW5nIGEgbm9uLXBhdGhVU0QgdG9rZW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdGhlclRva2VuID0gJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCc1MDAnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCAoYmFzZWNvaW4gYXMgYW55KS5idWlsZFVuc2lnbmVkU3dlZXBUeG5UU1Moe1xuICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogVEVTVF9SRUNPVkVSWV9ERVNUSU5BVElPTixcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IG90aGVyVG9rZW4sXG4gICAgICAgIGdhc0xpbWl0OiAxXzAwMF8wMDAsXG4gICAgICAgIGVpcDE1NTk6IHsgbWF4RmVlUGVyR2FzOiAyMF8wMDBfMDAwXzAwMCwgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IDEwXzAwMF8wMDBfMDAwIH0sXG4gICAgICB9KSkgYXMgYW55O1xuICAgICAgLy8gRnVsbCBiYWxhbmNlIG9mIDUwMCBzd2VwdDsgbm8gbWFyZ2luIGRlZHVjdGVkXG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBVbnNpZ25lZFN3ZWVwVHhNUEN2MiBzdHJ1Y3R1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogMV8wMDBfMDAwLFxuICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgfSkpIGFzIGFueTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzdWx0LnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHgudW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMCcpO1xuICAgICAgdHgudW5zaWduZWRUeC5jb2luU3BlY2lmaWMuY29tbW9uS2V5Q2hhaW4uc2hvdWxkLmVxdWFsKFRFU1RfQkFDS1VQX0tFWSk7XG4gICAgICB0eC5zaWduYXR1cmVTaGFyZXMuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gICAgICB0eC5ub25jZS5zaG91bGQuZXF1YWwoMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWNvdmVyVFNTIOKAlCB1bnNpZ25lZCBzd2VlcCBkaXNwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncm91dGVzIHRvIGJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyB3aGVuIGtleXMgYXJlIHBsYWluIHB1YmxpYyBrZXlzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRTdHViID0gc2FuZGJveC5zdHViKGJhc2Vjb2luIGFzIGFueSwgJ2J1aWxkVW5zaWduZWRTd2VlcFR4blRTUycpLnJlc29sdmVzKHsgdHhSZXF1ZXN0czogW10gfSk7XG4gICAgICBzYW5kYm94LnN0dWIoYmFzZWNvaW4gYXMgYW55LCAndmFsaWRhdGVSZWNvdmVyeVBhcmFtcycpLnJldHVybnModW5kZWZpbmVkKTtcblxuICAgICAgYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkucmVjb3ZlclRTUyh7XG4gICAgICAgIHVzZXJLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkU3R1Yi5jYWxsZWRPbmNlLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transactionBuilder.ts"],"names":[],"mappings":""}
|