@bitgo/sdk-coin-stx 3.8.15 → 3.9.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 (61) hide show
  1. package/.mocharc.yml +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/LICENSE +191 -0
  4. package/dist/src/index.d.ts +7 -0
  5. package/dist/src/index.d.ts.map +1 -0
  6. package/dist/src/index.js +46 -0
  7. package/dist/src/lib/abstractContractBuilder.d.ts +19 -0
  8. package/dist/src/lib/abstractContractBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/abstractContractBuilder.js +70 -0
  10. package/dist/src/lib/constants.d.ts +9 -0
  11. package/dist/src/lib/constants.d.ts.map +1 -0
  12. package/dist/src/lib/constants.js +21 -0
  13. package/dist/src/lib/contractBuilder.d.ts +33 -0
  14. package/dist/src/lib/contractBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/contractBuilder.js +116 -0
  16. package/dist/src/lib/fungibleTokenTransferBuilder.d.ts +62 -0
  17. package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/fungibleTokenTransferBuilder.js +131 -0
  19. package/dist/src/lib/iface.d.ts +104 -0
  20. package/dist/src/lib/iface.d.ts.map +1 -0
  21. package/dist/src/lib/iface.js +3 -0
  22. package/dist/src/lib/index.d.ts +6 -0
  23. package/dist/src/lib/index.d.ts.map +1 -0
  24. package/dist/src/lib/index.js +47 -0
  25. package/dist/src/lib/keyPair.d.ts +55 -0
  26. package/dist/src/lib/keyPair.d.ts.map +1 -0
  27. package/dist/src/lib/keyPair.js +119 -0
  28. package/dist/src/lib/sendmanyBuilder.d.ts +23 -0
  29. package/dist/src/lib/sendmanyBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/sendmanyBuilder.js +75 -0
  31. package/dist/src/lib/transaction.d.ts +49 -0
  32. package/dist/src/lib/transaction.d.ts.map +1 -0
  33. package/dist/src/lib/transaction.js +241 -0
  34. package/dist/src/lib/transactionBuilder.d.ts +86 -0
  35. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/transactionBuilder.js +263 -0
  37. package/dist/src/lib/transactionBuilderFactory.d.ts +32 -0
  38. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  39. package/dist/src/lib/transactionBuilderFactory.js +88 -0
  40. package/dist/src/lib/transferBuilder.d.ts +30 -0
  41. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transferBuilder.js +99 -0
  43. package/dist/src/lib/utils.d.ts +230 -0
  44. package/dist/src/lib/utils.d.ts.map +1 -0
  45. package/dist/src/lib/utils.js +582 -0
  46. package/dist/src/register.d.ts +3 -0
  47. package/dist/src/register.d.ts.map +1 -0
  48. package/dist/src/register.js +15 -0
  49. package/dist/src/sip10Token.d.ts +22 -0
  50. package/dist/src/sip10Token.d.ts.map +1 -0
  51. package/dist/src/sip10Token.js +128 -0
  52. package/dist/src/stx.d.ts +200 -0
  53. package/dist/src/stx.d.ts.map +1 -0
  54. package/dist/src/stx.js +605 -0
  55. package/dist/src/tstx.d.ts +16 -0
  56. package/dist/src/tstx.d.ts.map +1 -0
  57. package/dist/src/tstx.js +24 -0
  58. package/dist/src/types.d.ts +34 -0
  59. package/dist/src/types.d.ts.map +1 -0
  60. package/dist/src/types.js +3 -0
  61. package/package.json +7 -7
