@bitgo/sdk-coin-celo 5.1.15 → 5.2.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 (46) hide show
  1. package/.mocharc.yml +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/LICENSE +191 -0
  4. package/dist/src/celo.d.ts +17 -0
  5. package/dist/src/celo.d.ts.map +1 -0
  6. package/dist/src/celo.js +44 -0
  7. package/dist/src/celoToken.d.ts +34 -0
  8. package/dist/src/celoToken.d.ts.map +1 -0
  9. package/dist/src/celoToken.js +73 -0
  10. package/dist/src/index.d.ts +6 -0
  11. package/dist/src/index.d.ts.map +1 -0
  12. package/dist/src/index.js +22 -0
  13. package/dist/src/lib/index.d.ts +8 -0
  14. package/dist/src/lib/index.d.ts.map +1 -0
  15. package/dist/src/lib/index.js +50 -0
  16. package/dist/src/lib/resources.d.ts +10 -0
  17. package/dist/src/lib/resources.d.ts.map +1 -0
  18. package/dist/src/lib/resources.js +25 -0
  19. package/dist/src/lib/stakingBuilder.d.ts +91 -0
  20. package/dist/src/lib/stakingBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/stakingBuilder.js +306 -0
  22. package/dist/src/lib/stakingCall.d.ts +7 -0
  23. package/dist/src/lib/stakingCall.d.ts.map +1 -0
  24. package/dist/src/lib/stakingCall.js +13 -0
  25. package/dist/src/lib/testnetTransactionBuilder.d.ts +15 -0
  26. package/dist/src/lib/testnetTransactionBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/testnetTransactionBuilder.js +68 -0
  28. package/dist/src/lib/transactionBuilder.d.ts +86 -0
  29. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/transactionBuilder.js +222 -0
  31. package/dist/src/lib/transferBuilder.d.ts +19 -0
  32. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/transferBuilder.js +27 -0
  34. package/dist/src/lib/types.d.ts +50 -0
  35. package/dist/src/lib/types.d.ts.map +1 -0
  36. package/dist/src/lib/types.js +223 -0
  37. package/dist/src/lib/utils.d.ts +18 -0
  38. package/dist/src/lib/utils.d.ts.map +1 -0
  39. package/dist/src/lib/utils.js +113 -0
  40. package/dist/src/register.d.ts +3 -0
  41. package/dist/src/register.d.ts.map +1 -0
  42. package/dist/src/register.js +15 -0
  43. package/dist/src/tcelo.d.ts +13 -0
  44. package/dist/src/tcelo.d.ts.map +1 -0
  45. package/dist/src/tcelo.js +19 -0
  46. package/package.json +8 -8
