@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.43 → 1.4.3-alpha.431
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.js +23 -9
- package/dist/src/lib/iface.d.ts +36 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.js +41 -27
- package/dist/src/lib/multisigUtils.js +36 -23
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +41 -25
- package/dist/src/lib/transactionBuilder.d.ts +2 -1
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +17 -16
- package/dist/src/lib/transferBuilder.js +1 -1
- package/dist/src/lib/utils.d.ts +42 -27
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +70 -38
- package/dist/src/xtz.d.ts +50 -5
- package/dist/src/xtz.d.ts.map +1 -1
- package/dist/src/xtz.js +228 -8
- 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 +101 -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 +19 -14
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -118
|
@@ -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-beta/sdk-core");
|
|
8
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
+
const src_1 = require("../../src");
|
|
10
|
+
const nock_1 = __importDefault(require("nock"));
|
|
11
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
12
|
+
const sdk_api_1 = require("@bitgo-beta/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('oos4n1zJAGeqLQrNsnGAfzzj6FeZqbSrnAMVTdC485cinFWN6su');
|
|
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('sigTtfcxtvU5zWbsWDJwKvHdDcWYDhgsb9ozmQ44AUGHnSJJgvPR2CvNCUX8axezJKoZRzgv9gSE3GSDh5SEbm31JqM53yyg');
|
|
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('op22ZtxX7ZsogUuMdvwuMCS6tegJXV8FKsAjzoWAt3JwibBV2A5');
|
|
255
|
+
consolidationResult.tx.should.equal('ed8f6833f4db890c1f923d51074aa7b3982f7281f42da80212b819ad68c223776b01c62f80a80ce748a8b5ffcf97004b9807cb59b0b78c0bc1f5851ae852000102e8c94e3e18d8a493a2f0baa81eb0ab7fac5d23fe672f9133048ebc8cccc6f506006c01c62f80a80ce748a8b5ffcf97004b9807cb59b0b798f402c2f5851af02eac020001bda70b50cf607aee95c10322a8bff9fc4df50f8500ffff046d61696e0000005f070707070081eb8b34050502000000440320053d036d0743035d0100000024747a3252746e76454c564157356455547473424e47366362534132655146695974345270031e0743036a009482fd11034f034d031b0200000006030603060306e13e1be168af9539e0b7cb89689ce734bae6fcf3bed1a5a60749ce3bcd8864ea4c2623a0989f5de75c935746e3c88c9caab821876a060019e70f385bf3af4548');
|
|
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('ed8f6833f4db890c1f923d51074aa7b3982f7281f42da80212b819ad68c223776b01b6da9737d1b4b75053a387d9122c22598ead2d3d8c0bcfda9c1ae852000102f1eb6b09e45afffb3aca4215637edf54d2ea3c4491726128ce5a6071a57dac0e006c01b6da9737d1b4b75053a387d9122c22598ead2d3d98f402d0da9c1af02eac020001ea4d295f3387e9efbf6d791475cb936839eb8d5800ffff046d61696e0000005e07070707008fb5b934050502000000430320053d036d0743035d0100000024747a3252746e76454c564157356455547473424e47366362534132655146695974345270031e0743036a0080897a034f034d031b0200000006030603060306');
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZVRyYW5zYWN0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9vZmZsaW5lVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLG1EQUErRDtBQUMvRCxpREFBNEM7QUFDNUMsbUNBQThDO0FBQzlDLGdEQUF3QjtBQUN4QixtREFBK0Q7QUFDL0QsaURBQStDO0FBQy9DLDBDQWNxQjtBQUVyQixRQUFRLENBQUMsbUNBQW1DLEVBQUU7SUFDNUMsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDVixLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sY0FBYyxHQUFHLElBQUksWUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxHQUFHLEVBQUUsaUhBQWlIO0tBQ3ZILENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7UUFDckMsTUFBTSxPQUFPLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUE0QixDQUFDO1FBQ3RFLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuQyxNQUFNLFNBQVMsR0FBUSxJQUFJLFlBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkUsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDckQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFD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Q0FBQztZQUNqRCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUNyRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENB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cmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHh0eiwgWHR6LCBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQge1xuICBjaGFpbmhlYWREYXRhLFxuICBjb250cmFjdEFkZHJlc3NEZXRhaWxzLFxuICBjb250cmFjdEFkZHJlc3NEZXRhaWxzMixcbiAgZGF0YVRvUGFjayxcbiAgZmVlQWRkcmVzc0RldGFpbHMsXG4gIHBhY2tEYXRhVG9TaWduLFxuICBwYXJhbXNEZXRhaWxzRm9yUmVjb3ZlcnksXG4gIHBhcmFtc0RldGFpbHNGb3JVbnNpZ25lZFN3ZWVwUmVjb3ZlcnksXG4gIHVuc2lnbmVkU3dlZXBDb250cmFjdERldGFpbHMsXG4gIHVuc2lnbmVkU3dlZXBDb250cmFjdERldGFpbHMyLFxuICB1bnNpZ25lZFN3ZWVwRGF0YVRvUGFjayxcbiAgdW5zaWduZWRTd2VlcEZlZUFkZHJlc3NEZXRhaWxzLFxuICB1bnNpZ25lZFN3ZWVwUGFja0RhdGFUb1NpZ24sXG59IGZyb20gJy4uL2ZpeHR1cmVzJztcblxuZGVzY3JpYmUoJ09mZmxpbmUgVGV6b3MgVHJhbnNhY3Rpb24gYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGJlZm9yZSgoKSA9PiB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0eHR6JywgVHh0ei5jcmVhdGVJbnN0YW5jZSk7XG4gIH0pO1xuICBjb25zdCBkZWZhdWx0S2V5UGFpciA9IG5ldyBYdHpMaWIuS2V5UGFpcih7XG4gICAgcHJ2OiAneHBydjlzMjFaclFIMTQzSzNEOFRYZnZBSmdIVmZURWVRTlc1WXM5d1p0blVaa3FQekZ6U2piRUpyV0Mxdlo0R25YQ3ZSN3JRTDJVRlgzUlN1WWVVOU1yRVJtMVhCdkFDb3c3YzM2dm56NWlZeWoyJyxcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbicsICgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50cy50ZXN0Lnh0ekV4cGxvcmVyQmFzZVVybCBhcyBzdHJpbmc7XG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICc0NzY0JyxcbiAgICAgICAgZ2FzTGltaXQ6ICczMzk3MScsXG4gICAgICAgIHN0b3JhZ2VMaW1pdDogJzEyOTInLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIuaW5pdGlhbEJhbGFuY2UoJzEwMDAwMDAnKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJ3NwcGs3WldCOGRpVTJUV2VoeGRrV0NWMkRURnZuMWhQejRxTGppRDNuSlFvektub1NFblNDOGInKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignc3BwazdacTlLUHR3a3prZ0FzaGE0alUyOUM0M01jZ1Ayc2tLNTZ0amQ3S0pqaGNtSDZBWkMxRicpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCdzcHBrN2QyenR6YnJMZEJhVEI3eXphV1JrUGZjV0dzck5RTkpka0JFOWJDVFNTemVrTE56cHZmJyk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnJyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHguc291cmNlLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJycpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgc2lnbmVkVHguaWQuc2hvdWxkLmVxdWFsKCdvcE5mampFZldrN0hzblk4ZlFyVW9QRnVYWmZBQndldWJBNkQ0YlZTY21xb1Z6Y1pWRkEnKTtcbiAgICAgIHNpZ25lZFR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMUo5TGZoRFY2RlF4UjdhTWFLN1I2Unc4bUJwZmhQNU1BMycpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ1ZENTdoYUFNQ29iSHJDd0g5QUJmYkZ2ZG15Ujlac3BaQzNaaWhiOXRFUGZodHpDS1MxRjhmTG9WcG9kdm9yM1BVb283cnk0ajQ2eFlFVEV6RUxtdG5yTlRhVFBYNCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSByZXZlYWwgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkFjY291bnRVcGRhdGUpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlci5icmFuY2goJ0JNOFFkWjkyVnlhSDFzNW53QUY5clVYamlQWjNnM05zbjZvWWJkS3FqMlJnSHh2V1hWUycpO1xuICAgICAgdHhCdWlsZGVyLnB1YmxpY0tleVRvUmV2ZWFsKGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wdWIpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50VXBkYXRlKTtcbiAgICAgIHR4LnNvdXJjZS5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAwKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxNDIwJyk7XG5cbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBzaWduZWRUeC5pZC5zaG91bGQuZXF1YWwoJ29vczRuMXpKQUdlcUxRck5zbkdBZnp6ajZGZVpxYlNybkFNVlRkQzQ4NWNpbkZXTjZzdScpO1xuICAgICAgc2lnbmVkVHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFjY291bnRVcGRhdGUpO1xuICAgICAgc2lnbmVkVHguc291cmNlLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgub3V0cHV0cy5sZW5ndGgsIDApO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzE0MjAnKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ1R0ZmN4dHZVNXpXYnNXREp3S3ZIZERjV1lEaGdzYjlvem1RNDRBVUdIblNKSmd2UFIyQ3ZOQ1VYOGF4ZXpKS29aUnpndjlnU0UzR1NEaDVTRWJtMzFKcU01M3l5ZydcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBzZW5kIHRyYW5zYWN0aW9uIHRvIHNpbmdsZSBkZXN0aW5hdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0YVRvU2lnbiA9XG4gICAgICAgICcwNTA3MDcwYTAwMDAwMDE2MDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDAwNzA3MDAwMDA1MDUwMjAwMDAwMDMyMDMyMDA1M2QwMzZkMDc0MzAzNWQwYTAwMDAwMDE1MDA2YjVkZGFlZjNmYjVkN2MxNTFjZmIzNmZiZTQzYTdhMDY2Nzc3Mzk0MDMxZTA3NDMwMzZhMDAwMTAzNGYwMzRkMDMxYic7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcignMTAwJylcbiAgICAgICAgLmZyb20oJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpXG4gICAgICAgIC50bygnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4JylcbiAgICAgICAgLmZlZSgnNDc2NCcpXG4gICAgICAgIC5jb3VudGVyKCcxJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdiYTdhMDRmYWIxYTNmNzdlZGE5NmI1NTE5NDdkZDM0M2UxNjVkMWI5MWI2ZjlmODA2NjQ4YjYzZTU3Yzg4Y2M4NmMwMWFhY2E4N2JkYmNkYzRlNjExN2I2NjdlMjlmOWI1MDQzNjJjODMxYmI5YzI1MDBlODUyODEwMjAwMDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDBmZmZmMDQ2ZDYxNjk2ZTAwMDAwMDc2MDcwNzA3MDcwMDAxMDUwNTAyMDAwMDAwNWUwMzIwMDUzZDAzNmQwNzQzMDM2ZTAxMDAwMDAwMjQ0YjU0MzE0ODU1NzI3NDM2NmI2Njc2NTk3OTQ0NDU1OTQzNGEzMjQ3NTM2YTc2NTQ1MDVhMzY0YjZkNTI2Njc4NGM0MjU1MzgwNTU1MDM2YzAyMDAwMDAwMTUwNzJmMDIwMDAwMDAwOTAyMDAwMDAwMDQwMzRmMDMyNzAyMDAwMDAwMDAwNzQzMDM2YTAwYTQwMTAzNGYwMzRkMDMxYjAyMDAwMDAwMDYwMzA2MDMwNjAzMDYnXG4gICAgICApO1xuXG4gICAgICAvLyBPZmZsaW5lIHNpZ25pbmcgZnJvbSBsb2NhdGlvbiAxIHdpdGggYSB0cmFuc2ZlciBrZXlcbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXIxOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIC8vIFNpbmNlIGRhdGFUb1NpZ24gY2Fubm90IG1lIGNhbGN1bGF0ZWQsIGl0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIG5ldyBidWlsZGVyIHNvIHdlIGNhblxuICAgICAgLy8gZ2VuZXJhdGUgdGhlIHNpZ25hdHVyZXNcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLm92ZXJyaWRlRGF0YVRvU2lnbih7IGRhdGFUb1NpZ246IHRlc3REYXRhVG9TaWduIH0pO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEuc2lnbih7XG4gICAgICAgIGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KS5nZXRLZXlzKCkucHJ2LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeDEgPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyMS5idWlsZCgpO1xuXG4gICAgICAvLyBPZmZsaW5lIHNpZ25pbmcgZnJvbSBsb2NhdGlvbiAyIHdpdGggYW5vdGhlciB0cmFuc2ZlciBrZXlcbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXIyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLmZyb20oc2lnbmVkVHgxLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5vdmVycmlkZURhdGFUb1NpZ24oeyBkYXRhVG9TaWduOiB0ZXN0RGF0YVRvU2lnbiB9KTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHNlZWQ6IEJ1ZmZlci5hbGxvYygxNikgfSkuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4MiA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIE9mZmxpbmUgc2lnbmluZyBmcm9tIGxvY2F0aW9uIDMgd2l0aCB0aGUgZmVlIGtleVxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjM6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjMuZnJvbShzaWduZWRUeDIudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMy5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIzLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIzLmJ1aWxkKCk7XG5cbiAgICAgIHNpZ25lZFR4LmlkLnNob3VsZC5lcXVhbCgnb25rSHdmdVlKTXJ0eE5keUw2ZUhlTkVIdUUxbjVIUEg3NUNYVU5oOTFhZ2piUUF4d3pUJyk7XG4gICAgICBzaWduZWRUeC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHguaW5wdXRzLmxlbmd0aCwgMik7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzQ3NjQnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMUhVcnQ2a2Z2WXlERVlDSjJHU2p2VFBaNkttUmZ4TEJVOCcpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnZDhCMzZKVVZ5RHFwQ3ZWMUd0YkxwUDM5OGdwbXdmeHZHUU02ZVE0NUpHNXo0TGdEUlg1NVlQQVBUTVcycEFjaXdhQTNqdjh3Z3l4UjljbkVqc0NGczFRUlBmUTlHJ1xuICAgICAgKTtcbiAgICAgIHNpZ25lZFR4XG4gICAgICAgIC50b0Jyb2FkY2FzdEZvcm1hdCgpXG4gICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgJ2JhN2EwNGZhYjFhM2Y3N2VkYTk2YjU1MTk0N2RkMzQzZTE2NWQxYjkxYjZmOWY4MDY2NDhiNjNlNTdjODhjYzg2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMGU4NTI4MTAyMDAwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMGZmZmYwNDZkNjE2OTZlMDAwMDAxNDAwNzA3MDcwNzAwMDEwNTA1MDIwMDAwMDA1ZTAzMjAwNTNkMDM2ZDA3NDMwMzZlMDEwMDAwMDAyNDRiNTQzMTQ4NTU3Mjc0MzY2YjY2NzY1OTc5NDQ0NTU5NDM0YTMyNDc1MzZhNzY1NDUwNWEzNjRiNmQ1MjY2Nzg0YzQyNTUzODA1NTUwMzZjMDIwMDAwMDAxNTA3MmYwMjAwMDAwMDA5MDIwMDAwMDAwNDAzNGYwMzI3MDIwMDAwMDAwMDA3NDMwMzZhMDBhNDAxMDM0ZjAzNGQwMzFiMDIwMDAwMDBkMDA1MDkwMTAwMDAwMDYwNzM2OTY3NGU2YTQ0MzYzNDRlNzU1NjZlNTU0YjM3NmY1NjQyMzI2MzMyNTM1MDMzMzI1NjU5NmEzNzY0NTQ3OTZiNjI2ZTUyNzg3OTQ0NmY1MzM5NDI0Nzc2Njc2MTY3NzY2ZTRkNjM1NDM0Njg1OTYzNjM2MTYyNjI0NjQ3NmYzOTc0NjQ1NjUxNTQzNDRkMzQzNjY1N2E1OTRhNjQ0YzMyNzA3YTU5NDQ1Mzc3NmI2NjUyMzY3OTcyNzA3MDU5MDUwOTAxMDAwMDAwNjA3MzY5Njc1OTY2NTY1OTRhNTU2MTY5NGI0YjVhNTgzNDdhNzM3YTU3NWEzNzUyNDYzMjM5MzI2ZTU2MzI1MDM2NTg0ZDM0NmU0YjY1NmIzMjU5Njc1NzUxMzg0MjRjNTMzMTcyMzIzMjc1MzQ2MTM5NTM0Mzc2NDc0ZDYzNjIzODM5NDI2YTU0NjY3NDU0NmUzMjc2Njc1NTdhNDM1NDUxNDc1MzMyNjM0YTRlNzY2MjU5NzQ3NTQ3NTE2YTQ3NTAwMzA2NzNiMTM5M2ZiZGE0ZjI0ZTA3OTU4MTM2ZGM3OTUxZTBkMDIwNzQ4ZTU0YmQyOWI4NDczMjNlZjJiYzg1YzM5OTY1N2Y0MzU5ZmMxMGExM2U1YWZlN2I3MDY4YjU4NGVhMmU1Nzg3MzYyNTA4ODE0ODFlMjEyZTk3OTNiZmJmODgnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBzZW5kIHRyYW5zYWN0aW9uIHRvIG11bHRpcGxlIGRlc3RpbmF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhVG9TaWduID1cbiAgICAgICAgJzA1MDcwNzBhMDAwMDAwMTYwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMDA3MDcwMDAwMDUwNTAyMDAwMDAwMzIwMzIwMDUzZDAzNmQwNzQzMDM1ZDBhMDAwMDAwMTUwMDZiNWRkYWVmM2ZiNWQ3YzE1MWNmYjM2ZmJlNDNhN2EwNjY3NzczOTQwMzFlMDc0MzAzNmEwMDAxMDM0ZjAzNGQwMzFiJztcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnRyYW5zZmVyKCcxMDAnKVxuICAgICAgICAuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJylcbiAgICAgICAgLnRvKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKVxuICAgICAgICAuZmVlKCc0NzY0JylcbiAgICAgICAgLmNvdW50ZXIoJzEnKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudHJhbnNmZXIoJzEwMCcpXG4gICAgICAgIC5mcm9tKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKVxuICAgICAgICAudG8oJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpXG4gICAgICAgIC5mZWUoJzQ3NjQnKVxuICAgICAgICAuY291bnRlcignMicpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnYmE3YTA0ZmFiMWEzZjc3ZWRhOTZiNTUxOTQ3ZGQzNDNlMTY1ZDFiOTFiNmY5ZjgwNjY0OGI2M2U1N2M4OGNjODZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAwZTg1MjgxMDIwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDA3NjA3MDcwNzA3MDAwMTA1MDUwMjAwMDAwMDVlMDMyMDA1M2QwMzZkMDc0MzAzNmUwMTAwMDAwMDI0NGI1NDMxNDg1NTcyNzQzNjZiNjY3NjU5Nzk0NDQ1NTk0MzRhMzI0NzUzNmE3NjU0NTA1YTM2NGI2ZDUyNjY3ODRjNDI1NTM4MDU1NTAzNmMwMjAwMDAwMDE1MDcyZjAyMDAwMDAwMDkwMjAwMDAwMDA0MDM0ZjAzMjcwMjAwMDAwMDAwMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMDA2MDMwNjAzMDYwMzA2NmMwMWFhY2E4N2JkYmNkYzRlNjExN2I2NjdlMjlmOWI1MDQzNjJjODMxYmI5YzI1MDFlODUyODEwMjAwMDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDBmZmZmMDQ2ZDYxNjk2ZTAwMDAwMDVhMDcwNzA3MDcwMDAyMDUwNTAyMDAwMDAwNDIwMzIwMDUzZDAzNmQwNzQzMDM1ZDAxMDAwMDAwMjQ3NDdhMzE1NjUyNmE1MjcwNTY0YjZlNzYzMTM2NDE1NjcwNzI0NjQ4MzE3NDZiNDQ2ZTM0NTQ0NDY2NTY3MTQxMzgzOTMzNDEwMzFlMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMDA2MDMwNjAzMDYwMzA2J1xuICAgICAgKTtcblxuICAgICAgLy8gT2ZmbGluZSBzaWduaW5nIGZyb20gbG9jYXRpb24gMSB3aXRoIGEgdHJhbnNmZXIga2V5XG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyMTogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICAvLyBTaW5jZSBkYXRhVG9TaWduIGNhbm5vdCBtZSBjYWxjdWxhdGVkLCBpdCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBuZXcgYnVpbGRlciBzbyB3ZSBjYW5cbiAgICAgIC8vIGdlbmVyYXRlIHRoZSBzaWduYXR1cmVzXG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5vdmVycmlkZURhdGFUb1NpZ24oeyBkYXRhVG9TaWduOiB0ZXN0RGF0YVRvU2lnbiwgaW5kZXg6IDAgfSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5vdmVycmlkZURhdGFUb1NpZ24oeyBkYXRhVG9TaWduOiB0ZXN0RGF0YVRvU2lnbiwgaW5kZXg6IDEgfSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5zaWduKHtcbiAgICAgICAga2V5OiBuZXcgWHR6TGliLktleVBhaXIoeyBwcnY6ICdzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnIH0pLmdldEtleXMoKS5wcnYsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4MSA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIxLmJ1aWxkKCk7XG5cbiAgICAgIC8vIE9mZmxpbmUgc2lnbmluZyBmcm9tIGxvY2F0aW9uIDIgd2l0aCBhbm90aGVyIHRyYW5zZmVyIGtleVxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIuZnJvbShzaWduZWRUeDEudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLm92ZXJyaWRlRGF0YVRvU2lnbih7IGRhdGFUb1NpZ246IHRlc3REYXRhVG9TaWduLCBpbmRleDogMCB9KTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLm92ZXJyaWRlRGF0YVRvU2lnbih7IGRhdGFUb1NpZ246IHRlc3REYXRhVG9TaWduLCBpbmRleDogMSB9KTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLnNpZ24oeyBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHNlZWQ6IEJ1ZmZlci5hbGxvYygxNikgfSkuZ2V0S2V5cygpLnBydiwgaW5kZXg6IDEgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeDIgPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgICAvLyBPZmZsaW5lIHNpZ25pbmcgZnJvbSBsb2NhdGlvbiAzIHdpdGggdGhlIGZlZSBrZXlcbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXIzOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIzLmZyb20oc2lnbmVkVHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjMuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMy5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyMy5idWlsZCgpO1xuXG4gICAgICBzaWduZWRUeC5pZC5zaG91bGQuZXF1YWwoJ29ueUdhV3M2ejRiVlZjZm4zaDlLYkJya3RFaHVEeUpMWUVWQjRhSlJNNllObmdqRHhFNCcpO1xuICAgICAgc2lnbmVkVHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2lnbmVkVHguc291cmNlLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHguaW5wdXRzLmxlbmd0aCwgNCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgub3V0cHV0cy5sZW5ndGgsIDIpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzQ3NjQnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMV0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1syXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMl0udmFsdWUuc2hvdWxkLmVxdWFsKCc0NzY0Jyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbM10uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzNdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1sxXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnZFVwekN4bWk5TldoZGJGR2Z2cVZ5SDhYZnIyVWlQYzJma3FOclE0Q0h2cmsxOVpEa3NEa3NFYzRESnNUYnBoZW5WOGpDTlpGcXpMNHNDVlJ6TTkzSG5TU3FnSno3J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGZpcnN0VHJhbnNmZXJTaWduYXR1cmVzID0gc2lnbmVkVHguZ2V0VHJhbnNmZXJTaWduYXR1cmVzKCk7XG4gICAgICBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgZmlyc3RUcmFuc2ZlclNpZ25hdHVyZXNbMF0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ05qRDY0TnVWblVLN29WQjJjMlNQMzJWWWo3ZFR5a2JuUnh5RG9TOUJHdmdhZ3ZuTWNUNGhZY2NhYmJGR285dGRWUVQ0TTQ2ZXpZSmRMMnB6WURTd2tmUjZ5cnBwWSdcbiAgICAgICk7XG4gICAgICBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlc1swXS5pbmRleC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlc1sxXS5zaWduYXR1cmUuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnWWZWWUpVYWlLS1pYNHpzeldaN1JGMjkyblYyUDZYTTRuS2VrMllnV1E4QkxTMXIyMnU0YTlTQ3ZHTWNiODlCalRmdFRuMnZnVXpDVFFHUzJjSk52Yll0dUdRakdQJ1xuICAgICAgKTtcbiAgICAgIGZpcnN0VHJhbnNmZXJTaWduYXR1cmVzWzFdLmluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIC8vIE5vdGU6IFNpZ25hdHVyZXMgYXJlIHRoZSBzYW1lIGhlcmUgYmVjYXVzZSB0aGUgZGF0YSB0byBzaWduIHVzZWQgaW4gdGhlIHRlc3QgaXMgdGhlIHNhbWVcbiAgICAgIGNvbnN0IHNlY29uZFRyYW5zZmVyU2lnbmF0dXJlcyA9IHNpZ25lZFR4LmdldFRyYW5zZmVyU2lnbmF0dXJlcygxKTtcbiAgICAgIHNlY29uZFRyYW5zZmVyU2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzWzBdLnNpZ25hdHVyZS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdOakQ2NE51Vm5VSzdvVkIyYzJTUDMyVllqN2RUeWtiblJ4eURvUzlCR3ZnYWd2bk1jVDRoWWNjYWJiRkdvOXRkVlFUNE00NmV6WUpkTDJwellEU3drZlI2eXJwcFknXG4gICAgICApO1xuICAgICAgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzWzBdLmluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHNlY29uZFRyYW5zZmVyU2lnbmF0dXJlc1sxXS5zaWduYXR1cmUuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnWWZWWUpVYWlLS1pYNHpzeldaN1JGMjkyblYyUDZYTTRuS2VrMllnV1E4QkxTMXIyMnU0YTlTQ3ZHTWNiODlCalRmdFRuMnZnVXpDVFFHUzJjSk52Yll0dUdRakdQJ1xuICAgICAgKTtcbiAgICAgIHNlY29uZFRyYW5zZmVyU2lnbmF0dXJlc1sxXS5pbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUeFxuICAgICAgICAudG9Ccm9hZGNhc3RGb3JtYXQoKVxuICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICdiYTdhMDRmYWIxYTNmNzdlZGE5NmI1NTE5NDdkZDM0M2UxNjVkMWI5MWI2ZjlmODA2NjQ4YjYzZTU3Yzg4Y2M4NmMwMWFhY2E4N2JkYmNkYzRlNjExN2I2NjdlMjlmOWI1MDQzNjJjODMxYmI5YzI1MDBlODUyODEwMjAwMDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDBmZmZmMDQ2ZDYxNjk2ZTAwMDAwMTQwMDcwNzA3MDcwMDAxMDUwNTAyMDAwMDAwNWUwMzIwMDUzZDAzNmQwNzQzMDM2ZTAxMDAwMDAwMjQ0YjU0MzE0ODU1NzI3NDM2NmI2Njc2NTk3OTQ0NDU1OTQzNGEzMjQ3NTM2YTc2NTQ1MDVhMzY0YjZkNTI2Njc4NGM0MjU1MzgwNTU1MDM2YzAyMDAwMDAwMTUwNzJmMDIwMDAwMDAwOTAyMDAwMDAwMDQwMzRmMDMyNzAyMDAwMDAwMDAwNzQzMDM2YTAwYTQwMTAzNGYwMzRkMDMxYjAyMDAwMDAwZDAwNTA5MDEwMDAwMDA2MDczNjk2NzRlNmE0NDM2MzQ0ZTc1NTY2ZTU1NGIzNzZmNTY0MjMyNjMzMjUzNTAzMzMyNTY1OTZhMzc2NDU0Nzk2YjYyNmU1Mjc4Nzk0NDZmNTMzOTQyNDc3NjY3NjE2Nzc2NmU0ZDYzNTQzNDY4NTk2MzYzNjE2MjYyNDY0NzZmMzk3NDY0NTY1MTU0MzQ0ZDM0MzY2NTdhNTk0YTY0NGMzMjcwN2E1OTQ0NTM3NzZiNjY1MjM2Nzk3MjcwNzA1OTA1MDkwMTAwMDAwMDYwNzM2OTY3NTk2NjU2NTk0YTU1NjE2OTRiNGI1YTU4MzQ3YTczN2E1NzVhMzc1MjQ2MzIzOTMyNmU1NjMyNTAzNjU4NGQzNDZlNGI2NTZiMzI1OTY3NTc1MTM4NDI0YzUzMzE3MjMyMzI3NTM0NjEzOTUzNDM3NjQ3NGQ2MzYyMzgzOTQyNmE1NDY2NzQ1NDZlMzI3NjY3NTU3YTQzNTQ1MTQ3NTMzMjYzNGE0ZTc2NjI1OTc0NzU0NzUxNmE0NzUwMDMwNjZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAxZTg1MjgxMDIwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDEyNDA3MDcwNzA3MDAwMjA1MDUwMjAwMDAwMDQyMDMyMDA1M2QwMzZkMDc0MzAzNWQwMTAwMDAwMDI0NzQ3YTMxNTY1MjZhNTI3MDU2NGI2ZTc2MzEzNjQxNTY3MDcyNDY0ODMxNzQ2YjQ0NmUzNDU0NDQ2NjU2NzE0MTM4MzkzMzQxMDMxZTA3NDMwMzZhMDBhNDAxMDM0ZjAzNGQwMzFiMDIwMDAwMDBkMDA1MDkwMTAwMDAwMDYwNzM2OTY3NGU2YTQ0MzYzNDRlNzU1NjZlNTU0YjM3NmY1NjQyMzI2MzMyNTM1MDMzMzI1NjU5NmEzNzY0NTQ3OTZiNjI2ZTUyNzg3OTQ0NmY1MzM5NDI0Nzc2Njc2MTY3NzY2ZTRkNjM1NDM0Njg1OTYzNjM2MTYyNjI0NjQ3NmYzOTc0NjQ1NjUxNTQzNDRkMzQzNjY1N2E1OTRhNjQ0YzMyNzA3YTU5NDQ1Mzc3NmI2NjUyMzY3OTcyNzA3MDU5MDUwOTAxMDAwMDAwNjA3MzY5Njc1OTY2NTY1OTRhNTU2MTY5NGI0YjVhNTgzNDdhNzM3YTU3NWEzNzUyNDYzMjM5MzI2ZTU2MzI1MDM2NTg0ZDM0NmU0YjY1NmIzMjU5Njc1NzUxMzg0MjRjNTMzMTcyMzIzMjc1MzQ2MTM5NTM0Mzc2NDc0ZDYzNjIzODM5NDI2YTU0NjY3NDU0NmUzMjc2Njc1NTdhNDM1NDUxNDc1MzMyNjM0YTRlNzY2MjU5NzQ3NTQ3NTE2YTQ3NTAwMzA2NzY2YTBiMWY2Y2IwMzViZjUzNzg4N2JhOTAwNGM0ODliYjQ1OGQ4YzhlNzJiNTAzM2I2Y2VlOGFkNTJmODRlYzI3YjcxOWY1ZDBiOThjZGYyZDA3NDRiMjU1MzAxMjYzNjg4NjkyNjQ1ZWFmYzljZGYxYjQ4YjUwNTNjNTFkY2EnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZnVsbHkgc2lnbmVkIHJlY292ZXJ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZWNvaW4gPSBiaXRnby5jb2luKCd0eHR6JykgYXMgWHR6O1xuICAgICAgY29uc3QgcGFyYW1zID0gcGFyYW1zRGV0YWlsc0ZvclJlY292ZXJ5O1xuXG4gICAgICBub2NrKGJhc2VVcmwpLmdldChgL3YxL2FjY291bnRzLyR7cGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzc31gKS50aW1lcygxKS5yZXBseSgyMDAsIGNvbnRyYWN0QWRkcmVzc0RldGFpbHMpO1xuICAgICAgbm9jayhiYXNlVXJsKS5nZXQoYC92MS9hY2NvdW50cy8ke3BhcmFtcy5mZWVBZGRyZXNzfWApLnRpbWVzKDEpLnJlcGx5KDIwMCwgZmVlQWRkcmVzc0RldGFpbHMpO1xuICAgICAgbm9jayhiYXNlVXJsKS5nZXQoYC92MS9oZWFkYCkudGltZXMoMSkucmVwbHkoMjAwLCBjaGFpbmhlYWREYXRhKTtcbiAgICAgIG5vY2soYmFzZVVybCkuZ2V0KGAvdjEvY29udHJhY3RzLyR7cGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzc31gKS50aW1lcygyKS5yZXBseSgyMDAsIGNvbnRyYWN0QWRkcmVzc0RldGFpbHMyKTtcbiAgICAgIG5vY2soY29tbW9uLkVudmlyb25tZW50cy50ZXN0Lnh0elJwY1VybCBhcyBzdHJpbmcpXG4gICAgICAgIC5wb3N0KGAvY2hhaW5zL21haW4vYmxvY2tzL2hlYWQvaGVscGVycy9zY3JpcHRzL3BhY2tfZGF0YWAsIGRhdGFUb1BhY2spXG4gICAgICAgIC50aW1lcygxKVxuICAgICAgICAucmVwbHkoMjAwLCBwYWNrRGF0YVRvU2lnbik7XG5cbiAgICAgIGNvbnN0IGNvbnNvbGlkYXRpb25SZXN1bHQ6IGFueSA9IGF3YWl0IChiYXNlY29pbiBhcyBYdHopLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBwYXJhbXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBwYXJhbXMuYmFja3VwS2V5LCAvLyBCb3ggQiBEYXRhXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCAvLyBEZXN0aW5hdGlvbiBBZGRyZXNzXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGNvbnNvbGlkYXRpb25SZXN1bHQpO1xuICAgICAgY29uc29saWRhdGlvblJlc3VsdC5pZC5zaG91bGQuZXF1YWwoJ29wMjJadHhYN1pzb2dVdU1kdnd1TUNTNnRlZ0pYVjhGS3NBanpvV0F0M0p3aWJCVjJBNScpO1xuICAgICAgY29uc29saWRhdGlvblJlc3VsdC50eC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdlZDhmNjgzM2Y0ZGI4OTBjMWY5MjNkNTEwNzRhYTdiMzk4MmY3MjgxZjQyZGE4MDIxMmI4MTlhZDY4YzIyMzc3NmIwMWM2MmY4MGE4MGNlNzQ4YThiNWZmY2Y5NzAwNGI5ODA3Y2I1OWIwYjc4YzBiYzFmNTg1MWFlODUyMDAwMTAyZThjOTRlM2UxOGQ4YTQ5M2EyZjBiYWE4MWViMGFiN2ZhYzVkMjNmZTY3MmY5MTMzMDQ4ZWJjOGNjY2M2ZjUwNjAwNmMwMWM2MmY4MGE4MGNlNzQ4YThiNWZmY2Y5NzAwNGI5ODA3Y2I1OWIwYjc5OGY0MDJjMmY1ODUxYWYwMmVhYzAyMDAwMWJkYTcwYjUwY2Y2MDdhZWU5NWMxMDMyMmE4YmZmOWZjNGRmNTBmODUwMGZmZmYwNDZkNjE2OTZlMDAwMDAwNWYwNzA3MDcwNzAwODFlYjhiMzQwNTA1MDIwMDAwMDA0NDAzMjAwNTNkMDM2ZDA3NDMwMzVkMDEwMDAwMDAyNDc0N2EzMjUyNzQ2ZTc2NDU0YzU2NDE1NzM1NjQ1NTU0NzQ3MzQyNGU0NzM2NjM2MjUzNDEzMjY1NTE0NjY5NTk3NDM0NTI3MDAzMWUwNzQzMDM2YTAwOTQ4MmZkMTEwMzRmMDM0ZDAzMWIwMjAwMDAwMDA2MDMwNjAzMDYwMzA2ZTEzZTFiZTE2OGFmOTUzOWUwYjdjYjg5Njg5Y2U3MzRiYWU2ZmNmM2JlZDFhNWE2MDc0OWNlM2JjZDg4NjRlYTRjMjYyM2EwOTg5ZjVkZTc1YzkzNTc0NmUzYzg4YzljYWFiODIxODc2YTA2MDAxOWU3MGYzODViZjNhZjQ1NDgnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiB1bnNpZ25lZCByZWNvdmVyeSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhc2Vjb2luID0gYml0Z28uY29pbigndHh0eicpIGFzIFh0ejtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtc0RldGFpbHNGb3JVbnNpZ25lZFN3ZWVwUmVjb3Zlcnk7XG5cbiAgICAgIG5vY2soYmFzZVVybClcbiAgICAgICAgLmdldChgL3YxL2FjY291bnRzLyR7cGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzc31gKVxuICAgICAgICAudGltZXMoMSlcbiAgICAgICAgLnJlcGx5KDIwMCwgdW5zaWduZWRTd2VlcENvbnRyYWN0RGV0YWlscyk7XG4gICAgICBub2NrKGJhc2VVcmwpLmdldChgL3YxL2FjY291bnRzLyR7cGFyYW1zLmZlZUFkZHJlc3N9YCkudGltZXMoMSkucmVwbHkoMjAwLCB1bnNpZ25lZFN3ZWVwRmVlQWRkcmVzc0RldGFpbHMpO1xuICAgICAgbm9jayhiYXNlVXJsKS5nZXQoYC92MS9oZWFkYCkudGltZXMoMSkucmVwbHkoMjAwLCBjaGFpbmhlYWREYXRhKTtcbiAgICAgIG5vY2soYmFzZVVybClcbiAgICAgICAgLmdldChgL3YxL2NvbnRyYWN0cy8ke3BhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3N9YClcbiAgICAgICAgLnRpbWVzKDIpXG4gICAgICAgIC5yZXBseSgyMDAsIHVuc2lnbmVkU3dlZXBDb250cmFjdERldGFpbHMyKTtcbiAgICAgIG5vY2soY29tbW9uLkVudmlyb25tZW50cy50ZXN0Lnh0elJwY1VybCBhcyBzdHJpbmcpXG4gICAgICAgIC5wb3N0KGAvY2hhaW5zL21haW4vYmxvY2tzL2hlYWQvaGVscGVycy9zY3JpcHRzL3BhY2tfZGF0YWAsIHVuc2lnbmVkU3dlZXBEYXRhVG9QYWNrKVxuICAgICAgICAudGltZXMoMSlcbiAgICAgICAgLnJlcGx5KDIwMCwgdW5zaWduZWRTd2VlcFBhY2tEYXRhVG9TaWduKTtcblxuICAgICAgY29uc3QgY29uc29saWRhdGlvblJlc3VsdDogYW55ID0gYXdhaXQgKGJhc2Vjb2luIGFzIFh0eikucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IHBhcmFtcy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHBhcmFtcy5iYWNrdXBLZXksIC8vIEJveCBCIERhdGFcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIC8vIERlc3RpbmF0aW9uIEFkZHJlc3NcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzLFxuICAgICAgICBpc1Vuc2lnbmVkU3dlZXA6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGNvbnNvbGlkYXRpb25SZXN1bHQpO1xuICAgICAgY29uc29saWRhdGlvblJlc3VsdC50eEhleC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdlZDhmNjgzM2Y0ZGI4OTBjMWY5MjNkNTEwNzRhYTdiMzk4MmY3MjgxZjQyZGE4MDIxMmI4MTlhZDY4YzIyMzc3NmIwMWI2ZGE5NzM3ZDFiNGI3NTA1M2EzODdkOTEyMmMyMjU5OGVhZDJkM2Q4YzBiY2ZkYTljMWFlODUyMDAwMTAyZjFlYjZiMDllNDVhZmZmYjNhY2E0MjE1NjM3ZWRmNTRkMmVhM2M0NDkxNzI2MTI4Y2U1YTYwNzFhNTdkYWMwZTAwNmMwMWI2ZGE5NzM3ZDFiNGI3NTA1M2EzODdkOTEyMmMyMjU5OGVhZDJkM2Q5OGY0MDJkMGRhOWMxYWYwMmVhYzAyMDAwMWVhNGQyOTVmMzM4N2U5ZWZiZjZkNzkxNDc1Y2I5MzY4MzllYjhkNTgwMGZmZmYwNDZkNjE2OTZlMDAwMDAwNWUwNzA3MDcwNzAwOGZiNWI5MzQwNTA1MDIwMDAwMDA0MzAzMjAwNTNkMDM2ZDA3NDMwMzVkMDEwMDAwMDAyNDc0N2EzMjUyNzQ2ZTc2NDU0YzU2NDE1NzM1NjQ1NTU0NzQ3MzQyNGU0NzM2NjM2MjUzNDEzMjY1NTE0NjY5NTk3NDM0NTI3MDAzMWUwNzQzMDM2YTAwODA4OTdhMDM0ZjAzNGQwMzFiMDIwMDAwMDAwNjAzMDYwMzA2MDMwNidcbiAgICAgICk7XG4gICAgICBjb25zb2xpZGF0aW9uUmVzdWx0LnNvdXJjZS5zaG91bGQuZXF1YWwoJ0tUMVZ3ZTd3Rnk2Sm1zcE12NFVtRkZKVTNKTHRiZmdoQlRCTScpO1xuICAgICAgY29uc29saWRhdGlvblJlc3VsdC5kYXRhVG9TaWduLnNob3VsZC5lcXVhbChcbiAgICAgICAgJzA1MDcwNzBhMDAwMDAwMTYwMWVhNGQyOTVmMzM4N2U5ZWZiZjZkNzkxNDc1Y2I5MzY4MzllYjhkNTgwMDA3MDcwMDhmYjViOTM0MDUwNTAyMDAwMDAwMzQwMzIwMDUzZDAzNmQwNzQzMDM1ZDBhMDAwMDAwMTUwMWMwZDJjYWFiYzY5YjczNGZjNTQ0NTNiYTVmYWI5MDFiNGZiZWM0MWIwMzFlMDc0MzAzNmEwMDgwODk3YTAzNGYwMzRkMDMxYidcbiAgICAgICk7XG4gICAgICBjb25zb2xpZGF0aW9uUmVzdWx0LnR4SW5mby5icmFuY2guc2hvdWxkLmVxdWFsKCdCTVd1VlVDeWc1Z3J1TVJ6aHNRTVBrRjQ3V0VHOFoyQmdTeGZCbm9MQnZ6dnE5NzdYUGknKTtcbiAgICAgIGNvbnNvbGlkYXRpb25SZXN1bHQuc291cmNlQ291bnRlci5zaG91bGQuZXF1YWwoJzU0OTk2MzAzJyk7XG4gICAgICBjb25zb2xpZGF0aW9uUmVzdWx0LnRyYW5zZmVyQ291bnRlcnNbMF0uc2hvdWxkLmVxdWFsKCc1NDk5NjMwMycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transaction.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
+
const 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({
|
|
93
|
+
...resources_1.parsedTransaction,
|
|
94
|
+
contents: resources_1.parsedTransaction.contents,
|
|
95
|
+
});
|
|
96
|
+
const signer = new src_1.XtzLib.KeyPair({ pub: 'sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b' });
|
|
97
|
+
await tx.sign(signer).should.be.rejectedWith('Missing private key');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1Qyw0Q0FJc0I7QUFFdEIsbUNBQW1DO0FBRW5DLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1QixFQUFFLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxvREFBd0MsQ0FBQyxDQUFDO1lBRWpGLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUs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S0FBSyxJQUFJLEVBQUU7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFNLENBQUMsV0FBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDakMsR0FBRyw2QkFBaUI7Z0JBQ3BCLFFBQVEsRUFBRSw2QkFBaUIsQ0FBQyxRQUErQjthQUM1RCxDQUFDLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUseURBQXlELEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICB1bnNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uLFxuICBzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbixcbiAgcGFyc2VkVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25Db250ZW50cyB9IGZyb20gJ0B0YXF1aXRvL3JwYyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnVGV6b3MgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdzaG91bGQgcGFyc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3Vuc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDA0NzY0Jyk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHR4LmRlbGVnYXRlKTtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHR4LnRvSnNvbigpKS5zaG91bGQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocGFyc2VkVHJhbnNhY3Rpb24pKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25lZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R4dHonKSk7XG4gICAgICBhd2FpdCB0eC5pbml0RnJvbVNlcmlhbGl6ZWRUcmFuc2FjdGlvbihzaWduZWRTZXJpYWxpemVkT3JpZ2luYXRpb25UcmFuc2FjdGlvbik7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMUxKdnA1NWZiZE53YmlzSkZpZ245d0E0Y1BncTlUOW9jNCcpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgSlNPTi5zdHJpbmdpZnkodHgudG9Kc29uKCkpLnNob3VsZC5lcXVhbChKU09OLnN0cmluZ2lmeShwYXJzZWRUcmFuc2FjdGlvbikpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHNpZ24nLCAoKSA9PiB7XG4gICAgaXQoJ2FuIHVuc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHVuc2lnbmVkU2VyaWFsaXplZE9yaWdpbmF0aW9uVHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCBzaWduZXIgPSBuZXcgWHR6TGliLktleVBhaXIoeyBwcnY6ICdzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihzaWduZXIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0cy5sZW5ndGgsIDEpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MVZSalJwVktudjE2QVZwckZIMXRrRG40VERmVnFBODkzQScpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxRGg2MnFQWmhKdk1NdEw0ckFuRFMydUFTcHRUNkdOTE15Jyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eC5kZWxlZ2F0ZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWd1M2NqUWg4cmY3OWFYRzU1NWZSeEt6dVRhMmJ5Wm52TUpxa0pFTnBkS2pFd0NyaTZTVU05Zkx5d0RDM3c4ZTZkSFJUOFJSYUpWUWlpakM5eXp3cUw2RlNtMkpqOWEnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2lnbmVkIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tU2VyaWFsaXplZFRyYW5zYWN0aW9uKHNpZ25lZFNlcmlhbGl6ZWRPcmlnaW5hdGlvblRyYW5zYWN0aW9uKTtcblxuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejFWUmpScFZLbnYxNkFWcHJGSDF0a0RuNFREZlZxQTg5M0EnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDQ3NjQnKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMURoNjJxUFpoSnZNTXRMNHJBbkRTMnVBU3B0VDZHTkxNeScpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHguZGVsZWdhdGUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lndTNjalFoOHJmNzlhWEc1NTVmUnhLenVUYTJieVpudk1KcWtKRU5wZEtqRXdDcmk2U1VNOWZMeXdEQzN3OGU2ZEhSVDhSUmFKVlFpaWpDOXl6d3FMNkZTbTJKajlhJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgIGl0KCd0byBwYXJzZSBhbmQgaW52YWxpZCBwYXJzZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXdhaXQgdHguaW5pdEZyb21QYXJzZWRUcmFuc2FjdGlvbih7fSBhcyBYdHpMaWIuSW50ZXJmYWNlLlBhcnNlZFRyYW5zYWN0aW9uKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd0byBnZXQgdGhlIHRyYW5zYWN0aW9uIEpTT04gaWYgaXQgaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0pzb24oKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndG8gc2lnbiBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0eHR6JykpO1xuICAgICAgY29uc3Qgc2lnbmVyID0gbmV3IFh0ekxpYi5LZXlQYWlyKHsgcHJ2OiAnc3BzazJjYmlWc0F2cEdLbWF1OVhjTXNjTDNOUndqa3lUNTc1TjVBeUFvZmNvajQxeDZnNlRMJyB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oc2lnbmVyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvIHNpZ24gdGhlIHRyYW5zYWN0aW9uIGlmIHRoZSBrZXlzIGFyZSBpbnZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHh0eicpKTtcbiAgICAgIGF3YWl0IHR4LmluaXRGcm9tUGFyc2VkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJzZWRUcmFuc2FjdGlvbixcbiAgICAgICAgY29udGVudHM6IHBhcnNlZFRyYW5zYWN0aW9uLmNvbnRlbnRzIGFzIE9wZXJhdGlvbkNvbnRlbnRzW10sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25lciA9IG5ldyBYdHpMaWIuS2V5UGFpcih7IHB1YjogJ3NwcGs3WldCOGRpVTJUV2VoeGRrV0NWMkRURnZuMWhQejRxTGppRDNuSlFvektub1NFblNDOGInIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihzaWduZXIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transactionBuilder.ts"],"names":[],"mappings":""}
|