@bitgo-beta/abstract-substrate 1.0.1-beta.26 → 1.0.1-beta.261

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.
Files changed (54) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/dist/src/abstractSubstrateCoin.d.ts +55 -23
  3. package/dist/src/abstractSubstrateCoin.d.ts.map +1 -1
  4. package/dist/src/abstractSubstrateCoin.js +328 -62
  5. package/dist/src/lib/constants.d.ts +2 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -0
  7. package/dist/src/lib/constants.js +5 -0
  8. package/dist/src/lib/errors.d.ts +8 -0
  9. package/dist/src/lib/errors.d.ts.map +1 -0
  10. package/dist/src/lib/errors.js +19 -0
  11. package/dist/src/lib/iface.d.ts +47 -224
  12. package/dist/src/lib/iface.d.ts.map +1 -1
  13. package/dist/src/lib/iface.js +11 -91
  14. package/dist/src/lib/index.d.ts +9 -2
  15. package/dist/src/lib/index.d.ts.map +1 -1
  16. package/dist/src/lib/index.js +22 -4
  17. package/dist/src/lib/keyPair.d.ts +6 -20
  18. package/dist/src/lib/keyPair.d.ts.map +1 -1
  19. package/dist/src/lib/keyPair.js +12 -66
  20. package/dist/src/lib/nativeTransferBuilder.d.ts +61 -0
  21. package/dist/src/lib/nativeTransferBuilder.d.ts.map +1 -0
  22. package/dist/src/lib/nativeTransferBuilder.js +147 -0
  23. package/dist/src/lib/singletonRegistry.d.ts +8 -0
  24. package/dist/src/lib/singletonRegistry.d.ts.map +1 -0
  25. package/dist/src/lib/singletonRegistry.js +20 -0
  26. package/dist/src/lib/transaction.d.ts +73 -0
  27. package/dist/src/lib/transaction.d.ts.map +1 -0
  28. package/dist/src/lib/transaction.js +425 -0
  29. package/dist/src/lib/transactionBuilder.d.ts +121 -0
  30. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  31. package/dist/src/lib/transactionBuilder.js +334 -0
  32. package/dist/src/lib/transferBuilder.d.ts +6 -0
  33. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  34. package/dist/src/lib/transferBuilder.js +11 -0
  35. package/dist/src/lib/txnSchema.d.ts +10 -0
  36. package/dist/src/lib/txnSchema.d.ts.map +1 -0
  37. package/dist/src/lib/txnSchema.js +57 -0
  38. package/dist/src/lib/utils.d.ts +7 -143
  39. package/dist/src/lib/utils.d.ts.map +1 -1
  40. package/dist/src/lib/utils.js +11 -251
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +9 -4
  43. package/dist/src/lib/iface_utils.d.ts +0 -59
  44. package/dist/src/lib/iface_utils.d.ts.map +0 -1
  45. package/dist/src/lib/iface_utils.js +0 -92
  46. package/dist/src/resources/index.d.ts +0 -3
  47. package/dist/src/resources/index.d.ts.map +0 -1
  48. package/dist/src/resources/index.js +0 -19
  49. package/dist/src/resources/mainnet.d.ts +0 -2
  50. package/dist/src/resources/mainnet.d.ts.map +0 -1
  51. package/dist/src/resources/mainnet.js +0 -5
  52. package/dist/src/resources/westend.d.ts +0 -2
  53. package/dist/src/resources/westend.d.ts.map +0 -1
  54. package/dist/src/resources/westend.js +0 -5
