@bitgo-beta/sdk-coin-xdc 1.0.1-beta.142 → 1.0.1-beta.1421

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/lib/XDCValidatorABI.json +431 -0
  5. package/dist/src/lib/index.d.ts +4 -0
  6. package/dist/src/lib/index.d.ts.map +1 -1
  7. package/dist/src/lib/index.js +12 -2
  8. package/dist/src/lib/transactionBuilder.d.ts +24 -2
  9. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  10. package/dist/src/lib/transactionBuilder.js +55 -3
  11. package/dist/src/lib/uploadKycBuilder.d.ts +73 -0
  12. package/dist/src/lib/uploadKycBuilder.d.ts.map +1 -0
  13. package/dist/src/lib/uploadKycBuilder.js +110 -0
  14. package/dist/src/lib/validatorContract.d.ts +136 -0
  15. package/dist/src/lib/validatorContract.d.ts.map +1 -0
  16. package/dist/src/lib/validatorContract.js +62 -0
  17. package/dist/src/lib/xdcKycMessage.d.ts +26 -0
  18. package/dist/src/lib/xdcKycMessage.d.ts.map +1 -0
  19. package/dist/src/lib/xdcKycMessage.js +38 -0
  20. package/dist/src/register.d.ts.map +1 -1
  21. package/dist/src/register.js +5 -1
  22. package/dist/src/xdc.d.ts +2 -1
  23. package/dist/src/xdc.d.ts.map +1 -1
  24. package/dist/src/xdc.js +4 -1
  25. package/dist/src/xdcToken.d.ts +27 -0
  26. package/dist/src/xdcToken.d.ts.map +1 -0
  27. package/dist/src/xdcToken.js +50 -0
  28. package/dist/test/resources.d.ts +45 -0
  29. package/dist/test/resources.d.ts.map +1 -0
  30. package/dist/test/resources.js +107 -0
  31. package/dist/test/unit/getBuilder.d.ts +3 -0
  32. package/dist/test/unit/getBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/getBuilder.js +10 -0
  34. package/dist/test/unit/transactionBuilder/send.d.ts +2 -0
  35. package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
  36. package/dist/test/unit/transactionBuilder/send.js +19 -0
  37. package/dist/test/unit/transactionBuilder/uploadKyc.d.ts +2 -0
  38. package/dist/test/unit/transactionBuilder/uploadKyc.d.ts.map +1 -0
  39. package/dist/test/unit/transactionBuilder/uploadKyc.js +215 -0
  40. package/dist/test/unit/utils.d.ts +2 -0
  41. package/dist/test/unit/utils.d.ts.map +1 -0
  42. package/dist/test/unit/utils.js +27 -0
  43. package/dist/test/unit/xdc.d.ts +2 -0
  44. package/dist/test/unit/xdc.d.ts.map +1 -0
  45. package/dist/test/unit/xdc.js +321 -0
  46. package/dist/test/unit/xdcKycMessage.d.ts +2 -0
  47. package/dist/test/unit/xdcKycMessage.d.ts.map +1 -0
  48. package/dist/test/unit/xdcKycMessage.js +104 -0
  49. package/dist/test/unit/xdcToken.d.ts +2 -0
  50. package/dist/test/unit/xdcToken.d.ts.map +1 -0
  51. package/dist/test/unit/xdcToken.js +189 -0
  52. package/dist/tsconfig.tsbuildinfo +1 -0
  53. package/package.json +17 -11
  54. package/.eslintignore +0 -5
  55. package/.mocharc.yml +0 -8
  56. package/CHANGELOG.md +0 -74