@@ -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 ((0, transactions_1.isSingleSig)(tx.stxTransaction.auth.spendingCondition)) {
47
+ this._numberSignatures = 1;
48
+ if (tx.stxTransaction.auth.spendingCondition.signature.data !== (0, transactions_1.emptyMessageSignature)().data) {
49
+ const signature = tx.stxTransaction.auth.spendingCondition.signature;
50
+ sigHash = (0, 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 = [(0, 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 = (0, 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 = (0, transactions_1.deserializeTransaction)(transactions_1.BufferReader.fromBuffer(Buffer.from((0, 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 = (0, 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 ((0, 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 (!(0, 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 (!(0, 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
+ (0, transactions_1.deserializeTransaction)(transactions_1.BufferReader.fromBuffer(Buffer.from((0, 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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QUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksZ0NBQXFCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHNCQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksZ0NBQXFCLENBQUMsaUJBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF6UkQsZ0RBeVJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IEJpZ051bSBmcm9tICdibi5qcyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnLCBOZXR3b3JrVHlwZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEF1dGhUeXBlLFxuICBCdWZmZXJSZWFkZXIsXG4gIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24sXG4gIGVtcHR5TWVzc2FnZVNpZ25hdHVyZSxcbiAgaXNTaW5nbGVTaWcsXG4gIG1ha2VTaWdIYXNoUHJlU2lnbixcbiAgbmV4dFZlcmlmaWNhdGlvbixcbiAgcHVibGljS2V5RnJvbVNpZ25hdHVyZSxcbiAgU3RhY2tzTWVzc2FnZVR5cGUsXG4gIFB1YktleUVuY29kaW5nLFxufSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBTdGFja3NOZXR3b3JrLCBTdGFja3NUZXN0bmV0LCBTdGFja3NNYWlubmV0IH0gZnJvbSAnQHN0YWNrcy9uZXR3b3JrJztcbmltcG9ydCB7XG4gIEJhc2VBZGRyZXNzLFxuICBCYXNlRmVlLFxuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyLFxuICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gIEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIHhwcnZUb1Jhd1Bydixcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IFNpZ25hdHVyZURhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGlzVmFsaWRBZGRyZXNzLCByZW1vdmVIZXhQcmVmaXgsIGlzVmFsaWRNZW1vLCBpc1ZhbGlkUHVibGljS2V5IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBBTkNIT1JfTU9ERSwgREVGQVVMVF9NVUxUSVNJR19TSUdfTlVNQkVSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgcHJvdGVjdGVkIF9hbmNob3JNb2RlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfZmVlOiBCYXNlRmVlO1xuICBwcm90ZWN0ZWQgX25vbmNlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfbWVtbzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX251bWJlclNpZ25hdHVyZXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9tdWx0aVNpZ25lcktleVBhaXJzOiBLZXlQYWlyW107XG4gIHByb3RlY3RlZCBfc2lnbmF0dXJlczogU2lnbmF0dXJlRGF0YVtdO1xuICBwcm90ZWN0ZWQgX25ldHdvcms6IFN0YWNrc05ldHdvcms7XG4gIHByb3RlY3RlZCBfZnJvbVB1YktleXM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl9hbmNob3JNb2RlID0gQU5DSE9SX01PREU7XG4gICAgdGhpcy5fbXVsdGlTaWduZXJLZXlQYWlycyA9IFtdO1xuICAgIHRoaXMuX2Zyb21QdWJLZXlzID0gW107XG4gICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdO1xuICAgIHRoaXMuX251bWJlclNpZ25hdHVyZXMgPSBERUZBVUxUX01VTFRJU0lHX1NJR19OVU1CRVI7XG4gICAgdGhpcy5fbmV0d29yayA9IF9jb2luQ29uZmlnLm5ldHdvcmsudHlwZSA9PT0gTmV0d29ya1R5cGUuTUFJTk5FVCA/IG5ldyBTdGFja3NNYWlubmV0KCkgOiBuZXcgU3RhY2tzVGVzdG5ldCgpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZpZWxkcyB1c2luZyB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHR4IHRoZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqL1xuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHg7XG4gICAgLy8gY2hlY2sgaWYgaXQgaXMgc2lnbmVkIG9yIHVuc2lnbmVkIHR4XG4gICAgaWYgKHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdzcGVuZGluZyBjb25kaXRpb24gY2Fubm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0aGlzLmZlZSh7IGZlZTogdHhEYXRhLmZlZS50b1N0cmluZygpIH0pO1xuICAgIHRoaXMubm9uY2UodHhEYXRhLm5vbmNlKTtcbiAgICBsZXQgc2lnSGFzaCA9IHR4LnN0eFRyYW5zYWN0aW9uLnZlcmlmeUJlZ2luKCk7XG5cbiAgICBjb25zdCBhdXRoVHlwZSA9IHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguYXV0aFR5cGUgPyB0eC5zdHhUcmFuc2FjdGlvbi5hdXRoLmF1dGhUeXBlIDogQXV0aFR5cGUuU3RhbmRhcmQ7XG4gICAgaWYgKGlzU2luZ2xlU2lnKHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24pKSB7XG4gICAgICB0aGlzLl9udW1iZXJTaWduYXR1cmVzID0gMTtcbiAgICAgIGlmICh0eC5zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uLnNpZ25hdHVyZS5kYXRhICE9PSBlbXB0eU1lc3NhZ2VTaWduYXR1cmUoKS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24uc2lnbmF0dXJlO1xuICAgICAgICBzaWdIYXNoID0gbWFrZVNpZ0hhc2hQcmVTaWduKHNpZ0hhc2gsIGF1dGhUeXBlLCBuZXcgQmlnTnVtKHRoaXMuX2ZlZS5mZWUpLCBuZXcgQmlnTnVtKHRoaXMuX25vbmNlKSk7XG4gICAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaCh7IC4uLnNpZ25hdHVyZSwgaW5kZXg6IDAsIHNpZ0hhc2ggfSk7XG4gICAgICAgIHRoaXMuX2Zyb21QdWJLZXlzID0gW3B1YmxpY0tleUZyb21TaWduYXR1cmUoc2lnSGFzaCwgc2lnbmF0dXJlKV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX251bWJlclNpZ25hdHVyZXMgPSB0eC5zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uLnNpZ25hdHVyZXNSZXF1aXJlZDtcbiAgICAgIHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24uZmllbGRzLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoZmllbGQuY29udGVudHMudHlwZSA9PT0gU3RhY2tzTWVzc2FnZVR5cGUuTWVzc2FnZVNpZ25hdHVyZSkge1xuICAgICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGZpZWxkLmNvbnRlbnRzO1xuICAgICAgICAgIGNvbnN0IG5leHRWZXJpZnkgPSBuZXh0VmVyaWZpY2F0aW9uKFxuICAgICAgICAgICAgc2lnSGFzaCxcbiAgICAgICAgICAgIGF1dGhUeXBlLFxuICAgICAgICAgICAgbmV3IEJpZ051bSh0aGlzLl9mZWUuZmVlKSxcbiAgICAgICAgICAgIG5ldyBCaWdOdW0odGhpcy5fbm9uY2UpLFxuICAgICAgICAgICAgUHViS2V5RW5jb2RpbmcuQ29tcHJlc3NlZCwgLy8gdXNlbGVzcyBwYXJhbSBhcyBDb21wcmVzc2VkIGlzIGhhcmRjb2RlZCBpbiBzdGFja3MgbGliXG4gICAgICAgICAgICBzaWduYXR1cmVcbiAgICAgICAgICApO1xuICAgICAgICAgIHNpZ0hhc2ggPSBuZXh0VmVyaWZ5Lm5leHRTaWdIYXNoO1xuICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaCh7IC4uLnNpZ25hdHVyZSwgaW5kZXgsIHNpZ0hhc2ggfSk7XG4gICAgICAgICAgdGhpcy5fZnJvbVB1YktleXMucHVzaChuZXh0VmVyaWZ5LnB1YktleS5kYXRhLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fZnJvbVB1YktleXMucHVzaChmaWVsZC5jb250ZW50cy5kYXRhLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZyk7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBzdGFja3N0cmFuc2FjdGlvbiA9IGRlc2VyaWFsaXplVHJhbnNhY3Rpb24oXG4gICAgICBCdWZmZXJSZWFkZXIuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShyZW1vdmVIZXhQcmVmaXgocmF3VHJhbnNhY3Rpb24pLCAnaGV4JykpXG4gICAgKTtcbiAgICB0eC5zdHhUcmFuc2FjdGlvbiA9IHN0YWNrc3RyYW5zYWN0aW9uO1xuICAgIHRoaXMuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLy8gcmVnaW9uIEJhc2UgQnVpbGRlclxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGlzTXVsdGlTaWc6IGJvb2xlYW4gPSB0aGlzLl9mcm9tUHViS2V5cy5sZW5ndGggPiAxO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnN0eFRyYW5zYWN0aW9uLnNldEZlZShuZXcgQmlnTnVtKHRoaXMuX2ZlZS5mZWUpKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zdHhUcmFuc2FjdGlvbi5zZXROb25jZShuZXcgQmlnTnVtKHRoaXMuX25vbmNlKSk7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZnJvbVB1YktleXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBwdWJLZXkgPSB0aGlzLl9mcm9tUHViS2V5c1tpbmRleF07XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmdldFNpZ25hdHVyZShwdWJLZXksIGluZGV4KTtcbiAgICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduV2l0aFNpZ25hdHVyZXMoc2lnbmF0dXJlLCBpc011bHRpU2lnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBydktleSA9IHRoaXMuZ2V0UHJpdmF0ZUtleShwdWJLZXksIGluZGV4KTtcbiAgICAgICAgaWYgKHBydktleSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb24uc2lnbihwcnZLZXkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTXVsdGlTaWcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLmFwcGVuZE9yaWdpbihwdWJLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdHJhbnNhY3Rpb24ubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGdldFNpZ25hdHVyZSA9IChfOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBTaWduYXR1cmVEYXRhIHwgdW5kZWZpbmVkID0+XG4gICAgdGhpcy5fc2lnbmF0dXJlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBpbmRleCk7XG4gIHByaXZhdGUgZ2V0UHJpdmF0ZUtleSA9IChwdWJLZXk6IHN0cmluZywgXzogbnVtYmVyKTogS2V5UGFpciB8IHVuZGVmaW5lZCA9PlxuICAgIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMuZmluZCgoa3ApID0+IGtwLmdldEtleXModHJ1ZSkucHViID09PSBwdWJLZXkgfHwga3AuZ2V0S2V5cygpLnB1YiA9PT0gcHViS2V5KTtcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy5jaGVja0R1cGxpY2F0ZWRLZXlzKGtleSk7XG4gICAgbGV0IHBydiA9IGtleS5rZXk7XG4gICAgaWYgKHBydi5zdGFydHNXaXRoKCd4cHJ2JykpIHtcbiAgICAgIGNvbnN0IHJhd1BydiA9IHhwcnZUb1Jhd1BydihwcnYpO1xuICAgICAgcHJ2ID0gbmV3IEtleVBhaXIoeyBwcnY6IHJhd1BydiB9KS5nZXRLZXlzKHRydWUpLnBydjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVyID0gbmV3IEtleVBhaXIoeyBwcnY6IHBydiB9KTtcblxuICAgIC8vIFNpZ25pbmcgdGhlIHRyYW5zYWN0aW9uIGlzIGFuIG9wZXJhdGlvbiB0aGF0IHJlbGllcyBvbiBhbGwgdGhlIGRhdGEgYmVpbmcgc2V0LFxuICAgIC8vIHNvIHdlIHNldCB0aGUgc291cmNlIGhlcmUgYW5kIGxlYXZlIHRoZSBhY3R1YWwgc2lnbmluZyBmb3IgdGhlIGJ1aWxkIHN0ZXBcbiAgICB0aGlzLl9tdWx0aVNpZ25lcktleVBhaXJzLnB1c2goc2lnbmVyKTtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSBzaWduZXIuZ2V0S2V5cyhzaWduZXIuZ2V0Q29tcHJlc3NlZCgpKS5wdWI7XG4gICAgaWYgKCF0aGlzLl9mcm9tUHViS2V5cy5pbmNsdWRlcyhwdWJsaWNLZXkpKSB7XG4gICAgICB0aGlzLl9mcm9tUHViS2V5cy5wdXNoKHB1YmxpY0tleSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGlzLl9tdWx0aVNpZ25lcktleVBhaXJzXG4gICAqXG4gICAqIEBwYXJhbSB7QmFzZUtleX0ga2V5IC0gVGhlIGtleSB0byBjaGVja1xuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0R1cGxpY2F0ZWRLZXlzKGtleTogQmFzZUtleSkge1xuICAgIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMuZm9yRWFjaCgoX3NvdXJjZUtleVBhaXIpID0+IHtcbiAgICAgIGlmIChfc291cmNlS2V5UGFpci5nZXRLZXlzKCkucHJ2ID09PSBrZXkua2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ1JlcGVhdGVkIHNpZ246ICcgKyBrZXkua2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGZlZXNcbiAgICpcbiAgICogQHBhcmFtIHtCYXNlRmVlfSBmZWUgVGhlIG1heGltdW0gZ2FzIHRvIHBheVxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGZlZShmZWU6IEJhc2VGZWUpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihmZWUuZmVlKSk7XG4gICAgdGhpcy5fZmVlID0gZmVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbm9uY2UobjogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5fbm9uY2UgPSBuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZnJvbVB1YktleShzZW5kZXJQdWJLZXk6IHN0cmluZyB8IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgY29uc3QgcHViS2V5cyA9IHNlbmRlclB1YktleSBpbnN0YW5jZW9mIEFycmF5ID8gc2VuZGVyUHViS2V5IDogW3NlbmRlclB1YktleV07XG4gICAgdGhpcy5fZnJvbVB1YktleXMgPSBbXTtcbiAgICBwdWJLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGlzVmFsaWRQdWJsaWNLZXkoa2V5KSkge1xuICAgICAgICB0aGlzLl9mcm9tUHViS2V5cy5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IoJ0ludmFsaWQgcHVibGljIGtleScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqICBTZXQgdGhlIG1lbW9cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lbW9cbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBtZW1vKG1lbW86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZE1lbW8obWVtbykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01lbW8gaXMgdG9vIGxvbmcnKTtcbiAgICB9XG4gICAgdGhpcy5fbWVtbyA9IG1lbW87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgbnVtYmVyIG9mIHNpZ25hdHVyZXMgZm9yIG11bHRpLXNpZ1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtU2lnbnNcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBudW1iZXJTaWduYXR1cmVzKG51bVNpZ25zOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihudW1TaWducykpO1xuICAgIHRoaXMuX251bWJlclNpZ25hdHVyZXMgPSBudW1TaWducztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlZ2lvbiBWYWxpZGF0b3JzXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogQmFzZUFkZHJlc3MsIGFkZHJlc3NGb3JtYXQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgYWRkcmVzcyAnICsgYWRkcmVzcy5hZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pO1xuICAgIGlmICgha2V5UGFpci5nZXRLZXlzKCkucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGtleScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBlbXB0eScpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbihCdWZmZXJSZWFkZXIuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShyZW1vdmVIZXhQcmVmaXgocmF3VHJhbnNhY3Rpb24pLCAnaGV4JykpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVGZWUoKTtcbiAgICB0aGlzLnZhbGlkYXRlTm9uY2UoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuaXNMZXNzVGhhbigwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBmZWUgZmllbGQgaXMgZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZlZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgZmVlJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcih0aGlzLl9mZWUuZmVlKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBmZWUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgbm9uY2UgaXMgZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU5vbmNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9ub25jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIG5vbmNlJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcih0aGlzLl9ub25jZSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgbm9uY2UgJHt0aGlzLl9ub25jZX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,32 @@
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
+ import { FungibleTokenTransferBuilder } from './fungibleTokenTransferBuilder';
9
+ export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
10
+ constructor(_coinConfig: Readonly<CoinConfig>);
11
+ /** @inheritdoc */
12
+ from(raw: string): TransactionBuilder;
13
+ private parseTransaction;
14
+ /** @inheritdoc */
15
+ getWalletInitializationBuilder(tx?: Transaction): void;
16
+ /** @inheritdoc */
17
+ getTransferBuilder(tx?: Transaction): TransferBuilder;
18
+ getContractBuilder(tx?: Transaction): ContractBuilder;
19
+ getSendmanyBuilder(tx?: Transaction): SendmanyBuilder;
20
+ getFungibleTokenTransferBuilder(tx?: Transaction): FungibleTokenTransferBuilder;
21
+ /**
22
+ * Initialize the builder with the given transaction
23
+ *
24
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
25
+ * @param {TransactionBuilder} builder - the builder to be initialized
26
+ * @returns {TransactionBuilder} the builder initialized
27
+ */
28
+ private static initializeBuilder;
29
+ /** @inheritdoc */
30
+ validateRawTransaction(rawTransaction: unknown): void;
31
+ }
32
+ //# 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;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,qBAAa,yBAA0B,SAAQ,6BAA6B;gBAC9D,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAwBrC,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,+BAA+B,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,4BAA4B;IAI/E;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAOhC,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI;CAQtD"}
@@ -0,0 +1,88 @@
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
+ const fungibleTokenTransferBuilder_1 = require("./fungibleTokenTransferBuilder");
12
+ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ }
16
+ /** @inheritdoc */
17
+ from(raw) {
18
+ this.validateRawTransaction(raw);
19
+ try {
20
+ const tx = this.parseTransaction(raw);
21
+ switch (tx.stxTransaction.payload.payloadType) {
22
+ case transactions_1.PayloadType.TokenTransfer:
23
+ return this.getTransferBuilder(tx);
24
+ case transactions_1.PayloadType.ContractCall:
25
+ if (sendmanyBuilder_1.SendmanyBuilder.isValidContractCall(this._coinConfig, tx.stxTransaction.payload)) {
26
+ return this.getSendmanyBuilder(tx);
27
+ }
28
+ if (fungibleTokenTransferBuilder_1.FungibleTokenTransferBuilder.isFungibleTokenTransferContractCall(tx.stxTransaction.payload)) {
29
+ return this.getFungibleTokenTransferBuilder(tx);
30
+ }
31
+ return this.getContractBuilder(tx);
32
+ default:
33
+ throw new sdk_core_1.InvalidTransactionError('Invalid transaction');
34
+ }
35
+ }
36
+ catch (e) {
37
+ console.error(e);
38
+ throw new sdk_core_1.ParseTransactionError('There was an error parsing the raw transaction');
39
+ }
40
+ }
41
+ parseTransaction(rawTransaction) {
42
+ const tx = new transaction_1.Transaction(this._coinConfig);
43
+ const stackstransaction = (0, transactions_1.deserializeTransaction)(transactions_1.BufferReader.fromBuffer(Buffer.from(_1.Utils.removeHexPrefix(rawTransaction), 'hex')));
44
+ tx.stxTransaction = stackstransaction;
45
+ return tx;
46
+ }
47
+ /** @inheritdoc */
48
+ getWalletInitializationBuilder(tx) {
49
+ throw new sdk_core_1.NotImplementedError('method not implemented');
50
+ }
51
+ /** @inheritdoc */
52
+ getTransferBuilder(tx) {
53
+ return TransactionBuilderFactory.initializeBuilder(new transferBuilder_1.TransferBuilder(this._coinConfig), tx);
54
+ }
55
+ getContractBuilder(tx) {
56
+ return TransactionBuilderFactory.initializeBuilder(new contractBuilder_1.ContractBuilder(this._coinConfig), tx);
57
+ }
58
+ getSendmanyBuilder(tx) {
59
+ return TransactionBuilderFactory.initializeBuilder(new sendmanyBuilder_1.SendmanyBuilder(this._coinConfig), tx);
60
+ }
61
+ getFungibleTokenTransferBuilder(tx) {
62
+ return TransactionBuilderFactory.initializeBuilder(new fungibleTokenTransferBuilder_1.FungibleTokenTransferBuilder(this._coinConfig), tx);
63
+ }
64
+ /**
65
+ * Initialize the builder with the given transaction
66
+ *
67
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
68
+ * @param {TransactionBuilder} builder - the builder to be initialized
69
+ * @returns {TransactionBuilder} the builder initialized
70
+ */
71
+ static initializeBuilder(builder, tx) {
72
+ if (tx) {
73
+ builder.initBuilder(tx);
74
+ }
75
+ return builder;
76
+ }
77
+ /** @inheritdoc */
78
+ validateRawTransaction(rawTransaction) {
79
+ if (!rawTransaction) {
80
+ throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
81
+ }
82
+ if (!_1.Utils.isValidRawTransaction(rawTransaction)) {
83
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
84
+ }
85
+ }
86
+ }
87
+ exports.TransactionBuilderFactory = TransactionBuilderFactory;
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1REFBeUY7QUFDekYsOENBS3lCO0FBQ3pCLHVEQUFvRDtBQUVwRCwrQ0FBNEM7QUFDNUMsdURBQW9EO0FBQ3BELHdCQUEwQjtBQUMxQix1REFBb0Q7QUFDcEQsaUZBQThFO0FBRTlFLE1BQWEseUJBQTBCLFNBQVEsd0NBQTZCO0lBQzFFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxDQUFDLEdBQVc7UUFDZCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlDLEtBQUssMEJBQVcsQ0FBQyxhQUFhO29CQUM1QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckMsS0FBSywwQkFBVyxDQUFDLFlBQVk7b0JBQzNCLElBQUksaUNBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDckYsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3JDLENBQUM7b0JBQ0QsSUFBSSwyREFBNEIsQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ2hHLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNsRCxDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQztvQkFDRSxNQUFNLElBQUksa0NBQXVCLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUM3RCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsY0FBc0I7UUFDN0MsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLGlCQUFpQixHQUFHLElBQUEscUNBQXNCLEVBQzlDLDJCQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBSyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUNuRixDQUFDO1FBQ0YsRUFBRSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQztRQUN0QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsOEJBQThCLENBQUMsRUFBZ0I7UUFDN0MsTUFBTSxJQUFJLDhCQUFtQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixrQkFBa0IsQ0FBQyxFQUFnQjtRQUNqQyxPQUFPLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLElBQUksaUNBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQWdCO1FBQ2pDLE9BQU8seUJBQXlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxpQ0FBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsRUFBZ0I7UUFDakMsT0FBTyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLGlDQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCwrQkFBK0IsQ0FBQyxFQUFnQjtRQUM5QyxPQUFPLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLElBQUksMkRBQTRCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQUMsaUJBQWlCLENBQStCLE9BQVUsRUFBRSxFQUEyQjtRQUNwRyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1AsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixzQkFBc0IsQ0FBQyxjQUF1QjtRQUM1QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksZ0NBQXFCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBcEZELDhEQW9GQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBCdWZmZXJSZWFkZXIsIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24sIFBheWxvYWRUeXBlIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgQmFzZVRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBOb3RJbXBsZW1lbnRlZEVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zZmVyQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQ29udHJhY3RCdWlsZGVyIH0gZnJvbSAnLi9jb250cmFjdEJ1aWxkZXInO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuJztcbmltcG9ydCB7IFNlbmRtYW55QnVpbGRlciB9IGZyb20gJy4vc2VuZG1hbnlCdWlsZGVyJztcbmltcG9ydCB7IEZ1bmdpYmxlVG9rZW5UcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL2Z1bmdpYmxlVG9rZW5UcmFuc2ZlckJ1aWxkZXInO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGZyb20ocmF3OiBzdHJpbmcpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eCA9IHRoaXMucGFyc2VUcmFuc2FjdGlvbihyYXcpO1xuICAgICAgc3dpdGNoICh0eC5zdHhUcmFuc2FjdGlvbi5wYXlsb2FkLnBheWxvYWRUeXBlKSB7XG4gICAgICAgIGNhc2UgUGF5bG9hZFR5cGUuVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2ZlckJ1aWxkZXIodHgpO1xuICAgICAgICBjYXNlIFBheWxvYWRUeXBlLkNvbnRyYWN0Q2FsbDpcbiAgICAgICAgICBpZiAoU2VuZG1hbnlCdWlsZGVyLmlzVmFsaWRDb250cmFjdENhbGwodGhpcy5fY29pbkNvbmZpZywgdHguc3R4VHJhbnNhY3Rpb24ucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlbmRtYW55QnVpbGRlcih0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChGdW5naWJsZVRva2VuVHJhbnNmZXJCdWlsZGVyLmlzRnVuZ2libGVUb2tlblRyYW5zZmVyQ29udHJhY3RDYWxsKHR4LnN0eFRyYW5zYWN0aW9uLnBheWxvYWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGdW5naWJsZVRva2VuVHJhbnNmZXJCdWlsZGVyKHR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udHJhY3RCdWlsZGVyKHR4KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgdGhlIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIGNvbnN0IHN0YWNrc3RyYW5zYWN0aW9uID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbihcbiAgICAgIEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKFV0aWxzLnJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbiksICdoZXgnKSlcbiAgICApO1xuICAgIHR4LnN0eFRyYW5zYWN0aW9uID0gc3RhY2tzdHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcih0eD86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ21ldGhvZCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXRUcmFuc2ZlckJ1aWxkZXIodHg/OiBUcmFuc2FjdGlvbik6IFRyYW5zZmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkuaW5pdGlhbGl6ZUJ1aWxkZXIobmV3IFRyYW5zZmVyQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKSwgdHgpO1xuICB9XG5cbiAgZ2V0Q29udHJhY3RCdWlsZGVyKHR4PzogVHJhbnNhY3Rpb24pOiBDb250cmFjdEJ1aWxkZXIge1xuICAgIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LmluaXRpYWxpemVCdWlsZGVyKG5ldyBDb250cmFjdEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyksIHR4KTtcbiAgfVxuXG4gIGdldFNlbmRtYW55QnVpbGRlcih0eD86IFRyYW5zYWN0aW9uKTogU2VuZG1hbnlCdWlsZGVyIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5pbml0aWFsaXplQnVpbGRlcihuZXcgU2VuZG1hbnlCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpLCB0eCk7XG4gIH1cblxuICBnZXRGdW5naWJsZVRva2VuVHJhbnNmZXJCdWlsZGVyKHR4PzogVHJhbnNhY3Rpb24pOiBGdW5naWJsZVRva2VuVHJhbnNmZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5pbml0aWFsaXplQnVpbGRlcihuZXcgRnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKSwgdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJ1aWxkZXIgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZH0gdHggLSB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBidWlsZGVyXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25CdWlsZGVyfSBidWlsZGVyIC0gdGhlIGJ1aWxkZXIgdG8gYmUgaW5pdGlhbGl6ZWRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGluaXRpYWxpemVCdWlsZGVyPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXI+KGJ1aWxkZXI6IFQsIHR4OiBUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZCk6IFQge1xuICAgIGlmICh0eCkge1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBpZiAoIVV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -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 (0, 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 (!(0, 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 (!(0, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esa0RBQTJCO0FBQzNCLHVEQU04QjtBQUM5Qiw4Q0FLeUI7QUFFekIsNkRBQTBEO0FBQzFELG1DQUF3RDtBQUV4RCxNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBS3JELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBZTtRQUN6QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLDBCQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxNQUFNLElBQUEsMkNBQTRCLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLE1BQU0sV0FBVyxHQUF5QjtZQUN4QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztZQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3RCLEdBQUcsRUFBRSxJQUFJLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUM5QixLQUFLLEVBQUUsSUFBSSxlQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMvQixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxPQUFPO29CQUNMLEdBQUcsV0FBVztvQkFDZCxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7aUJBQ2hDLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTztvQkFDTCxHQUFHLFdBQVc7b0JBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZO29CQUM3QixhQUFhLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtpQkFDdEMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxxQ0FBMEIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCOzs7Ozs7T0FNRztJQUNILEVBQUUsQ0FBQyxPQUFlO1FBQ2hCLElBQUksQ0FBQyxJQUFBLHNCQUFjLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUkscUNBQTBCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsTUFBYztRQUNuQixJQUFJLENBQUMsSUFBQSxxQkFBYSxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLHFDQUEwQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxlQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUEzRkQsMENBMkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBCaWdOdW0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHtcbiAgbWFrZVVuc2lnbmVkU1RYVG9rZW5UcmFuc2ZlcixcbiAgUGF5bG9hZFR5cGUsXG4gIFVuc2lnbmVkVG9rZW5UcmFuc2Zlck9wdGlvbnMsXG4gIFRva2VuVHJhbnNmZXJPcHRpb25zLFxuICBVbnNpZ25lZE11bHRpU2lnVG9rZW5UcmFuc2Zlck9wdGlvbnMsXG59IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7XG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgaXNWYWxpZEFkZHJlc3MsIGlzVmFsaWRBbW91bnQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX29wdGlvbnM6IFVuc2lnbmVkVG9rZW5UcmFuc2Zlck9wdGlvbnMgfCBVbnNpZ25lZE11bHRpU2lnVG9rZW5UcmFuc2Zlck9wdGlvbnM7XG4gIHByb3RlY3RlZCBfdG9BZGRyZXNzOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfYW1vdW50OiBCaWdOdW07XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gdHgudG9Kc29uKCk7XG4gICAgaWYgKHR4RGF0YS5wYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcigncGF5bG9hZCBtdXN0IG5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgaWYgKHR4RGF0YS5wYXlsb2FkLnBheWxvYWRUeXBlID09PSBQYXlsb2FkVHlwZS5Ub2tlblRyYW5zZmVyKSB7XG4gICAgICB0aGlzLnRvKHR4RGF0YS5wYXlsb2FkLnRvKTtcbiAgICAgIHRoaXMuYW1vdW50KHR4RGF0YS5wYXlsb2FkLmFtb3VudCk7XG4gICAgICBpZiAodHhEYXRhLnBheWxvYWQubWVtbykge1xuICAgICAgICB0aGlzLm1lbW8odHhEYXRhLnBheWxvYWQubWVtbyk7XG4gICAgICB9XG4gICAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHNob3VsZCBiZSB0cmFuc2ZlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHRoaXMuYnVpbGRUb2tlblRyYW5zZmVyT3B0aW9ucygpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnN0eFRyYW5zYWN0aW9uID0gYXdhaXQgbWFrZVVuc2lnbmVkU1RYVG9rZW5UcmFuc2Zlcih0aGlzLl9vcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRva2VuVHJhbnNmZXJPcHRpb25zKCk6IFVuc2lnbmVkVG9rZW5UcmFuc2Zlck9wdGlvbnMgfCBVbnNpZ25lZE11bHRpU2lnVG9rZW5UcmFuc2Zlck9wdGlvbnMge1xuICAgIGNvbnN0IGRlZmF1bHRPcHRzOiBUb2tlblRyYW5zZmVyT3B0aW9ucyA9IHtcbiAgICAgIHJlY2lwaWVudDogdGhpcy5fdG9BZGRyZXNzLFxuICAgICAgYW1vdW50OiB0aGlzLl9hbW91bnQsXG4gICAgICBtZW1vOiB0aGlzLl9tZW1vLFxuICAgICAgYW5jaG9yTW9kZTogdGhpcy5fYW5jaG9yTW9kZSxcbiAgICAgIG5ldHdvcms6IHRoaXMuX25ldHdvcmssXG4gICAgICBmZWU6IG5ldyBCaWdOdW0odGhpcy5fZmVlLmZlZSksXG4gICAgICBub25jZTogbmV3IEJpZ051bSh0aGlzLl9ub25jZSksXG4gICAgfTtcbiAgICBpZiAodGhpcy5fZnJvbVB1YktleXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuX2Zyb21QdWJLZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRzLFxuICAgICAgICAgIHB1YmxpY0tleTogdGhpcy5fZnJvbVB1YktleXNbMF0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRzLFxuICAgICAgICAgIHB1YmxpY0tleXM6IHRoaXMuX2Zyb21QdWJLZXlzLFxuICAgICAgICAgIG51bVNpZ25hdHVyZXM6IHRoaXMuX251bWJlclNpZ25hdHVyZXMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignc3VwcGx5IGF0IGxlYXN0IDEgcHVibGljIGtleScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlZ2lvbiBUcmFuc2ZlciBmaWVsZHNcbiAgLyoqXG4gICAqIFNldCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyB3aGVyZSB0aGUgZnVuZHMgd2lsbCBiZSBzZW50LFxuICAgKiBpdCBtYXkgdGFrZSB0aGUgZm9ybWF0IGAnPHNoYXJkPi48cmVhbG0+LjxhY2NvdW50PidgIG9yIGAnPGFjY291bnQ+J2BcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgdGhlIGFkZHJlc3MgdG8gdHJhbnNmZXIgZnVuZHMgdG9cbiAgICogQHJldHVybnMge1RyYW5zZmVyQnVpbGRlcn0gdGhlIGJ1aWxkZXIgd2l0aCB0aGUgbmV3IHBhcmFtZXRlciBzZXRcbiAgICovXG4gIHRvKGFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBhZGRyZXNzJyk7XG4gICAgfVxuICAgIHRoaXMuX3RvQWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBhbW91bnQgdG8gYmUgdHJhbnNmZXJyZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCBhbW91bnQgdG8gdHJhbnNmZXIgaW4gdGlueUJhcnMgKHRoZXJlIGFyZSAxMDAsMDAwLDAwMCB0aW55QmFycyBpbiBvbmUgSGJhcilcbiAgICogQHJldHVybnMge1RyYW5zZmVyQnVpbGRlcn0gdGhlIGJ1aWxkZXIgd2l0aCB0aGUgbmV3IHBhcmFtZXRlciBzZXRcbiAgICovXG4gIGFtb3VudChhbW91bnQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IoJ0ludmFsaWQgYW1vdW50Jyk7XG4gICAgfVxuICAgIHRoaXMuX2Ftb3VudCA9IG5ldyBCaWdOdW0oYW1vdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19