@bitgo-beta/sdk-coin-stx 1.4.3-alpha.43 → 1.4.3-alpha.430
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +24 -9
- package/dist/src/lib/abstractContractBuilder.js +2 -2
- package/dist/src/lib/constants.d.ts +2 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +5 -3
- package/dist/src/lib/contractBuilder.js +10 -10
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts +62 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.js +131 -0
- package/dist/src/lib/iface.d.ts +56 -0
- 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 +18 -19
- package/dist/src/lib/sendmanyBuilder.js +11 -11
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +31 -15
- package/dist/src/lib/transactionBuilder.js +12 -12
- package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +9 -2
- package/dist/src/lib/transferBuilder.js +4 -4
- package/dist/src/lib/utils.d.ts +25 -2
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +141 -62
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/sip10Token.d.ts +22 -0
- package/dist/src/sip10Token.d.ts.map +1 -0
- package/dist/src/sip10Token.js +128 -0
- package/dist/src/stx.d.ts +146 -2
- package/dist/src/stx.d.ts.map +1 -1
- package/dist/src/stx.js +420 -11
- package/dist/src/tstx.js +1 -1
- package/dist/test/fixtures.d.ts +119 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +147 -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 +144 -0
- package/dist/test/unit/resources.d.ts +97 -0
- package/dist/test/unit/resources.d.ts.map +1 -0
- package/dist/test/unit/resources.js +144 -0
- package/dist/test/unit/sip10Token.d.ts +2 -0
- package/dist/test/unit/sip10Token.d.ts.map +1 -0
- package/dist/test/unit/sip10Token.js +374 -0
- package/dist/test/unit/stx.d.ts +2 -0
- package/dist/test/unit/stx.d.ts.map +1 -0
- package/dist/test/unit/stx.js +470 -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 +83 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.js +421 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +187 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.js +140 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +347 -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 +326 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -11
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -127
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const network_1 = require("@stacks/network");
|
|
42
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
43
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
44
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
45
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
46
|
+
const src_1 = require("../../../src");
|
|
47
|
+
const testData = __importStar(require("../resources"));
|
|
48
|
+
const { KeyPair } = src_1.StxLib;
|
|
49
|
+
describe('Stacks: Send Many Builder', function () {
|
|
50
|
+
const coinName = 'stx';
|
|
51
|
+
const coinNameTest = 'tstx';
|
|
52
|
+
let bitgo;
|
|
53
|
+
before(function () {
|
|
54
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
|
|
55
|
+
env: 'mock',
|
|
56
|
+
});
|
|
57
|
+
bitgo.initializeTestVars();
|
|
58
|
+
bitgo.safeRegister('stx', src_1.Stx.createInstance);
|
|
59
|
+
bitgo.safeRegister('tstx', src_1.Tstx.createInstance);
|
|
60
|
+
});
|
|
61
|
+
describe('Stx Transfer Builder', () => {
|
|
62
|
+
const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinNameTest));
|
|
63
|
+
const factoryProd = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
|
|
64
|
+
const initTxBuilder = () => {
|
|
65
|
+
const txBuilder = factory.getTransferBuilder();
|
|
66
|
+
txBuilder.fee({ fee: '180' });
|
|
67
|
+
txBuilder.nonce(0);
|
|
68
|
+
txBuilder.to(testData.TX_RECIEVER.address);
|
|
69
|
+
txBuilder.amount('1000');
|
|
70
|
+
return txBuilder;
|
|
71
|
+
};
|
|
72
|
+
describe('transfer builder environment', function () {
|
|
73
|
+
it('should select the right network', function () {
|
|
74
|
+
should_1.default.equal(factory.getTransferBuilder().coinName(), 'tstx');
|
|
75
|
+
should_1.default.equal(factoryProd.getTransferBuilder().coinName(), 'stx');
|
|
76
|
+
// used type any to access protected properties
|
|
77
|
+
const txBuilder = factory.getTransferBuilder();
|
|
78
|
+
const txBuilderProd = factoryProd.getTransferBuilder();
|
|
79
|
+
txBuilder._network.should.deepEqual(new network_1.StacksTestnet());
|
|
80
|
+
txBuilderProd._network.should.deepEqual(new network_1.StacksMainnet());
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('should build ', () => {
|
|
84
|
+
it('a signed transfer transaction', async () => {
|
|
85
|
+
const builder = initTxBuilder();
|
|
86
|
+
builder.fromPubKey(testData.TX_SENDER.pub);
|
|
87
|
+
builder.sign({ key: testData.TX_SENDER.prv });
|
|
88
|
+
const tx = await builder.build();
|
|
89
|
+
const txJson = tx.toJson();
|
|
90
|
+
// should.deepEqual(tx.signature.length, 1);
|
|
91
|
+
should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
|
|
92
|
+
should_1.default.deepEqual(txJson.payload.amount, '1000');
|
|
93
|
+
should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
|
|
94
|
+
should_1.default.deepEqual(txJson.nonce, 0);
|
|
95
|
+
should_1.default.deepEqual(txJson.fee.toString(), '180');
|
|
96
|
+
should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
|
|
97
|
+
tx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
98
|
+
tx.outputs.length.should.equal(1);
|
|
99
|
+
tx.outputs[0].address.should.equal(testData.TX_RECIEVER.address);
|
|
100
|
+
tx.outputs[0].value.should.equal('1000');
|
|
101
|
+
tx.inputs.length.should.equal(1);
|
|
102
|
+
tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
|
|
103
|
+
tx.inputs[0].value.should.equal('1000');
|
|
104
|
+
});
|
|
105
|
+
it('a transfer transaction with memo', async () => {
|
|
106
|
+
const builder = initTxBuilder();
|
|
107
|
+
builder.fromPubKey(testData.TX_SENDER.pub);
|
|
108
|
+
builder.memo('This is an example');
|
|
109
|
+
builder.sign({ key: testData.TX_SENDER.prv });
|
|
110
|
+
const tx = await builder.build();
|
|
111
|
+
const txJson = tx.toJson();
|
|
112
|
+
should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
|
|
113
|
+
should_1.default.deepEqual(txJson.payload.amount, '1000');
|
|
114
|
+
should_1.default.deepEqual(txJson.payload.memo, 'This is an example');
|
|
115
|
+
should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
|
|
116
|
+
should_1.default.deepEqual(txJson.nonce, 0);
|
|
117
|
+
should_1.default.deepEqual(txJson.fee.toString(), '180');
|
|
118
|
+
});
|
|
119
|
+
it('an unsigned multisig signed and verified', async () => {
|
|
120
|
+
const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
|
|
121
|
+
const amount = '1000';
|
|
122
|
+
const memo = 'test';
|
|
123
|
+
const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
|
|
124
|
+
const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
|
|
125
|
+
const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
|
|
126
|
+
const txBuilder = factory.getTransferBuilder();
|
|
127
|
+
txBuilder.fee({
|
|
128
|
+
fee: '180',
|
|
129
|
+
});
|
|
130
|
+
txBuilder.to(destination);
|
|
131
|
+
txBuilder.amount(amount);
|
|
132
|
+
txBuilder.nonce(1);
|
|
133
|
+
txBuilder.fromPubKey([kp.getKeys().pub, kp1.getKeys().pub, kp2.getKeys().pub]);
|
|
134
|
+
txBuilder.numberSignatures(2);
|
|
135
|
+
txBuilder.memo(memo);
|
|
136
|
+
const tx = await txBuilder.build(); // unsigned multisig tx
|
|
137
|
+
const txBuilder2 = factory.getTransferBuilder();
|
|
138
|
+
txBuilder2.from(tx.toBroadcastFormat());
|
|
139
|
+
txBuilder2.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
|
|
140
|
+
txBuilder2.sign({ key: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
|
|
141
|
+
txBuilder.fromPubKey([kp.getKeys().pub, kp1.getKeys().pub, kp2.getKeys().pub]);
|
|
142
|
+
const signedTx = await txBuilder2.build(); // signed multisig tx
|
|
143
|
+
const txBuilder3 = factory.getTransferBuilder();
|
|
144
|
+
txBuilder3.from(signedTx.toBroadcastFormat());
|
|
145
|
+
const remake = await txBuilder3.build();
|
|
146
|
+
should_1.default.deepEqual(remake.toBroadcastFormat(), signedTx.toBroadcastFormat());
|
|
147
|
+
});
|
|
148
|
+
it('an half signed tx', async () => {
|
|
149
|
+
const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
|
|
150
|
+
const amount = '1000';
|
|
151
|
+
const memo = 'test';
|
|
152
|
+
const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
|
|
153
|
+
const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
|
|
154
|
+
const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
|
|
155
|
+
const txBuilder = factory.getTransferBuilder();
|
|
156
|
+
txBuilder.fee({
|
|
157
|
+
fee: '180',
|
|
158
|
+
});
|
|
159
|
+
txBuilder.to(destination);
|
|
160
|
+
txBuilder.amount(amount);
|
|
161
|
+
txBuilder.nonce(1);
|
|
162
|
+
txBuilder.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
|
|
163
|
+
txBuilder.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
|
|
164
|
+
txBuilder.numberSignatures(2);
|
|
165
|
+
txBuilder.memo(memo);
|
|
166
|
+
const tx = await txBuilder.build(); // half signed multisig tx
|
|
167
|
+
should_1.default.deepEqual(tx.signature.length, 1);
|
|
168
|
+
const txBuilder2 = factory.getTransferBuilder();
|
|
169
|
+
txBuilder2.from(tx.toBroadcastFormat());
|
|
170
|
+
txBuilder2.sign({ key: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
|
|
171
|
+
txBuilder2.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
|
|
172
|
+
const signedTx = await txBuilder2.build();
|
|
173
|
+
should_1.default.deepEqual(signedTx.toBroadcastFormat(), '808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000100000000000000b4000000030201091538373641a50a4ebd6f653bb7b477489aceec50eff963072a838d2eaf50e4784c7c6d1490f57b899f0f04c215fce9176d9bb4ce19bfb07499c48878675a1f02008074202e04a7c777b4cdd26ad3fd35194311536113666d81a3840148e59eb43f274d88768ef1202d55633bfdcde8c6057932107354f406af6c378b6ea6b75d1a00038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d000203020000000000051a1ae3f911d8f1d46d7416bfbe4b593fd41eac19cb00000000000003e874657374000000000000000000000000000000000000000000000000000000000000');
|
|
174
|
+
should_1.default.deepEqual(signedTx.signature.length, 2);
|
|
175
|
+
});
|
|
176
|
+
it('an half signed tx with xprv', async () => {
|
|
177
|
+
const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
|
|
178
|
+
const amount = '1000';
|
|
179
|
+
const memo = 'test';
|
|
180
|
+
const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
|
|
181
|
+
const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
|
|
182
|
+
const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
|
|
183
|
+
const txBuilder = factory.getTransferBuilder();
|
|
184
|
+
txBuilder.fee({
|
|
185
|
+
fee: '180',
|
|
186
|
+
});
|
|
187
|
+
txBuilder.to(destination);
|
|
188
|
+
txBuilder.amount(amount);
|
|
189
|
+
txBuilder.nonce(1);
|
|
190
|
+
txBuilder.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
|
|
191
|
+
txBuilder.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
|
|
192
|
+
txBuilder.numberSignatures(2);
|
|
193
|
+
txBuilder.memo(memo);
|
|
194
|
+
const tx = await txBuilder.build(); // half signed multisig tx
|
|
195
|
+
should_1.default.deepEqual(tx.signature.length, 1);
|
|
196
|
+
const txBuilder2 = factory.getTransferBuilder();
|
|
197
|
+
txBuilder2.from(tx.toBroadcastFormat());
|
|
198
|
+
txBuilder2.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
|
|
199
|
+
const extendedKey = (0, sdk_core_1.rawPrvToExtendedKeys)(kp1.getKeys(false).prv);
|
|
200
|
+
txBuilder2.sign({ key: extendedKey.xprv });
|
|
201
|
+
const signedTx = await txBuilder2.build();
|
|
202
|
+
should_1.default.deepEqual(signedTx.toBroadcastFormat(), '808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000100000000000000b4000000030201091538373641a50a4ebd6f653bb7b477489aceec50eff963072a838d2eaf50e4784c7c6d1490f57b899f0f04c215fce9176d9bb4ce19bfb07499c48878675a1f02008074202e04a7c777b4cdd26ad3fd35194311536113666d81a3840148e59eb43f274d88768ef1202d55633bfdcde8c6057932107354f406af6c378b6ea6b75d1a00038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d000203020000000000051a1ae3f911d8f1d46d7416bfbe4b593fd41eac19cb00000000000003e874657374000000000000000000000000000000000000000000000000000000000000');
|
|
203
|
+
should_1.default.deepEqual(signedTx.signature.length, 2);
|
|
204
|
+
});
|
|
205
|
+
it('a multisig transfer transaction', async () => {
|
|
206
|
+
const builder = initTxBuilder();
|
|
207
|
+
builder.memo('test memo');
|
|
208
|
+
builder.sign({ key: testData.prv1 });
|
|
209
|
+
builder.sign({ key: testData.prv2 });
|
|
210
|
+
builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
|
|
211
|
+
const tx = await builder.build();
|
|
212
|
+
should_1.default.deepEqual(tx.toBroadcastFormat(), testData.MULTI_SIG_SIGNED_TRANSACTION);
|
|
213
|
+
should_1.default.deepEqual(tx.signature.length, 2);
|
|
214
|
+
});
|
|
215
|
+
it('a multisig serialized transfer transaction', async () => {
|
|
216
|
+
const builder = factory.from(testData.MULTI_SIG_SIGNED_TRANSACTION);
|
|
217
|
+
const tx = await builder.build();
|
|
218
|
+
should_1.default.deepEqual(tx.toBroadcastFormat(), testData.MULTI_SIG_SIGNED_TRANSACTION);
|
|
219
|
+
});
|
|
220
|
+
it('a transfer transaction signed multiple times', async () => {
|
|
221
|
+
const builder = initTxBuilder();
|
|
222
|
+
builder.memo('test memo');
|
|
223
|
+
builder.sign({ key: testData.prv1 });
|
|
224
|
+
builder.sign({ key: testData.prv2 });
|
|
225
|
+
builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
|
|
226
|
+
builder.numberSignatures(2);
|
|
227
|
+
const tx = await builder.build();
|
|
228
|
+
const txJson = tx.toJson();
|
|
229
|
+
should_1.default.deepEqual(tx.signature.length, 2);
|
|
230
|
+
should_1.default.deepEqual(txJson.fee.toString(), '180');
|
|
231
|
+
should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
|
|
232
|
+
should_1.default.deepEqual(txJson.payload.memo, 'test memo');
|
|
233
|
+
should_1.default.deepEqual(txJson.payload.amount, '1000');
|
|
234
|
+
});
|
|
235
|
+
it('a transfer transaction with amount 0', async () => {
|
|
236
|
+
const builder = initTxBuilder();
|
|
237
|
+
builder.amount('0');
|
|
238
|
+
builder.fromPubKey(testData.TX_SENDER.pub);
|
|
239
|
+
builder.sign({ key: testData.TX_SENDER.prv });
|
|
240
|
+
const tx = await builder.build();
|
|
241
|
+
const txJson = tx.toJson();
|
|
242
|
+
should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
|
|
243
|
+
should_1.default.deepEqual(txJson.payload.amount, '0');
|
|
244
|
+
should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
|
|
245
|
+
should_1.default.deepEqual(txJson.fee.toString(), '180');
|
|
246
|
+
});
|
|
247
|
+
it('get pubkey of a transfer transaction signed 1', async () => {
|
|
248
|
+
const txBuilder2 = factory.getTransferBuilder();
|
|
249
|
+
txBuilder2.from(testData.SIGNED_TRANSACTION_PK_1_3);
|
|
250
|
+
should_1.default.deepEqual(txBuilder2._fromPubKeys, [testData.pub1, testData.pub2, testData.pub3]);
|
|
251
|
+
});
|
|
252
|
+
it('get pubkey of a transfer transaction signed 2', async () => {
|
|
253
|
+
const txBuilder2 = factory.getTransferBuilder();
|
|
254
|
+
txBuilder2.from(testData.SIGNED_TRANSACTION_PK_2_3);
|
|
255
|
+
should_1.default.deepEqual(txBuilder2._fromPubKeys, [testData.pub1, testData.pub2, testData.pub3]);
|
|
256
|
+
});
|
|
257
|
+
it('a transfer transaction signed multiple times with mid key no signer', async () => {
|
|
258
|
+
const builder = initTxBuilder();
|
|
259
|
+
builder.memo('test');
|
|
260
|
+
builder.sign({ key: testData.prv1 });
|
|
261
|
+
builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
|
|
262
|
+
builder.numberSignatures(2);
|
|
263
|
+
const tx = await builder.build();
|
|
264
|
+
const txBuilder2 = factory.getTransferBuilder();
|
|
265
|
+
txBuilder2.from(tx.toBroadcastFormat());
|
|
266
|
+
txBuilder2.sign({ key: testData.prv3 });
|
|
267
|
+
const signedTx = await txBuilder2.build();
|
|
268
|
+
const txJson = signedTx.toJson();
|
|
269
|
+
should_1.default.deepEqual(signedTx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_1_3);
|
|
270
|
+
should_1.default.deepEqual(signedTx.signature.length, 2);
|
|
271
|
+
should_1.default.deepEqual(txJson.fee.toString(), '180');
|
|
272
|
+
should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
|
|
273
|
+
should_1.default.deepEqual(txJson.payload.memo, 'test');
|
|
274
|
+
should_1.default.deepEqual(txJson.payload.amount, '1000');
|
|
275
|
+
});
|
|
276
|
+
it('a transfer transaction signed multiple times with first key no signer', async () => {
|
|
277
|
+
const builder = initTxBuilder();
|
|
278
|
+
builder.memo('test');
|
|
279
|
+
builder.sign({ key: testData.prv2 });
|
|
280
|
+
builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
|
|
281
|
+
builder.numberSignatures(2);
|
|
282
|
+
const tx = await builder.build();
|
|
283
|
+
const txBuilder2 = factory.getTransferBuilder();
|
|
284
|
+
txBuilder2.from(tx.toBroadcastFormat());
|
|
285
|
+
txBuilder2.sign({ key: testData.prv3 });
|
|
286
|
+
const signedTx = await txBuilder2.build();
|
|
287
|
+
const txJson = signedTx.toJson();
|
|
288
|
+
should_1.default.deepEqual(signedTx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_2_3);
|
|
289
|
+
should_1.default.deepEqual(signedTx.signature.length, 2);
|
|
290
|
+
should_1.default.deepEqual(txJson.fee.toString(), '180');
|
|
291
|
+
should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
|
|
292
|
+
should_1.default.deepEqual(txJson.payload.memo, 'test');
|
|
293
|
+
should_1.default.deepEqual(txJson.payload.amount, '1000');
|
|
294
|
+
});
|
|
295
|
+
describe('serialized transactions', () => {
|
|
296
|
+
it('a non signed transfer transaction from serialized', async () => {
|
|
297
|
+
const builder = factory.from(testData.RAW_TX_UNSIGNED);
|
|
298
|
+
builder.sign({ key: testData.TX_SENDER.prv });
|
|
299
|
+
const tx2 = await builder.build();
|
|
300
|
+
should_1.default.deepEqual(tx2.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
|
|
301
|
+
tx2.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
302
|
+
});
|
|
303
|
+
it('a signed transfer transaction from serialized', async () => {
|
|
304
|
+
const txBuilder = factory.from(testData.SIGNED_TRANSACTION);
|
|
305
|
+
const tx = await txBuilder.build();
|
|
306
|
+
should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
|
|
307
|
+
tx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
308
|
+
});
|
|
309
|
+
it('a signed transfer transaction from serilaized 1', async () => {
|
|
310
|
+
const txBuilder = factory.from(testData.SIGNED_TRANSACTION_PK_2_3);
|
|
311
|
+
const tx = await txBuilder.build();
|
|
312
|
+
should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_2_3);
|
|
313
|
+
tx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
314
|
+
});
|
|
315
|
+
it('a signed transfer transaction from serilaized 2', async () => {
|
|
316
|
+
const txBuilder = factory.from(testData.SIGNED_TRANSACTION_PK_1_3);
|
|
317
|
+
const tx = await txBuilder.build();
|
|
318
|
+
should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_1_3);
|
|
319
|
+
tx.type.should.equal(sdk_core_1.TransactionType.Send);
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
describe('should fail', () => {
|
|
323
|
+
it('a transfer transaction with an invalid key', () => {
|
|
324
|
+
const builder = initTxBuilder();
|
|
325
|
+
assert_1.default.throws(() => builder.sign({ key: 'invalidKey' }), /Unsupported private key/);
|
|
326
|
+
});
|
|
327
|
+
it('a transfer transaction with an invalid destination address', () => {
|
|
328
|
+
const txBuilder = factory.getTransferBuilder();
|
|
329
|
+
assert_1.default.throws(() => txBuilder.to('invalidaddress'), /Invalid address/);
|
|
330
|
+
});
|
|
331
|
+
it('a transfer transaction with an invalid amount: text value', () => {
|
|
332
|
+
const txBuilder = factory.getTransferBuilder();
|
|
333
|
+
assert_1.default.throws(() => txBuilder.amount('invalidamount'), /Invalid amount/);
|
|
334
|
+
});
|
|
335
|
+
it('a transfer transaction with an invalid amount: negative value', () => {
|
|
336
|
+
const txBuilder = factory.getTransferBuilder();
|
|
337
|
+
assert_1.default.throws(() => txBuilder.amount('-5'), /Invalid amount/);
|
|
338
|
+
});
|
|
339
|
+
it('a transfer transaction with an invalid memo', async () => {
|
|
340
|
+
const txBuilder = factory.getTransferBuilder();
|
|
341
|
+
assert_1.default.throws(() => txBuilder.memo('This is a memo that is too long for a transaction'), /Memo is too long/);
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErRDtBQUMvRCxtREFBNkU7QUFFN0UsbURBQStEO0FBQy9ELGlEQUErQztBQUMvQyxpREFBNEM7QUFFNUMsc0NBQWlEO0FBQ2pELHVEQUF5QztBQUV6QyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsWUFBTSxDQUFDO0FBRTNCLFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtJQUNwQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUV4QixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQU0sQ0FBQyx5QkFB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LENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgU3RhY2tzTWFpbm5ldCwgU3RhY2tzVGVzdG5ldCB9IGZyb20gJ0BzdGFja3MvbmV0d29yayc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIHJhd1BydlRvRXh0ZW5kZWRLZXlzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBTdHgsIFRzdHgsIFN0eExpYiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5jb25zdCB7IEtleVBhaXIgfSA9IFN0eExpYjtcblxuZGVzY3JpYmUoJ1N0YWNrczogU2VuZCBNYW55IEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW5OYW1lID0gJ3N0eCc7XG4gIGNvbnN0IGNvaW5OYW1lVGVzdCA9ICd0c3R4JztcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwge1xuICAgICAgZW52OiAnbW9jaycsXG4gICAgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdzdHgnLCBTdHguY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHN0eCcsIFRzdHguY3JlYXRlSW5zdGFuY2UpO1xuICB9KTtcbiAgZGVzY3JpYmUoJ1N0eCBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lVGVzdCkpO1xuICAgIGNvbnN0IGZhY3RvcnlQcm9kID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZSkpO1xuXG4gICAgY29uc3QgaW5pdFR4QnVpbGRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTgwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5ub25jZSgwKTtcbiAgICAgIHR4QnVpbGRlci50byh0ZXN0RGF0YS5UWF9SRUNJRVZFUi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5hbW91bnQoJzEwMDAnKTtcbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGRlc2NyaWJlKCd0cmFuc2ZlciBidWlsZGVyIGVudmlyb25tZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBzZWxlY3QgdGhlIHJpZ2h0IG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpLmNvaW5OYW1lKCksICd0c3R4Jyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChmYWN0b3J5UHJvZC5nZXRUcmFuc2ZlckJ1aWxkZXIoKS5jb2luTmFtZSgpLCAnc3R4Jyk7XG4gICAgICAgIC8vIHVzZWQgdHlwZSBhbnkgdG8gYWNjZXNzIHByb3RlY3RlZCBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyUHJvZDogYW55ID0gZmFjdG9yeVByb2QuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgICAgdHhCdWlsZGVyLl9uZXR3b3JrLnNob3VsZC5kZWVwRXF1YWwobmV3IFN0YWNrc1Rlc3RuZXQoKSk7XG4gICAgICAgIHR4QnVpbGRlclByb2QuX25ldHdvcmsuc2hvdWxkLmRlZXBFcXVhbChuZXcgU3RhY2tzTWFpbm5ldCgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCAoKSA9PiB7XG4gICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgLy8gc2hvdWxkLmRlZXBFcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAxKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMTAwMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLm5vbmNlLCAwKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksICcxODAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRYX1NFTkRFUi5hZGRyZXNzKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgICBidWlsZGVyLm1lbW8oJ1RoaXMgaXMgYW4gZXhhbXBsZScpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlRYX1NFTkRFUi5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMTAwMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLm1lbW8sICdUaGlzIGlzIGFuIGV4YW1wbGUnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgdGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub25jZSwgMCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIHVuc2lnbmVkIG11bHRpc2lnIHNpZ25lZCBhbmQgdmVyaWZpZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgICBjb25zdCBhbW91bnQgPSAnMTAwMCc7XG4gICAgICAgIGNvbnN0IG1lbW8gPSAndGVzdCc7XG4gICAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwcnY6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICBjb25zdCBrcDEgPSBuZXcgS2V5UGFpcih7IHBydjogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScgfSk7XG4gICAgICAgIGNvbnN0IGtwMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnZTc1ZGNiNjZmODQyODdlYWYzNDc5NTVlOTRmYTA0MzM3Mjk4ZGJkOTVhYTBkYmI5ODU3NzExMDRlZjE5MTNkYjAxJyB9KTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgICAgZmVlOiAnMTgwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci50byhkZXN0aW5hdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbVB1YktleShba3AuZ2V0S2V5cygpLnB1Yiwga3AxLmdldEtleXMoKS5wdWIsIGtwMi5nZXRLZXlzKCkucHViXSk7XG4gICAgICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTsgLy8gdW5zaWduZWQgbXVsdGlzaWcgdHhcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6ICdjNzE3MDBiMDdkNTIwYThjOTczMWU0ZDBmMDk1YWE2ZWZiOTFlMTZlMjVmYjI3Y2UyYjcyZTdiNjk4ZjgxMjdhMDEnIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbVB1YktleShba3AuZ2V0S2V5cygpLnB1Yiwga3AxLmdldEtleXMoKS5wdWIsIGtwMi5nZXRLZXlzKCkucHViXSk7XG4gICAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpOyAvLyBzaWduZWQgbXVsdGlzaWcgdHhcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIzID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMy5mcm9tKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCByZW1ha2UgPSBhd2FpdCB0eEJ1aWxkZXIzLmJ1aWxkKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVtYWtlLnRvQnJvYWRjYXN0Rm9ybWF0KCksIHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbiBoYWxmIHNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMCc7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwJztcbiAgICAgICAgY29uc3QgbWVtbyA9ICd0ZXN0JztcbiAgICAgICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHBydjogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScgfSk7XG4gICAgICAgIGNvbnN0IGtwMSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnYzcxNzAwYjA3ZDUyMGE4Yzk3MzFlNGQwZjA5NWFhNmVmYjkxZTE2ZTI1ZmIyN2NlMmI3MmU3YjY5OGY4MTI3YTAxJyB9KTtcbiAgICAgICAgY29uc3Qga3AyID0gbmV3IEtleVBhaXIoeyBwcnY6ICdlNzVkY2I2NmY4NDI4N2VhZjM0Nzk1NWU5NGZhMDQzMzcyOThkYmQ5NWFhMGRiYjk4NTc3MTEwNGVmMTkxM2RiMDEnIH0pO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgICBmZWU6ICcxODAnLFxuICAgICAgICB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UoMSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmZyb21QdWJLZXkoW2twLmdldEtleXModHJ1ZSkucHViLCBrcDEuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMi5nZXRLZXlzKHRydWUpLnB1Yl0pO1xuICAgICAgICB0eEJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7IC8vIGhhbGYgc2lnbmVkIG11bHRpc2lnIHR4XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScgfSk7XG4gICAgICAgIHR4QnVpbGRlcjIuZnJvbVB1YktleShba3AuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMS5nZXRLZXlzKHRydWUpLnB1Yiwga3AyLmdldEtleXModHJ1ZSkucHViXSk7XG4gICAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgICAgJzgwODAwMDAwMDAwNDAxMmZlNTA3YzA5ZGJiMjNjM2I3ZTVkMTY2YzgxZmM0Yjg3NjkyNTEwYjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMGI0MDAwMDAwMDMwMjAxMDkxNTM4MzczNjQxYTUwYTRlYmQ2ZjY1M2JiN2I0Nzc0ODlhY2VlYzUwZWZmOTYzMDcyYTgzOGQyZWFmNTBlNDc4NGM3YzZkMTQ5MGY1N2I4OTlmMGYwNGMyMTVmY2U5MTc2ZDliYjRjZTE5YmZiMDc0OTljNDg4Nzg2NzVhMWYwMjAwODA3NDIwMmUwNGE3Yzc3N2I0Y2RkMjZhZDNmZDM1MTk0MzExNTM2MTEzNjY2ZDgxYTM4NDAxNDhlNTllYjQzZjI3NGQ4ODc2OGVmMTIwMmQ1NTYzM2JmZGNkZThjNjA1NzkzMjEwNzM1NGY0MDZhZjZjMzc4YjZlYTZiNzVkMWEwMDAzOGUzYzQ1MjkzOTU2MTFiZTlhYmY2ZmEzYjY5ODdlODFkNDAyMzg1ZTNkNjA1YTA3M2Y0MmY0MDc1NjVhNGEzZDAwMDIwMzAyMDAwMDAwMDAwMDA1MWExYWUzZjkxMWQ4ZjFkNDZkNzQxNmJmYmU0YjU5M2ZkNDFlYWMxOWNiMDAwMDAwMDAwMDAwMDNlODc0NjU3Mzc0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbiBoYWxmIHNpZ25lZCB0eCB3aXRoIHhwcnYnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgICBjb25zdCBhbW91bnQgPSAnMTAwMCc7XG4gICAgICAgIGNvbnN0IG1lbW8gPSAndGVzdCc7XG4gICAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwcnY6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICBjb25zdCBrcDEgPSBuZXcgS2V5UGFpcih7IHBydjogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScgfSk7XG4gICAgICAgIGNvbnN0IGtwMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnZTc1ZGNiNjZmODQyODdlYWYzNDc5NTVlOTRmYTA0MzM3Mjk4ZGJkOTVhYTBkYmI5ODU3NzExMDRlZjE5MTNkYjAxJyB9KTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgICAgZmVlOiAnMTgwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci50byhkZXN0aW5hdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScgfSk7XG4gICAgICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KFtrcC5nZXRLZXlzKHRydWUpLnB1Yiwga3AxLmdldEtleXModHJ1ZSkucHViLCBrcDIuZ2V0S2V5cyh0cnVlKS5wdWJdKTtcbiAgICAgICAgdHhCdWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpOyAvLyBoYWxmIHNpZ25lZCBtdWx0aXNpZyB0eFxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb21QdWJLZXkoW2twLmdldEtleXModHJ1ZSkucHViLCBrcDEuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMi5nZXRLZXlzKHRydWUpLnB1Yl0pO1xuICAgICAgICBjb25zdCBleHRlbmRlZEtleSA9IHJhd1BydlRvRXh0ZW5kZWRLZXlzKGtwMS5nZXRLZXlzKGZhbHNlKS5wcnYhKTtcbiAgICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiBleHRlbmRlZEtleS54cHJ2IH0pO1xuICAgICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICAgICc4MDgwMDAwMDAwMDQwMTJmZTUwN2MwOWRiYjIzYzNiN2U1ZDE2NmM4MWZjNGI4NzY5MjUxMGIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDBiNDAwMDAwMDAzMDIwMTA5MTUzODM3MzY0MWE1MGE0ZWJkNmY2NTNiYjdiNDc3NDg5YWNlZWM1MGVmZjk2MzA3MmE4MzhkMmVhZjUwZTQ3ODRjN2M2ZDE0OTBmNTdiODk5ZjBmMDRjMjE1ZmNlOTE3NmQ5YmI0Y2UxOWJmYjA3NDk5YzQ4ODc4Njc1YTFmMDIwMDgwNzQyMDJlMDRhN2M3NzdiNGNkZDI2YWQzZmQzNTE5NDMxMTUzNjExMzY2NmQ4MWEzODQwMTQ4ZTU5ZWI0M2YyNzRkODg3NjhlZjEyMDJkNTU2MzNiZmRjZGU4YzYwNTc5MzIxMDczNTRmNDA2YWY2YzM3OGI2ZWE2Yjc1ZDFhMDAwMzhlM2M0NTI5Mzk1NjExYmU5YWJmNmZhM2I2OTg3ZTgxZDQwMjM4NWUzZDYwNWEwNzNmNDJmNDA3NTY1YTRhM2QwMDAyMDMwMjAwMDAwMDAwMDAwNTFhMWFlM2Y5MTFkOGYxZDQ2ZDc0MTZiZmJlNGI1OTNmZDQxZWFjMTljYjAwMDAwMDAwMDAwMDAzZTg3NDY1NzM3NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBtdWx0aXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8nKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnYxIH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjIgfSk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleShbdGVzdERhdGEucHViMSwgdGVzdERhdGEucHViMiwgdGVzdERhdGEucHViM10pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5NVUxUSV9TSUdfU0lHTkVEX1RSQU5TQUNUSU9OKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBtdWx0aXNpZyBzZXJpYWxpemVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLk1VTFRJX1NJR19TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5NVUxUSV9TSUdfU0lHTkVEX1RSQU5TQUNUSU9OKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzaWduZWQgbXVsdGlwbGUgdGltZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIubWVtbygndGVzdCBtZW1vJyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnYyIH0pO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkoW3Rlc3REYXRhLnB1YjEsIHRlc3REYXRhLnB1YjIsIHRlc3REYXRhLnB1YjNdKTtcbiAgICAgICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQudG8sIHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLm1lbW8sICd0ZXN0IG1lbW8nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5hbW91bnQsICcxMDAwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbW91bnQgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzAnKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlRYX1NFTkRFUi5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2dldCBwdWJrZXkgb2YgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzaWduZWQgMScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMjogYW55ID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18xXzMpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4QnVpbGRlcjIuX2Zyb21QdWJLZXlzLCBbdGVzdERhdGEucHViMSwgdGVzdERhdGEucHViMiwgdGVzdERhdGEucHViM10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdnZXQgcHVia2V5IG9mIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIDInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjI6IGFueSA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjIuZnJvbSh0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT05fUEtfMl8zKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEJ1aWxkZXIyLl9mcm9tUHViS2V5cywgW3Rlc3REYXRhLnB1YjEsIHRlc3REYXRhLnB1YjIsIHRlc3REYXRhLnB1YjNdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzaWduZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBtaWQga2V5IG5vIHNpZ25lcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5tZW1vKCd0ZXN0Jyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MSB9KTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KFt0ZXN0RGF0YS5wdWIxLCB0ZXN0RGF0YS5wdWIyLCB0ZXN0RGF0YS5wdWIzXSk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MyB9KTtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgICAgY29uc3QgdHhKc29uID0gc2lnbmVkVHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzFfMyk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksICcxODAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQubWVtbywgJ3Rlc3QnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5hbW91bnQsICcxMDAwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIG11bHRpcGxlIHRpbWVzIHdpdGggZmlyc3Qga2V5IG5vIHNpZ25lcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5tZW1vKCd0ZXN0Jyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MiB9KTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KFt0ZXN0RGF0YS5wdWIxLCB0ZXN0RGF0YS5wdWIyLCB0ZXN0RGF0YS5wdWIzXSk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MyB9KTtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgICAgY29uc3QgdHhKc29uID0gc2lnbmVkVHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzJfMyk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLnRvU3RyaW5nKCksICcxODAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC50bywgdGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQubWVtbywgJ3Rlc3QnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5hbW91bnQsICcxMDAwJyk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3NlcmlhbGl6ZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgICAgICBpdCgnYSBub24gc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlJBV19UWF9VTlNJR05FRCk7XG4gICAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICAgIHR4Mi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTik7XG4gICAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTik7XG4gICAgICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpbGFpemVkIDEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18yXzMpO1xuICAgICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT05fUEtfMl8zKTtcbiAgICAgICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlsYWl6ZWQgMicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzFfMyk7XG4gICAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18xXzMpO1xuICAgICAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQga2V5JywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLnNpZ24oeyBrZXk6ICdpbnZhbGlkS2V5JyB9KSwgL1Vuc3VwcG9ydGVkIHByaXZhdGUga2V5Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW4gaW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG8oJ2ludmFsaWRhZGRyZXNzJyksIC9JbnZhbGlkIGFkZHJlc3MvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGFtb3VudDogdGV4dCB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmFtb3VudCgnaW52YWxpZGFtb3VudCcpLCAvSW52YWxpZCBhbW91bnQvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGFtb3VudDogbmVnYXRpdmUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5hbW91bnQoJy01JyksIC9JbnZhbGlkIGFtb3VudC8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQgbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLm1lbW8oJ1RoaXMgaXMgYSBtZW1vIHRoYXQgaXMgdG9vIGxvbmcgZm9yIGEgdHJhbnNhY3Rpb24nKSwgL01lbW8gaXMgdG9vIGxvbmcvKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}
|