@@ -0,0 +1,425 @@
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
+ exports.Transaction = void 0;
40
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
+ const keyring_1 = __importStar(require("@polkadot/keyring"));
42
+ const util_1 = require("@polkadot/util");
43
+ const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
44
+ const keyPair_1 = require("./keyPair");
45
+ const utils_1 = __importDefault(require("./utils"));
46
+ const Extrinsic_1 = require("@polkadot/types/extrinsic/v4/Extrinsic");
47
+ const constants_1 = require("./constants");
48
+ class Transaction extends sdk_core_1.BaseTransaction {
49
+ constructor(coinConfig) {
50
+ super(coinConfig);
51
+ }
52
+ /** @inheritdoc */
53
+ canSign({ key }) {
54
+ const kp = new keyPair_1.KeyPair({ prv: key });
55
+ const addr = kp.getAddress(this.getAddressFormat());
56
+ return addr === this._sender;
57
+ }
58
+ /**
59
+ * Sign a substrate transaction and update the transaction hex
60
+ *
61
+ * @param {KeyPair} keyPair - ed signature
62
+ */
63
+ sign(keyPair) {
64
+ if (!this._substrateTransaction) {
65
+ throw new sdk_core_1.InvalidTransactionError('No transaction data to sign');
66
+ }
67
+ const { prv, pub } = keyPair.getKeys();
68
+ if (!prv) {
69
+ throw new sdk_core_1.SigningError('Missing private key');
70
+ }
71
+ const signingPayload = txwrapper_polkadot_1.construct.signingPayload(this._substrateTransaction, {
72
+ registry: this._registry,
73
+ });
74
+ // Sign a payload. This operation should be performed on an offline device.
75
+ const keyring = new keyring_1.default({ type: 'ed25519' });
76
+ const secretKey = new Uint8Array(Buffer.from(prv, 'hex'));
77
+ const publicKey = new Uint8Array(Buffer.from(pub, 'hex'));
78
+ const signingKeyPair = keyring.addFromPair({ secretKey, publicKey });
79
+ const txHex = utils_1.default.createSignedTx(signingKeyPair, signingPayload, this._substrateTransaction, {
80
+ metadataRpc: this._substrateTransaction.metadataRpc,
81
+ registry: this._registry,
82
+ });
83
+ // get signature from signed txHex generated above
84
+ this._signatures = [utils_1.default.recoverSignatureFromRawTx(txHex, { registry: this._registry })];
85
+ this._signedTransaction = txHex;
86
+ }
87
+ /**
88
+ * Adds the signature to the Substrate Transaction
89
+ * @param {string} signature
90
+ */
91
+ addSignature(signature) {
92
+ this._signedTransaction = utils_1.default.serializeSignedTransaction(this._substrateTransaction, signature, this._substrateTransaction.metadataRpc, this._registry);
93
+ }
94
+ /**
95
+ * Returns a serialized representation of this transaction with a fake signature attached which
96
+ * can be used to estimate transaction fees.
97
+ */
98
+ fakeSign() {
99
+ return utils_1.default.serializeSignedTransaction(this._substrateTransaction, Transaction.FAKE_SIGNATURE, this._substrateTransaction.metadataRpc, this._registry);
100
+ }
101
+ registry(registry) {
102
+ this._registry = registry;
103
+ }
104
+ chainName(chainName) {
105
+ this._chainName = chainName;
106
+ }
107
+ sender(sender) {
108
+ this._sender = sender;
109
+ }
110
+ /** @inheritdoc */
111
+ toBroadcastFormat() {
112
+ if (!this._substrateTransaction) {
113
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
114
+ }
115
+ if (this._signedTransaction && this._signedTransaction.length > 0) {
116
+ return this._signedTransaction;
117
+ }
118
+ else {
119
+ return txwrapper_polkadot_1.construct.signingPayload(this._substrateTransaction, {
120
+ registry: this._registry,
121
+ });
122
+ }
123
+ }
124
+ transactionSize() {
125
+ return this.toBroadcastFormat().length / 2;
126
+ }
127
+ /** @inheritdoc */
128
+ toJson() {
129
+ console.log('Transaction toJson called in substrate Transaction class');
130
+ if (!this._substrateTransaction) {
131
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
132
+ }
133
+ const decodedTx = (0, txwrapper_polkadot_1.decode)(this._substrateTransaction, {
134
+ metadataRpc: this._substrateTransaction.metadataRpc,
135
+ registry: this._registry,
136
+ isImmortalEra: utils_1.default.isZeroHex(this._substrateTransaction.era),
137
+ });
138
+ const result = {
139
+ id: txwrapper_polkadot_1.construct.txHash(this.toBroadcastFormat()),
140
+ sender: decodedTx.address,
141
+ referenceBlock: decodedTx.blockHash,
142
+ blockNumber: decodedTx.blockNumber,
143
+ genesisHash: decodedTx.genesisHash,
144
+ nonce: decodedTx.nonce,
145
+ specVersion: decodedTx.specVersion,
146
+ transactionVersion: decodedTx.transactionVersion,
147
+ eraPeriod: decodedTx.eraPeriod,
148
+ chainName: this._chainName,
149
+ tip: decodedTx.tip ? Number(decodedTx.tip) : 0,
150
+ };
151
+ const txMethod = decodedTx.method.args;
152
+ if (this.type === sdk_core_1.TransactionType.Send) {
153
+ if (utils_1.default.isTransfer(txMethod)) {
154
+ const keypairDest = new keyPair_1.KeyPair({
155
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
156
+ });
157
+ result.to = keypairDest.getAddress(this.getAddressFormat());
158
+ result.amount = txMethod.value;
159
+ }
160
+ else if (utils_1.default.isTransferAll(txMethod)) {
161
+ const keypairDest = new keyPair_1.KeyPair({
162
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
163
+ });
164
+ result.to = keypairDest.getAddress(this.getAddressFormat());
165
+ result.keepAlive = txMethod.keepAlive;
166
+ }
167
+ else {
168
+ throw new sdk_core_1.ParseTransactionError(`Serializing unknown Transfer type parameters`);
169
+ }
170
+ }
171
+ else if (this.type === sdk_core_1.TransactionType.StakingActivate) {
172
+ if (utils_1.default.isAddStake(txMethod)) {
173
+ const keypairDest = new keyPair_1.KeyPair({
174
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
175
+ });
176
+ // hotkey address of validator
177
+ result.to = keypairDest.getAddress(this.getAddressFormat());
178
+ result.amount = txMethod.amountStaked.toString();
179
+ result.netuid = txMethod.netuid;
180
+ }
181
+ }
182
+ else if (this.type === sdk_core_1.TransactionType.StakingDeactivate) {
183
+ if (utils_1.default.isRemoveStake(txMethod)) {
184
+ const keypairDest = new keyPair_1.KeyPair({
185
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
186
+ });
187
+ // hotkey address of validator
188
+ result.to = keypairDest.getAddress(this.getAddressFormat());
189
+ result.amount = txMethod.amountUnstaked.toString();
190
+ result.netuid = txMethod.netuid;
191
+ }
192
+ }
193
+ return result;
194
+ }
195
+ explainTransferTransaction(json, explanationResult) {
196
+ return {
197
+ ...explanationResult,
198
+ outputs: [
199
+ {
200
+ address: json.to?.toString() || '',
201
+ amount: json.amount?.toString() || '',
202
+ },
203
+ ],
204
+ };
205
+ }
206
+ explainStakeTransaction(json, explanationResult) {
207
+ return {
208
+ ...explanationResult,
209
+ outputs: [
210
+ {
211
+ address: json.to?.toString() || '',
212
+ amount: json.amount?.toString() || '',
213
+ },
214
+ ],
215
+ };
216
+ }
217
+ explainUnstakeTransaction(json, explanationResult) {
218
+ return {
219
+ ...explanationResult,
220
+ outputs: [
221
+ {
222
+ address: json.sender.toString() || '',
223
+ amount: json.amount?.toString() || '',
224
+ },
225
+ ],
226
+ };
227
+ }
228
+ /** @inheritdoc */
229
+ explainTransaction() {
230
+ const result = this.toJson();
231
+ const outputs = [];
232
+ const explanationResult = {
233
+ // txhash used to identify the transactions
234
+ id: result.id,
235
+ outputAmount: result.amount?.toString() || '0',
236
+ changeAmount: '0',
237
+ changeOutputs: [],
238
+ outputs,
239
+ fee: {
240
+ fee: result.tip?.toString() || '',
241
+ type: 'tip',
242
+ },
243
+ type: this.type,
244
+ };
245
+ switch (this.type) {
246
+ case sdk_core_1.TransactionType.Send:
247
+ return this.explainTransferTransaction(result, explanationResult);
248
+ case sdk_core_1.TransactionType.StakingActivate:
249
+ return this.explainStakeTransaction(result, explanationResult);
250
+ case sdk_core_1.TransactionType.StakingDeactivate:
251
+ return this.explainUnstakeTransaction(result, explanationResult);
252
+ default:
253
+ throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
254
+ }
255
+ }
256
+ /**
257
+ * Load the input and output data on this transaction.
258
+ */
259
+ loadInputsAndOutputs() {
260
+ if (!this._substrateTransaction) {
261
+ return;
262
+ }
263
+ const decodedTx = (0, txwrapper_polkadot_1.decode)(this._substrateTransaction, {
264
+ metadataRpc: this._substrateTransaction.metadataRpc,
265
+ registry: this._registry,
266
+ isImmortalEra: utils_1.default.isZeroHex(this._substrateTransaction.era),
267
+ });
268
+ if (this.type === sdk_core_1.TransactionType.Send) {
269
+ this.decodeInputsAndOutputsForSend(decodedTx);
270
+ }
271
+ else if (this.type === sdk_core_1.TransactionType.StakingActivate) {
272
+ this.decodeInputsAndOutputsForStakingActivate(decodedTx);
273
+ }
274
+ else if (this.type === sdk_core_1.TransactionType.StakingDeactivate) {
275
+ this.decodeInputsAndOutputsForStakingDeactivate(decodedTx);
276
+ }
277
+ }
278
+ decodeInputsAndOutputsForSend(decodedTx) {
279
+ const txMethod = decodedTx.method.args;
280
+ let to;
281
+ let value;
282
+ let from;
283
+ if (utils_1.default.isTransferAll(txMethod)) {
284
+ const keypairDest = new keyPair_1.KeyPair({
285
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
286
+ });
287
+ to = keypairDest.getAddress(this.getAddressFormat());
288
+ value = '0'; // substrate transferAll's do not deserialize amounts
289
+ from = decodedTx.address;
290
+ }
291
+ else if (utils_1.default.isTransfer(txMethod)) {
292
+ const keypairDest = new keyPair_1.KeyPair({
293
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.dest.id)).toString('hex'),
294
+ });
295
+ to = keypairDest.getAddress(this.getAddressFormat());
296
+ value = txMethod.value;
297
+ from = decodedTx.address;
298
+ }
299
+ else {
300
+ throw new sdk_core_1.ParseTransactionError(`Loading inputs of unknown Transfer type parameters`);
301
+ }
302
+ this._outputs = [
303
+ {
304
+ address: to,
305
+ value,
306
+ coin: this._coinConfig.name,
307
+ },
308
+ ];
309
+ this._inputs = [
310
+ {
311
+ address: from,
312
+ value,
313
+ coin: this._coinConfig.name,
314
+ },
315
+ ];
316
+ }
317
+ decodeInputsAndOutputsForStakingActivate(decodedTx) {
318
+ const txMethod = decodedTx.method.args;
319
+ let to;
320
+ let value;
321
+ let from;
322
+ if (utils_1.default.isAddStake(txMethod)) {
323
+ const keypairDest = new keyPair_1.KeyPair({
324
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
325
+ });
326
+ to = keypairDest.getAddress(this.getAddressFormat());
327
+ value = txMethod.amountStaked.toString();
328
+ from = decodedTx.address;
329
+ }
330
+ else {
331
+ throw new sdk_core_1.ParseTransactionError(`Loading inputs of unknown StakingActivate type parameters`);
332
+ }
333
+ this._outputs = [
334
+ {
335
+ address: to,
336
+ value,
337
+ coin: this._coinConfig.name,
338
+ },
339
+ ];
340
+ this._inputs = [
341
+ {
342
+ address: from,
343
+ value,
344
+ coin: this._coinConfig.name,
345
+ },
346
+ ];
347
+ }
348
+ decodeInputsAndOutputsForStakingDeactivate(decodedTx) {
349
+ const txMethod = decodedTx.method.args;
350
+ let to;
351
+ let value;
352
+ let from;
353
+ if (utils_1.default.isRemoveStake(txMethod)) {
354
+ const keypairDest = new keyPair_1.KeyPair({
355
+ pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.hotkey)).toString('hex'),
356
+ });
357
+ to = keypairDest.getAddress(this.getAddressFormat());
358
+ value = txMethod.amountUnstaked.toString();
359
+ from = decodedTx.address;
360
+ }
361
+ else {
362
+ throw new sdk_core_1.ParseTransactionError(`Loading inputs of unknown StakingDeactivate type parameters`);
363
+ }
364
+ this._outputs = [
365
+ {
366
+ address: from,
367
+ value,
368
+ coin: this._coinConfig.name,
369
+ },
370
+ ];
371
+ this._inputs = [
372
+ {
373
+ address: to,
374
+ value,
375
+ coin: this._coinConfig.name,
376
+ },
377
+ ];
378
+ }
379
+ /**
380
+ * Constructs a signed payload using construct.signTx
381
+ * This method will be called during the build step if a TSS signature
382
+ * is added and will set the signTransaction which is the txHex that will be broadcasted
383
+ * As well as add the signature used to sign to the signature array in hex format
384
+ *
385
+ * @param {Buffer} signature The signature to be added to a substrate transaction
386
+ */
387
+ constructSignedPayload(signature) {
388
+ // 0x00 means its an ED25519 signature
389
+ const edSignature = `0x00${signature.toString('hex')}`;
390
+ try {
391
+ this._signedTransaction = txwrapper_polkadot_1.construct.signedTx(this._substrateTransaction, edSignature, {
392
+ registry: this._registry,
393
+ metadataRpc: this._substrateTransaction.metadataRpc,
394
+ });
395
+ }
396
+ catch (e) {
397
+ throw new sdk_core_1.SigningError(`Unable to sign transaction with signature ${edSignature} ` + e);
398
+ }
399
+ this._signatures = [signature.toString('hex')];
400
+ }
401
+ setTransaction(tx) {
402
+ this._substrateTransaction = tx;
403
+ }
404
+ /** @inheritdoc **/
405
+ get signablePayload() {
406
+ const extrinsicPayload = this._registry.createType('ExtrinsicPayload', this._substrateTransaction, {
407
+ version: Extrinsic_1.EXTRINSIC_VERSION,
408
+ });
409
+ return (0, util_1.u8aToBuffer)(extrinsicPayload.toU8a({ method: true }));
410
+ }
411
+ /**
412
+ * Set the transaction type.
413
+ *
414
+ * @param {TransactionType} transactionType The transaction type to be set.
415
+ */
416
+ transactionType(transactionType) {
417
+ this._type = transactionType;
418
+ }
419
+ getAddressFormat() {
420
+ return constants_1.DEFAULT_SUBSTRATE_PREFIX;
421
+ }
422
+ }
423
+ exports.Transaction = Transaction;
424
+ Transaction.FAKE_SIGNATURE = `0x${Buffer.from(new Uint8Array(256).fill(1)).toString('hex')}`;
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQVE4QjtBQUU5Qiw2REFBMkQ7QUFDM0QseUNBQTZDO0FBQzdDLHNFQUFrRTtBQUdsRSx1Q0FBb0M7QUFFcEMsb0RBQTRCO0FBQzVCLHNFQUEyRTtBQUMzRSwyQ0FBdUQ7QUFFdkQsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFTOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixPQUFPLENBQUMsRUFBRSxHQUFHLEVBQVc7UUFDdEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsT0FBZ0I7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksdUJBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyw4QkFBUyxD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SUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsY0FBYyxDQUFDLEVBQXVCO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLGVBQWU7UUFDakIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDakcsT0FBTyxFQUFFLDZCQUFpQjtTQUMzQixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUEsa0JBQVcsRUFBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZUFBZSxDQUFDLGVBQWdDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDO0lBQy9CLENBQUM7SUFFUyxnQkFBZ0I7UUFDeEIsT0FBTyxvQ0FBd0IsQ0FBQztJQUNsQyxDQUFDOztBQTVaSCxrQ0E2WkM7QUF0WmdCLDBCQUFjLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBLZXlyaW5nLCB7IGRlY29kZUFkZHJlc3MgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZyc7XG5pbXBvcnQgeyB1OGFUb0J1ZmZlciB9IGZyb20gJ0Bwb2xrYWRvdC91dGlsJztcbmltcG9ydCB7IGNvbnN0cnVjdCwgZGVjb2RlIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItcG9sa2Fkb3QnO1xuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUnO1xuaW1wb3J0IHsgVHlwZVJlZ2lzdHJ5IH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZS9saWIvdHlwZXMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBEZWNvZGVkVHgsIEhleFN0cmluZywgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBFWFRSSU5TSUNfVkVSU0lPTiB9IGZyb20gJ0Bwb2xrYWRvdC90eXBlcy9leHRyaW5zaWMvdjQvRXh0cmluc2ljJztcbmltcG9ydCB7IERFRkFVTFRfU1VCU1RSQVRFX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9zdWJzdHJhdGVUcmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvbjtcbiAgcHJvdGVjdGVkIF9zaWduZWRUcmFuc2FjdGlvbj86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9yZWdpc3RyeTogVHlwZVJlZ2lzdHJ5O1xuICBwcm90ZWN0ZWQgX2NoYWluTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3NlbmRlcjogc3RyaW5nO1xuXG4gIHByaXZhdGUgc3RhdGljIEZBS0VfU0lHTkFUVVJFID0gYDB4JHtCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheSgyNTYpLmZpbGwoMSkpLnRvU3RyaW5nKCdoZXgnKX1gO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHBydjoga2V5IH0pO1xuICAgIGNvbnN0IGFkZHIgPSBrcC5nZXRBZGRyZXNzKHRoaXMuZ2V0QWRkcmVzc0Zvcm1hdCgpKTtcbiAgICByZXR1cm4gYWRkciA9PT0gdGhpcy5fc2VuZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBzdWJzdHJhdGUgdHJhbnNhY3Rpb24gYW5kIHVwZGF0ZSB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciAtIGVkIHNpZ25hdHVyZVxuICAgKi9cbiAgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdObyB0cmFuc2FjdGlvbiBkYXRhIHRvIHNpZ24nKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcnYsIHB1YiB9ID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgaWYgKCFwcnYpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmluZ1BheWxvYWQgPSBjb25zdHJ1Y3Quc2lnbmluZ1BheWxvYWQodGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sIHtcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICB9KTtcbiAgICAvLyBTaWduIGEgcGF5bG9hZC4gVGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBhbiBvZmZsaW5lIGRldmljZS5cbiAgICBjb25zdCBrZXlyaW5nID0gbmV3IEtleXJpbmcoeyB0eXBlOiAnZWQyNTUxOScgfSk7XG4gICAgY29uc3Qgc2VjcmV0S2V5ID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20ocHJ2LCAnaGV4JykpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHB1YiwgJ2hleCcpKTtcbiAgICBjb25zdCBzaWduaW5nS2V5UGFpciA9IGtleXJpbmcuYWRkRnJvbVBhaXIoeyBzZWNyZXRLZXksIHB1YmxpY0tleSB9KTtcbiAgICBjb25zdCB0eEhleCA9IHV0aWxzLmNyZWF0ZVNpZ25lZFR4KHNpZ25pbmdLZXlQYWlyLCBzaWduaW5nUGF5bG9hZCwgdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sIHtcbiAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICB9KTtcblxuICAgIC8vIGdldCBzaWduYXR1cmUgZnJvbSBzaWduZWQgdHhIZXggZ2VuZXJhdGVkIGFib3ZlXG4gICAgdGhpcy5fc2lnbmF0dXJlcyA9IFt1dGlscy5yZWNvdmVyU2lnbmF0dXJlRnJvbVJhd1R4KHR4SGV4LCB7IHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSB9KV07XG4gICAgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gPSB0eEhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBzaWduYXR1cmUgdG8gdGhlIFN1YnN0cmF0ZSBUcmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlXG4gICAqL1xuICBhZGRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduZWRUcmFuc2FjdGlvbiA9IHV0aWxzLnNlcmlhbGl6ZVNpZ25lZFRyYW5zYWN0aW9uKFxuICAgICAgdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sXG4gICAgICBzaWduYXR1cmUsXG4gICAgICB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYW5zYWN0aW9uIHdpdGggYSBmYWtlIHNpZ25hdHVyZSBhdHRhY2hlZCB3aGljaFxuICAgKiBjYW4gYmUgdXNlZCB0byBlc3RpbWF0ZSB0cmFuc2FjdGlvbiBmZWVzLlxuICAgKi9cbiAgZmFrZVNpZ24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXRpbHMuc2VyaWFsaXplU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbixcbiAgICAgIFRyYW5zYWN0aW9uLkZBS0VfU0lHTkFUVVJFLFxuICAgICAgdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24ubWV0YWRhdGFScGMsXG4gICAgICB0aGlzLl9yZWdpc3RyeVxuICAgICk7XG4gIH1cblxuICByZWdpc3RyeShyZWdpc3RyeTogVHlwZVJlZ2lzdHJ5KTogdm9pZCB7XG4gICAgdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgfVxuXG4gIGNoYWluTmFtZShjaGFpbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2NoYWluTmFtZSA9IGNoYWluTmFtZTtcbiAgfVxuXG4gIHNlbmRlcihzZW5kZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NlbmRlciA9IHNlbmRlcjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uICYmIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdC5zaWduaW5nUGF5bG9hZCh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbiwge1xuICAgICAgICByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2FjdGlvblNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50b0Jyb2FkY2FzdEZvcm1hdCgpLmxlbmd0aCAvIDI7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgY29uc29sZS5sb2coJ1RyYW5zYWN0aW9uIHRvSnNvbiBjYWxsZWQgaW4gc3Vic3RyYXRlIFRyYW5zYWN0aW9uIGNsYXNzJyk7XG4gICAgaWYgKCF0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkVHggPSBkZWNvZGUodGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sIHtcbiAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgIGlzSW1tb3J0YWxFcmE6IHV0aWxzLmlzWmVyb0hleCh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5lcmEpLFxuICAgIH0pIGFzIHVua25vd24gYXMgRGVjb2RlZFR4O1xuXG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogY29uc3RydWN0LnR4SGFzaCh0aGlzLnRvQnJvYWRjYXN0Rm9ybWF0KCkpLFxuICAgICAgc2VuZGVyOiBkZWNvZGVkVHguYWRkcmVzcyxcbiAgICAgIHJlZmVyZW5jZUJsb2NrOiBkZWNvZGVkVHguYmxvY2tIYXNoLFxuICAgICAgYmxvY2tOdW1iZXI6IGRlY29kZWRUeC5ibG9ja051bWJlcixcbiAgICAgIGdlbmVzaXNIYXNoOiBkZWNvZGVkVHguZ2VuZXNpc0hhc2gsXG4gICAgICBub25jZTogZGVjb2RlZFR4Lm5vbmNlLFxuICAgICAgc3BlY1ZlcnNpb246IGRlY29kZWRUeC5zcGVjVmVyc2lvbixcbiAgICAgIHRyYW5zYWN0aW9uVmVyc2lvbjogZGVjb2RlZFR4LnRyYW5zYWN0aW9uVmVyc2lvbixcbiAgICAgIGVyYVBlcmlvZDogZGVjb2RlZFR4LmVyYVBlcmlvZCxcbiAgICAgIGNoYWluTmFtZTogdGhpcy5fY2hhaW5OYW1lLFxuICAgICAgdGlwOiBkZWNvZGVkVHgudGlwID8gTnVtYmVyKGRlY29kZWRUeC50aXApIDogMCxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3M7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIGlmICh1dGlscy5pc1RyYW5zZmVyKHR4TWV0aG9kKSkge1xuICAgICAgICBjb25zdCBrZXlwYWlyRGVzdCA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuZGVzdC5pZCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC50byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgICAgICByZXN1bHQuYW1vdW50ID0gdHhNZXRob2QudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzVHJhbnNmZXJBbGwodHhNZXRob2QpKSB7XG4gICAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyh0eE1ldGhvZC5kZXN0LmlkKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnRvID0ga2V5cGFpckRlc3QuZ2V0QWRkcmVzcyh0aGlzLmdldEFkZHJlc3NGb3JtYXQoKSk7XG4gICAgICAgIHJlc3VsdC5rZWVwQWxpdmUgPSB0eE1ldGhvZC5rZWVwQWxpdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKGBTZXJpYWxpemluZyB1bmtub3duIFRyYW5zZmVyIHR5cGUgcGFyYW1ldGVyc2ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKSB7XG4gICAgICBpZiAodXRpbHMuaXNBZGRTdGFrZSh0eE1ldGhvZCkpIHtcbiAgICAgICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgICAgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKHR4TWV0aG9kLmhvdGtleSkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGhvdGtleSBhZGRyZXNzIG9mIHZhbGlkYXRvclxuICAgICAgICByZXN1bHQudG8gPSBrZXlwYWlyRGVzdC5nZXRBZGRyZXNzKHRoaXMuZ2V0QWRkcmVzc0Zvcm1hdCgpKTtcbiAgICAgICAgcmVzdWx0LmFtb3VudCA9IHR4TWV0aG9kLmFtb3VudFN0YWtlZC50b1N0cmluZygpO1xuICAgICAgICByZXN1bHQubmV0dWlkID0gdHhNZXRob2QubmV0dWlkO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpIHtcbiAgICAgIGlmICh1dGlscy5pc1JlbW92ZVN0YWtlKHR4TWV0aG9kKSkge1xuICAgICAgICBjb25zdCBrZXlwYWlyRGVzdCA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuaG90a2V5KSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaG90a2V5IGFkZHJlc3Mgb2YgdmFsaWRhdG9yXG4gICAgICAgIHJlc3VsdC50byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgICAgICByZXN1bHQuYW1vdW50ID0gdHhNZXRob2QuYW1vdW50VW5zdGFrZWQudG9TdHJpbmcoKTtcbiAgICAgICAgcmVzdWx0Lm5ldHVpZCA9IHR4TWV0aG9kLm5ldHVpZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZXhwbGFpblRyYW5zZmVyVHJhbnNhY3Rpb24oanNvbjogVHhEYXRhLCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5leHBsYW5hdGlvblJlc3VsdCxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGpzb24udG8/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgYW1vdW50OiBqc29uLmFtb3VudD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGV4cGxhaW5TdGFrZVRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBqc29uLnRvPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIGFtb3VudDoganNvbi5hbW91bnQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBleHBsYWluVW5zdGFrZVRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBqc29uLnNlbmRlci50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIGFtb3VudDoganNvbi5hbW91bnQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IFtdO1xuICAgIGNvbnN0IGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0ge1xuICAgICAgLy8gdHhoYXNoIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRyYW5zYWN0aW9uc1xuICAgICAgaWQ6IHJlc3VsdC5pZCxcbiAgICAgIG91dHB1dEFtb3VudDogcmVzdWx0LmFtb3VudD8udG9TdHJpbmcoKSB8fCAnMCcsXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IHJlc3VsdC50aXA/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHR5cGU6ICd0aXAnLFxuICAgICAgfSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICB9O1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluVHJhbnNmZXJUcmFuc2FjdGlvbihyZXN1bHQsIGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblN0YWtlVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblVuc3Rha2VUcmFuc2FjdGlvbihyZXN1bHQsIGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkVHggPSBkZWNvZGUodGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sIHtcbiAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgIGlzSW1tb3J0YWxFcmE6IHV0aWxzLmlzWmVyb0hleCh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5lcmEpLFxuICAgIH0pIGFzIHVua25vd24gYXMgRGVjb2RlZFR4O1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIHRoaXMuZGVjb2RlSW5wdXRzQW5kT3V0cHV0c0ZvclNlbmQoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSkge1xuICAgICAgdGhpcy5kZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yU3Rha2luZ0FjdGl2YXRlKGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSkge1xuICAgICAgdGhpcy5kZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yU3Rha2luZ0RlYWN0aXZhdGUoZGVjb2RlZFR4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JTZW5kKGRlY29kZWRUeDogRGVjb2RlZFR4KSB7XG4gICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3M7XG4gICAgbGV0IHRvOiBzdHJpbmc7XG4gICAgbGV0IHZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGZyb206IHN0cmluZztcbiAgICBpZiAodXRpbHMuaXNUcmFuc2ZlckFsbCh0eE1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuZGVzdC5pZCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgdG8gPSBrZXlwYWlyRGVzdC5nZXRBZGRyZXNzKHRoaXMuZ2V0QWRkcmVzc0Zvcm1hdCgpKTtcbiAgICAgIHZhbHVlID0gJzAnOyAvLyBzdWJzdHJhdGUgdHJhbnNmZXJBbGwncyBkbyBub3QgZGVzZXJpYWxpemUgYW1vdW50c1xuICAgICAgZnJvbSA9IGRlY29kZWRUeC5hZGRyZXNzO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNUcmFuc2Zlcih0eE1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuZGVzdC5pZCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgdG8gPSBrZXlwYWlyRGVzdC5nZXRBZGRyZXNzKHRoaXMuZ2V0QWRkcmVzc0Zvcm1hdCgpKTtcbiAgICAgIHZhbHVlID0gdHhNZXRob2QudmFsdWU7XG4gICAgICBmcm9tID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYExvYWRpbmcgaW5wdXRzIG9mIHVua25vd24gVHJhbnNmZXIgdHlwZSBwYXJhbWV0ZXJzYCk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRvLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBmcm9tLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yU3Rha2luZ0FjdGl2YXRlKGRlY29kZWRUeDogRGVjb2RlZFR4KSB7XG4gICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3M7XG4gICAgbGV0IHRvOiBzdHJpbmc7XG4gICAgbGV0IHZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGZyb206IHN0cmluZztcbiAgICBpZiAodXRpbHMuaXNBZGRTdGFrZSh0eE1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuaG90a2V5KSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICB0byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgICAgdmFsdWUgPSB0eE1ldGhvZC5hbW91bnRTdGFrZWQudG9TdHJpbmcoKTtcbiAgICAgIGZyb20gPSBkZWNvZGVkVHguYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcihgTG9hZGluZyBpbnB1dHMgb2YgdW5rbm93biBTdGFraW5nQWN0aXZhdGUgdHlwZSBwYXJhbWV0ZXJzYCk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRvLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBmcm9tLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yU3Rha2luZ0RlYWN0aXZhdGUoZGVjb2RlZFR4OiBEZWNvZGVkVHgpIHtcbiAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeC5tZXRob2QuYXJncztcbiAgICBsZXQgdG86IHN0cmluZztcbiAgICBsZXQgdmFsdWU6IHN0cmluZztcbiAgICBsZXQgZnJvbTogc3RyaW5nO1xuICAgIGlmICh1dGlscy5pc1JlbW92ZVN0YWtlKHR4TWV0aG9kKSkge1xuICAgICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyh0eE1ldGhvZC5ob3RrZXkpKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIHRvID0ga2V5cGFpckRlc3QuZ2V0QWRkcmVzcyh0aGlzLmdldEFkZHJlc3NGb3JtYXQoKSk7XG4gICAgICB2YWx1ZSA9IHR4TWV0aG9kLmFtb3VudFVuc3Rha2VkLnRvU3RyaW5nKCk7XG4gICAgICBmcm9tID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYExvYWRpbmcgaW5wdXRzIG9mIHVua25vd24gU3Rha2luZ0RlYWN0aXZhdGUgdHlwZSBwYXJhbWV0ZXJzYCk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IGZyb20sXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRvLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBzaWduZWQgcGF5bG9hZCB1c2luZyBjb25zdHJ1Y3Quc2lnblR4XG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgYnVpbGQgc3RlcCBpZiBhIFRTUyBzaWduYXR1cmVcbiAgICogaXMgYWRkZWQgYW5kIHdpbGwgc2V0IHRoZSBzaWduVHJhbnNhY3Rpb24gd2hpY2ggaXMgdGhlIHR4SGV4IHRoYXQgd2lsbCBiZSBicm9hZGNhc3RlZFxuICAgKiBBcyB3ZWxsIGFzIGFkZCB0aGUgc2lnbmF0dXJlIHVzZWQgdG8gc2lnbiB0byB0aGUgc2lnbmF0dXJlIGFycmF5IGluIGhleCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNpZ25hdHVyZSBUaGUgc2lnbmF0dXJlIHRvIGJlIGFkZGVkIHRvIGEgc3Vic3RyYXRlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RTaWduZWRQYXlsb2FkKHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gMHgwMCBtZWFucyBpdHMgYW4gRUQyNTUxOSBzaWduYXR1cmVcbiAgICBjb25zdCBlZFNpZ25hdHVyZSA9IGAweDAwJHtzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpfWAgYXMgSGV4U3RyaW5nO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uID0gY29uc3RydWN0LnNpZ25lZFR4KHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uLCBlZFNpZ25hdHVyZSwge1xuICAgICAgICByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnksXG4gICAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoYFVuYWJsZSB0byBzaWduIHRyYW5zYWN0aW9uIHdpdGggc2lnbmF0dXJlICR7ZWRTaWduYXR1cmV9IGAgKyBlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW3NpZ25hdHVyZS50b1N0cmluZygnaGV4JyldO1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFVuc2lnbmVkVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICoqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgZXh0cmluc2ljUGF5bG9hZCA9IHRoaXMuX3JlZ2lzdHJ5LmNyZWF0ZVR5cGUoJ0V4dHJpbnNpY1BheWxvYWQnLCB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbiwge1xuICAgICAgdmVyc2lvbjogRVhUUklOU0lDX1ZFUlNJT04sXG4gICAgfSk7XG4gICAgcmV0dXJuIHU4YVRvQnVmZmVyKGV4dHJpbnNpY1BheWxvYWQudG9VOGEoeyBtZXRob2Q6IHRydWUgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXQuXG4gICAqL1xuICB0cmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFkZHJlc3NGb3JtYXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gREVGQVVMVF9TVUJTVFJBVEVfUFJFRklYO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,121 @@
1
+ import { BaseAddress, BaseKey, PublicKey as BasePublicKey, BaseTransactionBuilder, FeeOptions, SequenceId, Signature, TransactionType, ValidityWindow } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { UnsignedTransaction } from '@substrate/txwrapper-core';
4
+ import { DecodedSignedTx, DecodedSigningPayload, TypeRegistry } from '@substrate/txwrapper-core/lib/types';
5
+ import BigNumber from 'bignumber.js';
6
+ import { CreateBaseTxInfo, Material, TxMethod } from './iface';
7
+ import { KeyPair } from './keyPair';
8
+ import { Transaction } from './transaction';
9
+ export declare abstract class TransactionBuilder<TMethod = TxMethod, TTransaction extends Transaction = Transaction> extends BaseTransactionBuilder {
10
+ protected _transaction: TTransaction;
11
+ protected _keyPair: KeyPair;
12
+ protected _signature?: string;
13
+ protected _sender: string;
14
+ protected _blockNumber: number;
15
+ protected _referenceBlock: string;
16
+ protected _nonce: number;
17
+ protected _tip?: number;
18
+ protected _eraPeriod?: number;
19
+ protected _registry: TypeRegistry;
20
+ protected _method?: TMethod;
21
+ protected _material: Material;
22
+ protected _signatures: Signature[];
23
+ constructor(_coinConfig: Readonly<CoinConfig>);
24
+ /**
25
+ * Sets the address of sending account.
26
+ *
27
+ * @param {BaseAddress} address The SS58-encoded address.
28
+ * @returns {TransactionBuilder} This transaction builder.
29
+ *
30
+ * @see https://wiki.polkadot.network/docs/build-transaction-construction
31
+ */
32
+ sender({ address }: BaseAddress): this;
33
+ /**
34
+ * The nonce for this transaction.
35
+ *
36
+ * @param {number} nonce
37
+ * @returns {TransactionBuilder} This transaction builder.
38
+ *
39
+ * @see https://wiki.polkadot.network/docs/build-transaction-construction
40
+ */
41
+ sequenceId(nonce: SequenceId): this;
42
+ /**
43
+ * The tip to increase transaction priority.
44
+ *
45
+ * @param {number | undefined} [fee.type] options for building fee tx
46
+ * @returns {TransactionBuilder} This transaction builder.
47
+ *
48
+ * @see https://wiki.polkadot.network/docs/build-transaction-construction
49
+ */
50
+ fee(fee: FeeOptions): this;
51
+ /**
52
+ * The number of the checkpoint block after which the transaction is valid
53
+ *
54
+ * @param {ValidityWindow} firstValid block checkpoint where transaction is first valid
55
+ * @param {ValidityWindow} maxDuration number of blocks after checkpoint for which transaction is valid
56
+ * @returns {TransactionBuilder} This transaction builder.
57
+ *
58
+ * @see https://wiki.polkadot.network/docs/build-transaction-construction
59
+ */
60
+ validity({ firstValid, maxDuration }: ValidityWindow): this;
61
+ /**
62
+ * The hash of the checkpoint block.
63
+ *
64
+ * @param {number} referenceBlock block hash checkpoint from where the transaction is valid
65
+ * @returns {TransactionBuilder} This transaction builder.
66
+ *
67
+ * @see https://wiki.polkadot.network/docs/build-transaction-construction
68
+ * @see https://wiki.polkadot.network/docs/build-protocol-info#transaction-mortality
69
+ */
70
+ referenceBlock(referenceBlock: string): this;
71
+ private method;
72
+ /**
73
+ * The material data for the block.
74
+ *
75
+ * @param {Material} material
76
+ * @returns {TransactionBuilder} This transaction builder.
77
+ *
78
+ * @see https://wiki.polkadot.network/docs/build-transaction-construction
79
+ */
80
+ material(material: Material): this;
81
+ /** @inheritdoc */
82
+ protected get transaction(): TTransaction;
83
+ /** @inheritdoc */
84
+ protected set transaction(transaction: TTransaction);
85
+ /** @inheritdoc */
86
+ protected fromImplementation(rawTransaction: string): TTransaction;
87
+ getMethodAndArguments(): string;
88
+ /** @inheritdoc */
89
+ protected buildImplementation(): Promise<TTransaction>;
90
+ protected createBaseTxInfo(): CreateBaseTxInfo;
91
+ /**
92
+ * Builds the specific transaction builder internally
93
+ * using the @substrate/txwrapper builder.
94
+ */
95
+ protected abstract buildTransaction(): UnsignedTransaction;
96
+ /**
97
+ * The transaction type.
98
+ */
99
+ protected abstract get transactionType(): TransactionType;
100
+ /** @inheritdoc */
101
+ validateAddress(address: BaseAddress, addressFormat?: string): void;
102
+ /** @inheritdoc */
103
+ validateKey({ key }: BaseKey): void;
104
+ /**
105
+ * Validates the specific transaction builder internally
106
+ */
107
+ protected abstract validateDecodedTransaction(decodedTxn: DecodedSigningPayload | DecodedSignedTx, rawTransaction?: string): void;
108
+ /** @inheritdoc */
109
+ validateRawTransaction(rawTransaction: string): void;
110
+ /** @inheritdoc */
111
+ validateTransaction(_: TTransaction): void;
112
+ private validateBaseFields;
113
+ /** @inheritdoc */
114
+ validateValue(value: BigNumber): void;
115
+ /** @inheritdoc */
116
+ addSignature(publicKey: BasePublicKey, signature: Buffer): void;
117
+ /** @inheritdoc */
118
+ protected signImplementation({ key }: BaseKey): TTransaction;
119
+ protected getAddressFormat(): number;
120
+ }
121
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"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"}