@bitgo/sdk-coin-xtz 2.8.2 → 2.8.3
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/test/fixtures.d.ts +571 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +656 -0
- package/dist/test/resources.d.ts +451 -0
- package/dist/test/resources.d.ts.map +1 -0
- package/dist/test/resources.js +349 -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 +142 -0
- package/dist/test/unit/offlineTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/offlineTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/offlineTransactionBuilder.js +291 -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 +98 -0
- package/dist/test/unit/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.js +656 -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 +82 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +198 -0
- package/dist/test/unit/xtz.d.ts +2 -0
- package/dist/test/unit/xtz.d.ts.map +1 -0
- package/dist/test/unit/xtz.js +192 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +9 -6
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -788
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offlineTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/offlineTransactionBuilder.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,291 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
7
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
8
|
+
const statics_1 = require("@bitgo/statics");
|
|
9
|
+
const src_1 = require("../../src");
|
|
10
|
+
const nock_1 = __importDefault(require("nock"));
|
|
11
|
+
const sdk_test_1 = require("@bitgo/sdk-test");
|
|
12
|
+
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
13
|
+
const fixtures_1 = require("../fixtures");
|
|
14
|
+
describe('Offline Tezos Transaction builder', function () {
|
|
15
|
+
let bitgo;
|
|
16
|
+
before(() => {
|
|
17
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
18
|
+
bitgo.safeRegister('txtz', src_1.Txtz.createInstance);
|
|
19
|
+
});
|
|
20
|
+
const defaultKeyPair = new src_1.XtzLib.KeyPair({
|
|
21
|
+
prv: 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2',
|
|
22
|
+
});
|
|
23
|
+
describe('should build and sign', () => {
|
|
24
|
+
const baseUrl = sdk_core_1.common.Environments.test.xtzExplorerBaseUrl;
|
|
25
|
+
it('an init transaction', async () => {
|
|
26
|
+
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
27
|
+
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
|
|
28
|
+
txBuilder.fee({
|
|
29
|
+
fee: '4764',
|
|
30
|
+
gasLimit: '33971',
|
|
31
|
+
storageLimit: '1292',
|
|
32
|
+
});
|
|
33
|
+
txBuilder.source(defaultKeyPair.getAddress());
|
|
34
|
+
txBuilder.initialBalance('1000000');
|
|
35
|
+
txBuilder.counter('0');
|
|
36
|
+
txBuilder.owner('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
|
|
37
|
+
txBuilder.owner('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
|
|
38
|
+
txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
|
|
39
|
+
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
40
|
+
const tx = await txBuilder.build();
|
|
41
|
+
tx.id.should.equal('');
|
|
42
|
+
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
43
|
+
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
44
|
+
should_1.default.equal(tx.inputs.length, 1);
|
|
45
|
+
should_1.default.equal(tx.outputs.length, 1);
|
|
46
|
+
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
47
|
+
tx.inputs[0].value.should.equal('1004764');
|
|
48
|
+
tx.outputs[0].address.should.equal('');
|
|
49
|
+
tx.outputs[0].value.should.equal('1000000');
|
|
50
|
+
tx.signature.length.should.equal(0);
|
|
51
|
+
const offlineTxBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
52
|
+
offlineTxBuilder.from(tx.toBroadcastFormat());
|
|
53
|
+
offlineTxBuilder.source(defaultKeyPair.getAddress());
|
|
54
|
+
offlineTxBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
55
|
+
const signedTx = await offlineTxBuilder.build();
|
|
56
|
+
signedTx.id.should.equal('opNfjjEfWk7HsnY8fQrUoPFuXZfABweubA6D4bVScmqoVzcZVFA');
|
|
57
|
+
signedTx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
58
|
+
should_1.default.equal(signedTx.inputs.length, 1);
|
|
59
|
+
should_1.default.equal(signedTx.outputs.length, 1);
|
|
60
|
+
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
61
|
+
signedTx.inputs[0].value.should.equal('1004764');
|
|
62
|
+
signedTx.outputs[0].address.should.equal('KT1J9LfhDV6FQxR7aMaK7R6Rw8mBpfhP5MA3');
|
|
63
|
+
signedTx.outputs[0].value.should.equal('1000000');
|
|
64
|
+
signedTx.signature.length.should.equal(1);
|
|
65
|
+
signedTx.signature[0].should.equal('sigVD57haAMCobHrCwH9ABfbFvdmyR9ZspZC3Zihb9tEPfhtzCKS1F8fLoVpodvor3PUoo7ry4j46xYETEzELmtnrNTaTPX4');
|
|
66
|
+
});
|
|
67
|
+
it('a reveal transaction', async () => {
|
|
68
|
+
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
69
|
+
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
|
|
70
|
+
txBuilder.source(defaultKeyPair.getAddress());
|
|
71
|
+
txBuilder.counter('0');
|
|
72
|
+
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
73
|
+
txBuilder.publicKeyToReveal(defaultKeyPair.getKeys().pub);
|
|
74
|
+
const tx = await txBuilder.build();
|
|
75
|
+
tx.id.should.equal('');
|
|
76
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AccountUpdate);
|
|
77
|
+
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
78
|
+
should_1.default.equal(tx.inputs.length, 1);
|
|
79
|
+
should_1.default.equal(tx.outputs.length, 0);
|
|
80
|
+
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
81
|
+
tx.inputs[0].value.should.equal('1420');
|
|
82
|
+
const offlineTxBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
83
|
+
offlineTxBuilder.from(tx.toBroadcastFormat());
|
|
84
|
+
offlineTxBuilder.source(defaultKeyPair.getAddress());
|
|
85
|
+
offlineTxBuilder.sign({ key: defaultKeyPair.getKeys().prv });
|
|
86
|
+
const signedTx = await offlineTxBuilder.build();
|
|
87
|
+
signedTx.id.should.equal('oomXs6PuWtmGwMKoXTNsu9XJHnGXtuRujcHMeYS9y37Xj6sXPHb');
|
|
88
|
+
signedTx.type.should.equal(sdk_core_1.TransactionType.AccountUpdate);
|
|
89
|
+
signedTx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
90
|
+
should_1.default.equal(signedTx.inputs.length, 1);
|
|
91
|
+
should_1.default.equal(signedTx.outputs.length, 0);
|
|
92
|
+
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
93
|
+
signedTx.inputs[0].value.should.equal('1420');
|
|
94
|
+
signedTx.signature.length.should.equal(1);
|
|
95
|
+
signedTx.signature[0].should.equal('sigQyYsfhtrJBKZuJSEizDdxoejNVvJWRZPDMWdpXVvdTVix37HzURwXfXsi9METnRzskvjgsBSgiF4pr7RVxzWLuixxJL8U');
|
|
96
|
+
});
|
|
97
|
+
it('a send transaction to single destinations', async () => {
|
|
98
|
+
const testDataToSign = '0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b';
|
|
99
|
+
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
100
|
+
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
101
|
+
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
102
|
+
txBuilder.counter('0');
|
|
103
|
+
txBuilder.source(defaultKeyPair.getAddress());
|
|
104
|
+
txBuilder
|
|
105
|
+
.transfer('100')
|
|
106
|
+
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
107
|
+
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
108
|
+
.fee('4764')
|
|
109
|
+
.counter('1');
|
|
110
|
+
const tx = await txBuilder.build();
|
|
111
|
+
tx.toBroadcastFormat().should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000000760707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b0200000006030603060306');
|
|
112
|
+
// Offline signing from location 1 with a transfer key
|
|
113
|
+
const offlineTxBuilder1 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
114
|
+
offlineTxBuilder1.from(tx.toBroadcastFormat());
|
|
115
|
+
offlineTxBuilder1.source(defaultKeyPair.getAddress());
|
|
116
|
+
// Since dataToSign cannot me calculated, it has to be passed to the new builder so we can
|
|
117
|
+
// generate the signatures
|
|
118
|
+
offlineTxBuilder1.overrideDataToSign({ dataToSign: testDataToSign });
|
|
119
|
+
offlineTxBuilder1.sign({
|
|
120
|
+
key: new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' }).getKeys().prv,
|
|
121
|
+
});
|
|
122
|
+
const signedTx1 = await offlineTxBuilder1.build();
|
|
123
|
+
// Offline signing from location 2 with another transfer key
|
|
124
|
+
const offlineTxBuilder2 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
125
|
+
offlineTxBuilder2.from(signedTx1.toBroadcastFormat());
|
|
126
|
+
offlineTxBuilder2.source(defaultKeyPair.getAddress());
|
|
127
|
+
offlineTxBuilder2.overrideDataToSign({ dataToSign: testDataToSign });
|
|
128
|
+
offlineTxBuilder2.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv });
|
|
129
|
+
const signedTx2 = await offlineTxBuilder2.build();
|
|
130
|
+
// Offline signing from location 3 with the fee key
|
|
131
|
+
const offlineTxBuilder3 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
132
|
+
offlineTxBuilder3.from(signedTx2.toBroadcastFormat());
|
|
133
|
+
offlineTxBuilder3.source(defaultKeyPair.getAddress());
|
|
134
|
+
offlineTxBuilder3.sign({ key: defaultKeyPair.getKeys().prv });
|
|
135
|
+
const signedTx = await offlineTxBuilder3.build();
|
|
136
|
+
signedTx.id.should.equal('onkHwfuYJMrtxNdyL6eHeNEHuE1n5HPH75CXUNh91agjbQAxwzT');
|
|
137
|
+
signedTx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
138
|
+
should_1.default.equal(signedTx.inputs.length, 2);
|
|
139
|
+
should_1.default.equal(signedTx.outputs.length, 1);
|
|
140
|
+
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
141
|
+
signedTx.inputs[0].value.should.equal('4764');
|
|
142
|
+
signedTx.inputs[1].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
|
|
143
|
+
signedTx.inputs[1].value.should.equal('100');
|
|
144
|
+
signedTx.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
|
|
145
|
+
signedTx.outputs[0].value.should.equal('100');
|
|
146
|
+
signedTx.signature.length.should.equal(1);
|
|
147
|
+
signedTx.signature[0].should.equal('sigd8B36JUVyDqpCvV1GtbLpP398gpmwfxvGQM6eQ45JG5z4LgDRX55YPAPTMW2pAciwaA3jv8wgyxR9cnEjsCFs1QRPfQ9G');
|
|
148
|
+
signedTx
|
|
149
|
+
.toBroadcastFormat()
|
|
150
|
+
.should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000001400707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a4750030673b1393fbda4f24e07958136dc7951e0d020748e54bd29b847323ef2bc85c399657f4359fc10a13e5afe7b7068b584ea2e578736250881481e212e9793bfbf88');
|
|
151
|
+
});
|
|
152
|
+
it('a send transaction to multiple destinations', async () => {
|
|
153
|
+
const testDataToSign = '0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b';
|
|
154
|
+
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
155
|
+
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
156
|
+
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
|
|
157
|
+
txBuilder.counter('0');
|
|
158
|
+
txBuilder.source(defaultKeyPair.getAddress());
|
|
159
|
+
txBuilder
|
|
160
|
+
.transfer('100')
|
|
161
|
+
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
162
|
+
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
|
|
163
|
+
.fee('4764')
|
|
164
|
+
.counter('1');
|
|
165
|
+
txBuilder
|
|
166
|
+
.transfer('100')
|
|
167
|
+
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
|
|
168
|
+
.to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A')
|
|
169
|
+
.fee('4764')
|
|
170
|
+
.counter('2');
|
|
171
|
+
const tx = await txBuilder.build();
|
|
172
|
+
tx.toBroadcastFormat().should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000000760707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000060306030603066c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2501e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e0000005a070707070002050502000000420320053d036d0743035d0100000024747a3156526a5270564b6e76313641567072464831746b446e3454446656714138393341031e0743036a00a401034f034d031b0200000006030603060306');
|
|
173
|
+
// Offline signing from location 1 with a transfer key
|
|
174
|
+
const offlineTxBuilder1 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
175
|
+
offlineTxBuilder1.from(tx.toBroadcastFormat());
|
|
176
|
+
offlineTxBuilder1.source(defaultKeyPair.getAddress());
|
|
177
|
+
// Since dataToSign cannot me calculated, it has to be passed to the new builder so we can
|
|
178
|
+
// generate the signatures
|
|
179
|
+
offlineTxBuilder1.overrideDataToSign({ dataToSign: testDataToSign, index: 0 });
|
|
180
|
+
offlineTxBuilder1.overrideDataToSign({ dataToSign: testDataToSign, index: 1 });
|
|
181
|
+
offlineTxBuilder1.sign({
|
|
182
|
+
key: new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' }).getKeys().prv,
|
|
183
|
+
});
|
|
184
|
+
const signedTx1 = await offlineTxBuilder1.build();
|
|
185
|
+
// Offline signing from location 2 with another transfer key
|
|
186
|
+
const offlineTxBuilder2 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
187
|
+
offlineTxBuilder2.from(signedTx1.toBroadcastFormat());
|
|
188
|
+
offlineTxBuilder2.source(defaultKeyPair.getAddress());
|
|
189
|
+
offlineTxBuilder2.overrideDataToSign({ dataToSign: testDataToSign, index: 0 });
|
|
190
|
+
offlineTxBuilder2.overrideDataToSign({ dataToSign: testDataToSign, index: 1 });
|
|
191
|
+
offlineTxBuilder2.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv, index: 1 });
|
|
192
|
+
const signedTx2 = await offlineTxBuilder2.build();
|
|
193
|
+
// Offline signing from location 3 with the fee key
|
|
194
|
+
const offlineTxBuilder3 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
|
|
195
|
+
offlineTxBuilder3.from(signedTx2.toBroadcastFormat());
|
|
196
|
+
offlineTxBuilder3.source(defaultKeyPair.getAddress());
|
|
197
|
+
offlineTxBuilder3.sign({ key: defaultKeyPair.getKeys().prv });
|
|
198
|
+
const signedTx = await offlineTxBuilder3.build();
|
|
199
|
+
signedTx.id.should.equal('onyGaWs6z4bVVcfn3h9KbBrktEhuDyJLYEVB4aJRM6YNngjDxE4');
|
|
200
|
+
signedTx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
201
|
+
signedTx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
202
|
+
should_1.default.equal(signedTx.inputs.length, 4);
|
|
203
|
+
should_1.default.equal(signedTx.outputs.length, 2);
|
|
204
|
+
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
205
|
+
signedTx.inputs[0].value.should.equal('4764');
|
|
206
|
+
signedTx.inputs[1].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
|
|
207
|
+
signedTx.inputs[1].value.should.equal('100');
|
|
208
|
+
signedTx.inputs[2].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
|
|
209
|
+
signedTx.inputs[2].value.should.equal('4764');
|
|
210
|
+
signedTx.inputs[3].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
|
|
211
|
+
signedTx.inputs[3].value.should.equal('100');
|
|
212
|
+
signedTx.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
|
|
213
|
+
signedTx.outputs[0].value.should.equal('100');
|
|
214
|
+
signedTx.outputs[1].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
215
|
+
signedTx.outputs[1].value.should.equal('100');
|
|
216
|
+
signedTx.signature.length.should.equal(1);
|
|
217
|
+
signedTx.signature[0].should.equal('sigdUpzCxmi9NWhdbFGfvqVyH8Xfr2UiPc2fkqNrQ4CHvrk19ZDksDksEc4DJsTbphenV8jCNZFqzL4sCVRzM93HnSSqgJz7');
|
|
218
|
+
const firstTransferSignatures = signedTx.getTransferSignatures();
|
|
219
|
+
firstTransferSignatures.length.should.equal(2);
|
|
220
|
+
firstTransferSignatures[0].signature.should.equal('sigNjD64NuVnUK7oVB2c2SP32VYj7dTykbnRxyDoS9BGvgagvnMcT4hYccabbFGo9tdVQT4M46ezYJdL2pzYDSwkfR6yrppY');
|
|
221
|
+
firstTransferSignatures[0].index.should.equal(0);
|
|
222
|
+
firstTransferSignatures[1].signature.should.equal('sigYfVYJUaiKKZX4zszWZ7RF292nV2P6XM4nKek2YgWQ8BLS1r22u4a9SCvGMcb89BjTftTn2vgUzCTQGS2cJNvbYtuGQjGP');
|
|
223
|
+
firstTransferSignatures[1].index.should.equal(1);
|
|
224
|
+
// Note: Signatures are the same here because the data to sign used in the test is the same
|
|
225
|
+
const secondTransferSignatures = signedTx.getTransferSignatures(1);
|
|
226
|
+
secondTransferSignatures.length.should.equal(2);
|
|
227
|
+
secondTransferSignatures[0].signature.should.equal('sigNjD64NuVnUK7oVB2c2SP32VYj7dTykbnRxyDoS9BGvgagvnMcT4hYccabbFGo9tdVQT4M46ezYJdL2pzYDSwkfR6yrppY');
|
|
228
|
+
secondTransferSignatures[0].index.should.equal(0);
|
|
229
|
+
secondTransferSignatures[1].signature.should.equal('sigYfVYJUaiKKZX4zszWZ7RF292nV2P6XM4nKek2YgWQ8BLS1r22u4a9SCvGMcb89BjTftTn2vgUzCTQGS2cJNvbYtuGQjGP');
|
|
230
|
+
secondTransferSignatures[1].index.should.equal(1);
|
|
231
|
+
signedTx
|
|
232
|
+
.toBroadcastFormat()
|
|
233
|
+
.should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000001400707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a475003066c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2501e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e00000124070707070002050502000000420320053d036d0743035d0100000024747a3156526a5270564b6e76313641567072464831746b446e3454446656714138393341031e0743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a47500306766a0b1f6cb035bf537887ba9004c489bb458d8c8e72b5033b6cee8ad52f84ec27b719f5d0b98cdf2d0744b255301263688692645eafc9cdf1b48b5053c51dca');
|
|
234
|
+
});
|
|
235
|
+
it('should build a fully signed recovery transaction', async function () {
|
|
236
|
+
const basecoin = bitgo.coin('txtz');
|
|
237
|
+
const params = fixtures_1.paramsDetailsForRecovery;
|
|
238
|
+
(0, nock_1.default)(baseUrl).get(`/v1/accounts/${params.walletContractAddress}`).times(1).reply(200, fixtures_1.contractAddressDetails);
|
|
239
|
+
(0, nock_1.default)(baseUrl).get(`/v1/accounts/${params.feeAddress}`).times(1).reply(200, fixtures_1.feeAddressDetails);
|
|
240
|
+
(0, nock_1.default)(baseUrl).get(`/v1/head`).times(1).reply(200, fixtures_1.chainheadData);
|
|
241
|
+
(0, nock_1.default)(baseUrl).get(`/v1/contracts/${params.walletContractAddress}`).times(2).reply(200, fixtures_1.contractAddressDetails2);
|
|
242
|
+
(0, nock_1.default)(sdk_core_1.common.Environments.test.xtzRpcUrl)
|
|
243
|
+
.post(`/chains/main/blocks/head/helpers/scripts/pack_data`, fixtures_1.dataToPack)
|
|
244
|
+
.times(1)
|
|
245
|
+
.reply(200, fixtures_1.packDataToSign);
|
|
246
|
+
const consolidationResult = await basecoin.recover({
|
|
247
|
+
userKey: params.userKey,
|
|
248
|
+
backupKey: params.backupKey, // Box B Data
|
|
249
|
+
recoveryDestination: params.recoveryDestination, // Destination Address
|
|
250
|
+
walletContractAddress: params.walletContractAddress,
|
|
251
|
+
walletPassphrase: params.walletPassphrase,
|
|
252
|
+
});
|
|
253
|
+
should_1.default.exist(consolidationResult);
|
|
254
|
+
consolidationResult.id.should.equal('opNrMMvnmQ6cE9JqRD8g14B6XfwGEUs7L9Bgn9qEkTtLeFEX9Tk');
|
|
255
|
+
consolidationResult.tx.should.equal('ed8f6833f4db890c1f923d51074aa7b3982f7281f42da80212b819ad68c223776b01c62f80a80ce748a8b5ffcf97004b9807cb59b0b78c0bc1f5851ae852000102e8c94e3e18d8a493a2f0baa81eb0ab7fac5d23fe672f9133048ebc8cccc6f5066c01c62f80a80ce748a8b5ffcf97004b9807cb59b0b798f402c2f5851af02eac020001bda70b50cf607aee95c10322a8bff9fc4df50f8500ffff046d61696e0000005f070707070081eb8b34050502000000440320053d036d0743035d0100000024747a3252746e76454c564157356455547473424e47366362534132655146695974345270031e0743036a009482fd11034f034d031b020000000603060306030661836db09de792bfba0cb422fbb61c77b77fd80e22386cc9d7380fb7da67347f594bd8d809bfaf3d1ff172b329263ac1ad9ef2e3eacf1a199f918e33c2bd4adb');
|
|
256
|
+
});
|
|
257
|
+
it('should build an unsigned recovery transaction', async function () {
|
|
258
|
+
const basecoin = bitgo.coin('txtz');
|
|
259
|
+
const params = fixtures_1.paramsDetailsForUnsignedSweepRecovery;
|
|
260
|
+
(0, nock_1.default)(baseUrl)
|
|
261
|
+
.get(`/v1/accounts/${params.walletContractAddress}`)
|
|
262
|
+
.times(1)
|
|
263
|
+
.reply(200, fixtures_1.unsignedSweepContractDetails);
|
|
264
|
+
(0, nock_1.default)(baseUrl).get(`/v1/accounts/${params.feeAddress}`).times(1).reply(200, fixtures_1.unsignedSweepFeeAddressDetails);
|
|
265
|
+
(0, nock_1.default)(baseUrl).get(`/v1/head`).times(1).reply(200, fixtures_1.chainheadData);
|
|
266
|
+
(0, nock_1.default)(baseUrl)
|
|
267
|
+
.get(`/v1/contracts/${params.walletContractAddress}`)
|
|
268
|
+
.times(2)
|
|
269
|
+
.reply(200, fixtures_1.unsignedSweepContractDetails2);
|
|
270
|
+
(0, nock_1.default)(sdk_core_1.common.Environments.test.xtzRpcUrl)
|
|
271
|
+
.post(`/chains/main/blocks/head/helpers/scripts/pack_data`, fixtures_1.unsignedSweepDataToPack)
|
|
272
|
+
.times(1)
|
|
273
|
+
.reply(200, fixtures_1.unsignedSweepPackDataToSign);
|
|
274
|
+
const consolidationResult = await basecoin.recover({
|
|
275
|
+
userKey: params.userKey,
|
|
276
|
+
backupKey: params.backupKey, // Box B Data
|
|
277
|
+
recoveryDestination: params.recoveryDestination, // Destination Address
|
|
278
|
+
walletContractAddress: params.walletContractAddress,
|
|
279
|
+
isUnsignedSweep: true,
|
|
280
|
+
});
|
|
281
|
+
should_1.default.exist(consolidationResult);
|
|
282
|
+
consolidationResult.txHex.should.equal('ed8f6833f4db890c1f923d51074aa7b3982f7281f42da80212b819ad68c223776b01b6da9737d1b4b75053a387d9122c22598ead2d3d8c0bcfda9c1ae852000102f1eb6b09e45afffb3aca4215637edf54d2ea3c4491726128ce5a6071a57dac0e6c01b6da9737d1b4b75053a387d9122c22598ead2d3d98f402d0da9c1af02eac020001ea4d295f3387e9efbf6d791475cb936839eb8d5800ffff046d61696e0000005e07070707008fb5b934050502000000430320053d036d0743035d0100000024747a3252746e76454c564157356455547473424e47366362534132655146695974345270031e0743036a0080897a034f034d031b0200000006030603060306');
|
|
283
|
+
consolidationResult.source.should.equal('KT1Vwe7wFy6JmspMv4UmFFJU3JLtbfghBTBM');
|
|
284
|
+
consolidationResult.dataToSign.should.equal('0507070a0000001601ea4d295f3387e9efbf6d791475cb936839eb8d58000707008fb5b934050502000000340320053d036d0743035d0a0000001501c0d2caabc69b734fc54453ba5fab901b4fbec41b031e0743036a0080897a034f034d031b');
|
|
285
|
+
consolidationResult.txInfo.branch.should.equal('BMWuVUCyg5gruMRzhsQMPkF47WEG8Z2BgSxfBnoLBvzvq977XPi');
|
|
286
|
+
consolidationResult.sourceCounter.should.equal('54996303');
|
|
287
|
+
consolidationResult.transferCounters[0].should.equal('54996303');
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZVRyYW5zYWN0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9vZmZsaW5lVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLDhDQUEwRDtBQUMxRCw0Q0FBdUM7QUFDdkMsbUNBQThDO0FBQzlDLGdEQUF3QjtBQUN4Qiw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLDBDQWNxQjtBQUVyQixRQUFRLENBQUMsbUNBQW1DLEVBQUU7SUFDNUMsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDVixLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sY0FBYyxHQUFHLElBQUksWUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxHQUFHLEVBQUUsaUhBQWlIO0tBQ3ZILENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7UUFDckMsTUFBTSxPQUFPLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUE0QixDQUFDO1FBQ3RFLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuQyxNQUFNLFNBQVMsR0FBUSxJQUFJLFlBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkUsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDckQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFD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Q0FBQztZQUNqRCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUNyRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENB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cmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBUeHR6LCBYdHosIFh0ekxpYiB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHtcbiAgY2hhaW5oZWFkRGF0YSxcbiAgY29udHJhY3RBZGRyZXNzRGV0YWlscyxcbiAgY29udHJhY3RBZGRyZXNzRGV0YWlsczIsXG4gIGRhdGFUb1BhY2ssXG4gIGZlZUFkZHJlc3NEZXRhaWxzLFxuICBwYWNrRGF0YVRvU2lnbixcbiAgcGFyYW1zRGV0YWlsc0ZvclJlY292ZXJ5LFxuICBwYXJhbXNEZXRhaWxzRm9yVW5zaWduZWRTd2VlcFJlY292ZXJ5LFxuICB1bnNpZ25lZFN3ZWVwQ29udHJhY3REZXRhaWxzLFxuICB1bnNpZ25lZFN3ZWVwQ29udHJhY3REZXRhaWxzMixcbiAgdW5zaWduZWRTd2VlcERhdGFUb1BhY2ssXG4gIHVuc2lnbmVkU3dlZXBGZWVBZGRyZXNzRGV0YWlscyxcbiAgdW5zaWduZWRTd2VlcFBhY2tEYXRhVG9TaWduLFxufSBmcm9tICcuLi9maXh0dXJlcyc7XG5cbmRlc2NyaWJlKCdPZmZsaW5lIFRlem9zIFRyYW5zYWN0aW9uIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBiZWZvcmUoKCkgPT4ge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHh0eicsIFR4dHouY3JlYXRlSW5zdGFuY2UpO1xuICB9KTtcbiAgY29uc3QgZGVmYXVsdEtleVBhaXIgPSBuZXcgWHR6TGliLktleVBhaXIoe1xuICAgIHBydjogJ3hwcnY5czIxWnJRSDE0M0szRDhUWGZ2QUpnSFZmVEVlUU5XNVlzOXdadG5VWmtxUHpGelNqYkVKcldDMXZaNEduWEN2UjdyUUwyVUZYM1JTdVllVTlNckVSbTFYQnZBQ293N2MzNnZuejVpWXlqMicsXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgYW5kIHNpZ24nLCAoKSA9PiB7XG4gICAgY29uc3QgYmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHMudGVzdC54dHpFeHBsb3JlckJhc2VVcmwgYXMgc3RyaW5nO1xuICAgIGl0KCdhbiBpbml0IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnNDc2NCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMzM5NzEnLFxuICAgICAgICBzdG9yYWdlTGltaXQ6ICcxMjkyJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLmluaXRpYWxCYWxhbmNlKCcxMDAwMDAwJyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCdzcHBrN1pXQjhkaVUyVFdlaHhka1dDVjJEVEZ2bjFoUHo0cUxqaUQzbkpRb3pLbm9TRW5TQzhiJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJ3NwcGs3WnE5S1B0d2t6a2dBc2hhNGpVMjlDNDNNY2dQMnNrSzU2dGpkN0tKamhjbUg2QVpDMUYnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignc3BwazdkMnp0emJyTGRCYVRCN3l6YVdSa1BmY1dHc3JOUU5KZGtCRTliQ1RTU3pla0xOenB2ZicpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJycpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4LnNvdXJjZS5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDA0NzY0Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHNpZ25lZFR4LmlkLnNob3VsZC5lcXVhbCgnb3BOZmpqRWZXazdIc25ZOGZRclVvUEZ1WFpmQUJ3ZXViQTZENGJWU2NtcW9WemNaVkZBJyk7XG4gICAgICBzaWduZWRUeC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDA0NzY0Jyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFKOUxmaERWNkZReFI3YU1hSzdSNlJ3OG1CcGZoUDVNQTMnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdWRDU3aGFBTUNvYkhyQ3dIOUFCZmJGdmRteVI5WnNwWkMzWmloYjl0RVBmaHR6Q0tTMUY4ZkxvVnBvZHZvcjNQVW9vN3J5NGo0NnhZRVRFekVMbXRuck5UYVRQWDQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgcmV2ZWFsIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50VXBkYXRlKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIHR4QnVpbGRlci5wdWJsaWNLZXlUb1JldmVhbChkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHViKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnJyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICB0eC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMCk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTQyMCcpO1xuXG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgc2lnbmVkVHguaWQuc2hvdWxkLmVxdWFsKCdvb21YczZQdVd0bUd3TUtvWFROc3U5WEpIbkdYdHVSdWpjSE1lWVM5eTM3WGo2c1hQSGInKTtcbiAgICAgIHNpZ25lZFR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50VXBkYXRlKTtcbiAgICAgIHNpZ25lZFR4LnNvdXJjZS5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4Lm91dHB1dHMubGVuZ3RoLCAwKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxNDIwJyk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdReVlzZmh0ckpCS1p1SlNFaXpEZHhvZWpOVnZKV1JaUERNV2RwWFZ2ZFRWaXgzN0h6VVJ3WGZYc2k5TUVUblJ6c2t2amdzQlNnaUY0cHI3UlZ4eldMdWl4eEpMOFUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2VuZCB0cmFuc2FjdGlvbiB0byBzaW5nbGUgZGVzdGluYXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGFUb1NpZ24gPVxuICAgICAgICAnMDUwNzA3MGEwMDAwMDAxNjAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwMDcwNzAwMDAwNTA1MDIwMDAwMDAzMjAzMjAwNTNkMDM2ZDA3NDMwMzVkMGEwMDAwMDAxNTAwNmI1ZGRhZWYzZmI1ZDdjMTUxY2ZiMzZmYmU0M2E3YTA2Njc3NzM5NDAzMWUwNzQzMDM2YTAwMDEwMzRmMDM0ZDAzMWInO1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4QnVpbGRlci5icmFuY2goJ0JNOFFkWjkyVnlhSDFzNW53QUY5clVYamlQWjNnM05zbjZvWWJkS3FqMlJnSHh2V1hWUycpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudHJhbnNmZXIoJzEwMCcpXG4gICAgICAgIC5mcm9tKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKVxuICAgICAgICAudG8oJ0tUMUhVcnQ2a2Z2WXlERVlDSjJHU2p2VFBaNkttUmZ4TEJVOCcpXG4gICAgICAgIC5mZWUoJzQ3NjQnKVxuICAgICAgICAuY291bnRlcignMScpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnYmE3YTA0ZmFiMWEzZjc3ZWRhOTZiNTUxOTQ3ZGQzNDNlMTY1ZDFiOTFiNmY5ZjgwNjY0OGI2M2U1N2M4OGNjODZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAwZTg1MjgxMDIwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDA3NjA3MDcwNzA3MDAwMTA1MDUwMjAwMDAwMDVlMDMyMDA1M2QwMzZkMDc0MzAzNmUwMTAwMDAwMDI0NGI1NDMxNDg1NTcyNzQzNjZiNjY3NjU5Nzk0NDQ1NTk0MzRhMzI0NzUzNmE3NjU0NTA1YTM2NGI2ZDUyNjY3ODRjNDI1NTM4MDU1NTAzNmMwMjAwMDAwMDE1MDcyZjAyMDAwMDAwMDkwMjAwMDAwMDA0MDM0ZjAzMjcwMjAwMDAwMDAwMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMDA2MDMwNjAzMDYwMzA2J1xuICAgICAgKTtcblxuICAgICAgLy8gT2ZmbGluZSBzaWduaW5nIGZyb20gbG9jYXRpb24gMSB3aXRoIGEgdHJhbnNmZXIga2V5XG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyMTogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICAvLyBTaW5jZSBkYXRhVG9TaWduIGNhbm5vdCBtZSBjYWxjdWxhdGVkLCBpdCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBuZXcgYnVpbGRlciBzbyB3ZSBjYW5cbiAgICAgIC8vIGdlbmVyYXRlIHRoZSBzaWduYXR1cmVzXG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5vdmVycmlkZURhdGFUb1NpZ24oeyBkYXRhVG9TaWduOiB0ZXN0RGF0YVRvU2lnbiB9KTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLnNpZ24oe1xuICAgICAgICBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHBydjogJ3Nwc2syY2JpVnNBdnBHS21hdTlYY01zY0wzTlJ3amt5VDU3NU41QXlBb2Zjb2o0MXg2ZzZUTCcgfSkuZ2V0S2V5cygpLnBydixcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHgxID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlcjEuYnVpbGQoKTtcblxuICAgICAgLy8gT2ZmbGluZSBzaWduaW5nIGZyb20gbG9jYXRpb24gMiB3aXRoIGFub3RoZXIgdHJhbnNmZXIga2V5XG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyMjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5mcm9tKHNpZ25lZFR4MS50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIub3ZlcnJpZGVEYXRhVG9TaWduKHsgZGF0YVRvU2lnbjogdGVzdERhdGFUb1NpZ24gfSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5zaWduKHsga2V5OiBuZXcgWHR6TGliLktleVBhaXIoeyBzZWVkOiBCdWZmZXIuYWxsb2MoMTYpIH0pLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeDIgPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgICAvLyBPZmZsaW5lIHNpZ25pbmcgZnJvbSBsb2NhdGlvbiAzIHdpdGggdGhlIGZlZSBrZXlcbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXIzOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIzLmZyb20oc2lnbmVkVHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjMuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMy5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyMy5idWlsZCgpO1xuXG4gICAgICBzaWduZWRUeC5pZC5zaG91bGQuZXF1YWwoJ29ua0h3ZnVZSk1ydHhOZHlMNmVIZU5FSHVFMW41SFBINzVDWFVOaDkxYWdqYlFBeHd6VCcpO1xuICAgICAgc2lnbmVkVHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCc0NzY0Jyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzFdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ2Q4QjM2SlVWeURxcEN2VjFHdGJMcFAzOThncG13Znh2R1FNNmVRNDVKRzV6NExnRFJYNTVZUEFQVE1XMnBBY2l3YUEzanY4d2d5eFI5Y25FanNDRnMxUVJQZlE5RydcbiAgICAgICk7XG4gICAgICBzaWduZWRUeFxuICAgICAgICAudG9Ccm9hZGNhc3RGb3JtYXQoKVxuICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICdiYTdhMDRmYWIxYTNmNzdlZGE5NmI1NTE5NDdkZDM0M2UxNjVkMWI5MWI2ZjlmODA2NjQ4YjYzZTU3Yzg4Y2M4NmMwMWFhY2E4N2JkYmNkYzRlNjExN2I2NjdlMjlmOWI1MDQzNjJjODMxYmI5YzI1MDBlODUyODEwMjAwMDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDBmZmZmMDQ2ZDYxNjk2ZTAwMDAwMTQwMDcwNzA3MDcwMDAxMDUwNTAyMDAwMDAwNWUwMzIwMDUzZDAzNmQwNzQzMDM2ZTAxMDAwMDAwMjQ0YjU0MzE0ODU1NzI3NDM2NmI2Njc2NTk3OTQ0NDU1OTQzNGEzMjQ3NTM2YTc2NTQ1MDVhMzY0YjZkNTI2Njc4NGM0MjU1MzgwNTU1MDM2YzAyMDAwMDAwMTUwNzJmMDIwMDAwMDAwOTAyMDAwMDAwMDQwMzRmMDMyNzAyMDAwMDAwMDAwNzQzMDM2YTAwYTQwMTAzNGYwMzRkMDMxYjAyMDAwMDAwZDAwNTA5MDEwMDAwMDA2MDczNjk2NzRlNmE0NDM2MzQ0ZTc1NTY2ZTU1NGIzNzZmNTY0MjMyNjMzMjUzNTAzMzMyNTY1OTZhMzc2NDU0Nzk2YjYyNmU1Mjc4Nzk0NDZmNTMzOTQyNDc3NjY3NjE2Nzc2NmU0ZDYzNTQzNDY4NTk2MzYzNjE2MjYyNDY0NzZmMzk3NDY0NTY1MTU0MzQ0ZDM0MzY2NTdhNTk0YTY0NGMzMjcwN2E1OTQ0NTM3NzZiNjY1MjM2Nzk3MjcwNzA1OTA1MDkwMTAwMDAwMDYwNzM2OTY3NTk2NjU2NTk0YTU1NjE2OTRiNGI1YTU4MzQ3YTczN2E1NzVhMzc1MjQ2MzIzOTMyNmU1NjMyNTAzNjU4NGQzNDZlNGI2NTZiMzI1OTY3NTc1MTM4NDI0YzUzMzE3MjMyMzI3NTM0NjEzOTUzNDM3NjQ3NGQ2MzYyMzgzOTQyNmE1NDY2NzQ1NDZlMzI3NjY3NTU3YTQzNTQ1MTQ3NTMzMjYzNGE0ZTc2NjI1OTc0NzU0NzUxNmE0NzUwMDMwNjczYjEzOTNmYmRhNGYyNGUwNzk1ODEzNmRjNzk1MWUwZDAyMDc0OGU1NGJkMjliODQ3MzIzZWYyYmM4NWMzOTk2NTdmNDM1OWZjMTBhMTNlNWFmZTdiNzA2OGI1ODRlYTJlNTc4NzM2MjUwODgxNDgxZTIxMmU5NzkzYmZiZjg4J1xuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2VuZCB0cmFuc2FjdGlvbiB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0YVRvU2lnbiA9XG4gICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYic7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcignMTAwJylcbiAgICAgICAgLmZyb20oJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpXG4gICAgICAgIC50bygnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4JylcbiAgICAgICAgLmZlZSgnNDc2NCcpXG4gICAgICAgIC5jb3VudGVyKCcxJyk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnRyYW5zZmVyKCcxMDAnKVxuICAgICAgICAuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJylcbiAgICAgICAgLnRvKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKVxuICAgICAgICAuZmVlKCc0NzY0JylcbiAgICAgICAgLmNvdW50ZXIoJzInKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ2JhN2EwNGZhYjFhM2Y3N2VkYTk2YjU1MTk0N2RkMzQzZTE2NWQxYjkxYjZmOWY4MDY2NDhiNjNlNTdjODhjYzg2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMGU4NTI4MTAyMDAwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMGZmZmYwNDZkNjE2OTZlMDAwMDAwNzYwNzA3MDcwNzAwMDEwNTA1MDIwMDAwMDA1ZTAzMjAwNTNkMDM2ZDA3NDMwMzZlMDEwMDAwMDAyNDRiNTQzMTQ4NTU3Mjc0MzY2YjY2NzY1OTc5NDQ0NTU5NDM0YTMyNDc1MzZhNzY1NDUwNWEzNjRiNmQ1MjY2Nzg0YzQyNTUzODA1NTUwMzZjMDIwMDAwMDAxNTA3MmYwMjAwMDAwMDA5MDIwMDAwMDAwNDAzNGYwMzI3MDIwMDAwMDAwMDA3NDMwMzZhMDBhNDAxMDM0ZjAzNGQwMzFiMDIwMDAwMDAwNjAzMDYwMzA2MDMwNjZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAxZTg1MjgxMDIwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDA1YTA3MDcwNzA3MDAwMjA1MDUwMjAwMDAwMDQyMDMyMDA1M2QwMzZkMDc0MzAzNWQwMTAwMDAwMDI0NzQ3YTMxNTY1MjZhNTI3MDU2NGI2ZTc2MzEzNjQxNTY3MDcyNDY0ODMxNzQ2YjQ0NmUzNDU0NDQ2NjU2NzE0MTM4MzkzMzQxMDMxZTA3NDMwMzZhMDBhNDAxMDM0ZjAzNGQwMzFiMDIwMDAwMDAwNjAzMDYwMzA2MDMwNidcbiAgICAgICk7XG5cbiAgICAgIC8vIE9mZmxpbmUgc2lnbmluZyBmcm9tIGxvY2F0aW9uIDEgd2l0aCBhIHRyYW5zZmVyIGtleVxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjE6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgLy8gU2luY2UgZGF0YVRvU2lnbiBjYW5ub3QgbWUgY2FsY3VsYXRlZCwgaXQgaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgbmV3IGJ1aWxkZXIgc28gd2UgY2FuXG4gICAgICAvLyBnZW5lcmF0ZSB0aGUgc2lnbmF0dXJlc1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEub3ZlcnJpZGVEYXRhVG9TaWduKHsgZGF0YVRvU2lnbjogdGVzdERhdGFUb1NpZ24sIGluZGV4OiAwIH0pO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEub3ZlcnJpZGVEYXRhVG9TaWduKHsgZGF0YVRvU2lnbjogdGVzdERhdGFUb1NpZ24sIGluZGV4OiAxIH0pO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEuc2lnbih7XG4gICAgICAgIGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KS5nZXRLZXlzKCkucHJ2LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeDEgPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyMS5idWlsZCgpO1xuXG4gICAgICAvLyBPZmZsaW5lIHNpZ25pbmcgZnJvbSBsb2NhdGlvbiAyIHdpdGggYW5vdGhlciB0cmFuc2ZlciBrZXlcbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXIyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLmZyb20oc2lnbmVkVHgxLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5vdmVycmlkZURhdGFUb1NpZ24oeyBkYXRhVG9TaWduOiB0ZXN0RGF0YVRvU2lnbiwgaW5kZXg6IDAgfSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5vdmVycmlkZURhdGFUb1NpZ24oeyBkYXRhVG9TaWduOiB0ZXN0RGF0YVRvU2lnbiwgaW5kZXg6IDEgfSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5zaWduKHsga2V5OiBuZXcgWHR6TGliLktleVBhaXIoeyBzZWVkOiBCdWZmZXIuYWxsb2MoMTYpIH0pLmdldEtleXMoKS5wcnYsIGluZGV4OiAxIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHgyID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlcjIuYnVpbGQoKTtcblxuICAgICAgLy8gT2ZmbGluZSBzaWduaW5nIGZyb20gbG9jYXRpb24gMyB3aXRoIHRoZSBmZWUga2V5XG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyMzogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMy5mcm9tKHNpZ25lZFR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIzLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjMuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlcjMuYnVpbGQoKTtcblxuICAgICAgc2lnbmVkVHguaWQuc2hvdWxkLmVxdWFsKCdvbnlHYVdzNno0YlZWY2ZuM2g5S2JCcmt0RWh1RHlKTFlFVkI0YUpSTTZZTm5nakR4RTQnKTtcbiAgICAgIHNpZ25lZFR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNpZ25lZFR4LnNvdXJjZS5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlucHV0cy5sZW5ndGgsIDQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4Lm91dHB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCc0NzY0Jyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzFdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMl0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzJdLnZhbHVlLnNob3VsZC5lcXVhbCgnNDc2NCcpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzNdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1szXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4Jyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ2RVcHpDeG1pOU5XaGRiRkdmdnFWeUg4WGZyMlVpUGMyZmtxTnJRNENIdnJrMTlaRGtzRGtzRWM0REpzVGJwaGVuVjhqQ05aRnF6TDRzQ1ZSek05M0huU1NxZ0p6NydcbiAgICAgICk7XG4gICAgICBjb25zdCBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlcyA9IHNpZ25lZFR4LmdldFRyYW5zZmVyU2lnbmF0dXJlcygpO1xuICAgICAgZmlyc3RUcmFuc2ZlclNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIGZpcnN0VHJhbnNmZXJTaWduYXR1cmVzWzBdLnNpZ25hdHVyZS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdOakQ2NE51Vm5VSzdvVkIyYzJTUDMyVllqN2RUeWtiblJ4eURvUzlCR3ZnYWd2bk1jVDRoWWNjYWJiRkdvOXRkVlFUNE00NmV6WUpkTDJwellEU3drZlI2eXJwcFknXG4gICAgICApO1xuICAgICAgZmlyc3RUcmFuc2ZlclNpZ25hdHVyZXNbMF0uaW5kZXguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgZmlyc3RUcmFuc2ZlclNpZ25hdHVyZXNbMV0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ1lmVllKVWFpS0taWDR6c3pXWjdSRjI5Mm5WMlA2WE00bktlazJZZ1dROEJMUzFyMjJ1NGE5U0N2R01jYjg5QmpUZnRUbjJ2Z1V6Q1RRR1MyY0pOdmJZdHVHUWpHUCdcbiAgICAgICk7XG4gICAgICBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlc1sxXS5pbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAvLyBOb3RlOiBTaWduYXR1cmVzIGFyZSB0aGUgc2FtZSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgdG8gc2lnbiB1c2VkIGluIHRoZSB0ZXN0IGlzIHRoZSBzYW1lXG4gICAgICBjb25zdCBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXMgPSBzaWduZWRUeC5nZXRUcmFuc2ZlclNpZ25hdHVyZXMoMSk7XG4gICAgICBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHNlY29uZFRyYW5zZmVyU2lnbmF0dXJlc1swXS5zaWduYXR1cmUuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnTmpENjROdVZuVUs3b1ZCMmMyU1AzMlZZajdkVHlrYm5SeHlEb1M5Qkd2Z2Fndm5NY1Q0aFljY2FiYkZHbzl0ZFZRVDRNNDZlellKZEwycHpZRFN3a2ZSNnlycHBZJ1xuICAgICAgKTtcbiAgICAgIHNlY29uZFRyYW5zZmVyU2lnbmF0dXJlc1swXS5pbmRleC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXNbMV0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ1lmVllKVWFpS0taWDR6c3pXWjdSRjI5Mm5WMlA2WE00bktlazJZZ1dROEJMUzFyMjJ1NGE5U0N2R01jYjg5QmpUZnRUbjJ2Z1V6Q1RRR1MyY0pOdmJZdHVHUWpHUCdcbiAgICAgICk7XG4gICAgICBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXNbMV0uaW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2lnbmVkVHhcbiAgICAgICAgLnRvQnJvYWRjYXN0Rm9ybWF0KClcbiAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAnYmE3YTA0ZmFiMWEzZjc3ZWRhOTZiNTUxOTQ3ZGQzNDNlMTY1ZDFiOTFiNmY5ZjgwNjY0OGI2M2U1N2M4OGNjODZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAwZTg1MjgxMDIwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDE0MDA3MDcwNzA3MDAwMTA1MDUwMjAwMDAwMDVlMDMyMDA1M2QwMzZkMDc0MzAzNmUwMTAwMDAwMDI0NGI1NDMxNDg1NTcyNzQzNjZiNjY3NjU5Nzk0NDQ1NTk0MzRhMzI0NzUzNmE3NjU0NTA1YTM2NGI2ZDUyNjY3ODRjNDI1NTM4MDU1NTAzNmMwMjAwMDAwMDE1MDcyZjAyMDAwMDAwMDkwMjAwMDAwMDA0MDM0ZjAzMjcwMjAwMDAwMDAwMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMGQwMDUwOTAxMDAwMDAwNjA3MzY5Njc0ZTZhNDQzNjM0NGU3NTU2NmU1NTRiMzc2ZjU2NDIzMjYzMzI1MzUwMzMzMjU2NTk2YTM3NjQ1NDc5NmI2MjZlNTI3ODc5NDQ2ZjUzMzk0MjQ3NzY2NzYxNjc3NjZlNGQ2MzU0MzQ2ODU5NjM2MzYxNjI2MjQ2NDc2ZjM5NzQ2NDU2NTE1NDM0NGQzNDM2NjU3YTU5NGE2NDRjMzI3MDdhNTk0NDUzNzc2YjY2NTIzNjc5NzI3MDcwNTkwNTA5MDEwMDAwMDA2MDczNjk2NzU5NjY1NjU5NGE1NTYxNjk0YjRiNWE1ODM0N2E3MzdhNTc1YTM3NTI0NjMyMzkzMjZlNTYzMjUwMzY1ODRkMzQ2ZTRiNjU2YjMyNTk2NzU3NTEzODQyNGM1MzMxNzIzMjMyNzUzNDYxMzk1MzQzNzY0NzRkNjM2MjM4Mzk0MjZhNTQ2Njc0NTQ2ZTMyNzY2NzU1N2E0MzU0NTE0NzUzMzI2MzRhNGU3NjYyNTk3NDc1NDc1MTZhNDc1MDAzMDY2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMWU4NTI4MTAyMDAwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMGZmZmYwNDZkNjE2OTZlMDAwMDAxMjQwNzA3MDcwNzAwMDIwNTA1MDIwMDAwMDA0MjAzMjAwNTNkMDM2ZDA3NDMwMzVkMDEwMDAwMDAyNDc0N2EzMTU2NTI2YTUyNzA1NjRiNmU3NjMxMzY0MTU2NzA3MjQ2NDgzMTc0NmI0NDZlMzQ1NDQ0NjY1NjcxNDEzODM5MzM0MTAzMWUwNzQzMDM2YTAwYTQwMTAzNGYwMzRkMDMxYjAyMDAwMDAwZDAwNTA5MDEwMDAwMDA2MDczNjk2NzRlNmE0NDM2MzQ0ZTc1NTY2ZTU1NGIzNzZmNTY0MjMyNjMzMjUzNTAzMzMyNTY1OTZhMzc2NDU0Nzk2YjYyNmU1Mjc4Nzk0NDZmNTMzOTQyNDc3NjY3NjE2Nzc2NmU0ZDYzNTQzNDY4NTk2MzYzNjE2MjYyNDY0NzZmMzk3NDY0NTY1MTU0MzQ0ZDM0MzY2NTdhNTk0YTY0NGMzMjcwN2E1OTQ0NTM3NzZiNjY1MjM2Nzk3MjcwNzA1OTA1MDkwMTAwMDAwMDYwNzM2OTY3NTk2NjU2NTk0YTU1NjE2OTRiNGI1YTU4MzQ3YTczN2E1NzVhMzc1MjQ2MzIzOTMyNmU1NjMyNTAzNjU4NGQzNDZlNGI2NTZiMzI1OTY3NTc1MTM4NDI0YzUzMzE3MjMyMzI3NTM0NjEzOTUzNDM3NjQ3NGQ2MzYyMzgzOTQyNmE1NDY2NzQ1NDZlMzI3NjY3NTU3YTQzNTQ1MTQ3NTMzMjYzNGE0ZTc2NjI1OTc0NzU0NzUxNmE0NzUwMDMwNjc2NmEwYjFmNmNiMDM1YmY1Mzc4ODdiYTkwMDRjNDg5YmI0NThkOGM4ZTcyYjUwMzNiNmNlZThhZDUyZjg0ZWMyN2I3MTlmNWQwYjk4Y2RmMmQwNzQ0YjI1NTMwMTI2MzY4ODY5MjY0NWVhZmM5Y2RmMWI0OGI1MDUzYzUxZGNhJ1xuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIGZ1bGx5IHNpZ25lZCByZWNvdmVyeSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhc2Vjb2luID0gYml0Z28uY29pbigndHh0eicpIGFzIFh0ejtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtc0RldGFpbHNGb3JSZWNvdmVyeTtcblxuICAgICAgbm9jayhiYXNlVXJsKS5nZXQoYC92MS9hY2NvdW50cy8ke3BhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3N9YCkudGltZXMoMSkucmVwbHkoMjAwLCBjb250cmFjdEFkZHJlc3NEZXRhaWxzKTtcbiAgICAgIG5vY2soYmFzZVVybCkuZ2V0KGAvdjEvYWNjb3VudHMvJHtwYXJhbXMuZmVlQWRkcmVzc31gKS50aW1lcygxKS5yZXBseSgyMDAsIGZlZUFkZHJlc3NEZXRhaWxzKTtcbiAgICAgIG5vY2soYmFzZVVybCkuZ2V0KGAvdjEvaGVhZGApLnRpbWVzKDEpLnJlcGx5KDIwMCwgY2hhaW5oZWFkRGF0YSk7XG4gICAgICBub2NrKGJhc2VVcmwpLmdldChgL3YxL2NvbnRyYWN0cy8ke3BhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3N9YCkudGltZXMoMikucmVwbHkoMjAwLCBjb250cmFjdEFkZHJlc3NEZXRhaWxzMik7XG4gICAgICBub2NrKGNvbW1vbi5FbnZpcm9ubWVudHMudGVzdC54dHpScGNVcmwgYXMgc3RyaW5nKVxuICAgICAgICAucG9zdChgL2NoYWlucy9tYWluL2Jsb2Nrcy9oZWFkL2hlbHBlcnMvc2NyaXB0cy9wYWNrX2RhdGFgLCBkYXRhVG9QYWNrKVxuICAgICAgICAudGltZXMoMSlcbiAgICAgICAgLnJlcGx5KDIwMCwgcGFja0RhdGFUb1NpZ24pO1xuXG4gICAgICBjb25zdCBjb25zb2xpZGF0aW9uUmVzdWx0OiBhbnkgPSBhd2FpdCAoYmFzZWNvaW4gYXMgWHR6KS5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSwgLy8gQm94IEIgRGF0YVxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgLy8gRGVzdGluYXRpb24gQWRkcmVzc1xuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChjb25zb2xpZGF0aW9uUmVzdWx0KTtcbiAgICAgIGNvbnNvbGlkYXRpb25SZXN1bHQuaWQuc2hvdWxkLmVxdWFsKCdvcE5yTU12bm1RNmNFOUpxUkQ4ZzE0QjZYZndHRVVzN0w5QmduOXFFa1R0TGVGRVg5VGsnKTtcbiAgICAgIGNvbnNvbGlkYXRpb25SZXN1bHQudHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnZWQ4ZjY4MzNmNGRiODkwYzFmOTIzZDUxMDc0YWE3YjM5ODJmNzI4MWY0MmRhODAyMTJiODE5YWQ2OGMyMjM3NzZiMDFjNjJmODBhODBjZTc0OGE4YjVmZmNmOTcwMDRiOTgwN2NiNTliMGI3OGMwYmMxZjU4NTFhZTg1MjAwMDEwMmU4Yzk0ZTNlMThkOGE0OTNhMmYwYmFhODFlYjBhYjdmYWM1ZDIzZmU2NzJmOTEzMzA0OGViYzhjY2NjNmY1MDY2YzAxYzYyZjgwYTgwY2U3NDhhOGI1ZmZjZjk3MDA0Yjk4MDdjYjU5YjBiNzk4ZjQwMmMyZjU4NTFhZjAyZWFjMDIwMDAxYmRhNzBiNTBjZjYwN2FlZTk1YzEwMzIyYThiZmY5ZmM0ZGY1MGY4NTAwZmZmZjA0NmQ2MTY5NmUwMDAwMDA1ZjA3MDcwNzA3MDA4MWViOGIzNDA1MDUwMjAwMDAwMDQ0MDMyMDA1M2QwMzZkMDc0MzAzNWQwMTAwMDAwMDI0NzQ3YTMyNTI3NDZlNzY0NTRjNTY0MTU3MzU2NDU1NTQ3NDczNDI0ZTQ3MzY2MzYyNTM0MTMyNjU1MTQ2Njk1OTc0MzQ1MjcwMDMxZTA3NDMwMzZhMDA5NDgyZmQxMTAzNGYwMzRkMDMxYjAyMDAwMDAwMDYwMzA2MDMwNjAzMDY2MTgzNmRiMDlkZTc5MmJmYmEwY2I0MjJmYmI2MWM3N2I3N2ZkODBlMjIzODZjYzlkNzM4MGZiN2RhNjczNDdmNTk0YmQ4ZDgwOWJmYWYzZDFmZjE3MmIzMjkyNjNhYzFhZDllZjJlM2VhY2YxYTE5OWY5MThlMzNjMmJkNGFkYidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIHVuc2lnbmVkIHJlY292ZXJ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZWNvaW4gPSBiaXRnby5jb2luKCd0eHR6JykgYXMgWHR6O1xuICAgICAgY29uc3QgcGFyYW1zID0gcGFyYW1zRGV0YWlsc0ZvclVuc2lnbmVkU3dlZXBSZWNvdmVyeTtcblxuICAgICAgbm9jayhiYXNlVXJsKVxuICAgICAgICAuZ2V0KGAvdjEvYWNjb3VudHMvJHtwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzfWApXG4gICAgICAgIC50aW1lcygxKVxuICAgICAgICAucmVwbHkoMjAwLCB1bnNpZ25lZFN3ZWVwQ29udHJhY3REZXRhaWxzKTtcbiAgICAgIG5vY2soYmFzZVVybCkuZ2V0KGAvdjEvYWNjb3VudHMvJHtwYXJhbXMuZmVlQWRkcmVzc31gKS50aW1lcygxKS5yZXBseSgyMDAsIHVuc2lnbmVkU3dlZXBGZWVBZGRyZXNzRGV0YWlscyk7XG4gICAgICBub2NrKGJhc2VVcmwpLmdldChgL3YxL2hlYWRgKS50aW1lcygxKS5yZXBseSgyMDAsIGNoYWluaGVhZERhdGEpO1xuICAgICAgbm9jayhiYXNlVXJsKVxuICAgICAgICAuZ2V0KGAvdjEvY29udHJhY3RzLyR7cGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzc31gKVxuICAgICAgICAudGltZXMoMilcbiAgICAgICAgLnJlcGx5KDIwMCwgdW5zaWduZWRTd2VlcENvbnRyYWN0RGV0YWlsczIpO1xuICAgICAgbm9jayhjb21tb24uRW52aXJvbm1lbnRzLnRlc3QueHR6UnBjVXJsIGFzIHN0cmluZylcbiAgICAgICAgLnBvc3QoYC9jaGFpbnMvbWFpbi9ibG9ja3MvaGVhZC9oZWxwZXJzL3NjcmlwdHMvcGFja19kYXRhYCwgdW5zaWduZWRTd2VlcERhdGFUb1BhY2spXG4gICAgICAgIC50aW1lcygxKVxuICAgICAgICAucmVwbHkoMjAwLCB1bnNpZ25lZFN3ZWVwUGFja0RhdGFUb1NpZ24pO1xuXG4gICAgICBjb25zdCBjb25zb2xpZGF0aW9uUmVzdWx0OiBhbnkgPSBhd2FpdCAoYmFzZWNvaW4gYXMgWHR6KS5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSwgLy8gQm94IEIgRGF0YVxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgLy8gRGVzdGluYXRpb24gQWRkcmVzc1xuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgIGlzVW5zaWduZWRTd2VlcDogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3QoY29uc29saWRhdGlvblJlc3VsdCk7XG4gICAgICBjb25zb2xpZGF0aW9uUmVzdWx0LnR4SGV4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ2VkOGY2ODMzZjRkYjg5MGMxZjkyM2Q1MTA3NGFhN2IzOTgyZjcyODFmNDJkYTgwMjEyYjgxOWFkNjhjMjIzNzc2YjAxYjZkYTk3MzdkMWI0Yjc1MDUzYTM4N2Q5MTIyYzIyNTk4ZWFkMmQzZDhjMGJjZmRhOWMxYWU4NTIwMDAxMDJmMWViNmIwOWU0NWFmZmZiM2FjYTQyMTU2MzdlZGY1NGQyZWEzYzQ0OTE3MjYxMjhjZTVhNjA3MWE1N2RhYzBlNmMwMWI2ZGE5NzM3ZDFiNGI3NTA1M2EzODdkOTEyMmMyMjU5OGVhZDJkM2Q5OGY0MDJkMGRhOWMxYWYwMmVhYzAyMDAwMWVhNGQyOTVmMzM4N2U5ZWZiZjZkNzkxNDc1Y2I5MzY4MzllYjhkNTgwMGZmZmYwNDZkNjE2OTZlMDAwMDAwNWUwNzA3MDcwNzAwOGZiNWI5MzQwNTA1MDIwMDAwMDA0MzAzMjAwNTNkMDM2ZDA3NDMwMzVkMDEwMDAwMDAyNDc0N2EzMjUyNzQ2ZTc2NDU0YzU2NDE1NzM1NjQ1NTU0NzQ3MzQyNGU0NzM2NjM2MjUzNDEzMjY1NTE0NjY5NTk3NDM0NTI3MDAzMWUwNzQzMDM2YTAwODA4OTdhMDM0ZjAzNGQwMzFiMDIwMDAwMDAwNjAzMDYwMzA2MDMwNidcbiAgICAgICk7XG4gICAgICBjb25zb2xpZGF0aW9uUmVzdWx0LnNvdXJjZS5zaG91bGQuZXF1YWwoJ0tUMVZ3ZTd3Rnk2Sm1zcE12NFVtRkZKVTNKTHRiZmdoQlRCTScpO1xuICAgICAgY29uc29saWRhdGlvblJlc3VsdC5kYXRhVG9TaWduLnNob3VsZC5lcXVhbChcbiAgICAgICAgJzA1MDcwNzBhMDAwMDAwMTYwMWVhNGQyOTVmMzM4N2U5ZWZiZjZkNzkxNDc1Y2I5MzY4MzllYjhkNTgwMDA3MDcwMDhmYjViOTM0MDUwNTAyMDAwMDAwMzQwMzIwMDUzZDAzNmQwNzQzMDM1ZDBhMDAwMDAwMTUwMWMwZDJjYWFiYzY5YjczNGZjNTQ0NTNiYTVmYWI5MDFiNGZiZWM0MWIwMzFlMDc0MzAzNmEwMDgwODk3YTAzNGYwMzRkMDMxYidcbiAgICAgICk7XG4gICAgICBjb25zb2xpZGF0aW9uUmVzdWx0LnR4SW5mby5icmFuY2guc2hvdWxkLmVxdWFsKCdCTVd1VlVDeWc1Z3J1TVJ6aHNRTVBrRjQ3V0VHOFoyQmdTeGZCbm9MQnZ6dnE5NzdYUGknKTtcbiAgICAgIGNvbnNvbGlkYXRpb25SZXN1bHQuc291cmNlQ291bnRlci5zaG91bGQuZXF1YWwoJzU0OTk2MzAzJyk7XG4gICAgICBjb25zb2xpZGF0aW9uUmVzdWx0LnRyYW5zZmVyQ291bnRlcnNbMF0uc2hvdWxkLmVxdWFsKCc1NDk5NjMwMycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transaction.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const statics_1 = require("@bitgo/statics");
|
|
9
|
+
const resources_1 = require("../resources");
|
|
10
|
+
const src_1 = require("../../src");
|
|
11
|
+
describe('Tezos transaction', function () {
|
|
12
|
+
describe('should parse', () => {
|
|
13
|
+
it('unsigned transaction', async () => {
|
|
14
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
15
|
+
await tx.initFromSerializedTransaction(resources_1.unsignedSerializedOriginationTransaction);
|
|
16
|
+
should_1.default.equal(tx.inputs.length, 1);
|
|
17
|
+
tx.inputs.length.should.equal(1);
|
|
18
|
+
tx.inputs[0].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
19
|
+
tx.inputs[0].value.should.equal('1004764');
|
|
20
|
+
tx.outputs.length.should.equal(1);
|
|
21
|
+
tx.outputs[0].address.should.equal('');
|
|
22
|
+
tx.outputs[0].value.should.equal('1000000');
|
|
23
|
+
should_1.default.not.exist(tx.delegate);
|
|
24
|
+
JSON.stringify(tx.toJson()).should.equal(JSON.stringify(resources_1.parsedTransaction));
|
|
25
|
+
tx.toBroadcastFormat().should.equal(resources_1.unsignedSerializedOriginationTransaction);
|
|
26
|
+
});
|
|
27
|
+
it('signed transaction', async () => {
|
|
28
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
29
|
+
await tx.initFromSerializedTransaction(resources_1.signedSerializedOriginationTransaction);
|
|
30
|
+
should_1.default.equal(tx.inputs.length, 1);
|
|
31
|
+
tx.inputs.length.should.equal(1);
|
|
32
|
+
tx.inputs[0].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
33
|
+
tx.inputs[0].value.should.equal('1004764');
|
|
34
|
+
tx.outputs.length.should.equal(1);
|
|
35
|
+
tx.outputs[0].address.should.equal('KT1LJvp55fbdNwbisJFign9wA4cPgq9T9oc4');
|
|
36
|
+
tx.outputs[0].value.should.equal('1000000');
|
|
37
|
+
should_1.default.not.exist(tx.delegate);
|
|
38
|
+
JSON.stringify(tx.toJson()).should.equal(JSON.stringify(resources_1.parsedTransaction));
|
|
39
|
+
tx.toBroadcastFormat().should.equal(resources_1.signedSerializedOriginationTransaction);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('should sign', () => {
|
|
43
|
+
it('an unsigned origination transaction', async () => {
|
|
44
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
45
|
+
await tx.initFromSerializedTransaction(resources_1.unsignedSerializedOriginationTransaction);
|
|
46
|
+
const signer = new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' });
|
|
47
|
+
await tx.sign(signer);
|
|
48
|
+
should_1.default.equal(tx.inputs.length, 1);
|
|
49
|
+
tx.inputs.length.should.equal(1);
|
|
50
|
+
tx.inputs[0].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
51
|
+
tx.inputs[0].value.should.equal('1004764');
|
|
52
|
+
tx.outputs.length.should.equal(1);
|
|
53
|
+
tx.outputs[0].address.should.equal('KT1Dh62qPZhJvMMtL4rAnDS2uASptT6GNLMy');
|
|
54
|
+
tx.outputs[0].value.should.equal('1000000');
|
|
55
|
+
should_1.default.not.exist(tx.delegate);
|
|
56
|
+
tx.signature.length.should.equal(1);
|
|
57
|
+
tx.signature[0].should.equal('sigu3cjQh8rf79aXG555fRxKzuTa2byZnvMJqkJENpdKjEwCri6SUM9fLywDC3w8e6dHRT8RRaJVQiijC9yzwqL6FSm2Jj9a');
|
|
58
|
+
});
|
|
59
|
+
it('a signed origination transaction', async () => {
|
|
60
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
61
|
+
await tx.initFromSerializedTransaction(resources_1.signedSerializedOriginationTransaction);
|
|
62
|
+
const signer = new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' });
|
|
63
|
+
await tx.sign(signer);
|
|
64
|
+
should_1.default.equal(tx.inputs.length, 1);
|
|
65
|
+
tx.inputs.length.should.equal(1);
|
|
66
|
+
tx.inputs[0].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
|
|
67
|
+
tx.inputs[0].value.should.equal('1004764');
|
|
68
|
+
tx.outputs.length.should.equal(1);
|
|
69
|
+
tx.outputs[0].address.should.equal('KT1Dh62qPZhJvMMtL4rAnDS2uASptT6GNLMy');
|
|
70
|
+
tx.outputs[0].value.should.equal('1000000');
|
|
71
|
+
should_1.default.not.exist(tx.delegate);
|
|
72
|
+
tx.signature.length.should.equal(1);
|
|
73
|
+
tx.signature[0].should.equal('sigu3cjQh8rf79aXG555fRxKzuTa2byZnvMJqkJENpdKjEwCri6SUM9fLywDC3w8e6dHRT8RRaJVQiijC9yzwqL6FSm2Jj9a');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('should fail', () => {
|
|
77
|
+
it('to parse and invalid parsed transaction', async () => {
|
|
78
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
79
|
+
await tx.initFromParsedTransaction({}).should.be.rejected();
|
|
80
|
+
});
|
|
81
|
+
it('to get the transaction JSON if it is empty', async () => {
|
|
82
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
83
|
+
assert_1.default.throws(() => tx.toJson());
|
|
84
|
+
});
|
|
85
|
+
it('to sign if the transaction is empty', async () => {
|
|
86
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
87
|
+
const signer = new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' });
|
|
88
|
+
await tx.sign(signer).should.be.rejectedWith('Empty transaction');
|
|
89
|
+
});
|
|
90
|
+
it('to sign the transaction if the keys are invalid', async () => {
|
|
91
|
+
const tx = new src_1.XtzLib.Transaction(statics_1.coins.get('txtz'));
|
|
92
|
+
await tx.initFromParsedTransaction(resources_1.parsedTransaction);
|
|
93
|
+
const signer = new src_1.XtzLib.KeyPair({ pub: 'sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b' });
|
|
94
|
+
await tx.sign(signer).should.be.rejectedWith('Missing private key');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDRDQUF1QztBQUN2Qyw0Q0FJc0I7QUFDdEIsbUNBQW1DO0FBRW5DLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1QixFQUFFLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxvREFBd0MsQ0FBQyxDQUFDO1lBRWpGLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUs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S0FBSyxJQUFJLEVBQUU7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyw2QkFBaUIsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSx5REFBeUQsRUFBRSxDQUFDLENBQUM7WUFDdEcsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQge1xuICB1bnNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uLFxuICBzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbixcbiAgcGFyc2VkVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnVGV6b3MgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdzaG91bGQgcGFyc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3Vuc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDA0NzY0Jyk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHR4LmRlbGVnYXRlKTtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHR4LnRvSnNvbigpKS5zaG91bGQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocGFyc2VkVHJhbnNhY3Rpb24pKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25lZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R4dHonKSk7XG4gICAgICBhd2FpdCB0eC5pbml0RnJvbVNlcmlhbGl6ZWRUcmFuc2FjdGlvbihzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMUxKdnA1NWZiZE53YmlzSkZpZ245d0E0Y1BncTlUOW9jNCcpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgSlNPTi5zdHJpbmdpZnkodHgudG9Kc29uKCkpLnNob3VsZC5lcXVhbChKU09OLnN0cmluZ2lmeShwYXJzZWRUcmFuc2FjdGlvbikpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHNpZ24nLCAoKSA9PiB7XG4gICAgaXQoJ2FuIHVuc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCBzaWduZXIgPSBuZXcgWHR6TGliLktleVBhaXIoeyBwcnY6ICdzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihzaWduZXIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxRGg2MnFQWmhKdk1NdEw0ckFuRFMydUFTcHRUNkdOTE15Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5kZWxlZ2F0ZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWd1M2NqUWg4cmY3OWFYRzU1NWZSeEt6dVRhMmJ5Wm52TUpxa0pFTnBkS2pFd0NyaTZTVU05Zkx5d0RDM3c4ZTZkSFJUOFJSYUpWUWlpakM5eXp3cUw2RlNtMkpqOWEnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMURoNjJxUFpoSnZNTXRMNHJBbkRTMnVBU3B0VDZHTkxNeScpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lndTNjalFoOHJmNzlhWEc1NTVmUnhLenVUYTJieVpudk1KcWtKRU5wZEtqRXdDcmk2U1VNOWZMeXdEQzN3OGU2ZEhSVDhSUmFKVlFpaWpDOXl6d3FMNkZTbTJKajlhJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgIGl0KCd0byBwYXJzZSBhbmQgaW52YWxpZCBwYXJzZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXdhaXQgdHguaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbih7fSBhcyBYdHpMaWIuSW50ZXJmYWNlLlBhcnNlZFRyYW5zYWN0aW9uKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd0byBnZXQgdGhlIHRyYW5zYWN0aW9uIEpTT04gaWYgaXQgaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndG8gc2lnbiBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvIHNpZ24gdGhlIHRyYW5zYWN0aW9uIGlmIHRoZSBrZXlzIGFyZSBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tUGFyc2VkVHJhbnNhY3Rpb24ocGFyc2VkVHJhbnNhY3Rpb24pO1xuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHViOiAnc3BwazdaV0I4ZGlVMlRXZWh4ZGtXQ1YyRFRGdm4xaFB6NHFMamlEM25KUW96S25vU0VuU0M4YicgfSk7XG4gICAgICBhd2FpdCB0eC5zaWduKHNpZ25lcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transactionBuilder.ts"],"names":[],"mappings":""}
|