@bitgo/sdk-core 36.10.1 → 36.11.0
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/bitgo/staking/iStakingWallet.d.ts +7 -1
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts +2 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts +25 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +10 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +42 -1
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.js +135 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -5
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -3852
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenApproval.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/tokenApproval.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
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 sinon_1 = __importDefault(require("sinon"));
|
|
7
|
+
require("should");
|
|
8
|
+
const src_1 = require("../../../../src");
|
|
9
|
+
describe('Wallet - Token Approval', function () {
|
|
10
|
+
let wallet;
|
|
11
|
+
let mockBitGo;
|
|
12
|
+
let mockBaseCoin;
|
|
13
|
+
let mockWalletData;
|
|
14
|
+
beforeEach(function () {
|
|
15
|
+
mockBitGo = {
|
|
16
|
+
post: sinon_1.default.stub(),
|
|
17
|
+
get: sinon_1.default.stub(),
|
|
18
|
+
setRequestTracer: sinon_1.default.stub(),
|
|
19
|
+
};
|
|
20
|
+
mockBaseCoin = {
|
|
21
|
+
getFamily: sinon_1.default.stub().returns('eth'),
|
|
22
|
+
url: sinon_1.default.stub(),
|
|
23
|
+
keychains: sinon_1.default.stub(),
|
|
24
|
+
supportsTss: sinon_1.default.stub().returns(false),
|
|
25
|
+
getMPCAlgorithm: sinon_1.default.stub(),
|
|
26
|
+
};
|
|
27
|
+
mockWalletData = {
|
|
28
|
+
id: 'test-wallet-id',
|
|
29
|
+
coin: 'teth',
|
|
30
|
+
keys: ['user-key', 'backup-key', 'bitgo-key'],
|
|
31
|
+
};
|
|
32
|
+
wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
33
|
+
});
|
|
34
|
+
afterEach(function () {
|
|
35
|
+
sinon_1.default.restore();
|
|
36
|
+
});
|
|
37
|
+
describe('buildErc20TokenApproval', function () {
|
|
38
|
+
const mockTokenApprovalBuild = {
|
|
39
|
+
txHex: '0x123456',
|
|
40
|
+
txInfo: {
|
|
41
|
+
amount: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
|
|
42
|
+
contractAddress: '0x1234567890123456789012345678901234567890',
|
|
43
|
+
spender: '0x0987654321098765432109876543210987654321',
|
|
44
|
+
},
|
|
45
|
+
recipients: [
|
|
46
|
+
{
|
|
47
|
+
address: '0x0987654321098765432109876543210987654321',
|
|
48
|
+
amount: '0',
|
|
49
|
+
data: '0x095ea7b30000000000000000000000000987654321098765432109876543210987654321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
eip1559: {
|
|
53
|
+
maxFeePerGas: '0x3b9aca00',
|
|
54
|
+
maxPriorityFeePerGas: '0x3b9aca00',
|
|
55
|
+
},
|
|
56
|
+
nextContractSequenceId: 0,
|
|
57
|
+
coin: 'teth',
|
|
58
|
+
walletId: 'test-wallet-id',
|
|
59
|
+
};
|
|
60
|
+
it('should build token approval transaction without signing', async function () {
|
|
61
|
+
mockBaseCoin.url.returns('/test/wallet/token/approval/build');
|
|
62
|
+
mockBitGo.post.returns({
|
|
63
|
+
send: sinon_1.default.stub().returns({
|
|
64
|
+
result: sinon_1.default.stub().resolves(mockTokenApprovalBuild),
|
|
65
|
+
}),
|
|
66
|
+
});
|
|
67
|
+
const result = await wallet.buildErc20TokenApproval('USDC');
|
|
68
|
+
result.should.eql(mockTokenApprovalBuild);
|
|
69
|
+
sinon_1.default.assert.calledWith(mockBaseCoin.url, '/wallet/test-wallet-id/token/approval/build');
|
|
70
|
+
sinon_1.default.assert.calledOnce(mockBitGo.post);
|
|
71
|
+
sinon_1.default.assert.calledOnce(mockBitGo.setRequestTracer);
|
|
72
|
+
const postRequest = mockBitGo.post.getCall(0);
|
|
73
|
+
const sendCall = postRequest.returnValue.send.getCall(0);
|
|
74
|
+
sendCall.args[0].should.eql({ tokenName: 'USDC' });
|
|
75
|
+
});
|
|
76
|
+
it('should throw error if token build request fails', async function () {
|
|
77
|
+
mockBaseCoin.url.returns('/test/wallet/token/approval/build');
|
|
78
|
+
mockBitGo.post.returns({
|
|
79
|
+
send: sinon_1.default.stub().returns({
|
|
80
|
+
result: sinon_1.default.stub().rejects(new Error('token not supported')),
|
|
81
|
+
}),
|
|
82
|
+
});
|
|
83
|
+
await wallet
|
|
84
|
+
.buildErc20TokenApproval('INVALID_TOKEN')
|
|
85
|
+
.should.be.rejectedWith(/error building erc20 token approval tx: Error: token not supported/);
|
|
86
|
+
});
|
|
87
|
+
it('should build, sign, and send token approval transaction when passphrase is provided', async function () {
|
|
88
|
+
mockBaseCoin.url.returns('/test/wallet/token/approval/build');
|
|
89
|
+
mockBitGo.post.returns({
|
|
90
|
+
send: sinon_1.default.stub().returns({
|
|
91
|
+
result: sinon_1.default.stub().resolves(mockTokenApprovalBuild),
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
94
|
+
const mockKeychain = { id: 'user-key', pub: 'pub-key', encryptedPrv: 'encrypted-prv' };
|
|
95
|
+
mockBaseCoin.keychains.returns({
|
|
96
|
+
get: sinon_1.default.stub().resolves(mockKeychain),
|
|
97
|
+
});
|
|
98
|
+
const signTransactionStub = sinon_1.default.stub(wallet, 'signTransaction').resolves({ txHex: '0xsigned' });
|
|
99
|
+
const sendTransactionStub = sinon_1.default.stub(wallet, 'sendTransaction').resolves({ txid: '0xtxid' });
|
|
100
|
+
const getKeychainsStub = sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves([mockKeychain]);
|
|
101
|
+
const result = await wallet.buildErc20TokenApproval('USDC', 'passphrase123');
|
|
102
|
+
result.should.have.property('txid', '0xtxid');
|
|
103
|
+
sinon_1.default.assert.calledOnce(getKeychainsStub);
|
|
104
|
+
getKeychainsStub.getCall(0).args[0].should.have.property('walletPassphrase', 'passphrase123');
|
|
105
|
+
sinon_1.default.assert.calledOnce(signTransactionStub);
|
|
106
|
+
const signCall = signTransactionStub.getCall(0);
|
|
107
|
+
if (signCall && signCall.args[0]) {
|
|
108
|
+
signCall.args[0].should.have.property('txPrebuild', mockTokenApprovalBuild);
|
|
109
|
+
signCall.args[0].should.have.property('keychain', mockKeychain);
|
|
110
|
+
signCall.args[0].should.have.property('walletPassphrase', 'passphrase123');
|
|
111
|
+
}
|
|
112
|
+
sinon_1.default.assert.calledOnce(sendTransactionStub);
|
|
113
|
+
const sendCall = sendTransactionStub.getCall(0);
|
|
114
|
+
if (sendCall && sendCall.args[0]) {
|
|
115
|
+
sendCall.args[0].should.have.property('txHex', '0xsigned');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
it('should handle signing errors', async function () {
|
|
119
|
+
mockBaseCoin.url.returns('/test/wallet/token/approval/build');
|
|
120
|
+
mockBitGo.post.returns({
|
|
121
|
+
send: sinon_1.default.stub().returns({
|
|
122
|
+
result: sinon_1.default.stub().resolves(mockTokenApprovalBuild),
|
|
123
|
+
}),
|
|
124
|
+
});
|
|
125
|
+
const mockKeychain = { id: 'user-key', pub: 'pub-key', encryptedPrv: 'encrypted-prv' };
|
|
126
|
+
mockBaseCoin.keychains.returns({
|
|
127
|
+
get: sinon_1.default.stub().resolves(mockKeychain),
|
|
128
|
+
});
|
|
129
|
+
sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves([mockKeychain]);
|
|
130
|
+
sinon_1.default.stub(wallet, 'signTransaction').rejects(new Error('signing error'));
|
|
131
|
+
await wallet.buildErc20TokenApproval('USDC', 'passphrase123').should.be.rejectedWith('signing error');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5BcHByb3ZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby93YWxsZXQvdG9rZW5BcHByb3ZhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXFFO0FBRXJFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtJQUNsQyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUNqQixTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDOUIsQ0FBQztRQUVGLGNBQWMsR0FBRztZQUNmLEVBQUUsRUFBRSxnQkFBZ0I7WUFDcEIsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQztTQUM5QyxDQUFDO1FBRUYsTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0Qs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c2hvdWxkJztcbmltcG9ydCB7IEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlLCBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gVG9rZW4gQXBwcm92YWwnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrV2FsbGV0RGF0YTogYW55O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdldGgnKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLFxuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBjb2luOiAndGV0aCcsXG4gICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZEVyYzIwVG9rZW5BcHByb3ZhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2NrVG9rZW5BcHByb3ZhbEJ1aWxkOiBCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSA9IHtcbiAgICAgIHR4SGV4OiAnMHgxMjM0NTYnLFxuICAgICAgdHhJbmZvOiB7XG4gICAgICAgIGFtb3VudDogJzB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZicsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogJzB4MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCcsXG4gICAgICAgIHNwZW5kZXI6ICcweDA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEnLFxuICAgICAgfSxcbiAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6ICcweDA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEnLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIGRhdGE6ICcweDA5NWVhN2IzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVpcDE1NTk6IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiAnMHgzYjlhY2EwMCcsXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnMHgzYjlhY2EwMCcsXG4gICAgICB9LFxuICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgIGNvaW46ICd0ZXRoJyxcbiAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgIH07XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uIHdpdGhvdXQgc2lnbmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tUb2tlbkFwcHJvdmFsQnVpbGQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuYnVpbGRFcmMyMFRva2VuQXBwcm92YWwoJ1VTREMnKTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5lcWwobW9ja1Rva2VuQXBwcm92YWxCdWlsZCk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aChtb2NrQmFzZUNvaW4udXJsLCAnL3dhbGxldC90ZXN0LXdhbGxldC1pZC90b2tlbi9hcHByb3ZhbC9idWlsZCcpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UobW9ja0JpdEdvLnBvc3QpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UobW9ja0JpdEdvLnNldFJlcXVlc3RUcmFjZXIpO1xuICAgICAgY29uc3QgcG9zdFJlcXVlc3QgPSBtb2NrQml0R28ucG9zdC5nZXRDYWxsKDApO1xuICAgICAgY29uc3Qgc2VuZENhbGwgPSBwb3N0UmVxdWVzdC5yZXR1cm5WYWx1ZS5zZW5kLmdldENhbGwoMCk7XG4gICAgICBzZW5kQ2FsbC5hcmdzWzBdLnNob3VsZC5lcWwoeyB0b2tlbk5hbWU6ICdVU0RDJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgdG9rZW4gYnVpbGQgcmVxdWVzdCBmYWlscycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlamVjdHMobmV3IEVycm9yKCd0b2tlbiBub3Qgc3VwcG9ydGVkJykpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRcbiAgICAgICAgLmJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKCdJTlZBTElEX1RPS0VOJylcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2Vycm9yIGJ1aWxkaW5nIGVyYzIwIHRva2VuIGFwcHJvdmFsIHR4OiBFcnJvcjogdG9rZW4gbm90IHN1cHBvcnRlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCwgc2lnbiwgYW5kIHNlbmQgdG9rZW4gYXBwcm92YWwgdHJhbnNhY3Rpb24gd2hlbiBwYXNzcGhyYXNlIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLnVybC5yZXR1cm5zKCcvdGVzdC93YWxsZXQvdG9rZW4vYXBwcm92YWwvYnVpbGQnKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoe1xuICAgICAgICBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7XG4gICAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMobW9ja1Rva2VuQXBwcm92YWxCdWlsZCksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vY2tLZXljaGFpbiA9IHsgaWQ6ICd1c2VyLWtleScsIHB1YjogJ3B1Yi1rZXknLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9O1xuICAgICAgbW9ja0Jhc2VDb2luLmtleWNoYWlucy5yZXR1cm5zKHtcbiAgICAgICAgZ2V0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMobW9ja0tleWNoYWluKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25TdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nIGFzIGtleW9mIFdhbGxldCkucmVzb2x2ZXMoeyB0eEhleDogJzB4c2lnbmVkJyB9KTtcbiAgICAgIGNvbnN0IHNlbmRUcmFuc2FjdGlvblN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRUcmFuc2FjdGlvbicgYXMga2V5b2YgV2FsbGV0KS5yZXNvbHZlcyh7IHR4aWQ6ICcweHR4aWQnIH0pO1xuICAgICAgY29uc3QgZ2V0S2V5Y2hhaW5zU3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZScpLnJlc29sdmVzKFttb2NrS2V5Y2hhaW5dKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKCdVU0RDJywgJ3Bhc3NwaHJhc2UxMjMnKTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eGlkJywgJzB4dHhpZCcpO1xuXG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShnZXRLZXljaGFpbnNTdHViKTtcbiAgICAgIGdldEtleWNoYWluc1N0dWIuZ2V0Q2FsbCgwKS5hcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJywgJ3Bhc3NwaHJhc2UxMjMnKTtcblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2Uoc2lnblRyYW5zYWN0aW9uU3R1Yik7XG4gICAgICBjb25zdCBzaWduQ2FsbCA9IHNpZ25UcmFuc2FjdGlvblN0dWIuZ2V0Q2FsbCgwKTtcbiAgICAgIGlmIChzaWduQ2FsbCAmJiBzaWduQ2FsbC5hcmdzWzBdKSB7XG4gICAgICAgIHNpZ25DYWxsLmFyZ3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4UHJlYnVpbGQnLCBtb2NrVG9rZW5BcHByb3ZhbEJ1aWxkKTtcbiAgICAgICAgc2lnbkNhbGwuYXJnc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgna2V5Y2hhaW4nLCBtb2NrS2V5Y2hhaW4pO1xuICAgICAgICBzaWduQ2FsbC5hcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJywgJ3Bhc3NwaHJhc2UxMjMnKTtcbiAgICAgIH1cblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2Uoc2VuZFRyYW5zYWN0aW9uU3R1Yik7XG4gICAgICBjb25zdCBzZW5kQ2FsbCA9IHNlbmRUcmFuc2FjdGlvblN0dWIuZ2V0Q2FsbCgwKTtcbiAgICAgIGlmIChzZW5kQ2FsbCAmJiBzZW5kQ2FsbC5hcmdzWzBdKSB7XG4gICAgICAgIHNlbmRDYWxsLmFyZ3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4SGV4JywgJzB4c2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzaWduaW5nIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tUb2tlbkFwcHJvdmFsQnVpbGQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtb2NrS2V5Y2hhaW4gPSB7IGlkOiAndXNlci1rZXknLCBwdWI6ICdwdWIta2V5JywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLXBydicgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5rZXljaGFpbnMucmV0dXJucyh7XG4gICAgICAgIGdldDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tLZXljaGFpbiksXG4gICAgICB9KTtcblxuICAgICAgc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlJykucmVzb2x2ZXMoW21vY2tLZXljaGFpbl0pO1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nIGFzIGtleW9mIFdhbGxldCkucmVqZWN0cyhuZXcgRXJyb3IoJ3NpZ25pbmcgZXJyb3InKSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5idWlsZEVyYzIwVG9rZW5BcHByb3ZhbCgnVVNEQycsICdwYXNzcGhyYXNlMTIzJykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnc2lnbmluZyBlcnJvcicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|