@bitgo-beta/sdk-coin-stx 1.1.1-beta.232 → 1.1.1-beta.2321
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 +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +25 -9
- package/dist/src/lib/abstractContractBuilder.js +4 -4
- package/dist/src/lib/btcAddressUtils.d.ts +30 -0
- package/dist/src/lib/btcAddressUtils.d.ts.map +1 -0
- package/dist/src/lib/btcAddressUtils.js +134 -0
- package/dist/src/lib/constants.d.ts +16 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +30 -3
- package/dist/src/lib/contractBuilder.d.ts.map +1 -1
- package/dist/src/lib/contractBuilder.js +44 -12
- 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 +61 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +28 -9
- package/dist/src/lib/keyPair.js +18 -19
- package/dist/src/lib/network.d.ts +16 -0
- package/dist/src/lib/network.d.ts.map +1 -0
- package/dist/src/lib/network.js +29 -0
- package/dist/src/lib/pox5Builder.d.ts +78 -0
- package/dist/src/lib/pox5Builder.d.ts.map +1 -0
- package/dist/src/lib/pox5Builder.js +148 -0
- package/dist/src/lib/sbtcWithdrawBuilder.d.ts +38 -0
- package/dist/src/lib/sbtcWithdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/sbtcWithdrawBuilder.js +150 -0
- package/dist/src/lib/sendmanyBuilder.js +12 -12
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +31 -15
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +16 -17
- package/dist/src/lib/transactionBuilderFactory.d.ts +6 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +23 -2
- package/dist/src/lib/transferBuilder.js +7 -7
- package/dist/src/lib/utils.d.ts +45 -3
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +199 -64
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +7 -1
- package/dist/src/sip10Token.d.ts +22 -0
- package/dist/src/sip10Token.d.ts.map +1 -0
- package/dist/src/sip10Token.js +130 -0
- package/dist/src/stx.d.ts +154 -2
- package/dist/src/stx.d.ts.map +1 -1
- package/dist/src/stx.js +489 -11
- package/dist/src/tstx.js +1 -1
- package/dist/src/tstxsignet.d.ts +20 -0
- package/dist/src/tstxsignet.d.ts.map +1 -0
- package/dist/src/tstxsignet.js +36 -0
- 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/btcAddressUtils.d.ts +2 -0
- package/dist/test/unit/btcAddressUtils.d.ts.map +1 -0
- package/dist/test/unit/btcAddressUtils.js +82 -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/network.d.ts +2 -0
- package/dist/test/unit/network.d.ts.map +1 -0
- package/dist/test/unit/network.js +50 -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 +624 -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 +463 -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 +191 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.js +418 -0
- package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.js +306 -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/tstxsignet.d.ts +2 -0
- package/dist/test/unit/tstxsignet.d.ts.map +1 -0
- package/dist/test/unit/tstxsignet.js +60 -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 +340 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -127
|
@@ -0,0 +1,418 @@
|
|
|
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 transactions_1 = require("@stacks/transactions");
|
|
41
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
42
|
+
const should_1 = __importDefault(require("should"));
|
|
43
|
+
const src_1 = require("../../../src");
|
|
44
|
+
const testData = __importStar(require("../resources"));
|
|
45
|
+
describe('Stacks: PoX-5 Builder', function () {
|
|
46
|
+
const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get('tstx'));
|
|
47
|
+
const signerManager = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0.signer-manager';
|
|
48
|
+
const oldSignerManager = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0.old-signer-manager';
|
|
49
|
+
function configure(builder) {
|
|
50
|
+
builder.fee({ fee: '180' });
|
|
51
|
+
builder.nonce(0);
|
|
52
|
+
builder.fromPubKey(testData.TX_SENDER.pub);
|
|
53
|
+
builder.numberSignatures(1);
|
|
54
|
+
return builder;
|
|
55
|
+
}
|
|
56
|
+
function validLockupOutput() {
|
|
57
|
+
return {
|
|
58
|
+
height: 9231,
|
|
59
|
+
tx: '00',
|
|
60
|
+
outputIndex: 0,
|
|
61
|
+
header: '00'.repeat(80),
|
|
62
|
+
leafHashes: ['00'.repeat(32)],
|
|
63
|
+
txCount: 1,
|
|
64
|
+
txIndex: 0,
|
|
65
|
+
amount: 10000,
|
|
66
|
+
unlockBurnHeight: 9490,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
it('builds and parses register-for-bond with an L1 lockup', async () => {
|
|
70
|
+
const builder = configure(factory.getPox5Builder());
|
|
71
|
+
builder.registerForBond({
|
|
72
|
+
bondIndex: 210,
|
|
73
|
+
signerManager,
|
|
74
|
+
amountUstx: '1005000',
|
|
75
|
+
lockup: {
|
|
76
|
+
kind: 'btc',
|
|
77
|
+
unlockBytes: '00',
|
|
78
|
+
outputs: [
|
|
79
|
+
{
|
|
80
|
+
height: 9231,
|
|
81
|
+
tx: '00',
|
|
82
|
+
outputIndex: 0,
|
|
83
|
+
header: '00'.repeat(80),
|
|
84
|
+
leafHashes: ['00'.repeat(32)],
|
|
85
|
+
txCount: 1,
|
|
86
|
+
txIndex: 0,
|
|
87
|
+
amount: 10000,
|
|
88
|
+
unlockBurnHeight: 9490,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
signerCalldata: '00',
|
|
93
|
+
});
|
|
94
|
+
const tx = await builder.build();
|
|
95
|
+
const payload = tx.toJson().payload;
|
|
96
|
+
should_1.default.equal(payload.functionName, 'register-for-bond');
|
|
97
|
+
should_1.default.equal(payload.functionArgs.length, 5);
|
|
98
|
+
should_1.default.equal(payload.functionArgs[0].type, transactions_1.ClarityType.UInt);
|
|
99
|
+
should_1.default.equal(payload.functionArgs[1].type, transactions_1.ClarityType.PrincipalContract);
|
|
100
|
+
should_1.default.equal(payload.functionArgs[3].type, transactions_1.ClarityType.ResponseOk);
|
|
101
|
+
should_1.default.equal(payload.functionArgs[4].type, transactions_1.ClarityType.OptionalSome);
|
|
102
|
+
const rebuiltBuilder = factory.from(tx.toBroadcastFormat());
|
|
103
|
+
rebuiltBuilder.fromPubKey(testData.TX_SENDER.pub);
|
|
104
|
+
const rebuilt = await rebuiltBuilder.build();
|
|
105
|
+
should_1.default.equal(rebuilt.toBroadcastFormat(), tx.toBroadcastFormat());
|
|
106
|
+
});
|
|
107
|
+
it('validates the PoX-5 contract address during factory routing', async () => {
|
|
108
|
+
const builder = configure(factory.getPox5Builder());
|
|
109
|
+
builder.registerForBond({
|
|
110
|
+
bondIndex: 210,
|
|
111
|
+
signerManager,
|
|
112
|
+
amountUstx: '1005000',
|
|
113
|
+
lockup: { kind: 'btc', unlockBytes: '00', outputs: [validLockupOutput()] },
|
|
114
|
+
});
|
|
115
|
+
const tx = await builder.build();
|
|
116
|
+
const payload = tx.stxTransaction.payload;
|
|
117
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstx'), payload), true);
|
|
118
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstx'), {
|
|
119
|
+
...payload,
|
|
120
|
+
contractAddress: (0, transactions_1.createAddress)(testData.ACCOUNT_1.address),
|
|
121
|
+
}), false);
|
|
122
|
+
});
|
|
123
|
+
it('builds sBTC registration using response error', async () => {
|
|
124
|
+
const builder = configure(factory.getPox5Builder());
|
|
125
|
+
builder.registerForBond({
|
|
126
|
+
bondIndex: 210,
|
|
127
|
+
signerManager,
|
|
128
|
+
amountUstx: '1005000',
|
|
129
|
+
lockup: { kind: 'sbtc', sbtcSats: 10000 },
|
|
130
|
+
});
|
|
131
|
+
const tx = await builder.build();
|
|
132
|
+
const payload = tx.toJson().payload;
|
|
133
|
+
should_1.default.equal(payload.functionArgs[3].type, transactions_1.ClarityType.ResponseErr);
|
|
134
|
+
should_1.default.equal((0, transactions_1.cvToValue)(payload.functionArgs[3].value).toString(), '10000');
|
|
135
|
+
});
|
|
136
|
+
it('builds validator update, early exit, and reward calls', async () => {
|
|
137
|
+
const update = configure(factory.getPox5Builder()).updateBondRegistration({
|
|
138
|
+
signerManager,
|
|
139
|
+
oldSignerManager,
|
|
140
|
+
signerCalldata: '00',
|
|
141
|
+
});
|
|
142
|
+
should_1.default.equal((await update.build()).toJson().payload.functionName, 'update-bond-registration');
|
|
143
|
+
const earlyExit = configure(factory.getPox5Builder()).announceL1EarlyExit({
|
|
144
|
+
staker: testData.TX_SENDER.address,
|
|
145
|
+
oldSignerManager,
|
|
146
|
+
});
|
|
147
|
+
const earlyExitPayload = (await earlyExit.build()).toJson().payload;
|
|
148
|
+
should_1.default.equal(earlyExitPayload.functionName, 'announce-l1-early-exit');
|
|
149
|
+
should_1.default.equal((0, transactions_1.cvToString)(earlyExitPayload.functionArgs[0]), testData.TX_SENDER.address);
|
|
150
|
+
const claims = configure(factory.getPox5Builder()).claimRewards({
|
|
151
|
+
bondIndices: [210, 226],
|
|
152
|
+
rewardCycle: 391,
|
|
153
|
+
});
|
|
154
|
+
const claimPayload = (await claims.build()).toJson().payload;
|
|
155
|
+
should_1.default.equal(claimPayload.functionName, 'claim-rewards');
|
|
156
|
+
should_1.default.equal(claimPayload.functionArgs[0].type, transactions_1.ClarityType.List);
|
|
157
|
+
should_1.default.equal(claimPayload.functionArgs[1].type, transactions_1.ClarityType.UInt);
|
|
158
|
+
});
|
|
159
|
+
it('accepts every supported PoX-5 function name', () => {
|
|
160
|
+
const functionNames = [
|
|
161
|
+
'stake',
|
|
162
|
+
'stake-update',
|
|
163
|
+
'unstake',
|
|
164
|
+
'register-for-bond',
|
|
165
|
+
'update-bond-registration',
|
|
166
|
+
'announce-l1-early-exit',
|
|
167
|
+
'claim-rewards',
|
|
168
|
+
'claim-staker-rewards-for-signer',
|
|
169
|
+
'calculate-rewards',
|
|
170
|
+
];
|
|
171
|
+
for (const functionName of functionNames) {
|
|
172
|
+
configure(factory.getPox5Builder()).functionName(functionName);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
it('parses response, list, and explicit principal JSON values', async () => {
|
|
176
|
+
const builder = configure(factory.getPox5Builder());
|
|
177
|
+
builder.functionName('calculate-rewards');
|
|
178
|
+
builder.functionArgs([
|
|
179
|
+
{
|
|
180
|
+
type: 'response',
|
|
181
|
+
val: {
|
|
182
|
+
type: 'ok',
|
|
183
|
+
val: {
|
|
184
|
+
type: 'list',
|
|
185
|
+
val: [{ type: 'uint128', val: '210' }],
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
{ type: 'contract-principal', val: oldSignerManager },
|
|
190
|
+
]);
|
|
191
|
+
const args = (await builder.build()).toJson().payload.functionArgs;
|
|
192
|
+
should_1.default.equal(args[0].type, transactions_1.ClarityType.ResponseOk);
|
|
193
|
+
should_1.default.equal(args[0].value.type, transactions_1.ClarityType.List);
|
|
194
|
+
should_1.default.equal(args[1].type, transactions_1.ClarityType.PrincipalContract);
|
|
195
|
+
});
|
|
196
|
+
it('rejects invalid SPV proof byte lengths', () => {
|
|
197
|
+
const lockup = {
|
|
198
|
+
kind: 'btc',
|
|
199
|
+
unlockBytes: '00',
|
|
200
|
+
outputs: [
|
|
201
|
+
{
|
|
202
|
+
height: 9231,
|
|
203
|
+
tx: '00',
|
|
204
|
+
outputIndex: 0,
|
|
205
|
+
header: '00',
|
|
206
|
+
leafHashes: ['00'.repeat(32)],
|
|
207
|
+
txCount: 1,
|
|
208
|
+
txIndex: 0,
|
|
209
|
+
amount: 10000,
|
|
210
|
+
unlockBurnHeight: 9490,
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
assert_1.default.throws(() => configure(factory.getPox5Builder()).registerForBond({
|
|
215
|
+
bondIndex: 210,
|
|
216
|
+
signerManager,
|
|
217
|
+
amountUstx: '1005000',
|
|
218
|
+
lockup,
|
|
219
|
+
}), /header must be exactly 80 bytes/);
|
|
220
|
+
assert_1.default.throws(() => configure(factory.getPox5Builder()).registerForBond({
|
|
221
|
+
bondIndex: 210,
|
|
222
|
+
signerManager,
|
|
223
|
+
amountUstx: '1005000',
|
|
224
|
+
lockup: {
|
|
225
|
+
...lockup,
|
|
226
|
+
outputs: [{ ...lockup.outputs[0], header: '00'.repeat(80), leafHashes: ['00'] }],
|
|
227
|
+
},
|
|
228
|
+
}), /leafHash must be exactly 32 bytes/);
|
|
229
|
+
});
|
|
230
|
+
it('rejects malformed lockup fields and contract principals', () => {
|
|
231
|
+
const validLockup = { kind: 'btc', unlockBytes: '00', outputs: [validLockupOutput()] };
|
|
232
|
+
const register = (lockup, manager = signerManager) => configure(factory.getPox5Builder()).registerForBond({
|
|
233
|
+
bondIndex: 210,
|
|
234
|
+
signerManager: manager,
|
|
235
|
+
amountUstx: '1005000',
|
|
236
|
+
lockup,
|
|
237
|
+
});
|
|
238
|
+
assert_1.default.throws(() => register(validLockup, 'no-dot'), /address.contract-name format/);
|
|
239
|
+
assert_1.default.throws(() => register(validLockup, 'a.b.c'), /address.contract-name format/);
|
|
240
|
+
assert_1.default.throws(() => register(validLockup, 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0.'), /address.contract-name/);
|
|
241
|
+
assert_1.default.throws(() => register({ ...validLockup, outputs: [{ ...validLockup.outputs[0], tx: '0' }] }), /tx must be an even-length hexadecimal string/);
|
|
242
|
+
assert_1.default.throws(() => register({ ...validLockup, outputs: [{ ...validLockup.outputs[0], tx: 'zz' }] }), /tx must be an even-length hexadecimal string/);
|
|
243
|
+
assert_1.default.throws(() => register({ ...validLockup, outputs: Array.from({ length: 11 }, () => validLockupOutput()) }), /between 1 and 10 outputs/);
|
|
244
|
+
assert_1.default.throws(() => register({
|
|
245
|
+
...validLockup,
|
|
246
|
+
outputs: [{ ...validLockup.outputs[0], leafHashes: Array(15).fill('00'.repeat(32)) }],
|
|
247
|
+
}), /more than 14 merkle siblings/);
|
|
248
|
+
});
|
|
249
|
+
describe('PoX-5 Builder on tstxsignet', function () {
|
|
250
|
+
// Stacks Foundation staking-testnet: chain ID 1280 (0x00000500) with the 0x80 testnet tx version
|
|
251
|
+
const signetFactory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get('tstxsignet'));
|
|
252
|
+
const TSTXSIGNET_TX_PREFIX = '8000000500';
|
|
253
|
+
const POX5_BOOT_ADDRESS = 'ST000000000000000000002AMW42H';
|
|
254
|
+
function configure(builder) {
|
|
255
|
+
builder.fee({ fee: '180' });
|
|
256
|
+
builder.nonce(0);
|
|
257
|
+
builder.fromPubKey(testData.TX_SENDER.pub);
|
|
258
|
+
builder.numberSignatures(1);
|
|
259
|
+
return builder;
|
|
260
|
+
}
|
|
261
|
+
function payloadOf(tx) {
|
|
262
|
+
return tx.toJson().payload;
|
|
263
|
+
}
|
|
264
|
+
function uintArg(cv, expected) {
|
|
265
|
+
cv.type.should.equal(transactions_1.ClarityType.UInt);
|
|
266
|
+
String(cv.value).should.equal(expected);
|
|
267
|
+
}
|
|
268
|
+
it('builds a stake transaction carrying the tstxsignet chain ID', async () => {
|
|
269
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
270
|
+
builder.stake({
|
|
271
|
+
signerManager,
|
|
272
|
+
amountUstx: '100000000',
|
|
273
|
+
numCycles: 1,
|
|
274
|
+
startBurnHt: 66849,
|
|
275
|
+
});
|
|
276
|
+
const tx = await builder.build();
|
|
277
|
+
tx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
278
|
+
const payload = payloadOf(tx);
|
|
279
|
+
payload.contractAddress.should.equal(POX5_BOOT_ADDRESS);
|
|
280
|
+
payload.contractName.should.equal('pox-5');
|
|
281
|
+
payload.functionName.should.equal('stake');
|
|
282
|
+
payload.functionArgs.length.should.equal(5);
|
|
283
|
+
payload.functionArgs[0].type.should.equal(transactions_1.ClarityType.PrincipalContract);
|
|
284
|
+
(0, transactions_1.cvToString)(payload.functionArgs[0]).should.equal(signerManager);
|
|
285
|
+
uintArg(payload.functionArgs[1], '100000000');
|
|
286
|
+
uintArg(payload.functionArgs[2], '1');
|
|
287
|
+
uintArg(payload.functionArgs[3], '66849');
|
|
288
|
+
payload.functionArgs[4].type.should.equal(transactions_1.ClarityType.OptionalNone);
|
|
289
|
+
});
|
|
290
|
+
it('builds a stake-update transaction carrying the tstxsignet chain ID', async () => {
|
|
291
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
292
|
+
builder.stakeUpdate({
|
|
293
|
+
signerManager,
|
|
294
|
+
oldSignerManager,
|
|
295
|
+
cyclesToExtend: 1,
|
|
296
|
+
amountIncrease: '50000',
|
|
297
|
+
});
|
|
298
|
+
const tx = await builder.build();
|
|
299
|
+
tx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
300
|
+
const payload = payloadOf(tx);
|
|
301
|
+
payload.functionName.should.equal('stake-update');
|
|
302
|
+
payload.functionArgs.length.should.equal(5);
|
|
303
|
+
(0, transactions_1.cvToString)(payload.functionArgs[0]).should.equal(signerManager);
|
|
304
|
+
(0, transactions_1.cvToString)(payload.functionArgs[1]).should.equal(oldSignerManager);
|
|
305
|
+
uintArg(payload.functionArgs[2], '1');
|
|
306
|
+
uintArg(payload.functionArgs[3], '50000');
|
|
307
|
+
payload.functionArgs[4].type.should.equal(transactions_1.ClarityType.OptionalNone);
|
|
308
|
+
});
|
|
309
|
+
it('builds an unstake transaction carrying the tstxsignet chain ID', async () => {
|
|
310
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
311
|
+
builder.unstake(oldSignerManager);
|
|
312
|
+
const tx = await builder.build();
|
|
313
|
+
tx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
314
|
+
const payload = payloadOf(tx);
|
|
315
|
+
payload.functionName.should.equal('unstake');
|
|
316
|
+
payload.functionArgs.length.should.equal(1);
|
|
317
|
+
(0, transactions_1.cvToString)(payload.functionArgs[0]).should.equal(oldSignerManager);
|
|
318
|
+
});
|
|
319
|
+
it('builds register-for-bond transactions (L1 lockup and sBTC) carrying the tstxsignet chain ID', async () => {
|
|
320
|
+
const btcBuilder = configure(signetFactory.getPox5Builder());
|
|
321
|
+
btcBuilder.registerForBond({
|
|
322
|
+
bondIndex: 210,
|
|
323
|
+
signerManager,
|
|
324
|
+
amountUstx: '1005000',
|
|
325
|
+
lockup: { kind: 'btc', unlockBytes: '00', outputs: [validLockupOutput()] },
|
|
326
|
+
});
|
|
327
|
+
const btcTx = await btcBuilder.build();
|
|
328
|
+
btcTx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
329
|
+
const btcPayload = payloadOf(btcTx);
|
|
330
|
+
btcPayload.functionName.should.equal('register-for-bond');
|
|
331
|
+
btcPayload.functionArgs[3].type.should.equal(transactions_1.ClarityType.ResponseOk);
|
|
332
|
+
const sbtcBuilder = configure(signetFactory.getPox5Builder());
|
|
333
|
+
sbtcBuilder.registerForBond({
|
|
334
|
+
bondIndex: 210,
|
|
335
|
+
signerManager,
|
|
336
|
+
amountUstx: '1005000',
|
|
337
|
+
lockup: { kind: 'sbtc', sbtcSats: 10000 },
|
|
338
|
+
});
|
|
339
|
+
const sbtcTx = await sbtcBuilder.build();
|
|
340
|
+
sbtcTx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
341
|
+
const sbtcPayload = payloadOf(sbtcTx);
|
|
342
|
+
sbtcPayload.functionArgs[3].type.should.equal(transactions_1.ClarityType.ResponseErr);
|
|
343
|
+
});
|
|
344
|
+
it('rebuilds every staking flow byte-identically from raw hex', async () => {
|
|
345
|
+
const stakeBuilder = configure(signetFactory.getPox5Builder());
|
|
346
|
+
stakeBuilder.stake({
|
|
347
|
+
signerManager,
|
|
348
|
+
amountUstx: '100000000',
|
|
349
|
+
numCycles: 1,
|
|
350
|
+
startBurnHt: 66849,
|
|
351
|
+
});
|
|
352
|
+
const stakeTx = await stakeBuilder.build();
|
|
353
|
+
const stakeRebuilt = signetFactory.from(stakeTx.toBroadcastFormat());
|
|
354
|
+
stakeRebuilt.fromPubKey(testData.TX_SENDER.pub);
|
|
355
|
+
(await stakeRebuilt.build()).toBroadcastFormat().should.equal(stakeTx.toBroadcastFormat());
|
|
356
|
+
const unstakeBuilder = configure(signetFactory.getPox5Builder());
|
|
357
|
+
unstakeBuilder.unstake(oldSignerManager);
|
|
358
|
+
const unstakeTx = await unstakeBuilder.build();
|
|
359
|
+
const unstakeRebuilt = signetFactory.from(unstakeTx.toBroadcastFormat());
|
|
360
|
+
unstakeRebuilt.fromPubKey(testData.TX_SENDER.pub);
|
|
361
|
+
(await unstakeRebuilt.build()).toBroadcastFormat().should.equal(unstakeTx.toBroadcastFormat());
|
|
362
|
+
const registerBuilder = configure(signetFactory.getPox5Builder());
|
|
363
|
+
registerBuilder.registerForBond({
|
|
364
|
+
bondIndex: 210,
|
|
365
|
+
signerManager,
|
|
366
|
+
amountUstx: '1005000',
|
|
367
|
+
lockup: { kind: 'sbtc', sbtcSats: 10000 },
|
|
368
|
+
});
|
|
369
|
+
const registerTx = await registerBuilder.build();
|
|
370
|
+
const registerRebuilt = signetFactory.from(registerTx.toBroadcastFormat());
|
|
371
|
+
registerRebuilt.fromPubKey(testData.TX_SENDER.pub);
|
|
372
|
+
(await registerRebuilt.build()).toBroadcastFormat().should.equal(registerTx.toBroadcastFormat());
|
|
373
|
+
});
|
|
374
|
+
it('routes parsed stake transactions to the PoX-5 builder on tstxsignet', async () => {
|
|
375
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
376
|
+
builder.stake({
|
|
377
|
+
signerManager,
|
|
378
|
+
amountUstx: '100000000',
|
|
379
|
+
numCycles: 1,
|
|
380
|
+
startBurnHt: 66849,
|
|
381
|
+
});
|
|
382
|
+
const tx = await builder.build();
|
|
383
|
+
const payload = tx.stxTransaction.payload;
|
|
384
|
+
builder.should.be.an.instanceOf(src_1.StxLib.Pox5Builder);
|
|
385
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstxsignet'), payload), true);
|
|
386
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstxsignet'), {
|
|
387
|
+
...payload,
|
|
388
|
+
contractAddress: (0, transactions_1.createAddress)(testData.ACCOUNT_1.address),
|
|
389
|
+
}), false);
|
|
390
|
+
const routed = signetFactory.from(tx.toBroadcastFormat());
|
|
391
|
+
routed.should.be.an.instanceOf(src_1.StxLib.Pox5Builder);
|
|
392
|
+
});
|
|
393
|
+
it('exposes fee, nonce and sender on the built stake transaction', async () => {
|
|
394
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
395
|
+
builder.stake({
|
|
396
|
+
signerManager,
|
|
397
|
+
amountUstx: '100000000',
|
|
398
|
+
numCycles: 1,
|
|
399
|
+
startBurnHt: 66849,
|
|
400
|
+
});
|
|
401
|
+
const txJson = (await builder.build()).toJson();
|
|
402
|
+
txJson.fee.should.equal('180');
|
|
403
|
+
txJson.nonce.should.equal(0);
|
|
404
|
+
txJson.id.should.match(/^[0-9a-f]{64}$/);
|
|
405
|
+
txJson.from.should.equal(testData.TX_SENDER.address);
|
|
406
|
+
});
|
|
407
|
+
it('rejects a signer-manager principal without the address.contract-name shape', () => {
|
|
408
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
409
|
+
assert_1.default.throws(() => builder.stake({
|
|
410
|
+
signerManager: 'no-dot',
|
|
411
|
+
amountUstx: '100000000',
|
|
412
|
+
numCycles: 1,
|
|
413
|
+
startBurnHt: 66849,
|
|
414
|
+
}), /address.contract-name format/);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3BveDVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHVEQUE4RztBQUM5RyxpREFBNEM7QUFDNUMsb0RBQTRCO0FBRzVCLHNDQUFzQztBQUN0Qyx1REFBeUM7QUFFekMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLGFBQWEsR0FBRyx5REFBeUQsQ0FBQztJQUNoRixNQUFNLGdCQUFnQixHQUFHLDZEQUE2RCxDQUFDO0lBRXZGLFNBQVMsU0FBUyxDQUFDLE9BQTJCO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsaUJBQWlCO1FBQ3hCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSTtZQUNaLEVBQUUsRUFBRSxJQUFJO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkIsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZ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QztZQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxHQUFHLEVBQUU7WUFDcEYsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzFELGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUNILE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ1osYUFBYSxFQUFFLFFBQVE7Z0JBQ3ZCLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixTQUFTLEVBQUUsQ0FBQztnQkFDWixXQUFXLEVBQUUsS0FBSzthQUNuQixDQUFDLEVBQ0osOEJBQThCLENBQy9CLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDbGFyaXR5VHlwZSwgQ29udHJhY3RDYWxsUGF5bG9hZCwgY3JlYXRlQWRkcmVzcywgY3ZUb1N0cmluZywgY3ZUb1ZhbHVlIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgU3R4TGliIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcyc7XG5cbmRlc2NyaWJlKCdTdGFja3M6IFBvWC01IEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0c3R4JykpO1xuICBjb25zdCBzaWduZXJNYW5hZ2VyID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAuc2lnbmVyLW1hbmFnZXInO1xuICBjb25zdCBvbGRTaWduZXJNYW5hZ2VyID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAub2xkLXNpZ25lci1tYW5hZ2VyJztcblxuICBmdW5jdGlvbiBjb25maWd1cmUoYnVpbGRlcjogU3R4TGliLlBveDVCdWlsZGVyKTogU3R4TGliLlBveDVCdWlsZGVyIHtcbiAgICBidWlsZGVyLmZlZSh7IGZlZTogJzE4MCcgfSk7XG4gICAgYnVpbGRlci5ub25jZSgwKTtcbiAgICBidWlsZGVyLmZyb21QdWJLZXkodGVzdERhdGEuVFhfU0VOREVSLnB1Yik7XG4gICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDEpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRMb2NrdXBPdXRwdXQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogOTIzMSxcbiAgICAgIHR4OiAnMDAnLFxuICAgICAgb3V0cHV0SW5kZXg6IDAsXG4gICAgICBoZWFkZXI6ICcwMCcucmVwZWF0KDgwKSxcbiAgICAgIGxlYWZIYXNoZXM6IFsnMDAnLnJlcGVhdCgzMildLFxuICAgICAgdHhDb3VudDogMSxcbiAgICAgIHR4SW5kZXg6IDAsXG4gICAgICBhbW91bnQ6IDEwMDAwLFxuICAgICAgdW5sb2NrQnVybkhlaWdodDogOTQ5MCxcbiAgICB9O1xuICB9XG5cbiAgaXQoJ2J1aWxkcyBhbmQgcGFyc2VzIHJlZ2lzdGVyLWZvci1ib25kIHdpdGggYW4gTDEgbG9ja3VwJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICBidWlsZGVyLnJlZ2lzdGVyRm9yQm9uZCh7XG4gICAgICBib25kSW5kZXg6IDIxMCxcbiAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICBhbW91bnRVc3R4OiAnMTAwNTAwMCcsXG4gICAgICBsb2NrdXA6IHtcbiAgICAgICAga2luZDogJ2J0YycsXG4gICAgICAgIHVubG9ja0J5dGVzOiAnMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGVpZ2h0OiA5MjMxLFxuICAgICAgICAgICAgdHg6ICcwMCcsXG4gICAgICAgICAgICBvdXRwdXRJbmRleDogMCxcbiAgICAgICAgICAgIGhlYWRlcjogJzAwJy5yZXBlYXQoODApLFxuICAgICAgICAgICAgbGVhZkhhc2hlczogWycwMCcucmVwZWF0KDMyKV0sXG4gICAgICAgICAgICB0eENvdW50OiAxLFxuICAgICAgICAgICAgdHhJbmRleDogMCxcbiAgICAgICAgICAgIGFtb3VudDogMTAwMDAsXG4gICAgICAgICAgICB1bmxvY2tCdXJuSGVpZ2h0OiA5NDkwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgc2lnbmVyQ2FsbGRhdGE6ICcwMCcsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gdHgudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKHBheWxvYWQuZnVuY3Rpb25OYW1lLCAncmVnaXN0ZXItZm9yLWJvbmQnKTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3MubGVuZ3RoLCA1KTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0udHlwZSwgQ2xhcml0eVR5cGUuVUludCk7XG4gICAgc2hvdWxkLmVxdWFsKHBheWxvYWQuZnVuY3Rpb25BcmdzWzFdLnR5cGUsIENsYXJpdHlUeXBlLlByaW5jaXBhbENvbnRyYWN0KTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbM10udHlwZSwgQ2xhcml0eVR5cGUuUmVzcG9uc2VPayk7XG4gICAgc2hvdWxkLmVxdWFsKHBheWxvYWQuZnVuY3Rpb25BcmdzWzRdLnR5cGUsIENsYXJpdHlUeXBlLk9wdGlvbmFsU29tZSk7XG5cbiAgICBjb25zdCByZWJ1aWx0QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICByZWJ1aWx0QnVpbGRlci5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgIGNvbnN0IHJlYnVpbHQgPSBhd2FpdCByZWJ1aWx0QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICB9KTtcblxuICBpdCgndmFsaWRhdGVzIHRoZSBQb1gtNSBjb250cmFjdCBhZGRyZXNzIGR1cmluZyBmYWN0b3J5IHJvdXRpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgIGxvY2t1cDogeyBraW5kOiAnYnRjJywgdW5sb2NrQnl0ZXM6ICcwMCcsIG91dHB1dHM6IFt2YWxpZExvY2t1cE91dHB1dCgpXSB9LFxuICAgIH0pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHBheWxvYWQgPSAodHggYXMgU3R4TGliLlRyYW5zYWN0aW9uKS5zdHhUcmFuc2FjdGlvbi5wYXlsb2FkIGFzIGFueTtcbiAgICBzaG91bGQuZXF1YWwoU3R4TGliLlBveDVCdWlsZGVyLmlzVmFsaWRDb250cmFjdENhbGwoY29pbnMuZ2V0KCd0c3R4JyksIHBheWxvYWQpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICBTdHhMaWIuUG94NUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbChjb2lucy5nZXQoJ3RzdHgnKSwge1xuICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICBjb250cmFjdEFkZHJlc3M6IGNyZWF0ZUFkZHJlc3ModGVzdERhdGEuQUNDT1VOVF8xLmFkZHJlc3MpLFxuICAgICAgfSksXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZHMgc0JUQyByZWdpc3RyYXRpb24gdXNpbmcgcmVzcG9uc2UgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgIGxvY2t1cDogeyBraW5kOiAnc2J0YycsIHNidGNTYXRzOiAxMDAwMCB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHR4LnRvSnNvbigpLnBheWxvYWQgYXMgYW55O1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS50eXBlLCBDbGFyaXR5VHlwZS5SZXNwb25zZUVycik7XG4gICAgc2hvdWxkLmVxdWFsKGN2VG9WYWx1ZShwYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS52YWx1ZSkudG9TdHJpbmcoKSwgJzEwMDAwJyk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZHMgdmFsaWRhdG9yIHVwZGF0ZSwgZWFybHkgZXhpdCwgYW5kIHJld2FyZCBjYWxscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGUgPSBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS51cGRhdGVCb25kUmVnaXN0cmF0aW9uKHtcbiAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICBvbGRTaWduZXJNYW5hZ2VyLFxuICAgICAgc2lnbmVyQ2FsbGRhdGE6ICcwMCcsXG4gICAgfSk7XG4gICAgc2hvdWxkLmVxdWFsKFxuICAgICAgKChhd2FpdCB1cGRhdGUuYnVpbGQoKSkudG9Kc29uKCkucGF5bG9hZCBhcyB7IGZ1bmN0aW9uTmFtZTogc3RyaW5nIH0pLmZ1bmN0aW9uTmFtZSxcbiAgICAgICd1cGRhdGUtYm9uZC1yZWdpc3RyYXRpb24nXG4gICAgKTtcblxuICAgIGNvbnN0IGVhcmx5RXhpdCA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLmFubm91bmNlTDFFYXJseUV4aXQoe1xuICAgICAgc3Rha2VyOiB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyxcbiAgICAgIG9sZFNpZ25lck1hbmFnZXIsXG4gICAgfSk7XG4gICAgY29uc3QgZWFybHlFeGl0UGF5bG9hZCA9IChhd2FpdCBlYXJseUV4aXQuYnVpbGQoKSkudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKGVhcmx5RXhpdFBheWxvYWQuZnVuY3Rpb25OYW1lLCAnYW5ub3VuY2UtbDEtZWFybHktZXhpdCcpO1xuICAgIHNob3VsZC5lcXVhbChjdlRvU3RyaW5nKGVhcmx5RXhpdFBheWxvYWQuZnVuY3Rpb25BcmdzWzBdKSwgdGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuXG4gICAgY29uc3QgY2xhaW1zID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkuY2xhaW1SZXdhcmRzKHtcbiAgICAgIGJvbmRJbmRpY2VzOiBbMjEwLCAyMjZdLFxuICAgICAgcmV3YXJkQ3ljbGU6IDM5MSxcbiAgICB9KTtcbiAgICBjb25zdCBjbGFpbVBheWxvYWQgPSAoYXdhaXQgY2xhaW1zLmJ1aWxkKCkpLnRvSnNvbigpLnBheWxvYWQgYXMgYW55O1xuICAgIHNob3VsZC5lcXVhbChjbGFpbVBheWxvYWQuZnVuY3Rpb25OYW1lLCAnY2xhaW0tcmV3YXJkcycpO1xuICAgIHNob3VsZC5lcXVhbChjbGFpbVBheWxvYWQuZnVuY3Rpb25BcmdzWzBdLnR5cGUsIENsYXJpdHlUeXBlLkxpc3QpO1xuICAgIHNob3VsZC5lcXVhbChjbGFpbVBheWxvYWQuZnVuY3Rpb25BcmdzWzFdLnR5cGUsIENsYXJpdHlUeXBlLlVJbnQpO1xuICB9KTtcblxuICBpdCgnYWNjZXB0cyBldmVyeSBzdXBwb3J0ZWQgUG9YLTUgZnVuY3Rpb24gbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gW1xuICAgICAgJ3N0YWtlJyxcbiAgICAgICdzdGFrZS11cGRhdGUnLFxuICAgICAgJ3Vuc3Rha2UnLFxuICAgICAgJ3JlZ2lzdGVyLWZvci1ib25kJyxcbiAgICAgICd1cGRhdGUtYm9uZC1yZWdpc3RyYXRpb24nLFxuICAgICAgJ2Fubm91bmNlLWwxLWVhcmx5LWV4aXQnLFxuICAgICAgJ2NsYWltLXJld2FyZHMnLFxuICAgICAgJ2NsYWltLXN0YWtlci1yZXdhcmRzLWZvci1zaWduZXInLFxuICAgICAgJ2NhbGN1bGF0ZS1yZXdhcmRzJyxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmdW5jdGlvbk5hbWUgb2YgZnVuY3Rpb25OYW1lcykge1xuICAgICAgY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkuZnVuY3Rpb25OYW1lKGZ1bmN0aW9uTmFtZSk7XG4gICAgfVxuICB9KTtcblxuICBpdCgncGFyc2VzIHJlc3BvbnNlLCBsaXN0LCBhbmQgZXhwbGljaXQgcHJpbmNpcGFsIEpTT04gdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICBidWlsZGVyLmZ1bmN0aW9uTmFtZSgnY2FsY3VsYXRlLXJld2FyZHMnKTtcbiAgICBidWlsZGVyLmZ1bmN0aW9uQXJncyhbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICAgIHZhbDoge1xuICAgICAgICAgIHR5cGU6ICdvaycsXG4gICAgICAgICAgdmFsOiB7XG4gICAgICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgICAgICB2YWw6IFt7IHR5cGU6ICd1aW50MTI4JywgdmFsOiAnMjEwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgdHlwZTogJ2NvbnRyYWN0LXByaW5jaXBhbCcsIHZhbDogb2xkU2lnbmVyTWFuYWdlciB9LFxuICAgIF0pO1xuXG4gICAgY29uc3QgYXJncyA9ICgoYXdhaXQgYnVpbGRlci5idWlsZCgpKS50b0pzb24oKS5wYXlsb2FkIGFzIGFueSkuZnVuY3Rpb25BcmdzO1xuICAgIHNob3VsZC5lcXVhbChhcmdzWzBdLnR5cGUsIENsYXJpdHlUeXBlLlJlc3BvbnNlT2spO1xuICAgIHNob3VsZC5lcXVhbChhcmdzWzBdLnZhbHVlLnR5cGUsIENsYXJpdHlUeXBlLkxpc3QpO1xuICAgIHNob3VsZC5lcXVhbChhcmdzWzFdLnR5cGUsIENsYXJpdHlUeXBlLlByaW5jaXBhbENvbnRyYWN0KTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgaW52YWxpZCBTUFYgcHJvb2YgYnl0ZSBsZW5ndGhzJywgKCkgPT4ge1xuICAgIGNvbnN0IGxvY2t1cCA9IHtcbiAgICAgIGtpbmQ6ICdidGMnIGFzIGNvbnN0LFxuICAgICAgdW5sb2NrQnl0ZXM6ICcwMCcsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQ6IDkyMzEsXG4gICAgICAgICAgdHg6ICcwMCcsXG4gICAgICAgICAgb3V0cHV0SW5kZXg6IDAsXG4gICAgICAgICAgaGVhZGVyOiAnMDAnLFxuICAgICAgICAgIGxlYWZIYXNoZXM6IFsnMDAnLnJlcGVhdCgzMildLFxuICAgICAgICAgIHR4Q291bnQ6IDEsXG4gICAgICAgICAgdHhJbmRleDogMCxcbiAgICAgICAgICBhbW91bnQ6IDEwMDAwLFxuICAgICAgICAgIHVubG9ja0J1cm5IZWlnaHQ6IDk0OTAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgICAgICBib25kSW5kZXg6IDIxMCxcbiAgICAgICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgICAgICBsb2NrdXAsXG4gICAgICAgIH0pLFxuICAgICAgL2hlYWRlciBtdXN0IGJlIGV4YWN0bHkgODAgYnl0ZXMvXG4gICAgKTtcblxuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgICAgIGxvY2t1cDoge1xuICAgICAgICAgICAgLi4ubG9ja3VwLFxuICAgICAgICAgICAgb3V0cHV0czogW3sgLi4ubG9ja3VwLm91dHB1dHNbMF0sIGhlYWRlcjogJzAwJy5yZXBlYXQoODApLCBsZWFmSGFzaGVzOiBbJzAwJ10gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAvbGVhZkhhc2ggbXVzdCBiZSBleGFjdGx5IDMyIGJ5dGVzL1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIG1hbGZvcm1lZCBsb2NrdXAgZmllbGRzIGFuZCBjb250cmFjdCBwcmluY2lwYWxzJywgKCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkTG9ja3VwID0geyBraW5kOiAnYnRjJyBhcyBjb25zdCwgdW5sb2NrQnl0ZXM6ICcwMCcsIG91dHB1dHM6IFt2YWxpZExvY2t1cE91dHB1dCgpXSB9O1xuICAgIGNvbnN0IHJlZ2lzdGVyID0gKGxvY2t1cDogdHlwZW9mIHZhbGlkTG9ja3VwLCBtYW5hZ2VyID0gc2lnbmVyTWFuYWdlcikgPT5cbiAgICAgIGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLnJlZ2lzdGVyRm9yQm9uZCh7XG4gICAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgICBzaWduZXJNYW5hZ2VyOiBtYW5hZ2VyLFxuICAgICAgICBhbW91bnRVc3R4OiAnMTAwNTAwMCcsXG4gICAgICAgIGxvY2t1cCxcbiAgICAgIH0pO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiByZWdpc3Rlcih2YWxpZExvY2t1cCwgJ25vLWRvdCcpLCAvYWRkcmVzcy5jb250cmFjdC1uYW1lIGZvcm1hdC8pO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gcmVnaXN0ZXIodmFsaWRMb2NrdXAsICdhLmIuYycpLCAvYWRkcmVzcy5jb250cmFjdC1uYW1lIGZvcm1hdC8pO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gcmVnaXN0ZXIodmFsaWRMb2NrdXAsICdTVERFN1k4SFYzUlg4VkJNMlRaVldKVFM3WkExWEIwU1NDM05FVkgwLicpLCAvYWRkcmVzcy5jb250cmFjdC1uYW1lLyk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHJlZ2lzdGVyKHsgLi4udmFsaWRMb2NrdXAsIG91dHB1dHM6IFt7IC4uLnZhbGlkTG9ja3VwLm91dHB1dHNbMF0sIHR4OiAnMCcgfV0gfSksXG4gICAgICAvdHggbXVzdCBiZSBhbiBldmVuLWxlbmd0aCBoZXhhZGVjaW1hbCBzdHJpbmcvXG4gICAgKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gcmVnaXN0ZXIoeyAuLi52YWxpZExvY2t1cCwgb3V0cHV0czogW3sgLi4udmFsaWRMb2NrdXAub3V0cHV0c1swXSwgdHg6ICd6eicgfV0gfSksXG4gICAgICAvdHggbXVzdCBiZSBhbiBldmVuLWxlbmd0aCBoZXhhZGVjaW1hbCBzdHJpbmcvXG4gICAgKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gcmVnaXN0ZXIoeyAuLi52YWxpZExvY2t1cCwgb3V0cHV0czogQXJyYXkuZnJvbSh7IGxlbmd0aDogMTEgfSwgKCkgPT4gdmFsaWRMb2NrdXBPdXRwdXQoKSkgfSksXG4gICAgICAvYmV0d2VlbiAxIGFuZCAxMCBvdXRwdXRzL1xuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIHJlZ2lzdGVyKHtcbiAgICAgICAgICAuLi52YWxpZExvY2t1cCxcbiAgICAgICAgICBvdXRwdXRzOiBbeyAuLi52YWxpZExvY2t1cC5vdXRwdXRzWzBdLCBsZWFmSGFzaGVzOiBBcnJheSgxNSkuZmlsbCgnMDAnLnJlcGVhdCgzMikpIH1dLFxuICAgICAgICB9KSxcbiAgICAgIC9tb3JlIHRoYW4gMTQgbWVya2xlIHNpYmxpbmdzL1xuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQb1gtNSBCdWlsZGVyIG9uIHRzdHhzaWduZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3RhY2tzIEZvdW5kYXRpb24gc3Rha2luZy10ZXN0bmV0OiBjaGFpbiBJRCAxMjgwICgweDAwMDAwNTAwKSB3aXRoIHRoZSAweDgwIHRlc3RuZXQgdHggdmVyc2lvblxuICAgIGNvbnN0IHNpZ25ldEZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0c3R4c2lnbmV0JykpO1xuICAgIGNvbnN0IFRTVFhTSUdORVRfVFhfUFJFRklYID0gJzgwMDAwMDA1MDAnO1xuICAgIGNvbnN0IFBPWDVfQk9PVF9BRERSRVNTID0gJ1NUMDAwMDAwMDAwMDAwMDAwMDAwMDAyQU1XNDJIJztcblxuICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZShidWlsZGVyOiBTdHhMaWIuUG94NUJ1aWxkZXIpOiBTdHhMaWIuUG94NUJ1aWxkZXIge1xuICAgICAgYnVpbGRlci5mZWUoeyBmZWU6ICcxODAnIH0pO1xuICAgICAgYnVpbGRlci5ub25jZSgwKTtcbiAgICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygxKTtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBheWxvYWRPZih0eDogQmFzZVRyYW5zYWN0aW9uKTogU3R4TGliLlN0YWNrc0NvbnRyYWN0UGF5bG9hZCB7XG4gICAgICByZXR1cm4gdHgudG9Kc29uKCkucGF5bG9hZCBhcyBTdHhMaWIuU3RhY2tzQ29udHJhY3RQYXlsb2FkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVpbnRBcmcoY3Y6IHsgdHlwZTogbnVtYmVyOyB2YWx1ZT86IHVua25vd24gfSwgZXhwZWN0ZWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgY3YudHlwZS5zaG91bGQuZXF1YWwoQ2xhcml0eVR5cGUuVUludCk7XG4gICAgICBTdHJpbmcoY3YudmFsdWUpLnNob3VsZC5lcXVhbChleHBlY3RlZCk7XG4gICAgfVxuXG4gICAgaXQoJ2J1aWxkcyBhIHN0YWtlIHRyYW5zYWN0aW9uIGNhcnJ5aW5nIHRoZSB0c3R4c2lnbmV0IGNoYWluIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgYnVpbGRlci5zdGFrZSh7XG4gICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDAwMDAwMDAnLFxuICAgICAgICBudW1DeWNsZXM6IDEsXG4gICAgICAgIHN0YXJ0QnVybkh0OiA2Njg0OSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2xpY2UoMCwgMTApLnNob3VsZC5lcXVhbChUU1RYU0lHTkVUX1RYX1BSRUZJWCk7XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBwYXlsb2FkT2YodHgpO1xuICAgICAgcGF5bG9hZC5jb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKFBPWDVfQk9PVF9BRERSRVNTKTtcbiAgICAgIHBheWxvYWQuY29udHJhY3ROYW1lLnNob3VsZC5lcXVhbCgncG94LTUnKTtcbiAgICAgIHBheWxvYWQuZnVuY3Rpb25OYW1lLnNob3VsZC5lcXVhbCgnc3Rha2UnKTtcbiAgICAgIHBheWxvYWQuZnVuY3Rpb25BcmdzLmxlbmd0aC5zaG91bGQuZXF1YWwoNSk7XG4gICAgICBwYXlsb2FkLmZ1bmN0aW9uQXJnc1swXS50eXBlLnNob3VsZC5lcXVhbChDbGFyaXR5VHlwZS5QcmluY2lwYWxDb250cmFjdCk7XG4gICAgICBjdlRvU3RyaW5nKHBheWxvYWQuZnVuY3Rpb25BcmdzWzBdKS5zaG91bGQuZXF1YWwoc2lnbmVyTWFuYWdlcik7XG4gICAgICB1aW50QXJnKHBheWxvYWQuZnVuY3Rpb25BcmdzWzFdLCAnMTAwMDAwMDAwJyk7XG5cbiAgICAgIHVpbnRBcmcocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMl0sICcxJyk7XG5cbiAgICAgIHVpbnRBcmcocGF5bG9hZC5mdW5jdGlvbkFyZ3NbM10sICc2Njg0OScpO1xuXG4gICAgICBwYXlsb2FkLmZ1bmN0aW9uQXJnc1s0XS50eXBlLnNob3VsZC5lcXVhbChDbGFyaXR5VHlwZS5PcHRpb25hbE5vbmUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkcyBhIHN0YWtlLXVwZGF0ZSB0cmFuc2FjdGlvbiBjYXJyeWluZyB0aGUgdHN0eHNpZ25ldCBjaGFpbiBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjb25maWd1cmUoc2lnbmV0RmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICAgIGJ1aWxkZXIuc3Rha2VVcGRhdGUoe1xuICAgICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgICBvbGRTaWduZXJNYW5hZ2VyLFxuICAgICAgICBjeWNsZXNUb0V4dGVuZDogMSxcbiAgICAgICAgYW1vdW50SW5jcmVhc2U6ICc1MDAwMCcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNsaWNlKDAsIDEwKS5zaG91bGQuZXF1YWwoVFNUWFNJR05FVF9UWF9QUkVGSVgpO1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gcGF5bG9hZE9mKHR4KTtcbiAgICAgIHBheWxvYWQuZnVuY3Rpb25OYW1lLnNob3VsZC5lcXVhbCgnc3Rha2UtdXBkYXRlJyk7XG4gICAgICBwYXlsb2FkLmZ1bmN0aW9uQXJncy5sZW5ndGguc2hvdWxkLmVxdWFsKDUpO1xuICAgICAgY3ZUb1N0cmluZyhwYXlsb2FkLmZ1bmN0aW9uQXJnc1swXSkuc2hvdWxkLmVxdWFsKHNpZ25lck1hbmFnZXIpO1xuICAgICAgY3ZUb1N0cmluZyhwYXlsb2FkLmZ1bmN0aW9uQXJnc1sxXSkuc2hvdWxkLmVxdWFsKG9sZFNpZ25lck1hbmFnZXIpO1xuICAgICAgdWludEFyZyhwYXlsb2FkLmZ1bmN0aW9uQXJnc1syXSwgJzEnKTtcbiAgICAgIHVpbnRBcmcocGF5bG9hZC5mdW5jdGlvbkFyZ3NbM10sICc1MDAwMCcpO1xuICAgICAgcGF5bG9hZC5mdW5jdGlvbkFyZ3NbNF0udHlwZS5zaG91bGQuZXF1YWwoQ2xhcml0eVR5cGUuT3B0aW9uYWxOb25lKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZHMgYW4gdW5zdGFrZSB0cmFuc2FjdGlvbiBjYXJyeWluZyB0aGUgdHN0eHNpZ25ldCBjaGFpbiBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjb25maWd1cmUoc2lnbmV0RmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICAgIGJ1aWxkZXIudW5zdGFrZShvbGRTaWduZXJNYW5hZ2VyKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNsaWNlKDAsIDEwKS5zaG91bGQuZXF1YWwoVFNUWFNJR05FVF9UWF9QUkVGSVgpO1xuXG4gICAgICBjb25zdCBwYXlsb2FkID0gcGF5bG9hZE9mKHR4KTtcbiAgICAgIHBheWxvYWQuZnVuY3Rpb25OYW1lLnNob3VsZC5lcXVhbCgndW5zdGFrZScpO1xuICAgICAgcGF5bG9hZC5mdW5jdGlvbkFyZ3MubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGN2VG9TdHJpbmcocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0pLnNob3VsZC5lcXVhbChvbGRTaWduZXJNYW5hZ2VyKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZHMgcmVnaXN0ZXItZm9yLWJvbmQgdHJhbnNhY3Rpb25zIChMMSBsb2NrdXAgYW5kIHNCVEMpIGNhcnJ5aW5nIHRoZSB0c3R4c2lnbmV0IGNoYWluIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnRjQnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgYnRjQnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgICBib25kSW5kZXg6IDIxMCxcbiAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgICBsb2NrdXA6IHsga2luZDogJ2J0YycsIHVubG9ja0J5dGVzOiAnMDAnLCBvdXRwdXRzOiBbdmFsaWRMb2NrdXBPdXRwdXQoKV0gfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYnRjVHggPSBhd2FpdCBidGNCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBidGNUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNsaWNlKDAsIDEwKS5zaG91bGQuZXF1YWwoVFNUWFNJR05FVF9UWF9QUkVGSVgpO1xuXG4gICAgICBjb25zdCBidGNQYXlsb2FkID0gcGF5bG9hZE9mKGJ0Y1R4KTtcbiAgICAgIGJ0Y1BheWxvYWQuZnVuY3Rpb25OYW1lLnNob3VsZC5lcXVhbCgncmVnaXN0ZXItZm9yLWJvbmQnKTtcbiAgICAgIGJ0Y1BheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnR5cGUuc2hvdWxkLmVxdWFsKENsYXJpdHlUeXBlLlJlc3BvbnNlT2spO1xuXG4gICAgICBjb25zdCBzYnRjQnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgc2J0Y0J1aWxkZXIucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdzYnRjJywgc2J0Y1NhdHM6IDEwMDAwIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNidGNUeCA9IGF3YWl0IHNidGNCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzYnRjVHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zbGljZSgwLCAxMCkuc2hvdWxkLmVxdWFsKFRTVFhTSUdORVRfVFhfUFJFRklYKTtcblxuICAgICAgY29uc3Qgc2J0Y1BheWxvYWQgPSBwYXlsb2FkT2Yoc2J0Y1R4KTtcbiAgICAgIHNidGNQYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS50eXBlLnNob3VsZC5lcXVhbChDbGFyaXR5VHlwZS5SZXNwb25zZUVycik7XG4gICAgfSk7XG5cbiAgICBpdCgncmVidWlsZHMgZXZlcnkgc3Rha2luZyBmbG93IGJ5dGUtaWRlbnRpY2FsbHkgZnJvbSByYXcgaGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc3Rha2VCdWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICBzdGFrZUJ1aWxkZXIuc3Rha2Uoe1xuICAgICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgICBhbW91bnRVc3R4OiAnMTAwMDAwMDAwJyxcbiAgICAgICAgbnVtQ3ljbGVzOiAxLFxuICAgICAgICBzdGFydEJ1cm5IdDogNjY4NDksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YWtlVHggPSBhd2FpdCBzdGFrZUJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3Qgc3Rha2VSZWJ1aWx0ID0gc2lnbmV0RmFjdG9yeS5mcm9tKHN0YWtlVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBzdGFrZVJlYnVpbHQuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgIChhd2FpdCBzdGFrZVJlYnVpbHQuYnVpbGQoKSkudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoc3Rha2VUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgY29uc3QgdW5zdGFrZUJ1aWxkZXIgPSBjb25maWd1cmUoc2lnbmV0RmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICAgIHVuc3Rha2VCdWlsZGVyLnVuc3Rha2Uob2xkU2lnbmVyTWFuYWdlcik7XG4gICAgICBjb25zdCB1bnN0YWtlVHggPSBhd2FpdCB1bnN0YWtlQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB1bnN0YWtlUmVidWlsdCA9IHNpZ25ldEZhY3RvcnkuZnJvbSh1bnN0YWtlVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICB1bnN0YWtlUmVidWlsdC5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgKGF3YWl0IHVuc3Rha2VSZWJ1aWx0LmJ1aWxkKCkpLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHVuc3Rha2VUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgY29uc3QgcmVnaXN0ZXJCdWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICByZWdpc3RlckJ1aWxkZXIucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdzYnRjJywgc2J0Y1NhdHM6IDEwMDAwIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyVHggPSBhd2FpdCByZWdpc3RlckJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgcmVnaXN0ZXJSZWJ1aWx0ID0gc2lnbmV0RmFjdG9yeS5mcm9tKHJlZ2lzdGVyVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICByZWdpc3RlclJlYnVpbHQuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgIChhd2FpdCByZWdpc3RlclJlYnVpbHQuYnVpbGQoKSkudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmVnaXN0ZXJUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICB9KTtcblxuICAgIGl0KCdyb3V0ZXMgcGFyc2VkIHN0YWtlIHRyYW5zYWN0aW9ucyB0byB0aGUgUG9YLTUgYnVpbGRlciBvbiB0c3R4c2lnbmV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgYnVpbGRlci5zdGFrZSh7XG4gICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDAwMDAwMDAnLFxuICAgICAgICBudW1DeWNsZXM6IDEsXG4gICAgICAgIHN0YXJ0QnVybkh0OiA2Njg0OSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBwYXlsb2FkID0gKHR4IGFzIFN0eExpYi5UcmFuc2FjdGlvbikuc3R4VHJhbnNhY3Rpb24ucGF5bG9hZCBhcyB1bmtub3duIGFzIENvbnRyYWN0Q2FsbFBheWxvYWQ7XG5cbiAgICAgIGJ1aWxkZXIuc2hvdWxkLmJlLmFuLmluc3RhbmNlT2YoU3R4TGliLlBveDVCdWlsZGVyKTtcbiAgICAgIHNob3VsZC5lcXVhbChTdHhMaWIuUG94NUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbChjb2lucy5nZXQoJ3RzdHhzaWduZXQnKSwgcGF5bG9hZCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICBTdHhMaWIuUG94NUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbChjb2lucy5nZXQoJ3RzdHhzaWduZXQnKSwge1xuICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgY29udHJhY3RBZGRyZXNzOiBjcmVhdGVBZGRyZXNzKHRlc3REYXRhLkFDQ09VTlRfMS5hZGRyZXNzKSxcbiAgICAgICAgfSksXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuXG4gICAgICBjb25zdCByb3V0ZWQgPSBzaWduZXRGYWN0b3J5LmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICByb3V0ZWQuc2hvdWxkLmJlLmFuLmluc3RhbmNlT2YoU3R4TGliLlBveDVCdWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdleHBvc2VzIGZlZSwgbm9uY2UgYW5kIHNlbmRlciBvbiB0aGUgYnVpbHQgc3Rha2UgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICBidWlsZGVyLnN0YWtlKHtcbiAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgYW1vdW50VXN0eDogJzEwMDAwMDAwMCcsXG4gICAgICAgIG51bUN5Y2xlczogMSxcbiAgICAgICAgc3RhcnRCdXJuSHQ6IDY2ODQ5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4SnNvbiA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpO1xuICAgICAgdHhKc29uLmZlZS5zaG91bGQuZXF1YWwoJzE4MCcpO1xuICAgICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4SnNvbi5pZC5zaG91bGQubWF0Y2goL15bMC05YS1mXXs2NH0kLyk7XG4gICAgICB0eEpzb24uZnJvbS5zaG91bGQuZXF1YWwodGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBzaWduZXItbWFuYWdlciBwcmluY2lwYWwgd2l0aG91dCB0aGUgYWRkcmVzcy5jb250cmFjdC1uYW1lIHNoYXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBidWlsZGVyLnN0YWtlKHtcbiAgICAgICAgICAgIHNpZ25lck1hbmFnZXI6ICduby1kb3QnLFxuICAgICAgICAgICAgYW1vdW50VXN0eDogJzEwMDAwMDAwMCcsXG4gICAgICAgICAgICBudW1DeWNsZXM6IDEsXG4gICAgICAgICAgICBzdGFydEJ1cm5IdDogNjY4NDksXG4gICAgICAgICAgfSksXG4gICAgICAgIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUgZm9ybWF0L1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbtcWithdrawBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/sbtcWithdrawBuilder.ts"],"names":[],"mappings":""}
|