@bitgo-beta/sdk-coin-eth 4.4.1-beta.162 → 4.4.1-beta.1621
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/erc20Token.d.ts +13 -5
- package/dist/src/erc20Token.d.ts.map +1 -1
- package/dist/src/erc20Token.js +65 -27
- package/dist/src/erc721Token.d.ts +60 -0
- package/dist/src/erc721Token.d.ts.map +1 -0
- package/dist/src/erc721Token.js +334 -0
- package/dist/src/eth.d.ts +24 -519
- package/dist/src/eth.d.ts.map +1 -1
- package/dist/src/eth.js +215 -1596
- package/dist/src/gteth.d.ts +0 -4
- package/dist/src/gteth.d.ts.map +1 -1
- package/dist/src/gteth.js +1 -11
- package/dist/src/hteth.d.ts +0 -4
- package/dist/src/hteth.d.ts.map +1 -1
- package/dist/src/hteth.js +1 -11
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +7 -2
- package/dist/src/lib/messages/index.d.ts +3 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +6 -0
- package/dist/src/lib/transactionBuilder.d.ts +9 -11
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +13 -24
- package/dist/src/register.d.ts +2 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +13 -2
- package/dist/src/teth.d.ts +0 -3
- package/dist/src/teth.d.ts.map +1 -1
- package/dist/src/teth.js +1 -8
- package/dist/test/fixtures/eth.d.ts +39 -0
- package/dist/test/fixtures/eth.d.ts.map +1 -0
- package/dist/test/fixtures/eth.js +262 -0
- package/dist/test/resources/erc1155Abi.d.ts +40 -0
- package/dist/test/resources/erc1155Abi.d.ts.map +1 -0
- package/dist/test/resources/erc1155Abi.js +329 -0
- package/dist/test/resources/erc721Abi.d.ts +12 -0
- package/dist/test/resources/erc721Abi.d.ts.map +1 -0
- package/dist/test/resources/erc721Abi.js +34 -0
- package/dist/test/resources/eth.d.ts +51 -0
- package/dist/test/resources/eth.d.ts.map +1 -0
- package/dist/test/resources/eth.js +72 -0
- package/dist/test/resources/nftEncodings.d.ts +4 -0
- package/dist/test/resources/nftEncodings.d.ts.map +1 -0
- package/dist/test/resources/nftEncodings.js +7 -0
- package/dist/test/resources/walletSimpleAbi.d.ts +12 -0
- package/dist/test/resources/walletSimpleAbi.d.ts.map +1 -0
- package/dist/test/resources/walletSimpleAbi.js +44 -0
- package/dist/test/unit/eth.d.ts +2 -0
- package/dist/test/unit/eth.d.ts.map +1 -0
- package/dist/test/unit/eth.js +2149 -0
- package/dist/test/unit/ethWallet.d.ts +2 -0
- package/dist/test/unit/ethWallet.d.ts.map +1 -0
- package/dist/test/unit/ethWallet.js +472 -0
- package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts +4 -0
- package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/ethMultiSigBackupKey.js +10 -0
- package/dist/test/unit/fixtures/ethTssBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/ethTssBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/ethTssBackupKey.js +25 -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/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +175 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +96 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.js +101 -0
- package/dist/test/unit/transactionBuilder/contractCall.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractCall.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractCall.js +101 -0
- package/dist/test/unit/transactionBuilder/flushCoins.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/flushCoins.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/flushCoins.js +133 -0
- package/dist/test/unit/transactionBuilder/flushTokens.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/flushTokens.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/flushTokens.js +281 -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 +331 -0
- package/dist/test/unit/transactionBuilder/sendNFT.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sendNFT.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sendNFT.js +250 -0
- package/dist/test/unit/transactionBuilder/singleSigSend.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/singleSigSend.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/singleSigSend.js +196 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.js +423 -0
- package/dist/test/unit/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transferBuilder.js +124 -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 +74 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -18
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -375
|
@@ -0,0 +1,423 @@
|
|
|
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 assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
42
|
+
const src_1 = require("../../../src");
|
|
43
|
+
const testData = __importStar(require("../../resources/eth"));
|
|
44
|
+
const getBuilder_1 = require("../getBuilder");
|
|
45
|
+
describe('Eth Transaction builder wallet initialization', function () {
|
|
46
|
+
const sourcePrv = 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2';
|
|
47
|
+
const pub1 = 'xpub661MyMwAqRbcGpyL5QvWah4XZYHuTK21mSQ4NVwYaX67A35Kzb42nmTdf2WArW4tettXrWpfpwFbEFdEVqcSvnHLB8F6p1D41ssmbnRMXpc';
|
|
48
|
+
const pub2 = 'xpub661MyMwAqRbcFWzoz8qnYRDYEFQpPLYwxVFoG6WLy3ck5ZupRGJTG4ju6yGb7Dj3ey6GsC4kstLRER2nKzgjLtmxyPgC4zHy7kVhUt6yfGn';
|
|
49
|
+
const defaultKeyPair = new src_1.KeyPair({
|
|
50
|
+
prv: 'FAC4D04AA0025ECF200D74BC9B5E4616E4B8338B69B61362AAAD49F76E68EF28',
|
|
51
|
+
});
|
|
52
|
+
const buildTransaction = async function (details) {
|
|
53
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('teth');
|
|
54
|
+
if (details.type !== undefined) {
|
|
55
|
+
txBuilder.type(details.type);
|
|
56
|
+
}
|
|
57
|
+
if (details.fee !== undefined) {
|
|
58
|
+
txBuilder.fee(details.fee);
|
|
59
|
+
}
|
|
60
|
+
if (details.counter !== undefined) {
|
|
61
|
+
txBuilder.counter(details.counter);
|
|
62
|
+
}
|
|
63
|
+
if (details.owners !== undefined) {
|
|
64
|
+
for (const owner of details.owners) {
|
|
65
|
+
txBuilder.owner(owner);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return await txBuilder.build();
|
|
69
|
+
};
|
|
70
|
+
describe('should build', () => {
|
|
71
|
+
it('a wallet initialization transaction', async () => {
|
|
72
|
+
const tx = await buildTransaction({
|
|
73
|
+
type: sdk_core_1.TransactionType.WalletInitialization,
|
|
74
|
+
fee: {
|
|
75
|
+
fee: '10',
|
|
76
|
+
gasLimit: '1000',
|
|
77
|
+
},
|
|
78
|
+
source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
79
|
+
owners: [
|
|
80
|
+
new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
81
|
+
new src_1.KeyPair({ pub: pub1 }).getAddress(),
|
|
82
|
+
new src_1.KeyPair({ pub: pub2 }).getAddress(),
|
|
83
|
+
],
|
|
84
|
+
counter: 1,
|
|
85
|
+
});
|
|
86
|
+
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
87
|
+
const txJson = tx.toJson();
|
|
88
|
+
txJson.gasLimit.should.equal('1000');
|
|
89
|
+
txJson._type.should.equals(src_1.ETHTransactionType.LEGACY);
|
|
90
|
+
txJson.gasPrice.should.equal('10');
|
|
91
|
+
should_1.default.equal(txJson.nonce, 1);
|
|
92
|
+
should_1.default.equal(txJson.chainId, 42);
|
|
93
|
+
should_1.default.equal(txJson.v, '0x77');
|
|
94
|
+
});
|
|
95
|
+
it('a wallet initialization transaction with nonce 0', async () => {
|
|
96
|
+
const tx = await buildTransaction({
|
|
97
|
+
type: sdk_core_1.TransactionType.WalletInitialization,
|
|
98
|
+
fee: {
|
|
99
|
+
fee: '10',
|
|
100
|
+
gasLimit: '1000',
|
|
101
|
+
},
|
|
102
|
+
owners: [
|
|
103
|
+
new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
104
|
+
new src_1.KeyPair({ pub: pub1 }).getAddress(),
|
|
105
|
+
new src_1.KeyPair({ pub: pub2 }).getAddress(),
|
|
106
|
+
],
|
|
107
|
+
counter: 0,
|
|
108
|
+
});
|
|
109
|
+
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
110
|
+
const txJson = tx.toJson();
|
|
111
|
+
txJson.gasLimit.should.equal('1000');
|
|
112
|
+
txJson._type.should.equals(src_1.ETHTransactionType.LEGACY);
|
|
113
|
+
txJson.gasPrice.should.equal('10');
|
|
114
|
+
should_1.default.equal(txJson.nonce, 0);
|
|
115
|
+
should_1.default.equal(txJson.chainId, 42);
|
|
116
|
+
should_1.default.equal(txJson.v, '0x77');
|
|
117
|
+
});
|
|
118
|
+
it('an unsigned init transaction from serialized with 0-prefixed address', async () => {
|
|
119
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
120
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
121
|
+
txBuilder.counter(1);
|
|
122
|
+
txBuilder.fee({
|
|
123
|
+
fee: '10000000000',
|
|
124
|
+
gasLimit: '2000000',
|
|
125
|
+
});
|
|
126
|
+
txBuilder.owner('0x6461EC4E9dB87CFE2aeEc7d9b02Aa264edFbf41f');
|
|
127
|
+
txBuilder.owner('0xf10C8f42BD63D0AeD3338A6B2b661BC6D9fa7C44');
|
|
128
|
+
txBuilder.owner('0x07ee8b845b8bf0e807e096d6b1599b121b82cbe1');
|
|
129
|
+
const tx = await txBuilder.build();
|
|
130
|
+
const serialized = tx.toBroadcastFormat();
|
|
131
|
+
// now rebuild from the signed serialized tx and make sure it stays the same
|
|
132
|
+
const newTxBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
133
|
+
newTxBuilder.from(serialized);
|
|
134
|
+
const newTx = await newTxBuilder.build();
|
|
135
|
+
should_1.default.equal(newTx.toBroadcastFormat(), serialized);
|
|
136
|
+
});
|
|
137
|
+
it('an unsigned init transaction from serialized', async () => {
|
|
138
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
139
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
140
|
+
txBuilder.counter(1);
|
|
141
|
+
txBuilder.fee({
|
|
142
|
+
fee: '10000000000',
|
|
143
|
+
gasLimit: '2000000',
|
|
144
|
+
});
|
|
145
|
+
txBuilder.owner('0x6461EC4E9dB87CFE2aeEc7d9b02Aa264edFbf41f');
|
|
146
|
+
txBuilder.owner('0xf10C8f42BD63D0AeD3338A6B2b661BC6D9fa7C44');
|
|
147
|
+
txBuilder.owner('0xa4b5666FB4fFEA84Dd848845E1114b84146de4b3');
|
|
148
|
+
const tx = await txBuilder.build();
|
|
149
|
+
const serialized = tx.toBroadcastFormat();
|
|
150
|
+
// now rebuild from the signed serialized tx and make sure it stays the same
|
|
151
|
+
const newTxBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
152
|
+
newTxBuilder.from(serialized);
|
|
153
|
+
const newTx = await newTxBuilder.build();
|
|
154
|
+
should_1.default.equal(newTx.toBroadcastFormat(), serialized);
|
|
155
|
+
});
|
|
156
|
+
it('a signed init transaction from serialized', async () => {
|
|
157
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('teth');
|
|
158
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
159
|
+
txBuilder.counter(1);
|
|
160
|
+
txBuilder.fee({
|
|
161
|
+
fee: '10000000000',
|
|
162
|
+
gasLimit: '2000000',
|
|
163
|
+
});
|
|
164
|
+
txBuilder.owner('0x6461EC4E9dB87CFE2aeEc7d9b02Aa264edFbf41f');
|
|
165
|
+
txBuilder.owner('0xf10C8f42BD63D0AeD3338A6B2b661BC6D9fa7C44');
|
|
166
|
+
txBuilder.owner('0xa4b5666FB4fFEA84Dd848845E1114b84146de4b3');
|
|
167
|
+
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
168
|
+
const tx = await txBuilder.build();
|
|
169
|
+
const serialized = tx.toBroadcastFormat();
|
|
170
|
+
// now rebuild from the signed serialized tx and make sure it stays the same
|
|
171
|
+
const newTxBuilder = (0, getBuilder_1.getBuilder)('teth');
|
|
172
|
+
newTxBuilder.from(serialized);
|
|
173
|
+
const newTx = await newTxBuilder.build();
|
|
174
|
+
should_1.default.equal(newTx.toBroadcastFormat(), serialized);
|
|
175
|
+
should_1.default.equal(newTx.id, '0xef04334f21ba844100b9aee6485f14afe177e88308ad2b8c1b0878576a31d47b');
|
|
176
|
+
const txJson = newTx.toJson();
|
|
177
|
+
should_1.default.exist(txJson.v);
|
|
178
|
+
should_1.default.exist(txJson.r);
|
|
179
|
+
should_1.default.exist(txJson.s);
|
|
180
|
+
should_1.default.exist(txJson.from);
|
|
181
|
+
});
|
|
182
|
+
it('correct transaction id', async () => {
|
|
183
|
+
const newTxBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
184
|
+
newTxBuilder.from(testData.WALLET_INITIALIZATION);
|
|
185
|
+
const newTx = await newTxBuilder.build();
|
|
186
|
+
should_1.default.equal(newTx.toJson().id, '0xc65f9802df3b559b297779ec06d3e71ba7f5b1b47cc961ad2efba54d82347bec');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('should fail to build', () => {
|
|
190
|
+
it('an unsupported type of transaction', async () => {
|
|
191
|
+
await buildTransaction({
|
|
192
|
+
type: sdk_core_1.TransactionType.AccountUpdate,
|
|
193
|
+
fee: {
|
|
194
|
+
fee: '10',
|
|
195
|
+
gasLimit: '10',
|
|
196
|
+
},
|
|
197
|
+
source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
198
|
+
counter: 0,
|
|
199
|
+
}).should.be.rejectedWith('Unsupported transaction type');
|
|
200
|
+
});
|
|
201
|
+
it('a transaction without fee', async () => {
|
|
202
|
+
await buildTransaction({
|
|
203
|
+
source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
204
|
+
counter: 0,
|
|
205
|
+
}).should.be.rejectedWith('Invalid transaction: missing fee');
|
|
206
|
+
});
|
|
207
|
+
it('a wallet initialization the wrong number of owners', async () => {
|
|
208
|
+
await buildTransaction({
|
|
209
|
+
type: sdk_core_1.TransactionType.WalletInitialization,
|
|
210
|
+
fee: {
|
|
211
|
+
fee: '10',
|
|
212
|
+
gasLimit: '10',
|
|
213
|
+
},
|
|
214
|
+
source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
215
|
+
owners: [new src_1.KeyPair({ pub: pub1 }).getAddress(), new src_1.KeyPair({ pub: pub2 }).getAddress()],
|
|
216
|
+
counter: 0,
|
|
217
|
+
}).should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 2');
|
|
218
|
+
await buildTransaction({
|
|
219
|
+
type: sdk_core_1.TransactionType.WalletInitialization,
|
|
220
|
+
fee: {
|
|
221
|
+
fee: '10',
|
|
222
|
+
gasLimit: '10',
|
|
223
|
+
},
|
|
224
|
+
source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
225
|
+
owners: [
|
|
226
|
+
new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
227
|
+
new src_1.KeyPair({ pub: pub1 }).getAddress(),
|
|
228
|
+
new src_1.KeyPair({ pub: pub1 }).getAddress(),
|
|
229
|
+
new src_1.KeyPair({ pub: pub2 }).getAddress(),
|
|
230
|
+
],
|
|
231
|
+
counter: 0,
|
|
232
|
+
}).should.be.rejectedWith('Repeated owner address: ' + new src_1.KeyPair({ pub: pub1 }).getAddress());
|
|
233
|
+
await buildTransaction({
|
|
234
|
+
type: sdk_core_1.TransactionType.WalletInitialization,
|
|
235
|
+
fee: {
|
|
236
|
+
fee: '10',
|
|
237
|
+
gasLimit: '10',
|
|
238
|
+
},
|
|
239
|
+
source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
240
|
+
owners: [],
|
|
241
|
+
counter: 0,
|
|
242
|
+
}).should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 0');
|
|
243
|
+
});
|
|
244
|
+
it('a transaction with invalid counter', async () => {
|
|
245
|
+
await buildTransaction({
|
|
246
|
+
fee: {
|
|
247
|
+
fee: '10',
|
|
248
|
+
gasLimit: '10',
|
|
249
|
+
},
|
|
250
|
+
source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
251
|
+
counter: -1,
|
|
252
|
+
owners: [
|
|
253
|
+
new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
|
|
254
|
+
new src_1.KeyPair({ pub: pub1 }).getAddress(),
|
|
255
|
+
new src_1.KeyPair({ pub: pub2 }).getAddress(),
|
|
256
|
+
],
|
|
257
|
+
}).should.be.rejectedWith('Invalid counter: -1');
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe('should fail to sign', () => {
|
|
261
|
+
it('a wallet initialization transaction without owners', () => {
|
|
262
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
263
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
264
|
+
txBuilder.fee({
|
|
265
|
+
fee: '10',
|
|
266
|
+
gasLimit: '1000',
|
|
267
|
+
});
|
|
268
|
+
txBuilder.counter(1);
|
|
269
|
+
assert_1.default.throws(() => txBuilder.sign({ key: defaultKeyPair.getKeys().prv }));
|
|
270
|
+
});
|
|
271
|
+
it('a signed wallet initialization transaction', () => {
|
|
272
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
273
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
274
|
+
txBuilder.fee({
|
|
275
|
+
fee: '10',
|
|
276
|
+
gasLimit: '1000',
|
|
277
|
+
});
|
|
278
|
+
txBuilder.counter(1);
|
|
279
|
+
txBuilder.owner(new src_1.KeyPair({ pub: pub1 }).getAddress());
|
|
280
|
+
txBuilder.owner(new src_1.KeyPair({ pub: pub2 }).getAddress());
|
|
281
|
+
txBuilder.owner(new src_1.KeyPair({ prv: sourcePrv }).getAddress());
|
|
282
|
+
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
283
|
+
assert_1.default.throws(() => txBuilder.sign({ key: defaultKeyPair.getKeys().prv }), new RegExp('Cannot sign multiple times a non send-type transaction'));
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('should validate', () => {
|
|
287
|
+
it('an address', async () => {
|
|
288
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
289
|
+
txBuilder.validateAddress(testData.VALID_ADDRESS);
|
|
290
|
+
assert_1.default.throws(() => txBuilder.validateAddress(testData.INVALID_ADDRESS), new RegExp('Invalid address ' + testData.INVALID_ADDRESS.address));
|
|
291
|
+
});
|
|
292
|
+
it('value should be greater than zero', () => {
|
|
293
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
294
|
+
assert_1.default.throws(() => txBuilder.fee({ fee: '-10' }));
|
|
295
|
+
should_1.default.doesNotThrow(() => txBuilder.fee({ fee: '10' }));
|
|
296
|
+
});
|
|
297
|
+
it('a private key', () => {
|
|
298
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
299
|
+
assert_1.default.throws(() => txBuilder.validateKey({ key: 'abc' }), /Invalid key/);
|
|
300
|
+
assert_1.default.throws(() => txBuilder.validateKey({ key: testData.PUBLIC_KEY }), /Invalid key/);
|
|
301
|
+
should_1.default.doesNotThrow(() => txBuilder.validateKey({ key: testData.PRIVATE_KEY }));
|
|
302
|
+
});
|
|
303
|
+
it('a raw transaction', async () => {
|
|
304
|
+
const builder = (0, getBuilder_1.getBuilder)('eth');
|
|
305
|
+
should_1.default.doesNotThrow(() => builder.from(testData.TX_BROADCAST));
|
|
306
|
+
should_1.default.doesNotThrow(() => builder.from(testData.TX_JSON));
|
|
307
|
+
assert_1.default.throws(() => builder.from('0x00001000'), /There was error in decoding the hex string/);
|
|
308
|
+
assert_1.default.throws(() => builder.from(''), /Raw transaction is empty/);
|
|
309
|
+
assert_1.default.throws(() => builder.from('pqrs'), /There was error in parsing the JSON string/);
|
|
310
|
+
assert_1.default.throws(() => builder.from(1234), /Transaction is not a hex string or stringified json/);
|
|
311
|
+
});
|
|
312
|
+
it('a transaction to build', async () => {
|
|
313
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
314
|
+
txBuilder.counter(undefined);
|
|
315
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
316
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing fee/);
|
|
317
|
+
txBuilder.fee({
|
|
318
|
+
fee: '10',
|
|
319
|
+
gasLimit: '1000',
|
|
320
|
+
});
|
|
321
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing address counter/);
|
|
322
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing address counter/);
|
|
323
|
+
const source = {
|
|
324
|
+
prv: sourcePrv,
|
|
325
|
+
};
|
|
326
|
+
const sourceKeyPair = new src_1.KeyPair(source);
|
|
327
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing address counter/);
|
|
328
|
+
txBuilder.counter(1);
|
|
329
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 0/);
|
|
330
|
+
txBuilder.owner(sourceKeyPair.getAddress());
|
|
331
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 1/);
|
|
332
|
+
txBuilder.owner(new src_1.KeyPair({ pub: pub1 }).getAddress());
|
|
333
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 2/);
|
|
334
|
+
txBuilder.owner(new src_1.KeyPair({ pub: pub2 }).getAddress());
|
|
335
|
+
should_1.default.doesNotThrow(() => txBuilder.validateTransaction());
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
describe('set owner', () => {
|
|
339
|
+
it('should be wallet initializaion', () => {
|
|
340
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
341
|
+
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
342
|
+
const sourceKeyPair = new src_1.KeyPair({ prv: sourcePrv });
|
|
343
|
+
assert_1.default.throws(() => txBuilder.owner(sourceKeyPair.getAddress()), new RegExp('Multisig wallet owner can only be set for initialization transactions'));
|
|
344
|
+
});
|
|
345
|
+
it('should be only 3 owners', () => {
|
|
346
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
347
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
348
|
+
txBuilder.fee({
|
|
349
|
+
fee: '10',
|
|
350
|
+
gasLimit: '1000',
|
|
351
|
+
});
|
|
352
|
+
const sourceKeyPair = new src_1.KeyPair({ prv: sourcePrv });
|
|
353
|
+
txBuilder.counter(1);
|
|
354
|
+
txBuilder.owner(sourceKeyPair.getAddress());
|
|
355
|
+
txBuilder.owner('0x7325A3F7d4f9E86AE62Cf742426078C3755730d5');
|
|
356
|
+
txBuilder.owner('0x603e077acd3F01e81b95fB92ce42FF60dFf3D4C7');
|
|
357
|
+
assert_1.default.throws(() => txBuilder.owner('0x1A88Ee4Bc80BE080fC91AC472Af2F59260695060'), new RegExp('A maximum of 3 owners can be set for a multisig wallet'));
|
|
358
|
+
});
|
|
359
|
+
it('should be a valid address', () => {
|
|
360
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
361
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
362
|
+
txBuilder.fee({
|
|
363
|
+
fee: '10',
|
|
364
|
+
gasLimit: '1000',
|
|
365
|
+
});
|
|
366
|
+
txBuilder.counter(1);
|
|
367
|
+
assert_1.default.throws(() => txBuilder.owner('0x7325A3F7d4f9E86AE62C'), /Invalid address/);
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
it('Should getting same tx hash from raw tx', async function () {
|
|
371
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('eth');
|
|
372
|
+
txBuilder.fee({
|
|
373
|
+
fee: '280000000000',
|
|
374
|
+
gasLimit: '7000000',
|
|
375
|
+
});
|
|
376
|
+
txBuilder.counter(1);
|
|
377
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
378
|
+
txBuilder.owner(new src_1.KeyPair({ pub: pub1 }).getAddress());
|
|
379
|
+
txBuilder.owner(new src_1.KeyPair({ pub: pub2 }).getAddress());
|
|
380
|
+
txBuilder.owner(new src_1.KeyPair({ prv: sourcePrv }).getAddress());
|
|
381
|
+
txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
382
|
+
const tx = await txBuilder.build();
|
|
383
|
+
const txBuiderFromRaw = (0, getBuilder_1.getBuilder)('eth');
|
|
384
|
+
txBuiderFromRaw.from(tx.toBroadcastFormat());
|
|
385
|
+
const txFromRaw = await txBuiderFromRaw.build();
|
|
386
|
+
should_1.default.deepEqual(tx.id, txFromRaw.id);
|
|
387
|
+
});
|
|
388
|
+
describe('Recovery Wallet', function () {
|
|
389
|
+
it('should build and sign using txHex', async () => {
|
|
390
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('gteth');
|
|
391
|
+
const txHex = testData.RECOVERY_WALLET_DEPLOYMENT_TXHEX;
|
|
392
|
+
txBuilder.from(txHex);
|
|
393
|
+
const xpriv = 'xprv9s21ZrQH143K2YKSzZa2fv7QTzZ5Ui45ZUzygDwhfeHodwHbWtUUSKqikMKZR9Z751NMekrjXKBykb8mhvoTrKMRodKBvNDH4XKPkccF1K4';
|
|
394
|
+
txBuilder.sign({ key: xpriv });
|
|
395
|
+
const signedTx = await txBuilder.build();
|
|
396
|
+
should_1.default.exists(signedTx.toBroadcastFormat());
|
|
397
|
+
});
|
|
398
|
+
it('succeed when build via contract call', async () => {
|
|
399
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
|
|
400
|
+
txBuilder.type(sdk_core_1.TransactionType.ContractCall);
|
|
401
|
+
txBuilder.fee({
|
|
402
|
+
eip1559: {
|
|
403
|
+
maxFeePerGas: '100',
|
|
404
|
+
maxPriorityFeePerGas: '10',
|
|
405
|
+
},
|
|
406
|
+
fee: '100',
|
|
407
|
+
gasLimit: '10000',
|
|
408
|
+
});
|
|
409
|
+
const data = testData.SEND_FUNDS_METHOD_CALL;
|
|
410
|
+
txBuilder.counter(1);
|
|
411
|
+
txBuilder.data(data);
|
|
412
|
+
txBuilder.contract('0xd536f4b9f9127a39f19820ca18baac7cd157471f');
|
|
413
|
+
const tx = await txBuilder.build();
|
|
414
|
+
const txhex = tx.toBroadcastFormat();
|
|
415
|
+
const builderFrom = (0, getBuilder_1.getBuilder)('hteth');
|
|
416
|
+
builderFrom.from(txhex);
|
|
417
|
+
const txFrom = await builderFrom.build();
|
|
418
|
+
should_1.default.deepEqual(tx.id, txFrom.id);
|
|
419
|
+
should_1.default.deepEqual(tx.toJson(), txFrom.toJson());
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dhbGxldEluaXRpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQsc0NBQWlHO0FBQ2pHLDhEQUFnRDtBQUNoRCw4Q0FBMkM7QUFFM0MsUUFBUSxDQUFDLCtDQUErQyxFQUFFO0lBQ3hELE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sY0FBYyxHQUFHLElBQUksYUFBTyxDQUFDO1FBQ2pDLEdBQUcsRUFBRSxrRUFBa0U7S0FDeEUsQ0FBQyxDQUFDO0lBV0gsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLFdBQVcsT0FBOEI7UUFDckUsTUFBTSxTQUFTLEdBQVEsSUFBQSx1QkFBVSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlCLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVELElB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LFlBQVksRUFBRSxLQUFLO29CQUNuQixvQkFBb0IsRUFBRSxJQUFJO2lCQUMzQjtnQkFDRCxHQUFHLEVBQUUsS0FBSztnQkFDVixRQUFRLEVBQUUsT0FBTzthQUNsQixDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUM7WUFDN0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNqRSxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxNQUFNLFdBQVcsR0FBRyxJQUFBLHVCQUFVLEVBQUMsT0FBTyxDQUF1QixDQUFDO1lBQzlELFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBLZXlQYWlyLCBFVEhUcmFuc2FjdGlvblR5cGUsIEZlZSwgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9ldGgnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uL2dldEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRXRoIFRyYW5zYWN0aW9uIGJ1aWxkZXIgd2FsbGV0IGluaXRpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBzb3VyY2VQcnYgPVxuICAgICd4cHJ2OXMyMVpyUUgxNDNLM0Q4VFhmdkFKZ0hWZlRFZVFOVzVZczl3WnRuVVprcVB6RnpTamJFSnJXQzF2WjRHblhDdlI3clFMMlVGWDNSU3VZZVU5TXJFUm0xWEJ2QUNvdzdjMzZ2bno1aVl5ajInO1xuICBjb25zdCBwdWIxID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0dweUw1UXZXYWg0WFpZSHVUSzIxbVNRNE5Wd1lhWDY3QTM1S3piNDJubVRkZjJXQXJXNHRldHRYcldwZnB3RmJFRmRFVnFjU3ZuSExCOEY2cDFENDFzc21iblJNWHBjJztcbiAgY29uc3QgcHViMiA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNGV3pvejhxbllSRFlFRlFwUExZd3hWRm9HNldMeTNjazVadXBSR0pURzRqdTZ5R2I3RGozZXk2R3NDNGtzdExSRVIybkt6Z2pMdG14eVBnQzR6SHk3a1ZoVXQ2eWZHbic7XG4gIGNvbnN0IGRlZmF1bHRLZXlQYWlyID0gbmV3IEtleVBhaXIoe1xuICAgIHBydjogJ0ZBQzREMDRBQTAwMjVFQ0YyMDBENzRCQzlCNUU0NjE2RTRCODMzOEI2OUI2MTM2MkFBQUQ0OUY3NkU2OEVGMjgnLFxuICB9KTtcblxuICBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRpb25EZXRhaWxzIHtcbiAgICBmZWU/OiBGZWU7XG4gICAgY2hhaW5JZD86IG51bWJlcjtcbiAgICBjb3VudGVyPzogbnVtYmVyO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBvd25lcnM/OiBzdHJpbmdbXTtcbiAgICB0eXBlPzogVHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRUcmFuc2FjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIChkZXRhaWxzOiBXYWxsZXRDcmVhdGlvbkRldGFpbHMpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCd0ZXRoJyk7XG4gICAgaWYgKGRldGFpbHMudHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0eEJ1aWxkZXIudHlwZShkZXRhaWxzLnR5cGUpO1xuICAgIH1cbiAgICBpZiAoZGV0YWlscy5mZWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHhCdWlsZGVyLmZlZShkZXRhaWxzLmZlZSk7XG4gICAgfVxuXG4gICAgaWYgKGRldGFpbHMuY291bnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcihkZXRhaWxzLmNvdW50ZXIpO1xuICAgIH1cblxuICAgIGlmIChkZXRhaWxzLm93bmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IG93bmVyIG9mIGRldGFpbHMub3duZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQnLCAoKSA9PiB7XG4gICAgaXQoJ2Egd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlOiBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgb3duZXJzOiBbXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIyIH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgXSxcbiAgICAgICAgY291bnRlcjogMSxcbiAgICAgIH0pO1xuXG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uZ2FzTGltaXQuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICB0eEpzb24uX3R5cGUuc2hvdWxkLmVxdWFscyhFVEhUcmFuc2FjdGlvblR5cGUuTEVHQUNZKTtcbiAgICAgIHR4SnNvbi5nYXNQcmljZSEuc2hvdWxkLmVxdWFsKCcxMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5ub25jZSwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmNoYWluSWQsIDQyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udiwgJzB4NzcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHdhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbiB3aXRoIG5vbmNlIDAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgICBnYXNMaW1pdDogJzEwMDAnLFxuICAgICAgICB9LFxuICAgICAgICBvd25lcnM6IFtcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YjIgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICBdLFxuICAgICAgICBjb3VudGVyOiAwLFxuICAgICAgfSk7XG5cbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5nYXNMaW1pdC5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICAgIHR4SnNvbi5fdHlwZS5zaG91bGQuZXF1YWxzKEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1kpO1xuICAgICAgdHhKc29uLmdhc1ByaWNlIS5zaG91bGQuZXF1YWwoJzEwJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm5vbmNlLCAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uY2hhaW5JZCwgNDIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi52LCAnMHg3NycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIHVuc2lnbmVkIGluaXQgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkIHdpdGggMC1wcmVmaXhlZCBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMDAwMDAwMDAwMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMjAwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHg2NDYxRUM0RTlkQjg3Q0ZFMmFlRWM3ZDliMDJBYTI2NGVkRmJmNDFmJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJzB4ZjEwQzhmNDJCRDYzRDBBZUQzMzM4QTZCMmI2NjFCQzZEOWZhN0M0NCcpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCcweDA3ZWU4Yjg0NWI4YmYwZTgwN2UwOTZkNmIxNTk5YjEyMWI4MmNiZTEnKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gbm93IHJlYnVpbGQgZnJvbSB0aGUgc2lnbmVkIHNlcmlhbGl6ZWQgdHggYW5kIG1ha2Ugc3VyZSBpdCBzdGF5cyB0aGUgc2FtZVxuICAgICAgY29uc3QgbmV3VHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIG5ld1R4QnVpbGRlci5mcm9tKHNlcmlhbGl6ZWQpO1xuICAgICAgY29uc3QgbmV3VHggPSBhd2FpdCBuZXdUeEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChuZXdUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCBzZXJpYWxpemVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiB1bnNpZ25lZCBpbml0IHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzIwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJzB4NjQ2MUVDNEU5ZEI4N0NGRTJhZUVjN2Q5YjAyQWEyNjRlZEZiZjQxZicpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCcweGYxMEM4ZjQyQkQ2M0QwQWVEMzMzOEE2QjJiNjYxQkM2RDlmYTdDNDQnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHhhNGI1NjY2RkI0ZkZFQTg0RGQ4NDg4NDVFMTExNGI4NDE0NmRlNGIzJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIG5vdyByZWJ1aWxkIGZyb20gdGhlIHNpZ25lZCBzZXJpYWxpemVkIHR4IGFuZCBtYWtlIHN1cmUgaXQgc3RheXMgdGhlIHNhbWVcbiAgICAgIGNvbnN0IG5ld1R4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICBuZXdUeEJ1aWxkZXIuZnJvbShzZXJpYWxpemVkKTtcbiAgICAgIGNvbnN0IG5ld1R4ID0gYXdhaXQgbmV3VHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgc2VyaWFsaXplZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBzaWduZWQgaW5pdCB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ3RldGgnKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMDAwMDAwMDAwMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMjAwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHg2NDYxRUM0RTlkQjg3Q0ZFMmFlRWM3ZDliMDJBYTI2NGVkRmJmNDFmJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJzB4ZjEwQzhmNDJCRDYzRDBBZUQzMzM4QTZCMmI2NjFCQzZEOWZhN0M0NCcpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCcweGE0YjU2NjZGQjRmRkVBODREZDg0ODg0NUUxMTE0Yjg0MTQ2ZGU0YjMnKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBub3cgcmVidWlsZCBmcm9tIHRoZSBzaWduZWQgc2VyaWFsaXplZCB0eCBhbmQgbWFrZSBzdXJlIGl0IHN0YXlzIHRoZSBzYW1lXG4gICAgICBjb25zdCBuZXdUeEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ3RldGgnKTtcbiAgICAgIG5ld1R4QnVpbGRlci5mcm9tKHNlcmlhbGl6ZWQpO1xuICAgICAgY29uc3QgbmV3VHggPSBhd2FpdCBuZXdUeEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChuZXdUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCBzZXJpYWxpemVkKTtcbiAgICAgIHNob3VsZC5lcXVhbChuZXdUeC5pZCwgJzB4ZWYwNDMzNGYyMWJhODQ0MTAwYjlhZWU2NDg1ZjE0YWZlMTc3ZTg4MzA4YWQyYjhjMWIwODc4NTc2YTMxZDQ3YicpO1xuICAgICAgY29uc3QgdHhKc29uID0gbmV3VHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHhKc29uLnYpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5yKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eEpzb24ucyk7XG4gICAgICBzaG91bGQuZXhpc3QodHhKc29uLmZyb20pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3QgdHJhbnNhY3Rpb24gaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBuZXdUeEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICBuZXdUeEJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5XQUxMRVRfSU5JVElBTElaQVRJT04pO1xuICAgICAgY29uc3QgbmV3VHggPSBhd2FpdCBuZXdUeEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChuZXdUeC50b0pzb24oKS5pZCwgJzB4YzY1Zjk4MDJkZjNiNTU5YjI5Nzc3OWVjMDZkM2U3MWJhN2Y1YjFiNDdjYzk2MWFkMmVmYmE1NGQ4MjM0N2JlYycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8gYnVpbGQnLCAoKSA9PiB7XG4gICAgaXQoJ2FuIHVuc3VwcG9ydGVkIHR5cGUgb2YgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkFjY291bnRVcGRhdGUsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgICBnYXNMaW1pdDogJzEwJyxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlOiBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgY291bnRlcjogMCxcbiAgICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1Vuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGhvdXQgZmVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIHNvdXJjZTogbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgIGNvdW50ZXI6IDAsXG4gICAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGZlZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egd2FsbGV0IGluaXRpYWxpemF0aW9uIHRoZSB3cm9uZyBudW1iZXIgb2Ygb3duZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbixcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICAgIGdhc0xpbWl0OiAnMTAnLFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2U6IG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICBvd25lcnM6IFtuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCksIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIyIH0pLmdldEFkZHJlc3MoKV0sXG4gICAgICAgIGNvdW50ZXI6IDAsXG4gICAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiB3cm9uZyBudW1iZXIgb2Ygb3duZXJzIC0tIHJlcXVpcmVkOiAzLCBmb3VuZDogMicpO1xuXG4gICAgICBhd2FpdCBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgICAgZ2FzTGltaXQ6ICcxMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZTogbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgIG93bmVyczogW1xuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIxIH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YjIgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICBdLFxuICAgICAgICBjb3VudGVyOiAwLFxuICAgICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnUmVwZWF0ZWQgb3duZXIgYWRkcmVzczogJyArIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIxIH0pLmdldEFkZHJlc3MoKSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgICBnYXNMaW1pdDogJzEwJyxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlOiBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgb3duZXJzOiBbXSxcbiAgICAgICAgY291bnRlcjogMCxcbiAgICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IHdyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgY291bnRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgICAgZ2FzTGltaXQ6ICcxMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZTogbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgIGNvdW50ZXI6IC0xLFxuICAgICAgICBvd25lcnM6IFtcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YjIgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICBdLFxuICAgICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCBjb3VudGVyOiAtMScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8gc2lnbicsICgpID0+IHtcbiAgICBpdCgnYSB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24gd2l0aG91dCBvd25lcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ2V0aCcpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMTAwMCcsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBzaWduZWQgd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICBnYXNMaW1pdDogJzEwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiBwdWIyIH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnQ2Fubm90IHNpZ24gbXVsdGlwbGUgdGltZXMgYSBub24gc2VuZC10eXBlIHRyYW5zYWN0aW9uJylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ2FuIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ2V0aCcpO1xuICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh0ZXN0RGF0YS5WQUxJRF9BRERSRVNTKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUFkZHJlc3ModGVzdERhdGEuSU5WQUxJRF9BRERSRVNTKSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnSW52YWxpZCBhZGRyZXNzICcgKyB0ZXN0RGF0YS5JTlZBTElEX0FERFJFU1MuYWRkcmVzcylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmZlZSh7IGZlZTogJy0xMCcgfSkpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAnIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5OiAnYWJjJyB9KSwgL0ludmFsaWQga2V5Lyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdGVzdERhdGEuUFVCTElDX0tFWSB9KSwgL0ludmFsaWQga2V5Lyk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdGVzdERhdGEuUFJJVkFURV9LRVkgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgcmF3IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5UWF9CUk9BRENBU1QpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5mcm9tKHRlc3REYXRhLlRYX0pTT04pKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5mcm9tKCcweDAwMDAxMDAwJyksIC9UaGVyZSB3YXMgZXJyb3IgaW4gZGVjb2RpbmcgdGhlIGhleCBzdHJpbmcvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5mcm9tKCcnKSwgL1JhdyB0cmFuc2FjdGlvbiBpcyBlbXB0eS8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmZyb20oJ3BxcnMnKSwgL1RoZXJlIHdhcyBlcnJvciBpbiBwYXJzaW5nIHRoZSBKU09OIHN0cmluZy8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmZyb20oMTIzNCksIC9UcmFuc2FjdGlvbiBpcyBub3QgYSBoZXggc3RyaW5nIG9yIHN0cmluZ2lmaWVkIGpzb24vKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHRvIGJ1aWxkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKHVuZGVmaW5lZCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBmZWUvKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMTAwMCcsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgYWRkcmVzcyBjb3VudGVyLyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC9JbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGFkZHJlc3MgY291bnRlci8pO1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwcnY6IHNvdXJjZVBydixcbiAgICAgIH07XG4gICAgICBjb25zdCBzb3VyY2VLZXlQYWlyID0gbmV3IEtleVBhaXIoc291cmNlKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgYWRkcmVzcyBjb3VudGVyLyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL3dyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAwLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoc291cmNlS2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvd3JvbmcgbnVtYmVyIG9mIG93bmVycyAtLSByZXF1aXJlZDogMywgZm91bmQ6IDEvKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvd3JvbmcgbnVtYmVyIG9mIG93bmVycyAtLSByZXF1aXJlZDogMywgZm91bmQ6IDIvKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihuZXcgS2V5UGFpcih7IHB1YjogcHViMiB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NldCBvd25lcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJlIHdhbGxldCBpbml0aWFsaXphaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGNvbnN0IHNvdXJjZUtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHhCdWlsZGVyLm93bmVyKHNvdXJjZUtleVBhaXIuZ2V0QWRkcmVzcygpKSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnTXVsdGlzaWcgd2FsbGV0IG93bmVyIGNhbiBvbmx5IGJlIHNldCBmb3IgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb25zJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIG9ubHkgMyBvd25lcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ2V0aCcpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMTAwMCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNvdXJjZUtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoc291cmNlS2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCcweDczMjVBM0Y3ZDRmOUU4NkFFNjJDZjc0MjQyNjA3OEMzNzU1NzMwZDUnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHg2MDNlMDc3YWNkM0YwMWU4MWI5NWZCOTJjZTQyRkY2MGRGZjNENEM3Jyk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIub3duZXIoJzB4MUE4OEVlNEJjODBCRTA4MGZDOTFBQzQ3MkFmMkY1OTI2MDY5NTA2MCcpLFxuICAgICAgICBuZXcgUmVnRXhwKCdBIG1heGltdW0gb2YgMyBvd25lcnMgY2FuIGJlIHNldCBmb3IgYSBtdWx0aXNpZyB3YWxsZXQnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgYSB2YWxpZCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICBnYXNMaW1pdDogJzEwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLm93bmVyKCcweDczMjVBM0Y3ZDRmOUU4NkFFNjJDJyksIC9JbnZhbGlkIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCBnZXR0aW5nIHNhbWUgdHggaGFzaCBmcm9tIHJhdyB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ2V0aCcpO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgIGdhc0xpbWl0OiAnNzAwMDAwMCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHB1YjIgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCkpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhCdWlkZXJGcm9tUmF3OiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICB0eEJ1aWRlckZyb21SYXcuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICBjb25zdCB0eEZyb21SYXcgPSBhd2FpdCB0eEJ1aWRlckZyb21SYXcuYnVpbGQoKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlkLCB0eEZyb21SYXcuaWQpO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlcnkgV2FsbGV0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gdXNpbmcgdHhIZXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdndGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIGNvbnN0IHR4SGV4ID0gdGVzdERhdGEuUkVDT1ZFUllfV0FMTEVUX0RFUExPWU1FTlRfVFhIRVg7XG4gICAgICB0eEJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgICBjb25zdCB4cHJpdiA9XG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLMllLU3paYTJmdjdRVHpaNVVpNDVaVXp5Z0R3aGZlSG9kd0hiV3RVVVNLcWlrTUtaUjlaNzUxTk1la3JqWEtCeWtiOG1odm9UcktNUm9kS0J2TkRINFhLUGtjY0YxSzQnO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHhwcml2IH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5leGlzdHMoc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3VjY2VlZCB3aGVuIGJ1aWxkIHZpYSBjb250cmFjdCBjYWxsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBlaXAxNTU5OiB7XG4gICAgICAgICAgbWF4RmVlUGVyR2FzOiAnMTAwJyxcbiAgICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogJzEwJyxcbiAgICAgICAgfSxcbiAgICAgICAgZmVlOiAnMTAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwMCcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRlc3REYXRhLlNFTkRfRlVORFNfTUVUSE9EX0NBTEw7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIHR4QnVpbGRlci5kYXRhKGRhdGEpO1xuICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KCcweGQ1MzZmNGI5ZjkxMjdhMzlmMTk4MjBjYTE4YmFhYzdjZDE1NzQ3MWYnKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eGhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBidWlsZGVyRnJvbSA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgYnVpbGRlckZyb20uZnJvbSh0eGhleCk7XG4gICAgICBjb25zdCB0eEZyb20gPSBhd2FpdCBidWlsZGVyRnJvbS5idWlsZCgpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pZCwgdHhGcm9tLmlkKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Kc29uKCksIHR4RnJvbS50b0pzb24oKSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transferBuilder.ts"],"names":[],"mappings":""}
|