@@ -0,0 +1,222 @@
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 ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
8
+ const abstract_eth_1 = require("@bitgo/abstract-eth");
9
+ const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
10
+ const sdk_core_1 = require("@bitgo/sdk-core");
11
+ const stakingBuilder_1 = require("./stakingBuilder");
12
+ const utils_1 = require("./utils");
13
+ const transferBuilder_1 = require("./transferBuilder");
14
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
15
+ class TransactionBuilder extends sdk_coin_eth_1.TransactionBuilder {
16
+ constructor(_coinConfig) {
17
+ super(_coinConfig);
18
+ this._common = (0, utils_1.getCommon)(this._coinConfig.network.type);
19
+ this.transaction = new abstract_eth_1.Transaction(this._coinConfig, this._common);
20
+ }
21
+ /** @inheritdoc */
22
+ type(type) {
23
+ super.type(type);
24
+ this._stakingBuilder = undefined;
25
+ }
26
+ getTransactionData() {
27
+ switch (this._type) {
28
+ case sdk_core_1.TransactionType.StakingLock:
29
+ return this.buildLockStakeTransaction();
30
+ case sdk_core_1.TransactionType.StakingUnlock:
31
+ case sdk_core_1.TransactionType.StakingVote:
32
+ case sdk_core_1.TransactionType.StakingUnvote:
33
+ case sdk_core_1.TransactionType.StakingActivate:
34
+ case sdk_core_1.TransactionType.StakingWithdraw:
35
+ return this.buildStakingTransaction();
36
+ }
37
+ return super.getTransactionData();
38
+ }
39
+ /** @inheritdoc */
40
+ fromImplementation(rawTransaction) {
41
+ let tx;
42
+ if (/^0x?[0-9a-f]{1,}$/.test(rawTransaction.toLowerCase())) {
43
+ tx = abstract_eth_1.Transaction.fromSerialized(this._coinConfig, this._common, rawTransaction);
44
+ super.loadBuilderInput(tx.toJson());
45
+ }
46
+ else {
47
+ const txData = JSON.parse(rawTransaction);
48
+ tx = new abstract_eth_1.Transaction(this._coinConfig, this._common, txData);
49
+ }
50
+ return tx;
51
+ }
52
+ setTransactionTypeFields(decodedType, transactionJson) {
53
+ switch (decodedType) {
54
+ case sdk_core_1.TransactionType.StakingLock:
55
+ this._stakingBuilder = new stakingBuilder_1.StakingBuilder(this._coinConfig)
56
+ .type(sdk_core_1.StakingOperationTypes.LOCK)
57
+ .amount(transactionJson.value);
58
+ break;
59
+ case sdk_core_1.TransactionType.StakingUnlock:
60
+ case sdk_core_1.TransactionType.StakingVote:
61
+ case sdk_core_1.TransactionType.StakingUnvote:
62
+ case sdk_core_1.TransactionType.StakingActivate:
63
+ case sdk_core_1.TransactionType.StakingWithdraw:
64
+ this._stakingBuilder = new stakingBuilder_1.StakingBuilder(this._coinConfig, transactionJson.data);
65
+ break;
66
+ default:
67
+ super.setTransactionTypeFields(decodedType, transactionJson);
68
+ break;
69
+ }
70
+ }
71
+ /**
72
+ * Returns the smart contract encoded data
73
+ *
74
+ * @param {string[]} addresses - the contract signers
75
+ * @returns {string} - the smart contract encoded data
76
+ */
77
+ getContractData(addresses) {
78
+ const params = [addresses];
79
+ const resultEncodedParameters = ethereumjs_abi_1.default.rawEncode(sdk_coin_eth_1.walletSimpleConstructor, params)
80
+ .toString('hex')
81
+ .replace('0x', '');
82
+ return utils_1.walletSimpleByteCode + resultEncodedParameters;
83
+ }
84
+ // region Stake methods
85
+ /**
86
+ * Gets the staking lock builder if exist, or creates a new one for this transaction and returns it
87
+ * requires: amount
88
+ *
89
+ * @returns {StakingBuilder} the staking builder
90
+ */
91
+ lock() {
92
+ if (this._type !== sdk_core_1.TransactionType.StakingLock) {
93
+ throw new sdk_core_1.BuildTransactionError('Lock can only be set for Staking Lock transactions type');
94
+ }
95
+ return this.getBuilder(sdk_core_1.StakingOperationTypes.LOCK);
96
+ }
97
+ /**
98
+ * Gets the staking vote builder if exist, or creates a new one for this transaction and returns it
99
+ * requires: group, lesser, greater, amount
100
+ *
101
+ * @returns {StakingBuilder} the staking builder
102
+ */
103
+ vote() {
104
+ if (this._type !== sdk_core_1.TransactionType.StakingVote) {
105
+ throw new sdk_core_1.BuildTransactionError('Votes can only be set for a staking transaction');
106
+ }
107
+ return this.getBuilder(sdk_core_1.StakingOperationTypes.VOTE);
108
+ }
109
+ /**
110
+ * Gets the staking activate builder if exist, or creates a new one for this transaction and returns it
111
+ * requires: group
112
+ *
113
+ * @returns {StakingBuilder} the staking builder
114
+ */
115
+ activate() {
116
+ if (this._type !== sdk_core_1.TransactionType.StakingActivate) {
117
+ throw new sdk_core_1.BuildTransactionError('Activation can only be set for a staking transaction');
118
+ }
119
+ return this.getBuilder(sdk_core_1.StakingOperationTypes.ACTIVATE);
120
+ }
121
+ /**
122
+ * Gets the staking unlock builder if exist, or creates a new one for this transaction and returns it
123
+ * requires: amount
124
+ *
125
+ * @returns {StakingBuilder} the staking builder
126
+ */
127
+ unlock() {
128
+ if (this._type !== sdk_core_1.TransactionType.StakingUnlock) {
129
+ throw new sdk_core_1.BuildTransactionError('Unlock can only be set for Staking Unlock transactions type');
130
+ }
131
+ return this.getBuilder(sdk_core_1.StakingOperationTypes.UNLOCK);
132
+ }
133
+ /**
134
+ * Gets the staking unvote builder if exist, or creates a new one for this transaction and returns it
135
+ * requires: group, lesser, greater, amount, index
136
+ *
137
+ * @returns {StakingBuilder} the staking builder
138
+ */
139
+ unvote() {
140
+ if (this._type !== sdk_core_1.TransactionType.StakingUnvote) {
141
+ throw new sdk_core_1.BuildTransactionError('Unvote can only be set for a staking transaction');
142
+ }
143
+ return this.getBuilder(sdk_core_1.StakingOperationTypes.UNVOTE);
144
+ }
145
+ /**
146
+ * Gets the staking withdraw builder if exist, or creates a new one for this transaction and returns it
147
+ * requires: index (unlock list)
148
+ *
149
+ * @returns {StakingBuilder} the staking builder
150
+ */
151
+ withdraw() {
152
+ if (this._type !== sdk_core_1.TransactionType.StakingWithdraw) {
153
+ throw new sdk_core_1.BuildTransactionError('Withdraw can only be set for a staking transaction');
154
+ }
155
+ return this.getBuilder(sdk_core_1.StakingOperationTypes.WITHDRAW);
156
+ }
157
+ /** @inheritdoc */
158
+ transfer(data) {
159
+ if (this._type !== sdk_core_1.TransactionType.Send) {
160
+ throw new sdk_core_1.BuildTransactionError('Transfers can only be set for send transactions');
161
+ }
162
+ if (!this._transfer) {
163
+ this._transfer = new transferBuilder_1.TransferBuilder(data);
164
+ }
165
+ return this._transfer;
166
+ }
167
+ /**
168
+ * Get the appropriate builder for the selected type
169
+ *
170
+ * @param {StakingOperationTypes} type the selected type for the staking builder
171
+ * @returns {StakingBuilder} the staking builder for the selected type
172
+ */
173
+ getBuilder(type) {
174
+ if (!this._stakingBuilder) {
175
+ this._stakingBuilder = new stakingBuilder_1.StakingBuilder(this._coinConfig).type(type);
176
+ }
177
+ return this._stakingBuilder;
178
+ }
179
+ getStaking() {
180
+ if (!this._stakingBuilder) {
181
+ throw new sdk_core_1.BuildTransactionError('No staking information set');
182
+ }
183
+ return this._stakingBuilder.build();
184
+ }
185
+ buildLockStakeTransaction() {
186
+ const stake = this.getStaking();
187
+ const data = this.buildBase(stake.serialize());
188
+ data.to = stake.address;
189
+ data.value = stake.amount;
190
+ return data;
191
+ }
192
+ buildStakingTransaction() {
193
+ const stake = this.getStaking();
194
+ const data = this.buildBase(stake.serialize());
195
+ data.to = stake.address;
196
+ return data;
197
+ }
198
+ /**
199
+ * The value to send along with this transaction. 0 by default
200
+ *
201
+ * @param {string} value The value to send along with this transaction
202
+ */
203
+ value(value) {
204
+ this.validatePrecision(value, 'Value');
205
+ this._value = value;
206
+ }
207
+ validatePrecision(value, context) {
208
+ context = context ? context + ' ' : '';
209
+ const valueNumber = Number(value);
210
+ // the Celo library internally converts the string value to a number and converts to hex, which can result in a loss of precision for numbers with >= 15 significant digits
211
+ const valueBigNumber = new bignumber_js_1.default(valueNumber.toString(16), 16);
212
+ if (isNaN(valueNumber)) {
213
+ throw new sdk_core_1.BuildTransactionError(`${context}${value} is not a valid number`);
214
+ }
215
+ else if (!valueBigNumber.isEqualTo(valueNumber)) {
216
+ // TODO(BG-62714): remove this check once the celo library is fixed
217
+ throw new sdk_core_1.BuildTransactionError(`${context}${value} cannot be represented by a JS number, please try using fewer significant digits. We are working to support all values in the future.`);
218
+ }
219
+ }
220
+ }
221
+ exports.TransactionBuilder = TransactionBuilder;
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esb0VBQXlDO0FBQ3pDLHNEQUFrRDtBQUNsRCxzREFBbUg7QUFDbkgsOENBQWdHO0FBQ2hHLHFEQUFrRDtBQUVsRCxtQ0FBMEQ7QUFDMUQsdURBQW9EO0FBQ3BELGdFQUFxQztBQUVyQyxNQUFhLGtCQUFtQixTQUFRLGlDQUFxQjtJQUszRCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsaUJBQVMsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksMEJBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxJQUFxQjtRQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO0lBQ25DLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsS0FBSywwQkFBZSxDQUFDLFdBQVc7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDMUMsS0FBSywwQkFBZSxDQUFDLGFBQWEsQ0FBQztZQUNuQyxLQUFLLDBCQUFlLENBQUMsV0FBVyxDQUFDO1lBQ2pDLEtBQUssMEJBQWUsQ0FBQyxhQUFhLENBQUM7WUFDbkMsS0FBSywwQkFBZSxDQUFDLGVBQWUsQ0FBQztZQUNyQyxLQUFLLDBCQUFlLENBQUMsZUFBZTtn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Q29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IEV0aGVyZXVtQWJpIGZyb20gJ2V0aGVyZXVtanMtYWJpJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgYXMgRXRoVHJhbnNhY3Rpb25CdWlsZGVyLCBUeERhdGEsIHdhbGxldFNpbXBsZUNvbnN0cnVjdG9yIH0gZnJvbSAnQGJpdGdvL3Nkay1jb2luLWV0aCc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSwgU3Rha2luZ09wZXJhdGlvblR5cGVzIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFN0YWtpbmdCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nQnVpbGRlcic7XG5pbXBvcnQgeyBTdGFraW5nQ2FsbCB9IGZyb20gJy4vc3Rha2luZ0NhbGwnO1xuaW1wb3J0IHsgZ2V0Q29tbW9uLCB3YWxsZXRTaW1wbGVCeXRlQ29kZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgRXRoVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgLy8gU3Rha2luZyBzcGVjaWZpYyBwYXJhbWV0ZXJzXG4gIHByaXZhdGUgX3N0YWtpbmdCdWlsZGVyPzogU3Rha2luZ0J1aWxkZXI7XG4gIHByb3RlY3RlZCBfdHJhbnNmZXI6IFRyYW5zZmVyQnVpbGRlcjtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fY29tbW9uID0gZ2V0Q29tbW9uKHRoaXMuX2NvaW5Db25maWcubmV0d29yay50eXBlKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcsIHRoaXMuX2NvbW1vbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdHlwZSh0eXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBzdXBlci50eXBlKHR5cGUpO1xuICAgIHRoaXMuX3N0YWtpbmdCdWlsZGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zYWN0aW9uRGF0YSgpOiBUeERhdGEge1xuICAgIHN3aXRjaCAodGhpcy5fdHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2s6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkTG9ja1N0YWtlVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2s6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZTpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbnZvdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkU3Rha2luZ1RyYW5zYWN0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRUcmFuc2FjdGlvbkRhdGEoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgbGV0IHR4OiBUcmFuc2FjdGlvbjtcbiAgICBpZiAoL14weD9bMC05YS1mXXsxLH0kLy50ZXN0KHJhd1RyYW5zYWN0aW9uLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICB0eCA9IFRyYW5zYWN0aW9uLmZyb21TZXJpYWxpemVkKHRoaXMuX2NvaW5Db25maWcsIHRoaXMuX2NvbW1vbiwgcmF3VHJhbnNhY3Rpb24pO1xuICAgICAgc3VwZXIubG9hZEJ1aWxkZXJJbnB1dCh0eC50b0pzb24oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IEpTT04ucGFyc2UocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgdHggPSBuZXcgVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZywgdGhpcy5fY29tbW9uLCB0eERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VHJhbnNhY3Rpb25UeXBlRmllbGRzKGRlY29kZWRUeXBlOiBUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uSnNvbjogVHhEYXRhKTogdm9pZCB7XG4gICAgc3dpdGNoIChkZWNvZGVkVHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2s6XG4gICAgICAgIHRoaXMuX3N0YWtpbmdCdWlsZGVyID0gbmV3IFN0YWtpbmdCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpXG4gICAgICAgICAgLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLkxPQ0spXG4gICAgICAgICAgLmFtb3VudCh0cmFuc2FjdGlvbkpzb24udmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2s6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZTpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbnZvdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIHRoaXMuX3N0YWtpbmdCdWlsZGVyID0gbmV3IFN0YWtpbmdCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcsIHRyYW5zYWN0aW9uSnNvbi5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdXBlci5zZXRUcmFuc2FjdGlvblR5cGVGaWVsZHMoZGVjb2RlZFR5cGUsIHRyYW5zYWN0aW9uSnNvbik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzbWFydCBjb250cmFjdCBlbmNvZGVkIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYWRkcmVzc2VzIC0gdGhlIGNvbnRyYWN0IHNpZ25lcnNcbiAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgc21hcnQgY29udHJhY3QgZW5jb2RlZCBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29udHJhY3REYXRhKGFkZHJlc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtcyA9IFthZGRyZXNzZXNdO1xuICAgIGNvbnN0IHJlc3VsdEVuY29kZWRQYXJhbWV0ZXJzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKHdhbGxldFNpbXBsZUNvbnN0cnVjdG9yLCBwYXJhbXMpXG4gICAgICAudG9TdHJpbmcoJ2hleCcpXG4gICAgICAucmVwbGFjZSgnMHgnLCAnJyk7XG4gICAgcmV0dXJuIHdhbGxldFNpbXBsZUJ5dGVDb2RlICsgcmVzdWx0RW5jb2RlZFBhcmFtZXRlcnM7XG4gIH1cblxuICAvLyByZWdpb24gU3Rha2UgbWV0aG9kc1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFraW5nIGxvY2sgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGFtb3VudFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3Rha2luZ0J1aWxkZXJ9IHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICovXG4gIGxvY2soKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2spIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0xvY2sgY2FuIG9ubHkgYmUgc2V0IGZvciBTdGFraW5nIExvY2sgdHJhbnNhY3Rpb25zIHR5cGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWlsZGVyKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5MT0NLKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFraW5nIHZvdGUgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGdyb3VwLCBsZXNzZXIsIGdyZWF0ZXIsIGFtb3VudFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3Rha2luZ0J1aWxkZXJ9IHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICovXG4gIHZvdGUoKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1ZvdGUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1ZvdGVzIGNhbiBvbmx5IGJlIHNldCBmb3IgYSBzdGFraW5nIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0QnVpbGRlcihTdGFraW5nT3BlcmF0aW9uVHlwZXMuVk9URSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Rha2luZyBhY3RpdmF0ZSBidWlsZGVyIGlmIGV4aXN0LCBvciBjcmVhdGVzIGEgbmV3IG9uZSBmb3IgdGhpcyB0cmFuc2FjdGlvbiBhbmQgcmV0dXJucyBpdFxuICAgKiByZXF1aXJlczogZ3JvdXBcbiAgICpcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSB0aGUgc3Rha2luZyBidWlsZGVyXG4gICAqL1xuICBhY3RpdmF0ZSgpOiBTdGFraW5nQnVpbGRlciB7XG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0FjdGl2YXRpb24gY2FuIG9ubHkgYmUgc2V0IGZvciBhIHN0YWtpbmcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWlsZGVyKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5BQ1RJVkFURSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Rha2luZyB1bmxvY2sgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGFtb3VudFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3Rha2luZ0J1aWxkZXJ9IHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICovXG4gIHVubG9jaygpOiBTdGFraW5nQnVpbGRlciB7XG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVbmxvY2sgY2FuIG9ubHkgYmUgc2V0IGZvciBTdGFraW5nIFVubG9jayB0cmFuc2FjdGlvbnMgdHlwZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEJ1aWxkZXIoU3Rha2luZ09wZXJhdGlvblR5cGVzLlVOTE9DSyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3Rha2luZyB1bnZvdGUgYnVpbGRlciBpZiBleGlzdCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICogcmVxdWlyZXM6IGdyb3VwLCBsZXNzZXIsIGdyZWF0ZXIsIGFtb3VudCwgaW5kZXhcbiAgICpcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSB0aGUgc3Rha2luZyBidWlsZGVyXG4gICAqL1xuICB1bnZvdGUoKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1Vudm90ZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVW52b3RlIGNhbiBvbmx5IGJlIHNldCBmb3IgYSBzdGFraW5nIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0QnVpbGRlcihTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFraW5nIHdpdGhkcmF3IGJ1aWxkZXIgaWYgZXhpc3QsIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGZvciB0aGlzIHRyYW5zYWN0aW9uIGFuZCByZXR1cm5zIGl0XG4gICAqIHJlcXVpcmVzOiBpbmRleCAodW5sb2NrIGxpc3QpXG4gICAqXG4gICAqIEByZXR1cm5zIHtTdGFraW5nQnVpbGRlcn0gdGhlIHN0YWtpbmcgYnVpbGRlclxuICAgKi9cbiAgd2l0aGRyYXcoKTogU3Rha2luZ0J1aWxkZXIge1xuICAgIGlmICh0aGlzLl90eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdXaXRoZHJhdyBjYW4gb25seSBiZSBzZXQgZm9yIGEgc3Rha2luZyB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEJ1aWxkZXIoU3Rha2luZ09wZXJhdGlvblR5cGVzLldJVEhEUkFXKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0cmFuc2ZlcihkYXRhPzogc3RyaW5nKTogVHJhbnNmZXJCdWlsZGVyIHtcbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zZmVycyBjYW4gb25seSBiZSBzZXQgZm9yIHNlbmQgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fdHJhbnNmZXIpIHtcbiAgICAgIHRoaXMuX3RyYW5zZmVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcihkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgYnVpbGRlciBmb3IgdGhlIHNlbGVjdGVkIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtTdGFraW5nT3BlcmF0aW9uVHlwZXN9IHR5cGUgdGhlIHNlbGVjdGVkIHR5cGUgZm9yIHRoZSBzdGFraW5nIGJ1aWxkZXJcbiAgICogQHJldHVybnMge1N0YWtpbmdCdWlsZGVyfSB0aGUgc3Rha2luZyBidWlsZGVyIGZvciB0aGUgc2VsZWN0ZWQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRCdWlsZGVyKHR5cGU6IFN0YWtpbmdPcGVyYXRpb25UeXBlcyk6IFN0YWtpbmdCdWlsZGVyIHtcbiAgICBpZiAoIXRoaXMuX3N0YWtpbmdCdWlsZGVyKSB7XG4gICAgICB0aGlzLl9zdGFraW5nQnVpbGRlciA9IG5ldyBTdGFraW5nQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKS50eXBlKHR5cGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGFraW5nQnVpbGRlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3Rha2luZygpOiBTdGFraW5nQ2FsbCB7XG4gICAgaWYgKCF0aGlzLl9zdGFraW5nQnVpbGRlcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTm8gc3Rha2luZyBpbmZvcm1hdGlvbiBzZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWtpbmdCdWlsZGVyLmJ1aWxkKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTG9ja1N0YWtlVHJhbnNhY3Rpb24oKTogVHhEYXRhIHtcbiAgICBjb25zdCBzdGFrZSA9IHRoaXMuZ2V0U3Rha2luZygpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1aWxkQmFzZShzdGFrZS5zZXJpYWxpemUoKSk7XG4gICAgZGF0YS50byA9IHN0YWtlLmFkZHJlc3M7XG4gICAgZGF0YS52YWx1ZSA9IHN0YWtlLmFtb3VudDtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN0YWtpbmdUcmFuc2FjdGlvbigpOiBUeERhdGEge1xuICAgIGNvbnN0IHN0YWtlID0gdGhpcy5nZXRTdGFraW5nKCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuYnVpbGRCYXNlKHN0YWtlLnNlcmlhbGl6ZSgpKTtcbiAgICBkYXRhLnRvID0gc3Rha2UuYWRkcmVzcztcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBzZW5kIGFsb25nIHdpdGggdGhpcyB0cmFuc2FjdGlvbi4gMCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VuZCBhbG9uZyB3aXRoIHRoaXMgdHJhbnNhY3Rpb25cbiAgICovXG4gIHZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlUHJlY2lzaW9uKHZhbHVlLCAnVmFsdWUnKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgdmFsaWRhdGVQcmVjaXNpb24odmFsdWU6IHN0cmluZywgY29udGV4dD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID8gY29udGV4dCArICcgJyA6ICcnO1xuICAgIGNvbnN0IHZhbHVlTnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcbiAgICAvLyB0aGUgQ2VsbyBsaWJyYXJ5IGludGVybmFsbHkgY29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIG51bWJlciBhbmQgY29udmVydHMgdG8gaGV4LCB3aGljaCBjYW4gcmVzdWx0IGluIGEgbG9zcyBvZiBwcmVjaXNpb24gZm9yIG51bWJlcnMgd2l0aCA+PSAxNSBzaWduaWZpY2FudCBkaWdpdHNcbiAgICBjb25zdCB2YWx1ZUJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIodmFsdWVOdW1iZXIudG9TdHJpbmcoMTYpLCAxNik7XG4gICAgaWYgKGlzTmFOKHZhbHVlTnVtYmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgJHtjb250ZXh0fSR7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIG51bWJlcmApO1xuICAgIH0gZWxzZSBpZiAoIXZhbHVlQmlnTnVtYmVyLmlzRXF1YWxUbyh2YWx1ZU51bWJlcikpIHtcbiAgICAgIC8vIFRPRE8oQkctNjI3MTQpOiByZW1vdmUgdGhpcyBjaGVjayBvbmNlIHRoZSBjZWxvIGxpYnJhcnkgaXMgZml4ZWRcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGAke2NvbnRleHR9JHt2YWx1ZX0gY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IGEgSlMgbnVtYmVyLCBwbGVhc2UgdHJ5IHVzaW5nIGZld2VyIHNpZ25pZmljYW50IGRpZ2l0cy4gV2UgYXJlIHdvcmtpbmcgdG8gc3VwcG9ydCBhbGwgdmFsdWVzIGluIHRoZSBmdXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG59XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import { TransferBuilder as EthTransferBuilder } from '@bitgo/sdk-coin-eth';
2
+ /** CELO transfer builder */
3
+ export declare class TransferBuilder extends EthTransferBuilder {
4
+ /**
5
+ * Get the prefix used in generating an operation hash for sending tokens
6
+ * See https://github.com/BitGo/eth-multisig-v2/blob/master/contracts/coins/CeloWalletSimple.sol
7
+ *
8
+ * @returns the string prefix
9
+ */
10
+ protected getTokenOperationHashPrefix(): string;
11
+ /**
12
+ * Get the prefix used in generating an operation hash for sending native coins
13
+ * See https://github.com/BitGo/eth-multisig-v2/blob/master/contracts/coins/CeloWalletSimple.sol
14
+ *
15
+ * @returns the string prefix
16
+ */
17
+ protected getNativeOperationHashPrefix(): string;
18
+ }
19
+ //# 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,eAAe,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,4BAA4B;AAC5B,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD;;;;;OAKG;IACH,SAAS,CAAC,2BAA2B,IAAI,MAAM;IAI/C;;;;;OAKG;IACH,SAAS,CAAC,4BAA4B,IAAI,MAAM;CAGjD"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransferBuilder = void 0;
4
+ const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
5
+ /** CELO transfer builder */
6
+ class TransferBuilder extends sdk_coin_eth_1.TransferBuilder {
7
+ /**
8
+ * Get the prefix used in generating an operation hash for sending tokens
9
+ * See https://github.com/BitGo/eth-multisig-v2/blob/master/contracts/coins/CeloWalletSimple.sol
10
+ *
11
+ * @returns the string prefix
12
+ */
13
+ getTokenOperationHashPrefix() {
14
+ return 'CELO-ERC20';
15
+ }
16
+ /**
17
+ * Get the prefix used in generating an operation hash for sending native coins
18
+ * See https://github.com/BitGo/eth-multisig-v2/blob/master/contracts/coins/CeloWalletSimple.sol
19
+ *
20
+ * @returns the string prefix
21
+ */
22
+ getNativeOperationHashPrefix() {
23
+ return 'CELO';
24
+ }
25
+ }
26
+ exports.TransferBuilder = TransferBuilder;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQTRFO0FBRTVFLDRCQUE0QjtBQUM1QixNQUFhLGVBQWdCLFNBQVEsOEJBQWtCO0lBQ3JEOzs7OztPQUtHO0lBQ08sMkJBQTJCO1FBQ25DLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLDRCQUE0QjtRQUNwQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFwQkQsMENBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIGFzIEV0aFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJ0BiaXRnby9zZGstY29pbi1ldGgnO1xuXG4vKiogQ0VMTyB0cmFuc2ZlciBidWlsZGVyICovXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgRXRoVHJhbnNmZXJCdWlsZGVyIHtcbiAgLyoqXG4gICAqIEdldCB0aGUgcHJlZml4IHVzZWQgaW4gZ2VuZXJhdGluZyBhbiBvcGVyYXRpb24gaGFzaCBmb3Igc2VuZGluZyB0b2tlbnNcbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9CaXRHby9ldGgtbXVsdGlzaWctdjIvYmxvYi9tYXN0ZXIvY29udHJhY3RzL2NvaW5zL0NlbG9XYWxsZXRTaW1wbGUuc29sXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSBzdHJpbmcgcHJlZml4XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VG9rZW5PcGVyYXRpb25IYXNoUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdDRUxPLUVSQzIwJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHByZWZpeCB1c2VkIGluIGdlbmVyYXRpbmcgYW4gb3BlcmF0aW9uIGhhc2ggZm9yIHNlbmRpbmcgbmF0aXZlIGNvaW5zXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQml0R28vZXRoLW11bHRpc2lnLXYyL2Jsb2IvbWFzdGVyL2NvbnRyYWN0cy9jb2lucy9DZWxvV2FsbGV0U2ltcGxlLnNvbFxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgc3RyaW5nIHByZWZpeFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5hdGl2ZU9wZXJhdGlvbkhhc2hQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0NFTE8nO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,50 @@
1
+ import { EthLikeTransactionData, KeyPair, LegacyTxData } from '@bitgo/sdk-coin-eth';
2
+ export declare class CeloTransaction {
3
+ private raw;
4
+ private _from;
5
+ private _senderPubKey?;
6
+ private _signatures;
7
+ private _feeCurrency;
8
+ private _gatewayFeeRecipient;
9
+ private _gatewayFee;
10
+ nonce: Buffer;
11
+ gasLimit: Buffer;
12
+ gasPrice: Buffer;
13
+ data: Buffer;
14
+ value: Buffer;
15
+ to: Buffer;
16
+ v: Buffer;
17
+ r: Buffer;
18
+ s: Buffer;
19
+ /**
20
+ * Clean hex formatted values ensuring they have an even length
21
+ *
22
+ * @param numberValue Hex formatted number value. Example '0x01'
23
+ * @returns sanitized value
24
+ */
25
+ private sanitizeHexString;
26
+ constructor(tx: LegacyTxData);
27
+ private initRaw;
28
+ hash(includeSignature?: boolean): Buffer;
29
+ getSenderAddress(): Buffer;
30
+ getSenderPublicKey(): any;
31
+ serialize(): Buffer;
32
+ sign(privateKey: Buffer): void;
33
+ verifySignature(): boolean;
34
+ getChainId(): number;
35
+ }
36
+ export declare class CeloTransactionData implements EthLikeTransactionData {
37
+ private tx;
38
+ private deployedAddress?;
39
+ constructor(tx: CeloTransaction, deployedAddress?: string);
40
+ static fromJson(tx: LegacyTxData): CeloTransactionData;
41
+ sign(keyPair: KeyPair): Promise<void>;
42
+ /** @inheritdoc */
43
+ toJson(): LegacyTxData;
44
+ private setSignatureFields;
45
+ /** @inheritdoc */
46
+ toSerialized(): string;
47
+ private static txJsonToCeloTx;
48
+ private static encodedTxToJson;
49
+ }
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,sBAAsB,EAAsB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExG,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAC,CAAC;IACvB,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,WAAW,CAA0B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAgB;IAC1B,CAAC,EAAE,MAAM,CAAgB;IACzB,CAAC,EAAE,MAAM,CAAgB;IACzB,CAAC,EAAE,MAAM,CAAgB;IAGzB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;gBASb,EAAE,EAAE,YAAY;IAwB5B,OAAO,CAAC,OAAO;IAiBf,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM;IAYxC,gBAAgB,IAAI,MAAM;IAS1B,kBAAkB;IAQlB,SAAS,IAAI,MAAM;IAInB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI9B,eAAe,IAAI,OAAO;IAY1B,UAAU,IAAI,MAAM;CAOrB;AAED,qBAAa,mBAAoB,YAAW,sBAAsB;IAChE,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,eAAe,CAAC,CAAS;gBAErB,EAAE,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,MAAM;WAK3C,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,mBAAmB;IAoBvD,IAAI,CAAC,OAAO,EAAE,OAAO;IAe3B,kBAAkB;IAClB,MAAM,IAAI,YAAY;IAiCtB,OAAO,CAAC,kBAAkB;IAc1B,kBAAkB;IAClB,YAAY,IAAI,MAAM;IAItB,OAAO,CAAC,MAAM,CAAC,cAAc;IAS7B,OAAO,CAAC,MAAM,CAAC,eAAe;CAS/B"}
@@ -0,0 +1,223 @@
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.CeloTransactionData = exports.CeloTransaction = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const wallet_local_1 = require("@celo/wallet-local");
9
+ const ethereumjs_util_1 = require("ethereumjs-util");
10
+ const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
11
+ class CeloTransaction {
12
+ // TODO: validate if this needs to be moved to Utils class
13
+ /**
14
+ * Clean hex formatted values ensuring they have an even length
15
+ *
16
+ * @param numberValue Hex formatted number value. Example '0x01'
17
+ * @returns sanitized value
18
+ */
19
+ sanitizeHexString(numberValue) {
20
+ if (numberValue === '0x0' || numberValue == '') {
21
+ return '0x';
22
+ }
23
+ else if (numberValue.length % 2 === 0) {
24
+ return numberValue;
25
+ }
26
+ return '0x0' + numberValue.slice(2);
27
+ }
28
+ constructor(tx) {
29
+ this._feeCurrency = (0, ethereumjs_util_1.toBuffer)('0x');
30
+ this._gatewayFeeRecipient = (0, ethereumjs_util_1.toBuffer)('0x');
31
+ this._gatewayFee = (0, ethereumjs_util_1.toBuffer)('0x');
32
+ this.to = (0, ethereumjs_util_1.toBuffer)([]);
33
+ this.v = (0, ethereumjs_util_1.toBuffer)([]);
34
+ this.r = (0, ethereumjs_util_1.toBuffer)([]);
35
+ this.s = (0, ethereumjs_util_1.toBuffer)([]);
36
+ this.nonce = (0, ethereumjs_util_1.unpadBuffer)((0, ethereumjs_util_1.toBuffer)(tx.nonce));
37
+ this.gasLimit = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.gasLimit));
38
+ this.gasPrice = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.gasPrice));
39
+ this.data = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.data));
40
+ this.value = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.value));
41
+ if (tx.to) {
42
+ this.to = (0, ethereumjs_util_1.toBuffer)(tx.to);
43
+ }
44
+ if (tx.v) {
45
+ this.v = (0, ethereumjs_util_1.toBuffer)(tx.v);
46
+ }
47
+ if (tx.r) {
48
+ this.r = (0, ethereumjs_util_1.toBuffer)(tx.r);
49
+ }
50
+ if (tx.s) {
51
+ this.s = (0, ethereumjs_util_1.toBuffer)(tx.s);
52
+ }
53
+ if (tx.from) {
54
+ this._from = (0, ethereumjs_util_1.toBuffer)(tx.from);
55
+ }
56
+ this.initRaw();
57
+ }
58
+ initRaw() {
59
+ this.raw = [
60
+ this.nonce,
61
+ this.gasPrice,
62
+ this.gasLimit,
63
+ this._feeCurrency,
64
+ this._gatewayFeeRecipient,
65
+ this._gatewayFee,
66
+ this.to,
67
+ this.value,
68
+ this.data,
69
+ this.v,
70
+ this.r,
71
+ this.s,
72
+ ];
73
+ }
74
+ hash(includeSignature) {
75
+ let items;
76
+ if (includeSignature) {
77
+ items = this.raw;
78
+ }
79
+ else {
80
+ items = this.raw
81
+ .slice(0, 9)
82
+ .concat([(0, ethereumjs_util_1.toBuffer)(this.getChainId()), (0, ethereumjs_util_1.unpadBuffer)((0, ethereumjs_util_1.toBuffer)(0)), (0, ethereumjs_util_1.unpadBuffer)((0, ethereumjs_util_1.toBuffer)(0))]);
83
+ }
84
+ return (0, ethereumjs_util_1.rlphash)(items);
85
+ }
86
+ getSenderAddress() {
87
+ if (this._from) {
88
+ return this._from;
89
+ }
90
+ const pubKey = this.getSenderPublicKey();
91
+ this._from = (0, ethereumjs_util_1.publicToAddress)(pubKey);
92
+ return this._from;
93
+ }
94
+ getSenderPublicKey() {
95
+ if (this.verifySignature()) {
96
+ // If the signature was verified successfully the _senderPubKey field is defined
97
+ return this._senderPubKey;
98
+ }
99
+ throw new Error('Invalid Signature');
100
+ }
101
+ serialize() {
102
+ return ethereumjs_util_1.rlp.encode(this.raw);
103
+ }
104
+ sign(privateKey) {
105
+ this._signatures = [this.v, this.r, this.s, privateKey];
106
+ }
107
+ verifySignature() {
108
+ const msgHash = this.hash(false);
109
+ try {
110
+ const chainId = this.getChainId();
111
+ const v = (0, ethereumjs_util_1.bufferToInt)(this.v) - (2 * chainId + 35);
112
+ this._senderPubKey = (0, ethereumjs_util_1.ecrecover)(msgHash, v + 27, this.r, this.s);
113
+ }
114
+ catch (e) {
115
+ return false;
116
+ }
117
+ return !!this._senderPubKey;
118
+ }
119
+ getChainId() {
120
+ let chainId = (0, ethereumjs_util_1.bufferToInt)(this.v);
121
+ if (this.r.length && this.s.length) {
122
+ chainId = (chainId - 35) >> 1;
123
+ }
124
+ return chainId;
125
+ }
126
+ }
127
+ exports.CeloTransaction = CeloTransaction;
128
+ class CeloTransactionData {
129
+ constructor(tx, deployedAddress) {
130
+ this.tx = tx;
131
+ this.deployedAddress = deployedAddress;
132
+ }
133
+ static fromJson(tx) {
134
+ const chainId = (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(Number(tx.chainId)).toString(16));
135
+ return new CeloTransactionData(new CeloTransaction({
136
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
137
+ nonce: tx.nonce,
138
+ to: tx.to,
139
+ gasPrice: (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(tx.gasPrice).toString(16)),
140
+ gasLimit: (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(tx.gasLimit).toString(16)),
141
+ value: (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(tx.value).toString(16)),
142
+ data: tx.data === '0x' ? '' : tx.data,
143
+ from: tx.from,
144
+ s: tx.s,
145
+ r: tx.r,
146
+ v: tx.v || chainId,
147
+ }), tx.deployedAddress);
148
+ }
149
+ async sign(keyPair) {
150
+ const privateKey = (0, ethereumjs_util_1.addHexPrefix)(keyPair.getKeys().prv);
151
+ const data = CeloTransactionData.txJsonToCeloTx(this.toJson(), keyPair.getAddress());
152
+ const celoLocalWallet = new wallet_local_1.LocalWallet();
153
+ celoLocalWallet.addAccount(privateKey);
154
+ const rawTransaction = await celoLocalWallet.signTransaction(data);
155
+ const nonceBigNumber = new bignumber_js_1.default(rawTransaction.tx.nonce);
156
+ rawTransaction.tx.nonce = (0, ethereumjs_util_1.addHexPrefix)(nonceBigNumber.toString(16));
157
+ rawTransaction.raw = data.data === undefined ? '' : data.data;
158
+ rawTransaction.tx.gas = rawTransaction.tx.gas;
159
+ this.tx = new CeloTransaction(CeloTransactionData.encodedTxToJson(rawTransaction));
160
+ this.tx.sign((0, ethereumjs_util_1.toBuffer)(privateKey));
161
+ }
162
+ /** @inheritdoc */
163
+ toJson() {
164
+ const result = {
165
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
166
+ nonce: (0, ethereumjs_util_1.bufferToInt)(this.tx.nonce),
167
+ gasPrice: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(this.tx.gasPrice), 16).toString(10),
168
+ gasLimit: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(this.tx.gasLimit), 16).toString(10),
169
+ value: this.tx.value.length === 0 ? '0' : new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(this.tx.value), 16).toString(10),
170
+ data: (0, ethereumjs_util_1.bufferToHex)(this.tx.data),
171
+ id: (0, ethereumjs_util_1.addHexPrefix)((0, ethereumjs_util_1.bufferToHex)(this.tx.hash(true))),
172
+ };
173
+ if (this.tx.to && this.tx.to.length) {
174
+ result.to = (0, ethereumjs_util_1.bufferToHex)(this.tx.to);
175
+ }
176
+ if (this.tx.verifySignature()) {
177
+ result.from = (0, ethereumjs_util_1.bufferToHex)(this.tx.getSenderAddress());
178
+ }
179
+ const chainId = this.tx.getChainId();
180
+ if (chainId) {
181
+ result.chainId = chainId.toString();
182
+ }
183
+ if (this.deployedAddress) {
184
+ result.deployedAddress = this.deployedAddress;
185
+ }
186
+ this.setSignatureFields(result);
187
+ return result;
188
+ }
189
+ setSignatureFields(result) {
190
+ if (this.tx.v && this.tx.v.length) {
191
+ result.v = (0, ethereumjs_util_1.bufferToHex)(this.tx.v);
192
+ }
193
+ if (this.tx.r && this.tx.r.length) {
194
+ result.r = (0, ethereumjs_util_1.bufferToHex)(this.tx.r);
195
+ }
196
+ if (this.tx.s && this.tx.s.length) {
197
+ result.s = (0, ethereumjs_util_1.bufferToHex)(this.tx.s);
198
+ }
199
+ }
200
+ /** @inheritdoc */
201
+ toSerialized() {
202
+ return (0, ethereumjs_util_1.addHexPrefix)(this.tx.serialize().toString('hex'));
203
+ }
204
+ static txJsonToCeloTx(txJson, signer) {
205
+ // the celo library requires you to specify the signer address with the from field
206
+ return Object.assign({}, txJson, {
207
+ chainId: txJson.chainId === undefined ? 0 : parseInt(txJson.chainId, 10),
208
+ gas: txJson.gasLimit,
209
+ from: signer,
210
+ });
211
+ }
212
+ static encodedTxToJson(encodedTx) {
213
+ return {
214
+ ...encodedTx.tx,
215
+ _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
216
+ nonce: parseInt(encodedTx.tx.nonce, 16),
217
+ gasLimit: encodedTx.tx.gas,
218
+ data: encodedTx.raw,
219
+ };
220
+ }
221
+ }
222
+ exports.CeloTransactionData = CeloTransactionData;
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxxREFBaUQ7QUFDakQscURBVXlCO0FBRXpCLHNEQUF3RztBQUV4RyxNQUFhLGVBQWU7SUFrQjFCLDBEQUEwRDtJQUMxRDs7Ozs7T0FLRztJQUNLLGlCQUFpQixDQUFDLFdBQVc7UUFDbkMsSUFBSSxXQUFXLEtBQUssS0FBSyxJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUFZLEVBQWdCO1FBN0JwQixpQkFBWSxHQUFXLElBQUEsMEJBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUN0Qyx5QkFBb0IsR0FBVyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsZ0JBQVcsR0FBVyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFNN0MsT0FBRSxHQUFXLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixNQUFDLEdBQVcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLE1BQUMsR0FBVyxJQUFBLDBCQUFRLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBQyxHQUFXLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQztRQW1CdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFBLDZCQUFXLEVBQUMsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBQSwwQkFBUSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsMEJBQVEsRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBQSwwQkFBUSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFBLDBCQUFRLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sT0FBTztRQUNiLElBQUksQ0FBQyxHQUFHLEdBQUc7WUFDVCxJQUFJLENBQUMsS0FBSztZQUNWLElBQUksQ0FBQyxRQUFRO1lBQ2IsSUFBSSxDQUFDLFFBQVE7WUFDYixJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsb0JBQW9CO1lBQ3pCLElBQUksQ0FBQyxXQUFXO1lBQ2hCLElBQUksQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLEtBQUs7WUFDVixJQUFJLENBQUMsSUFBSTtZQUNULElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsQ0FBQztTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDLGdCQUEwQjtRQUM3QixJQUFJLEtBQUssQ0FBQztRQUNWLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRztpQkFDYixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDWCxNQUFNLENBQUMsQ0FBQyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBQSw2QkFBVyxFQUFDLElBQUEsMEJBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUEsNkJBQVcsRUFBQyxJQUFBLDBCQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELE9BQU8sSUFBQSx5QkFBTyxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFBLGlDQUFlLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUMzQixnRkFBZ0Y7WUFDaEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLHFCQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxDQUFDLFVBQWtCO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLElBQUEsNkJBQVcsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBQSwyQkFBUyxFQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksT0FBTyxHQUFHLElBQUEsNkJBQVcsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLE9BQU8sR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQW5JRCwwQ0FtSUM7QUFFRCxNQUFhLG1CQUFtQjtJQUk5QixZQUFZLEVBQW1CLEVBQUUsZUFBd0I7UUFDdkQsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFnQjtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFBLDhCQUFZLEVBQUMsSUFBSSxzQkFBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RSxPQUFPLElBQUksbUJBQW1CLENBQzVCLElBQUksZUFBZSxDQUFDO1lBQ2xCLEtBQUssRUFBRSxpQ0FBa0IsQ0FBQyxNQUFNO1lBQ2hDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztZQUNmLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNULFFBQVEsRUFBRSxJQUFBLDhCQUFZLEVBQUMsSUFBSSxzQkFBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0QsUUFBUSxFQUFFLElBQUEsOEJBQVksRUFBQyxJQUFJLHNCQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxLQUFLLEVBQUUsSUFBQSw4QkFBWSxFQUFDLElBQUksc0JBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSTtZQUNyQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7WUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDUCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDUCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxPQUFPO1NBQ25CLENBQUMsRUFDRixFQUFFLENBQUMsZUFBZSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZ0I7UUFDekIsTUFBTSxVQUFVLEdBQUcsSUFBQSw4QkFBWSxFQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFhLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sZUFBZSxHQUFHLElBQUksMEJBQVcsRUFBRSxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5FLE1BQU0sY0FBYyxHQUFHLElBQUksc0JBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUEsOEJBQVksRUFBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsY0FBYyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlELGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQzlDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxlQUFlLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBQSwwQkFBUSxFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixNQUFNO1FBQ0osTUFBTSxNQUFNLEdBQWlCO1lBQzNCLEtBQUssRUFBRSxpQ0FBa0IsQ0FBQyxNQUFNO1lBQ2hDLEtBQUssRUFBRSxJQUFBLDZCQUFXLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDakMsUUFBUSxFQUFFLElBQUksc0JBQVMsQ0FBQyxJQUFBLDZCQUFXLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLFFBQVEsRUFBRSxJQUFJLHNCQUFTLENBQUMsSUFBQSw2QkFBVyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLHNCQUFTLENBQUMsSUFBQSw2QkFBVyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNwRyxJQUFJLEVBQUUsSUFBQSw2QkFBVyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQy9CLEVBQUUsRUFBRSxJQUFBLDhCQUFZLEVBQUMsSUFBQSw2QkFBVyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDbEQsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFBLDZCQUFXLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFBLDZCQUFXLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDaEQsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBb0I7UUFDN0MsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUEsNkJBQVcsRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBQSw2QkFBVyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFBLDZCQUFXLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixZQUFZO1FBQ1YsT0FBTyxJQUFBLDhCQUFZLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFvQixFQUFFLE1BQWM7UUFDaEUsa0ZBQWtGO1FBQ2xGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFO1lBQy9CLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDeEUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3BCLElBQUksRUFBRSxNQUFNO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBNkI7UUFDMUQsT0FBTztZQUNMLEdBQUcsU0FBUyxDQUFDLEVBQUU7WUFDZixLQUFLLEVBQUUsaUNBQWtCLENBQUMsTUFBTTtZQUNoQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHO1lBQzFCLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRztTQUNwQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBbkhELGtEQW1IQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IExvY2FsV2FsbGV0IH0gZnJvbSAnQGNlbG8vd2FsbGV0LWxvY2FsJztcbmltcG9ydCB7XG4gIGFkZEhleFByZWZpeCxcbiAgdG9CdWZmZXIsXG4gIGJ1ZmZlclRvSGV4LFxuICBidWZmZXJUb0ludCxcbiAgcmxwLFxuICBybHBoYXNoLFxuICBlY3JlY292ZXIsXG4gIHB1YmxpY1RvQWRkcmVzcyxcbiAgdW5wYWRCdWZmZXIsXG59IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgeyBDZWxvVHgsIEVuY29kZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BjZWxvL2Nvbm5lY3QnO1xuaW1wb3J0IHsgRXRoTGlrZVRyYW5zYWN0aW9uRGF0YSwgRVRIVHJhbnNhY3Rpb25UeXBlLCBLZXlQYWlyLCBMZWdhY3lUeERhdGEgfSBmcm9tICdAYml0Z28vc2RrLWNvaW4tZXRoJztcblxuZXhwb3J0IGNsYXNzIENlbG9UcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgcmF3OiBCdWZmZXJbXTtcbiAgcHJpdmF0ZSBfZnJvbTogQnVmZmVyO1xuICBwcml2YXRlIF9zZW5kZXJQdWJLZXk/O1xuICBwcml2YXRlIF9zaWduYXR1cmVzOiBCdWZmZXJbXTtcbiAgcHJpdmF0ZSBfZmVlQ3VycmVuY3k6IEJ1ZmZlciA9IHRvQnVmZmVyKCcweCcpO1xuICBwcml2YXRlIF9nYXRld2F5RmVlUmVjaXBpZW50OiBCdWZmZXIgPSB0b0J1ZmZlcignMHgnKTtcbiAgcHJpdmF0ZSBfZ2F0ZXdheUZlZTogQnVmZmVyID0gdG9CdWZmZXIoJzB4Jyk7XG4gIG5vbmNlOiBCdWZmZXI7XG4gIGdhc0xpbWl0OiBCdWZmZXI7XG4gIGdhc1ByaWNlOiBCdWZmZXI7XG4gIGRhdGE6IEJ1ZmZlcjtcbiAgdmFsdWU6IEJ1ZmZlcjtcbiAgdG86IEJ1ZmZlciA9IHRvQnVmZmVyKFtdKTtcbiAgdjogQnVmZmVyID0gdG9CdWZmZXIoW10pO1xuICByOiBCdWZmZXIgPSB0b0J1ZmZlcihbXSk7XG4gIHM6IEJ1ZmZlciA9IHRvQnVmZmVyKFtdKTtcblxuICAvLyBUT0RPOiB2YWxpZGF0ZSBpZiB0aGlzIG5lZWRzIHRvIGJlIG1vdmVkIHRvIFV0aWxzIGNsYXNzXG4gIC8qKlxuICAgKiBDbGVhbiBoZXggZm9ybWF0dGVkIHZhbHVlcyBlbnN1cmluZyB0aGV5IGhhdmUgYW4gZXZlbiBsZW5ndGhcbiAgICpcbiAgICogQHBhcmFtIG51bWJlclZhbHVlIEhleCBmb3JtYXR0ZWQgbnVtYmVyIHZhbHVlLiBFeGFtcGxlICcweDAxJ1xuICAgKiBAcmV0dXJucyBzYW5pdGl6ZWQgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVIZXhTdHJpbmcobnVtYmVyVmFsdWUpIHtcbiAgICBpZiAobnVtYmVyVmFsdWUgPT09ICcweDAnIHx8IG51bWJlclZhbHVlID09ICcnKSB7XG4gICAgICByZXR1cm4gJzB4JztcbiAgICB9IGVsc2UgaWYgKG51bWJlclZhbHVlLmxlbmd0aCAlIDIgPT09IDApIHtcbiAgICAgIHJldHVybiBudW1iZXJWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuICcweDAnICsgbnVtYmVyVmFsdWUuc2xpY2UoMik7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0eDogTGVnYWN5VHhEYXRhKSB7XG4gICAgdGhpcy5ub25jZSA9IHVucGFkQnVmZmVyKHRvQnVmZmVyKHR4Lm5vbmNlKSk7XG4gICAgdGhpcy5nYXNMaW1pdCA9IHRvQnVmZmVyKHRoaXMuc2FuaXRpemVIZXhTdHJpbmcodHguZ2FzTGltaXQpKTtcbiAgICB0aGlzLmdhc1ByaWNlID0gdG9CdWZmZXIodGhpcy5zYW5pdGl6ZUhleFN0cmluZyh0eC5nYXNQcmljZSkpO1xuICAgIHRoaXMuZGF0YSA9IHRvQnVmZmVyKHRoaXMuc2FuaXRpemVIZXhTdHJpbmcodHguZGF0YSkpO1xuICAgIHRoaXMudmFsdWUgPSB0b0J1ZmZlcih0aGlzLnNhbml0aXplSGV4U3RyaW5nKHR4LnZhbHVlKSk7XG4gICAgaWYgKHR4LnRvKSB7XG4gICAgICB0aGlzLnRvID0gdG9CdWZmZXIodHgudG8pO1xuICAgIH1cbiAgICBpZiAodHgudikge1xuICAgICAgdGhpcy52ID0gdG9CdWZmZXIodHgudik7XG4gICAgfVxuICAgIGlmICh0eC5yKSB7XG4gICAgICB0aGlzLnIgPSB0b0J1ZmZlcih0eC5yKTtcbiAgICB9XG4gICAgaWYgKHR4LnMpIHtcbiAgICAgIHRoaXMucyA9IHRvQnVmZmVyKHR4LnMpO1xuICAgIH1cbiAgICBpZiAodHguZnJvbSkge1xuICAgICAgdGhpcy5fZnJvbSA9IHRvQnVmZmVyKHR4LmZyb20pO1xuICAgIH1cbiAgICB0aGlzLmluaXRSYXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFJhdygpIHtcbiAgICB0aGlzLnJhdyA9IFtcbiAgICAgIHRoaXMubm9uY2UsXG4gICAgICB0aGlzLmdhc1ByaWNlLFxuICAgICAgdGhpcy5nYXNMaW1pdCxcbiAgICAgIHRoaXMuX2ZlZUN1cnJlbmN5LFxuICAgICAgdGhpcy5fZ2F0ZXdheUZlZVJlY2lwaWVudCxcbiAgICAgIHRoaXMuX2dhdGV3YXlGZWUsXG4gICAgICB0aGlzLnRvLFxuICAgICAgdGhpcy52YWx1ZSxcbiAgICAgIHRoaXMuZGF0YSxcbiAgICAgIHRoaXMudixcbiAgICAgIHRoaXMucixcbiAgICAgIHRoaXMucyxcbiAgICBdO1xuICB9XG5cbiAgaGFzaChpbmNsdWRlU2lnbmF0dXJlPzogYm9vbGVhbik6IEJ1ZmZlciB7XG4gICAgbGV0IGl0ZW1zO1xuICAgIGlmIChpbmNsdWRlU2lnbmF0dXJlKSB7XG4gICAgICBpdGVtcyA9IHRoaXMucmF3O1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtcyA9IHRoaXMucmF3XG4gICAgICAgIC5zbGljZSgwLCA5KVxuICAgICAgICAuY29uY2F0KFt0b0J1ZmZlcih0aGlzLmdldENoYWluSWQoKSksIHVucGFkQnVmZmVyKHRvQnVmZmVyKDApKSwgdW5wYWRCdWZmZXIodG9CdWZmZXIoMCkpXSk7XG4gICAgfVxuICAgIHJldHVybiBybHBoYXNoKGl0ZW1zKTtcbiAgfVxuXG4gIGdldFNlbmRlckFkZHJlc3MoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fZnJvbSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Zyb207XG4gICAgfVxuICAgIGNvbnN0IHB1YktleSA9IHRoaXMuZ2V0U2VuZGVyUHVibGljS2V5KCk7XG4gICAgdGhpcy5fZnJvbSA9IHB1YmxpY1RvQWRkcmVzcyhwdWJLZXkpO1xuICAgIHJldHVybiB0aGlzLl9mcm9tO1xuICB9XG5cbiAgZ2V0U2VuZGVyUHVibGljS2V5KCkge1xuICAgIGlmICh0aGlzLnZlcmlmeVNpZ25hdHVyZSgpKSB7XG4gICAgICAvLyBJZiB0aGUgc2lnbmF0dXJlIHdhcyB2ZXJpZmllZCBzdWNjZXNzZnVsbHkgdGhlIF9zZW5kZXJQdWJLZXkgZmllbGQgaXMgZGVmaW5lZFxuICAgICAgcmV0dXJuIHRoaXMuX3NlbmRlclB1YktleTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFNpZ25hdHVyZScpO1xuICB9XG5cbiAgc2VyaWFsaXplKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHJscC5lbmNvZGUodGhpcy5yYXcpO1xuICB9XG5cbiAgc2lnbihwcml2YXRlS2V5OiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW3RoaXMudiwgdGhpcy5yLCB0aGlzLnMsIHByaXZhdGVLZXldO1xuICB9XG5cbiAgdmVyaWZ5U2lnbmF0dXJlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1zZ0hhc2ggPSB0aGlzLmhhc2goZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGFpbklkID0gdGhpcy5nZXRDaGFpbklkKCk7XG4gICAgICBjb25zdCB2ID0gYnVmZmVyVG9JbnQodGhpcy52KSAtICgyICogY2hhaW5JZCArIDM1KTtcbiAgICAgIHRoaXMuX3NlbmRlclB1YktleSA9IGVjcmVjb3Zlcihtc2dIYXNoLCB2ICsgMjcsIHRoaXMuciwgdGhpcy5zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMuX3NlbmRlclB1YktleTtcbiAgfVxuXG4gIGdldENoYWluSWQoKTogbnVtYmVyIHtcbiAgICBsZXQgY2hhaW5JZCA9IGJ1ZmZlclRvSW50KHRoaXMudik7XG4gICAgaWYgKHRoaXMuci5sZW5ndGggJiYgdGhpcy5zLmxlbmd0aCkge1xuICAgICAgY2hhaW5JZCA9IChjaGFpbklkIC0gMzUpID4+IDE7XG4gICAgfVxuICAgIHJldHVybiBjaGFpbklkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDZWxvVHJhbnNhY3Rpb25EYXRhIGltcGxlbWVudHMgRXRoTGlrZVRyYW5zYWN0aW9uRGF0YSB7XG4gIHByaXZhdGUgdHg6IENlbG9UcmFuc2FjdGlvbjtcbiAgcHJpdmF0ZSBkZXBsb3llZEFkZHJlc3M/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodHg6IENlbG9UcmFuc2FjdGlvbiwgZGVwbG95ZWRBZGRyZXNzPzogc3RyaW5nKSB7XG4gICAgdGhpcy50eCA9IHR4O1xuICAgIHRoaXMuZGVwbG95ZWRBZGRyZXNzID0gZGVwbG95ZWRBZGRyZXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tSnNvbih0eDogTGVnYWN5VHhEYXRhKTogQ2Vsb1RyYW5zYWN0aW9uRGF0YSB7XG4gICAgY29uc3QgY2hhaW5JZCA9IGFkZEhleFByZWZpeChuZXcgQmlnTnVtYmVyKE51bWJlcih0eC5jaGFpbklkKSkudG9TdHJpbmcoMTYpKTtcbiAgICByZXR1cm4gbmV3IENlbG9UcmFuc2FjdGlvbkRhdGEoXG4gICAgICBuZXcgQ2Vsb1RyYW5zYWN0aW9uKHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIG5vbmNlOiB0eC5ub25jZSxcbiAgICAgICAgdG86IHR4LnRvLFxuICAgICAgICBnYXNQcmljZTogYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIodHguZ2FzUHJpY2UpLnRvU3RyaW5nKDE2KSksXG4gICAgICAgIGdhc0xpbWl0OiBhZGRIZXhQcmVmaXgobmV3IEJpZ051bWJlcih0eC5nYXNMaW1pdCkudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgdmFsdWU6IGFkZEhleFByZWZpeChuZXcgQmlnTnVtYmVyKHR4LnZhbHVlKS50b1N0cmluZygxNikpLFxuICAgICAgICBkYXRhOiB0eC5kYXRhID09PSAnMHgnID8gJycgOiB0eC5kYXRhLFxuICAgICAgICBmcm9tOiB0eC5mcm9tLFxuICAgICAgICBzOiB0eC5zLFxuICAgICAgICByOiB0eC5yLFxuICAgICAgICB2OiB0eC52IHx8IGNoYWluSWQsXG4gICAgICB9KSxcbiAgICAgIHR4LmRlcGxveWVkQWRkcmVzc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXIpIHtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gYWRkSGV4UHJlZml4KGtleVBhaXIuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGRhdGEgPSBDZWxvVHJhbnNhY3Rpb25EYXRhLnR4SnNvblRvQ2Vsb1R4KHRoaXMudG9Kc29uKCksIGtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICBjb25zdCBjZWxvTG9jYWxXYWxsZXQgPSBuZXcgTG9jYWxXYWxsZXQoKTtcbiAgICBjZWxvTG9jYWxXYWxsZXQuYWRkQWNjb3VudChwcml2YXRlS2V5KTtcbiAgICBjb25zdCByYXdUcmFuc2FjdGlvbiA9IGF3YWl0IGNlbG9Mb2NhbFdhbGxldC5zaWduVHJhbnNhY3Rpb24oZGF0YSk7XG5cbiAgICBjb25zdCBub25jZUJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIocmF3VHJhbnNhY3Rpb24udHgubm9uY2UpO1xuICAgIHJhd1RyYW5zYWN0aW9uLnR4Lm5vbmNlID0gYWRkSGV4UHJlZml4KG5vbmNlQmlnTnVtYmVyLnRvU3RyaW5nKDE2KSk7XG4gICAgcmF3VHJhbnNhY3Rpb24ucmF3ID0gZGF0YS5kYXRhID09PSB1bmRlZmluZWQgPyAnJyA6IGRhdGEuZGF0YTtcbiAgICByYXdUcmFuc2FjdGlvbi50eC5nYXMgPSByYXdUcmFuc2FjdGlvbi50eC5nYXM7XG4gICAgdGhpcy50eCA9IG5ldyBDZWxvVHJhbnNhY3Rpb24oQ2Vsb1RyYW5zYWN0aW9uRGF0YS5lbmNvZGVkVHhUb0pzb24ocmF3VHJhbnNhY3Rpb24pKTtcbiAgICB0aGlzLnR4LnNpZ24odG9CdWZmZXIocHJpdmF0ZUtleSkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBMZWdhY3lUeERhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogTGVnYWN5VHhEYXRhID0ge1xuICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICBub25jZTogYnVmZmVyVG9JbnQodGhpcy50eC5ub25jZSksXG4gICAgICBnYXNQcmljZTogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0aGlzLnR4Lmdhc1ByaWNlKSwgMTYpLnRvU3RyaW5nKDEwKSxcbiAgICAgIGdhc0xpbWl0OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRoaXMudHguZ2FzTGltaXQpLCAxNikudG9TdHJpbmcoMTApLFxuICAgICAgdmFsdWU6IHRoaXMudHgudmFsdWUubGVuZ3RoID09PSAwID8gJzAnIDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0aGlzLnR4LnZhbHVlKSwgMTYpLnRvU3RyaW5nKDEwKSxcbiAgICAgIGRhdGE6IGJ1ZmZlclRvSGV4KHRoaXMudHguZGF0YSksXG4gICAgICBpZDogYWRkSGV4UHJlZml4KGJ1ZmZlclRvSGV4KHRoaXMudHguaGFzaCh0cnVlKSkpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy50eC50byAmJiB0aGlzLnR4LnRvLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnRvID0gYnVmZmVyVG9IZXgodGhpcy50eC50byk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHgudmVyaWZ5U2lnbmF0dXJlKCkpIHtcbiAgICAgIHJlc3VsdC5mcm9tID0gYnVmZmVyVG9IZXgodGhpcy50eC5nZXRTZW5kZXJBZGRyZXNzKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYWluSWQgPSB0aGlzLnR4LmdldENoYWluSWQoKTtcbiAgICBpZiAoY2hhaW5JZCkge1xuICAgICAgcmVzdWx0LmNoYWluSWQgPSBjaGFpbklkLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVwbG95ZWRBZGRyZXNzKSB7XG4gICAgICByZXN1bHQuZGVwbG95ZWRBZGRyZXNzID0gdGhpcy5kZXBsb3llZEFkZHJlc3M7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTaWduYXR1cmVGaWVsZHMocmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNldFNpZ25hdHVyZUZpZWxkcyhyZXN1bHQ6IExlZ2FjeVR4RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR4LnYgJiYgdGhpcy50eC52Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnYgPSBidWZmZXJUb0hleCh0aGlzLnR4LnYpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR4LnIgJiYgdGhpcy50eC5yLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnIgPSBidWZmZXJUb0hleCh0aGlzLnR4LnIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR4LnMgJiYgdGhpcy50eC5zLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnMgPSBidWZmZXJUb0hleCh0aGlzLnR4LnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b1NlcmlhbGl6ZWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYWRkSGV4UHJlZml4KHRoaXMudHguc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHR4SnNvblRvQ2Vsb1R4KHR4SnNvbjogTGVnYWN5VHhEYXRhLCBzaWduZXI6IHN0cmluZyk6IENlbG9UeCB7XG4gICAgLy8gdGhlIGNlbG8gbGlicmFyeSByZXF1aXJlcyB5b3UgdG8gc3BlY2lmeSB0aGUgc2lnbmVyIGFkZHJlc3Mgd2l0aCB0aGUgZnJvbSBmaWVsZFxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0eEpzb24sIHtcbiAgICAgIGNoYWluSWQ6IHR4SnNvbi5jaGFpbklkID09PSB1bmRlZmluZWQgPyAwIDogcGFyc2VJbnQodHhKc29uLmNoYWluSWQsIDEwKSxcbiAgICAgIGdhczogdHhKc29uLmdhc0xpbWl0LFxuICAgICAgZnJvbTogc2lnbmVyLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZW5jb2RlZFR4VG9Kc29uKGVuY29kZWRUeDogRW5jb2RlZFRyYW5zYWN0aW9uKTogTGVnYWN5VHhEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZW5jb2RlZFR4LnR4LFxuICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICBub25jZTogcGFyc2VJbnQoZW5jb2RlZFR4LnR4Lm5vbmNlLCAxNiksXG4gICAgICBnYXNMaW1pdDogZW5jb2RlZFR4LnR4LmdhcyxcbiAgICAgIGRhdGE6IGVuY29kZWRUeC5yYXcsXG4gICAgfTtcbiAgfVxufVxuIl19