@bitgo-beta/sdk-coin-tempo 1.0.1-beta.7 → 1.0.1-beta.70
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 +17 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +22 -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 +8 -18
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +18 -84
- 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 +112 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +164 -0
- package/dist/src/lib/transactionBuilder.d.ts +100 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +204 -0
- package/dist/src/lib/types.d.ts +17 -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 +54 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +122 -16
- package/dist/src/register.d.ts +4 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +26 -1
- package/dist/src/tempo.d.ts +37 -44
- package/dist/src/tempo.d.ts.map +1 -1
- package/dist/src/tempo.js +52 -84
- package/dist/src/tip20Token.d.ts +89 -0
- package/dist/src/tip20Token.d.ts.map +1 -0
- package/dist/src/tip20Token.js +198 -0
- package/dist/test/integration/tip20.d.ts +2 -0
- package/dist/test/integration/tip20.d.ts.map +1 -0
- package/dist/test/integration/tip20.js +115 -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 +252 -0
- package/dist/test/unit/utils.js +6 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -6
|
@@ -0,0 +1,252 @@
|
|
|
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 mocha_1 = require("mocha");
|
|
8
|
+
const ethers_1 = require("ethers");
|
|
9
|
+
const transactionBuilder_1 = require("../../src/lib/transactionBuilder");
|
|
10
|
+
const utils_1 = require("../../src/lib/utils");
|
|
11
|
+
const constants_1 = require("../../src/lib/constants");
|
|
12
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
13
|
+
const mockCoinConfig = statics_1.coins.get('ttempo');
|
|
14
|
+
(0, mocha_1.describe)('TIP-20 Utilities', () => {
|
|
15
|
+
(0, mocha_1.describe)('amountToTip20Units', () => {
|
|
16
|
+
(0, mocha_1.it)('should convert decimal amount to 6-decimal units', () => {
|
|
17
|
+
assert_1.default.strictEqual((0, utils_1.amountToTip20Units)('1.5'), 1500000n);
|
|
18
|
+
assert_1.default.strictEqual((0, utils_1.amountToTip20Units)('100'), 100000000n);
|
|
19
|
+
assert_1.default.strictEqual((0, utils_1.amountToTip20Units)('0.000001'), 1n);
|
|
20
|
+
});
|
|
21
|
+
(0, mocha_1.it)('should throw error for invalid amount', () => {
|
|
22
|
+
assert_1.default.throws(() => (0, utils_1.amountToTip20Units)('invalid'), /Invalid amount format/);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
(0, mocha_1.describe)('tip20UnitsToAmount', () => {
|
|
26
|
+
(0, mocha_1.it)('should convert 6-decimal units to human-readable amount', () => {
|
|
27
|
+
assert_1.default.strictEqual((0, utils_1.tip20UnitsToAmount)(1500000n), '1.5');
|
|
28
|
+
assert_1.default.strictEqual((0, utils_1.tip20UnitsToAmount)(100000000n), '100.0');
|
|
29
|
+
assert_1.default.strictEqual((0, utils_1.tip20UnitsToAmount)(1n), '0.000001');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
(0, mocha_1.describe)('stringToBytes32', () => {
|
|
33
|
+
(0, mocha_1.it)('should convert string to bytes32', () => {
|
|
34
|
+
const result = (0, utils_1.stringToBytes32)('12345');
|
|
35
|
+
assert_1.default.strictEqual(typeof result, 'string');
|
|
36
|
+
assert_1.default.strictEqual(result.length, 66);
|
|
37
|
+
assert_1.default.ok(result.startsWith('0x'));
|
|
38
|
+
});
|
|
39
|
+
(0, mocha_1.it)('should throw error for string longer than 32 bytes', () => {
|
|
40
|
+
const longString = 'a'.repeat(33);
|
|
41
|
+
assert_1.default.throws(() => (0, utils_1.stringToBytes32)(longString), /Memo too long/);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
(0, mocha_1.describe)('encodeTip20TransferWithMemo', () => {
|
|
45
|
+
(0, mocha_1.it)('should encode transferWithMemo call', () => {
|
|
46
|
+
const to = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
|
|
47
|
+
const amount = 1500000n;
|
|
48
|
+
const memo = '12345';
|
|
49
|
+
const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, amount, memo);
|
|
50
|
+
assert_1.default.strictEqual(typeof encoded, 'string');
|
|
51
|
+
assert_1.default.ok(encoded.startsWith('0x'));
|
|
52
|
+
assert_1.default.ok(encoded.length > 10);
|
|
53
|
+
});
|
|
54
|
+
(0, mocha_1.it)('should encode transferWithMemo without memo', () => {
|
|
55
|
+
const to = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
|
|
56
|
+
const amount = 1500000n;
|
|
57
|
+
const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, amount);
|
|
58
|
+
assert_1.default.strictEqual(typeof encoded, 'string');
|
|
59
|
+
assert_1.default.ok(encoded.startsWith('0x'));
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
(0, mocha_1.describe)('isValidTip20Amount', () => {
|
|
63
|
+
(0, mocha_1.it)('should validate correct amounts', () => {
|
|
64
|
+
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('1.5'), true);
|
|
65
|
+
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('100'), true);
|
|
66
|
+
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('0.000001'), true);
|
|
67
|
+
});
|
|
68
|
+
(0, mocha_1.it)('should invalidate incorrect amounts', () => {
|
|
69
|
+
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('invalid'), false);
|
|
70
|
+
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)(''), false);
|
|
71
|
+
assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('-5'), false);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
(0, mocha_1.describe)('TIP-20 Transaction Builder', () => {
|
|
76
|
+
const mockToken = ethers_1.ethers.utils.getAddress('0x1234567890123456789012345678901234567890');
|
|
77
|
+
const mockRecipient = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
|
|
78
|
+
const mockFeeToken = ethers_1.ethers.utils.getAddress('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd');
|
|
79
|
+
(0, mocha_1.describe)('addOperation', () => {
|
|
80
|
+
(0, mocha_1.it)('should add a single operation without memo', () => {
|
|
81
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
82
|
+
builder.addOperation({
|
|
83
|
+
token: mockToken,
|
|
84
|
+
to: mockRecipient,
|
|
85
|
+
amount: '100.5',
|
|
86
|
+
});
|
|
87
|
+
const operations = builder.getOperations();
|
|
88
|
+
assert_1.default.strictEqual(operations.length, 1);
|
|
89
|
+
assert_1.default.strictEqual(operations[0].token, mockToken);
|
|
90
|
+
assert_1.default.strictEqual(operations[0].to, mockRecipient);
|
|
91
|
+
assert_1.default.strictEqual(operations[0].amount, '100.5');
|
|
92
|
+
assert_1.default.strictEqual(operations[0].memo, undefined);
|
|
93
|
+
});
|
|
94
|
+
(0, mocha_1.it)('should add a single operation with memo', () => {
|
|
95
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
96
|
+
builder.addOperation({
|
|
97
|
+
token: mockToken,
|
|
98
|
+
to: mockRecipient,
|
|
99
|
+
amount: '100.5',
|
|
100
|
+
memo: '202501',
|
|
101
|
+
});
|
|
102
|
+
const operations = builder.getOperations();
|
|
103
|
+
assert_1.default.strictEqual(operations.length, 1);
|
|
104
|
+
assert_1.default.strictEqual(operations[0].memo, '202501');
|
|
105
|
+
});
|
|
106
|
+
(0, mocha_1.it)('should add multiple operations (batch)', () => {
|
|
107
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
108
|
+
builder
|
|
109
|
+
.addOperation({
|
|
110
|
+
token: mockToken,
|
|
111
|
+
to: mockRecipient,
|
|
112
|
+
amount: '50.0',
|
|
113
|
+
memo: '1001',
|
|
114
|
+
})
|
|
115
|
+
.addOperation({
|
|
116
|
+
token: mockToken,
|
|
117
|
+
to: mockRecipient,
|
|
118
|
+
amount: '30.0',
|
|
119
|
+
memo: '1002',
|
|
120
|
+
})
|
|
121
|
+
.addOperation({
|
|
122
|
+
token: mockToken,
|
|
123
|
+
to: mockRecipient,
|
|
124
|
+
amount: '20.0',
|
|
125
|
+
memo: '1003',
|
|
126
|
+
});
|
|
127
|
+
const operations = builder.getOperations();
|
|
128
|
+
assert_1.default.strictEqual(operations.length, 3);
|
|
129
|
+
assert_1.default.strictEqual(operations[0].memo, '1001');
|
|
130
|
+
assert_1.default.strictEqual(operations[1].memo, '1002');
|
|
131
|
+
assert_1.default.strictEqual(operations[2].memo, '1003');
|
|
132
|
+
});
|
|
133
|
+
(0, mocha_1.it)('should throw error for invalid token address', () => {
|
|
134
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
135
|
+
assert_1.default.throws(() => {
|
|
136
|
+
builder.addOperation({
|
|
137
|
+
token: '0xinvalid',
|
|
138
|
+
to: mockRecipient,
|
|
139
|
+
amount: '100',
|
|
140
|
+
});
|
|
141
|
+
}, /Invalid token address/);
|
|
142
|
+
});
|
|
143
|
+
(0, mocha_1.it)('should throw error for invalid recipient address', () => {
|
|
144
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
145
|
+
assert_1.default.throws(() => {
|
|
146
|
+
builder.addOperation({
|
|
147
|
+
token: mockToken,
|
|
148
|
+
to: '0xinvalid',
|
|
149
|
+
amount: '100',
|
|
150
|
+
});
|
|
151
|
+
}, /Invalid recipient address/);
|
|
152
|
+
});
|
|
153
|
+
(0, mocha_1.it)('should throw error for invalid amount', () => {
|
|
154
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
155
|
+
assert_1.default.throws(() => {
|
|
156
|
+
builder.addOperation({
|
|
157
|
+
token: mockToken,
|
|
158
|
+
to: mockRecipient,
|
|
159
|
+
amount: 'invalid-amount',
|
|
160
|
+
});
|
|
161
|
+
}, /Invalid amount/);
|
|
162
|
+
});
|
|
163
|
+
(0, mocha_1.it)('should throw error for memo longer than 32 bytes', () => {
|
|
164
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
165
|
+
const longMemo = 'a'.repeat(33);
|
|
166
|
+
assert_1.default.throws(() => {
|
|
167
|
+
builder.addOperation({
|
|
168
|
+
token: mockToken,
|
|
169
|
+
to: mockRecipient,
|
|
170
|
+
amount: '100',
|
|
171
|
+
memo: longMemo,
|
|
172
|
+
});
|
|
173
|
+
}, /Memo too long/);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
(0, mocha_1.describe)('feeToken', () => {
|
|
177
|
+
(0, mocha_1.it)('should set fee token', () => {
|
|
178
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
179
|
+
builder.feeToken(mockFeeToken);
|
|
180
|
+
assert_1.default.strictEqual(builder.getFeeToken(), mockFeeToken);
|
|
181
|
+
});
|
|
182
|
+
(0, mocha_1.it)('should throw error for invalid fee token address', () => {
|
|
183
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
184
|
+
assert_1.default.throws(() => {
|
|
185
|
+
builder.feeToken('invalid-address');
|
|
186
|
+
}, /Invalid fee token address/);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
(0, mocha_1.describe)('Transaction parameters', () => {
|
|
190
|
+
(0, mocha_1.it)('should set nonce', () => {
|
|
191
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
192
|
+
builder.nonce(42);
|
|
193
|
+
assert_1.default.strictEqual(builder._nonce, 42);
|
|
194
|
+
});
|
|
195
|
+
(0, mocha_1.it)('should throw error for negative nonce', () => {
|
|
196
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
197
|
+
assert_1.default.throws(() => {
|
|
198
|
+
builder.nonce(-1);
|
|
199
|
+
}, /Invalid nonce/);
|
|
200
|
+
});
|
|
201
|
+
(0, mocha_1.it)('should set gas limit', () => {
|
|
202
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
203
|
+
builder.gas(500000n);
|
|
204
|
+
assert_1.default.strictEqual(builder._gas, 500000n);
|
|
205
|
+
});
|
|
206
|
+
(0, mocha_1.it)('should set gas limit from string', () => {
|
|
207
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
208
|
+
builder.gas('500000');
|
|
209
|
+
assert_1.default.strictEqual(builder._gas, 500000n);
|
|
210
|
+
});
|
|
211
|
+
(0, mocha_1.it)('should throw error for invalid gas limit', () => {
|
|
212
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
213
|
+
assert_1.default.throws(() => {
|
|
214
|
+
builder.gas(0n);
|
|
215
|
+
}, /Invalid gas limit/);
|
|
216
|
+
});
|
|
217
|
+
(0, mocha_1.it)('should set maxFeePerGas', () => {
|
|
218
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
219
|
+
builder.maxFeePerGas(1000000000n);
|
|
220
|
+
assert_1.default.strictEqual(builder._maxFeePerGas, 1000000000n);
|
|
221
|
+
});
|
|
222
|
+
(0, mocha_1.it)('should set maxPriorityFeePerGas', () => {
|
|
223
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
224
|
+
builder.maxPriorityFeePerGas(500000000n);
|
|
225
|
+
assert_1.default.strictEqual(builder._maxPriorityFeePerGas, 500000000n);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
(0, mocha_1.describe)('Method chaining', () => {
|
|
229
|
+
(0, mocha_1.it)('should support fluent interface', () => {
|
|
230
|
+
const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
|
|
231
|
+
const result = builder
|
|
232
|
+
.addOperation({
|
|
233
|
+
token: mockToken,
|
|
234
|
+
to: mockRecipient,
|
|
235
|
+
amount: '100',
|
|
236
|
+
memo: '9999',
|
|
237
|
+
})
|
|
238
|
+
.feeToken(mockFeeToken)
|
|
239
|
+
.nonce(10)
|
|
240
|
+
.gas(400000n)
|
|
241
|
+
.maxFeePerGas(2000000000n)
|
|
242
|
+
.maxPriorityFeePerGas(1000000000n);
|
|
243
|
+
assert_1.default.strictEqual(result, builder);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
(0, mocha_1.describe)('TIP-20 Constants', () => {
|
|
248
|
+
(0, mocha_1.it)('should have correct decimal places', () => {
|
|
249
|
+
assert_1.default.strictEqual(constants_1.TIP20_DECIMALS, 6);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixpQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLHlFQUEyRTtBQUMzRSwrQ0FNNkI7QUFDN0IsdURBQXlEO0FBQ3pELGlEQUE0QztBQUU1QyxNQUFNLGNBQWMsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTNDLElBQUEsZ0JBQVEsRUFBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsSUFBQSxnQkFBUSxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxJQUFBLFVBQUUsRUFBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzFELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxTQUFTLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGdCQUFRLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLElBQUEsVUFBRSxFQUFD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QUFNLE1BQU0sR0FBRyxPQUFPO2lCQUNuQixZQUFZLENBQUM7Z0JBQ1osS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLEVBQUUsRUFBRSxhQUFhO2dCQUNqQixNQUFNLEVBQUUsS0FBSztnQkFDYixJQUFJLEVBQUUsTUFBTTthQUNiLENBQUM7aUJBQ0QsUUFBUSxDQUFDLFlBQVksQ0FBQztpQkFDdEIsS0FBSyxDQUFDLEVBQUUsQ0FBQztpQkFDVCxHQUFHLENBQUMsT0FBTyxDQUFDO2lCQUNaLFlBQVksQ0FBQyxXQUFXLENBQUM7aUJBQ3pCLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXJDLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGdCQUFRLEVBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUEsVUFBRSxFQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM1QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQywwQkFBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBhbW91bnRUb1RpcDIwVW5pdHMsXG4gIHRpcDIwVW5pdHNUb0Ftb3VudCxcbiAgc3RyaW5nVG9CeXRlczMyLFxuICBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8sXG4gIGlzVmFsaWRUaXAyMEFtb3VudCxcbn0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUSVAyMF9ERUNJTUFMUyB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5cbmNvbnN0IG1vY2tDb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0dGVtcG8nKTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBVdGlsaXRpZXMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdhbW91bnRUb1RpcDIwVW5pdHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGRlY2ltYWwgYW1vdW50IHRvIDYtZGVjaW1hbCB1bml0cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhbW91bnRUb1RpcDIwVW5pdHMoJzEuNScpLCAxNTAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcxMDAnKSwgMTAwMDAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcwLjAwMDAwMScpLCAxbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYW1vdW50VG9UaXAyMFVuaXRzKCdpbnZhbGlkJyksIC9JbnZhbGlkIGFtb3VudCBmb3JtYXQvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RpcDIwVW5pdHNUb0Ftb3VudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgNi1kZWNpbWFsIHVuaXRzIHRvIGh1bWFuLXJlYWRhYmxlIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aXAyMFVuaXRzVG9BbW91bnQoMTUwMDAwMG4pLCAnMS41Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGlwMjBVbml0c1RvQW1vdW50KDEwMDAwMDAwMG4pLCAnMTAwLjAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aXAyMFVuaXRzVG9BbW91bnQoMW4pLCAnMC4wMDAwMDEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmluZ1RvQnl0ZXMzMicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgc3RyaW5nIHRvIGJ5dGVzMzInLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdHJpbmdUb0J5dGVzMzIoJzEyMzQ1Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIHJlc3VsdCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5sZW5ndGgsIDY2KTtcbiAgICAgIGFzc2VydC5vayhyZXN1bHQuc3RhcnRzV2l0aCgnMHgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBzdHJpbmcgbG9uZ2VyIHRoYW4gMzIgYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBsb25nU3RyaW5nID0gJ2EnLnJlcGVhdCgzMyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHN0cmluZ1RvQnl0ZXMzMihsb25nU3RyaW5nKSwgL01lbW8gdG9vIGxvbmcvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVuY29kZSB0cmFuc2ZlcldpdGhNZW1vIGNhbGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0byA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweDc0MmQzNWNjNjYzNGMwNTMyOTI1YTNiODQ0YmM5ZTc1OTVmMGJlYjEnKTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDE1MDAwMDBuO1xuICAgICAgY29uc3QgbWVtbyA9ICcxMjM0NSc7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8odG8sIGFtb3VudCwgbWVtbyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGVuY29kZWQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5vayhlbmNvZGVkLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgICAgYXNzZXJ0Lm9rKGVuY29kZWQubGVuZ3RoID4gMTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgdHJhbnNmZXJXaXRoTWVtbyB3aXRob3V0IG1lbW8nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0byA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweDc0MmQzNWNjNjYzNGMwNTMyOTI1YTNiODQ0YmM5ZTc1OTVmMGJlYjEnKTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDE1MDAwMDBuO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVGlwMjBUcmFuc2ZlcldpdGhNZW1vKHRvLCBhbW91bnQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBlbmNvZGVkLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQub2soZW5jb2RlZC5zdGFydHNXaXRoKCcweCcpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRUaXAyMEFtb3VudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgYW1vdW50cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJzEuNScpLCB0cnVlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJzEwMCcpLCB0cnVlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJzAuMDAwMDAxJyksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbnZhbGlkYXRlIGluY29ycmVjdCBhbW91bnRzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRUaXAyMEFtb3VudCgnaW52YWxpZCcpLCBmYWxzZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcnKSwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRUaXAyMEFtb3VudCgnLTUnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnVElQLTIwIFRyYW5zYWN0aW9uIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IG1vY2tUb2tlbiA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnKTtcbiAgY29uc3QgbW9ja1JlY2lwaWVudCA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweDc0MmQzNWNjNjYzNGMwNTMyOTI1YTNiODQ0YmM5ZTc1OTVmMGJlYjEnKTtcbiAgY29uc3QgbW9ja0ZlZVRva2VuID0gZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoJzB4YWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZCcpO1xuXG4gIGRlc2NyaWJlKCdhZGRPcGVyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBzaW5nbGUgb3BlcmF0aW9uIHdpdGhvdXQgbWVtbycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICBhbW91bnQ6ICcxMDAuNScsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGJ1aWxkZXIuZ2V0T3BlcmF0aW9ucygpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLnRva2VuLCBtb2NrVG9rZW4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnNbMF0udG8sIG1vY2tSZWNpcGllbnQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnNbMF0uYW1vdW50LCAnMTAwLjUnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLm1lbW8sIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBhIHNpbmdsZSBvcGVyYXRpb24gd2l0aCBtZW1vJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGJ1aWxkZXIuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgIGFtb3VudDogJzEwMC41JyxcbiAgICAgICAgbWVtbzogJzIwMjUwMScsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGJ1aWxkZXIuZ2V0T3BlcmF0aW9ucygpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLm1lbW8sICcyMDI1MDEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIG11bHRpcGxlIG9wZXJhdGlvbnMgKGJhdGNoKScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnNTAuMCcsXG4gICAgICAgICAgbWVtbzogJzEwMDEnLFxuICAgICAgICB9KVxuICAgICAgICAuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICAgIGFtb3VudDogJzMwLjAnLFxuICAgICAgICAgIG1lbW86ICcxMDAyJyxcbiAgICAgICAgfSlcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6ICcyMC4wJyxcbiAgICAgICAgICBtZW1vOiAnMTAwMycsXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcGVyYXRpb25zID0gYnVpbGRlci5nZXRPcGVyYXRpb25zKCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9ucy5sZW5ndGgsIDMpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnNbMF0ubWVtbywgJzEwMDEnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzFdLm1lbW8sICcxMDAyJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1syXS5tZW1vLCAnMTAwMycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCB0b2tlbiBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46ICcweGludmFsaWQnIGFzIGFueSxcbiAgICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICB9KTtcbiAgICAgIH0sIC9JbnZhbGlkIHRva2VuIGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICAgIHRvOiAnMHhpbnZhbGlkJyBhcyBhbnksXG4gICAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgfSk7XG4gICAgICB9LCAvSW52YWxpZCByZWNpcGllbnQgYWRkcmVzcy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICAgIGFtb3VudDogJ2ludmFsaWQtYW1vdW50JyxcbiAgICAgICAgfSk7XG4gICAgICB9LCAvSW52YWxpZCBhbW91bnQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1lbW8gbG9uZ2VyIHRoYW4gMzIgYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGNvbnN0IGxvbmdNZW1vID0gJ2EnLnJlcGVhdCgzMyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICAgIG1lbW86IGxvbmdNZW1vLFxuICAgICAgICB9KTtcbiAgICAgIH0sIC9NZW1vIHRvbyBsb25nLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmZWVUb2tlbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCBmZWUgdG9rZW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYnVpbGRlci5mZWVUb2tlbihtb2NrRmVlVG9rZW4pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlci5nZXRGZWVUb2tlbigpLCBtb2NrRmVlVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBmZWUgdG9rZW4gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5mZWVUb2tlbignaW52YWxpZC1hZGRyZXNzJyk7XG4gICAgICB9LCAvSW52YWxpZCBmZWUgdG9rZW4gYWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gcGFyYW1ldGVycycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCBub25jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5ub25jZSg0Mik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbm9uY2UsIDQyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG5lZ2F0aXZlIG5vbmNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5ub25jZSgtMSk7XG4gICAgICB9LCAvSW52YWxpZCBub25jZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgZ2FzIGxpbWl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyLmdhcyg1MDAwMDBuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9nYXMsIDUwMDAwMG4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgZ2FzIGxpbWl0IGZyb20gc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyLmdhcygnNTAwMDAwJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fZ2FzLCA1MDAwMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgZ2FzIGxpbWl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5nYXMoMG4pO1xuICAgICAgfSwgL0ludmFsaWQgZ2FzIGxpbWl0Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBtYXhGZWVQZXJHYXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXIubWF4RmVlUGVyR2FzKDEwMDAwMDAwMDBuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tYXhGZWVQZXJHYXMsIDEwMDAwMDAwMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG1heFByaW9yaXR5RmVlUGVyR2FzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyLm1heFByaW9yaXR5RmVlUGVyR2FzKDUwMDAwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX21heFByaW9yaXR5RmVlUGVyR2FzLCA1MDAwMDAwMDBuKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01ldGhvZCBjaGFpbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgZmx1ZW50IGludGVyZmFjZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgICBtZW1vOiAnOTk5OScsXG4gICAgICAgIH0pXG4gICAgICAgIC5mZWVUb2tlbihtb2NrRmVlVG9rZW4pXG4gICAgICAgIC5ub25jZSgxMClcbiAgICAgICAgLmdhcyg0MDAwMDBuKVxuICAgICAgICAubWF4RmVlUGVyR2FzKDIwMDAwMDAwMDBuKVxuICAgICAgICAubWF4UHJpb3JpdHlGZWVQZXJHYXMoMTAwMDAwMDAwMG4pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBDb25zdGFudHMnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IGRlY2ltYWwgcGxhY2VzJywgKCkgPT4ge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChUSVAyMF9ERUNJTUFMUywgNik7XG4gIH0pO1xufSk7XG4iXX0=
|
package/dist/test/unit/utils.js
CHANGED
|
@@ -3,12 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ethers_1 = require("ethers");
|
|
6
7
|
const utils_1 = __importDefault(require("../../src/lib/utils"));
|
|
7
8
|
describe('Tempo Utils', function () {
|
|
8
9
|
describe('Address Validation', function () {
|
|
9
10
|
it('should validate a valid address', function () {
|
|
10
|
-
//
|
|
11
|
-
const validAddress = '
|
|
11
|
+
// Valid checksummed Ethereum-style address
|
|
12
|
+
const validAddress = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
|
|
12
13
|
utils_1.default.isValidAddress(validAddress).should.be.true();
|
|
13
14
|
});
|
|
14
15
|
it('should invalidate an invalid address', function () {
|
|
@@ -23,7 +24,7 @@ describe('Tempo Utils', function () {
|
|
|
23
24
|
it('should validate a valid public key', function () {
|
|
24
25
|
// TODO: Add valid public key examples for Tempo
|
|
25
26
|
const validPubKey = '0'.repeat(64);
|
|
26
|
-
utils_1.default.isValidPublicKey(validPubKey).should.be.
|
|
27
|
+
utils_1.default.isValidPublicKey(validPubKey).should.be.false();
|
|
27
28
|
});
|
|
28
29
|
it('should invalidate an invalid public key', function () {
|
|
29
30
|
const invalidPubKey = 'notahexstring';
|
|
@@ -37,7 +38,7 @@ describe('Tempo Utils', function () {
|
|
|
37
38
|
describe('Private Key Validation', function () {
|
|
38
39
|
it('should validate a valid private key', function () {
|
|
39
40
|
const validPrvKey = '0'.repeat(64);
|
|
40
|
-
utils_1.default.isValidPrivateKey(validPrvKey).should.be.
|
|
41
|
+
utils_1.default.isValidPrivateKey(validPrvKey).should.be.false();
|
|
41
42
|
});
|
|
42
43
|
it('should invalidate an invalid private key', function () {
|
|
43
44
|
const invalidPrvKey = 'notahexstring';
|
|
@@ -49,4 +50,4 @@ describe('Tempo Utils', function () {
|
|
|
49
50
|
});
|
|
50
51
|
});
|
|
51
52
|
});
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBZ0M7QUFDaEMsZ0VBQXdDO0FBRXhDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1FBQzdCLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtZQUNwQywyQ0FBMkM7WUFDM0MsTUFBTSxZQUFZLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUMzRixlQUFLLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDO1lBQ3JDLGVBQUssQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtZQUN2QyxlQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtRQUNoQyxFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsZ0RBQWdEO1lBQ2hELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsZUFBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDO1lBQ3RDLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxlQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsd0JBQXdCLEVBQUU7UUFDakMsRUFBRSxDQUFDLHFDQUFxQyxFQUFFO1lBQ3hDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsZUFBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDO1lBQ3RDLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1lBQ3RELE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxlQUFLLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmRlc2NyaWJlKCdUZW1wbyBVdGlscycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ0FkZHJlc3MgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgdmFsaWQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFZhbGlkIGNoZWNrc3VtbWVkIEV0aGVyZXVtLXN0eWxlIGFkZHJlc3NcbiAgICAgIGNvbnN0IHZhbGlkQWRkcmVzcyA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweDc0MmQzNWNjNjYzNGMwNTMyOTI1YTNiODQ0YmM5ZTc1OTVmMGJlYjEnKTtcbiAgICAgIHV0aWxzLmlzVmFsaWRBZGRyZXNzKHZhbGlkQWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSBhbiBpbnZhbGlkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9ICdpbnZhbGlkIUAjJCc7XG4gICAgICB1dGlscy5pc1ZhbGlkQWRkcmVzcyhpbnZhbGlkQWRkcmVzcykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGludmFsaWRhdGUgYW4gZW1wdHkgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWxzLmlzVmFsaWRBZGRyZXNzKCcnKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1B1YmxpYyBLZXkgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgdmFsaWQgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRPRE86IEFkZCB2YWxpZCBwdWJsaWMga2V5IGV4YW1wbGVzIGZvciBUZW1wb1xuICAgICAgY29uc3QgdmFsaWRQdWJLZXkgPSAnMCcucmVwZWF0KDY0KTtcbiAgICAgIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkodmFsaWRQdWJLZXkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbnZhbGlkYXRlIGFuIGludmFsaWQgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRQdWJLZXkgPSAnbm90YWhleHN0cmluZyc7XG4gICAgICB1dGlscy5pc1ZhbGlkUHVibGljS2V5KGludmFsaWRQdWJLZXkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbnZhbGlkYXRlIGEgcHVibGljIGtleSB3aXRoIHdyb25nIGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdyb25nTGVuZ3RoUHViS2V5ID0gJzAnLnJlcGVhdCgzMik7XG4gICAgICB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHdyb25nTGVuZ3RoUHViS2V5KS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ByaXZhdGUgS2V5IFZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHZhbGlkIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRQcnZLZXkgPSAnMCcucmVwZWF0KDY0KTtcbiAgICAgIHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KHZhbGlkUHJ2S2V5KS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSBhbiBpbnZhbGlkIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZFBydktleSA9ICdub3RhaGV4c3RyaW5nJztcbiAgICAgIHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KGludmFsaWRQcnZLZXkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbnZhbGlkYXRlIGEgcHJpdmF0ZSBrZXkgd2l0aCB3cm9uZyBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3cm9uZ0xlbmd0aFBydktleSA9ICcwJy5yZXBlYXQoMzIpO1xuICAgICAgdXRpbHMuaXNWYWxpZFByaXZhdGVLZXkod3JvbmdMZW5ndGhQcnZLZXkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|