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