@bitgo-beta/sdk-coin-xdc 1.0.1-beta.89 → 1.0.1-beta.890

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 (50) 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 +2 -0
  6. package/dist/src/lib/index.d.ts.map +1 -1
  7. package/dist/src/lib/index.js +9 -2
  8. package/dist/src/lib/transactionBuilder.d.ts +23 -1
  9. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  10. package/dist/src/lib/transactionBuilder.js +53 -1
  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/register.d.ts.map +1 -1
  18. package/dist/src/register.js +5 -1
  19. package/dist/src/xdc.d.ts +15 -2
  20. package/dist/src/xdc.d.ts.map +1 -1
  21. package/dist/src/xdc.js +32 -1
  22. package/dist/src/xdcToken.d.ts +37 -0
  23. package/dist/src/xdcToken.d.ts.map +1 -0
  24. package/dist/src/xdcToken.js +74 -0
  25. package/dist/test/resources.d.ts +45 -0
  26. package/dist/test/resources.d.ts.map +1 -0
  27. package/dist/test/resources.js +107 -0
  28. package/dist/test/unit/getBuilder.d.ts +3 -0
  29. package/dist/test/unit/getBuilder.d.ts.map +1 -0
  30. package/dist/test/unit/getBuilder.js +10 -0
  31. package/dist/test/unit/transactionBuilder/send.d.ts +2 -0
  32. package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
  33. package/dist/test/unit/transactionBuilder/send.js +19 -0
  34. package/dist/test/unit/transactionBuilder/uploadKyc.d.ts +2 -0
  35. package/dist/test/unit/transactionBuilder/uploadKyc.d.ts.map +1 -0
  36. package/dist/test/unit/transactionBuilder/uploadKyc.js +215 -0
  37. package/dist/test/unit/utils.d.ts +2 -0
  38. package/dist/test/unit/utils.d.ts.map +1 -0
  39. package/dist/test/unit/utils.js +27 -0
  40. package/dist/test/unit/xdc.d.ts +2 -0
  41. package/dist/test/unit/xdc.d.ts.map +1 -0
  42. package/dist/test/unit/xdc.js +172 -0
  43. package/dist/test/unit/xdcToken.d.ts +2 -0
  44. package/dist/test/unit/xdcToken.d.ts.map +1 -0
  45. package/dist/test/unit/xdcToken.js +228 -0
  46. package/dist/tsconfig.tsbuildinfo +1 -0
  47. package/package.json +14 -10
  48. package/.eslintignore +0 -5
  49. package/.mocharc.yml +0 -8
  50. package/CHANGELOG.md +0 -48
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const statics_1 = require("@bitgo-beta/statics");
9
+ const utils_1 = require("../../src/lib/utils");
10
+ describe('Network Common Configuration', () => {
11
+ it('getCommon for mainnet', () => {
12
+ const common = (0, utils_1.getCommon)(statics_1.NetworkType.MAINNET);
13
+ should_1.default.equal(common.chainName(), 'xdc mainnet');
14
+ should_1.default.equal(common.chainIdBN().toString(), '50');
15
+ should_1.default.equal(common.networkIdBN().toString(), '50');
16
+ });
17
+ it('getCommon for testnet', () => {
18
+ const common = (0, utils_1.getCommon)(statics_1.NetworkType.TESTNET);
19
+ should_1.default.equal(common.chainName(), 'xdc testnet');
20
+ should_1.default.equal(common.chainIdBN().toString(), '51');
21
+ should_1.default.equal(common.networkIdBN().toString(), '51');
22
+ });
23
+ it('getCommon for invalid network', () => {
24
+ assert_1.default.throws(() => (0, utils_1.getCommon)('invalidNetwork'), (e) => e.message === 'Missing network common configuration');
25
+ });
26
+ });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGlEQUFrRDtBQUNsRCwrQ0FBZ0Q7QUFFaEQsUUFBUSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtJQUM1QyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQy9CLE1BQU0sTUFBTSxHQUFHLElBQUEsaUJBQVMsRUFBQyxxQkFBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNoRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFBLGlCQUFTLEVBQUMscUJBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsSUFBQSxpQkFBUyxFQUFDLGdCQUErQixDQUFDLEVBQ2hELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLHNDQUFzQyxDQUNqRSxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IE5ldHdvcmtUeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBnZXRDb21tb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ05ldHdvcmsgQ29tbW9uIENvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gIGl0KCdnZXRDb21tb24gZm9yIG1haW5uZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgY29tbW9uID0gZ2V0Q29tbW9uKE5ldHdvcmtUeXBlLk1BSU5ORVQpO1xuICAgIHNob3VsZC5lcXVhbChjb21tb24uY2hhaW5OYW1lKCksICd4ZGMgbWFpbm5ldCcpO1xuICAgIHNob3VsZC5lcXVhbChjb21tb24uY2hhaW5JZEJOKCkudG9TdHJpbmcoKSwgJzUwJyk7XG4gICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5uZXR3b3JrSWRCTigpLnRvU3RyaW5nKCksICc1MCcpO1xuICB9KTtcblxuICBpdCgnZ2V0Q29tbW9uIGZvciB0ZXN0bmV0JywgKCkgPT4ge1xuICAgIGNvbnN0IGNvbW1vbiA9IGdldENvbW1vbihOZXR3b3JrVHlwZS5URVNUTkVUKTtcbiAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluTmFtZSgpLCAneGRjIHRlc3RuZXQnKTtcbiAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluSWRCTigpLnRvU3RyaW5nKCksICc1MScpO1xuICAgIHNob3VsZC5lcXVhbChjb21tb24ubmV0d29ya0lkQk4oKS50b1N0cmluZygpLCAnNTEnKTtcbiAgfSk7XG5cbiAgaXQoJ2dldENvbW1vbiBmb3IgaW52YWxpZCBuZXR3b3JrJywgKCkgPT4ge1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiBnZXRDb21tb24oJ2ludmFsaWROZXR3b3JrJyBhcyBOZXR3b3JrVHlwZSksXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdNaXNzaW5nIG5ldHdvcmsgY29tbW9uIGNvbmZpZ3VyYXRpb24nXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=xdc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdc.d.ts","sourceRoot":"","sources":["../../../test/unit/xdc.ts"],"names":[],"mappings":""}
@@ -0,0 +1,172 @@
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 resources_1 = require("../resources");
44
+ const nock_1 = __importDefault(require("nock"));
45
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
46
+ const tx_1 = require("@ethereumjs/tx");
47
+ const util_1 = require("@ethereumjs/util");
48
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
49
+ describe('xdc', function () {
50
+ before(function () {
51
+ bitgo.safeRegister('xdc', index_1.Xdc.createInstance);
52
+ bitgo.safeRegister('txdc', index_1.Txdc.createInstance);
53
+ bitgo.initializeTestVars();
54
+ });
55
+ describe('Basic Coin Info', function () {
56
+ it('should return the right info for xdc', function () {
57
+ const xdc = bitgo.coin('xdc');
58
+ xdc.should.be.an.instanceof(index_1.Xdc);
59
+ xdc.getChain().should.equal('xdc');
60
+ xdc.getFamily().should.equal('xdc');
61
+ xdc.getFullName().should.equal('XDC');
62
+ xdc.getBaseFactor().should.equal(1e18);
63
+ xdc.supportsTss().should.equal(true);
64
+ xdc.allowsAccountConsolidations().should.equal(false);
65
+ });
66
+ it('should return the right info for txdc', function () {
67
+ const txdc = bitgo.coin('txdc');
68
+ txdc.should.be.an.instanceof(index_1.Txdc);
69
+ txdc.getChain().should.equal('txdc');
70
+ txdc.getFamily().should.equal('xdc');
71
+ txdc.getFullName().should.equal('Testnet XDC');
72
+ txdc.getBaseFactor().should.equal(1e18);
73
+ txdc.supportsTss().should.equal(true);
74
+ txdc.allowsAccountConsolidations().should.equal(false);
75
+ });
76
+ });
77
+ });
78
+ describe('Build Unsigned Sweep for Self-Custody Cold Wallets - (MPCv2)', function () {
79
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
80
+ bitgo.register('txdc', index_1.Txdc.createInstance);
81
+ const explorerUrl = sdk_core_1.common.Environments[bitgo.getEnv()].xdcExplorerBaseUrl;
82
+ const gasPrice = 20000000000;
83
+ const gasLimitValue = 500000;
84
+ const chain_id = 51;
85
+ it('should generate an unsigned sweep without derivation path', async () => {
86
+ (0, nock_1.default)(explorerUrl)
87
+ .get('/api')
88
+ .twice()
89
+ .query(resources_1.mockDataUnsignedSweep.getTxListRequest)
90
+ .reply(200, resources_1.mockDataUnsignedSweep.getTxListResponse);
91
+ (0, nock_1.default)(explorerUrl)
92
+ .get('/api')
93
+ .query(resources_1.mockDataUnsignedSweep.getBalanceRequest)
94
+ .reply(200, resources_1.mockDataUnsignedSweep.getBalanceResponse);
95
+ const baseCoin = bitgo.coin('txdc');
96
+ const transaction = (await baseCoin.recover({
97
+ userKey: resources_1.mockDataUnsignedSweep.userKey,
98
+ backupKey: resources_1.mockDataUnsignedSweep.backupKey,
99
+ walletContractAddress: resources_1.mockDataUnsignedSweep.walletBaseAddress,
100
+ recoveryDestination: resources_1.mockDataUnsignedSweep.recoveryDestination,
101
+ isTss: true,
102
+ gasPrice: gasPrice,
103
+ gasLimit: gasLimitValue,
104
+ replayProtectionOptions: {
105
+ chain: chain_id,
106
+ hardfork: 'petersburg',
107
+ },
108
+ }));
109
+ should.exist(transaction);
110
+ transaction.should.have.property('txRequests');
111
+ transaction.txRequests.length.should.equal(1);
112
+ const txRequest = transaction.txRequests[0];
113
+ txRequest.should.have.property('walletCoin');
114
+ txRequest.walletCoin.should.equal('txdc');
115
+ txRequest.should.have.property('transactions');
116
+ txRequest.transactions.length.should.equal(1);
117
+ const tx = txRequest.transactions[0];
118
+ tx.should.have.property('nonce');
119
+ tx.should.have.property('unsignedTx');
120
+ tx.unsignedTx.should.have.property('serializedTxHex');
121
+ tx.unsignedTx.should.have.property('signableHex');
122
+ tx.unsignedTx.should.have.property('derivationPath');
123
+ tx.unsignedTx.should.have.property('feeInfo');
124
+ tx.unsignedTx.feeInfo?.should.have.property('fee');
125
+ tx.unsignedTx.feeInfo?.should.have.property('feeString');
126
+ tx.unsignedTx.should.have.property('parsedTx');
127
+ tx.unsignedTx.parsedTx?.should.have.property('spendAmount');
128
+ tx.unsignedTx.parsedTx?.should.have.property('outputs');
129
+ });
130
+ });
131
+ describe('Non Bitgo Recovery for Hot Wallets', function () {
132
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
133
+ bitgo.register('txdc', index_1.Txdc.createInstance);
134
+ const explorerUrl = sdk_core_1.common.Environments[bitgo.getEnv()].xdcExplorerBaseUrl;
135
+ const gasPrice = 20000000000;
136
+ const chain_id = 51;
137
+ const gasLimitvalue = 500000;
138
+ it('should generate a signed non-bitgo recovery tx', async () => {
139
+ (0, nock_1.default)(explorerUrl)
140
+ .get('/api')
141
+ .twice()
142
+ .query(resources_1.mockDataNonBitGoRecovery.getTxListRequest)
143
+ .reply(200, resources_1.mockDataNonBitGoRecovery.getTxListResponse);
144
+ (0, nock_1.default)(explorerUrl)
145
+ .get('/api')
146
+ .query(resources_1.mockDataNonBitGoRecovery.getBalanceRequest)
147
+ .reply(200, resources_1.mockDataNonBitGoRecovery.getBalanceResponse);
148
+ const baseCoin = bitgo.coin('txdc');
149
+ const transaction = await baseCoin.recover({
150
+ userKey: resources_1.mockDataNonBitGoRecovery.userKeyData,
151
+ backupKey: resources_1.mockDataNonBitGoRecovery.backupKeyData,
152
+ walletContractAddress: resources_1.mockDataNonBitGoRecovery.walletRootAddress,
153
+ walletPassphrase: resources_1.mockDataNonBitGoRecovery.walletPassphrase,
154
+ recoveryDestination: resources_1.mockDataNonBitGoRecovery.recoveryDestination,
155
+ isTss: true,
156
+ gasPrice: gasPrice,
157
+ gasLimit: gasLimitvalue,
158
+ replayProtectionOptions: {
159
+ chain: chain_id,
160
+ hardfork: 'petersburg',
161
+ },
162
+ });
163
+ should.exist(transaction);
164
+ transaction.should.have.property('id');
165
+ transaction.should.have.property('tx');
166
+ const tx = tx_1.Transaction.fromSerializedTx(Buffer.from((0, util_1.stripHexPrefix)(transaction.tx), 'hex'));
167
+ tx.getSenderAddress().toString().should.equal(resources_1.mockDataNonBitGoRecovery.walletRootAddress);
168
+ const jsonTx = tx.toJSON();
169
+ jsonTx.to?.should.equal(resources_1.mockDataNonBitGoRecovery.recoveryDestination);
170
+ });
171
+ });
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGRjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3hkYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUVqQyxtREFBK0Q7QUFDL0QsaURBQStDO0FBRS9DLDJDQUE0QztBQUU1Qyw0Q0FBK0U7QUFDL0UsZ0RBQXdCO0FBQ3hCLG1EQUE4QztBQUM5Qyx1Q0FBNkM7QUFDN0MsMkNBQWtEO0FBRWxELE1BQU0sS0FBSyxHQUFpQixvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUUsUUFBUSxDQUFDLEtBQUssRUFBRTtJQUNkLE1BQU0sQ0FBQztRQUNMLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFHLENBQUMsQ0FBQztZQUNqQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxHQUFHLENBQUMsV0FB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QUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxnQkFBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBQSxxQkFBYyxFQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVGLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQXdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUF3QixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5cbmltcG9ydCB7IFhkYywgVHhkYyB9IGZyb20gJy4uLy4uL3NyYy9pbmRleCc7XG5pbXBvcnQgeyBVbnNpZ25lZFN3ZWVwVHhNUEN2MiB9IGZyb20gJ0BiaXRnby1iZXRhL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgeyBtb2NrRGF0YVVuc2lnbmVkU3dlZXAsIG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeSB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCB7IGNvbW1vbiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnQGV0aGVyZXVtanMvdHgnO1xuaW1wb3J0IHsgc3RyaXBIZXhQcmVmaXggfSBmcm9tICdAZXRoZXJldW1qcy91dGlsJztcblxuY29uc3QgYml0Z286IFRlc3RCaXRHb0FQSSA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcblxuZGVzY3JpYmUoJ3hkYycsIGZ1bmN0aW9uICgpIHtcbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3hkYycsIFhkYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0eGRjJywgVHhkYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCYXNpYyBDb2luIEluZm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGluZm8gZm9yIHhkYycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHhkYyA9IGJpdGdvLmNvaW4oJ3hkYycpO1xuXG4gICAgICB4ZGMuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoWGRjKTtcbiAgICAgIHhkYy5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgneGRjJyk7XG4gICAgICB4ZGMuZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCd4ZGMnKTtcbiAgICAgIHhkYy5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnWERDJyk7XG4gICAgICB4ZGMuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgICAgIHhkYy5zdXBwb3J0c1RzcygpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIHhkYy5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGluZm8gZm9yIHR4ZGMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eGRjID0gYml0Z28uY29pbigndHhkYycpO1xuXG4gICAgICB0eGRjLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKFR4ZGMpO1xuICAgICAgdHhkYy5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgndHhkYycpO1xuICAgICAgdHhkYy5nZXRGYW1pbHkoKS5zaG91bGQuZXF1YWwoJ3hkYycpO1xuICAgICAgdHhkYy5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBYREMnKTtcbiAgICAgIHR4ZGMuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgICAgIHR4ZGMuc3VwcG9ydHNUc3MoKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB0eGRjLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdCdWlsZCBVbnNpZ25lZCBTd2VlcCBmb3IgU2VsZi1DdXN0b2R5IENvbGQgV2FsbGV0cyAtIChNUEN2MiknLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5yZWdpc3RlcigndHhkYycsIFR4ZGMuY3JlYXRlSW5zdGFuY2UpO1xuICBjb25zdCBleHBsb3JlclVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLnhkY0V4cGxvcmVyQmFzZVVybCBhcyBzdHJpbmc7XG4gIGNvbnN0IGdhc1ByaWNlID0gMjAwMDAwMDAwMDA7XG4gIGNvbnN0IGdhc0xpbWl0VmFsdWUgPSA1MDAwMDA7XG4gIGNvbnN0IGNoYWluX2lkID0gNTE7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhbiB1bnNpZ25lZCBzd2VlcCB3aXRob3V0IGRlcml2YXRpb24gcGF0aCcsIGFzeW5jICgpID0+IHtcbiAgICBub2NrKGV4cGxvcmVyVXJsKVxuICAgICAgLmdldCgnL2FwaScpXG4gICAgICAudHdpY2UoKVxuICAgICAgLnF1ZXJ5KG1vY2tEYXRhVW5zaWduZWRTd2VlcC5nZXRUeExpc3RSZXF1ZXN0KVxuICAgICAgLnJlcGx5KDIwMCwgbW9ja0RhdGFVbnNpZ25lZFN3ZWVwLmdldFR4TGlzdFJlc3BvbnNlKTtcbiAgICBub2NrKGV4cGxvcmVyVXJsKVxuICAgICAgLmdldCgnL2FwaScpXG4gICAgICAucXVlcnkobW9ja0RhdGFVbnNpZ25lZFN3ZWVwLmdldEJhbGFuY2VSZXF1ZXN0KVxuICAgICAgLnJlcGx5KDIwMCwgbW9ja0RhdGFVbnNpZ25lZFN3ZWVwLmdldEJhbGFuY2VSZXNwb25zZSk7XG5cbiAgICBjb25zdCBiYXNlQ29pbjogYW55ID0gYml0Z28uY29pbigndHhkYycpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gKGF3YWl0IGJhc2VDb2luLnJlY292ZXIoe1xuICAgICAgdXNlcktleTogbW9ja0RhdGFVbnNpZ25lZFN3ZWVwLnVzZXJLZXksXG4gICAgICBiYWNrdXBLZXk6IG1vY2tEYXRhVW5zaWduZWRTd2VlcC5iYWNrdXBLZXksXG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IG1vY2tEYXRhVW5zaWduZWRTd2VlcC53YWxsZXRCYXNlQWRkcmVzcyxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IG1vY2tEYXRhVW5zaWduZWRTd2VlcC5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgaXNUc3M6IHRydWUsXG4gICAgICBnYXNQcmljZTogZ2FzUHJpY2UsXG4gICAgICBnYXNMaW1pdDogZ2FzTGltaXRWYWx1ZSxcbiAgICAgIHJlcGxheVByb3RlY3Rpb25PcHRpb25zOiB7XG4gICAgICAgIGNoYWluOiBjaGFpbl9pZCxcbiAgICAgICAgaGFyZGZvcms6ICdwZXRlcnNidXJnJyxcbiAgICAgIH0sXG4gICAgfSkpIGFzIFVuc2lnbmVkU3dlZXBUeE1QQ3YyO1xuICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbik7XG4gICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4UmVxdWVzdHMnKTtcbiAgICB0cmFuc2FjdGlvbi50eFJlcXVlc3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgY29uc3QgdHhSZXF1ZXN0ID0gdHJhbnNhY3Rpb24udHhSZXF1ZXN0c1swXTtcbiAgICB0eFJlcXVlc3Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3dhbGxldENvaW4nKTtcbiAgICB0eFJlcXVlc3Qud2FsbGV0Q29pbi5zaG91bGQuZXF1YWwoJ3R4ZGMnKTtcbiAgICB0eFJlcXVlc3Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgIHR4UmVxdWVzdC50cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBjb25zdCB0eCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF07XG4gICAgdHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ25vbmNlJyk7XG4gICAgdHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Vuc2lnbmVkVHgnKTtcbiAgICB0eC51bnNpZ25lZFR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdzZXJpYWxpemVkVHhIZXgnKTtcbiAgICB0eC51bnNpZ25lZFR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdzaWduYWJsZUhleCcpO1xuICAgIHR4LnVuc2lnbmVkVHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Rlcml2YXRpb25QYXRoJyk7XG4gICAgdHgudW5zaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZmVlSW5mbycpO1xuICAgIHR4LnVuc2lnbmVkVHguZmVlSW5mbz8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZScpO1xuICAgIHR4LnVuc2lnbmVkVHguZmVlSW5mbz8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZVN0cmluZycpO1xuICAgIHR4LnVuc2lnbmVkVHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhcnNlZFR4Jyk7XG4gICAgdHgudW5zaWduZWRUeC5wYXJzZWRUeD8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3NwZW5kQW1vdW50Jyk7XG4gICAgdHgudW5zaWduZWRUeC5wYXJzZWRUeD8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ291dHB1dHMnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ05vbiBCaXRnbyBSZWNvdmVyeSBmb3IgSG90IFdhbGxldHMnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5yZWdpc3RlcigndHhkYycsIFR4ZGMuY3JlYXRlSW5zdGFuY2UpO1xuICBjb25zdCBleHBsb3JlclVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLnhkY0V4cGxvcmVyQmFzZVVybCBhcyBzdHJpbmc7XG4gIGNvbnN0IGdhc1ByaWNlID0gMjAwMDAwMDAwMDA7XG4gIGNvbnN0IGNoYWluX2lkID0gNTE7XG4gIGNvbnN0IGdhc0xpbWl0dmFsdWUgPSA1MDAwMDA7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHNpZ25lZCBub24tYml0Z28gcmVjb3ZlcnkgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgbm9jayhleHBsb3JlclVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnR3aWNlKClcbiAgICAgIC5xdWVyeShtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkuZ2V0VHhMaXN0UmVxdWVzdClcbiAgICAgIC5yZXBseSgyMDAsIG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS5nZXRUeExpc3RSZXNwb25zZSk7XG4gICAgbm9jayhleHBsb3JlclVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnF1ZXJ5KG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS5nZXRCYWxhbmNlUmVxdWVzdClcbiAgICAgIC5yZXBseSgyMDAsIG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS5nZXRCYWxhbmNlUmVzcG9uc2UpO1xuXG4gICAgY29uc3QgYmFzZUNvaW46IGFueSA9IGJpdGdvLmNvaW4oJ3R4ZGMnKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IGJhc2VDb2luLnJlY292ZXIoe1xuICAgICAgdXNlcktleTogbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LnVzZXJLZXlEYXRhLFxuICAgICAgYmFja3VwS2V5OiBtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkuYmFja3VwS2V5RGF0YSxcbiAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LndhbGxldFJvb3RBZGRyZXNzLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LndhbGxldFBhc3NwaHJhc2UsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLFxuICAgICAgZ2FzTGltaXQ6IGdhc0xpbWl0dmFsdWUsXG4gICAgICByZXBsYXlQcm90ZWN0aW9uT3B0aW9uczoge1xuICAgICAgICBjaGFpbjogY2hhaW5faWQsXG4gICAgICAgIGhhcmRmb3JrOiAncGV0ZXJzYnVyZycsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbik7XG4gICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2lkJyk7XG4gICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgY29uc3QgdHggPSBUcmFuc2FjdGlvbi5mcm9tU2VyaWFsaXplZFR4KEJ1ZmZlci5mcm9tKHN0cmlwSGV4UHJlZml4KHRyYW5zYWN0aW9uLnR4KSwgJ2hleCcpKTtcbiAgICB0eC5nZXRTZW5kZXJBZGRyZXNzKCkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwobW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LndhbGxldFJvb3RBZGRyZXNzKTtcbiAgICBjb25zdCBqc29uVHggPSB0eC50b0pTT04oKTtcbiAgICBqc29uVHgudG8/LnNob3VsZC5lcXVhbChtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkucmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gIH0pO1xufSk7XG4iXX0=
@@ -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"}
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("should");
4
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
5
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
6
+ const src_1 = require("../../src");
7
+ const resources_1 = require("../resources");
8
+ describe('XDC Token:', function () {
9
+ let bitgo;
10
+ let xdcTokenCoin;
11
+ const tokenName = 'xdc:usdc';
12
+ before(function () {
13
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'prod' });
14
+ (0, src_1.register)(bitgo);
15
+ bitgo.initializeTestVars();
16
+ xdcTokenCoin = bitgo.coin(tokenName);
17
+ });
18
+ it('should return constants', function () {
19
+ xdcTokenCoin.getChain().should.equal('xdc:usdc');
20
+ xdcTokenCoin.getBaseChain().should.equal('xdc');
21
+ xdcTokenCoin.getFullName().should.equal('XDC Token');
22
+ xdcTokenCoin.getBaseFactor().should.equal(1e6);
23
+ xdcTokenCoin.type.should.equal(tokenName);
24
+ xdcTokenCoin.name.should.equal('USD Coin');
25
+ xdcTokenCoin.coin.should.equal('xdc');
26
+ xdcTokenCoin.network.should.equal('Mainnet');
27
+ xdcTokenCoin.decimalPlaces.should.equal(6);
28
+ });
29
+ describe('Token Registration and TransactionBuilder', function () {
30
+ const mainnetTokens = ['xdc:usdc', 'xdc:lbt', 'xdc:gama', 'xdc:srx', 'xdc:weth'];
31
+ const testnetTokens = ['txdc:tmt'];
32
+ describe('Mainnet tokens', function () {
33
+ mainnetTokens.forEach((tokenName) => {
34
+ it(`${tokenName} should be registered as XdcToken`, function () {
35
+ const token = bitgo.coin(tokenName);
36
+ token.should.be.instanceOf(src_1.XdcToken);
37
+ });
38
+ it(`${tokenName} should create TransactionBuilder without error`, function () {
39
+ const token = bitgo.coin(tokenName);
40
+ // @ts-expect-error - accessing protected method for testing
41
+ (() => token.getTransactionBuilder()).should.not.throw();
42
+ });
43
+ it(`${tokenName} should use XDC-specific TransactionBuilder`, function () {
44
+ const token = bitgo.coin(tokenName);
45
+ // @ts-expect-error - accessing protected method for testing
46
+ const builder = token.getTransactionBuilder();
47
+ builder.should.have.property('_common');
48
+ // Verify it's using XDC's getCommon, not EVM's
49
+ // XDC's TransactionBuilder should create successfully without SHARED_EVM_SDK feature
50
+ builder.constructor.name.should.equal('TransactionBuilder');
51
+ });
52
+ });
53
+ });
54
+ describe('Testnet tokens', function () {
55
+ testnetTokens.forEach((tokenName) => {
56
+ it(`${tokenName} should be registered as XdcToken`, function () {
57
+ const token = bitgo.coin(tokenName);
58
+ token.should.be.instanceOf(src_1.XdcToken);
59
+ });
60
+ it(`${tokenName} should create TransactionBuilder without error`, function () {
61
+ const token = bitgo.coin(tokenName);
62
+ // @ts-expect-error - accessing protected method for testing
63
+ (() => token.getTransactionBuilder()).should.not.throw();
64
+ });
65
+ it(`${tokenName} should use XDC-specific TransactionBuilder`, function () {
66
+ const token = bitgo.coin(tokenName);
67
+ // @ts-expect-error - accessing protected method for testing
68
+ const builder = token.getTransactionBuilder();
69
+ builder.should.have.property('_common');
70
+ builder.constructor.name.should.equal('TransactionBuilder');
71
+ });
72
+ it(`${tokenName} should have correct base chain`, function () {
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ const token = bitgo.coin(tokenName);
75
+ token.getBaseChain().should.equal('txdc');
76
+ });
77
+ it(`${tokenName} should not throw "Cannot use common sdk module" error`, function () {
78
+ const token = bitgo.coin(tokenName);
79
+ let errorThrown = false;
80
+ let errorMessage = '';
81
+ try {
82
+ // @ts-expect-error - accessing protected method for testing
83
+ const builder = token.getTransactionBuilder();
84
+ // Try to use the builder to ensure it's fully functional
85
+ // @ts-expect-error - type expects TransactionType enum
86
+ builder.type('Send');
87
+ }
88
+ catch (e) {
89
+ errorThrown = true;
90
+ errorMessage = e.message;
91
+ }
92
+ errorThrown.should.equal(false);
93
+ errorMessage.should.not.match(/Cannot use common sdk module/);
94
+ });
95
+ });
96
+ });
97
+ it('should verify all XDC tokens use XdcToken class, not EthLikeErc20Token', function () {
98
+ const allTokens = [...mainnetTokens, ...testnetTokens];
99
+ allTokens.forEach((tokenName) => {
100
+ const token = bitgo.coin(tokenName);
101
+ token.should.be.instanceOf(src_1.XdcToken);
102
+ token.constructor.name.should.equal('XdcToken');
103
+ token.constructor.name.should.not.equal('EthLikeErc20Token');
104
+ });
105
+ });
106
+ });
107
+ describe('verifyTssTransaction', function () {
108
+ it('should return true for valid token transfer params', async function () {
109
+ const token = bitgo.coin('txdc:tmt');
110
+ const mockWallet = {};
111
+ const result = await token.verifyTssTransaction({
112
+ txParams: {
113
+ recipients: [
114
+ {
115
+ address: resources_1.mockTokenTransferData.recipientAddress,
116
+ amount: resources_1.mockTokenTransferData.tokenAmount,
117
+ },
118
+ ],
119
+ },
120
+ txPrebuild: resources_1.mockTokenTransferData.txPrebuild,
121
+ wallet: mockWallet,
122
+ });
123
+ result.should.equal(true);
124
+ });
125
+ it('should return true for transferToken type without recipients', async function () {
126
+ const token = bitgo.coin('txdc:tmt');
127
+ const mockWallet = {};
128
+ const result = await token.verifyTssTransaction({
129
+ txParams: {
130
+ type: 'transferToken',
131
+ },
132
+ txPrebuild: resources_1.mockTokenTransferData.txPrebuild,
133
+ wallet: mockWallet,
134
+ });
135
+ result.should.equal(true);
136
+ });
137
+ it('should throw error when txParams.recipients is missing and no valid type', async function () {
138
+ const token = bitgo.coin('txdc:tmt');
139
+ const mockWallet = {};
140
+ await token
141
+ .verifyTssTransaction({
142
+ txParams: {},
143
+ txPrebuild: resources_1.mockTokenTransferData.txPrebuild,
144
+ wallet: mockWallet,
145
+ })
146
+ .should.be.rejectedWith('missing txParams');
147
+ });
148
+ it('should throw error when wallet is missing', async function () {
149
+ const token = bitgo.coin('txdc:tmt');
150
+ await token
151
+ .verifyTssTransaction({
152
+ txParams: {
153
+ recipients: [
154
+ {
155
+ address: resources_1.mockTokenTransferData.recipientAddress,
156
+ amount: resources_1.mockTokenTransferData.tokenAmount,
157
+ },
158
+ ],
159
+ },
160
+ txPrebuild: resources_1.mockTokenTransferData.txPrebuild,
161
+ wallet: undefined,
162
+ })
163
+ .should.be.rejectedWith('missing params');
164
+ });
165
+ it('should throw error when txPrebuild is missing', async function () {
166
+ const token = bitgo.coin('txdc:tmt');
167
+ const mockWallet = {};
168
+ await token
169
+ .verifyTssTransaction({
170
+ txParams: {
171
+ recipients: [
172
+ {
173
+ address: resources_1.mockTokenTransferData.recipientAddress,
174
+ amount: resources_1.mockTokenTransferData.tokenAmount,
175
+ },
176
+ ],
177
+ },
178
+ txPrebuild: undefined,
179
+ wallet: mockWallet,
180
+ })
181
+ .should.be.rejectedWith('missing params');
182
+ });
183
+ it('should throw error for batch + hop transaction', async function () {
184
+ const token = bitgo.coin('txdc:tmt');
185
+ const mockWallet = {};
186
+ await token
187
+ .verifyTssTransaction({
188
+ txParams: {
189
+ hop: true,
190
+ recipients: [
191
+ { address: '0x1111111111111111111111111111111111111111', amount: '1000' },
192
+ { address: '0x2222222222222222222222222222222222222222', amount: '2000' },
193
+ ],
194
+ },
195
+ txPrebuild: resources_1.mockTokenTransferData.txPrebuild,
196
+ wallet: mockWallet,
197
+ })
198
+ .should.be.rejectedWith('tx cannot be both a batch and hop transaction');
199
+ });
200
+ it('should not throw EIP155 error when verifying token transaction', async function () {
201
+ // This test ensures that verifyTssTransaction does NOT parse the txHex
202
+ // which would fail with "Incompatible EIP155-based V" error
203
+ const token = bitgo.coin('txdc:tmt');
204
+ const mockWallet = {};
205
+ // Use the signableHex (with v=51) which would fail if parsed
206
+ const txPrebuildWithSignableHex = {
207
+ ...resources_1.mockTokenTransferData.txPrebuild,
208
+ txHex: resources_1.mockTokenTransferData.signableHex,
209
+ };
210
+ // This should NOT throw EIP155 error because verifyTssTransaction
211
+ // does not parse the transaction
212
+ const result = await token.verifyTssTransaction({
213
+ txParams: {
214
+ recipients: [
215
+ {
216
+ address: resources_1.mockTokenTransferData.recipientAddress,
217
+ amount: resources_1.mockTokenTransferData.tokenAmount,
218
+ },
219
+ ],
220
+ },
221
+ txPrebuild: txPrebuildWithSignableHex,
222
+ wallet: mockWallet,
223
+ });
224
+ result.should.equal(true);
225
+ });
226
+ });
227
+ });
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGRjVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQveGRjVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZ0I7QUFDaEIsbURBQStEO0FBQy9ELGlEQUErQztBQUcvQyxtQ0FBK0M7QUFDL0MsNENBQXFEO0FBRXJELFFBQVEsQ0FBQyxZQUFZLEVBQUU7SUFDckIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksWUFBWSxDQUFDO0lBQ2pCLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztJQUU3QixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUEsY0FBUSxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFO1FBQzVCLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxZQUFZLENBQUMsSUFBSSxDQUFD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QUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBJV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyByZWdpc3RlciwgWGRjVG9rZW4gfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgbW9ja1Rva2VuVHJhbnNmZXJEYXRhIH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ1hEQyBUb2tlbjonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgeGRjVG9rZW5Db2luO1xuICBjb25zdCB0b2tlbk5hbWUgPSAneGRjOnVzZGMnO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAncHJvZCcgfSk7XG4gICAgcmVnaXN0ZXIoYml0Z28pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIHhkY1Rva2VuQ29pbiA9IGJpdGdvLmNvaW4odG9rZW5OYW1lKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gY29uc3RhbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIHhkY1Rva2VuQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgneGRjOnVzZGMnKTtcbiAgICB4ZGNUb2tlbkNvaW4uZ2V0QmFzZUNoYWluKCkuc2hvdWxkLmVxdWFsKCd4ZGMnKTtcbiAgICB4ZGNUb2tlbkNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1hEQyBUb2tlbicpO1xuICAgIHhkY1Rva2VuQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlNik7XG4gICAgeGRjVG9rZW5Db2luLnR5cGUuc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG4gICAgeGRjVG9rZW5Db2luLm5hbWUuc2hvdWxkLmVxdWFsKCdVU0QgQ29pbicpO1xuICAgIHhkY1Rva2VuQ29pbi5jb2luLnNob3VsZC5lcXVhbCgneGRjJyk7XG4gICAgeGRjVG9rZW5Db2luLm5ldHdvcmsuc2hvdWxkLmVxdWFsKCdNYWlubmV0Jyk7XG4gICAgeGRjVG9rZW5Db2luLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDYpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVG9rZW4gUmVnaXN0cmF0aW9uIGFuZCBUcmFuc2FjdGlvbkJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbWFpbm5ldFRva2VucyA9IFsneGRjOnVzZGMnLCAneGRjOmxidCcsICd4ZGM6Z2FtYScsICd4ZGM6c3J4JywgJ3hkYzp3ZXRoJ107XG4gICAgY29uc3QgdGVzdG5ldFRva2VucyA9IFsndHhkYzp0bXQnXTtcblxuICAgIGRlc2NyaWJlKCdNYWlubmV0IHRva2VucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1haW5uZXRUb2tlbnMuZm9yRWFjaCgodG9rZW5OYW1lKSA9PiB7XG4gICAgICAgIGl0KGAke3Rva2VuTmFtZX0gc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgWGRjVG9rZW5gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gICAgICAgICAgdG9rZW4uc2hvdWxkLmJlLmluc3RhbmNlT2YoWGRjVG9rZW4pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdChgJHt0b2tlbk5hbWV9IHNob3VsZCBjcmVhdGUgVHJhbnNhY3Rpb25CdWlsZGVyIHdpdGhvdXQgZXJyb3JgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSkgYXMgWGRjVG9rZW47XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGFjY2Vzc2luZyBwcm90ZWN0ZWQgbWV0aG9kIGZvciB0ZXN0aW5nXG4gICAgICAgICAgKCgpID0+IHRva2VuLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KGAke3Rva2VuTmFtZX0gc2hvdWxkIHVzZSBYREMtc3BlY2lmaWMgVHJhbnNhY3Rpb25CdWlsZGVyYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gYml0Z28uY29pbih0b2tlbk5hbWUpIGFzIFhkY1Rva2VuO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBhY2Nlc3NpbmcgcHJvdGVjdGVkIG1ldGhvZCBmb3IgdGVzdGluZ1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB0b2tlbi5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgICBidWlsZGVyLnNob3VsZC5oYXZlLnByb3BlcnR5KCdfY29tbW9uJyk7XG4gICAgICAgICAgLy8gVmVyaWZ5IGl0J3MgdXNpbmcgWERDJ3MgZ2V0Q29tbW9uLCBub3QgRVZNJ3NcbiAgICAgICAgICAvLyBYREMncyBUcmFuc2FjdGlvbkJ1aWxkZXIgc2hvdWxkIGNyZWF0ZSBzdWNjZXNzZnVsbHkgd2l0aG91dCBTSEFSRURfRVZNX1NESyBmZWF0dXJlXG4gICAgICAgICAgYnVpbGRlci5jb25zdHJ1Y3Rvci5uYW1lLnNob3VsZC5lcXVhbCgnVHJhbnNhY3Rpb25CdWlsZGVyJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVGVzdG5ldCB0b2tlbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0VG9rZW5zLmZvckVhY2goKHRva2VuTmFtZSkgPT4ge1xuICAgICAgICBpdChgJHt0b2tlbk5hbWV9IHNob3VsZCBiZSByZWdpc3RlcmVkIGFzIFhkY1Rva2VuYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gYml0Z28uY29pbih0b2tlbk5hbWUpO1xuICAgICAgICAgIHRva2VuLnNob3VsZC5iZS5pbnN0YW5jZU9mKFhkY1Rva2VuKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoYCR7dG9rZW5OYW1lfSBzaG91bGQgY3JlYXRlIFRyYW5zYWN0aW9uQnVpbGRlciB3aXRob3V0IGVycm9yYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gYml0Z28uY29pbih0b2tlbk5hbWUpIGFzIFhkY1Rva2VuO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBhY2Nlc3NpbmcgcHJvdGVjdGVkIG1ldGhvZCBmb3IgdGVzdGluZ1xuICAgICAgICAgICgoKSA9PiB0b2tlbi5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdChgJHt0b2tlbk5hbWV9IHNob3VsZCB1c2UgWERDLXNwZWNpZmljIFRyYW5zYWN0aW9uQnVpbGRlcmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IGJpdGdvLmNvaW4odG9rZW5OYW1lKSBhcyBYZGNUb2tlbjtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYWNjZXNzaW5nIHByb3RlY3RlZCBtZXRob2QgZm9yIHRlc3RpbmdcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gdG9rZW4uZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICAgICAgYnVpbGRlci5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnX2NvbW1vbicpO1xuICAgICAgICAgIGJ1aWxkZXIuY29uc3RydWN0b3IubmFtZS5zaG91bGQuZXF1YWwoJ1RyYW5zYWN0aW9uQnVpbGRlcicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdChgJHt0b2tlbk5hbWV9IHNob3VsZCBoYXZlIGNvcnJlY3QgYmFzZSBjaGFpbmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIGNvbnN0IHRva2VuOiBhbnkgPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gICAgICAgICAgdG9rZW4uZ2V0QmFzZUNoYWluKCkuc2hvdWxkLmVxdWFsKCd0eGRjJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KGAke3Rva2VuTmFtZX0gc2hvdWxkIG5vdCB0aHJvdyBcIkNhbm5vdCB1c2UgY29tbW9uIHNkayBtb2R1bGVcIiBlcnJvcmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IGJpdGdvLmNvaW4odG9rZW5OYW1lKSBhcyBYZGNUb2tlbjtcbiAgICAgICAgICBsZXQgZXJyb3JUaHJvd24gPSBmYWxzZTtcbiAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGFjY2Vzc2luZyBwcm90ZWN0ZWQgbWV0aG9kIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBjb25zdCBidWlsZGVyID0gdG9rZW4uZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICAgICAgICAvLyBUcnkgdG8gdXNlIHRoZSBidWlsZGVyIHRvIGVuc3VyZSBpdCdzIGZ1bGx5IGZ1bmN0aW9uYWxcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB0eXBlIGV4cGVjdHMgVHJhbnNhY3Rpb25UeXBlIGVudW1cbiAgICAgICAgICAgIGJ1aWxkZXIudHlwZSgnU2VuZCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGVycm9yVGhyb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yVGhyb3duLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlLnNob3VsZC5ub3QubWF0Y2goL0Nhbm5vdCB1c2UgY29tbW9uIHNkayBtb2R1bGUvKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGFsbCBYREMgdG9rZW5zIHVzZSBYZGNUb2tlbiBjbGFzcywgbm90IEV0aExpa2VFcmMyMFRva2VuJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWxsVG9rZW5zID0gWy4uLm1haW5uZXRUb2tlbnMsIC4uLnRlc3RuZXRUb2tlbnNdO1xuXG4gICAgICBhbGxUb2tlbnMuZm9yRWFjaCgodG9rZW5OYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gYml0Z28uY29pbih0b2tlbk5hbWUpO1xuICAgICAgICB0b2tlbi5zaG91bGQuYmUuaW5zdGFuY2VPZihYZGNUb2tlbik7XG4gICAgICAgIHRva2VuLmNvbnN0cnVjdG9yLm5hbWUuc2hvdWxkLmVxdWFsKCdYZGNUb2tlbicpO1xuICAgICAgICB0b2tlbi5jb25zdHJ1Y3Rvci5uYW1lLnNob3VsZC5ub3QuZXF1YWwoJ0V0aExpa2VFcmMyMFRva2VuJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcmlmeVRzc1RyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIHRva2VuIHRyYW5zZmVyIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gYml0Z28uY29pbigndHhkYzp0bXQnKSBhcyBYZGNUb2tlbjtcbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7fSBhcyB1bmtub3duIGFzIElXYWxsZXQ7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRva2VuLnZlcmlmeVRzc1RyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IG1vY2tUb2tlblRyYW5zZmVyRGF0YS5yZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6IG1vY2tUb2tlblRyYW5zZmVyRGF0YS50b2tlbkFtb3VudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDogbW9ja1Rva2VuVHJhbnNmZXJEYXRhLnR4UHJlYnVpbGQgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiB0b2tlbi52ZXJpZnlUc3NUcmFuc2FjdGlvblxuICAgICAgICA+WzBdWyd0eFByZWJ1aWxkJ10sXG4gICAgICAgIHdhbGxldDogbW9ja1dhbGxldCxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgdHJhbnNmZXJUb2tlbiB0eXBlIHdpdGhvdXQgcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gYml0Z28uY29pbigndHhkYzp0bXQnKSBhcyBYZGNUb2tlbjtcbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7fSBhcyB1bmtub3duIGFzIElXYWxsZXQ7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRva2VuLnZlcmlmeVRzc1RyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB0eXBlOiAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IG1vY2tUb2tlblRyYW5zZmVyRGF0YS50eFByZWJ1aWxkIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczxcbiAgICAgICAgICB0eXBlb2YgdG9rZW4udmVyaWZ5VHNzVHJhbnNhY3Rpb25cbiAgICAgICAgPlswXVsndHhQcmVidWlsZCddLFxuICAgICAgICB3YWxsZXQ6IG1vY2tXYWxsZXQsXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFBhcmFtcy5yZWNpcGllbnRzIGlzIG1pc3NpbmcgYW5kIG5vIHZhbGlkIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGJpdGdvLmNvaW4oJ3R4ZGM6dG10JykgYXMgWGRjVG9rZW47XG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge30gYXMgdW5rbm93biBhcyBJV2FsbGV0O1xuXG4gICAgICBhd2FpdCB0b2tlblxuICAgICAgICAudmVyaWZ5VHNzVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiBtb2NrVG9rZW5UcmFuc2ZlckRhdGEudHhQcmVidWlsZCBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8XG4gICAgICAgICAgICB0eXBlb2YgdG9rZW4udmVyaWZ5VHNzVHJhbnNhY3Rpb25cbiAgICAgICAgICA+WzBdWyd0eFByZWJ1aWxkJ10sXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyB0eFBhcmFtcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHdhbGxldCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdG9rZW4gPSBiaXRnby5jb2luKCd0eGRjOnRtdCcpIGFzIFhkY1Rva2VuO1xuXG4gICAgICBhd2FpdCB0b2tlblxuICAgICAgICAudmVyaWZ5VHNzVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBtb2NrVG9rZW5UcmFuc2ZlckRhdGEucmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IG1vY2tUb2tlblRyYW5zZmVyRGF0YS50b2tlbkFtb3VudCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiBtb2NrVG9rZW5UcmFuc2ZlckRhdGEudHhQcmVidWlsZCBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8XG4gICAgICAgICAgICB0eXBlb2YgdG9rZW4udmVyaWZ5VHNzVHJhbnNhY3Rpb25cbiAgICAgICAgICA+WzBdWyd0eFByZWJ1aWxkJ10sXG4gICAgICAgICAgd2FsbGV0OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBJV2FsbGV0LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyBwYXJhbXMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFByZWJ1aWxkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGJpdGdvLmNvaW4oJ3R4ZGM6dG10JykgYXMgWGRjVG9rZW47XG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge30gYXMgdW5rbm93biBhcyBJV2FsbGV0O1xuXG4gICAgICBhd2FpdCB0b2tlblxuICAgICAgICAudmVyaWZ5VHNzVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBtb2NrVG9rZW5UcmFuc2ZlckRhdGEucmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IG1vY2tUb2tlblRyYW5zZmVyRGF0YS50b2tlbkFtb3VudCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB0b2tlbi52ZXJpZnlUc3NUcmFuc2FjdGlvbj5bMF1bJ3R4UHJlYnVpbGQnXSxcbiAgICAgICAgICB3YWxsZXQ6IG1vY2tXYWxsZXQsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIHBhcmFtcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgYmF0Y2ggKyBob3AgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGJpdGdvLmNvaW4oJ3R4ZGM6dG10JykgYXMgWGRjVG9rZW47XG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge30gYXMgdW5rbm93biBhcyBJV2FsbGV0O1xuXG4gICAgICBhd2FpdCB0b2tlblxuICAgICAgICAudmVyaWZ5VHNzVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICBob3A6IHRydWUsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHsgYWRkcmVzczogJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMScsIGFtb3VudDogJzEwMDAnIH0sXG4gICAgICAgICAgICAgIHsgYWRkcmVzczogJzB4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMicsIGFtb3VudDogJzIwMDAnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogbW9ja1Rva2VuVHJhbnNmZXJEYXRhLnR4UHJlYnVpbGQgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPFxuICAgICAgICAgICAgdHlwZW9mIHRva2VuLnZlcmlmeVRzc1RyYW5zYWN0aW9uXG4gICAgICAgICAgPlswXVsndHhQcmVidWlsZCddLFxuICAgICAgICAgIHdhbGxldDogbW9ja1dhbGxldCxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3R4IGNhbm5vdCBiZSBib3RoIGEgYmF0Y2ggYW5kIGhvcCB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgRUlQMTU1IGVycm9yIHdoZW4gdmVyaWZ5aW5nIHRva2VuIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCB2ZXJpZnlUc3NUcmFuc2FjdGlvbiBkb2VzIE5PVCBwYXJzZSB0aGUgdHhIZXhcbiAgICAgIC8vIHdoaWNoIHdvdWxkIGZhaWwgd2l0aCBcIkluY29tcGF0aWJsZSBFSVAxNTUtYmFzZWQgVlwiIGVycm9yXG4gICAgICBjb25zdCB0b2tlbiA9IGJpdGdvLmNvaW4oJ3R4ZGM6dG10JykgYXMgWGRjVG9rZW47XG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge30gYXMgdW5rbm93biBhcyBJV2FsbGV0O1xuXG4gICAgICAvLyBVc2UgdGhlIHNpZ25hYmxlSGV4ICh3aXRoIHY9NTEpIHdoaWNoIHdvdWxkIGZhaWwgaWYgcGFyc2VkXG4gICAgICBjb25zdCB0eFByZWJ1aWxkV2l0aFNpZ25hYmxlSGV4ID0ge1xuICAgICAgICAuLi5tb2NrVG9rZW5UcmFuc2ZlckRhdGEudHhQcmVidWlsZCxcbiAgICAgICAgdHhIZXg6IG1vY2tUb2tlblRyYW5zZmVyRGF0YS5zaWduYWJsZUhleCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIE5PVCB0aHJvdyBFSVAxNTUgZXJyb3IgYmVjYXVzZSB2ZXJpZnlUc3NUcmFuc2FjdGlvblxuICAgICAgLy8gZG9lcyBub3QgcGFyc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbi52ZXJpZnlUc3NUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiBtb2NrVG9rZW5UcmFuc2ZlckRhdGEucmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiBtb2NrVG9rZW5UcmFuc2ZlckRhdGEudG9rZW5BbW91bnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGRXaXRoU2lnbmFibGVIZXggYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiB0b2tlbi52ZXJpZnlUc3NUcmFuc2FjdGlvblxuICAgICAgICA+WzBdWyd0eFByZWJ1aWxkJ10sXG4gICAgICAgIHdhbGxldDogbW9ja1dhbGxldCxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19