@@ -0,0 +1,321 @@
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
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should = __importStar(require("should"));
40
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
41
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
42
+ const index_1 = require("../../src/index");
43
+ const abstract_eth_1 = require("@bitgo-beta/abstract-eth");
44
+ const resources_1 = require("../resources");
45
+ const nock_1 = __importDefault(require("nock"));
46
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
47
+ const tx_1 = require("@ethereumjs/tx");
48
+ const rlp_1 = require("@ethereumjs/rlp");
49
+ const util_1 = require("@ethereumjs/util");
50
+ const ethereumjs_util_1 = require("ethereumjs-util");
51
+ const getBuilder_1 = require("./getBuilder");
52
+ /** Encode ERC-20 transfer(address,uint256) calldata without ethereumjs-abi. */
53
+ function encodeErc20Transfer(to, amount) {
54
+ const address = to.toLowerCase().replace(/^0x/, '').padStart(64, '0');
55
+ const value = BigInt(amount).toString(16).padStart(64, '0');
56
+ return `0xa9059cbb${address}${value}`;
57
+ }
58
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
59
+ describe('xdc', function () {
60
+ before(function () {
61
+ bitgo.safeRegister('xdc', index_1.Xdc.createInstance);
62
+ bitgo.safeRegister('txdc', index_1.Txdc.createInstance);
63
+ bitgo.initializeTestVars();
64
+ });
65
+ describe('Basic Coin Info', function () {
66
+ it('should return the right info for xdc', function () {
67
+ const xdc = bitgo.coin('xdc');
68
+ xdc.should.be.an.instanceof(index_1.Xdc);
69
+ xdc.getChain().should.equal('xdc');
70
+ xdc.getFamily().should.equal('xdc');
71
+ xdc.getFullName().should.equal('XDC');
72
+ xdc.getBaseFactor().should.equal(1e18);
73
+ xdc.supportsTss().should.equal(true);
74
+ xdc.allowsAccountConsolidations().should.equal(false);
75
+ });
76
+ it('should return the right info for txdc', function () {
77
+ const txdc = bitgo.coin('txdc');
78
+ txdc.should.be.an.instanceof(index_1.Txdc);
79
+ txdc.getChain().should.equal('txdc');
80
+ txdc.getFamily().should.equal('xdc');
81
+ txdc.getFullName().should.equal('Testnet XDC');
82
+ txdc.getBaseFactor().should.equal(1e18);
83
+ txdc.supportsTss().should.equal(true);
84
+ txdc.allowsAccountConsolidations().should.equal(false);
85
+ });
86
+ });
87
+ describe('verifyTssTransaction', function () {
88
+ const recipientAddress = '0x174cfd823af8ce27ed0afee3fcf3c3ba259116be';
89
+ const wrongAddress = '0x7e85bdc27c050e3905ebf4b8e634d9ad6edd0de6';
90
+ const tokenContractAddress = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
91
+ const transferAmount = '1000000000000000000';
92
+ it('should accept a native XDC transfer where txHex matches declared recipient', async function () {
93
+ const coin = bitgo.coin('txdc');
94
+ const txBuilder = (0, getBuilder_1.getBuilder)('txdc');
95
+ txBuilder.type(sdk_core_1.TransactionType.SingleSigSend);
96
+ txBuilder.fee({ fee: '10', gasLimit: '21000' });
97
+ txBuilder.counter(1);
98
+ txBuilder.contract(recipientAddress);
99
+ txBuilder.value(transferAmount);
100
+ const tx = await txBuilder.build();
101
+ const txHex = tx.toBroadcastFormat();
102
+ const wallet = new sdk_core_1.Wallet(bitgo, coin, { coinSpecific: { baseAddress: recipientAddress } });
103
+ const result = await coin.verifyTssTransaction({
104
+ txParams: {
105
+ type: 'transfer',
106
+ recipients: [{ address: recipientAddress, amount: transferAmount }],
107
+ },
108
+ txPrebuild: { txHex, coin: 'txdc', walletId: 'fakeWalletId' },
109
+ wallet,
110
+ });
111
+ result.should.equal(true);
112
+ });
113
+ it('should reject a native XDC transfer when txHex recipient does not match declared recipient', async function () {
114
+ const coin = bitgo.coin('txdc');
115
+ const txBuilder = (0, getBuilder_1.getBuilder)('txdc');
116
+ txBuilder.type(sdk_core_1.TransactionType.SingleSigSend);
117
+ txBuilder.fee({ fee: '10', gasLimit: '21000' });
118
+ txBuilder.counter(1);
119
+ txBuilder.contract(wrongAddress);
120
+ txBuilder.value(transferAmount);
121
+ const tx = await txBuilder.build();
122
+ const txHex = tx.toBroadcastFormat();
123
+ const wallet = new sdk_core_1.Wallet(bitgo, coin, { coinSpecific: { baseAddress: recipientAddress } });
124
+ await coin
125
+ .verifyTssTransaction({
126
+ txParams: {
127
+ type: 'transfer',
128
+ recipients: [{ address: recipientAddress, amount: transferAmount }],
129
+ },
130
+ txPrebuild: { txHex, coin: 'txdc', walletId: 'fakeWalletId' },
131
+ wallet,
132
+ })
133
+ .should.be.rejectedWith('destination address does not match with the recipient address');
134
+ });
135
+ it('should accept an ERC-20 token transfer where calldata matches declared recipient', async function () {
136
+ const coin = bitgo.coin('txdc');
137
+ const erc20TransferData = encodeErc20Transfer(recipientAddress, '10000000');
138
+ const txBuilder = (0, getBuilder_1.getBuilder)('txdc');
139
+ txBuilder.type(sdk_core_1.TransactionType.ContractCall);
140
+ txBuilder.fee({ fee: '10', gasLimit: '60000' });
141
+ txBuilder.counter(1);
142
+ txBuilder.contract(tokenContractAddress);
143
+ txBuilder.data(erc20TransferData);
144
+ const tx = await txBuilder.build();
145
+ const txHex = tx.toBroadcastFormat();
146
+ const wallet = new sdk_core_1.Wallet(bitgo, coin, { coinSpecific: { baseAddress: recipientAddress } });
147
+ const result = await coin.verifyTssTransaction({
148
+ txParams: {
149
+ type: 'transfer',
150
+ recipients: [{ address: recipientAddress, amount: '10000000' }],
151
+ },
152
+ txPrebuild: { txHex, coin: 'txdc', walletId: 'fakeWalletId' },
153
+ wallet,
154
+ });
155
+ result.should.equal(true);
156
+ });
157
+ it('should reject an ERC-20 token transfer when calldata recipient does not match declared recipient', async function () {
158
+ const coin = bitgo.coin('txdc');
159
+ const erc20TransferData = encodeErc20Transfer(wrongAddress, '10000000');
160
+ const txBuilder = (0, getBuilder_1.getBuilder)('txdc');
161
+ txBuilder.type(sdk_core_1.TransactionType.ContractCall);
162
+ txBuilder.fee({ fee: '10', gasLimit: '60000' });
163
+ txBuilder.counter(1);
164
+ txBuilder.contract(tokenContractAddress);
165
+ txBuilder.data(erc20TransferData);
166
+ const tx = await txBuilder.build();
167
+ const txHex = tx.toBroadcastFormat();
168
+ const wallet = new sdk_core_1.Wallet(bitgo, coin, { coinSpecific: { baseAddress: recipientAddress } });
169
+ await coin
170
+ .verifyTssTransaction({
171
+ txParams: {
172
+ type: 'transfer',
173
+ recipients: [{ address: recipientAddress, amount: '10000000' }],
174
+ },
175
+ txPrebuild: { txHex, coin: 'txdc', walletId: 'fakeWalletId' },
176
+ wallet,
177
+ })
178
+ .should.be.rejectedWith('destination address does not match with the recipient address');
179
+ });
180
+ describe('assertSignableConsistency (Gap 2 / WCI-1398)', function () {
181
+ function stripHex(hex) {
182
+ return hex.startsWith('0x') ? hex.slice(2) : hex;
183
+ }
184
+ async function buildSerializedTxHex(address) {
185
+ const txBuilder = (0, getBuilder_1.getBuilder)('txdc');
186
+ txBuilder.type(sdk_core_1.TransactionType.SingleSigSend);
187
+ txBuilder.fee({ fee: '10', gasLimit: '21000' });
188
+ txBuilder.counter(1);
189
+ txBuilder.contract(address);
190
+ txBuilder.value(transferAmount);
191
+ const tx = await txBuilder.build();
192
+ return stripHex(tx.toBroadcastFormat());
193
+ }
194
+ function deriveSignableHex(serializedTxHex, coin) {
195
+ const common = abstract_eth_1.AbstractEthLikeNewCoins.getCustomChainCommon(coin.getChainId());
196
+ const legacyTx = tx_1.Transaction.fromSerializedTx(Buffer.from(serializedTxHex, 'hex'), { common });
197
+ return Buffer.from(rlp_1.RLP.encode((0, ethereumjs_util_1.bufArrToArr)(legacyTx.getMessageToSign(false)))).toString('hex');
198
+ }
199
+ it('should pass when signableHex is consistent with serializedTxHex', async function () {
200
+ const coin = bitgo.coin('txdc');
201
+ const serializedTxHex = await buildSerializedTxHex(recipientAddress);
202
+ const signableHex = deriveSignableHex(serializedTxHex, coin);
203
+ coin.assertSignableConsistency(serializedTxHex, signableHex);
204
+ });
205
+ it('should throw when signableHex does not match serializedTxHex (Gap 2 attack)', async function () {
206
+ const coin = bitgo.coin('txdc');
207
+ const benignSerializedTxHex = await buildSerializedTxHex(recipientAddress);
208
+ const maliciousSerializedTxHex = await buildSerializedTxHex(wrongAddress);
209
+ const tamperedSignableHex = deriveSignableHex(maliciousSerializedTxHex, coin);
210
+ (() => coin.assertSignableConsistency(benignSerializedTxHex, tamperedSignableHex)).should.throw('signableHex is inconsistent with serializedTxHex: possible server tampering');
211
+ });
212
+ it('should reject an EIP-1559 typed tx since XDC is pinned to the petersburg hardfork', function () {
213
+ const coin = bitgo.coin('txdc');
214
+ const typedTx = tx_1.FeeMarketEIP1559Transaction.fromTxData({
215
+ nonce: 1,
216
+ maxFeePerGas: 10,
217
+ maxPriorityFeePerGas: 1,
218
+ gasLimit: 21000,
219
+ to: recipientAddress,
220
+ value: 1000,
221
+ }, { common: abstract_eth_1.AbstractEthLikeNewCoins.getCustomChainCommon(coin.getChainId()) });
222
+ (() => coin.assertSignableConsistency(stripHex(typedTx.serialize().toString('hex')), '')).should.throw(/EIP-1559 not enabled on Common/);
223
+ });
224
+ });
225
+ });
226
+ });
227
+ describe('Build Unsigned Sweep for Self-Custody Cold Wallets - (MPCv2)', function () {
228
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
229
+ bitgo.register('txdc', index_1.Txdc.createInstance);
230
+ const explorerUrl = sdk_core_1.common.Environments[bitgo.getEnv()].xdcExplorerBaseUrl;
231
+ const gasPrice = 20000000000;
232
+ const gasLimitValue = 500000;
233
+ const chain_id = 51;
234
+ it('should generate an unsigned sweep without derivation path', async () => {
235
+ (0, nock_1.default)(explorerUrl)
236
+ .get('/api')
237
+ .twice()
238
+ .query(resources_1.mockDataUnsignedSweep.getTxListRequest)
239
+ .reply(200, resources_1.mockDataUnsignedSweep.getTxListResponse);
240
+ (0, nock_1.default)(explorerUrl)
241
+ .get('/api')
242
+ .query(resources_1.mockDataUnsignedSweep.getBalanceRequest)
243
+ .reply(200, resources_1.mockDataUnsignedSweep.getBalanceResponse);
244
+ const baseCoin = bitgo.coin('txdc');
245
+ const transaction = (await baseCoin.recover({
246
+ userKey: resources_1.mockDataUnsignedSweep.userKey,
247
+ backupKey: resources_1.mockDataUnsignedSweep.backupKey,
248
+ walletContractAddress: resources_1.mockDataUnsignedSweep.walletBaseAddress,
249
+ recoveryDestination: resources_1.mockDataUnsignedSweep.recoveryDestination,
250
+ isTss: true,
251
+ gasPrice: gasPrice,
252
+ gasLimit: gasLimitValue,
253
+ replayProtectionOptions: {
254
+ chain: chain_id,
255
+ hardfork: 'petersburg',
256
+ },
257
+ }));
258
+ should.exist(transaction);
259
+ transaction.should.have.property('txRequests');
260
+ transaction.txRequests.length.should.equal(1);
261
+ const txRequest = transaction.txRequests[0];
262
+ txRequest.should.have.property('walletCoin');
263
+ txRequest.walletCoin.should.equal('txdc');
264
+ txRequest.should.have.property('transactions');
265
+ txRequest.transactions.length.should.equal(1);
266
+ const tx = txRequest.transactions[0];
267
+ tx.should.have.property('nonce');
268
+ tx.should.have.property('unsignedTx');
269
+ tx.unsignedTx.should.have.property('serializedTxHex');
270
+ tx.unsignedTx.should.have.property('signableHex');
271
+ tx.unsignedTx.should.have.property('derivationPath');
272
+ tx.unsignedTx.should.have.property('feeInfo');
273
+ tx.unsignedTx.feeInfo?.should.have.property('fee');
274
+ tx.unsignedTx.feeInfo?.should.have.property('feeString');
275
+ tx.unsignedTx.should.have.property('parsedTx');
276
+ tx.unsignedTx.parsedTx?.should.have.property('spendAmount');
277
+ tx.unsignedTx.parsedTx?.should.have.property('outputs');
278
+ });
279
+ });
280
+ describe('Non Bitgo Recovery for Hot Wallets', function () {
281
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
282
+ bitgo.register('txdc', index_1.Txdc.createInstance);
283
+ const explorerUrl = sdk_core_1.common.Environments[bitgo.getEnv()].xdcExplorerBaseUrl;
284
+ const gasPrice = 20000000000;
285
+ const chain_id = 51;
286
+ const gasLimitvalue = 500000;
287
+ it('should generate a signed non-bitgo recovery tx', async () => {
288
+ (0, nock_1.default)(explorerUrl)
289
+ .get('/api')
290
+ .twice()
291
+ .query(resources_1.mockDataNonBitGoRecovery.getTxListRequest)
292
+ .reply(200, resources_1.mockDataNonBitGoRecovery.getTxListResponse);
293
+ (0, nock_1.default)(explorerUrl)
294
+ .get('/api')
295
+ .query(resources_1.mockDataNonBitGoRecovery.getBalanceRequest)
296
+ .reply(200, resources_1.mockDataNonBitGoRecovery.getBalanceResponse);
297
+ const baseCoin = bitgo.coin('txdc');
298
+ const transaction = await baseCoin.recover({
299
+ userKey: resources_1.mockDataNonBitGoRecovery.userKeyData,
300
+ backupKey: resources_1.mockDataNonBitGoRecovery.backupKeyData,
301
+ walletContractAddress: resources_1.mockDataNonBitGoRecovery.walletRootAddress,
302
+ walletPassphrase: resources_1.mockDataNonBitGoRecovery.walletPassphrase,
303
+ recoveryDestination: resources_1.mockDataNonBitGoRecovery.recoveryDestination,
304
+ isTss: true,
305
+ gasPrice: gasPrice,
306
+ gasLimit: gasLimitvalue,
307
+ replayProtectionOptions: {
308
+ chain: chain_id,
309
+ hardfork: 'petersburg',
310
+ },
311
+ });
312
+ should.exist(transaction);
313
+ transaction.should.have.property('id');
314
+ transaction.should.have.property('tx');
315
+ const tx = tx_1.Transaction.fromSerializedTx(Buffer.from((0, util_1.stripHexPrefix)(transaction.tx), 'hex'));
316
+ tx.getSenderAddress().toString().should.equal(resources_1.mockDataNonBitGoRecovery.walletRootAddress);
317
+ const jsonTx = tx.toJSON();
318
+ jsonTx.to?.should.equal(resources_1.mockDataNonBitGoRecovery.recoveryDestination);
319
+ });
320
+ });
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGRjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3hkYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUVqQyxtREFBK0Q7QUFDL0QsaURBQStDO0FBRS9DLDJDQUE0QztBQUM1QywyREFBeUY7QUFDekYsNENBQStFO0FBQy9FLGdEQUF3QjtBQUN4QixtREFBdUU7QUFDdkUsdUNBQTBFO0FBQzFFLHlDQUFzQztBQUN0QywyQ0FBa0Q7QUFDbEQscURBQThDO0FBRzlDLDZDQUEwQztBQUUxQywrRUFBK0U7QUFDL0UsU0FBUyxtQkFBbUIsQ0FBQyxFQUFVLEVBQUUsTUFBYztJQUNyRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1RCxPQUFPLGFBQWEsT0FBTyxHQUFHLEtBQUssRUFBRSxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTFFLFFBQVEsQ0FBQyxLQUFLLEVBQUU7SUFDZCxNQUFNLENBQUM7UUFDTCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxXQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELEtBQUss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Q0FBQyxvQ0FBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuXG5pbXBvcnQgeyBYZGMsIFR4ZGMgfSBmcm9tICcuLi8uLi9zcmMvaW5kZXgnO1xuaW1wb3J0IHsgQWJzdHJhY3RFdGhMaWtlTmV3Q29pbnMsIFVuc2lnbmVkU3dlZXBUeE1QQ3YyIH0gZnJvbSAnQGJpdGdvLWJldGEvYWJzdHJhY3QtZXRoJztcbmltcG9ydCB7IG1vY2tEYXRhVW5zaWduZWRTd2VlcCwgbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5IH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCBub2NrIGZyb20gJ25vY2snO1xuaW1wb3J0IHsgY29tbW9uLCBUcmFuc2FjdGlvblR5cGUsIFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEZlZU1hcmtldEVJUDE1NTlUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdAZXRoZXJldW1qcy90eCc7XG5pbXBvcnQgeyBSTFAgfSBmcm9tICdAZXRoZXJldW1qcy9ybHAnO1xuaW1wb3J0IHsgc3RyaXBIZXhQcmVmaXggfSBmcm9tICdAZXRoZXJldW1qcy91dGlsJztcbmltcG9ydCB7IGJ1ZkFyclRvQXJyIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcblxuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi9nZXRCdWlsZGVyJztcblxuLyoqIEVuY29kZSBFUkMtMjAgdHJhbnNmZXIoYWRkcmVzcyx1aW50MjU2KSBjYWxsZGF0YSB3aXRob3V0IGV0aGVyZXVtanMtYWJpLiAqL1xuZnVuY3Rpb24gZW5jb2RlRXJjMjBUcmFuc2Zlcih0bzogc3RyaW5nLCBhbW91bnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGFkZHJlc3MgPSB0by50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL14weC8sICcnKS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgY29uc3QgdmFsdWUgPSBCaWdJbnQoYW1vdW50KS50b1N0cmluZygxNikucGFkU3RhcnQoNjQsICcwJyk7XG4gIHJldHVybiBgMHhhOTA1OWNiYiR7YWRkcmVzc30ke3ZhbHVlfWA7XG59XG5cbmNvbnN0IGJpdGdvOiBUZXN0Qml0R29BUEkgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG5cbmRlc2NyaWJlKCd4ZGMnLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd4ZGMnLCBYZGMuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHhkYycsIFR4ZGMuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQmFzaWMgQ29pbiBJbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByaWdodCBpbmZvIGZvciB4ZGMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB4ZGMgPSBiaXRnby5jb2luKCd4ZGMnKTtcblxuICAgICAgeGRjLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKFhkYyk7XG4gICAgICB4ZGMuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3hkYycpO1xuICAgICAgeGRjLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgneGRjJyk7XG4gICAgICB4ZGMuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1hEQycpO1xuICAgICAgeGRjLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWUxOCk7XG4gICAgICB4ZGMuc3VwcG9ydHNUc3MoKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB4ZGMuYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByaWdodCBpbmZvIGZvciB0eGRjJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhkYyA9IGJpdGdvLmNvaW4oJ3R4ZGMnKTtcblxuICAgICAgdHhkYy5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUeGRjKTtcbiAgICAgIHR4ZGMuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R4ZGMnKTtcbiAgICAgIHR4ZGMuZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCd4ZGMnKTtcbiAgICAgIHR4ZGMuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQgWERDJyk7XG4gICAgICB0eGRjLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWUxOCk7XG4gICAgICB0eGRjLnN1cHBvcnRzVHNzKCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgdHhkYy5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVyaWZ5VHNzVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9ICcweDE3NGNmZDgyM2FmOGNlMjdlZDBhZmVlM2ZjZjNjM2JhMjU5MTE2YmUnO1xuICAgIGNvbnN0IHdyb25nQWRkcmVzcyA9ICcweDdlODViZGMyN2MwNTBlMzkwNWViZjRiOGU2MzRkOWFkNmVkZDBkZTYnO1xuICAgIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzID0gJzB4YTBiODY5OTFjNjIxOGIzNmMxZDE5ZDRhMmU5ZWIwY2UzNjA2ZWI0OCc7XG4gICAgY29uc3QgdHJhbnNmZXJBbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIG5hdGl2ZSBYREMgdHJhbnNmZXIgd2hlcmUgdHhIZXggbWF0Y2hlcyBkZWNsYXJlZCByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb2luID0gYml0Z28uY29pbigndHhkYycpIGFzIFR4ZGM7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3R4ZGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2luZ2xlU2lnU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAnLCBnYXNMaW1pdDogJzIxMDAwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KHJlY2lwaWVudEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnZhbHVlKHRyYW5zZmVyQW1vdW50KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGNvaW4sIHsgY29pblNwZWNpZmljOiB7IGJhc2VBZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzIH0gfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHNzVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHR5cGU6ICd0cmFuc2ZlcicsXG4gICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcywgYW1vdW50OiB0cmFuc2ZlckFtb3VudCB9XSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXgsIGNvaW46ICd0eGRjJywgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnIH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG5hdGl2ZSBYREMgdHJhbnNmZXIgd2hlbiB0eEhleCByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggZGVjbGFyZWQgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4oJ3R4ZGMnKSBhcyBUeGRjO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0eGRjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNpbmdsZVNpZ1NlbmQpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzEwJywgZ2FzTGltaXQ6ICcyMTAwMCcgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci5jb250cmFjdCh3cm9uZ0FkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnZhbHVlKHRyYW5zZmVyQW1vdW50KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGNvaW4sIHsgY29pblNwZWNpZmljOiB7IGJhc2VBZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzIH0gfSk7XG5cbiAgICAgIGF3YWl0IGNvaW5cbiAgICAgICAgLnZlcmlmeVRzc1RyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgdHlwZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsIGFtb3VudDogdHJhbnNmZXJBbW91bnQgfV0sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCwgY29pbjogJ3R4ZGMnLCB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcgfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZGVzdGluYXRpb24gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNpcGllbnQgYWRkcmVzcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYW4gRVJDLTIwIHRva2VuIHRyYW5zZmVyIHdoZXJlIGNhbGxkYXRhIG1hdGNoZXMgZGVjbGFyZWQgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4oJ3R4ZGMnKSBhcyBUeGRjO1xuXG4gICAgICBjb25zdCBlcmMyMFRyYW5zZmVyRGF0YSA9IGVuY29kZUVyYzIwVHJhbnNmZXIocmVjaXBpZW50QWRkcmVzcywgJzEwMDAwMDAwJyk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3R4ZGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMCcsIGdhc0xpbWl0OiAnNjAwMDAnIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmRhdGEoZXJjMjBUcmFuc2ZlckRhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgY29pbiwgeyBjb2luU3BlY2lmaWM6IHsgYmFzZUFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MgfSB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUc3NUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgdHlwZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLCBhbW91bnQ6ICcxMDAwMDAwMCcgfV0sXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4LCBjb2luOiAndHhkYycsIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gRVJDLTIwIHRva2VuIHRyYW5zZmVyIHdoZW4gY2FsbGRhdGEgcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoIGRlY2xhcmVkIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0eGRjJykgYXMgVHhkYztcblxuICAgICAgY29uc3QgZXJjMjBUcmFuc2ZlckRhdGEgPSBlbmNvZGVFcmMyMFRyYW5zZmVyKHdyb25nQWRkcmVzcywgJzEwMDAwMDAwJyk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3R4ZGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMCcsIGdhc0xpbWl0OiAnNjAwMDAnIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLmRhdGEoZXJjMjBUcmFuc2ZlckRhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgY29pbiwgeyBjb2luU3BlY2lmaWM6IHsgYmFzZUFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MgfSB9KTtcblxuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHNzVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAndHJhbnNmZXInLFxuICAgICAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcywgYW1vdW50OiAnMTAwMDAwMDAnIH1dLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXgsIGNvaW46ICd0eGRjJywgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnIH0gYXMgYW55LFxuICAgICAgICAgIHdhbGxldCxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjaXBpZW50IGFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdhc3NlcnRTaWduYWJsZUNvbnNpc3RlbmN5IChHYXAgMiAvIFdDSS0xMzk4KScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIHN0cmlwSGV4KGhleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGhleC5zdGFydHNXaXRoKCcweCcpID8gaGV4LnNsaWNlKDIpIDogaGV4O1xuICAgICAgfVxuXG4gICAgICBhc3luYyBmdW5jdGlvbiBidWlsZFNlcmlhbGl6ZWRUeEhleChhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0eGRjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2luZ2xlU2lnU2VuZCk7XG4gICAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMCcsIGdhc0xpbWl0OiAnMjEwMDAnIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudmFsdWUodHJhbnNmZXJBbW91bnQpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICByZXR1cm4gc3RyaXBIZXgodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlcml2ZVNpZ25hYmxlSGV4KHNlcmlhbGl6ZWRUeEhleDogc3RyaW5nLCBjb2luOiBUeGRjKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY29tbW9uID0gQWJzdHJhY3RFdGhMaWtlTmV3Q29pbnMuZ2V0Q3VzdG9tQ2hhaW5Db21tb24oY29pbi5nZXRDaGFpbklkKCkpO1xuICAgICAgICBjb25zdCBsZWdhY3lUeCA9IFRyYW5zYWN0aW9uLmZyb21TZXJpYWxpemVkVHgoQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4SGV4LCAnaGV4JyksIHsgY29tbW9uIH0pO1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oUkxQLmVuY29kZShidWZBcnJUb0FycihsZWdhY3lUeC5nZXRNZXNzYWdlVG9TaWduKGZhbHNlKSkpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICB9XG5cbiAgICAgIGl0KCdzaG91bGQgcGFzcyB3aGVuIHNpZ25hYmxlSGV4IGlzIGNvbnNpc3RlbnQgd2l0aCBzZXJpYWxpemVkVHhIZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0eGRjJykgYXMgVHhkYztcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gYXdhaXQgYnVpbGRTZXJpYWxpemVkVHhIZXgocmVjaXBpZW50QWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IHNpZ25hYmxlSGV4ID0gZGVyaXZlU2lnbmFibGVIZXgoc2VyaWFsaXplZFR4SGV4LCBjb2luKTtcbiAgICAgICAgY29pbi5hc3NlcnRTaWduYWJsZUNvbnNpc3RlbmN5KHNlcmlhbGl6ZWRUeEhleCwgc2lnbmFibGVIZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBzaWduYWJsZUhleCBkb2VzIG5vdCBtYXRjaCBzZXJpYWxpemVkVHhIZXggKEdhcCAyIGF0dGFjayknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0eGRjJykgYXMgVHhkYztcbiAgICAgICAgY29uc3QgYmVuaWduU2VyaWFsaXplZFR4SGV4ID0gYXdhaXQgYnVpbGRTZXJpYWxpemVkVHhIZXgocmVjaXBpZW50QWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IG1hbGljaW91c1NlcmlhbGl6ZWRUeEhleCA9IGF3YWl0IGJ1aWxkU2VyaWFsaXplZFR4SGV4KHdyb25nQWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IHRhbXBlcmVkU2lnbmFibGVIZXggPSBkZXJpdmVTaWduYWJsZUhleChtYWxpY2lvdXNTZXJpYWxpemVkVHhIZXgsIGNvaW4pO1xuICAgICAgICAoKCkgPT4gY29pbi5hc3NlcnRTaWduYWJsZUNvbnNpc3RlbmN5KGJlbmlnblNlcmlhbGl6ZWRUeEhleCwgdGFtcGVyZWRTaWduYWJsZUhleCkpLnNob3VsZC50aHJvdyhcbiAgICAgICAgICAnc2lnbmFibGVIZXggaXMgaW5jb25zaXN0ZW50IHdpdGggc2VyaWFsaXplZFR4SGV4OiBwb3NzaWJsZSBzZXJ2ZXIgdGFtcGVyaW5nJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIEVJUC0xNTU5IHR5cGVkIHR4IHNpbmNlIFhEQyBpcyBwaW5uZWQgdG8gdGhlIHBldGVyc2J1cmcgaGFyZGZvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0eGRjJykgYXMgVHhkYztcbiAgICAgICAgY29uc3QgdHlwZWRUeCA9IEZlZU1hcmtldEVJUDE1NTlUcmFuc2FjdGlvbi5mcm9tVHhEYXRhKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5vbmNlOiAxLFxuICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiAxMCxcbiAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxLFxuICAgICAgICAgICAgZ2FzTGltaXQ6IDIxMDAwLFxuICAgICAgICAgICAgdG86IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogMTAwMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgY29tbW9uOiBBYnN0cmFjdEV0aExpa2VOZXdDb2lucy5nZXRDdXN0b21DaGFpbkNvbW1vbihjb2luLmdldENoYWluSWQoKSkgfVxuICAgICAgICApO1xuICAgICAgICAoKCkgPT4gY29pbi5hc3NlcnRTaWduYWJsZUNvbnNpc3RlbmN5KHN0cmlwSGV4KHR5cGVkVHguc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpKSwgJycpKS5zaG91bGQudGhyb3coXG4gICAgICAgICAgL0VJUC0xNTU5IG5vdCBlbmFibGVkIG9uIENvbW1vbi9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnQnVpbGQgVW5zaWduZWQgU3dlZXAgZm9yIFNlbGYtQ3VzdG9keSBDb2xkIFdhbGxldHMgLSAoTVBDdjIpJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgYml0Z28ucmVnaXN0ZXIoJ3R4ZGMnLCBUeGRjLmNyZWF0ZUluc3RhbmNlKTtcbiAgY29uc3QgZXhwbG9yZXJVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS54ZGNFeHBsb3JlckJhc2VVcmwgYXMgc3RyaW5nO1xuICBjb25zdCBnYXNQcmljZSA9IDIwMDAwMDAwMDAwO1xuICBjb25zdCBnYXNMaW1pdFZhbHVlID0gNTAwMDAwO1xuICBjb25zdCBjaGFpbl9pZCA9IDUxO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYW4gdW5zaWduZWQgc3dlZXAgd2l0aG91dCBkZXJpdmF0aW9uIHBhdGgnLCBhc3luYyAoKSA9PiB7XG4gICAgbm9jayhleHBsb3JlclVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnR3aWNlKClcbiAgICAgIC5xdWVyeShtb2NrRGF0YVVuc2lnbmVkU3dlZXAuZ2V0VHhMaXN0UmVxdWVzdClcbiAgICAgIC5yZXBseSgyMDAsIG1vY2tEYXRhVW5zaWduZWRTd2VlcC5nZXRUeExpc3RSZXNwb25zZSk7XG4gICAgbm9jayhleHBsb3JlclVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnF1ZXJ5KG1vY2tEYXRhVW5zaWduZWRTd2VlcC5nZXRCYWxhbmNlUmVxdWVzdClcbiAgICAgIC5yZXBseSgyMDAsIG1vY2tEYXRhVW5zaWduZWRTd2VlcC5nZXRCYWxhbmNlUmVzcG9uc2UpO1xuXG4gICAgY29uc3QgYmFzZUNvaW46IGFueSA9IGJpdGdvLmNvaW4oJ3R4ZGMnKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChhd2FpdCBiYXNlQ29pbi5yZWNvdmVyKHtcbiAgICAgIHVzZXJLZXk6IG1vY2tEYXRhVW5zaWduZWRTd2VlcC51c2VyS2V5LFxuICAgICAgYmFja3VwS2V5OiBtb2NrRGF0YVVuc2lnbmVkU3dlZXAuYmFja3VwS2V5LFxuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBtb2NrRGF0YVVuc2lnbmVkU3dlZXAud2FsbGV0QmFzZUFkZHJlc3MsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBtb2NrRGF0YVVuc2lnbmVkU3dlZXAucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLFxuICAgICAgZ2FzTGltaXQ6IGdhc0xpbWl0VmFsdWUsXG4gICAgICByZXBsYXlQcm90ZWN0aW9uT3B0aW9uczoge1xuICAgICAgICBjaGFpbjogY2hhaW5faWQsXG4gICAgICAgIGhhcmRmb3JrOiAncGV0ZXJzYnVyZycsXG4gICAgICB9LFxuICAgIH0pKSBhcyBVbnNpZ25lZFN3ZWVwVHhNUEN2MjtcbiAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb24pO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eFJlcXVlc3RzJyk7XG4gICAgdHJhbnNhY3Rpb24udHhSZXF1ZXN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIGNvbnN0IHR4UmVxdWVzdCA9IHRyYW5zYWN0aW9uLnR4UmVxdWVzdHNbMF07XG4gICAgdHhSZXF1ZXN0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRDb2luJyk7XG4gICAgdHhSZXF1ZXN0LndhbGxldENvaW4uc2hvdWxkLmVxdWFsKCd0eGRjJyk7XG4gICAgdHhSZXF1ZXN0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICB0eFJlcXVlc3QudHJhbnNhY3Rpb25zLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgY29uc3QgdHggPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdO1xuICAgIHR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdub25jZScpO1xuICAgIHR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCd1bnNpZ25lZFR4Jyk7XG4gICAgdHgudW5zaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc2VyaWFsaXplZFR4SGV4Jyk7XG4gICAgdHgudW5zaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc2lnbmFibGVIZXgnKTtcbiAgICB0eC51bnNpZ25lZFR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdkZXJpdmF0aW9uUGF0aCcpO1xuICAgIHR4LnVuc2lnbmVkVHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZUluZm8nKTtcbiAgICB0eC51bnNpZ25lZFR4LmZlZUluZm8/LnNob3VsZC5oYXZlLnByb3BlcnR5KCdmZWUnKTtcbiAgICB0eC51bnNpZ25lZFR4LmZlZUluZm8/LnNob3VsZC5oYXZlLnByb3BlcnR5KCdmZWVTdHJpbmcnKTtcbiAgICB0eC51bnNpZ25lZFR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYXJzZWRUeCcpO1xuICAgIHR4LnVuc2lnbmVkVHgucGFyc2VkVHg/LnNob3VsZC5oYXZlLnByb3BlcnR5KCdzcGVuZEFtb3VudCcpO1xuICAgIHR4LnVuc2lnbmVkVHgucGFyc2VkVHg/LnNob3VsZC5oYXZlLnByb3BlcnR5KCdvdXRwdXRzJyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdOb24gQml0Z28gUmVjb3ZlcnkgZm9yIEhvdCBXYWxsZXRzJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgYml0Z28ucmVnaXN0ZXIoJ3R4ZGMnLCBUeGRjLmNyZWF0ZUluc3RhbmNlKTtcbiAgY29uc3QgZXhwbG9yZXJVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS54ZGNFeHBsb3JlckJhc2VVcmwgYXMgc3RyaW5nO1xuICBjb25zdCBnYXNQcmljZSA9IDIwMDAwMDAwMDAwO1xuICBjb25zdCBjaGFpbl9pZCA9IDUxO1xuICBjb25zdCBnYXNMaW1pdHZhbHVlID0gNTAwMDAwO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBzaWduZWQgbm9uLWJpdGdvIHJlY292ZXJ5IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgIG5vY2soZXhwbG9yZXJVcmwpXG4gICAgICAuZ2V0KCcvYXBpJylcbiAgICAgIC50d2ljZSgpXG4gICAgICAucXVlcnkobW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LmdldFR4TGlzdFJlcXVlc3QpXG4gICAgICAucmVwbHkoMjAwLCBtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkuZ2V0VHhMaXN0UmVzcG9uc2UpO1xuICAgIG5vY2soZXhwbG9yZXJVcmwpXG4gICAgICAuZ2V0KCcvYXBpJylcbiAgICAgIC5xdWVyeShtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkuZ2V0QmFsYW5jZVJlcXVlc3QpXG4gICAgICAucmVwbHkoMjAwLCBtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkuZ2V0QmFsYW5jZVJlc3BvbnNlKTtcblxuICAgIGNvbnN0IGJhc2VDb2luOiBhbnkgPSBiaXRnby5jb2luKCd0eGRjJyk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlQ29pbi5yZWNvdmVyKHtcbiAgICAgIHVzZXJLZXk6IG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS51c2VyS2V5RGF0YSxcbiAgICAgIGJhY2t1cEtleTogbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LmJhY2t1cEtleURhdGEsXG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS53YWxsZXRSb290QWRkcmVzcyxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LnJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICBpc1RzczogdHJ1ZSxcbiAgICAgIGdhc1ByaWNlOiBnYXNQcmljZSxcbiAgICAgIGdhc0xpbWl0OiBnYXNMaW1pdHZhbHVlLFxuICAgICAgcmVwbGF5UHJvdGVjdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgY2hhaW46IGNoYWluX2lkLFxuICAgICAgICBoYXJkZm9yazogJ3BldGVyc2J1cmcnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb24pO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcpO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eCcpO1xuICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb24uZnJvbVNlcmlhbGl6ZWRUeChCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeCh0cmFuc2FjdGlvbi50eCksICdoZXgnKSk7XG4gICAgdHguZ2V0U2VuZGVyQWRkcmVzcygpLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS53YWxsZXRSb290QWRkcmVzcyk7XG4gICAgY29uc3QganNvblR4ID0gdHgudG9KU09OKCk7XG4gICAganNvblR4LnRvPy5zaG91bGQuZXF1YWwobW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=xdcKycMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdcKycMessage.d.ts","sourceRoot":"","sources":["../../../test/unit/xdcKycMessage.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,104 @@
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
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const sinon = __importStar(require("sinon"));
40
+ require("should");
41
+ const assert_1 = __importDefault(require("assert"));
42
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
43
+ const xdcKycMessage_1 = require("../../src/lib/xdcKycMessage");
44
+ const ACCOUNT = '0xAbCdEf1234567890AbCdEf1234567890AbCdEf12';
45
+ const TIMESTAMP = '2024-01-15T12:00:00.000Z';
46
+ const SIGNATURE = '0xdeadbeef';
47
+ describe('buildXdcKycMessage', function () {
48
+ it('should build the correct format string', function () {
49
+ const result = (0, xdcKycMessage_1.buildXdcKycMessage)({ account: ACCOUNT, timestamp: TIMESTAMP });
50
+ result.should.equal(`[XDCmaster KYC ${TIMESTAMP}] Upload KYC for ${ACCOUNT}`);
51
+ });
52
+ it('should produce different strings for different timestamps', function () {
53
+ const result1 = (0, xdcKycMessage_1.buildXdcKycMessage)({ account: ACCOUNT, timestamp: '2024-01-15T12:00:00.000Z' });
54
+ const result2 = (0, xdcKycMessage_1.buildXdcKycMessage)({ account: ACCOUNT, timestamp: '2024-01-16T12:00:00.000Z' });
55
+ result1.should.not.equal(result2);
56
+ });
57
+ });
58
+ describe('signXdcKycMessage', function () {
59
+ let wallet;
60
+ beforeEach(function () {
61
+ wallet = {
62
+ signMessage: sinon.stub(),
63
+ };
64
+ });
65
+ afterEach(function () {
66
+ sinon.restore();
67
+ });
68
+ it('should call wallet.signMessage with correct messageRaw and messageStandardType', async function () {
69
+ wallet.signMessage.resolves({
70
+ txHash: '',
71
+ signature: SIGNATURE,
72
+ messageRaw: '',
73
+ });
74
+ await (0, xdcKycMessage_1.signXdcKycMessage)(wallet, ACCOUNT, 'passphrase');
75
+ sinon.assert.calledOnce(wallet.signMessage);
76
+ const call = wallet.signMessage.getCall(0);
77
+ const params = call.args[0];
78
+ params.walletPassphrase.should.equal('passphrase');
79
+ params.message.messageStandardType.should.equal(sdk_core_1.MessageStandardType.EIP191);
80
+ params.message.messageRaw.should.startWith(`[XDCmaster KYC `);
81
+ params.message.messageRaw.should.containEql(`Upload KYC for ${ACCOUNT}`);
82
+ });
83
+ it('should return kycAccount, kycMessage, and kycSignature mapped correctly', async function () {
84
+ wallet.signMessage.resolves({
85
+ txHash: '',
86
+ signature: SIGNATURE,
87
+ messageRaw: '',
88
+ });
89
+ const result = await (0, xdcKycMessage_1.signXdcKycMessage)(wallet, ACCOUNT, 'passphrase');
90
+ result.kycAccount.should.equal(ACCOUNT);
91
+ result.kycSignature.should.equal(SIGNATURE);
92
+ result.kycMessage.should.startWith('[XDCmaster KYC ');
93
+ result.kycMessage.should.containEql(`Upload KYC for ${ACCOUNT}`);
94
+ // kycMessage must match the messageRaw passed to signMessage
95
+ const passedMessageRaw = wallet.signMessage.getCall(0).args[0].message.messageRaw;
96
+ result.kycMessage.should.equal(passedMessageRaw);
97
+ });
98
+ it('should propagate error if wallet.signMessage throws', async function () {
99
+ const signingError = new Error('TSS signing failed');
100
+ wallet.signMessage.rejects(signingError);
101
+ await assert_1.default.rejects(() => (0, xdcKycMessage_1.signXdcKycMessage)(wallet, ACCOUNT, 'passphrase'), /TSS signing failed/);
102
+ });
103
+ });
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGRjS3ljTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC94ZGNLeWNNZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixvREFBNEI7QUFDNUIsbURBQW9FO0FBQ3BFLCtEQUFvRjtBQUVwRixNQUFNLE9BQU8sR0FBRyw0Q0FBNEMsQ0FBQztBQUM3RCxNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztBQUM3QyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUM7QUFFL0IsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFBLGtDQUFrQixFQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM5RSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsU0FBUyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRTtRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFBLGtDQUFrQixFQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sT0FBTyxHQUFHLElBQUEsa0NBQWtCLEVBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDaEcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFR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LElBQUEsaUNBQWlCLEVBQUMsTUFBNEIsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEVBQzVFLG9CQUFvQixDQUNyQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IElXYWxsZXQsIE1lc3NhZ2VTdGFuZGFyZFR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBidWlsZFhkY0t5Y01lc3NhZ2UsIHNpZ25YZGNLeWNNZXNzYWdlIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi94ZGNLeWNNZXNzYWdlJztcblxuY29uc3QgQUNDT1VOVCA9ICcweEFiQ2RFZjEyMzQ1Njc4OTBBYkNkRWYxMjM0NTY3ODkwQWJDZEVmMTInO1xuY29uc3QgVElNRVNUQU1QID0gJzIwMjQtMDEtMTVUMTI6MDA6MDAuMDAwWic7XG5jb25zdCBTSUdOQVRVUkUgPSAnMHhkZWFkYmVlZic7XG5cbmRlc2NyaWJlKCdidWlsZFhkY0t5Y01lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgYnVpbGQgdGhlIGNvcnJlY3QgZm9ybWF0IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBidWlsZFhkY0t5Y01lc3NhZ2UoeyBhY2NvdW50OiBBQ0NPVU5ULCB0aW1lc3RhbXA6IFRJTUVTVEFNUCB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKGBbWERDbWFzdGVyIEtZQyAke1RJTUVTVEFNUH1dIFVwbG9hZCBLWUMgZm9yICR7QUNDT1VOVH1gKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcm9kdWNlIGRpZmZlcmVudCBzdHJpbmdzIGZvciBkaWZmZXJlbnQgdGltZXN0YW1wcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXN1bHQxID0gYnVpbGRYZGNLeWNNZXNzYWdlKHsgYWNjb3VudDogQUNDT1VOVCwgdGltZXN0YW1wOiAnMjAyNC0wMS0xNVQxMjowMDowMC4wMDBaJyB9KTtcbiAgICBjb25zdCByZXN1bHQyID0gYnVpbGRYZGNLeWNNZXNzYWdlKHsgYWNjb3VudDogQUNDT1VOVCwgdGltZXN0YW1wOiAnMjAyNC0wMS0xNlQxMjowMDowMC4wMDBaJyB9KTtcbiAgICByZXN1bHQxLnNob3VsZC5ub3QuZXF1YWwocmVzdWx0Mik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdzaWduWGRjS3ljTWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogc2lub24uU2lub25TdHViYmVkSW5zdGFuY2U8SVdhbGxldD47XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgd2FsbGV0ID0ge1xuICAgICAgc2lnbk1lc3NhZ2U6IHNpbm9uLnN0dWIoKSxcbiAgICB9IGFzIHVua25vd24gYXMgc2lub24uU2lub25TdHViYmVkSW5zdGFuY2U8SVdhbGxldD47XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGwgd2FsbGV0LnNpZ25NZXNzYWdlIHdpdGggY29ycmVjdCBtZXNzYWdlUmF3IGFuZCBtZXNzYWdlU3RhbmRhcmRUeXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICh3YWxsZXQuc2lnbk1lc3NhZ2UgYXMgc2lub24uU2lub25TdHViKS5yZXNvbHZlcyh7XG4gICAgICB0eEhhc2g6ICcnLFxuICAgICAgc2lnbmF0dXJlOiBTSUdOQVRVUkUsXG4gICAgICBtZXNzYWdlUmF3OiAnJyxcbiAgICB9KTtcblxuICAgIGF3YWl0IHNpZ25YZGNLeWNNZXNzYWdlKHdhbGxldCBhcyB1bmtub3duIGFzIElXYWxsZXQsIEFDQ09VTlQsICdwYXNzcGhyYXNlJyk7XG5cbiAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZSh3YWxsZXQuc2lnbk1lc3NhZ2UgYXMgc2lub24uU2lub25TdHViKTtcbiAgICBjb25zdCBjYWxsID0gKHdhbGxldC5zaWduTWVzc2FnZSBhcyBzaW5vbi5TaW5vblN0dWIpLmdldENhbGwoMCk7XG4gICAgY29uc3QgcGFyYW1zID0gY2FsbC5hcmdzWzBdO1xuICAgIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgncGFzc3BocmFzZScpO1xuICAgIHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUuc2hvdWxkLmVxdWFsKE1lc3NhZ2VTdGFuZGFyZFR5cGUuRUlQMTkxKTtcbiAgICBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3LnNob3VsZC5zdGFydFdpdGgoYFtYRENtYXN0ZXIgS1lDIGApO1xuICAgIHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXcuc2hvdWxkLmNvbnRhaW5FcWwoYFVwbG9hZCBLWUMgZm9yICR7QUNDT1VOVH1gKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4ga3ljQWNjb3VudCwga3ljTWVzc2FnZSwgYW5kIGt5Y1NpZ25hdHVyZSBtYXBwZWQgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICh3YWxsZXQuc2lnbk1lc3NhZ2UgYXMgc2lub24uU2lub25TdHViKS5yZXNvbHZlcyh7XG4gICAgICB0eEhhc2g6ICcnLFxuICAgICAgc2lnbmF0dXJlOiBTSUdOQVRVUkUsXG4gICAgICBtZXNzYWdlUmF3OiAnJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25YZGNLeWNNZXNzYWdlKHdhbGxldCBhcyB1bmtub3duIGFzIElXYWxsZXQsIEFDQ09VTlQsICdwYXNzcGhyYXNlJyk7XG5cbiAgICByZXN1bHQua3ljQWNjb3VudC5zaG91bGQuZXF1YWwoQUNDT1VOVCk7XG4gICAgcmVzdWx0Lmt5Y1NpZ25hdHVyZS5zaG91bGQuZXF1YWwoU0lHTkFUVVJFKTtcbiAgICByZXN1bHQua3ljTWVzc2FnZS5zaG91bGQuc3RhcnRXaXRoKCdbWERDbWFzdGVyIEtZQyAnKTtcbiAgICByZXN1bHQua3ljTWVzc2FnZS5zaG91bGQuY29udGFpbkVxbChgVXBsb2FkIEtZQyBmb3IgJHtBQ0NPVU5UfWApO1xuICAgIC8vIGt5Y01lc3NhZ2UgbXVzdCBtYXRjaCB0aGUgbWVzc2FnZVJhdyBwYXNzZWQgdG8gc2lnbk1lc3NhZ2VcbiAgICBjb25zdCBwYXNzZWRNZXNzYWdlUmF3ID0gKHdhbGxldC5zaWduTWVzc2FnZSBhcyBzaW5vbi5TaW5vblN0dWIpLmdldENhbGwoMCkuYXJnc1swXS5tZXNzYWdlLm1lc3NhZ2VSYXc7XG4gICAgcmVzdWx0Lmt5Y01lc3NhZ2Uuc2hvdWxkLmVxdWFsKHBhc3NlZE1lc3NhZ2VSYXcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByb3BhZ2F0ZSBlcnJvciBpZiB3YWxsZXQuc2lnbk1lc3NhZ2UgdGhyb3dzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNpZ25pbmdFcnJvciA9IG5ldyBFcnJvcignVFNTIHNpZ25pbmcgZmFpbGVkJyk7XG4gICAgKHdhbGxldC5zaWduTWVzc2FnZSBhcyBzaW5vbi5TaW5vblN0dWIpLnJlamVjdHMoc2lnbmluZ0Vycm9yKTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgKCkgPT4gc2lnblhkY0t5Y01lc3NhZ2Uod2FsbGV0IGFzIHVua25vd24gYXMgSVdhbGxldCwgQUNDT1VOVCwgJ3Bhc3NwaHJhc2UnKSxcbiAgICAgIC9UU1Mgc2lnbmluZyBmYWlsZWQvXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=xdcToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdcToken.d.ts","sourceRoot":"","sources":["../../../test/unit/xdcToken.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}