@bitgo/sdk-coin-stx 1.1.0-rc.0

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/.eslintignore +5 -0
  2. package/.mocharc.yml +8 -0
  3. package/CHANGELOG.md +11 -0
  4. package/LICENSE +191 -0
  5. package/README.md +30 -0
  6. package/dist/src/index.d.ts +5 -0
  7. package/dist/src/index.d.ts.map +1 -0
  8. package/dist/src/index.js +30 -0
  9. package/dist/src/lib/abstractContractBuilder.d.ts +19 -0
  10. package/dist/src/lib/abstractContractBuilder.d.ts.map +1 -0
  11. package/dist/src/lib/abstractContractBuilder.js +70 -0
  12. package/dist/src/lib/constants.d.ts +8 -0
  13. package/dist/src/lib/constants.d.ts.map +1 -0
  14. package/dist/src/lib/constants.js +19 -0
  15. package/dist/src/lib/contractBuilder.d.ts +33 -0
  16. package/dist/src/lib/contractBuilder.d.ts.map +1 -0
  17. package/dist/src/lib/contractBuilder.js +116 -0
  18. package/dist/src/lib/iface.d.ts +48 -0
  19. package/dist/src/lib/iface.d.ts.map +1 -0
  20. package/dist/src/lib/iface.js +3 -0
  21. package/dist/src/lib/index.d.ts +6 -0
  22. package/dist/src/lib/index.d.ts.map +1 -0
  23. package/dist/src/lib/index.js +33 -0
  24. package/dist/src/lib/keyPair.d.ts +55 -0
  25. package/dist/src/lib/keyPair.d.ts.map +1 -0
  26. package/dist/src/lib/keyPair.js +140 -0
  27. package/dist/src/lib/sendmanyBuilder.d.ts +23 -0
  28. package/dist/src/lib/sendmanyBuilder.d.ts.map +1 -0
  29. package/dist/src/lib/sendmanyBuilder.js +75 -0
  30. package/dist/src/lib/transaction.d.ts +49 -0
  31. package/dist/src/lib/transaction.d.ts.map +1 -0
  32. package/dist/src/lib/transaction.js +225 -0
  33. package/dist/src/lib/transactionBuilder.d.ts +86 -0
  34. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  35. package/dist/src/lib/transactionBuilder.js +263 -0
  36. package/dist/src/lib/transactionBuilderFactory.d.ts +30 -0
  37. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  38. package/dist/src/lib/transactionBuilderFactory.js +81 -0
  39. package/dist/src/lib/transferBuilder.d.ts +30 -0
  40. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  41. package/dist/src/lib/transferBuilder.js +99 -0
  42. package/dist/src/lib/utils.d.ts +207 -0
  43. package/dist/src/lib/utils.d.ts.map +1 -0
  44. package/dist/src/lib/utils.js +503 -0
  45. package/dist/src/stx.d.ts +56 -0
  46. package/dist/src/stx.d.ts.map +1 -0
  47. package/dist/src/stx.js +196 -0
  48. package/dist/src/tstx.d.ts +16 -0
  49. package/dist/src/tstx.d.ts.map +1 -0
  50. package/dist/src/tstx.js +24 -0
  51. package/dist/src/types.d.ts +34 -0
  52. package/dist/src/types.d.ts.map +1 -0
  53. package/dist/src/types.js +3 -0
  54. package/package.json +62 -0
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TransactionBuilder = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const bn_js_1 = __importDefault(require("bn.js"));
9
+ const statics_1 = require("@bitgo/statics");
10
+ const transactions_1 = require("@stacks/transactions");
11
+ const network_1 = require("@stacks/network");
12
+ const sdk_core_1 = require("@bitgo/sdk-core");
13
+ const transaction_1 = require("./transaction");
14
+ const keyPair_1 = require("./keyPair");
15
+ const utils_1 = require("./utils");
16
+ const constants_1 = require("./constants");
17
+ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
18
+ constructor(_coinConfig) {
19
+ super(_coinConfig);
20
+ this.getSignature = (_, index) => this._signatures.find((s) => s.index === index);
21
+ this.getPrivateKey = (pubKey, _) => this._multiSignerKeyPairs.find((kp) => kp.getKeys(true).pub === pubKey || kp.getKeys().pub === pubKey);
22
+ this._anchorMode = constants_1.ANCHOR_MODE;
23
+ this._multiSignerKeyPairs = [];
24
+ this._fromPubKeys = [];
25
+ this._signatures = [];
26
+ this._numberSignatures = constants_1.DEFAULT_MULTISIG_SIG_NUMBER;
27
+ this._network = _coinConfig.network.type === statics_1.NetworkType.MAINNET ? new network_1.StacksMainnet() : new network_1.StacksTestnet();
28
+ this._transaction = new transaction_1.Transaction(_coinConfig);
29
+ }
30
+ /**
31
+ * Initialize the transaction builder fields using the decoded transaction data
32
+ *
33
+ * @param {Transaction} tx the transaction data
34
+ */
35
+ initBuilder(tx) {
36
+ this.transaction = tx;
37
+ // check if it is signed or unsigned tx
38
+ if (tx.stxTransaction.auth.spendingCondition === undefined) {
39
+ throw new sdk_core_1.InvalidTransactionError('spending condition cannot be undefined');
40
+ }
41
+ const txData = tx.toJson();
42
+ this.fee({ fee: txData.fee.toString() });
43
+ this.nonce(txData.nonce);
44
+ let sigHash = tx.stxTransaction.verifyBegin();
45
+ const authType = tx.stxTransaction.auth.authType ? tx.stxTransaction.auth.authType : transactions_1.AuthType.Standard;
46
+ if (transactions_1.isSingleSig(tx.stxTransaction.auth.spendingCondition)) {
47
+ this._numberSignatures = 1;
48
+ if (tx.stxTransaction.auth.spendingCondition.signature.data !== transactions_1.emptyMessageSignature().data) {
49
+ const signature = tx.stxTransaction.auth.spendingCondition.signature;
50
+ sigHash = transactions_1.makeSigHashPreSign(sigHash, authType, new bn_js_1.default(this._fee.fee), new bn_js_1.default(this._nonce));
51
+ this._signatures.push({ ...signature, index: 0, sigHash });
52
+ this._fromPubKeys = [transactions_1.publicKeyFromSignature(sigHash, signature)];
53
+ }
54
+ }
55
+ else {
56
+ this._numberSignatures = tx.stxTransaction.auth.spendingCondition.signaturesRequired;
57
+ tx.stxTransaction.auth.spendingCondition.fields.forEach((field, index) => {
58
+ if (field.contents.type === transactions_1.StacksMessageType.MessageSignature) {
59
+ const signature = field.contents;
60
+ const nextVerify = transactions_1.nextVerification(sigHash, authType, new bn_js_1.default(this._fee.fee), new bn_js_1.default(this._nonce), transactions_1.PubKeyEncoding.Compressed, // useless param as Compressed is hardcoded in stacks lib
61
+ signature);
62
+ sigHash = nextVerify.nextSigHash;
63
+ this._signatures.push({ ...signature, index, sigHash });
64
+ this._fromPubKeys.push(nextVerify.pubKey.data.toString('hex'));
65
+ }
66
+ else {
67
+ this._fromPubKeys.push(field.contents.data.toString('hex'));
68
+ }
69
+ });
70
+ }
71
+ }
72
+ /** @inheritdoc */
73
+ fromImplementation(rawTransaction) {
74
+ const tx = new transaction_1.Transaction(this._coinConfig);
75
+ this.validateRawTransaction(rawTransaction);
76
+ const stackstransaction = transactions_1.deserializeTransaction(transactions_1.BufferReader.fromBuffer(Buffer.from(utils_1.removeHexPrefix(rawTransaction), 'hex')));
77
+ tx.stxTransaction = stackstransaction;
78
+ this.initBuilder(tx);
79
+ return this.transaction;
80
+ }
81
+ // region Base Builder
82
+ /** @inheritdoc */
83
+ async buildImplementation() {
84
+ const isMultiSig = this._fromPubKeys.length > 1;
85
+ this._transaction.stxTransaction.setFee(new bn_js_1.default(this._fee.fee));
86
+ this._transaction.stxTransaction.setNonce(new bn_js_1.default(this._nonce));
87
+ for (let index = 0; index < this._fromPubKeys.length; index++) {
88
+ const pubKey = this._fromPubKeys[index];
89
+ const signature = this.getSignature(pubKey, index);
90
+ if (signature) {
91
+ await this.transaction.signWithSignatures(signature, isMultiSig);
92
+ }
93
+ else {
94
+ const prvKey = this.getPrivateKey(pubKey, index);
95
+ if (prvKey) {
96
+ await this.transaction.sign(prvKey);
97
+ }
98
+ else if (isMultiSig) {
99
+ await this.transaction.appendOrigin(pubKey);
100
+ }
101
+ }
102
+ }
103
+ this._transaction.loadInputsAndOutputs();
104
+ return this._transaction;
105
+ }
106
+ /** @inheritdoc */
107
+ signImplementation(key) {
108
+ this.checkDuplicatedKeys(key);
109
+ let prv = key.key;
110
+ if (prv.startsWith('xprv')) {
111
+ const rawPrv = sdk_core_1.xprvToRawPrv(prv);
112
+ prv = new keyPair_1.KeyPair({ prv: rawPrv }).getKeys(true).prv;
113
+ }
114
+ const signer = new keyPair_1.KeyPair({ prv: prv });
115
+ // Signing the transaction is an operation that relies on all the data being set,
116
+ // so we set the source here and leave the actual signing for the build step
117
+ this._multiSignerKeyPairs.push(signer);
118
+ const publicKey = signer.getKeys(signer.getCompressed()).pub;
119
+ if (!this._fromPubKeys.includes(publicKey)) {
120
+ this._fromPubKeys.push(publicKey);
121
+ }
122
+ return this.transaction;
123
+ }
124
+ /** @inheritdoc */
125
+ get transaction() {
126
+ return this._transaction;
127
+ }
128
+ /** @inheritdoc */
129
+ set transaction(transaction) {
130
+ this._transaction = transaction;
131
+ }
132
+ /**
133
+ * Validates that the given key is not already in this._multiSignerKeyPairs
134
+ *
135
+ * @param {BaseKey} key - The key to check
136
+ */
137
+ checkDuplicatedKeys(key) {
138
+ this._multiSignerKeyPairs.forEach((_sourceKeyPair) => {
139
+ if (_sourceKeyPair.getKeys().prv === key.key) {
140
+ throw new sdk_core_1.SigningError('Repeated sign: ' + key.key);
141
+ }
142
+ });
143
+ }
144
+ /**
145
+ * Set the transaction fees
146
+ *
147
+ * @param {BaseFee} fee The maximum gas to pay
148
+ * @returns {TransactionBuilder} This transaction builder
149
+ */
150
+ fee(fee) {
151
+ this.validateValue(new bignumber_js_1.default(fee.fee));
152
+ this._fee = fee;
153
+ return this;
154
+ }
155
+ nonce(n) {
156
+ this._nonce = n;
157
+ return this;
158
+ }
159
+ fromPubKey(senderPubKey) {
160
+ const pubKeys = senderPubKey instanceof Array ? senderPubKey : [senderPubKey];
161
+ this._fromPubKeys = [];
162
+ pubKeys.forEach((key) => {
163
+ if (utils_1.isValidPublicKey(key)) {
164
+ this._fromPubKeys.push(key);
165
+ }
166
+ else {
167
+ throw new sdk_core_1.InvalidParameterValueError('Invalid public key');
168
+ }
169
+ });
170
+ return this;
171
+ }
172
+ /**
173
+ * Set the memo
174
+ *
175
+ * @param {string} memo
176
+ * @returns {TransactionBuilder} This transaction builder
177
+ */
178
+ memo(memo) {
179
+ if (!utils_1.isValidMemo(memo)) {
180
+ throw new sdk_core_1.BuildTransactionError('Memo is too long');
181
+ }
182
+ this._memo = memo;
183
+ return this;
184
+ }
185
+ /**
186
+ * Set the number of signatures for multi-sig
187
+ *
188
+ * @param {number} numSigns
189
+ * @returns {TransactionBuilder} This transaction builder
190
+ */
191
+ numberSignatures(numSigns) {
192
+ this.validateValue(new bignumber_js_1.default(numSigns));
193
+ this._numberSignatures = numSigns;
194
+ return this;
195
+ }
196
+ // region Validators
197
+ /** @inheritdoc */
198
+ validateAddress(address, addressFormat) {
199
+ if (!utils_1.isValidAddress(address.address)) {
200
+ throw new sdk_core_1.BuildTransactionError('Invalid address ' + address.address);
201
+ }
202
+ }
203
+ /** @inheritdoc */
204
+ validateKey(key) {
205
+ const keyPair = new keyPair_1.KeyPair({ prv: key.key });
206
+ if (!keyPair.getKeys().prv) {
207
+ throw new sdk_core_1.BuildTransactionError('Invalid key');
208
+ }
209
+ }
210
+ /** @inheritdoc */
211
+ validateRawTransaction(rawTransaction) {
212
+ if (!rawTransaction) {
213
+ throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
214
+ }
215
+ try {
216
+ transactions_1.deserializeTransaction(transactions_1.BufferReader.fromBuffer(Buffer.from(utils_1.removeHexPrefix(rawTransaction), 'hex')));
217
+ }
218
+ catch (e) {
219
+ throw new sdk_core_1.ParseTransactionError('There was an error parsing the raw transaction');
220
+ }
221
+ }
222
+ /** @inheritdoc */
223
+ validateTransaction(transaction) {
224
+ this.validateFee();
225
+ this.validateNonce();
226
+ }
227
+ /** @inheritdoc */
228
+ validateValue(value) {
229
+ if (value.isLessThan(0)) {
230
+ throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
231
+ }
232
+ }
233
+ /**
234
+ * Validates that the fee field is defined
235
+ */
236
+ validateFee() {
237
+ if (this._fee === undefined) {
238
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing fee');
239
+ }
240
+ try {
241
+ this.validateValue(new bignumber_js_1.default(this._fee.fee));
242
+ }
243
+ catch (e) {
244
+ throw new sdk_core_1.BuildTransactionError('Invalid fee');
245
+ }
246
+ }
247
+ /**
248
+ * Validates that nonce is defined
249
+ */
250
+ validateNonce() {
251
+ if (this._nonce === undefined) {
252
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing nonce');
253
+ }
254
+ try {
255
+ this.validateValue(new bignumber_js_1.default(this._nonce));
256
+ }
257
+ catch (e) {
258
+ throw new sdk_core_1.BuildTransactionError(`Invalid nonce ${this._nonce}`);
259
+ }
260
+ }
261
+ }
262
+ exports.TransactionBuilder = TransactionBuilder;
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQXFDO0FBQ3JDLGtEQUEyQjtBQUMzQiw0Q0FBcUU7QUFDckUsdURBVzhCO0FBQzlCLDZDQUE4RTtBQUM5RSw4Q0FXeUI7QUFDekIsK0NBQTRDO0FBQzVDLHVDQUFvQztBQUVwQyxtQ0FBeUY7QUFDekYsMkNBQXVFO0FBRXZFLE1BQXNCLGtCQUFtQixTQUFRLGlDQUFzQjtJQVlyRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQWdHYixpQkFBWSxHQUFHLENBQUMsQ0FBUyxFQUFFLEtBQWEsRUFBNkIsRUFBRSxDQUM3RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQztRQUMxQyxrQkFBYSxHQUFHLENBQUMsTUFBYyxFQUFFLENBQVMsRUFBdUIsRUFBRSxDQUN6RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxNQUFNLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQWxHdkcsSUFBSSxDQUFDLFdBQVcsR0FBRyx1QkFBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLHVDQUEyQixDQUFDO1FB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QU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlCQUFpQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7Q0FDRjtBQXpSRCxnREF5UkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgQmlnTnVtIGZyb20gJ2JuLmpzJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcsIE5ldHdvcmtUeXBlIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQXV0aFR5cGUsXG4gIEJ1ZmZlclJlYWRlcixcbiAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbixcbiAgZW1wdHlNZXNzYWdlU2lnbmF0dXJlLFxuICBpc1NpbmdsZVNpZyxcbiAgbWFrZVNpZ0hhc2hQcmVTaWduLFxuICBuZXh0VmVyaWZpY2F0aW9uLFxuICBwdWJsaWNLZXlGcm9tU2lnbmF0dXJlLFxuICBTdGFja3NNZXNzYWdlVHlwZSxcbiAgUHViS2V5RW5jb2RpbmcsXG59IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IFN0YWNrc05ldHdvcmssIFN0YWNrc1Rlc3RuZXQsIFN0YWNrc01haW5uZXQgfSBmcm9tICdAc3RhY2tzL25ldHdvcmsnO1xuaW1wb3J0IHtcbiAgQmFzZUFkZHJlc3MsXG4gIEJhc2VGZWUsXG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgeHBydlRvUmF3UHJ2LFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgU2lnbmF0dXJlRGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgaXNWYWxpZEFkZHJlc3MsIHJlbW92ZUhleFByZWZpeCwgaXNWYWxpZE1lbW8sIGlzVmFsaWRQdWJsaWNLZXkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEFOQ0hPUl9NT0RFLCBERUZBVUxUX01VTFRJU0lHX1NJR19OVU1CRVIgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgX2FuY2hvck1vZGU6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9mZWU6IEJhc2VGZWU7XG4gIHByb3RlY3RlZCBfbm9uY2U6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9tZW1vOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfbnVtYmVyU2lnbmF0dXJlczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX211bHRpU2lnbmVyS2V5UGFpcnM6IEtleVBhaXJbXTtcbiAgcHJvdGVjdGVkIF9zaWduYXR1cmVzOiBTaWduYXR1cmVEYXRhW107XG4gIHByb3RlY3RlZCBfbmV0d29yazogU3RhY2tzTmV0d29yaztcbiAgcHJvdGVjdGVkIF9mcm9tUHViS2V5czogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2FuY2hvck1vZGUgPSBBTkNIT1JfTU9ERTtcbiAgICB0aGlzLl9tdWx0aVNpZ25lcktleVBhaXJzID0gW107XG4gICAgdGhpcy5fZnJvbVB1YktleXMgPSBbXTtcbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW107XG4gICAgdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyA9IERFRkFVTFRfTVVMVElTSUdfU0lHX05VTUJFUjtcbiAgICB0aGlzLl9uZXR3b3JrID0gX2NvaW5Db25maWcubmV0d29yay50eXBlID09PSBOZXR3b3JrVHlwZS5NQUlOTkVUID8gbmV3IFN0YWNrc01haW5uZXQoKSA6IG5ldyBTdGFja3NUZXN0bmV0KCk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmllbGRzIHVzaW5nIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHggdGhlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0eDtcbiAgICAvLyBjaGVjayBpZiBpdCBpcyBzaWduZWQgb3IgdW5zaWduZWQgdHhcbiAgICBpZiAodHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3NwZW5kaW5nIGNvbmRpdGlvbiBjYW5ub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIHRoaXMuZmVlKHsgZmVlOiB0eERhdGEuZmVlLnRvU3RyaW5nKCkgfSk7XG4gICAgdGhpcy5ub25jZSh0eERhdGEubm9uY2UpO1xuICAgIGxldCBzaWdIYXNoID0gdHguc3R4VHJhbnNhY3Rpb24udmVyaWZ5QmVnaW4oKTtcblxuICAgIGNvbnN0IGF1dGhUeXBlID0gdHguc3R4VHJhbnNhY3Rpb24uYXV0aC5hdXRoVHlwZSA/IHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguYXV0aFR5cGUgOiBBdXRoVHlwZS5TdGFuZGFyZDtcbiAgICBpZiAoaXNTaW5nbGVTaWcodHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbikpIHtcbiAgICAgIHRoaXMuX251bWJlclNpZ25hdHVyZXMgPSAxO1xuICAgICAgaWYgKHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24uc2lnbmF0dXJlLmRhdGEgIT09IGVtcHR5TWVzc2FnZVNpZ25hdHVyZSgpLmRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5zaWduYXR1cmU7XG4gICAgICAgIHNpZ0hhc2ggPSBtYWtlU2lnSGFzaFByZVNpZ24oc2lnSGFzaCwgYXV0aFR5cGUsIG5ldyBCaWdOdW0odGhpcy5fZmVlLmZlZSksIG5ldyBCaWdOdW0odGhpcy5fbm9uY2UpKTtcbiAgICAgICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHsgLi4uc2lnbmF0dXJlLCBpbmRleDogMCwgc2lnSGFzaCB9KTtcbiAgICAgICAgdGhpcy5fZnJvbVB1YktleXMgPSBbcHVibGljS2V5RnJvbVNpZ25hdHVyZShzaWdIYXNoLCBzaWduYXR1cmUpXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyA9IHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24uc2lnbmF0dXJlc1JlcXVpcmVkO1xuICAgICAgdHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChmaWVsZC5jb250ZW50cy50eXBlID09PSBTdGFja3NNZXNzYWdlVHlwZS5NZXNzYWdlU2lnbmF0dXJlKSB7XG4gICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZmllbGQuY29udGVudHM7XG4gICAgICAgICAgY29uc3QgbmV4dFZlcmlmeSA9IG5leHRWZXJpZmljYXRpb24oXG4gICAgICAgICAgICBzaWdIYXNoLFxuICAgICAgICAgICAgYXV0aFR5cGUsXG4gICAgICAgICAgICBuZXcgQmlnTnVtKHRoaXMuX2ZlZS5mZWUpLFxuICAgICAgICAgICAgbmV3IEJpZ051bSh0aGlzLl9ub25jZSksXG4gICAgICAgICAgICBQdWJLZXlFbmNvZGluZy5Db21wcmVzc2VkLCAvLyB1c2VsZXNzIHBhcmFtIGFzIENvbXByZXNzZWQgaXMgaGFyZGNvZGVkIGluIHN0YWNrcyBsaWJcbiAgICAgICAgICAgIHNpZ25hdHVyZVxuICAgICAgICAgICk7XG4gICAgICAgICAgc2lnSGFzaCA9IG5leHRWZXJpZnkubmV4dFNpZ0hhc2g7XG4gICAgICAgICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHsgLi4uc2lnbmF0dXJlLCBpbmRleCwgc2lnSGFzaCB9KTtcbiAgICAgICAgICB0aGlzLl9mcm9tUHViS2V5cy5wdXNoKG5leHRWZXJpZnkucHViS2V5LmRhdGEudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9mcm9tUHViS2V5cy5wdXNoKGZpZWxkLmNvbnRlbnRzLmRhdGEudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnKTtcbiAgICB0aGlzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IHN0YWNrc3RyYW5zYWN0aW9uID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbihcbiAgICAgIEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbiksICdoZXgnKSlcbiAgICApO1xuICAgIHR4LnN0eFRyYW5zYWN0aW9uID0gc3RhY2tzdHJhbnNhY3Rpb247XG4gICAgdGhpcy5pbml0QnVpbGRlcih0eCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvLyByZWdpb24gQmFzZSBCdWlsZGVyXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXNNdWx0aVNpZzogYm9vbGVhbiA9IHRoaXMuX2Zyb21QdWJLZXlzLmxlbmd0aCA+IDE7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc3R4VHJhbnNhY3Rpb24uc2V0RmVlKG5ldyBCaWdOdW0odGhpcy5fZmVlLmZlZSkpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnN0eFRyYW5zYWN0aW9uLnNldE5vbmNlKG5ldyBCaWdOdW0odGhpcy5fbm9uY2UpKTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9mcm9tUHViS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHB1YktleSA9IHRoaXMuX2Zyb21QdWJLZXlzW2luZGV4XTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuZ2V0U2lnbmF0dXJlKHB1YktleSwgaW5kZXgpO1xuICAgICAgaWYgKHNpZ25hdHVyZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ25XaXRoU2lnbmF0dXJlcyhzaWduYXR1cmUsIGlzTXVsdGlTaWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJ2S2V5ID0gdGhpcy5nZXRQcml2YXRlS2V5KHB1YktleSwgaW5kZXgpO1xuICAgICAgICBpZiAocHJ2S2V5KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduKHBydktleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNNdWx0aVNpZykge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb24uYXBwZW5kT3JpZ2luKHB1YktleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbi5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2lnbmF0dXJlID0gKF86IHN0cmluZywgaW5kZXg6IG51bWJlcik6IFNpZ25hdHVyZURhdGEgfCB1bmRlZmluZWQgPT5cbiAgICB0aGlzLl9zaWduYXR1cmVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGluZGV4KTtcbiAgcHJpdmF0ZSBnZXRQcml2YXRlS2V5ID0gKHB1YktleTogc3RyaW5nLCBfOiBudW1iZXIpOiBLZXlQYWlyIHwgdW5kZWZpbmVkID0+XG4gICAgdGhpcy5fbXVsdGlTaWduZXJLZXlQYWlycy5maW5kKChrcCkgPT4ga3AuZ2V0S2V5cyh0cnVlKS5wdWIgPT09IHB1YktleSB8fCBrcC5nZXRLZXlzKCkucHViID09PSBwdWJLZXkpO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKGtleTogQmFzZUtleSk6IFRyYW5zYWN0aW9uIHtcbiAgICB0aGlzLmNoZWNrRHVwbGljYXRlZEtleXMoa2V5KTtcbiAgICBsZXQgcHJ2ID0ga2V5LmtleTtcbiAgICBpZiAocHJ2LnN0YXJ0c1dpdGgoJ3hwcnYnKSkge1xuICAgICAgY29uc3QgcmF3UHJ2ID0geHBydlRvUmF3UHJ2KHBydik7XG4gICAgICBwcnYgPSBuZXcgS2V5UGFpcih7IHBydjogcmF3UHJ2IH0pLmdldEtleXModHJ1ZSkucHJ2O1xuICAgIH1cbiAgICBjb25zdCBzaWduZXIgPSBuZXcgS2V5UGFpcih7IHBydjogcHJ2IH0pO1xuXG4gICAgLy8gU2lnbmluZyB0aGUgdHJhbnNhY3Rpb24gaXMgYW4gb3BlcmF0aW9uIHRoYXQgcmVsaWVzIG9uIGFsbCB0aGUgZGF0YSBiZWluZyBzZXQsXG4gICAgLy8gc28gd2Ugc2V0IHRoZSBzb3VyY2UgaGVyZSBhbmQgbGVhdmUgdGhlIGFjdHVhbCBzaWduaW5nIGZvciB0aGUgYnVpbGQgc3RlcFxuICAgIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMucHVzaChzaWduZXIpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNpZ25lci5nZXRLZXlzKHNpZ25lci5nZXRDb21wcmVzc2VkKCkpLnB1YjtcbiAgICBpZiAoIXRoaXMuX2Zyb21QdWJLZXlzLmluY2x1ZGVzKHB1YmxpY0tleSkpIHtcbiAgICAgIHRoaXMuX2Zyb21QdWJLZXlzLnB1c2gocHVibGljS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBhbHJlYWR5IGluIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnNcbiAgICpcbiAgICogQHBhcmFtIHtCYXNlS2V5fSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRHVwbGljYXRlZEtleXMoa2V5OiBCYXNlS2V5KSB7XG4gICAgdGhpcy5fbXVsdGlTaWduZXJLZXlQYWlycy5mb3JFYWNoKChfc291cmNlS2V5UGFpcikgPT4ge1xuICAgICAgaWYgKF9zb3VyY2VLZXlQYWlyLmdldEtleXMoKS5wcnYgPT09IGtleS5rZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignUmVwZWF0ZWQgc2lnbjogJyArIGtleS5rZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gZmVlc1xuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VGZWV9IGZlZSBUaGUgbWF4aW11bSBnYXMgdG8gcGF5XG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgZmVlKGZlZTogQmFzZUZlZSk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKGZlZS5mZWUpKTtcbiAgICB0aGlzLl9mZWUgPSBmZWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBub25jZShuOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9ub25jZSA9IG47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmcm9tUHViS2V5KHNlbmRlclB1YktleTogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBwdWJLZXlzID0gc2VuZGVyUHViS2V5IGluc3RhbmNlb2YgQXJyYXkgPyBzZW5kZXJQdWJLZXkgOiBbc2VuZGVyUHViS2V5XTtcbiAgICB0aGlzLl9mcm9tUHViS2V5cyA9IFtdO1xuICAgIHB1YktleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoaXNWYWxpZFB1YmxpY0tleShrZXkpKSB7XG4gICAgICAgIHRoaXMuX2Zyb21QdWJLZXlzLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBwdWJsaWMga2V5Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgbWVtb1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtb1xuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIG1lbW8obWVtbzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkTWVtbyhtZW1vKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWVtbyBpcyB0b28gbG9uZycpO1xuICAgIH1cbiAgICB0aGlzLl9tZW1vID0gbWVtbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2V0IHRoZSBudW1iZXIgb2Ygc2lnbmF0dXJlcyBmb3IgbXVsdGktc2lnXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1TaWduc1xuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIG51bWJlclNpZ25hdHVyZXMobnVtU2lnbnM6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKG51bVNpZ25zKSk7XG4gICAgdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyA9IG51bVNpZ25zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcywgYWRkcmVzc0Zvcm1hdD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzICcgKyBhZGRyZXNzLmFkZHJlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUtleShrZXk6IEJhc2VLZXkpOiB2b2lkIHtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IGtleS5rZXkgfSk7XG4gICAgaWYgKCFrZXlQYWlyLmdldEtleXMoKS5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQga2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbiksICdoZXgnKSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nIHRoZSByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUZlZSgpO1xuICAgIHRoaXMudmFsaWRhdGVOb25jZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVmFsdWUodmFsdWU6IEJpZ051bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuKDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGZlZSBmaWVsZCBpcyBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9mZWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBmZWUnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHRoaXMuX2ZlZS5mZWUpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGZlZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBub25jZSBpcyBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTm9uY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX25vbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHRoaXMuX25vbmNlKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBub25jZSAke3RoaXMuX25vbmNlfWApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo/statics';
2
+ import { BaseTransactionBuilderFactory } from '@bitgo/sdk-core';
3
+ import { TransferBuilder } from './transferBuilder';
4
+ import { TransactionBuilder } from './transactionBuilder';
5
+ import { Transaction } from './transaction';
6
+ import { ContractBuilder } from './contractBuilder';
7
+ import { SendmanyBuilder } from './sendmanyBuilder';
8
+ export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
9
+ constructor(_coinConfig: Readonly<CoinConfig>);
10
+ /** @inheritdoc */
11
+ from(raw: string): TransactionBuilder;
12
+ private parseTransaction;
13
+ /** @inheritdoc */
14
+ getWalletInitializationBuilder(tx?: Transaction): void;
15
+ /** @inheritdoc */
16
+ getTransferBuilder(tx?: Transaction): TransferBuilder;
17
+ getContractBuilder(tx?: Transaction): ContractBuilder;
18
+ getSendmanyBuilder(tx?: Transaction): SendmanyBuilder;
19
+ /**
20
+ * Initialize the builder with the given transaction
21
+ *
22
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
23
+ * @param {TransactionBuilder} builder - the builder to be initialized
24
+ * @returns {TransactionBuilder} the builder initialized
25
+ */
26
+ private static initializeBuilder;
27
+ /** @inheritdoc */
28
+ validateRawTransaction(rawTransaction: unknown): void;
29
+ }
30
+ //# sourceMappingURL=transactionBuilderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EACL,6BAA6B,EAI9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,yBAA0B,SAAQ,6BAA6B;gBAC9D,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAqBrC,OAAO,CAAC,gBAAgB;IASxB,kBAAkB;IAClB,8BAA8B,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,IAAI;IAItD,kBAAkB;IAClB,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAOhC,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI;CAQtD"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransactionBuilderFactory = void 0;
4
+ const transactions_1 = require("@stacks/transactions");
5
+ const sdk_core_1 = require("@bitgo/sdk-core");
6
+ const transferBuilder_1 = require("./transferBuilder");
7
+ const transaction_1 = require("./transaction");
8
+ const contractBuilder_1 = require("./contractBuilder");
9
+ const _1 = require(".");
10
+ const sendmanyBuilder_1 = require("./sendmanyBuilder");
11
+ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
12
+ constructor(_coinConfig) {
13
+ super(_coinConfig);
14
+ }
15
+ /** @inheritdoc */
16
+ from(raw) {
17
+ this.validateRawTransaction(raw);
18
+ try {
19
+ const tx = this.parseTransaction(raw);
20
+ switch (tx.stxTransaction.payload.payloadType) {
21
+ case transactions_1.PayloadType.TokenTransfer:
22
+ return this.getTransferBuilder(tx);
23
+ case transactions_1.PayloadType.ContractCall:
24
+ if (sendmanyBuilder_1.SendmanyBuilder.isValidContractCall(this._coinConfig, tx.stxTransaction.payload)) {
25
+ return this.getSendmanyBuilder(tx);
26
+ }
27
+ return this.getContractBuilder(tx);
28
+ default:
29
+ throw new sdk_core_1.InvalidTransactionError('Invalid transaction');
30
+ }
31
+ }
32
+ catch (e) {
33
+ console.error(e);
34
+ throw new sdk_core_1.ParseTransactionError('There was an error parsing the raw transaction');
35
+ }
36
+ }
37
+ parseTransaction(rawTransaction) {
38
+ const tx = new transaction_1.Transaction(this._coinConfig);
39
+ const stackstransaction = transactions_1.deserializeTransaction(transactions_1.BufferReader.fromBuffer(Buffer.from(_1.Utils.removeHexPrefix(rawTransaction), 'hex')));
40
+ tx.stxTransaction = stackstransaction;
41
+ return tx;
42
+ }
43
+ /** @inheritdoc */
44
+ getWalletInitializationBuilder(tx) {
45
+ throw new sdk_core_1.NotImplementedError('method not implemented');
46
+ }
47
+ /** @inheritdoc */
48
+ getTransferBuilder(tx) {
49
+ return TransactionBuilderFactory.initializeBuilder(new transferBuilder_1.TransferBuilder(this._coinConfig), tx);
50
+ }
51
+ getContractBuilder(tx) {
52
+ return TransactionBuilderFactory.initializeBuilder(new contractBuilder_1.ContractBuilder(this._coinConfig), tx);
53
+ }
54
+ getSendmanyBuilder(tx) {
55
+ return TransactionBuilderFactory.initializeBuilder(new sendmanyBuilder_1.SendmanyBuilder(this._coinConfig), tx);
56
+ }
57
+ /**
58
+ * Initialize the builder with the given transaction
59
+ *
60
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
61
+ * @param {TransactionBuilder} builder - the builder to be initialized
62
+ * @returns {TransactionBuilder} the builder initialized
63
+ */
64
+ static initializeBuilder(builder, tx) {
65
+ if (tx) {
66
+ builder.initBuilder(tx);
67
+ }
68
+ return builder;
69
+ }
70
+ /** @inheritdoc */
71
+ validateRawTransaction(rawTransaction) {
72
+ if (!rawTransaction) {
73
+ throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
74
+ }
75
+ if (!_1.Utils.isValidRawTransaction(rawTransaction)) {
76
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
77
+ }
78
+ }
79
+ }
80
+ exports.TransactionBuilderFactory = TransactionBuilderFactory;
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1REFBeUY7QUFDekYsOENBS3lCO0FBQ3pCLHVEQUFvRDtBQUVwRCwrQ0FBNEM7QUFDNUMsdURBQW9EO0FBQ3BELHdCQUEwQjtBQUMxQix1REFBb0Q7QUFFcEQsTUFBYSx5QkFBMEIsU0FBUSx3Q0FBNkI7SUFDMUUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLENBQUMsR0FBVztRQUNkLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJO1lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUM3QyxLQUFLLDBCQUFXLENBQUMsYUFBYTtvQkFDNUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssMEJBQVcsQ0FBQyxZQUFZO29CQUMzQixJQUFJLGlDQUFlLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNwRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDcEM7b0JBQ0QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDO29CQUNFLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2FBQzVEO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDbkY7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsY0FBc0I7UUFDN0MsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLGlCQUFpQixHQUFHLHFDQUFzQixDQUM5QywyQkFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQUssQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FDbkYsQ0FBQztRQUNGLEVBQUUsQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7UUFDdEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLDhCQUE4QixDQUFDLEVBQWdCO1FBQzdDLE1BQU0sSUFBSSw4QkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsa0JBQWtCLENBQUMsRUFBZ0I7UUFDakMsT0FBTyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLGlDQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFnQjtRQUNqQyxPQUFPLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLElBQUksaUNBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQWdCO1FBQ2pDLE9BQU8seUJBQXlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxpQ0FBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLGlCQUFpQixDQUErQixPQUFVLEVBQUUsRUFBMkI7UUFDcEcsSUFBSSxFQUFFLEVBQUU7WUFDTixPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixzQkFBc0IsQ0FBQyxjQUF1QjtRQUM1QyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxDQUFDLFFBQUssQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNoRCxNQUFNLElBQUksZ0NBQXFCLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7Q0FDRjtBQTdFRCw4REE2RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVmZmVyUmVhZGVyLCBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uLCBQYXlsb2FkVHlwZSB9IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7XG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IENvbnRyYWN0QnVpbGRlciB9IGZyb20gJy4vY29udHJhY3RCdWlsZGVyJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBTZW5kbWFueUJ1aWxkZXIgfSBmcm9tICcuL3NlbmRtYW55QnVpbGRlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZnJvbShyYXc6IHN0cmluZyk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhdyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4ID0gdGhpcy5wYXJzZVRyYW5zYWN0aW9uKHJhdyk7XG4gICAgICBzd2l0Y2ggKHR4LnN0eFRyYW5zYWN0aW9uLnBheWxvYWQucGF5bG9hZFR5cGUpIHtcbiAgICAgICAgY2FzZSBQYXlsb2FkVHlwZS5Ub2tlblRyYW5zZmVyOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zZmVyQnVpbGRlcih0eCk7XG4gICAgICAgIGNhc2UgUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsOlxuICAgICAgICAgIGlmIChTZW5kbWFueUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbCh0aGlzLl9jb2luQ29uZmlnLCB0eC5zdHhUcmFuc2FjdGlvbi5wYXlsb2FkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VuZG1hbnlCdWlsZGVyKHR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udHJhY3RCdWlsZGVyKHR4KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgdGhlIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIGNvbnN0IHN0YWNrc3RyYW5zYWN0aW9uID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbihcbiAgICAgIEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKFV0aWxzLnJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbiksICdoZXgnKSlcbiAgICApO1xuICAgIHR4LnN0eFRyYW5zYWN0aW9uID0gc3RhY2tzdHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcih0eD86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ21ldGhvZCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXRUcmFuc2ZlckJ1aWxkZXIodHg/OiBUcmFuc2FjdGlvbik6IFRyYW5zZmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkuaW5pdGlhbGl6ZUJ1aWxkZXIobmV3IFRyYW5zZmVyQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKSwgdHgpO1xuICB9XG5cbiAgZ2V0Q29udHJhY3RCdWlsZGVyKHR4PzogVHJhbnNhY3Rpb24pOiBDb250cmFjdEJ1aWxkZXIge1xuICAgIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LmluaXRpYWxpemVCdWlsZGVyKG5ldyBDb250cmFjdEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyksIHR4KTtcbiAgfVxuXG4gIGdldFNlbmRtYW55QnVpbGRlcih0eD86IFRyYW5zYWN0aW9uKTogU2VuZG1hbnlCdWlsZGVyIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5pbml0aWFsaXplQnVpbGRlcihuZXcgU2VuZG1hbnlCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpLCB0eCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYnVpbGRlciB3aXRoIHRoZSBnaXZlbiB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uIHwgdW5kZWZpbmVkfSB0eCAtIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGJ1aWxkZXJcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IGJ1aWxkZXIgLSB0aGUgYnVpbGRlciB0byBiZSBpbml0aWFsaXplZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSB0aGUgYnVpbGRlciBpbml0aWFsaXplZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdGlhbGl6ZUJ1aWxkZXI8VCBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlcj4oYnVpbGRlcjogVCwgdHg6IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkKTogVCB7XG4gICAgaWYgKHR4KSB7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlmICghVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo/statics';
2
+ import BigNum from 'bn.js';
3
+ import { Transaction } from './transaction';
4
+ import { TransactionBuilder } from './transactionBuilder';
5
+ export declare class TransferBuilder extends TransactionBuilder {
6
+ private _options;
7
+ protected _toAddress: string;
8
+ protected _amount: BigNum;
9
+ constructor(_coinConfig: Readonly<CoinConfig>);
10
+ initBuilder(tx: Transaction): void;
11
+ /** @inheritdoc */
12
+ protected buildImplementation(): Promise<Transaction>;
13
+ private buildTokenTransferOptions;
14
+ /**
15
+ * Set the destination address where the funds will be sent,
16
+ * it may take the format `'<shard>.<realm>.<account>'` or `'<account>'`
17
+ *
18
+ * @param {string} address the address to transfer funds to
19
+ * @returns {TransferBuilder} the builder with the new parameter set
20
+ */
21
+ to(address: string): this;
22
+ /**
23
+ * Set the amount to be transferred
24
+ *
25
+ * @param {string} amount amount to transfer in tinyBars (there are 100,000,000 tinyBars in one Hbar)
26
+ * @returns {TransferBuilder} the builder with the new parameter set
27
+ */
28
+ amount(amount: string): this;
29
+ }
30
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,MAAM,MAAM,OAAO,CAAC;AAc3B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,OAAO,CAAC,QAAQ,CAAsE;IACtF,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAiBlC,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAO3D,OAAO,CAAC,yBAAyB;IA6BjC;;;;;;OAMG;IACH,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQzB;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAO7B"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TransferBuilder = void 0;
7
+ const bn_js_1 = __importDefault(require("bn.js"));
8
+ const transactions_1 = require("@stacks/transactions");
9
+ const sdk_core_1 = require("@bitgo/sdk-core");
10
+ const transactionBuilder_1 = require("./transactionBuilder");
11
+ const utils_1 = require("./utils");
12
+ class TransferBuilder extends transactionBuilder_1.TransactionBuilder {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ }
16
+ initBuilder(tx) {
17
+ const txData = tx.toJson();
18
+ if (txData.payload === undefined) {
19
+ throw new sdk_core_1.InvalidTransactionError('payload must not be undefined');
20
+ }
21
+ if (txData.payload.payloadType === transactions_1.PayloadType.TokenTransfer) {
22
+ this.to(txData.payload.to);
23
+ this.amount(txData.payload.amount);
24
+ if (txData.payload.memo) {
25
+ this.memo(txData.payload.memo);
26
+ }
27
+ super.initBuilder(tx);
28
+ }
29
+ else {
30
+ throw new sdk_core_1.BuildTransactionError('Transaction should be transfer');
31
+ }
32
+ }
33
+ /** @inheritdoc */
34
+ async buildImplementation() {
35
+ this._options = this.buildTokenTransferOptions();
36
+ this.transaction.setTransactionType(sdk_core_1.TransactionType.Send);
37
+ this.transaction.stxTransaction = await transactions_1.makeUnsignedSTXTokenTransfer(this._options);
38
+ return await super.buildImplementation();
39
+ }
40
+ buildTokenTransferOptions() {
41
+ const defaultOpts = {
42
+ recipient: this._toAddress,
43
+ amount: this._amount,
44
+ memo: this._memo,
45
+ anchorMode: this._anchorMode,
46
+ network: this._network,
47
+ fee: new bn_js_1.default(this._fee.fee),
48
+ nonce: new bn_js_1.default(this._nonce),
49
+ };
50
+ if (this._fromPubKeys.length > 0) {
51
+ if (this._fromPubKeys.length === 1) {
52
+ return {
53
+ ...defaultOpts,
54
+ publicKey: this._fromPubKeys[0],
55
+ };
56
+ }
57
+ else {
58
+ return {
59
+ ...defaultOpts,
60
+ publicKeys: this._fromPubKeys,
61
+ numSignatures: this._numberSignatures,
62
+ };
63
+ }
64
+ }
65
+ else {
66
+ throw new sdk_core_1.InvalidParameterValueError('supply at least 1 public key');
67
+ }
68
+ }
69
+ // region Transfer fields
70
+ /**
71
+ * Set the destination address where the funds will be sent,
72
+ * it may take the format `'<shard>.<realm>.<account>'` or `'<account>'`
73
+ *
74
+ * @param {string} address the address to transfer funds to
75
+ * @returns {TransferBuilder} the builder with the new parameter set
76
+ */
77
+ to(address) {
78
+ if (!utils_1.isValidAddress(address)) {
79
+ throw new sdk_core_1.InvalidParameterValueError('Invalid address');
80
+ }
81
+ this._toAddress = address;
82
+ return this;
83
+ }
84
+ /**
85
+ * Set the amount to be transferred
86
+ *
87
+ * @param {string} amount amount to transfer in tinyBars (there are 100,000,000 tinyBars in one Hbar)
88
+ * @returns {TransferBuilder} the builder with the new parameter set
89
+ */
90
+ amount(amount) {
91
+ if (!utils_1.isValidAmount(amount)) {
92
+ throw new sdk_core_1.InvalidParameterValueError('Invalid amount');
93
+ }
94
+ this._amount = new bn_js_1.default(amount);
95
+ return this;
96
+ }
97
+ }
98
+ exports.TransferBuilder = TransferBuilder;
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esa0RBQTJCO0FBQzNCLHVEQU04QjtBQUM5Qiw4Q0FLeUI7QUFFekIsNkRBQTBEO0FBQzFELG1DQUF3RDtBQUV4RCxNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBS3JELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBZTtRQUN6QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksa0NBQXVCLENBQUMsK0JBQStCLENBQUMsQ0FBQztTQUNwRTtRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssMEJBQVcsQ0FBQyxhQUFhLEVBQUU7WUFDNUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7WUFDRCxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZCO2FBQU07WUFDTCxNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDUixLQUFLLENBQUMsbUJBQW1CO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLE1BQU0sMkNBQTRCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLE1BQU0sV0FBVyxHQUF5QjtZQUN4QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztZQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3RCLEdBQUcsRUFBRSxJQUFJLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUM5QixLQUFLLEVBQUUsSUFBSSxlQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMvQixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2xDLE9BQU87b0JBQ0wsR0FBRyxXQUFXO29CQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztpQkFDaEMsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE9BQU87b0JBQ0wsR0FBRyxXQUFXO29CQUNkLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7aUJBQ3RDLENBQUM7YUFDSDtTQUNGO2FBQU07WUFDTCxNQUFNLElBQUkscUNBQTBCLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUN0RTtJQUNILENBQUM7SUFFRCx5QkFBeUI7SUFDekI7Ozs7OztPQU1HO0lBQ0gsRUFBRSxDQUFDLE9BQWU7UUFDaEIsSUFBSSxDQUFDLHNCQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxJQUFJLHFDQUEwQixDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxNQUFjO1FBQ25CLElBQUksQ0FBQyxxQkFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxxQ0FBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQTNGRCwwQ0EyRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IEJpZ051bSBmcm9tICdibi5qcyc7XG5pbXBvcnQge1xuICBtYWtlVW5zaWduZWRTVFhUb2tlblRyYW5zZmVyLFxuICBQYXlsb2FkVHlwZSxcbiAgVW5zaWduZWRUb2tlblRyYW5zZmVyT3B0aW9ucyxcbiAgVG9rZW5UcmFuc2Zlck9wdGlvbnMsXG4gIFVuc2lnbmVkTXVsdGlTaWdUb2tlblRyYW5zZmVyT3B0aW9ucyxcbn0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBpc1ZhbGlkQWRkcmVzcywgaXNWYWxpZEFtb3VudCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfb3B0aW9uczogVW5zaWduZWRUb2tlblRyYW5zZmVyT3B0aW9ucyB8IFVuc2lnbmVkTXVsdGlTaWdUb2tlblRyYW5zZmVyT3B0aW9ucztcbiAgcHJvdGVjdGVkIF90b0FkZHJlc3M6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hbW91bnQ6IEJpZ051bTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICBpZiAodHhEYXRhLnBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdwYXlsb2FkIG11c3Qgbm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICBpZiAodHhEYXRhLnBheWxvYWQucGF5bG9hZFR5cGUgPT09IFBheWxvYWRUeXBlLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgIHRoaXMudG8odHhEYXRhLnBheWxvYWQudG8pO1xuICAgICAgdGhpcy5hbW91bnQodHhEYXRhLnBheWxvYWQuYW1vdW50KTtcbiAgICAgIGlmICh0eERhdGEucGF5bG9hZC5tZW1vKSB7XG4gICAgICAgIHRoaXMubWVtbyh0eERhdGEucGF5bG9hZC5tZW1vKTtcbiAgICAgIH1cbiAgICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gc2hvdWxkIGJlIHRyYW5zZmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLl9vcHRpb25zID0gdGhpcy5idWlsZFRva2VuVHJhbnNmZXJPcHRpb25zKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc3R4VHJhbnNhY3Rpb24gPSBhd2FpdCBtYWtlVW5zaWduZWRTVFhUb2tlblRyYW5zZmVyKHRoaXMuX29wdGlvbnMpO1xuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVG9rZW5UcmFuc2Zlck9wdGlvbnMoKTogVW5zaWduZWRUb2tlblRyYW5zZmVyT3B0aW9ucyB8IFVuc2lnbmVkTXVsdGlTaWdUb2tlblRyYW5zZmVyT3B0aW9ucyB7XG4gICAgY29uc3QgZGVmYXVsdE9wdHM6IFRva2VuVHJhbnNmZXJPcHRpb25zID0ge1xuICAgICAgcmVjaXBpZW50OiB0aGlzLl90b0FkZHJlc3MsXG4gICAgICBhbW91bnQ6IHRoaXMuX2Ftb3VudCxcbiAgICAgIG1lbW86IHRoaXMuX21lbW8sXG4gICAgICBhbmNob3JNb2RlOiB0aGlzLl9hbmNob3JNb2RlLFxuICAgICAgbmV0d29yazogdGhpcy5fbmV0d29yayxcbiAgICAgIGZlZTogbmV3IEJpZ051bSh0aGlzLl9mZWUuZmVlKSxcbiAgICAgIG5vbmNlOiBuZXcgQmlnTnVtKHRoaXMuX25vbmNlKSxcbiAgICB9O1xuICAgIGlmICh0aGlzLl9mcm9tUHViS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5fZnJvbVB1YktleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdHMsXG4gICAgICAgICAgcHVibGljS2V5OiB0aGlzLl9mcm9tUHViS2V5c1swXSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdHMsXG4gICAgICAgICAgcHVibGljS2V5czogdGhpcy5fZnJvbVB1YktleXMsXG4gICAgICAgICAgbnVtU2lnbmF0dXJlczogdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdzdXBwbHkgYXQgbGVhc3QgMSBwdWJsaWMga2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVnaW9uIFRyYW5zZmVyIGZpZWxkc1xuICAvKipcbiAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdoZXJlIHRoZSBmdW5kcyB3aWxsIGJlIHNlbnQsXG4gICAqIGl0IG1heSB0YWtlIHRoZSBmb3JtYXQgYCc8c2hhcmQ+LjxyZWFsbT4uPGFjY291bnQ+J2Agb3IgYCc8YWNjb3VudD4nYFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyB0aGUgYWRkcmVzcyB0byB0cmFuc2ZlciBmdW5kcyB0b1xuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgdG8oYWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgdGhpcy5fdG9BZGRyZXNzID0gYWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IGFtb3VudCB0byB0cmFuc2ZlciBpbiB0aW55QmFycyAodGhlcmUgYXJlIDEwMCwwMDAsMDAwIHRpbnlCYXJzIGluIG9uZSBIYmFyKVxuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgYW1vdW50KGFtb3VudDogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkQW1vdW50KGFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBhbW91bnQnKTtcbiAgICB9XG4gICAgdGhpcy5fYW1vdW50ID0gbmV3IEJpZ051bShhbW91bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=