@bitgo-beta/sdk-coin-vet 1.0.1-beta.66 → 1.0.1-beta.661
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 +28 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +30 -2
- package/dist/src/lib/iface.d.ts +28 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +21 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +44 -2
- package/dist/src/lib/transaction/addressInitializationTransaction.d.ts +31 -0
- package/dist/src/lib/transaction/addressInitializationTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/addressInitializationTransaction.js +170 -0
- package/dist/src/lib/transaction/burnNftTransaction.d.ts +29 -0
- package/dist/src/lib/transaction/burnNftTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/burnNftTransaction.js +138 -0
- package/dist/src/lib/transaction/claimRewards.d.ts +31 -0
- package/dist/src/lib/transaction/claimRewards.d.ts.map +1 -0
- package/dist/src/lib/transaction/claimRewards.js +151 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.d.ts +27 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.js +158 -0
- package/dist/src/lib/transaction/exitDelegation.d.ts +29 -0
- package/dist/src/lib/transaction/exitDelegation.d.ts.map +1 -0
- package/dist/src/lib/transaction/exitDelegation.js +143 -0
- package/dist/src/lib/transaction/flushTokenTransaction.d.ts +20 -0
- package/dist/src/lib/transaction/flushTokenTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/flushTokenTransaction.js +98 -0
- package/dist/src/lib/transaction/nftTransaction.d.ts +17 -0
- package/dist/src/lib/transaction/nftTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/nftTransaction.js +108 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.d.ts +27 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.js +158 -0
- package/dist/src/lib/transaction/stakingTransaction.d.ts +31 -0
- package/dist/src/lib/transaction/stakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/stakingTransaction.js +169 -0
- package/dist/src/lib/transaction/tokenTransaction.d.ts +14 -0
- package/dist/src/lib/transaction/tokenTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/tokenTransaction.js +95 -0
- package/dist/src/lib/transaction/transaction.d.ts +18 -28
- package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction/transaction.js +99 -58
- package/dist/src/lib/transaction/validatorRegistrationTransaction.d.ts +32 -0
- package/dist/src/lib/transaction/validatorRegistrationTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/validatorRegistrationTransaction.js +170 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts +78 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.js +158 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts +59 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.js +118 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts +59 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.js +117 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts +72 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.js +133 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts +59 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.js +118 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts +66 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.js +129 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts +23 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.js +93 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts +73 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.js +146 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts +73 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.js +147 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts +21 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.js +70 -0
- package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts +10 -9
- package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder/transactionBuilder.js +25 -19
- package/dist/src/lib/transactionBuilder/validatorRegistrationBuilder.d.ts +79 -0
- package/dist/src/lib/transactionBuilder/validatorRegistrationBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/validatorRegistrationBuilder.js +150 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +55 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +124 -1
- package/dist/src/lib/types.d.ts +21 -0
- package/dist/src/lib/types.d.ts.map +1 -1
- package/dist/src/lib/types.js +1 -1
- package/dist/src/lib/utils.d.ts +102 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +277 -8
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/vet.d.ts +94 -3
- package/dist/src/vet.d.ts.map +1 -1
- package/dist/src/vet.js +505 -10
- package/dist/src/vetNFTCollection.d.ts +18 -0
- package/dist/src/vetNFTCollection.d.ts.map +1 -0
- package/dist/src/vetNFTCollection.js +52 -0
- package/dist/src/vetToken.d.ts +1 -1
- package/dist/src/vetToken.d.ts.map +1 -1
- package/dist/src/vetToken.js +2 -2
- package/dist/test/resources/vet.d.ts +88 -0
- package/dist/test/resources/vet.d.ts.map +1 -0
- package/dist/test/resources/vet.js +143 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.js +141 -0
- package/dist/test/transactionBuilder/burnNftBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/burnNftBuilder.js +150 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.js +183 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.js +209 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.js +150 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.js +132 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.js +242 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.js +247 -0
- package/dist/test/transactionBuilder/stakingTransaction.d.ts +2 -0
- package/dist/test/transactionBuilder/stakingTransaction.d.ts.map +1 -0
- package/dist/test/transactionBuilder/stakingTransaction.js +250 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.js +249 -0
- package/dist/test/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/transferBuilder.js +244 -0
- package/dist/test/transactionBuilder/validatorRegistrationTxnBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/validatorRegistrationTxnBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/validatorRegistrationTxnBuilder.js +231 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +181 -0
- package/dist/test/unit/stakingFlowE2E.d.ts +2 -0
- package/dist/test/unit/stakingFlowE2E.d.ts.map +1 -0
- package/dist/test/unit/stakingFlowE2E.js +292 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +106 -0
- package/dist/test/unit/vet.d.ts +2 -0
- package/dist/test/unit/vet.d.ts.map +1 -0
- package/dist/test/unit/vet.js +336 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -10
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -40
|
@@ -0,0 +1,106 @@
|
|
|
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_1 = __importDefault(require("should"));
|
|
40
|
+
const testData = __importStar(require("../resources/vet"));
|
|
41
|
+
const utils_1 = __importDefault(require("../../src/lib/utils"));
|
|
42
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
43
|
+
describe('Vechain util library', function () {
|
|
44
|
+
describe('isValidAddress', function () {
|
|
45
|
+
it('should succeed to validate raw transactoin', function () {
|
|
46
|
+
for (const address of testData.addresses.validAddresses) {
|
|
47
|
+
should_1.default.equal(utils_1.default.isValidAddress(address), true);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
it('should fail to validate invalid addresses', function () {
|
|
51
|
+
for (const address of testData.addresses.invalidAddresses) {
|
|
52
|
+
should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(address));
|
|
53
|
+
should_1.default.equal(utils_1.default.isValidAddress(address), false);
|
|
54
|
+
}
|
|
55
|
+
// @ts-expect-error Testing for missing param, should not throw an error
|
|
56
|
+
should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(undefined));
|
|
57
|
+
// @ts-expect-error Testing for missing param, should return false
|
|
58
|
+
should_1.default.equal(utils_1.default.isValidAddress(undefined), false);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('isValidBlockId', function () {
|
|
62
|
+
it('should succeed to validate valid block IDs', function () {
|
|
63
|
+
for (const blockId of testData.blockIds.validBlockIds) {
|
|
64
|
+
should_1.default.equal(utils_1.default.isValidBlockId(blockId), true);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
it('should fail to validate invalid block IDs', function () {
|
|
68
|
+
for (const blockId of testData.blockIds.invalidBlockIds) {
|
|
69
|
+
should_1.default.doesNotThrow(() => utils_1.default.isValidBlockId(blockId));
|
|
70
|
+
should_1.default.equal(utils_1.default.isValidBlockId(blockId), false);
|
|
71
|
+
}
|
|
72
|
+
// @ts-expect-error Testing for missing param, should not throw an error
|
|
73
|
+
should_1.default.doesNotThrow(() => utils_1.default.isValidBlockId(undefined));
|
|
74
|
+
// @ts-expect-error Testing for missing param, should return false
|
|
75
|
+
should_1.default.equal(utils_1.default.isValidBlockId(undefined), false);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('isValidDeserialize', function () {
|
|
79
|
+
it('should succeed to correctly deserialize sponsored signed serialized transaction', function () {
|
|
80
|
+
const signedTxn = utils_1.default.deserializeTransaction(testData.SPONSORED_TRANSACTION);
|
|
81
|
+
should_1.default.equal(signedTxn.origin.toString().toLowerCase(), '0x7ca00e3bc8a836026c2917c6c7c6d049e52099dd');
|
|
82
|
+
should_1.default.equal(signedTxn.gasPayer.toString().toLowerCase(), '0xdc9fef0b84a0ccf3f1bd4b84e41743e3e051a083');
|
|
83
|
+
});
|
|
84
|
+
it('should succeed to correctly deserialize unsigned serialized transaction', function () {
|
|
85
|
+
const signedTxn = utils_1.default.deserializeTransaction(testData.UNSIGNED_TRANSACTION);
|
|
86
|
+
should_1.default.equal(signedTxn.isSigned, false);
|
|
87
|
+
should_1.default.equal(signedTxn.body.gas, 21000);
|
|
88
|
+
should_1.default.equal(signedTxn.body.nonce, 400496);
|
|
89
|
+
should_1.default.equal(signedTxn.body.expiration, 64);
|
|
90
|
+
should_1.default.equal(signedTxn.body.blockRef, '0x01536ce9e9fb0638');
|
|
91
|
+
});
|
|
92
|
+
it('should fail to deserialize an invalid serialized transaction', function () {
|
|
93
|
+
should_1.default.throws(() => utils_1.default.deserializeTransaction(testData.INVALID_TRANSACTION));
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
it('should get correct transaction type from clause', function () {
|
|
97
|
+
should_1.default.equal(sdk_core_1.TransactionType.Send, utils_1.default.getTransactionTypeFromClause(testData.TRANSFER_CLAUSE));
|
|
98
|
+
});
|
|
99
|
+
it('is valid public key', function () {
|
|
100
|
+
// with 0x prefix
|
|
101
|
+
should_1.default.equal(false, utils_1.default.isValidPublicKey('0x9b4e96086d111500259f9b38680b0509a405c1904da18976455a20c691d3bb07'));
|
|
102
|
+
// without 0x prefix
|
|
103
|
+
should_1.default.equal(true, utils_1.default.isValidPublicKey('029831d82c36a58a69b31177b73d852e260a37769561450dab6ed234d5d965ef0b'));
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsMkRBQTZDO0FBQzdDLGdFQUF3QztBQUN4QyxtREFBdUQ7QUFFdkQsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCx3RUFBd0U7WUFDeEUsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNELGtFQUFrRTtZQUNsRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFD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SyxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFCQUFxQixFQUFFO1FBQ3hCLGlCQUFpQjtRQUNqQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsZUFBSyxDQUFDLGdCQUFnQixDQUFDLG9FQUFvRSxDQUFDLENBQUMsQ0FBQztRQUNsSCxvQkFBb0I7UUFDcEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDLENBQUM7SUFDbkgsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFZldFRyYW5zYWN0aW9uIH0gZnJvbSAnQHZlY2hhaW4vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3ZldCc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmRlc2NyaWJlKCdWZWNoYWluIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSByYXcgdHJhbnNhY3RvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdGVzdERhdGEuYWRkcmVzc2VzLmludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBtaXNzaW5nIHBhcmFtLCBzaG91bGQgbm90IHRocm93IGFuIGVycm9yXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCkpO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBtaXNzaW5nIHBhcmFtLCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEJsb2NrSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIHZhbGlkIGJsb2NrIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgYmxvY2tJZCBvZiB0ZXN0RGF0YS5ibG9ja0lkcy52YWxpZEJsb2NrSWRzKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQmxvY2tJZChibG9ja0lkKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCBibG9jayBJRHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGJsb2NrSWQgb2YgdGVzdERhdGEuYmxvY2tJZHMuaW52YWxpZEJsb2NrSWRzKSB7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEJsb2NrSWQoYmxvY2tJZCkpO1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoYmxvY2tJZCksIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvclxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5pc1ZhbGlkQmxvY2tJZCh1bmRlZmluZWQpKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKHVuZGVmaW5lZCksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWREZXNlcmlhbGl6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gY29ycmVjdGx5IGRlc2VyaWFsaXplIHNwb25zb3JlZCBzaWduZWQgc2VyaWFsaXplZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4bjogVmV0VHJhbnNhY3Rpb24gPSB1dGlscy5kZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHRlc3REYXRhLlNQT05TT1JFRF9UUkFOU0FDVElPTik7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHhuLm9yaWdpbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksICcweDdjYTAwZTNiYzhhODM2MDI2YzI5MTdjNmM3YzZkMDQ5ZTUyMDk5ZGQnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeG4uZ2FzUGF5ZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLCAnMHhkYzlmZWYwYjg0YTBjY2YzZjFiZDRiODRlNDE3NDNlM2UwNTFhMDgzJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGNvcnJlY3RseSBkZXNlcmlhbGl6ZSB1bnNpZ25lZCBzZXJpYWxpemVkIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmVkVHhuOiBWZXRUcmFuc2FjdGlvbiA9IHV0aWxzLmRlc2VyaWFsaXplVHJhbnNhY3Rpb24odGVzdERhdGEuVU5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5pc1NpZ25lZCwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5ib2R5LmdhcywgMjEwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5ib2R5Lm5vbmNlLCA0MDA0OTYpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5ib2R5LmV4cGlyYXRpb24sIDY0KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeG4uYm9keS5ibG9ja1JlZiwgJzB4MDE1MzZjZTllOWZiMDYzOCcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byBkZXNlcmlhbGl6ZSBhbiBpbnZhbGlkIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHV0aWxzLmRlc2VyaWFsaXplVHJhbnNhY3Rpb24odGVzdERhdGEuSU5WQUxJRF9UUkFOU0FDVElPTikpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdldCBjb3JyZWN0IHRyYW5zYWN0aW9uIHR5cGUgZnJvbSBjbGF1c2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kLCB1dGlscy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tQ2xhdXNlKHRlc3REYXRhLlRSQU5TRkVSX0NMQVVTRSkpO1xuICB9KTtcblxuICBpdCgnaXMgdmFsaWQgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyB3aXRoIDB4IHByZWZpeFxuICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSgnMHg5YjRlOTYwODZkMTExNTAwMjU5ZjliMzg2ODBiMDUwOWE0MDVjMTkwNGRhMTg5NzY0NTVhMjBjNjkxZDNiYjA3JykpO1xuICAgIC8vIHdpdGhvdXQgMHggcHJlZml4XG4gICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJzAyOTgzMWQ4MmMzNmE1OGE2OWIzMTE3N2I3M2Q4NTJlMjYwYTM3NzY5NTYxNDUwZGFiNmVkMjM0ZDVkOTY1ZWYwYicpKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vet.d.ts","sourceRoot":"","sources":["../../../test/unit/vet.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,336 @@
|
|
|
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_1 = __importDefault(require("sinon"));
|
|
40
|
+
const assert_1 = __importDefault(require("assert"));
|
|
41
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
42
|
+
const should_1 = __importDefault(require("should"));
|
|
43
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
44
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
45
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
46
|
+
const src_1 = require("../../src");
|
|
47
|
+
const testData = __importStar(require("../resources/vet"));
|
|
48
|
+
describe('Vechain', function () {
|
|
49
|
+
let bitgo;
|
|
50
|
+
let basecoin;
|
|
51
|
+
let newTxPrebuild;
|
|
52
|
+
let newTxParams;
|
|
53
|
+
const txPreBuild = {
|
|
54
|
+
txHex: testData.SPONSORED_TRANSACTION,
|
|
55
|
+
txInfo: {},
|
|
56
|
+
};
|
|
57
|
+
const txParams = {
|
|
58
|
+
recipients: testData.recipients,
|
|
59
|
+
};
|
|
60
|
+
before(function () {
|
|
61
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
|
|
62
|
+
bitgo.safeRegister('vet', src_1.Vet.createInstance);
|
|
63
|
+
bitgo.safeRegister('tvet', src_1.Tvet.createInstance);
|
|
64
|
+
bitgo.initializeTestVars();
|
|
65
|
+
basecoin = bitgo.coin('tvet');
|
|
66
|
+
newTxPrebuild = () => {
|
|
67
|
+
return lodash_1.default.cloneDeep(txPreBuild);
|
|
68
|
+
};
|
|
69
|
+
newTxParams = () => {
|
|
70
|
+
return lodash_1.default.cloneDeep(txParams);
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
it('should return the right info', function () {
|
|
74
|
+
const vet = bitgo.coin('vet');
|
|
75
|
+
const tvet = bitgo.coin('tvet');
|
|
76
|
+
const vetStatics = statics_1.coins.get('vet');
|
|
77
|
+
const tvetStatics = statics_1.coins.get('tvet');
|
|
78
|
+
vet.getChain().should.equal('vet');
|
|
79
|
+
vet.getFamily().should.equal('vet');
|
|
80
|
+
vet.getFullName().should.equal('VeChain');
|
|
81
|
+
vet.getBaseFactor().should.equal(1e18);
|
|
82
|
+
tvet.getChain().should.equal('tvet');
|
|
83
|
+
tvet.getFamily().should.equal('vet');
|
|
84
|
+
tvet.getFullName().should.equal('Testnet VeChain');
|
|
85
|
+
tvet.getBaseFactor().should.equal(1e18);
|
|
86
|
+
vetStatics.gasTankLowBalanceAlertFactor.should.equal(80);
|
|
87
|
+
tvetStatics.gasTankLowBalanceAlertFactor.should.equal(80);
|
|
88
|
+
vetStatics.gasTankMinBalanceRecommendationFactor.should.equal(200);
|
|
89
|
+
tvetStatics.gasTankMinBalanceRecommendationFactor.should.equal(200);
|
|
90
|
+
});
|
|
91
|
+
it('should validate address', function () {
|
|
92
|
+
const vet = bitgo.coin('vet');
|
|
93
|
+
vet.isValidAddress('wrongaddress').should.false();
|
|
94
|
+
vet.isValidAddress('25bcb8855effa9f12a23c2f7f34f2d92b5841f19').should.false();
|
|
95
|
+
vet.isValidAddress('0x7Ca00e3bC8a836026C2917C6c7c6D049E52099dd').should.true();
|
|
96
|
+
vet.isValidAddress('0x690fFcefa92876C772E85d4B5963807C2152e08d').should.true();
|
|
97
|
+
vet.isValidAddress('0xe59F1cea4e0FEf511e3d0f4EEc44ADf19C4cbeEC').should.true();
|
|
98
|
+
});
|
|
99
|
+
it('is valid pub', function () {
|
|
100
|
+
// with 0x prefix
|
|
101
|
+
basecoin.isValidPub('0x9b4e96086d111500259f9b38680b0509a405c1904da18976455a20c691d3bb07').should.equal(false);
|
|
102
|
+
// without 0x prefix
|
|
103
|
+
basecoin.isValidPub('027c10f30d5c874cee3d193a321c82926d905998cb4852880935da4ee1820bd7d5').should.equal(true);
|
|
104
|
+
});
|
|
105
|
+
describe('Verify transaction: ', () => {
|
|
106
|
+
it('should succeed to verify transaction', async function () {
|
|
107
|
+
const txPrebuild = newTxPrebuild();
|
|
108
|
+
const txParams = newTxParams();
|
|
109
|
+
const verification = {};
|
|
110
|
+
const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
|
|
111
|
+
isTransactionVerified.should.equal(true);
|
|
112
|
+
});
|
|
113
|
+
it('should succeed to verify transaction when recipients amount are numbers', async function () {
|
|
114
|
+
const txPrebuild = newTxPrebuild();
|
|
115
|
+
const txParamsWithNumberAmounts = newTxParams();
|
|
116
|
+
txParamsWithNumberAmounts.recipients = txParamsWithNumberAmounts.recipients.map(({ address, amount }) => {
|
|
117
|
+
return { address, amount: Number(amount) };
|
|
118
|
+
});
|
|
119
|
+
const verification = {};
|
|
120
|
+
const isTransactionVerified = await basecoin.verifyTransaction({
|
|
121
|
+
txParams: txParamsWithNumberAmounts,
|
|
122
|
+
txPrebuild,
|
|
123
|
+
verification,
|
|
124
|
+
});
|
|
125
|
+
isTransactionVerified.should.equal(true);
|
|
126
|
+
});
|
|
127
|
+
it('should fail to verify transaction with invalid param', async function () {
|
|
128
|
+
const txPrebuild = {};
|
|
129
|
+
const txParams = newTxParams();
|
|
130
|
+
txParams.recipients = undefined;
|
|
131
|
+
await basecoin
|
|
132
|
+
.verifyTransaction({
|
|
133
|
+
txParams,
|
|
134
|
+
txPrebuild,
|
|
135
|
+
})
|
|
136
|
+
.should.rejectedWith('missing required tx prebuild property txHex');
|
|
137
|
+
});
|
|
138
|
+
it('should build correct nft transfer data', function () {
|
|
139
|
+
const data = basecoin.buildNftTransferData({
|
|
140
|
+
fromAddress: testData.addresses.validAddresses[0],
|
|
141
|
+
recipientAddress: testData.addresses.validAddresses[1],
|
|
142
|
+
type: 'ERC721',
|
|
143
|
+
tokenId: '1234',
|
|
144
|
+
tokenContractAddress: testData.NFT_CONTRACT_ADDRESS,
|
|
145
|
+
});
|
|
146
|
+
data.should.deepEqual({
|
|
147
|
+
tokenType: 'ERC721',
|
|
148
|
+
tokenQuantity: '1',
|
|
149
|
+
tokenContractAddress: '0x887d9102f0003f1724d8fd5d4fe95a11572fcd77',
|
|
150
|
+
tokenId: '1234',
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
it('should build throw invalid address error', function () {
|
|
154
|
+
(0, should_1.default)(() => basecoin.buildNftTransferData({
|
|
155
|
+
fromAddress: testData.addresses.validAddresses[0],
|
|
156
|
+
recipientAddress: testData.addresses.invalidAddresses[0],
|
|
157
|
+
type: 'ERC721',
|
|
158
|
+
tokenId: '1234',
|
|
159
|
+
tokenContractAddress: testData.NFT_CONTRACT_ADDRESS,
|
|
160
|
+
})).throwError('Invalid recipient address');
|
|
161
|
+
(0, should_1.default)(() => basecoin.buildNftTransferData({
|
|
162
|
+
fromAddress: testData.addresses.invalidAddresses[0],
|
|
163
|
+
recipientAddress: testData.addresses.validAddresses[0],
|
|
164
|
+
type: 'ERC721',
|
|
165
|
+
tokenId: '1234',
|
|
166
|
+
tokenContractAddress: testData.NFT_CONTRACT_ADDRESS,
|
|
167
|
+
})).throwError('Invalid from address');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('Parse and Explain Transactions: ', () => {
|
|
171
|
+
const transferInputsResponse = [
|
|
172
|
+
{
|
|
173
|
+
address: testData.addresses.validAddresses[0],
|
|
174
|
+
amount: testData.AMOUNT.toString(),
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
const transferOutputsResponse = [
|
|
178
|
+
{
|
|
179
|
+
address: testData.recipients[0].address,
|
|
180
|
+
amount: testData.recipients[0].amount,
|
|
181
|
+
},
|
|
182
|
+
];
|
|
183
|
+
it('should parse a transfer transaction', async function () {
|
|
184
|
+
const parsedTransaction = await basecoin.parseTransaction({
|
|
185
|
+
txHex: testData.SPONSORED_TRANSACTION,
|
|
186
|
+
});
|
|
187
|
+
parsedTransaction.should.deepEqual({
|
|
188
|
+
inputs: transferInputsResponse,
|
|
189
|
+
outputs: transferOutputsResponse,
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
it('should explain a transfer transaction', async function () {
|
|
193
|
+
const rawTx = newTxPrebuild().txHex;
|
|
194
|
+
const transaction = new src_1.Transaction(statics_1.coins.get('tvet'));
|
|
195
|
+
transaction.fromRawTransaction(rawTx);
|
|
196
|
+
const explainedTx = transaction.explainTransaction();
|
|
197
|
+
explainedTx.should.deepEqual({
|
|
198
|
+
displayOrder: [
|
|
199
|
+
'id',
|
|
200
|
+
'outputs',
|
|
201
|
+
'outputAmount',
|
|
202
|
+
'changeOutputs',
|
|
203
|
+
'changeAmount',
|
|
204
|
+
'fee',
|
|
205
|
+
'withdrawAmount',
|
|
206
|
+
'sender',
|
|
207
|
+
'type',
|
|
208
|
+
],
|
|
209
|
+
id: '0x6d842d5dc5d59d4e8f0a8ec2757b430d1f19c06766fbc5b3db5ebac8a067a439',
|
|
210
|
+
outputs: [
|
|
211
|
+
{
|
|
212
|
+
address: '0xe59f1cea4e0fef511e3d0f4eec44adf19c4cbeec',
|
|
213
|
+
amount: '100000000000000000',
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
outputAmount: '100000000000000000',
|
|
217
|
+
changeOutputs: [],
|
|
218
|
+
changeAmount: '0',
|
|
219
|
+
fee: { fee: '315411764705882352' },
|
|
220
|
+
sender: '0x7ca00e3bc8a836026c2917c6c7c6d049e52099dd',
|
|
221
|
+
type: 0,
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
it('should fail to explain a invalid raw transaction', async function () {
|
|
225
|
+
const rawTx = 'invalidRawTransaction';
|
|
226
|
+
const transaction = new src_1.Transaction(statics_1.coins.get('tvet'));
|
|
227
|
+
await assert_1.default.rejects(async () => transaction.fromRawTransaction(rawTx), {
|
|
228
|
+
message: 'invalid raw transaction',
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
|
|
232
|
+
const stub = sinon_1.default.stub(src_1.Vet.prototype, 'explainTransaction');
|
|
233
|
+
stub.resolves(undefined);
|
|
234
|
+
await basecoin
|
|
235
|
+
.parseTransaction({ txHex: testData.INVALID_TRANSACTION })
|
|
236
|
+
.should.be.rejectedWith('Invalid transaction');
|
|
237
|
+
stub.restore();
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe('address validation', () => {
|
|
241
|
+
it('should return true when validating a well formatted address prefixed with 0x', async function () {
|
|
242
|
+
const address = testData.addresses.validAddresses[0];
|
|
243
|
+
basecoin.isValidAddress(address).should.equal(true);
|
|
244
|
+
});
|
|
245
|
+
it('should return false when validating an incorrectly formatted', async function () {
|
|
246
|
+
const address = 'wrongaddress';
|
|
247
|
+
basecoin.isValidAddress(address).should.equal(false);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('address verification', () => {
|
|
251
|
+
const testData = {
|
|
252
|
+
walletVersion: 6,
|
|
253
|
+
commonKeychain: '02fad451e7d1a536897ded5f803a73cc7309a403cf43bb25bda494b9800efe32999b6b71b6159eccf1244492556b733f68733a23c184bf40bc37c52da5ad29e575',
|
|
254
|
+
baseAddress: '0x8420429aa50b7f6ab196c4ce0dcf629fdbb821a1',
|
|
255
|
+
feeAddress: '0x33f9d3172de8a88e47b399562e51fa9cde0f2511',
|
|
256
|
+
depositAddress: '0x26b88c0a103d185792a9597580c2c5170d93f410',
|
|
257
|
+
depositIndex: 3,
|
|
258
|
+
forwarderVersion: 5,
|
|
259
|
+
};
|
|
260
|
+
it('should verify a valid TSS base address (wallet version 6)', async function () {
|
|
261
|
+
const params = {
|
|
262
|
+
address: testData.baseAddress,
|
|
263
|
+
baseAddress: testData.baseAddress,
|
|
264
|
+
keychains: [
|
|
265
|
+
{ commonKeychain: testData.commonKeychain },
|
|
266
|
+
{ commonKeychain: testData.commonKeychain },
|
|
267
|
+
{ commonKeychain: testData.commonKeychain },
|
|
268
|
+
],
|
|
269
|
+
index: 0,
|
|
270
|
+
walletVersion: testData.walletVersion,
|
|
271
|
+
coinSpecific: {
|
|
272
|
+
feeAddress: testData.feeAddress,
|
|
273
|
+
forwarderVersion: testData.forwarderVersion,
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
const result = await basecoin.isWalletAddress(params);
|
|
277
|
+
result.should.equal(true);
|
|
278
|
+
});
|
|
279
|
+
it('should fail to verify a invalid TSS base address (wallet version 6)', async function () {
|
|
280
|
+
const params = {
|
|
281
|
+
address: '0x8420429aa50b7f6ab196c4ce0dcf629fdbb821a0',
|
|
282
|
+
baseAddress: testData.baseAddress,
|
|
283
|
+
keychains: [
|
|
284
|
+
{ commonKeychain: testData.commonKeychain },
|
|
285
|
+
{ commonKeychain: testData.commonKeychain },
|
|
286
|
+
{ commonKeychain: testData.commonKeychain },
|
|
287
|
+
],
|
|
288
|
+
index: 0,
|
|
289
|
+
walletVersion: testData.walletVersion,
|
|
290
|
+
coinSpecific: {
|
|
291
|
+
feeAddress: testData.feeAddress,
|
|
292
|
+
forwarderVersion: testData.forwarderVersion,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
await basecoin.isWalletAddress(params).should.be.rejected();
|
|
296
|
+
});
|
|
297
|
+
it('should verify a valid TSS deposit address (wallet version 6)', async function () {
|
|
298
|
+
const params = {
|
|
299
|
+
address: testData.depositAddress,
|
|
300
|
+
baseAddress: testData.baseAddress,
|
|
301
|
+
keychains: [
|
|
302
|
+
{ commonKeychain: testData.commonKeychain },
|
|
303
|
+
{ commonKeychain: testData.commonKeychain },
|
|
304
|
+
{ commonKeychain: testData.commonKeychain },
|
|
305
|
+
],
|
|
306
|
+
index: testData.depositIndex,
|
|
307
|
+
walletVersion: testData.walletVersion,
|
|
308
|
+
coinSpecific: {
|
|
309
|
+
feeAddress: testData.feeAddress,
|
|
310
|
+
forwarderVersion: testData.forwarderVersion,
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
const result = await basecoin.isWalletAddress(params);
|
|
314
|
+
result.should.equal(true);
|
|
315
|
+
});
|
|
316
|
+
it('should fail to verify a invalid TSS deposit address (wallet version 6)', async function () {
|
|
317
|
+
const params = {
|
|
318
|
+
address: '0x26b88c0a103d185792a9597580c2c5170d93f411',
|
|
319
|
+
baseAddress: testData.baseAddress,
|
|
320
|
+
keychains: [
|
|
321
|
+
{ commonKeychain: testData.commonKeychain },
|
|
322
|
+
{ commonKeychain: testData.commonKeychain },
|
|
323
|
+
{ commonKeychain: testData.commonKeychain },
|
|
324
|
+
],
|
|
325
|
+
index: testData.depositIndex,
|
|
326
|
+
walletVersion: testData.walletVersion,
|
|
327
|
+
coinSpecific: {
|
|
328
|
+
feeAddress: testData.feeAddress,
|
|
329
|
+
forwarderVersion: testData.forwarderVersion,
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
await basecoin.isWalletAddress(params).should.be.rejected();
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3ZldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQixvREFBNEI7QUFDNUIsb0RBQXVCO0FBQ3ZCLG9EQUE0QjtBQUM1QixpREFBK0M7QUFDL0MsbURBQStEO0FBQy9ELGlEQUFnRTtBQUNoRSxtQ0FBbUQ7QUFDbkQsMkRBQTZDO0FBRTdDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7SUFDbEIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxhQUFhLENBQUM7SUFDbEIsSUFBSSxXQUFXLENBQUM7SUFFaEIsTUFBTSxVQUFVLEdBQUc7UUFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxxQkFBcUI7UUFDckMsTUFBTSxFQUFFLEVBQUU7S0FDWCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUc7UUFDZixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7S0FDaEMsQ0FBQztJQUVGLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixhQUFhLEdBQUcsR0FBRyxFQUFFO1lBQ25CLE9BQU8sZ0JBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMs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L0IsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtpQkFDNUM7YUFDRixDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdFQUF3RSxFQUFFLEtBQUs7WUFDaEYsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsT0FBTyxFQUFFLDRDQUE0QztnQkFDckQsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO2dCQUNqQyxTQUFTLEVBQUU7b0JBQ1QsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtvQkFDM0MsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtvQkFDM0MsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtpQkFDNUM7Z0JBQ0QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZO2dCQUM1QixhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7Z0JBQ3JDLFlBQVksRUFBRTtvQkFDWixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7b0JBQy9CLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxnQkFBZ0I7aUJBQzVDO2FBQ0YsQ0FBQztZQUVGLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgY29pbnMsIEdhc1RhbmtBY2NvdW50Q29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVmV0LCBUdmV0LCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvdmV0JztcblxuZGVzY3JpYmUoJ1ZlY2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW47XG4gIGxldCBuZXdUeFByZWJ1aWxkO1xuICBsZXQgbmV3VHhQYXJhbXM7XG5cbiAgY29uc3QgdHhQcmVCdWlsZCA9IHtcbiAgICB0eEhleDogdGVzdERhdGEuU1BPTlNPUkVEX1RSQU5TQUNUSU9OLFxuICAgIHR4SW5mbzoge30sXG4gIH07XG5cbiAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgcmVjaXBpZW50czogdGVzdERhdGEucmVjaXBpZW50cyxcbiAgfTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndmV0JywgVmV0LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3R2ZXQnLCBUdmV0LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3R2ZXQnKTtcbiAgICBuZXdUeFByZWJ1aWxkID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKHR4UHJlQnVpbGQpO1xuICAgIH07XG4gICAgbmV3VHhQYXJhbXMgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXMpO1xuICAgIH07XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByaWdodCBpbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZldCA9IGJpdGdvLmNvaW4oJ3ZldCcpO1xuICAgIGNvbnN0IHR2ZXQgPSBiaXRnby5jb2luKCd0dmV0Jyk7XG4gICAgY29uc3QgdmV0U3RhdGljcyA9IGNvaW5zLmdldCgndmV0JykgYXMgR2FzVGFua0FjY291bnRDb2luO1xuICAgIGNvbnN0IHR2ZXRTdGF0aWNzID0gY29pbnMuZ2V0KCd0dmV0JykgYXMgR2FzVGFua0FjY291bnRDb2luO1xuXG4gICAgdmV0LmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd2ZXQnKTtcbiAgICB2ZXQuZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCd2ZXQnKTtcbiAgICB2ZXQuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1ZlQ2hhaW4nKTtcbiAgICB2ZXQuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcblxuICAgIHR2ZXQuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R2ZXQnKTtcbiAgICB0dmV0LmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgndmV0Jyk7XG4gICAgdHZldC5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBWZUNoYWluJyk7XG4gICAgdHZldC5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlMTgpO1xuXG4gICAgdmV0U3RhdGljcy5nYXNUYW5rTG93QmFsYW5jZUFsZXJ0RmFjdG9yLnNob3VsZC5lcXVhbCg4MCk7XG4gICAgdHZldFN0YXRpY3MuZ2FzVGFua0xvd0JhbGFuY2VBbGVydEZhY3Rvci5zaG91bGQuZXF1YWwoODApO1xuICAgIHZldFN0YXRpY3MuZ2FzVGFua01pbkJhbGFuY2VSZWNvbW1lbmRhdGlvbkZhY3Rvci5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICB0dmV0U3RhdGljcy5nYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yLnNob3VsZC5lcXVhbCgyMDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdmV0ID0gYml0Z28uY29pbigndmV0Jyk7XG4gICAgdmV0LmlzVmFsaWRBZGRyZXNzKCd3cm9uZ2FkZHJlc3MnKS5zaG91bGQuZmFsc2UoKTtcbiAgICB2ZXQuaXNWYWxpZEFkZHJlc3MoJzI1YmNiODg1NWVmZmE5ZjEyYTIzYzJmN2YzNGYyZDkyYjU4NDFmMTknKS5zaG91bGQuZmFsc2UoKTtcbiAgICB2ZXQuaXNWYWxpZEFkZHJlc3MoJzB4N0NhMDBlM2JDOGE4MzYwMjZDMjkxN0M2YzdjNkQwNDlFNTIwOTlkZCcpLnNob3VsZC50cnVlKCk7XG4gICAgdmV0LmlzVmFsaWRBZGRyZXNzKCcweDY5MGZGY2VmYTkyODc2Qzc3MkU4NWQ0QjU5NjM4MDdDMjE1MmUwOGQnKS5zaG91bGQudHJ1ZSgpO1xuICAgIHZldC5pc1ZhbGlkQWRkcmVzcygnMHhlNTlGMWNlYTRlMEZFZjUxMWUzZDBmNEVFYzQ0QURmMTlDNGNiZUVDJykuc2hvdWxkLnRydWUoKTtcbiAgfSk7XG5cbiAgaXQoJ2lzIHZhbGlkIHB1YicsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyB3aXRoIDB4IHByZWZpeFxuICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIoJzB4OWI0ZTk2MDg2ZDExMTUwMDI1OWY5YjM4NjgwYjA1MDlhNDA1YzE5MDRkYTE4OTc2NDU1YTIwYzY5MWQzYmIwNycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgLy8gd2l0aG91dCAweCBwcmVmaXhcbiAgICBiYXNlY29pbi5pc1ZhbGlkUHViKCcwMjdjMTBmMzBkNWM4NzRjZWUzZDE5M2EzMjFjODI5MjZkOTA1OTk4Y2I0ODUyODgwOTM1ZGE0ZWUxODIwYmQ3ZDUnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnkgdHJhbnNhY3Rpb246ICcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgdmVyaWZpY2F0aW9uIH0pO1xuICAgICAgaXNUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2hlbiByZWNpcGllbnRzIGFtb3VudCBhcmUgbnVtYmVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMucmVjaXBpZW50cyA9IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMucmVjaXBpZW50cy5tYXAoKHsgYWRkcmVzcywgYW1vdW50IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgYWRkcmVzcywgYW1vdW50OiBOdW1iZXIoYW1vdW50KSB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25WZXJpZmllZCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaXNUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHBhcmFtJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXMucmVjaXBpZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgY29ycmVjdCBuZnQgdHJhbnNmZXIgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBiYXNlY29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgIGZyb21BZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgIHJlY2lwaWVudEFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1sxXSxcbiAgICAgICAgdHlwZTogJ0VSQzcyMScsXG4gICAgICAgIHRva2VuSWQ6ICcxMjM0JyxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgfSk7XG4gICAgICBkYXRhLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0b2tlblR5cGU6ICdFUkM3MjEnLFxuICAgICAgICB0b2tlblF1YW50aXR5OiAnMScsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiAnMHg4ODdkOTEwMmYwMDAzZjE3MjRkOGZkNWQ0ZmU5NWExMTU3MmZjZDc3JyxcbiAgICAgICAgdG9rZW5JZDogJzEyMzQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRocm93IGludmFsaWQgYWRkcmVzcyBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICBiYXNlY29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgZnJvbUFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSxcbiAgICAgICAgICByZWNpcGllbnRBZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3Nlc1swXSxcbiAgICAgICAgICB0eXBlOiAnRVJDNzIxJyxcbiAgICAgICAgICB0b2tlbklkOiAnMTIzNCcsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKCdJbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzJyk7XG5cbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICBiYXNlY29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgZnJvbUFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy5pbnZhbGlkQWRkcmVzc2VzWzBdLFxuICAgICAgICAgIHJlY2lwaWVudEFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSxcbiAgICAgICAgICB0eXBlOiAnRVJDNzIxJyxcbiAgICAgICAgICB0b2tlbklkOiAnMTIzNCcsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKCdJbnZhbGlkIGZyb20gYWRkcmVzcycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgYW5kIEV4cGxhaW4gVHJhbnNhY3Rpb25zOiAnLCAoKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmZXJJbnB1dHNSZXNwb25zZSA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLkFNT1VOVC50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgdHJhbnNmZXJPdXRwdXRzUmVzcG9uc2UgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4ucGFyc2VUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5TUE9OU09SRURfVFJBTlNBQ1RJT04sXG4gICAgICB9KTtcblxuICAgICAgcGFyc2VkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGlucHV0czogdHJhbnNmZXJJbnB1dHNSZXNwb25zZSxcbiAgICAgICAgb3V0cHV0czogdHJhbnNmZXJPdXRwdXRzUmVzcG9uc2UsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmF3VHggPSBuZXdUeFByZWJ1aWxkKCkudHhIZXg7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R2ZXQnKSk7XG4gICAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHggPSB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFR4LnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ3dpdGhkcmF3QW1vdW50JyxcbiAgICAgICAgICAnc2VuZGVyJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnMHg2ZDg0MmQ1ZGM1ZDU5ZDRlOGYwYThlYzI3NTdiNDMwZDFmMTljMDY3NjZmYmM1YjNkYjVlYmFjOGEwNjdhNDM5JyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcweGU1OWYxY2VhNGUwZmVmNTExZTNkMGY0ZWVjNDRhZGYxOWM0Y2JlZWMnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6ICczMTU0MTE3NjQ3MDU4ODIzNTInIH0sXG4gICAgICAgIHNlbmRlcjogJzB4N2NhMDBlM2JjOGE4MzYwMjZjMjkxN2M2YzdjNmQwNDllNTIwOTlkZCcsXG4gICAgICAgIHR5cGU6IDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIGEgaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByYXdUeCA9ICdpbnZhbGlkUmF3VHJhbnNhY3Rpb24nO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0dmV0JykpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4gdHJhbnNhY3Rpb24uZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1R4KSwge1xuICAgICAgICBtZXNzYWdlOiAnaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gcGFyc2UgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aGVuIGV4cGxhaW5UcmFuc2FjdGlvbiByZXNwb25zZSBpcyB1bmRlZmluZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YihWZXQucHJvdG90eXBlLCAnZXhwbGFpblRyYW5zYWN0aW9uJyk7XG4gICAgICBzdHViLnJlc29sdmVzKHVuZGVmaW5lZCk7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucGFyc2VUcmFuc2FjdGlvbih7IHR4SGV4OiB0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICBzdHViLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZHJlc3MgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsaWRhdGluZyBhIHdlbGwgZm9ybWF0dGVkIGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAweCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF07XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbGlkYXRpbmcgYW4gaW5jb3JyZWN0bHkgZm9ybWF0dGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICd3cm9uZ2FkZHJlc3MnO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZHJlc3MgdmVyaWZpY2F0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3REYXRhID0ge1xuICAgICAgd2FsbGV0VmVyc2lvbjogNixcbiAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAnMDJmYWQ0NTFlN2QxYTUzNjg5N2RlZDVmODAzYTczY2M3MzA5YTQwM2NmNDNiYjI1YmRhNDk0Yjk4MDBlZmUzMjk5OWI2YjcxYjYxNTllY2NmMTI0NDQ5MjU1NmI3MzNmNjg3MzNhMjNjMTg0YmY0MGJjMzdjNTJkYTVhZDI5ZTU3NScsXG4gICAgICBiYXNlQWRkcmVzczogJzB4ODQyMDQyOWFhNTBiN2Y2YWIxOTZjNGNlMGRjZjYyOWZkYmI4MjFhMScsXG4gICAgICBmZWVBZGRyZXNzOiAnMHgzM2Y5ZDMxNzJkZThhODhlNDdiMzk5NTYyZTUxZmE5Y2RlMGYyNTExJyxcbiAgICAgIGRlcG9zaXRBZGRyZXNzOiAnMHgyNmI4OGMwYTEwM2QxODU3OTJhOTU5NzU4MGMyYzUxNzBkOTNmNDEwJyxcbiAgICAgIGRlcG9zaXRJbmRleDogMyxcbiAgICAgIGZvcndhcmRlclZlcnNpb246IDUsXG4gICAgfTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgdmFsaWQgVFNTIGJhc2UgYWRkcmVzcyAod2FsbGV0IHZlcnNpb24gNiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmJhc2VBZGRyZXNzLFxuICAgICAgICBiYXNlQWRkcmVzczogdGVzdERhdGEuYmFzZUFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogW1xuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICBdLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogdGVzdERhdGEud2FsbGV0VmVyc2lvbixcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgZmVlQWRkcmVzczogdGVzdERhdGEuZmVlQWRkcmVzcyxcbiAgICAgICAgICBmb3J3YXJkZXJWZXJzaW9uOiB0ZXN0RGF0YS5mb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcyk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIGludmFsaWQgVFNTIGJhc2UgYWRkcmVzcyAod2FsbGV0IHZlcnNpb24gNiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3M6ICcweDg0MjA0MjlhYTUwYjdmNmFiMTk2YzRjZTBkY2Y2MjlmZGJiODIxYTAnLFxuICAgICAgICBiYXNlQWRkcmVzczogdGVzdERhdGEuYmFzZUFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogW1xuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICBdLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogdGVzdERhdGEud2FsbGV0VmVyc2lvbixcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgZmVlQWRkcmVzczogdGVzdERhdGEuZmVlQWRkcmVzcyxcbiAgICAgICAgICBmb3J3YXJkZXJWZXJzaW9uOiB0ZXN0RGF0YS5mb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcykuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHZhbGlkIFRTUyBkZXBvc2l0IGFkZHJlc3MgKHdhbGxldCB2ZXJzaW9uIDYpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5kZXBvc2l0QWRkcmVzcyxcbiAgICAgICAgYmFzZUFkZHJlc3M6IHRlc3REYXRhLmJhc2VBZGRyZXNzLFxuICAgICAgICBrZXljaGFpbnM6IFtcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5kZXg6IHRlc3REYXRhLmRlcG9zaXRJbmRleCxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogdGVzdERhdGEud2FsbGV0VmVyc2lvbixcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgZmVlQWRkcmVzczogdGVzdERhdGEuZmVlQWRkcmVzcyxcbiAgICAgICAgICBmb3J3YXJkZXJWZXJzaW9uOiB0ZXN0RGF0YS5mb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcyk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIGludmFsaWQgVFNTIGRlcG9zaXQgYWRkcmVzcyAod2FsbGV0IHZlcnNpb24gNiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3M6ICcweDI2Yjg4YzBhMTAzZDE4NTc5MmE5NTk3NTgwYzJjNTE3MGQ5M2Y0MTEnLFxuICAgICAgICBiYXNlQWRkcmVzczogdGVzdERhdGEuYmFzZUFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogW1xuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICBdLFxuICAgICAgICBpbmRleDogdGVzdERhdGEuZGVwb3NpdEluZGV4LFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiB0ZXN0RGF0YS53YWxsZXRWZXJzaW9uLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICBmZWVBZGRyZXNzOiB0ZXN0RGF0YS5mZWVBZGRyZXNzLFxuICAgICAgICAgIGZvcndhcmRlclZlcnNpb246IHRlc3REYXRhLmZvcndhcmRlclZlcnNpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|