@curvefi/llamalend-api 1.0.2

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 (125) hide show
  1. package/.eslintrc.json +40 -0
  2. package/.github/workflows/lint.yml +15 -0
  3. package/.github/workflows/publish.yml +55 -0
  4. package/LICENSE +21 -0
  5. package/README.md +1976 -0
  6. package/lib/cache/index.d.ts +14 -0
  7. package/lib/cache/index.js +31 -0
  8. package/lib/constants/L2Networks.d.ts +1 -0
  9. package/lib/constants/L2Networks.js +1 -0
  10. package/lib/constants/abis/Controller.json +1027 -0
  11. package/lib/constants/abis/ERC20.json +222 -0
  12. package/lib/constants/abis/ERC4626.json +1674 -0
  13. package/lib/constants/abis/GaugeController.json +794 -0
  14. package/lib/constants/abis/GaugeFactoryMainnet.json +1 -0
  15. package/lib/constants/abis/GaugeFactorySidechain.json +475 -0
  16. package/lib/constants/abis/GaugeV5.json +958 -0
  17. package/lib/constants/abis/LeverageZap.json +35 -0
  18. package/lib/constants/abis/Llamma.json +984 -0
  19. package/lib/constants/abis/Minter.json +1 -0
  20. package/lib/constants/abis/MonetaryPolicy.json +221 -0
  21. package/lib/constants/abis/OneWayLendingFactoryABI.json +899 -0
  22. package/lib/constants/abis/SidechainGauge.json +939 -0
  23. package/lib/constants/abis/Vault.json +721 -0
  24. package/lib/constants/abis/crvUSD/DeleverageZap.json +248 -0
  25. package/lib/constants/abis/crvUSD/Factory.json +514 -0
  26. package/lib/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
  27. package/lib/constants/abis/crvUSD/LeverageZap.json +312 -0
  28. package/lib/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
  29. package/lib/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
  30. package/lib/constants/abis/crvUSD/PegKeeper.json +411 -0
  31. package/lib/constants/abis/crvUSD/controller.json +991 -0
  32. package/lib/constants/abis/crvUSD/llamma.json +984 -0
  33. package/lib/constants/abis/gas_oracle_optimism.json +149 -0
  34. package/lib/constants/abis/gas_oracle_optimism_blob.json +203 -0
  35. package/lib/constants/aliases.d.ts +16 -0
  36. package/lib/constants/aliases.js +124 -0
  37. package/lib/constants/coins.d.ts +16 -0
  38. package/lib/constants/coins.js +24 -0
  39. package/lib/constants/llammas.d.ts +2 -0
  40. package/lib/constants/llammas.js +96 -0
  41. package/lib/constants/utils.d.ts +4 -0
  42. package/lib/constants/utils.js +27 -0
  43. package/lib/external-api.d.ts +13 -0
  44. package/lib/external-api.js +436 -0
  45. package/lib/index.d.ts +104 -0
  46. package/lib/index.js +123 -0
  47. package/lib/interfaces.d.ts +228 -0
  48. package/lib/interfaces.js +1 -0
  49. package/lib/lendMarkets/LendMarketTemplate.d.ts +510 -0
  50. package/lib/lendMarkets/LendMarketTemplate.js +4682 -0
  51. package/lib/lendMarkets/index.d.ts +3 -0
  52. package/lib/lendMarkets/index.js +3 -0
  53. package/lib/lendMarkets/lendMarketConstructor.d.ts +2 -0
  54. package/lib/lendMarkets/lendMarketConstructor.js +6 -0
  55. package/lib/llamalend.d.ts +80 -0
  56. package/lib/llamalend.js +878 -0
  57. package/lib/mintMarkets/MintMarketTemplate.d.ts +308 -0
  58. package/lib/mintMarkets/MintMarketTemplate.js +2998 -0
  59. package/lib/mintMarkets/index.d.ts +3 -0
  60. package/lib/mintMarkets/index.js +3 -0
  61. package/lib/mintMarkets/mintMarketConstructor.d.ts +2 -0
  62. package/lib/mintMarkets/mintMarketConstructor.js +4 -0
  63. package/lib/st-crvUSD.d.ts +35 -0
  64. package/lib/st-crvUSD.js +505 -0
  65. package/lib/utils.d.ts +58 -0
  66. package/lib/utils.js +661 -0
  67. package/package.json +42 -0
  68. package/src/cache/index.ts +41 -0
  69. package/src/constants/L2Networks.ts +1 -0
  70. package/src/constants/abis/Controller.json +1027 -0
  71. package/src/constants/abis/ERC20.json +222 -0
  72. package/src/constants/abis/ERC4626.json +1674 -0
  73. package/src/constants/abis/GaugeController.json +794 -0
  74. package/src/constants/abis/GaugeFactoryMainnet.json +1 -0
  75. package/src/constants/abis/GaugeFactorySidechain.json +475 -0
  76. package/src/constants/abis/GaugeV5.json +958 -0
  77. package/src/constants/abis/LeverageZap.json +35 -0
  78. package/src/constants/abis/Llamma.json +984 -0
  79. package/src/constants/abis/Minter.json +1 -0
  80. package/src/constants/abis/MonetaryPolicy.json +221 -0
  81. package/src/constants/abis/OneWayLendingFactoryABI.json +899 -0
  82. package/src/constants/abis/SidechainGauge.json +939 -0
  83. package/src/constants/abis/Vault.json +721 -0
  84. package/src/constants/abis/crvUSD/DeleverageZap.json +248 -0
  85. package/src/constants/abis/crvUSD/ERC20.json +222 -0
  86. package/src/constants/abis/crvUSD/Factory.json +514 -0
  87. package/src/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
  88. package/src/constants/abis/crvUSD/LeverageZap.json +312 -0
  89. package/src/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
  90. package/src/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
  91. package/src/constants/abis/crvUSD/PegKeeper.json +411 -0
  92. package/src/constants/abis/crvUSD/controller.json +991 -0
  93. package/src/constants/abis/crvUSD/llamma.json +984 -0
  94. package/src/constants/abis/gas_oracle_optimism.json +149 -0
  95. package/src/constants/abis/gas_oracle_optimism_blob.json +203 -0
  96. package/src/constants/aliases.ts +141 -0
  97. package/src/constants/coins.ts +41 -0
  98. package/src/constants/llammas.ts +99 -0
  99. package/src/constants/utils.ts +33 -0
  100. package/src/external-api.ts +325 -0
  101. package/src/index.ts +128 -0
  102. package/src/interfaces.ts +237 -0
  103. package/src/lendMarkets/LendMarketTemplate.ts +3022 -0
  104. package/src/lendMarkets/index.ts +7 -0
  105. package/src/lendMarkets/lendMarketConstructor.ts +7 -0
  106. package/src/llamalend.ts +785 -0
  107. package/src/mintMarkets/MintMarketTemplate.ts +1781 -0
  108. package/src/mintMarkets/index.ts +7 -0
  109. package/src/mintMarkets/mintMarketConstructor.ts +5 -0
  110. package/src/st-crvUSD.ts +244 -0
  111. package/src/utils.ts +497 -0
  112. package/test/fetch.test.ts +152 -0
  113. package/test/general.test.ts +216 -0
  114. package/test/leverageBorrowMore.test.ts +245 -0
  115. package/test/leverageCreateLoan.test.ts +236 -0
  116. package/test/leverageRepay.test.ts +240 -0
  117. package/test/readme.test.ts +475 -0
  118. package/test/selfLiquidate.test.ts +57 -0
  119. package/test/selfLiquidateCrvUSD.test.ts +54 -0
  120. package/test/st_crvUSD.test.ts +68 -0
  121. package/test/swap.test.ts +62 -0
  122. package/test/swapCrvUSD.test.ts +56 -0
  123. package/test/vault.test.ts +112 -0
  124. package/tsconfig.build.json +10 -0
  125. package/tsconfig.json +72 -0
@@ -0,0 +1,2998 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import memoize from "memoizee";
49
+ import BigNumber from "bignumber.js";
50
+ import { llamalend } from "../llamalend.js";
51
+ import { _getAddress, parseUnits, BN, toBN, fromBN, getBalances, ensureAllowance, hasAllowance, ensureAllowanceEstimateGas, isEth, _cutZeros, formatUnits, smartNumber, MAX_ALLOWANCE, MAX_ACTIVE_BAND, _mulBy1_3, DIGas, } from "../utils";
52
+ import { _getUserCollateralCrvUsd } from "../external-api.js";
53
+ var MintMarketTemplate = /** @class */ (function () {
54
+ function MintMarketTemplate(id) {
55
+ var _this = this;
56
+ // ---------------- STATS ----------------
57
+ this.statsParameters = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
58
+ var llammaContract, controllerContract, monetaryPolicyContract, calls, _a, _fee, _admin_fee, _rate, _mp_rate, _liquidation_discount, _loan_discount, _c, fee, admin_fee, liquidation_discount, loan_discount, rate, future_rate;
59
+ return __generator(this, function (_d) {
60
+ switch (_d.label) {
61
+ case 0:
62
+ llammaContract = llamalend.contracts[this.address].multicallContract;
63
+ controllerContract = llamalend.contracts[this.controller].multicallContract;
64
+ monetaryPolicyContract = llamalend.contracts[this.monetaryPolicy].multicallContract;
65
+ calls = [
66
+ llammaContract.fee(),
67
+ llammaContract.admin_fee(),
68
+ llammaContract.rate(),
69
+ "rate(address)" in llamalend.contracts[this.monetaryPolicy].contract ? monetaryPolicyContract.rate(this.controller) : monetaryPolicyContract.rate(),
70
+ controllerContract.liquidation_discount(),
71
+ controllerContract.loan_discount(),
72
+ ];
73
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
74
+ case 1:
75
+ _a = _d.sent(), _fee = _a[0], _admin_fee = _a[1], _rate = _a[2], _mp_rate = _a[3], _liquidation_discount = _a[4], _loan_discount = _a[5];
76
+ _c = [_fee, _admin_fee, _liquidation_discount, _loan_discount]
77
+ .map(function (x) { return formatUnits(x * BigInt(100)); }), fee = _c[0], admin_fee = _c[1], liquidation_discount = _c[2], loan_discount = _c[3];
78
+ rate = String(((Math.pow(2.718281828459, (toBN(_rate).times(365).times(86400)).toNumber())) - 1) * 100);
79
+ future_rate = String(((Math.pow(2.718281828459, (toBN(_mp_rate).times(365).times(86400)).toNumber())) - 1) * 100);
80
+ return [2 /*return*/, { fee: fee, admin_fee: admin_fee, rate: rate, future_rate: future_rate, liquidation_discount: liquidation_discount, loan_discount: loan_discount }];
81
+ }
82
+ });
83
+ }); }, {
84
+ promise: true,
85
+ maxAge: 5 * 60 * 1000, // 5m
86
+ });
87
+ this.statsMaxMinBands = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
88
+ var llammaContract, calls1;
89
+ return __generator(this, function (_a) {
90
+ switch (_a.label) {
91
+ case 0:
92
+ llammaContract = llamalend.contracts[this.address].multicallContract;
93
+ calls1 = [
94
+ llammaContract.max_band(),
95
+ llammaContract.min_band(),
96
+ ];
97
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls1)];
98
+ case 1: return [2 /*return*/, (_a.sent()).map(function (_b) { return _b.toNumber(); })];
99
+ }
100
+ });
101
+ }); }, {
102
+ promise: true,
103
+ maxAge: 60 * 1000, // 1m
104
+ });
105
+ this.statsActiveBand = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
106
+ return __generator(this, function (_a) {
107
+ switch (_a.label) {
108
+ case 0: return [4 /*yield*/, llamalend.contracts[this.address].contract.active_band()];
109
+ case 1: return [2 /*return*/, (_a.sent()).toNumber()];
110
+ }
111
+ });
112
+ }); }, {
113
+ promise: true,
114
+ maxAge: 60 * 1000, // 1m
115
+ });
116
+ this.statsTotalSupply = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
117
+ var controllerContract, calls, _a, _minted, _redeemed;
118
+ return __generator(this, function (_c) {
119
+ switch (_c.label) {
120
+ case 0:
121
+ controllerContract = llamalend.contracts[this.controller].multicallContract;
122
+ calls = [controllerContract.minted(), controllerContract.redeemed()];
123
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
124
+ case 1:
125
+ _a = _c.sent(), _minted = _a[0], _redeemed = _a[1];
126
+ return [2 /*return*/, toBN(_minted).minus(toBN(_redeemed)).toString()];
127
+ }
128
+ });
129
+ }); }, {
130
+ promise: true,
131
+ maxAge: 60 * 1000, // 1m
132
+ });
133
+ this.statsTotalDebt = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
134
+ var debt;
135
+ return __generator(this, function (_a) {
136
+ switch (_a.label) {
137
+ case 0: return [4 /*yield*/, llamalend.contracts[this.controller].contract.total_debt(llamalend.constantOptions)];
138
+ case 1:
139
+ debt = _a.sent();
140
+ return [2 /*return*/, formatUnits(debt)];
141
+ }
142
+ });
143
+ }); }, {
144
+ promise: true,
145
+ maxAge: 60 * 1000, // 1m
146
+ });
147
+ this.statsTotalStablecoin = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
148
+ var stablecoinContract, ammContract, _a, _balance, _fee;
149
+ return __generator(this, function (_c) {
150
+ switch (_c.label) {
151
+ case 0:
152
+ stablecoinContract = llamalend.contracts[llamalend.address].multicallContract;
153
+ ammContract = llamalend.contracts[this.address].multicallContract;
154
+ return [4 /*yield*/, llamalend.multicallProvider.all([
155
+ stablecoinContract.balanceOf(this.address),
156
+ ammContract.admin_fees_x(),
157
+ ])];
158
+ case 1:
159
+ _a = _c.sent(), _balance = _a[0], _fee = _a[1];
160
+ return [2 /*return*/, toBN(_balance).minus(toBN(_fee)).toString()];
161
+ }
162
+ });
163
+ }); }, {
164
+ promise: true,
165
+ maxAge: 60 * 1000, // 1m
166
+ });
167
+ this.statsTotalCollateral = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
168
+ var collateralContract, ammContract, _a, _balance, _fee;
169
+ return __generator(this, function (_c) {
170
+ switch (_c.label) {
171
+ case 0:
172
+ collateralContract = llamalend.contracts[isEth(this.collateral) ? llamalend.constants.WETH : this.collateral].multicallContract;
173
+ ammContract = llamalend.contracts[this.address].multicallContract;
174
+ return [4 /*yield*/, llamalend.multicallProvider.all([
175
+ collateralContract.balanceOf(this.address),
176
+ ammContract.admin_fees_y(),
177
+ ])];
178
+ case 1:
179
+ _a = _c.sent(), _balance = _a[0], _fee = _a[1];
180
+ return [2 /*return*/, toBN(_balance, this.collateralDecimals).minus(toBN(_fee, this.collateralDecimals)).toString()];
181
+ }
182
+ });
183
+ }); }, {
184
+ promise: true,
185
+ maxAge: 60 * 1000, // 1m
186
+ });
187
+ this.statsCapAndAvailable = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
188
+ var factoryContract, crvusdContract, _a, _cap, _available;
189
+ return __generator(this, function (_c) {
190
+ switch (_c.label) {
191
+ case 0:
192
+ factoryContract = llamalend.contracts[llamalend.constants.FACTORY].multicallContract;
193
+ crvusdContract = llamalend.contracts[llamalend.address].multicallContract;
194
+ return [4 /*yield*/, llamalend.multicallProvider.all([
195
+ factoryContract.debt_ceiling(this.controller),
196
+ crvusdContract.balanceOf(this.controller),
197
+ ])];
198
+ case 1:
199
+ _a = _c.sent(), _cap = _a[0], _available = _a[1];
200
+ return [2 /*return*/, { "cap": llamalend.formatUnits(_cap), "available": llamalend.formatUnits(_available) }];
201
+ }
202
+ });
203
+ }); }, {
204
+ promise: true,
205
+ maxAge: 60 * 1000, // 1m
206
+ });
207
+ this.basePrice = memoize(function () { return __awaiter(_this, void 0, void 0, function () {
208
+ var _price;
209
+ return __generator(this, function (_a) {
210
+ switch (_a.label) {
211
+ case 0: return [4 /*yield*/, llamalend.contracts[this.address].contract.get_base_price(llamalend.constantOptions)];
212
+ case 1:
213
+ _price = _a.sent();
214
+ return [2 /*return*/, formatUnits(_price)];
215
+ }
216
+ });
217
+ }); }, {
218
+ promise: true,
219
+ maxAge: 60 * 1000, // 1m
220
+ });
221
+ this.createLoanMaxRecvAllRanges = memoize(function (collateral) { return __awaiter(_this, void 0, void 0, function () {
222
+ var _collateral, calls, N, _amounts, res, N;
223
+ return __generator(this, function (_a) {
224
+ switch (_a.label) {
225
+ case 0:
226
+ _collateral = parseUnits(collateral, this.collateralDecimals);
227
+ calls = [];
228
+ for (N = this.minBands; N <= this.maxBands; N++) {
229
+ calls.push(llamalend.contracts[this.controller].multicallContract.max_borrowable(_collateral, N));
230
+ }
231
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
232
+ case 1:
233
+ _amounts = _a.sent();
234
+ res = {};
235
+ for (N = this.minBands; N <= this.maxBands; N++) {
236
+ res[N] = formatUnits(_amounts[N - this.minBands]);
237
+ }
238
+ return [2 /*return*/, res];
239
+ }
240
+ });
241
+ }); }, {
242
+ promise: true,
243
+ maxAge: 5 * 60 * 1000, // 5m
244
+ });
245
+ this.leverageCreateLoanMaxRecvAllRanges = memoize(function (collateral) { return __awaiter(_this, void 0, void 0, function () {
246
+ var _collateral, calls, N, i, _rawRes, res, N, _res, _maxBorrowable, _maxCollateral, routeIdx, maxBorrowable, maxCollateral;
247
+ return __generator(this, function (_a) {
248
+ switch (_a.label) {
249
+ case 0:
250
+ this._checkLeverageZap();
251
+ _collateral = parseUnits(collateral, this.collateralDecimals);
252
+ calls = [];
253
+ for (N = this.minBands; N <= this.maxBands; N++) {
254
+ for (i = 0; i < 5; i++) {
255
+ calls.push(llamalend.contracts[this.leverageZap].multicallContract.max_borrowable_and_collateral(_collateral, N, i));
256
+ }
257
+ }
258
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
259
+ case 1:
260
+ _rawRes = _a.sent();
261
+ res = {};
262
+ for (N = this.minBands; N <= this.maxBands; N++) {
263
+ _res = _rawRes.splice(0, 5);
264
+ _maxBorrowable = _res.map(function (r) { return r[0] * BigInt(999) / BigInt(1000); });
265
+ _maxCollateral = _res.map(function (r) { return r[1] * BigInt(999) / BigInt(1000); });
266
+ routeIdx = this._getBestIdx(_maxCollateral);
267
+ maxBorrowable = llamalend.formatUnits(_maxBorrowable[routeIdx]);
268
+ maxCollateral = llamalend.formatUnits(_maxCollateral[routeIdx], this.collateralDecimals);
269
+ res[N] = {
270
+ maxBorrowable: maxBorrowable,
271
+ maxCollateral: maxCollateral,
272
+ leverage: BN(maxCollateral).div(collateral).toFixed(4),
273
+ routeIdx: routeIdx,
274
+ };
275
+ }
276
+ return [2 /*return*/, res];
277
+ }
278
+ });
279
+ }); }, {
280
+ promise: true,
281
+ maxAge: 5 * 60 * 1000, // 5m
282
+ });
283
+ this._leverageCreateLoanMaxRecvAllRanges2 = memoize(function (collateral, routeIdx) { return __awaiter(_this, void 0, void 0, function () {
284
+ var _collateral, calls, N, _res, res, N, maxBorrowable, maxCollateral;
285
+ return __generator(this, function (_a) {
286
+ switch (_a.label) {
287
+ case 0:
288
+ _collateral = parseUnits(collateral, this.collateralDecimals);
289
+ calls = [];
290
+ for (N = this.minBands; N <= this.maxBands; N++) {
291
+ calls.push(llamalend.contracts[this.leverageZap].multicallContract.max_borrowable_and_collateral(_collateral, N, routeIdx));
292
+ }
293
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
294
+ case 1:
295
+ _res = _a.sent();
296
+ res = {};
297
+ for (N = this.minBands; N <= this.maxBands; N++) {
298
+ maxBorrowable = llamalend.formatUnits(_res[N - this.minBands][0] * BigInt(999) / BigInt(1000));
299
+ maxCollateral = llamalend.formatUnits(_res[N - this.minBands][1] * BigInt(999) / BigInt(1000), this.collateralDecimals);
300
+ res[N] = {
301
+ maxBorrowable: maxBorrowable,
302
+ maxCollateral: maxCollateral,
303
+ leverage: BN(maxCollateral).div(collateral).toFixed(4),
304
+ };
305
+ }
306
+ return [2 /*return*/, res];
307
+ }
308
+ });
309
+ }); }, {
310
+ promise: true,
311
+ maxAge: 5 * 60 * 1000, // 5m
312
+ });
313
+ this._leverageCreateLoanCollateral = memoize(function (userCollateral, debt) { return __awaiter(_this, void 0, void 0, function () {
314
+ var _userCollateral, _debt, calls, i, _leverageCollateral, routeIdx;
315
+ return __generator(this, function (_a) {
316
+ switch (_a.label) {
317
+ case 0:
318
+ _userCollateral = parseUnits(userCollateral, this.collateralDecimals);
319
+ _debt = parseUnits(debt);
320
+ calls = [];
321
+ for (i = 0; i < 5; i++) {
322
+ calls.push(llamalend.contracts[this.leverageZap].multicallContract.get_collateral(_debt, i));
323
+ }
324
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
325
+ case 1:
326
+ _leverageCollateral = _a.sent();
327
+ routeIdx = this._getBestIdx(_leverageCollateral);
328
+ return [2 /*return*/, { _collateral: _userCollateral + _leverageCollateral[routeIdx], routeIdx: routeIdx }];
329
+ }
330
+ });
331
+ }); }, {
332
+ promise: true,
333
+ maxAge: 5 * 60 * 1000, // 5m
334
+ });
335
+ this.deleverageRepayStablecoins = memoize(function (collateral) { return __awaiter(_this, void 0, void 0, function () {
336
+ var _collateral, calls, i, _stablecoins_arr, routeIdx, stablecoins;
337
+ return __generator(this, function (_a) {
338
+ switch (_a.label) {
339
+ case 0:
340
+ this._checkDeleverageZap();
341
+ _collateral = parseUnits(collateral, this.collateralDecimals);
342
+ calls = [];
343
+ for (i = 0; i < 5; i++) {
344
+ calls.push(llamalend.contracts[this.deleverageZap].multicallContract.get_stablecoins(_collateral, i));
345
+ }
346
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
347
+ case 1:
348
+ _stablecoins_arr = _a.sent();
349
+ routeIdx = this._getBestIdx(_stablecoins_arr);
350
+ stablecoins = llamalend.formatUnits(_stablecoins_arr[routeIdx]);
351
+ return [2 /*return*/, { stablecoins: stablecoins, routeIdx: routeIdx }];
352
+ }
353
+ });
354
+ }); }, {
355
+ promise: true,
356
+ maxAge: 5 * 60 * 1000, // 5m
357
+ });
358
+ this._deleverageRepayBands = memoize(function (collateral, address) { return __awaiter(_this, void 0, void 0, function () {
359
+ var routeIdx, _currentDebt, N, _collateral, _n1, _n2, e_1;
360
+ return __generator(this, function (_a) {
361
+ switch (_a.label) {
362
+ case 0:
363
+ address = _getAddress(address);
364
+ return [4 /*yield*/, this.deleverageIsAvailable(collateral, address)];
365
+ case 1:
366
+ if (!(_a.sent()))
367
+ return [2 /*return*/, [parseUnits(0, 0), parseUnits(0, 0)]];
368
+ return [4 /*yield*/, this.deleverageRepayStablecoins(collateral)];
369
+ case 2:
370
+ routeIdx = (_a.sent()).routeIdx;
371
+ return [4 /*yield*/, this._userState(address)];
372
+ case 3:
373
+ _currentDebt = (_a.sent())._debt;
374
+ if (_currentDebt === BigInt(0))
375
+ throw Error("Loan for ".concat(address, " does not exist"));
376
+ return [4 /*yield*/, this.userRange(address)];
377
+ case 4:
378
+ N = _a.sent();
379
+ _collateral = parseUnits(collateral, this.collateralDecimals);
380
+ _n1 = parseUnits(0, 0);
381
+ _n2 = parseUnits(0, 0);
382
+ _a.label = 5;
383
+ case 5:
384
+ _a.trys.push([5, 7, , 8]);
385
+ return [4 /*yield*/, llamalend.contracts[this.deleverageZap].contract.calculate_debt_n1(_collateral, routeIdx, address)];
386
+ case 6:
387
+ _n1 = _a.sent();
388
+ _n2 = _n1 + BigInt(N - 1);
389
+ return [3 /*break*/, 8];
390
+ case 7:
391
+ e_1 = _a.sent();
392
+ console.log("Full repayment");
393
+ return [3 /*break*/, 8];
394
+ case 8: return [2 /*return*/, [_n2, _n1]];
395
+ }
396
+ });
397
+ }); }, {
398
+ promise: true,
399
+ maxAge: 5 * 60 * 1000, // 5m
400
+ });
401
+ var llammaData = llamalend.constants.LLAMMAS[id];
402
+ this.id = id;
403
+ this.address = llammaData.amm_address;
404
+ this.controller = llammaData.controller_address;
405
+ this.monetaryPolicy = llammaData.monetary_policy_address;
406
+ this.collateral = llammaData.collateral_address;
407
+ this.leverageZap = llammaData.leverage_zap;
408
+ this.deleverageZap = llammaData.deleverage_zap;
409
+ this.healthCalculator = llammaData.health_calculator_zap;
410
+ this.collateralSymbol = llammaData.collateral_symbol;
411
+ this.collateralDecimals = llammaData.collateral_decimals;
412
+ this.coins = ["crvUSD", llammaData.collateral_symbol];
413
+ this.coinAddresses = [llamalend.address, llammaData.collateral_address];
414
+ this.coinDecimals = [18, llammaData.collateral_decimals];
415
+ this.minBands = llammaData.min_bands;
416
+ this.maxBands = llammaData.max_bands;
417
+ this.defaultBands = llammaData.default_bands;
418
+ this.A = llammaData.A;
419
+ this.tickSpace = 1 / llammaData.A * 100;
420
+ this.estimateGas = {
421
+ createLoanApprove: this.createLoanApproveEstimateGas.bind(this),
422
+ createLoan: this.createLoanEstimateGas.bind(this),
423
+ addCollateralApprove: this.addCollateralApproveEstimateGas.bind(this),
424
+ addCollateral: this.addCollateralEstimateGas.bind(this),
425
+ borrowMoreApprove: this.borrowMoreApproveEstimateGas.bind(this),
426
+ borrowMore: this.borrowMoreEstimateGas.bind(this),
427
+ repayApprove: this.repayApproveEstimateGas.bind(this),
428
+ repay: this.repayEstimateGas.bind(this),
429
+ fullRepayApprove: this.fullRepayApproveEstimateGas.bind(this),
430
+ fullRepay: this.fullRepayEstimateGas.bind(this),
431
+ swapApprove: this.swapApproveEstimateGas.bind(this),
432
+ swap: this.swapEstimateGas.bind(this),
433
+ liquidateApprove: this.liquidateApproveEstimateGas.bind(this),
434
+ liquidate: this.liquidateEstimateGas.bind(this),
435
+ selfLiquidateApprove: this.selfLiquidateApproveEstimateGas.bind(this),
436
+ selfLiquidate: this.selfLiquidateEstimateGas.bind(this),
437
+ };
438
+ this.stats = {
439
+ parameters: this.statsParameters.bind(this),
440
+ balances: this.statsBalances.bind(this),
441
+ maxMinBands: this.statsMaxMinBands.bind(this),
442
+ activeBand: this.statsActiveBand.bind(this),
443
+ liquidatingBand: this.statsLiquidatingBand.bind(this),
444
+ bandBalances: this.statsBandBalances.bind(this),
445
+ bandsBalances: this.statsBandsBalances.bind(this),
446
+ totalSupply: this.statsTotalSupply.bind(this),
447
+ totalDebt: this.statsTotalDebt.bind(this),
448
+ totalStablecoin: this.statsTotalStablecoin.bind(this),
449
+ totalCollateral: this.statsTotalCollateral.bind(this),
450
+ capAndAvailable: this.statsCapAndAvailable.bind(this),
451
+ };
452
+ this.wallet = {
453
+ balances: this.walletBalances.bind(this),
454
+ };
455
+ this.leverage = {
456
+ createLoanMaxRecv: this.leverageCreateLoanMaxRecv.bind(this),
457
+ createLoanMaxRecvAllRanges: this.leverageCreateLoanMaxRecvAllRanges.bind(this),
458
+ createLoanCollateral: this.leverageCreateLoanCollateral.bind(this),
459
+ getRouteName: this.leverageGetRouteName.bind(this),
460
+ getMaxRange: this.leverageGetMaxRange.bind(this),
461
+ createLoanBands: this.leverageCreateLoanBands.bind(this),
462
+ createLoanBandsAllRanges: this.leverageCreateLoanBandsAllRanges.bind(this),
463
+ createLoanPrices: this.leverageCreateLoanPrices.bind(this),
464
+ createLoanPricesAllRanges: this.leverageCreateLoanPricesAllRanges.bind(this),
465
+ createLoanHealth: this.leverageCreateLoanHealth.bind(this),
466
+ createLoanIsApproved: this.createLoanIsApproved.bind(this),
467
+ createLoanApprove: this.createLoanApprove.bind(this),
468
+ priceImpact: this.leveragePriceImpact.bind(this),
469
+ createLoan: this.leverageCreateLoan.bind(this),
470
+ estimateGas: {
471
+ createLoanApprove: this.createLoanApproveEstimateGas.bind(this),
472
+ createLoan: this.leverageCreateLoanEstimateGas.bind(this),
473
+ },
474
+ };
475
+ this.deleverage = {
476
+ repayStablecoins: this.deleverageRepayStablecoins.bind(this),
477
+ getRouteName: this.deleverageGetRouteName.bind(this),
478
+ isAvailable: this.deleverageIsAvailable.bind(this),
479
+ isFullRepayment: this.deleverageIsFullRepayment.bind(this),
480
+ repayBands: this.deleverageRepayBands.bind(this),
481
+ repayPrices: this.deleverageRepayPrices.bind(this),
482
+ repayHealth: this.deleverageRepayHealth.bind(this),
483
+ priceImpact: this.deleveragePriceImpact.bind(this),
484
+ repay: this.deleverageRepay.bind(this),
485
+ estimateGas: {
486
+ repay: this.deleverageRepayEstimateGas.bind(this),
487
+ },
488
+ };
489
+ }
490
+ MintMarketTemplate.prototype.statsBalances = function () {
491
+ return __awaiter(this, void 0, void 0, function () {
492
+ var crvusdContract, collateralContract, contract, calls, _a, _crvusdBalance, _collateralBalance, _crvusdAdminFees, _collateralAdminFees;
493
+ return __generator(this, function (_c) {
494
+ switch (_c.label) {
495
+ case 0:
496
+ crvusdContract = llamalend.contracts[llamalend.address].multicallContract;
497
+ collateralContract = llamalend.contracts[isEth(this.collateral) ? llamalend.constants.WETH : this.collateral].multicallContract;
498
+ contract = llamalend.contracts[this.address].multicallContract;
499
+ calls = [
500
+ crvusdContract.balanceOf(this.address),
501
+ collateralContract.balanceOf(this.address),
502
+ contract.admin_fees_x(),
503
+ contract.admin_fees_y(),
504
+ ];
505
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
506
+ case 1:
507
+ _a = _c.sent(), _crvusdBalance = _a[0], _collateralBalance = _a[1], _crvusdAdminFees = _a[2], _collateralAdminFees = _a[3];
508
+ return [2 /*return*/, [
509
+ formatUnits(_crvusdBalance - _crvusdAdminFees),
510
+ formatUnits(_collateralBalance - _collateralAdminFees, this.collateralDecimals),
511
+ ]];
512
+ }
513
+ });
514
+ });
515
+ };
516
+ MintMarketTemplate.prototype.statsLiquidatingBand = function () {
517
+ return __awaiter(this, void 0, void 0, function () {
518
+ var activeBand, _a, stablecoin, collateral;
519
+ return __generator(this, function (_c) {
520
+ switch (_c.label) {
521
+ case 0: return [4 /*yield*/, this.statsActiveBand()];
522
+ case 1:
523
+ activeBand = _c.sent();
524
+ return [4 /*yield*/, this.statsBandBalances(activeBand)];
525
+ case 2:
526
+ _a = _c.sent(), stablecoin = _a.stablecoin, collateral = _a.collateral;
527
+ if (Number(stablecoin) > 0 && Number(collateral) > 0)
528
+ return [2 /*return*/, activeBand];
529
+ return [2 /*return*/, null];
530
+ }
531
+ });
532
+ });
533
+ };
534
+ MintMarketTemplate.prototype.statsBandBalances = function (n) {
535
+ return __awaiter(this, void 0, void 0, function () {
536
+ var llammaContract, calls, _balances;
537
+ return __generator(this, function (_a) {
538
+ switch (_a.label) {
539
+ case 0:
540
+ llammaContract = llamalend.contracts[this.address].multicallContract;
541
+ calls = [];
542
+ calls.push(llammaContract.bands_x(n), llammaContract.bands_y(n));
543
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
544
+ case 1:
545
+ _balances = _a.sent();
546
+ return [2 /*return*/, {
547
+ stablecoin: formatUnits(_balances[0]),
548
+ collateral: formatUnits(_balances[1], this.collateralDecimals),
549
+ }];
550
+ }
551
+ });
552
+ });
553
+ };
554
+ MintMarketTemplate.prototype.statsBandsBalances = function () {
555
+ return __awaiter(this, void 0, void 0, function () {
556
+ var _a, max_band, min_band, llammaContract, calls, i, _bands, bands, i, _i, collateral;
557
+ return __generator(this, function (_c) {
558
+ switch (_c.label) {
559
+ case 0: return [4 /*yield*/, this.statsMaxMinBands()];
560
+ case 1:
561
+ _a = _c.sent(), max_band = _a[0], min_band = _a[1];
562
+ llammaContract = llamalend.contracts[this.address].multicallContract;
563
+ calls = [];
564
+ for (i = min_band; i <= max_band; i++) {
565
+ calls.push(llammaContract.bands_x(i), llammaContract.bands_y(i));
566
+ }
567
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
568
+ case 2:
569
+ _bands = _c.sent();
570
+ bands = {};
571
+ for (i = min_band; i <= max_band; i++) {
572
+ _i = i - min_band;
573
+ collateral = formatUnits(_bands[(2 * _i) + 1]);
574
+ collateral = collateral.split(".")[0] + "." +
575
+ (collateral.split(".")[1] || "0").slice(0, this.collateralDecimals);
576
+ bands[i] = {
577
+ stablecoin: formatUnits(_bands[2 * _i]),
578
+ collateral: collateral,
579
+ };
580
+ }
581
+ return [2 /*return*/, bands];
582
+ }
583
+ });
584
+ });
585
+ };
586
+ // ---------------------------------------
587
+ MintMarketTemplate.prototype.loanExists = function (address) {
588
+ if (address === void 0) { address = ""; }
589
+ return __awaiter(this, void 0, void 0, function () {
590
+ return __generator(this, function (_a) {
591
+ switch (_a.label) {
592
+ case 0:
593
+ address = _getAddress(address);
594
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.loan_exists(address, llamalend.constantOptions)];
595
+ case 1: return [2 /*return*/, _a.sent()];
596
+ }
597
+ });
598
+ });
599
+ };
600
+ MintMarketTemplate.prototype.userDebt = function (address) {
601
+ if (address === void 0) { address = ""; }
602
+ return __awaiter(this, void 0, void 0, function () {
603
+ var debt;
604
+ return __generator(this, function (_a) {
605
+ switch (_a.label) {
606
+ case 0:
607
+ address = _getAddress(address);
608
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.debt(address, llamalend.constantOptions)];
609
+ case 1:
610
+ debt = _a.sent();
611
+ return [2 /*return*/, formatUnits(debt)];
612
+ }
613
+ });
614
+ });
615
+ };
616
+ MintMarketTemplate.prototype.userHealth = function (full, address) {
617
+ if (full === void 0) { full = true; }
618
+ if (address === void 0) { address = ""; }
619
+ return __awaiter(this, void 0, void 0, function () {
620
+ var _health;
621
+ return __generator(this, function (_a) {
622
+ switch (_a.label) {
623
+ case 0:
624
+ address = _getAddress(address);
625
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.health(address, full, llamalend.constantOptions)];
626
+ case 1:
627
+ _health = _a.sent();
628
+ _health = _health * BigInt(100);
629
+ return [2 /*return*/, formatUnits(_health)];
630
+ }
631
+ });
632
+ });
633
+ };
634
+ MintMarketTemplate.prototype.userBands = function (address) {
635
+ if (address === void 0) { address = ""; }
636
+ return __awaiter(this, void 0, void 0, function () {
637
+ var _bands;
638
+ return __generator(this, function (_a) {
639
+ switch (_a.label) {
640
+ case 0:
641
+ address = _getAddress(address);
642
+ return [4 /*yield*/, llamalend.contracts[this.address].contract.read_user_tick_numbers(address, llamalend.constantOptions)];
643
+ case 1:
644
+ _bands = _a.sent();
645
+ return [2 /*return*/, _bands.map(function (_t) { return _t.toNumber(); }).reverse()];
646
+ }
647
+ });
648
+ });
649
+ };
650
+ MintMarketTemplate.prototype.userRange = function (address) {
651
+ if (address === void 0) { address = ""; }
652
+ return __awaiter(this, void 0, void 0, function () {
653
+ var _a, n2, n1;
654
+ return __generator(this, function (_c) {
655
+ switch (_c.label) {
656
+ case 0: return [4 /*yield*/, this.userBands(address)];
657
+ case 1:
658
+ _a = _c.sent(), n2 = _a[0], n1 = _a[1];
659
+ if (n1 == n2)
660
+ return [2 /*return*/, 0];
661
+ return [2 /*return*/, n2 - n1 + 1];
662
+ }
663
+ });
664
+ });
665
+ };
666
+ MintMarketTemplate.prototype.userPrices = function (address) {
667
+ if (address === void 0) { address = ""; }
668
+ return __awaiter(this, void 0, void 0, function () {
669
+ var _prices;
670
+ return __generator(this, function (_a) {
671
+ switch (_a.label) {
672
+ case 0:
673
+ address = _getAddress(address);
674
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.user_prices(address, llamalend.constantOptions)];
675
+ case 1:
676
+ _prices = _a.sent();
677
+ return [2 /*return*/, _prices.map(function (_p) { return formatUnits(_p); }).reverse()];
678
+ }
679
+ });
680
+ });
681
+ };
682
+ MintMarketTemplate.prototype._userState = function (address) {
683
+ if (address === void 0) { address = ""; }
684
+ return __awaiter(this, void 0, void 0, function () {
685
+ var contract, _a, _collateral, _stablecoin, _debt;
686
+ return __generator(this, function (_c) {
687
+ switch (_c.label) {
688
+ case 0:
689
+ address = _getAddress(address);
690
+ contract = llamalend.contracts[this.controller].contract;
691
+ return [4 /*yield*/, contract.user_state(address, llamalend.constantOptions)];
692
+ case 1:
693
+ _a = _c.sent(), _collateral = _a[0], _stablecoin = _a[1], _debt = _a[2];
694
+ return [2 /*return*/, { _collateral: _collateral, _stablecoin: _stablecoin, _debt: _debt }];
695
+ }
696
+ });
697
+ });
698
+ };
699
+ MintMarketTemplate.prototype.userState = function (address) {
700
+ if (address === void 0) { address = ""; }
701
+ return __awaiter(this, void 0, void 0, function () {
702
+ var _a, _collateral, _stablecoin, _debt;
703
+ return __generator(this, function (_c) {
704
+ switch (_c.label) {
705
+ case 0: return [4 /*yield*/, this._userState(address)];
706
+ case 1:
707
+ _a = _c.sent(), _collateral = _a._collateral, _stablecoin = _a._stablecoin, _debt = _a._debt;
708
+ return [2 /*return*/, {
709
+ collateral: formatUnits(_collateral, this.collateralDecimals),
710
+ stablecoin: formatUnits(_stablecoin),
711
+ debt: formatUnits(_debt),
712
+ }];
713
+ }
714
+ });
715
+ });
716
+ };
717
+ MintMarketTemplate.prototype.userLoss = function (userAddress) {
718
+ if (userAddress === void 0) { userAddress = ""; }
719
+ return __awaiter(this, void 0, void 0, function () {
720
+ var _a, deposited_collateral, _current_collateral_estimation, current_collateral_estimation, loss, loss_pct;
721
+ return __generator(this, function (_c) {
722
+ switch (_c.label) {
723
+ case 0:
724
+ userAddress = _getAddress(userAddress);
725
+ return [4 /*yield*/, Promise.all([
726
+ _getUserCollateralCrvUsd(llamalend.constants.NETWORK_NAME, this.controller, userAddress),
727
+ llamalend.contracts[this.address].contract.get_y_up(userAddress),
728
+ ])];
729
+ case 1:
730
+ _a = _c.sent(), deposited_collateral = _a[0], _current_collateral_estimation = _a[1];
731
+ current_collateral_estimation = llamalend.formatUnits(_current_collateral_estimation, this.collateralDecimals);
732
+ if (BN(deposited_collateral).lte(0)) {
733
+ return [2 /*return*/, {
734
+ deposited_collateral: deposited_collateral,
735
+ current_collateral_estimation: current_collateral_estimation,
736
+ loss: "0.0",
737
+ loss_pct: "0.0",
738
+ }];
739
+ }
740
+ loss = BN(deposited_collateral).minus(current_collateral_estimation).toString();
741
+ loss_pct = BN(loss).div(deposited_collateral).times(100).toString();
742
+ return [2 /*return*/, {
743
+ deposited_collateral: deposited_collateral,
744
+ current_collateral_estimation: current_collateral_estimation,
745
+ loss: loss,
746
+ loss_pct: loss_pct,
747
+ }];
748
+ }
749
+ });
750
+ });
751
+ };
752
+ MintMarketTemplate.prototype.userBandsBalances = function (address) {
753
+ if (address === void 0) { address = ""; }
754
+ return __awaiter(this, void 0, void 0, function () {
755
+ var _a, n2, n1, contract, _c, _stablecoins, _collaterals, res, i;
756
+ return __generator(this, function (_d) {
757
+ switch (_d.label) {
758
+ case 0: return [4 /*yield*/, this.userBands(address)];
759
+ case 1:
760
+ _a = _d.sent(), n2 = _a[0], n1 = _a[1];
761
+ if (n1 == 0 && n2 == 0)
762
+ return [2 /*return*/, {}];
763
+ address = _getAddress(address);
764
+ contract = llamalend.contracts[this.address].contract;
765
+ return [4 /*yield*/, contract.get_xy(address, llamalend.constantOptions)];
766
+ case 2:
767
+ _c = _d.sent(), _stablecoins = _c[0], _collaterals = _c[1];
768
+ res = {};
769
+ for (i = n1; i <= n2; i++) {
770
+ res[i] = {
771
+ stablecoin: formatUnits(_stablecoins[i - n1], 18),
772
+ collateral: formatUnits(_collaterals[i - n1], this.collateralDecimals),
773
+ };
774
+ }
775
+ return [2 /*return*/, res];
776
+ }
777
+ });
778
+ });
779
+ };
780
+ MintMarketTemplate.prototype.oraclePrice = function () {
781
+ return __awaiter(this, void 0, void 0, function () {
782
+ var _price;
783
+ return __generator(this, function (_a) {
784
+ switch (_a.label) {
785
+ case 0: return [4 /*yield*/, llamalend.contracts[this.address].contract.price_oracle(llamalend.constantOptions)];
786
+ case 1:
787
+ _price = _a.sent();
788
+ return [2 /*return*/, formatUnits(_price)];
789
+ }
790
+ });
791
+ });
792
+ };
793
+ MintMarketTemplate.prototype.oraclePriceBand = function () {
794
+ return __awaiter(this, void 0, void 0, function () {
795
+ var oraclePriceBN, _a, basePriceBN, _c, A_BN, multiplier, term, compareFunc, band, currentTickPriceBN;
796
+ return __generator(this, function (_d) {
797
+ switch (_d.label) {
798
+ case 0:
799
+ _a = BN;
800
+ return [4 /*yield*/, this.oraclePrice()];
801
+ case 1:
802
+ oraclePriceBN = _a.apply(void 0, [_d.sent()]);
803
+ _c = BN;
804
+ return [4 /*yield*/, this.basePrice()];
805
+ case 2:
806
+ basePriceBN = _c.apply(void 0, [_d.sent()]);
807
+ A_BN = BN(this.A);
808
+ multiplier = oraclePriceBN.lte(basePriceBN) ? A_BN.minus(1).div(A_BN) : A_BN.div(A_BN.minus(1));
809
+ term = oraclePriceBN.lte(basePriceBN) ? 1 : -1;
810
+ compareFunc = oraclePriceBN.lte(basePriceBN) ?
811
+ function (oraclePriceBN, currentTickPriceBN) { return oraclePriceBN.lte(currentTickPriceBN); } :
812
+ function (oraclePriceBN, currentTickPriceBN) { return oraclePriceBN.gt(currentTickPriceBN); };
813
+ band = 0;
814
+ currentTickPriceBN = oraclePriceBN.lte(basePriceBN) ? basePriceBN.times(multiplier) : basePriceBN;
815
+ while (compareFunc(oraclePriceBN, currentTickPriceBN)) {
816
+ currentTickPriceBN = currentTickPriceBN.times(multiplier);
817
+ band += term;
818
+ }
819
+ return [2 /*return*/, band];
820
+ }
821
+ });
822
+ });
823
+ };
824
+ MintMarketTemplate.prototype.price = function () {
825
+ return __awaiter(this, void 0, void 0, function () {
826
+ var _price;
827
+ return __generator(this, function (_a) {
828
+ switch (_a.label) {
829
+ case 0: return [4 /*yield*/, llamalend.contracts[this.address].contract.get_p(llamalend.constantOptions)];
830
+ case 1:
831
+ _price = _a.sent();
832
+ return [2 /*return*/, formatUnits(_price)];
833
+ }
834
+ });
835
+ });
836
+ };
837
+ MintMarketTemplate.prototype.calcTickPrice = function (n) {
838
+ return __awaiter(this, void 0, void 0, function () {
839
+ var basePrice, basePriceBN, A_BN;
840
+ return __generator(this, function (_a) {
841
+ switch (_a.label) {
842
+ case 0: return [4 /*yield*/, this.basePrice()];
843
+ case 1:
844
+ basePrice = _a.sent();
845
+ basePriceBN = BN(basePrice);
846
+ A_BN = BN(this.A);
847
+ return [2 /*return*/, _cutZeros(basePriceBN.times(A_BN.minus(1).div(A_BN).pow(n)).toFixed(18))];
848
+ }
849
+ });
850
+ });
851
+ };
852
+ MintMarketTemplate.prototype.calcBandPrices = function (n) {
853
+ return __awaiter(this, void 0, void 0, function () {
854
+ var _a;
855
+ return __generator(this, function (_c) {
856
+ switch (_c.label) {
857
+ case 0: return [4 /*yield*/, this.calcTickPrice(n + 1)];
858
+ case 1:
859
+ _a = [_c.sent()];
860
+ return [4 /*yield*/, this.calcTickPrice(n)];
861
+ case 2: return [2 /*return*/, _a.concat([_c.sent()])];
862
+ }
863
+ });
864
+ });
865
+ };
866
+ MintMarketTemplate.prototype.calcRangePct = function (range) {
867
+ /**
868
+ * Calculates range in terms of price difference %
869
+ * @param {number} range Number of bands in range
870
+ * @return {string} Range in %
871
+ */
872
+ var A_BN = BN(this.A);
873
+ var startBN = BN(1);
874
+ var endBN = A_BN.minus(1).div(A_BN).pow(range);
875
+ return startBN.minus(endBN).times(100).toString();
876
+ };
877
+ // ---------------- WALLET BALANCES ----------------
878
+ MintMarketTemplate.prototype.walletBalances = function (address) {
879
+ if (address === void 0) { address = ""; }
880
+ return __awaiter(this, void 0, void 0, function () {
881
+ var _a, collateral, stablecoin;
882
+ return __generator(this, function (_c) {
883
+ switch (_c.label) {
884
+ case 0: return [4 /*yield*/, getBalances([this.collateral, llamalend.address], address)];
885
+ case 1:
886
+ _a = _c.sent(), collateral = _a[0], stablecoin = _a[1];
887
+ return [2 /*return*/, { stablecoin: stablecoin, collateral: collateral }];
888
+ }
889
+ });
890
+ });
891
+ };
892
+ // ---------------- CREATE LOAN ----------------
893
+ MintMarketTemplate.prototype._checkRange = function (range) {
894
+ if (range < this.minBands)
895
+ throw Error("range must be >= ".concat(this.minBands));
896
+ if (range > this.maxBands)
897
+ throw Error("range must be <= ".concat(this.maxBands));
898
+ };
899
+ MintMarketTemplate.prototype.createLoanMaxRecv = function (collateral, range) {
900
+ return __awaiter(this, void 0, void 0, function () {
901
+ var _collateral, _a;
902
+ return __generator(this, function (_c) {
903
+ switch (_c.label) {
904
+ case 0:
905
+ this._checkRange(range);
906
+ _collateral = parseUnits(collateral, this.collateralDecimals);
907
+ _a = formatUnits;
908
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.max_borrowable(_collateral, range, llamalend.constantOptions)];
909
+ case 1: return [2 /*return*/, _a.apply(void 0, [_c.sent()])];
910
+ }
911
+ });
912
+ });
913
+ };
914
+ MintMarketTemplate.prototype.getMaxRange = function (collateral, debt) {
915
+ return __awaiter(this, void 0, void 0, function () {
916
+ var maxRecv, N;
917
+ return __generator(this, function (_a) {
918
+ switch (_a.label) {
919
+ case 0: return [4 /*yield*/, this.createLoanMaxRecvAllRanges(collateral)];
920
+ case 1:
921
+ maxRecv = _a.sent();
922
+ for (N = this.minBands; N <= this.maxBands; N++) {
923
+ if (BN(debt).gt(BN(maxRecv[N])))
924
+ return [2 /*return*/, N - 1];
925
+ }
926
+ return [2 /*return*/, this.maxBands];
927
+ }
928
+ });
929
+ });
930
+ };
931
+ MintMarketTemplate.prototype._calcN1 = function (_collateral, _debt, range) {
932
+ return __awaiter(this, void 0, void 0, function () {
933
+ return __generator(this, function (_a) {
934
+ switch (_a.label) {
935
+ case 0:
936
+ this._checkRange(range);
937
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.calculate_debt_n1(_collateral, _debt, range, llamalend.constantOptions)];
938
+ case 1: return [2 /*return*/, _a.sent()];
939
+ }
940
+ });
941
+ });
942
+ };
943
+ MintMarketTemplate.prototype._calcN1AllRanges = function (_collateral, _debt, maxN) {
944
+ return __awaiter(this, void 0, void 0, function () {
945
+ var calls, N;
946
+ return __generator(this, function (_a) {
947
+ switch (_a.label) {
948
+ case 0:
949
+ calls = [];
950
+ for (N = this.minBands; N <= maxN; N++) {
951
+ calls.push(llamalend.contracts[this.controller].multicallContract.calculate_debt_n1(_collateral, _debt, N));
952
+ }
953
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
954
+ case 1: return [2 /*return*/, _a.sent()];
955
+ }
956
+ });
957
+ });
958
+ };
959
+ MintMarketTemplate.prototype._getPrices = function (_n2, _n1) {
960
+ return __awaiter(this, void 0, void 0, function () {
961
+ var contract;
962
+ return __generator(this, function (_a) {
963
+ switch (_a.label) {
964
+ case 0:
965
+ contract = llamalend.contracts[this.address].multicallContract;
966
+ return [4 /*yield*/, llamalend.multicallProvider.all([
967
+ contract.p_oracle_down(_n2),
968
+ contract.p_oracle_up(_n1),
969
+ ])];
970
+ case 1: return [2 /*return*/, (_a.sent()).map(function (_p) { return formatUnits(_p); })];
971
+ }
972
+ });
973
+ });
974
+ };
975
+ MintMarketTemplate.prototype._calcPrices = function (_n2, _n1) {
976
+ return __awaiter(this, void 0, void 0, function () {
977
+ var _a;
978
+ return __generator(this, function (_c) {
979
+ switch (_c.label) {
980
+ case 0: return [4 /*yield*/, this.calcTickPrice(Number(_n2) + 1)];
981
+ case 1:
982
+ _a = [_c.sent()];
983
+ return [4 /*yield*/, this.calcTickPrice(Number(_n1))];
984
+ case 2: return [2 /*return*/, _a.concat([_c.sent()])];
985
+ }
986
+ });
987
+ });
988
+ };
989
+ MintMarketTemplate.prototype._createLoanBands = function (collateral, debt, range) {
990
+ return __awaiter(this, void 0, void 0, function () {
991
+ var _n1, _n2;
992
+ return __generator(this, function (_a) {
993
+ switch (_a.label) {
994
+ case 0: return [4 /*yield*/, this._calcN1(parseUnits(collateral, this.collateralDecimals), parseUnits(debt), range)];
995
+ case 1:
996
+ _n1 = _a.sent();
997
+ _n2 = _n1 + BigInt(range - 1);
998
+ return [2 /*return*/, [_n2, _n1]];
999
+ }
1000
+ });
1001
+ });
1002
+ };
1003
+ MintMarketTemplate.prototype._createLoanBandsAllRanges = function (collateral, debt) {
1004
+ return __awaiter(this, void 0, void 0, function () {
1005
+ var maxN, _n1_arr, _n2_arr, N, res, N;
1006
+ return __generator(this, function (_a) {
1007
+ switch (_a.label) {
1008
+ case 0: return [4 /*yield*/, this.getMaxRange(collateral, debt)];
1009
+ case 1:
1010
+ maxN = _a.sent();
1011
+ return [4 /*yield*/, this._calcN1AllRanges(parseUnits(collateral, this.collateralDecimals), parseUnits(debt), maxN)];
1012
+ case 2:
1013
+ _n1_arr = _a.sent();
1014
+ _n2_arr = [];
1015
+ for (N = this.minBands; N <= maxN; N++) {
1016
+ _n2_arr.push(_n1_arr[N - this.minBands] + BigInt(N - 1));
1017
+ }
1018
+ res = {};
1019
+ for (N = this.minBands; N <= maxN; N++) {
1020
+ res[N] = [_n2_arr[N - this.minBands], _n1_arr[N - this.minBands]];
1021
+ }
1022
+ return [2 /*return*/, res];
1023
+ }
1024
+ });
1025
+ });
1026
+ };
1027
+ MintMarketTemplate.prototype.createLoanBands = function (collateral, debt, range) {
1028
+ return __awaiter(this, void 0, void 0, function () {
1029
+ var _a, _n2, _n1;
1030
+ return __generator(this, function (_c) {
1031
+ switch (_c.label) {
1032
+ case 0: return [4 /*yield*/, this._createLoanBands(collateral, debt, range)];
1033
+ case 1:
1034
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1035
+ return [2 /*return*/, [Number(_n2), Number(_n1)]];
1036
+ }
1037
+ });
1038
+ });
1039
+ };
1040
+ MintMarketTemplate.prototype.createLoanBandsAllRanges = function (collateral, debt) {
1041
+ return __awaiter(this, void 0, void 0, function () {
1042
+ var _bandsAllRanges, bandsAllRanges, N;
1043
+ return __generator(this, function (_a) {
1044
+ switch (_a.label) {
1045
+ case 0: return [4 /*yield*/, this._createLoanBandsAllRanges(collateral, debt)];
1046
+ case 1:
1047
+ _bandsAllRanges = _a.sent();
1048
+ bandsAllRanges = {};
1049
+ for (N = this.minBands; N <= this.maxBands; N++) {
1050
+ if (_bandsAllRanges[N]) {
1051
+ bandsAllRanges[N] = _bandsAllRanges[N].map(Number);
1052
+ }
1053
+ else {
1054
+ bandsAllRanges[N] = null;
1055
+ }
1056
+ }
1057
+ return [2 /*return*/, bandsAllRanges];
1058
+ }
1059
+ });
1060
+ });
1061
+ };
1062
+ MintMarketTemplate.prototype.createLoanPrices = function (collateral, debt, range) {
1063
+ return __awaiter(this, void 0, void 0, function () {
1064
+ var _a, _n2, _n1;
1065
+ return __generator(this, function (_c) {
1066
+ switch (_c.label) {
1067
+ case 0: return [4 /*yield*/, this._createLoanBands(collateral, debt, range)];
1068
+ case 1:
1069
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1070
+ return [4 /*yield*/, this._getPrices(_n2, _n1)];
1071
+ case 2: return [2 /*return*/, _c.sent()];
1072
+ }
1073
+ });
1074
+ });
1075
+ };
1076
+ MintMarketTemplate.prototype.createLoanPricesAllRanges = function (collateral, debt) {
1077
+ return __awaiter(this, void 0, void 0, function () {
1078
+ var _bandsAllRanges, pricesAllRanges, N, _a, _c;
1079
+ return __generator(this, function (_d) {
1080
+ switch (_d.label) {
1081
+ case 0: return [4 /*yield*/, this._createLoanBandsAllRanges(collateral, debt)];
1082
+ case 1:
1083
+ _bandsAllRanges = _d.sent();
1084
+ pricesAllRanges = {};
1085
+ N = this.minBands;
1086
+ _d.label = 2;
1087
+ case 2:
1088
+ if (!(N <= this.maxBands)) return [3 /*break*/, 6];
1089
+ if (!_bandsAllRanges[N]) return [3 /*break*/, 4];
1090
+ _a = pricesAllRanges;
1091
+ _c = N;
1092
+ return [4 /*yield*/, this._calcPrices.apply(this, _bandsAllRanges[N])];
1093
+ case 3:
1094
+ _a[_c] = _d.sent();
1095
+ return [3 /*break*/, 5];
1096
+ case 4:
1097
+ pricesAllRanges[N] = null;
1098
+ _d.label = 5;
1099
+ case 5:
1100
+ N++;
1101
+ return [3 /*break*/, 2];
1102
+ case 6: return [2 /*return*/, pricesAllRanges];
1103
+ }
1104
+ });
1105
+ });
1106
+ };
1107
+ MintMarketTemplate.prototype.createLoanHealth = function (collateral, debt, range, full, address) {
1108
+ var _a;
1109
+ if (full === void 0) { full = true; }
1110
+ if (address === void 0) { address = ""; }
1111
+ return __awaiter(this, void 0, void 0, function () {
1112
+ var _collateral, _debt, contract, _health;
1113
+ return __generator(this, function (_c) {
1114
+ switch (_c.label) {
1115
+ case 0:
1116
+ address = _getAddress(address);
1117
+ _collateral = parseUnits(collateral, this.collateralDecimals);
1118
+ _debt = parseUnits(debt);
1119
+ contract = llamalend.contracts[(_a = this.healthCalculator) !== null && _a !== void 0 ? _a : this.controller].contract;
1120
+ return [4 /*yield*/, contract.health_calculator(address, _collateral, _debt, full, range, llamalend.constantOptions)];
1121
+ case 1:
1122
+ _health = _c.sent();
1123
+ _health = _health * BigInt(100);
1124
+ return [2 /*return*/, formatUnits(_health)];
1125
+ }
1126
+ });
1127
+ });
1128
+ };
1129
+ MintMarketTemplate.prototype.createLoanIsApproved = function (collateral) {
1130
+ return __awaiter(this, void 0, void 0, function () {
1131
+ return __generator(this, function (_a) {
1132
+ switch (_a.label) {
1133
+ case 0: return [4 /*yield*/, hasAllowance([this.collateral], [collateral], llamalend.signerAddress, this.controller)];
1134
+ case 1: return [2 /*return*/, _a.sent()];
1135
+ }
1136
+ });
1137
+ });
1138
+ };
1139
+ MintMarketTemplate.prototype.createLoanApproveEstimateGas = function (collateral) {
1140
+ return __awaiter(this, void 0, void 0, function () {
1141
+ return __generator(this, function (_a) {
1142
+ switch (_a.label) {
1143
+ case 0: return [4 /*yield*/, ensureAllowanceEstimateGas([this.collateral], [collateral], this.controller)];
1144
+ case 1: return [2 /*return*/, _a.sent()];
1145
+ }
1146
+ });
1147
+ });
1148
+ };
1149
+ MintMarketTemplate.prototype.createLoanApprove = function (collateral) {
1150
+ return __awaiter(this, void 0, void 0, function () {
1151
+ return __generator(this, function (_a) {
1152
+ switch (_a.label) {
1153
+ case 0: return [4 /*yield*/, ensureAllowance([this.collateral], [collateral], this.controller)];
1154
+ case 1: return [2 /*return*/, _a.sent()];
1155
+ }
1156
+ });
1157
+ });
1158
+ };
1159
+ MintMarketTemplate.prototype._createLoan = function (collateral, debt, range, estimateGas) {
1160
+ return __awaiter(this, void 0, void 0, function () {
1161
+ var _collateral, _debt, contract, value, gas, gasLimit;
1162
+ return __generator(this, function (_a) {
1163
+ switch (_a.label) {
1164
+ case 0: return [4 /*yield*/, this.loanExists()];
1165
+ case 1:
1166
+ if (_a.sent())
1167
+ throw Error("Loan already created");
1168
+ this._checkRange(range);
1169
+ _collateral = parseUnits(collateral, this.collateralDecimals);
1170
+ _debt = parseUnits(debt);
1171
+ contract = llamalend.contracts[this.controller].contract;
1172
+ value = isEth(this.collateral) ? _collateral : llamalend.parseUnits("0");
1173
+ return [4 /*yield*/, contract.create_loan.estimateGas(_collateral, _debt, range, __assign(__assign({}, llamalend.constantOptions), { value: value }))];
1174
+ case 2:
1175
+ gas = _a.sent();
1176
+ if (estimateGas)
1177
+ return [2 /*return*/, smartNumber(gas)];
1178
+ return [4 /*yield*/, llamalend.updateFeeData()];
1179
+ case 3:
1180
+ _a.sent();
1181
+ gasLimit = _mulBy1_3(DIGas(gas));
1182
+ return [4 /*yield*/, contract.create_loan(_collateral, _debt, range, __assign(__assign({}, llamalend.options), { gasLimit: gasLimit, value: value }))];
1183
+ case 4: return [2 /*return*/, (_a.sent()).hash];
1184
+ }
1185
+ });
1186
+ });
1187
+ };
1188
+ MintMarketTemplate.prototype.createLoanEstimateGas = function (collateral, debt, range) {
1189
+ return __awaiter(this, void 0, void 0, function () {
1190
+ return __generator(this, function (_a) {
1191
+ switch (_a.label) {
1192
+ case 0: return [4 /*yield*/, this.createLoanIsApproved(collateral)];
1193
+ case 1:
1194
+ if (!(_a.sent()))
1195
+ throw Error("Approval is needed for gas estimation");
1196
+ return [4 /*yield*/, this._createLoan(collateral, debt, range, true)];
1197
+ case 2: return [2 /*return*/, _a.sent()];
1198
+ }
1199
+ });
1200
+ });
1201
+ };
1202
+ MintMarketTemplate.prototype.createLoan = function (collateral, debt, range) {
1203
+ return __awaiter(this, void 0, void 0, function () {
1204
+ return __generator(this, function (_a) {
1205
+ switch (_a.label) {
1206
+ case 0: return [4 /*yield*/, this.createLoanApprove(collateral)];
1207
+ case 1:
1208
+ _a.sent();
1209
+ return [4 /*yield*/, this._createLoan(collateral, debt, range, false)];
1210
+ case 2: return [2 /*return*/, _a.sent()];
1211
+ }
1212
+ });
1213
+ });
1214
+ };
1215
+ // ---------------- BORROW MORE ----------------
1216
+ MintMarketTemplate.prototype.borrowMoreMaxRecv = function (collateralAmount) {
1217
+ return __awaiter(this, void 0, void 0, function () {
1218
+ var _a, _currentCollateral, _currentDebt, N, _collateral, contract, _debt;
1219
+ return __generator(this, function (_c) {
1220
+ switch (_c.label) {
1221
+ case 0: return [4 /*yield*/, this._userState()];
1222
+ case 1:
1223
+ _a = _c.sent(), _currentCollateral = _a._collateral, _currentDebt = _a._debt;
1224
+ return [4 /*yield*/, this.userRange()];
1225
+ case 2:
1226
+ N = _c.sent();
1227
+ _collateral = _currentCollateral + parseUnits(collateralAmount, this.collateralDecimals);
1228
+ contract = llamalend.contracts[this.controller].contract;
1229
+ return [4 /*yield*/, contract.max_borrowable(_collateral, N, llamalend.constantOptions)];
1230
+ case 3:
1231
+ _debt = _c.sent();
1232
+ return [2 /*return*/, formatUnits(_debt - _currentDebt)];
1233
+ }
1234
+ });
1235
+ });
1236
+ };
1237
+ MintMarketTemplate.prototype._borrowMoreBands = function (collateral, debt) {
1238
+ return __awaiter(this, void 0, void 0, function () {
1239
+ var _a, _currentCollateral, _currentDebt, N, _collateral, _debt, _n1, _n2;
1240
+ return __generator(this, function (_c) {
1241
+ switch (_c.label) {
1242
+ case 0: return [4 /*yield*/, this._userState()];
1243
+ case 1:
1244
+ _a = _c.sent(), _currentCollateral = _a._collateral, _currentDebt = _a._debt;
1245
+ if (_currentDebt === BigInt(0))
1246
+ throw Error("Loan for ".concat(llamalend.signerAddress, " does not exist"));
1247
+ return [4 /*yield*/, this.userRange()];
1248
+ case 2:
1249
+ N = _c.sent();
1250
+ _collateral = _currentCollateral + parseUnits(collateral, this.collateralDecimals);
1251
+ _debt = _currentDebt + parseUnits(debt);
1252
+ return [4 /*yield*/, this._calcN1(_collateral, _debt, N)];
1253
+ case 3:
1254
+ _n1 = _c.sent();
1255
+ _n2 = _n1 + BigInt(N - 1);
1256
+ return [2 /*return*/, [_n2, _n1]];
1257
+ }
1258
+ });
1259
+ });
1260
+ };
1261
+ MintMarketTemplate.prototype.borrowMoreBands = function (collateral, debt) {
1262
+ return __awaiter(this, void 0, void 0, function () {
1263
+ var _a, _n2, _n1;
1264
+ return __generator(this, function (_c) {
1265
+ switch (_c.label) {
1266
+ case 0: return [4 /*yield*/, this._borrowMoreBands(collateral, debt)];
1267
+ case 1:
1268
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1269
+ return [2 /*return*/, [Number(_n2), Number(_n1)]];
1270
+ }
1271
+ });
1272
+ });
1273
+ };
1274
+ MintMarketTemplate.prototype.borrowMorePrices = function (collateral, debt) {
1275
+ return __awaiter(this, void 0, void 0, function () {
1276
+ var _a, _n2, _n1;
1277
+ return __generator(this, function (_c) {
1278
+ switch (_c.label) {
1279
+ case 0: return [4 /*yield*/, this._borrowMoreBands(collateral, debt)];
1280
+ case 1:
1281
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1282
+ return [4 /*yield*/, this._getPrices(_n2, _n1)];
1283
+ case 2: return [2 /*return*/, _c.sent()];
1284
+ }
1285
+ });
1286
+ });
1287
+ };
1288
+ MintMarketTemplate.prototype.borrowMoreHealth = function (collateral, debt, full, address) {
1289
+ var _a;
1290
+ if (full === void 0) { full = true; }
1291
+ if (address === void 0) { address = ""; }
1292
+ return __awaiter(this, void 0, void 0, function () {
1293
+ var _collateral, _debt, contract, _health;
1294
+ return __generator(this, function (_c) {
1295
+ switch (_c.label) {
1296
+ case 0:
1297
+ address = _getAddress(address);
1298
+ _collateral = parseUnits(collateral, this.collateralDecimals);
1299
+ _debt = parseUnits(debt);
1300
+ contract = llamalend.contracts[(_a = this.healthCalculator) !== null && _a !== void 0 ? _a : this.controller].contract;
1301
+ return [4 /*yield*/, contract.health_calculator(address, _collateral, _debt, full, 0, llamalend.constantOptions)];
1302
+ case 1:
1303
+ _health = _c.sent();
1304
+ _health = _health * BigInt(100);
1305
+ return [2 /*return*/, formatUnits(_health)];
1306
+ }
1307
+ });
1308
+ });
1309
+ };
1310
+ MintMarketTemplate.prototype.borrowMoreIsApproved = function (collateral) {
1311
+ return __awaiter(this, void 0, void 0, function () {
1312
+ return __generator(this, function (_a) {
1313
+ switch (_a.label) {
1314
+ case 0: return [4 /*yield*/, hasAllowance([this.collateral], [collateral], llamalend.signerAddress, this.controller)];
1315
+ case 1: return [2 /*return*/, _a.sent()];
1316
+ }
1317
+ });
1318
+ });
1319
+ };
1320
+ MintMarketTemplate.prototype.borrowMoreApproveEstimateGas = function (collateral) {
1321
+ return __awaiter(this, void 0, void 0, function () {
1322
+ return __generator(this, function (_a) {
1323
+ switch (_a.label) {
1324
+ case 0: return [4 /*yield*/, ensureAllowanceEstimateGas([this.collateral], [collateral], this.controller)];
1325
+ case 1: return [2 /*return*/, _a.sent()];
1326
+ }
1327
+ });
1328
+ });
1329
+ };
1330
+ MintMarketTemplate.prototype.borrowMoreApprove = function (collateral) {
1331
+ return __awaiter(this, void 0, void 0, function () {
1332
+ return __generator(this, function (_a) {
1333
+ switch (_a.label) {
1334
+ case 0: return [4 /*yield*/, ensureAllowance([this.collateral], [collateral], this.controller)];
1335
+ case 1: return [2 /*return*/, _a.sent()];
1336
+ }
1337
+ });
1338
+ });
1339
+ };
1340
+ MintMarketTemplate.prototype._borrowMore = function (collateral, debt, estimateGas) {
1341
+ return __awaiter(this, void 0, void 0, function () {
1342
+ var _a, stablecoin, currentDebt, _collateral, _debt, contract, value, gas, gasLimit;
1343
+ return __generator(this, function (_c) {
1344
+ switch (_c.label) {
1345
+ case 0: return [4 /*yield*/, this.userState()];
1346
+ case 1:
1347
+ _a = _c.sent(), stablecoin = _a.stablecoin, currentDebt = _a.debt;
1348
+ if (Number(currentDebt) === 0)
1349
+ throw Error("Loan for ".concat(llamalend.signerAddress, " does not exist"));
1350
+ if (Number(stablecoin) > 0)
1351
+ throw Error("User ".concat(llamalend.signerAddress, " is already in liquidation mode"));
1352
+ _collateral = parseUnits(collateral, this.collateralDecimals);
1353
+ _debt = parseUnits(debt);
1354
+ contract = llamalend.contracts[this.controller].contract;
1355
+ value = isEth(this.collateral) ? _collateral : llamalend.parseUnits("0");
1356
+ return [4 /*yield*/, contract.borrow_more.estimateGas(_collateral, _debt, __assign(__assign({}, llamalend.constantOptions), { value: value }))];
1357
+ case 2:
1358
+ gas = _c.sent();
1359
+ if (estimateGas)
1360
+ return [2 /*return*/, smartNumber(gas)];
1361
+ return [4 /*yield*/, llamalend.updateFeeData()];
1362
+ case 3:
1363
+ _c.sent();
1364
+ gasLimit = _mulBy1_3(DIGas(gas));
1365
+ return [4 /*yield*/, contract.borrow_more(_collateral, _debt, __assign(__assign({}, llamalend.options), { gasLimit: gasLimit, value: value }))];
1366
+ case 4: return [2 /*return*/, (_c.sent()).hash];
1367
+ }
1368
+ });
1369
+ });
1370
+ };
1371
+ MintMarketTemplate.prototype.borrowMoreEstimateGas = function (collateral, debt) {
1372
+ return __awaiter(this, void 0, void 0, function () {
1373
+ return __generator(this, function (_a) {
1374
+ switch (_a.label) {
1375
+ case 0: return [4 /*yield*/, this.borrowMoreIsApproved(collateral)];
1376
+ case 1:
1377
+ if (!(_a.sent()))
1378
+ throw Error("Approval is needed for gas estimation");
1379
+ return [4 /*yield*/, this._borrowMore(collateral, debt, true)];
1380
+ case 2: return [2 /*return*/, _a.sent()];
1381
+ }
1382
+ });
1383
+ });
1384
+ };
1385
+ MintMarketTemplate.prototype.borrowMore = function (collateral, debt) {
1386
+ return __awaiter(this, void 0, void 0, function () {
1387
+ return __generator(this, function (_a) {
1388
+ switch (_a.label) {
1389
+ case 0: return [4 /*yield*/, this.borrowMoreApprove(collateral)];
1390
+ case 1:
1391
+ _a.sent();
1392
+ return [4 /*yield*/, this._borrowMore(collateral, debt, false)];
1393
+ case 2: return [2 /*return*/, _a.sent()];
1394
+ }
1395
+ });
1396
+ });
1397
+ };
1398
+ // ---------------- ADD COLLATERAL ----------------
1399
+ MintMarketTemplate.prototype._addCollateralBands = function (collateral, address) {
1400
+ if (address === void 0) { address = ""; }
1401
+ return __awaiter(this, void 0, void 0, function () {
1402
+ var _a, _currentCollateral, _currentDebt, N, _collateral, _n1, _n2;
1403
+ return __generator(this, function (_c) {
1404
+ switch (_c.label) {
1405
+ case 0:
1406
+ address = _getAddress(address);
1407
+ return [4 /*yield*/, this._userState(address)];
1408
+ case 1:
1409
+ _a = _c.sent(), _currentCollateral = _a._collateral, _currentDebt = _a._debt;
1410
+ if (_currentDebt === BigInt(0))
1411
+ throw Error("Loan for ".concat(address, " does not exist"));
1412
+ return [4 /*yield*/, this.userRange(address)];
1413
+ case 2:
1414
+ N = _c.sent();
1415
+ _collateral = _currentCollateral + parseUnits(collateral, this.collateralDecimals);
1416
+ return [4 /*yield*/, this._calcN1(_collateral, _currentDebt, N)];
1417
+ case 3:
1418
+ _n1 = _c.sent();
1419
+ _n2 = _n1 + BigInt(N - 1);
1420
+ return [2 /*return*/, [_n2, _n1]];
1421
+ }
1422
+ });
1423
+ });
1424
+ };
1425
+ MintMarketTemplate.prototype.addCollateralBands = function (collateral, address) {
1426
+ if (address === void 0) { address = ""; }
1427
+ return __awaiter(this, void 0, void 0, function () {
1428
+ var _a, _n2, _n1;
1429
+ return __generator(this, function (_c) {
1430
+ switch (_c.label) {
1431
+ case 0: return [4 /*yield*/, this._addCollateralBands(collateral, address)];
1432
+ case 1:
1433
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1434
+ return [2 /*return*/, [Number(_n2), Number(_n1)]];
1435
+ }
1436
+ });
1437
+ });
1438
+ };
1439
+ MintMarketTemplate.prototype.addCollateralPrices = function (collateral, address) {
1440
+ if (address === void 0) { address = ""; }
1441
+ return __awaiter(this, void 0, void 0, function () {
1442
+ var _a, _n2, _n1;
1443
+ return __generator(this, function (_c) {
1444
+ switch (_c.label) {
1445
+ case 0: return [4 /*yield*/, this._addCollateralBands(collateral, address)];
1446
+ case 1:
1447
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1448
+ return [4 /*yield*/, this._getPrices(_n2, _n1)];
1449
+ case 2: return [2 /*return*/, _c.sent()];
1450
+ }
1451
+ });
1452
+ });
1453
+ };
1454
+ MintMarketTemplate.prototype.addCollateralHealth = function (collateral, full, address) {
1455
+ var _a;
1456
+ if (full === void 0) { full = true; }
1457
+ if (address === void 0) { address = ""; }
1458
+ return __awaiter(this, void 0, void 0, function () {
1459
+ var _collateral, contract, _health;
1460
+ return __generator(this, function (_c) {
1461
+ switch (_c.label) {
1462
+ case 0:
1463
+ address = _getAddress(address);
1464
+ _collateral = parseUnits(collateral, this.collateralDecimals);
1465
+ contract = llamalend.contracts[(_a = this.healthCalculator) !== null && _a !== void 0 ? _a : this.controller].contract;
1466
+ return [4 /*yield*/, contract.health_calculator(address, _collateral, 0, full, 0, llamalend.constantOptions)];
1467
+ case 1:
1468
+ _health = _c.sent();
1469
+ _health = _health * BigInt(100);
1470
+ return [2 /*return*/, formatUnits(_health)];
1471
+ }
1472
+ });
1473
+ });
1474
+ };
1475
+ MintMarketTemplate.prototype.addCollateralIsApproved = function (collateral) {
1476
+ return __awaiter(this, void 0, void 0, function () {
1477
+ return __generator(this, function (_a) {
1478
+ switch (_a.label) {
1479
+ case 0: return [4 /*yield*/, hasAllowance([this.collateral], [collateral], llamalend.signerAddress, this.controller)];
1480
+ case 1: return [2 /*return*/, _a.sent()];
1481
+ }
1482
+ });
1483
+ });
1484
+ };
1485
+ MintMarketTemplate.prototype.addCollateralApproveEstimateGas = function (collateral) {
1486
+ return __awaiter(this, void 0, void 0, function () {
1487
+ return __generator(this, function (_a) {
1488
+ switch (_a.label) {
1489
+ case 0: return [4 /*yield*/, ensureAllowanceEstimateGas([this.collateral], [collateral], this.controller)];
1490
+ case 1: return [2 /*return*/, _a.sent()];
1491
+ }
1492
+ });
1493
+ });
1494
+ };
1495
+ MintMarketTemplate.prototype.addCollateralApprove = function (collateral) {
1496
+ return __awaiter(this, void 0, void 0, function () {
1497
+ return __generator(this, function (_a) {
1498
+ switch (_a.label) {
1499
+ case 0: return [4 /*yield*/, ensureAllowance([this.collateral], [collateral], this.controller)];
1500
+ case 1: return [2 /*return*/, _a.sent()];
1501
+ }
1502
+ });
1503
+ });
1504
+ };
1505
+ MintMarketTemplate.prototype._addCollateral = function (collateral, address, estimateGas) {
1506
+ return __awaiter(this, void 0, void 0, function () {
1507
+ var _a, stablecoin, currentDebt, _collateral, contract, value, gas, gasLimit;
1508
+ return __generator(this, function (_c) {
1509
+ switch (_c.label) {
1510
+ case 0: return [4 /*yield*/, this.userState(address)];
1511
+ case 1:
1512
+ _a = _c.sent(), stablecoin = _a.stablecoin, currentDebt = _a.debt;
1513
+ if (Number(currentDebt) === 0)
1514
+ throw Error("Loan for ".concat(address, " does not exist"));
1515
+ if (Number(stablecoin) > 0)
1516
+ throw Error("User ".concat(address, " is already in liquidation mode"));
1517
+ _collateral = parseUnits(collateral, this.collateralDecimals);
1518
+ contract = llamalend.contracts[this.controller].contract;
1519
+ value = isEth(this.collateral) ? _collateral : llamalend.parseUnits("0");
1520
+ return [4 /*yield*/, contract.add_collateral.estimateGas(_collateral, address, __assign(__assign({}, llamalend.constantOptions), { value: value }))];
1521
+ case 2:
1522
+ gas = _c.sent();
1523
+ if (estimateGas)
1524
+ return [2 /*return*/, smartNumber(gas)];
1525
+ return [4 /*yield*/, llamalend.updateFeeData()];
1526
+ case 3:
1527
+ _c.sent();
1528
+ gasLimit = _mulBy1_3(DIGas(gas));
1529
+ return [4 /*yield*/, contract.add_collateral(_collateral, address, __assign(__assign({}, llamalend.options), { gasLimit: gasLimit, value: value }))];
1530
+ case 4: return [2 /*return*/, (_c.sent()).hash];
1531
+ }
1532
+ });
1533
+ });
1534
+ };
1535
+ MintMarketTemplate.prototype.addCollateralEstimateGas = function (collateral, address) {
1536
+ if (address === void 0) { address = ""; }
1537
+ return __awaiter(this, void 0, void 0, function () {
1538
+ return __generator(this, function (_a) {
1539
+ switch (_a.label) {
1540
+ case 0:
1541
+ address = _getAddress(address);
1542
+ return [4 /*yield*/, this.addCollateralIsApproved(collateral)];
1543
+ case 1:
1544
+ if (!(_a.sent()))
1545
+ throw Error("Approval is needed for gas estimation");
1546
+ return [4 /*yield*/, this._addCollateral(collateral, address, true)];
1547
+ case 2: return [2 /*return*/, _a.sent()];
1548
+ }
1549
+ });
1550
+ });
1551
+ };
1552
+ MintMarketTemplate.prototype.addCollateral = function (collateral, address) {
1553
+ if (address === void 0) { address = ""; }
1554
+ return __awaiter(this, void 0, void 0, function () {
1555
+ return __generator(this, function (_a) {
1556
+ switch (_a.label) {
1557
+ case 0:
1558
+ address = _getAddress(address);
1559
+ return [4 /*yield*/, this.addCollateralApprove(collateral)];
1560
+ case 1:
1561
+ _a.sent();
1562
+ return [4 /*yield*/, this._addCollateral(collateral, address, false)];
1563
+ case 2: return [2 /*return*/, _a.sent()];
1564
+ }
1565
+ });
1566
+ });
1567
+ };
1568
+ // ---------------- REMOVE COLLATERAL ----------------
1569
+ MintMarketTemplate.prototype.maxRemovable = function () {
1570
+ return __awaiter(this, void 0, void 0, function () {
1571
+ var _a, _currentCollateral, _currentDebt, N, _requiredCollateral;
1572
+ return __generator(this, function (_c) {
1573
+ switch (_c.label) {
1574
+ case 0: return [4 /*yield*/, this._userState()];
1575
+ case 1:
1576
+ _a = _c.sent(), _currentCollateral = _a._collateral, _currentDebt = _a._debt;
1577
+ return [4 /*yield*/, this.userRange()];
1578
+ case 2:
1579
+ N = _c.sent();
1580
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.min_collateral(_currentDebt, N, llamalend.constantOptions)];
1581
+ case 3:
1582
+ _requiredCollateral = _c.sent();
1583
+ return [2 /*return*/, formatUnits(_currentCollateral - _requiredCollateral, this.collateralDecimals)];
1584
+ }
1585
+ });
1586
+ });
1587
+ };
1588
+ MintMarketTemplate.prototype._removeCollateralBands = function (collateral) {
1589
+ return __awaiter(this, void 0, void 0, function () {
1590
+ var _a, _currentCollateral, _currentDebt, N, _collateral, _n1, _n2;
1591
+ return __generator(this, function (_c) {
1592
+ switch (_c.label) {
1593
+ case 0: return [4 /*yield*/, this._userState()];
1594
+ case 1:
1595
+ _a = _c.sent(), _currentCollateral = _a._collateral, _currentDebt = _a._debt;
1596
+ if (_currentDebt === BigInt(0))
1597
+ throw Error("Loan for ".concat(llamalend.signerAddress, " does not exist"));
1598
+ return [4 /*yield*/, this.userRange()];
1599
+ case 2:
1600
+ N = _c.sent();
1601
+ _collateral = _currentCollateral - parseUnits(collateral, this.collateralDecimals);
1602
+ return [4 /*yield*/, this._calcN1(_collateral, _currentDebt, N)];
1603
+ case 3:
1604
+ _n1 = _c.sent();
1605
+ _n2 = _n1 + BigInt(N - 1);
1606
+ return [2 /*return*/, [_n2, _n1]];
1607
+ }
1608
+ });
1609
+ });
1610
+ };
1611
+ MintMarketTemplate.prototype.removeCollateralBands = function (collateral) {
1612
+ return __awaiter(this, void 0, void 0, function () {
1613
+ var _a, _n2, _n1;
1614
+ return __generator(this, function (_c) {
1615
+ switch (_c.label) {
1616
+ case 0: return [4 /*yield*/, this._removeCollateralBands(collateral)];
1617
+ case 1:
1618
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1619
+ return [2 /*return*/, [Number(_n2), Number(_n1)]];
1620
+ }
1621
+ });
1622
+ });
1623
+ };
1624
+ MintMarketTemplate.prototype.removeCollateralPrices = function (collateral) {
1625
+ return __awaiter(this, void 0, void 0, function () {
1626
+ var _a, _n2, _n1;
1627
+ return __generator(this, function (_c) {
1628
+ switch (_c.label) {
1629
+ case 0: return [4 /*yield*/, this._removeCollateralBands(collateral)];
1630
+ case 1:
1631
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1632
+ return [4 /*yield*/, this._getPrices(_n2, _n1)];
1633
+ case 2: return [2 /*return*/, _c.sent()];
1634
+ }
1635
+ });
1636
+ });
1637
+ };
1638
+ MintMarketTemplate.prototype.removeCollateralHealth = function (collateral, full, address) {
1639
+ var _a;
1640
+ if (full === void 0) { full = true; }
1641
+ if (address === void 0) { address = ""; }
1642
+ return __awaiter(this, void 0, void 0, function () {
1643
+ var _collateral, contract, _health;
1644
+ return __generator(this, function (_c) {
1645
+ switch (_c.label) {
1646
+ case 0:
1647
+ address = _getAddress(address);
1648
+ _collateral = parseUnits(collateral, this.collateralDecimals) * BigInt(-1);
1649
+ contract = llamalend.contracts[(_a = this.healthCalculator) !== null && _a !== void 0 ? _a : this.controller].contract;
1650
+ return [4 /*yield*/, contract.health_calculator(address, _collateral, 0, full, 0, llamalend.constantOptions)];
1651
+ case 1:
1652
+ _health = _c.sent();
1653
+ _health = _health * BigInt(100);
1654
+ return [2 /*return*/, formatUnits(_health)];
1655
+ }
1656
+ });
1657
+ });
1658
+ };
1659
+ MintMarketTemplate.prototype._removeCollateral = function (collateral, estimateGas) {
1660
+ return __awaiter(this, void 0, void 0, function () {
1661
+ var _a, stablecoin, currentDebt, _collateral, contract, gas, gasLimit;
1662
+ return __generator(this, function (_c) {
1663
+ switch (_c.label) {
1664
+ case 0: return [4 /*yield*/, this.userState()];
1665
+ case 1:
1666
+ _a = _c.sent(), stablecoin = _a.stablecoin, currentDebt = _a.debt;
1667
+ if (Number(currentDebt) === 0)
1668
+ throw Error("Loan for ".concat(llamalend.signerAddress, " does not exist"));
1669
+ if (Number(stablecoin) > 0)
1670
+ throw Error("User ".concat(llamalend.signerAddress, " is already in liquidation mode"));
1671
+ _collateral = parseUnits(collateral, this.collateralDecimals);
1672
+ contract = llamalend.contracts[this.controller].contract;
1673
+ return [4 /*yield*/, contract.remove_collateral.estimateGas(_collateral, isEth(this.collateral), llamalend.constantOptions)];
1674
+ case 2:
1675
+ gas = _c.sent();
1676
+ if (estimateGas)
1677
+ return [2 /*return*/, smartNumber(gas)];
1678
+ return [4 /*yield*/, llamalend.updateFeeData()];
1679
+ case 3:
1680
+ _c.sent();
1681
+ gasLimit = _mulBy1_3(DIGas(gas));
1682
+ return [4 /*yield*/, contract.remove_collateral(_collateral, isEth(this.collateral), __assign(__assign({}, llamalend.options), { gasLimit: gasLimit }))];
1683
+ case 4: return [2 /*return*/, (_c.sent()).hash];
1684
+ }
1685
+ });
1686
+ });
1687
+ };
1688
+ MintMarketTemplate.prototype.removeCollateralEstimateGas = function (collateral) {
1689
+ return __awaiter(this, void 0, void 0, function () {
1690
+ return __generator(this, function (_a) {
1691
+ switch (_a.label) {
1692
+ case 0: return [4 /*yield*/, this._removeCollateral(collateral, true)];
1693
+ case 1: return [2 /*return*/, _a.sent()];
1694
+ }
1695
+ });
1696
+ });
1697
+ };
1698
+ MintMarketTemplate.prototype.removeCollateral = function (collateral) {
1699
+ return __awaiter(this, void 0, void 0, function () {
1700
+ return __generator(this, function (_a) {
1701
+ switch (_a.label) {
1702
+ case 0: return [4 /*yield*/, this._removeCollateral(collateral, false)];
1703
+ case 1: return [2 /*return*/, _a.sent()];
1704
+ }
1705
+ });
1706
+ });
1707
+ };
1708
+ // ---------------- REPAY ----------------
1709
+ MintMarketTemplate.prototype._repayBands = function (debt, address) {
1710
+ return __awaiter(this, void 0, void 0, function () {
1711
+ var _a, _currentCollateral, _currentDebt, _currentStablecoin, N, _debt, _n1, _c, _n2;
1712
+ return __generator(this, function (_d) {
1713
+ switch (_d.label) {
1714
+ case 0: return [4 /*yield*/, this._userState(address)];
1715
+ case 1:
1716
+ _a = _d.sent(), _currentCollateral = _a._collateral, _currentDebt = _a._debt, _currentStablecoin = _a._stablecoin;
1717
+ if (_currentDebt === BigInt(0))
1718
+ throw Error("Loan for ".concat(address, " does not exist"));
1719
+ return [4 /*yield*/, this.userRange(address)];
1720
+ case 2:
1721
+ N = _d.sent();
1722
+ _debt = _currentDebt - parseUnits(debt);
1723
+ if (!(_currentStablecoin === BigInt(0))) return [3 /*break*/, 4];
1724
+ return [4 /*yield*/, this._calcN1(_currentCollateral, _debt, N)];
1725
+ case 3:
1726
+ _c = _d.sent();
1727
+ return [3 /*break*/, 6];
1728
+ case 4: return [4 /*yield*/, llamalend.contracts[this.address].contract.read_user_tick_numbers(address, llamalend.constantOptions)];
1729
+ case 5:
1730
+ _c = (_d.sent())[0];
1731
+ _d.label = 6;
1732
+ case 6:
1733
+ _n1 = _c;
1734
+ _n2 = _n1 + BigInt(N - 1);
1735
+ return [2 /*return*/, [_n2, _n1]];
1736
+ }
1737
+ });
1738
+ });
1739
+ };
1740
+ MintMarketTemplate.prototype.repayBands = function (debt, address) {
1741
+ if (address === void 0) { address = ""; }
1742
+ return __awaiter(this, void 0, void 0, function () {
1743
+ var _a, _n2, _n1;
1744
+ return __generator(this, function (_c) {
1745
+ switch (_c.label) {
1746
+ case 0: return [4 /*yield*/, this._repayBands(debt, address)];
1747
+ case 1:
1748
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1749
+ return [2 /*return*/, [Number(_n2), Number(_n1)]];
1750
+ }
1751
+ });
1752
+ });
1753
+ };
1754
+ MintMarketTemplate.prototype.repayPrices = function (debt, address) {
1755
+ if (address === void 0) { address = ""; }
1756
+ return __awaiter(this, void 0, void 0, function () {
1757
+ var _a, _n2, _n1;
1758
+ return __generator(this, function (_c) {
1759
+ switch (_c.label) {
1760
+ case 0: return [4 /*yield*/, this._repayBands(debt, address)];
1761
+ case 1:
1762
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
1763
+ return [4 /*yield*/, this._getPrices(_n2, _n1)];
1764
+ case 2: return [2 /*return*/, _c.sent()];
1765
+ }
1766
+ });
1767
+ });
1768
+ };
1769
+ MintMarketTemplate.prototype.repayIsApproved = function (debt) {
1770
+ return __awaiter(this, void 0, void 0, function () {
1771
+ return __generator(this, function (_a) {
1772
+ switch (_a.label) {
1773
+ case 0: return [4 /*yield*/, hasAllowance([llamalend.address], [debt], llamalend.signerAddress, this.controller)];
1774
+ case 1: return [2 /*return*/, _a.sent()];
1775
+ }
1776
+ });
1777
+ });
1778
+ };
1779
+ MintMarketTemplate.prototype.repayApproveEstimateGas = function (debt) {
1780
+ return __awaiter(this, void 0, void 0, function () {
1781
+ return __generator(this, function (_a) {
1782
+ switch (_a.label) {
1783
+ case 0: return [4 /*yield*/, ensureAllowanceEstimateGas([llamalend.address], [debt], this.controller)];
1784
+ case 1: return [2 /*return*/, _a.sent()];
1785
+ }
1786
+ });
1787
+ });
1788
+ };
1789
+ MintMarketTemplate.prototype.repayApprove = function (debt) {
1790
+ return __awaiter(this, void 0, void 0, function () {
1791
+ return __generator(this, function (_a) {
1792
+ switch (_a.label) {
1793
+ case 0: return [4 /*yield*/, ensureAllowance([llamalend.address], [debt], this.controller)];
1794
+ case 1: return [2 /*return*/, _a.sent()];
1795
+ }
1796
+ });
1797
+ });
1798
+ };
1799
+ MintMarketTemplate.prototype.repayHealth = function (debt, full, address) {
1800
+ var _a;
1801
+ if (full === void 0) { full = true; }
1802
+ if (address === void 0) { address = ""; }
1803
+ return __awaiter(this, void 0, void 0, function () {
1804
+ var _debt, contract, _health;
1805
+ return __generator(this, function (_c) {
1806
+ switch (_c.label) {
1807
+ case 0:
1808
+ address = _getAddress(address);
1809
+ _debt = parseUnits(debt) * BigInt(-1);
1810
+ contract = llamalend.contracts[(_a = this.healthCalculator) !== null && _a !== void 0 ? _a : this.controller].contract;
1811
+ return [4 /*yield*/, contract.health_calculator(address, 0, _debt, full, 0, llamalend.constantOptions)];
1812
+ case 1:
1813
+ _health = _c.sent();
1814
+ _health = _health * BigInt(100);
1815
+ return [2 /*return*/, formatUnits(_health)];
1816
+ }
1817
+ });
1818
+ });
1819
+ };
1820
+ MintMarketTemplate.prototype._repay = function (debt, address, estimateGas) {
1821
+ return __awaiter(this, void 0, void 0, function () {
1822
+ var currentDebt, _debt, contract, _a, _, n1, stablecoin, n, gas, gasLimit;
1823
+ return __generator(this, function (_c) {
1824
+ switch (_c.label) {
1825
+ case 0:
1826
+ address = _getAddress(address);
1827
+ return [4 /*yield*/, this.userState(address)];
1828
+ case 1:
1829
+ currentDebt = (_c.sent()).debt;
1830
+ if (Number(currentDebt) === 0)
1831
+ throw Error("Loan for ".concat(address, " does not exist"));
1832
+ _debt = parseUnits(debt);
1833
+ contract = llamalend.contracts[this.controller].contract;
1834
+ return [4 /*yield*/, this.userBands(address)];
1835
+ case 2:
1836
+ _a = _c.sent(), _ = _a[0], n1 = _a[1];
1837
+ return [4 /*yield*/, this.userState(address)];
1838
+ case 3:
1839
+ stablecoin = (_c.sent()).stablecoin;
1840
+ n = (BN(stablecoin).gt(0)) ? MAX_ACTIVE_BAND : n1 - 1;
1841
+ return [4 /*yield*/, contract.repay.estimateGas(_debt, address, n, isEth(this.collateral), llamalend.constantOptions)];
1842
+ case 4:
1843
+ gas = _c.sent();
1844
+ if (estimateGas)
1845
+ return [2 /*return*/, smartNumber(gas)];
1846
+ return [4 /*yield*/, llamalend.updateFeeData()];
1847
+ case 5:
1848
+ _c.sent();
1849
+ gasLimit = _mulBy1_3(DIGas(gas));
1850
+ return [4 /*yield*/, contract.repay(_debt, address, n, isEth(this.collateral), __assign(__assign({}, llamalend.options), { gasLimit: gasLimit }))];
1851
+ case 6: return [2 /*return*/, (_c.sent()).hash];
1852
+ }
1853
+ });
1854
+ });
1855
+ };
1856
+ MintMarketTemplate.prototype.repayEstimateGas = function (debt, address) {
1857
+ if (address === void 0) { address = ""; }
1858
+ return __awaiter(this, void 0, void 0, function () {
1859
+ return __generator(this, function (_a) {
1860
+ switch (_a.label) {
1861
+ case 0: return [4 /*yield*/, this.repayIsApproved(debt)];
1862
+ case 1:
1863
+ if (!(_a.sent()))
1864
+ throw Error("Approval is needed for gas estimation");
1865
+ return [4 /*yield*/, this._repay(debt, address, true)];
1866
+ case 2: return [2 /*return*/, _a.sent()];
1867
+ }
1868
+ });
1869
+ });
1870
+ };
1871
+ MintMarketTemplate.prototype.repay = function (debt, address) {
1872
+ if (address === void 0) { address = ""; }
1873
+ return __awaiter(this, void 0, void 0, function () {
1874
+ return __generator(this, function (_a) {
1875
+ switch (_a.label) {
1876
+ case 0: return [4 /*yield*/, this.repayApprove(debt)];
1877
+ case 1:
1878
+ _a.sent();
1879
+ return [4 /*yield*/, this._repay(debt, address, false)];
1880
+ case 2: return [2 /*return*/, _a.sent()];
1881
+ }
1882
+ });
1883
+ });
1884
+ };
1885
+ // ---------------- FULL REPAY ----------------
1886
+ MintMarketTemplate.prototype._fullRepayAmount = function (address) {
1887
+ if (address === void 0) { address = ""; }
1888
+ return __awaiter(this, void 0, void 0, function () {
1889
+ var debt;
1890
+ return __generator(this, function (_a) {
1891
+ switch (_a.label) {
1892
+ case 0:
1893
+ address = _getAddress(address);
1894
+ return [4 /*yield*/, this.userDebt(address)];
1895
+ case 1:
1896
+ debt = _a.sent();
1897
+ return [2 /*return*/, BN(debt).times(1.0001).toString()];
1898
+ }
1899
+ });
1900
+ });
1901
+ };
1902
+ MintMarketTemplate.prototype.fullRepayIsApproved = function (address) {
1903
+ if (address === void 0) { address = ""; }
1904
+ return __awaiter(this, void 0, void 0, function () {
1905
+ var fullRepayAmount;
1906
+ return __generator(this, function (_a) {
1907
+ switch (_a.label) {
1908
+ case 0:
1909
+ address = _getAddress(address);
1910
+ return [4 /*yield*/, this._fullRepayAmount(address)];
1911
+ case 1:
1912
+ fullRepayAmount = _a.sent();
1913
+ return [4 /*yield*/, this.repayIsApproved(fullRepayAmount)];
1914
+ case 2: return [2 /*return*/, _a.sent()];
1915
+ }
1916
+ });
1917
+ });
1918
+ };
1919
+ MintMarketTemplate.prototype.fullRepayApproveEstimateGas = function (address) {
1920
+ if (address === void 0) { address = ""; }
1921
+ return __awaiter(this, void 0, void 0, function () {
1922
+ var fullRepayAmount;
1923
+ return __generator(this, function (_a) {
1924
+ switch (_a.label) {
1925
+ case 0:
1926
+ address = _getAddress(address);
1927
+ return [4 /*yield*/, this._fullRepayAmount(address)];
1928
+ case 1:
1929
+ fullRepayAmount = _a.sent();
1930
+ return [4 /*yield*/, this.repayApproveEstimateGas(fullRepayAmount)];
1931
+ case 2: return [2 /*return*/, _a.sent()];
1932
+ }
1933
+ });
1934
+ });
1935
+ };
1936
+ MintMarketTemplate.prototype.fullRepayApprove = function (address) {
1937
+ if (address === void 0) { address = ""; }
1938
+ return __awaiter(this, void 0, void 0, function () {
1939
+ var fullRepayAmount;
1940
+ return __generator(this, function (_a) {
1941
+ switch (_a.label) {
1942
+ case 0:
1943
+ address = _getAddress(address);
1944
+ return [4 /*yield*/, this._fullRepayAmount(address)];
1945
+ case 1:
1946
+ fullRepayAmount = _a.sent();
1947
+ return [4 /*yield*/, this.repayApprove(fullRepayAmount)];
1948
+ case 2: return [2 /*return*/, _a.sent()];
1949
+ }
1950
+ });
1951
+ });
1952
+ };
1953
+ MintMarketTemplate.prototype.fullRepayEstimateGas = function (address) {
1954
+ if (address === void 0) { address = ""; }
1955
+ return __awaiter(this, void 0, void 0, function () {
1956
+ var fullRepayAmount;
1957
+ return __generator(this, function (_a) {
1958
+ switch (_a.label) {
1959
+ case 0:
1960
+ address = _getAddress(address);
1961
+ return [4 /*yield*/, this._fullRepayAmount(address)];
1962
+ case 1:
1963
+ fullRepayAmount = _a.sent();
1964
+ return [4 /*yield*/, this.repayIsApproved(fullRepayAmount)];
1965
+ case 2:
1966
+ if (!(_a.sent()))
1967
+ throw Error("Approval is needed for gas estimation");
1968
+ return [4 /*yield*/, this._repay(fullRepayAmount, address, true)];
1969
+ case 3: return [2 /*return*/, _a.sent()];
1970
+ }
1971
+ });
1972
+ });
1973
+ };
1974
+ MintMarketTemplate.prototype.fullRepay = function (address) {
1975
+ if (address === void 0) { address = ""; }
1976
+ return __awaiter(this, void 0, void 0, function () {
1977
+ var fullRepayAmount;
1978
+ return __generator(this, function (_a) {
1979
+ switch (_a.label) {
1980
+ case 0:
1981
+ address = _getAddress(address);
1982
+ return [4 /*yield*/, this._fullRepayAmount(address)];
1983
+ case 1:
1984
+ fullRepayAmount = _a.sent();
1985
+ return [4 /*yield*/, this.repayApprove(fullRepayAmount)];
1986
+ case 2:
1987
+ _a.sent();
1988
+ return [4 /*yield*/, this._repay(fullRepayAmount, address, false)];
1989
+ case 3: return [2 /*return*/, _a.sent()];
1990
+ }
1991
+ });
1992
+ });
1993
+ };
1994
+ // ---------------- SWAP ----------------
1995
+ MintMarketTemplate.prototype.maxSwappable = function (i, j) {
1996
+ return __awaiter(this, void 0, void 0, function () {
1997
+ var inDecimals, contract, _a, _inAmount, _outAmount;
1998
+ return __generator(this, function (_c) {
1999
+ switch (_c.label) {
2000
+ case 0:
2001
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0))
2002
+ throw Error("Wrong index");
2003
+ inDecimals = this.coinDecimals[i];
2004
+ contract = llamalend.contracts[this.address].contract;
2005
+ return [4 /*yield*/, contract.get_dxdy(i, j, MAX_ALLOWANCE, llamalend.constantOptions)];
2006
+ case 1:
2007
+ _a = _c.sent(), _inAmount = _a[0], _outAmount = _a[1];
2008
+ if (_outAmount === BigInt(0))
2009
+ return [2 /*return*/, "0"];
2010
+ return [2 /*return*/, formatUnits(_inAmount, inDecimals)];
2011
+ }
2012
+ });
2013
+ });
2014
+ };
2015
+ MintMarketTemplate.prototype._swapExpected = function (i, j, _amount) {
2016
+ return __awaiter(this, void 0, void 0, function () {
2017
+ return __generator(this, function (_a) {
2018
+ switch (_a.label) {
2019
+ case 0: return [4 /*yield*/, llamalend.contracts[this.address].contract.get_dy(i, j, _amount, llamalend.constantOptions)];
2020
+ case 1: return [2 /*return*/, _a.sent()];
2021
+ }
2022
+ });
2023
+ });
2024
+ };
2025
+ MintMarketTemplate.prototype.swapExpected = function (i, j, amount) {
2026
+ return __awaiter(this, void 0, void 0, function () {
2027
+ var _a, inDecimals, outDecimals, _amount, _expected;
2028
+ return __generator(this, function (_c) {
2029
+ switch (_c.label) {
2030
+ case 0:
2031
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0))
2032
+ throw Error("Wrong index");
2033
+ _a = this.coinDecimals, inDecimals = _a[0], outDecimals = _a[1];
2034
+ _amount = parseUnits(amount, inDecimals);
2035
+ return [4 /*yield*/, this._swapExpected(i, j, _amount)];
2036
+ case 1:
2037
+ _expected = _c.sent();
2038
+ return [2 /*return*/, formatUnits(_expected, outDecimals)];
2039
+ }
2040
+ });
2041
+ });
2042
+ };
2043
+ MintMarketTemplate.prototype.swapRequired = function (i, j, outAmount) {
2044
+ return __awaiter(this, void 0, void 0, function () {
2045
+ var _a, inDecimals, outDecimals, _amount, _expected;
2046
+ return __generator(this, function (_c) {
2047
+ switch (_c.label) {
2048
+ case 0:
2049
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0))
2050
+ throw Error("Wrong index");
2051
+ _a = this.coinDecimals, inDecimals = _a[0], outDecimals = _a[1];
2052
+ _amount = parseUnits(outAmount, outDecimals);
2053
+ return [4 /*yield*/, llamalend.contracts[this.address].contract.get_dx(i, j, _amount, llamalend.constantOptions)];
2054
+ case 1:
2055
+ _expected = _c.sent();
2056
+ return [2 /*return*/, formatUnits(_expected, inDecimals)];
2057
+ }
2058
+ });
2059
+ });
2060
+ };
2061
+ MintMarketTemplate.prototype.swapPriceImpact = function (i, j, amount) {
2062
+ return __awaiter(this, void 0, void 0, function () {
2063
+ var _a, inDecimals, outDecimals, _amount, _output, target, amountIntBN, outputIntBN, k, smallAmountIntBN, _smallAmount, _smallOutput, amountBN, outputBN, smallAmountBN, smallOutputBN, rateBN, smallRateBN, slippageBN;
2064
+ return __generator(this, function (_c) {
2065
+ switch (_c.label) {
2066
+ case 0:
2067
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0))
2068
+ throw Error("Wrong index");
2069
+ _a = this.coinDecimals, inDecimals = _a[0], outDecimals = _a[1];
2070
+ _amount = parseUnits(amount, inDecimals);
2071
+ return [4 /*yield*/, this._swapExpected(i, j, _amount)];
2072
+ case 1:
2073
+ _output = _c.sent();
2074
+ target = BN(Math.pow(10, 15));
2075
+ amountIntBN = BN(amount).times(Math.pow(10, inDecimals));
2076
+ outputIntBN = toBN(_output, 0);
2077
+ k = BigNumber.min(BigNumber.max(target.div(amountIntBN), target.div(outputIntBN)), 0.2);
2078
+ smallAmountIntBN = BigNumber.min(amountIntBN.times(k), BN(Math.pow(10, inDecimals)));
2079
+ if (smallAmountIntBN.toFixed(0) === '0')
2080
+ return [2 /*return*/, '0'];
2081
+ _smallAmount = fromBN(smallAmountIntBN.div(Math.pow(10, inDecimals)), inDecimals);
2082
+ return [4 /*yield*/, this._swapExpected(i, j, _smallAmount)];
2083
+ case 2:
2084
+ _smallOutput = _c.sent();
2085
+ amountBN = BN(amount);
2086
+ outputBN = toBN(_output, outDecimals);
2087
+ smallAmountBN = toBN(_smallAmount, inDecimals);
2088
+ smallOutputBN = toBN(_smallOutput, outDecimals);
2089
+ rateBN = outputBN.div(amountBN);
2090
+ smallRateBN = smallOutputBN.div(smallAmountBN);
2091
+ if (rateBN.gt(smallRateBN))
2092
+ return [2 /*return*/, "0"];
2093
+ slippageBN = BN(1).minus(rateBN.div(smallRateBN)).times(100);
2094
+ return [2 /*return*/, _cutZeros(slippageBN.toFixed(6))];
2095
+ }
2096
+ });
2097
+ });
2098
+ };
2099
+ MintMarketTemplate.prototype.swapIsApproved = function (i, amount) {
2100
+ return __awaiter(this, void 0, void 0, function () {
2101
+ return __generator(this, function (_a) {
2102
+ switch (_a.label) {
2103
+ case 0:
2104
+ if (i !== 0 && i !== 1)
2105
+ throw Error("Wrong index");
2106
+ return [4 /*yield*/, hasAllowance([this.coinAddresses[i]], [amount], llamalend.signerAddress, this.address)];
2107
+ case 1: return [2 /*return*/, _a.sent()];
2108
+ }
2109
+ });
2110
+ });
2111
+ };
2112
+ MintMarketTemplate.prototype.swapApproveEstimateGas = function (i, amount) {
2113
+ return __awaiter(this, void 0, void 0, function () {
2114
+ return __generator(this, function (_a) {
2115
+ switch (_a.label) {
2116
+ case 0:
2117
+ if (i !== 0 && i !== 1)
2118
+ throw Error("Wrong index");
2119
+ return [4 /*yield*/, ensureAllowanceEstimateGas([this.coinAddresses[i]], [amount], this.address)];
2120
+ case 1: return [2 /*return*/, _a.sent()];
2121
+ }
2122
+ });
2123
+ });
2124
+ };
2125
+ MintMarketTemplate.prototype.swapApprove = function (i, amount) {
2126
+ return __awaiter(this, void 0, void 0, function () {
2127
+ return __generator(this, function (_a) {
2128
+ switch (_a.label) {
2129
+ case 0:
2130
+ if (i !== 0 && i !== 1)
2131
+ throw Error("Wrong index");
2132
+ return [4 /*yield*/, ensureAllowance([this.coinAddresses[i]], [amount], this.address)];
2133
+ case 1: return [2 /*return*/, _a.sent()];
2134
+ }
2135
+ });
2136
+ });
2137
+ };
2138
+ MintMarketTemplate.prototype._swap = function (i, j, amount, slippage, estimateGas) {
2139
+ return __awaiter(this, void 0, void 0, function () {
2140
+ var _a, inDecimals, outDecimals, _amount, _expected, minRecvAmountBN, _minRecvAmount, contract, gas, gasLimit;
2141
+ return __generator(this, function (_c) {
2142
+ switch (_c.label) {
2143
+ case 0:
2144
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0))
2145
+ throw Error("Wrong index");
2146
+ _a = [this.coinDecimals[i], this.coinDecimals[j]], inDecimals = _a[0], outDecimals = _a[1];
2147
+ _amount = parseUnits(amount, inDecimals);
2148
+ return [4 /*yield*/, this._swapExpected(i, j, _amount)];
2149
+ case 1:
2150
+ _expected = _c.sent();
2151
+ minRecvAmountBN = toBN(_expected, outDecimals).times(100 - slippage).div(100);
2152
+ _minRecvAmount = fromBN(minRecvAmountBN, outDecimals);
2153
+ contract = llamalend.contracts[this.address].contract;
2154
+ return [4 /*yield*/, contract.exchange.estimateGas(i, j, _amount, _minRecvAmount, llamalend.constantOptions)];
2155
+ case 2:
2156
+ gas = _c.sent();
2157
+ if (estimateGas)
2158
+ return [2 /*return*/, smartNumber(gas)];
2159
+ return [4 /*yield*/, llamalend.updateFeeData()];
2160
+ case 3:
2161
+ _c.sent();
2162
+ gasLimit = _mulBy1_3(DIGas(gas));
2163
+ return [4 /*yield*/, contract.exchange(i, j, _amount, _minRecvAmount, __assign(__assign({}, llamalend.options), { gasLimit: gasLimit }))];
2164
+ case 4: return [2 /*return*/, (_c.sent()).hash];
2165
+ }
2166
+ });
2167
+ });
2168
+ };
2169
+ MintMarketTemplate.prototype.swapEstimateGas = function (i, j, amount, slippage) {
2170
+ if (slippage === void 0) { slippage = 0.1; }
2171
+ return __awaiter(this, void 0, void 0, function () {
2172
+ return __generator(this, function (_a) {
2173
+ switch (_a.label) {
2174
+ case 0: return [4 /*yield*/, this.swapIsApproved(i, amount)];
2175
+ case 1:
2176
+ if (!(_a.sent()))
2177
+ throw Error("Approval is needed for gas estimation");
2178
+ return [4 /*yield*/, this._swap(i, j, amount, slippage, true)];
2179
+ case 2: return [2 /*return*/, _a.sent()];
2180
+ }
2181
+ });
2182
+ });
2183
+ };
2184
+ MintMarketTemplate.prototype.swap = function (i, j, amount, slippage) {
2185
+ if (slippage === void 0) { slippage = 0.1; }
2186
+ return __awaiter(this, void 0, void 0, function () {
2187
+ return __generator(this, function (_a) {
2188
+ switch (_a.label) {
2189
+ case 0: return [4 /*yield*/, this.swapApprove(i, amount)];
2190
+ case 1:
2191
+ _a.sent();
2192
+ return [4 /*yield*/, this._swap(i, j, amount, slippage, false)];
2193
+ case 2: return [2 /*return*/, _a.sent()];
2194
+ }
2195
+ });
2196
+ });
2197
+ };
2198
+ // ---------------- LIQUIDATE ----------------
2199
+ MintMarketTemplate.prototype.tokensToLiquidate = function (address) {
2200
+ if (address === void 0) { address = ""; }
2201
+ return __awaiter(this, void 0, void 0, function () {
2202
+ var _tokens;
2203
+ return __generator(this, function (_a) {
2204
+ switch (_a.label) {
2205
+ case 0:
2206
+ address = _getAddress(address);
2207
+ return [4 /*yield*/, llamalend.contracts[this.controller].contract.tokens_to_liquidate(address, llamalend.constantOptions)];
2208
+ case 1:
2209
+ _tokens = _a.sent();
2210
+ return [2 /*return*/, formatUnits(_tokens)];
2211
+ }
2212
+ });
2213
+ });
2214
+ };
2215
+ MintMarketTemplate.prototype.liquidateIsApproved = function (address) {
2216
+ if (address === void 0) { address = ""; }
2217
+ return __awaiter(this, void 0, void 0, function () {
2218
+ var tokensToLiquidate;
2219
+ return __generator(this, function (_a) {
2220
+ switch (_a.label) {
2221
+ case 0: return [4 /*yield*/, this.tokensToLiquidate(address)];
2222
+ case 1:
2223
+ tokensToLiquidate = _a.sent();
2224
+ return [4 /*yield*/, hasAllowance([llamalend.address], [tokensToLiquidate], llamalend.signerAddress, this.controller)];
2225
+ case 2: return [2 /*return*/, _a.sent()];
2226
+ }
2227
+ });
2228
+ });
2229
+ };
2230
+ MintMarketTemplate.prototype.liquidateApproveEstimateGas = function (address) {
2231
+ if (address === void 0) { address = ""; }
2232
+ return __awaiter(this, void 0, void 0, function () {
2233
+ var tokensToLiquidate;
2234
+ return __generator(this, function (_a) {
2235
+ switch (_a.label) {
2236
+ case 0: return [4 /*yield*/, this.tokensToLiquidate(address)];
2237
+ case 1:
2238
+ tokensToLiquidate = _a.sent();
2239
+ return [4 /*yield*/, ensureAllowanceEstimateGas([llamalend.address], [tokensToLiquidate], this.controller)];
2240
+ case 2: return [2 /*return*/, _a.sent()];
2241
+ }
2242
+ });
2243
+ });
2244
+ };
2245
+ MintMarketTemplate.prototype.liquidateApprove = function (address) {
2246
+ if (address === void 0) { address = ""; }
2247
+ return __awaiter(this, void 0, void 0, function () {
2248
+ var tokensToLiquidate;
2249
+ return __generator(this, function (_a) {
2250
+ switch (_a.label) {
2251
+ case 0: return [4 /*yield*/, this.tokensToLiquidate(address)];
2252
+ case 1:
2253
+ tokensToLiquidate = _a.sent();
2254
+ return [4 /*yield*/, ensureAllowance([llamalend.address], [tokensToLiquidate], this.controller)];
2255
+ case 2: return [2 /*return*/, _a.sent()];
2256
+ }
2257
+ });
2258
+ });
2259
+ };
2260
+ MintMarketTemplate.prototype._liquidate = function (address, slippage, estimateGas) {
2261
+ return __awaiter(this, void 0, void 0, function () {
2262
+ var _a, stablecoin, currentDebt, minAmountBN, _minAmount, contract, gas, gasLimit;
2263
+ return __generator(this, function (_c) {
2264
+ switch (_c.label) {
2265
+ case 0: return [4 /*yield*/, this.userState(address)];
2266
+ case 1:
2267
+ _a = _c.sent(), stablecoin = _a.stablecoin, currentDebt = _a.debt;
2268
+ if (slippage <= 0)
2269
+ throw Error("Slippage must be > 0");
2270
+ if (slippage > 100)
2271
+ throw Error("Slippage must be <= 100");
2272
+ if (Number(currentDebt) === 0)
2273
+ throw Error("Loan for ".concat(address, " does not exist"));
2274
+ if (Number(stablecoin) === 0)
2275
+ throw Error("User ".concat(address, " is not in liquidation mode"));
2276
+ minAmountBN = BN(stablecoin).times(100 - slippage).div(100);
2277
+ _minAmount = fromBN(minAmountBN);
2278
+ contract = llamalend.contracts[this.controller].contract;
2279
+ return [4 /*yield*/, contract.liquidate.estimateGas(address, _minAmount, isEth(this.collateral), llamalend.constantOptions)];
2280
+ case 2:
2281
+ gas = (_c.sent());
2282
+ if (estimateGas)
2283
+ return [2 /*return*/, smartNumber(gas)];
2284
+ return [4 /*yield*/, llamalend.updateFeeData()];
2285
+ case 3:
2286
+ _c.sent();
2287
+ gasLimit = _mulBy1_3(DIGas(gas));
2288
+ return [4 /*yield*/, contract.liquidate(address, _minAmount, isEth(this.collateral), __assign(__assign({}, llamalend.options), { gasLimit: gasLimit }))];
2289
+ case 4: return [2 /*return*/, (_c.sent()).hash];
2290
+ }
2291
+ });
2292
+ });
2293
+ };
2294
+ MintMarketTemplate.prototype.liquidateEstimateGas = function (address, slippage) {
2295
+ if (slippage === void 0) { slippage = 0.1; }
2296
+ return __awaiter(this, void 0, void 0, function () {
2297
+ return __generator(this, function (_a) {
2298
+ switch (_a.label) {
2299
+ case 0: return [4 /*yield*/, this.liquidateIsApproved(address)];
2300
+ case 1:
2301
+ if (!(_a.sent()))
2302
+ throw Error("Approval is needed for gas estimation");
2303
+ return [4 /*yield*/, this._liquidate(address, slippage, true)];
2304
+ case 2: return [2 /*return*/, _a.sent()];
2305
+ }
2306
+ });
2307
+ });
2308
+ };
2309
+ MintMarketTemplate.prototype.liquidate = function (address, slippage) {
2310
+ if (slippage === void 0) { slippage = 0.1; }
2311
+ return __awaiter(this, void 0, void 0, function () {
2312
+ return __generator(this, function (_a) {
2313
+ switch (_a.label) {
2314
+ case 0: return [4 /*yield*/, this.liquidateApprove(address)];
2315
+ case 1:
2316
+ _a.sent();
2317
+ return [4 /*yield*/, this._liquidate(address, slippage, false)];
2318
+ case 2: return [2 /*return*/, _a.sent()];
2319
+ }
2320
+ });
2321
+ });
2322
+ };
2323
+ // ---------------- SELF-LIQUIDATE ----------------
2324
+ MintMarketTemplate.prototype.selfLiquidateIsApproved = function () {
2325
+ return __awaiter(this, void 0, void 0, function () {
2326
+ return __generator(this, function (_a) {
2327
+ switch (_a.label) {
2328
+ case 0: return [4 /*yield*/, this.liquidateIsApproved()];
2329
+ case 1: return [2 /*return*/, _a.sent()];
2330
+ }
2331
+ });
2332
+ });
2333
+ };
2334
+ MintMarketTemplate.prototype.selfLiquidateApproveEstimateGas = function () {
2335
+ return __awaiter(this, void 0, void 0, function () {
2336
+ return __generator(this, function (_a) {
2337
+ return [2 /*return*/, this.liquidateApproveEstimateGas()];
2338
+ });
2339
+ });
2340
+ };
2341
+ MintMarketTemplate.prototype.selfLiquidateApprove = function () {
2342
+ return __awaiter(this, void 0, void 0, function () {
2343
+ return __generator(this, function (_a) {
2344
+ switch (_a.label) {
2345
+ case 0: return [4 /*yield*/, this.liquidateApprove()];
2346
+ case 1: return [2 /*return*/, _a.sent()];
2347
+ }
2348
+ });
2349
+ });
2350
+ };
2351
+ MintMarketTemplate.prototype.selfLiquidateEstimateGas = function (slippage) {
2352
+ if (slippage === void 0) { slippage = 0.1; }
2353
+ return __awaiter(this, void 0, void 0, function () {
2354
+ return __generator(this, function (_a) {
2355
+ switch (_a.label) {
2356
+ case 0: return [4 /*yield*/, this.selfLiquidateIsApproved()];
2357
+ case 1:
2358
+ if (!(_a.sent()))
2359
+ throw Error("Approval is needed for gas estimation");
2360
+ return [4 /*yield*/, this._liquidate(llamalend.signerAddress, slippage, true)];
2361
+ case 2: return [2 /*return*/, _a.sent()];
2362
+ }
2363
+ });
2364
+ });
2365
+ };
2366
+ MintMarketTemplate.prototype.selfLiquidate = function (slippage) {
2367
+ if (slippage === void 0) { slippage = 0.1; }
2368
+ return __awaiter(this, void 0, void 0, function () {
2369
+ return __generator(this, function (_a) {
2370
+ switch (_a.label) {
2371
+ case 0: return [4 /*yield*/, this.selfLiquidateApprove()];
2372
+ case 1:
2373
+ _a.sent();
2374
+ return [4 /*yield*/, this._liquidate(llamalend.signerAddress, slippage, false)];
2375
+ case 2: return [2 /*return*/, _a.sent()];
2376
+ }
2377
+ });
2378
+ });
2379
+ };
2380
+ // ---------------- CREATE LOAN WITH LEVERAGE ----------------
2381
+ MintMarketTemplate.prototype._getBestIdx = function (_amounts) {
2382
+ var bestIdx = 0;
2383
+ for (var i = 1; i < 5; i++) {
2384
+ if (_amounts[i] > _amounts[bestIdx])
2385
+ bestIdx = i;
2386
+ }
2387
+ return bestIdx;
2388
+ };
2389
+ MintMarketTemplate.prototype._checkLeverageZap = function () {
2390
+ if (this.leverageZap === "0x0000000000000000000000000000000000000000")
2391
+ throw Error("There is no leverage for ".concat(this.id, " market"));
2392
+ };
2393
+ MintMarketTemplate.prototype.leverageCreateLoanMaxRecv = function (collateral, range) {
2394
+ return __awaiter(this, void 0, void 0, function () {
2395
+ var _collateral, calls, i, _res, _maxBorrowable, _maxCollateral, routeIdx, maxBorrowable, maxCollateral;
2396
+ return __generator(this, function (_a) {
2397
+ switch (_a.label) {
2398
+ case 0:
2399
+ this._checkLeverageZap();
2400
+ this._checkRange(range);
2401
+ _collateral = parseUnits(collateral, this.collateralDecimals);
2402
+ calls = [];
2403
+ for (i = 0; i < 5; i++) {
2404
+ calls.push(llamalend.contracts[this.leverageZap].multicallContract.max_borrowable_and_collateral(_collateral, range, i));
2405
+ }
2406
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
2407
+ case 1:
2408
+ _res = _a.sent();
2409
+ _maxBorrowable = _res.map(function (r) { return r[0] * BigInt(999) / BigInt(1000); });
2410
+ _maxCollateral = _res.map(function (r) { return r[1] * BigInt(999) / BigInt(1000); });
2411
+ routeIdx = this._getBestIdx(_maxCollateral);
2412
+ maxBorrowable = llamalend.formatUnits(_maxBorrowable[routeIdx]);
2413
+ maxCollateral = llamalend.formatUnits(_maxCollateral[routeIdx], this.collateralDecimals);
2414
+ return [2 /*return*/, {
2415
+ maxBorrowable: maxBorrowable,
2416
+ maxCollateral: maxCollateral,
2417
+ leverage: BN(maxCollateral).div(collateral).toFixed(4),
2418
+ routeIdx: routeIdx,
2419
+ }];
2420
+ }
2421
+ });
2422
+ });
2423
+ };
2424
+ MintMarketTemplate.prototype._getRouteIdx = function (userCollateral, debt) {
2425
+ return __awaiter(this, void 0, void 0, function () {
2426
+ var routeIdx;
2427
+ return __generator(this, function (_a) {
2428
+ switch (_a.label) {
2429
+ case 0: return [4 /*yield*/, this._leverageCreateLoanCollateral(userCollateral, debt)];
2430
+ case 1:
2431
+ routeIdx = (_a.sent()).routeIdx;
2432
+ return [2 /*return*/, routeIdx];
2433
+ }
2434
+ });
2435
+ });
2436
+ };
2437
+ MintMarketTemplate.prototype.leverageCreateLoanCollateral = function (userCollateral, debt) {
2438
+ return __awaiter(this, void 0, void 0, function () {
2439
+ var _a, _collateral, routeIdx, collateral;
2440
+ return __generator(this, function (_c) {
2441
+ switch (_c.label) {
2442
+ case 0:
2443
+ this._checkLeverageZap();
2444
+ return [4 /*yield*/, this._leverageCreateLoanCollateral(userCollateral, debt)];
2445
+ case 1:
2446
+ _a = _c.sent(), _collateral = _a._collateral, routeIdx = _a.routeIdx;
2447
+ collateral = llamalend.formatUnits(_collateral, this.collateralDecimals);
2448
+ return [2 /*return*/, { collateral: collateral, leverage: BN(collateral).div(userCollateral).toFixed(4), routeIdx: routeIdx }];
2449
+ }
2450
+ });
2451
+ });
2452
+ };
2453
+ MintMarketTemplate.prototype.leverageGetRouteName = function (routeIdx) {
2454
+ return __awaiter(this, void 0, void 0, function () {
2455
+ return __generator(this, function (_a) {
2456
+ switch (_a.label) {
2457
+ case 0:
2458
+ this._checkLeverageZap();
2459
+ return [4 /*yield*/, llamalend.contracts[this.leverageZap].contract.route_names(routeIdx)];
2460
+ case 1: return [2 /*return*/, _a.sent()];
2461
+ }
2462
+ });
2463
+ });
2464
+ };
2465
+ MintMarketTemplate.prototype.leverageGetMaxRange = function (collateral, debt) {
2466
+ return __awaiter(this, void 0, void 0, function () {
2467
+ var routeIdx, maxRecv, N;
2468
+ return __generator(this, function (_a) {
2469
+ switch (_a.label) {
2470
+ case 0:
2471
+ this._checkLeverageZap();
2472
+ return [4 /*yield*/, this._getRouteIdx(collateral, debt)];
2473
+ case 1:
2474
+ routeIdx = _a.sent();
2475
+ return [4 /*yield*/, this._leverageCreateLoanMaxRecvAllRanges2(collateral, routeIdx)];
2476
+ case 2:
2477
+ maxRecv = _a.sent();
2478
+ for (N = this.minBands; N <= this.maxBands; N++) {
2479
+ if (BN(debt).gt(BN(maxRecv[N].maxBorrowable)))
2480
+ return [2 /*return*/, N - 1];
2481
+ }
2482
+ return [2 /*return*/, this.maxBands];
2483
+ }
2484
+ });
2485
+ });
2486
+ };
2487
+ MintMarketTemplate.prototype._leverageCalcN1 = function (collateral, debt, range) {
2488
+ return __awaiter(this, void 0, void 0, function () {
2489
+ var routeIdx, _collateral, _debt;
2490
+ return __generator(this, function (_a) {
2491
+ switch (_a.label) {
2492
+ case 0:
2493
+ this._checkRange(range);
2494
+ return [4 /*yield*/, this._getRouteIdx(collateral, debt)];
2495
+ case 1:
2496
+ routeIdx = _a.sent();
2497
+ _collateral = parseUnits(collateral, this.collateralDecimals);
2498
+ _debt = parseUnits(debt);
2499
+ return [4 /*yield*/, llamalend.contracts[this.leverageZap].contract.calculate_debt_n1(_collateral, _debt, range, routeIdx, llamalend.constantOptions)];
2500
+ case 2: return [2 /*return*/, _a.sent()];
2501
+ }
2502
+ });
2503
+ });
2504
+ };
2505
+ MintMarketTemplate.prototype._leverageCalcN1AllRanges = function (collateral, debt, maxN) {
2506
+ return __awaiter(this, void 0, void 0, function () {
2507
+ var routeIdx, _collateral, _debt, calls, N;
2508
+ return __generator(this, function (_a) {
2509
+ switch (_a.label) {
2510
+ case 0: return [4 /*yield*/, this._getRouteIdx(collateral, debt)];
2511
+ case 1:
2512
+ routeIdx = _a.sent();
2513
+ _collateral = parseUnits(collateral, this.collateralDecimals);
2514
+ _debt = parseUnits(debt);
2515
+ calls = [];
2516
+ for (N = this.minBands; N <= maxN; N++) {
2517
+ calls.push(llamalend.contracts[this.leverageZap].multicallContract.calculate_debt_n1(_collateral, _debt, N, routeIdx));
2518
+ }
2519
+ return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
2520
+ case 2: return [2 /*return*/, _a.sent()];
2521
+ }
2522
+ });
2523
+ });
2524
+ };
2525
+ MintMarketTemplate.prototype._leverageCreateLoanBands = function (collateral, debt, range) {
2526
+ return __awaiter(this, void 0, void 0, function () {
2527
+ var _n1, _n2;
2528
+ return __generator(this, function (_a) {
2529
+ switch (_a.label) {
2530
+ case 0: return [4 /*yield*/, this._leverageCalcN1(collateral, debt, range)];
2531
+ case 1:
2532
+ _n1 = _a.sent();
2533
+ _n2 = _n1 + BigInt(range - 1);
2534
+ return [2 /*return*/, [_n2, _n1]];
2535
+ }
2536
+ });
2537
+ });
2538
+ };
2539
+ MintMarketTemplate.prototype._leverageCreateLoanBandsAllRanges = function (collateral, debt) {
2540
+ return __awaiter(this, void 0, void 0, function () {
2541
+ var maxN, _n1_arr, _n2_arr, N, _bands, N;
2542
+ return __generator(this, function (_a) {
2543
+ switch (_a.label) {
2544
+ case 0: return [4 /*yield*/, this.leverageGetMaxRange(collateral, debt)];
2545
+ case 1:
2546
+ maxN = _a.sent();
2547
+ return [4 /*yield*/, this._leverageCalcN1AllRanges(collateral, debt, maxN)];
2548
+ case 2:
2549
+ _n1_arr = _a.sent();
2550
+ _n2_arr = [];
2551
+ for (N = this.minBands; N <= maxN; N++) {
2552
+ _n2_arr.push(_n1_arr[N - this.minBands] + BigInt(N - 1));
2553
+ }
2554
+ _bands = {};
2555
+ for (N = this.minBands; N <= maxN; N++) {
2556
+ _bands[N] = [_n2_arr[N - this.minBands], _n1_arr[N - this.minBands]];
2557
+ }
2558
+ return [2 /*return*/, _bands];
2559
+ }
2560
+ });
2561
+ });
2562
+ };
2563
+ MintMarketTemplate.prototype.leverageCreateLoanBands = function (collateral, debt, range) {
2564
+ return __awaiter(this, void 0, void 0, function () {
2565
+ var _a, _n2, _n1;
2566
+ return __generator(this, function (_c) {
2567
+ switch (_c.label) {
2568
+ case 0:
2569
+ this._checkLeverageZap();
2570
+ return [4 /*yield*/, this._leverageCreateLoanBands(collateral, debt, range)];
2571
+ case 1:
2572
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
2573
+ return [2 /*return*/, [Number(_n2), Number(_n1)]];
2574
+ }
2575
+ });
2576
+ });
2577
+ };
2578
+ MintMarketTemplate.prototype.leverageCreateLoanBandsAllRanges = function (collateral, debt) {
2579
+ return __awaiter(this, void 0, void 0, function () {
2580
+ var _bands, bands, N;
2581
+ return __generator(this, function (_a) {
2582
+ switch (_a.label) {
2583
+ case 0:
2584
+ this._checkLeverageZap();
2585
+ return [4 /*yield*/, this._leverageCreateLoanBandsAllRanges(collateral, debt)];
2586
+ case 1:
2587
+ _bands = _a.sent();
2588
+ bands = {};
2589
+ for (N = this.minBands; N <= this.maxBands; N++) {
2590
+ if (_bands[N]) {
2591
+ bands[N] = _bands[N].map(Number);
2592
+ }
2593
+ else {
2594
+ bands[N] = null;
2595
+ }
2596
+ }
2597
+ return [2 /*return*/, bands];
2598
+ }
2599
+ });
2600
+ });
2601
+ };
2602
+ MintMarketTemplate.prototype.leverageCreateLoanPrices = function (collateral, debt, range) {
2603
+ return __awaiter(this, void 0, void 0, function () {
2604
+ var _a, _n2, _n1;
2605
+ return __generator(this, function (_c) {
2606
+ switch (_c.label) {
2607
+ case 0:
2608
+ this._checkLeverageZap();
2609
+ return [4 /*yield*/, this._leverageCreateLoanBands(collateral, debt, range)];
2610
+ case 1:
2611
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
2612
+ return [4 /*yield*/, this._getPrices(_n2, _n1)];
2613
+ case 2: return [2 /*return*/, _c.sent()];
2614
+ }
2615
+ });
2616
+ });
2617
+ };
2618
+ MintMarketTemplate.prototype.leverageCreateLoanPricesAllRanges = function (collateral, debt) {
2619
+ return __awaiter(this, void 0, void 0, function () {
2620
+ var _bands, prices, N, _a, _c;
2621
+ return __generator(this, function (_d) {
2622
+ switch (_d.label) {
2623
+ case 0:
2624
+ this._checkLeverageZap();
2625
+ return [4 /*yield*/, this._leverageCreateLoanBandsAllRanges(collateral, debt)];
2626
+ case 1:
2627
+ _bands = _d.sent();
2628
+ prices = {};
2629
+ N = this.minBands;
2630
+ _d.label = 2;
2631
+ case 2:
2632
+ if (!(N <= this.maxBands)) return [3 /*break*/, 6];
2633
+ if (!_bands[N]) return [3 /*break*/, 4];
2634
+ _a = prices;
2635
+ _c = N;
2636
+ return [4 /*yield*/, this._calcPrices.apply(this, _bands[N])];
2637
+ case 3:
2638
+ _a[_c] = _d.sent();
2639
+ return [3 /*break*/, 5];
2640
+ case 4:
2641
+ prices[N] = null;
2642
+ _d.label = 5;
2643
+ case 5:
2644
+ N++;
2645
+ return [3 /*break*/, 2];
2646
+ case 6: return [2 /*return*/, prices];
2647
+ }
2648
+ });
2649
+ });
2650
+ };
2651
+ MintMarketTemplate.prototype.leverageCreateLoanHealth = function (collateral, debt, range, full) {
2652
+ var _a;
2653
+ if (full === void 0) { full = true; }
2654
+ return __awaiter(this, void 0, void 0, function () {
2655
+ var address, _collateral, _debt, contract, _health;
2656
+ return __generator(this, function (_c) {
2657
+ switch (_c.label) {
2658
+ case 0:
2659
+ this._checkLeverageZap();
2660
+ address = "0x0000000000000000000000000000000000000000";
2661
+ return [4 /*yield*/, this._leverageCreateLoanCollateral(collateral, debt)];
2662
+ case 1:
2663
+ _collateral = (_c.sent())._collateral;
2664
+ _debt = parseUnits(debt);
2665
+ contract = llamalend.contracts[(_a = this.healthCalculator) !== null && _a !== void 0 ? _a : this.controller].contract;
2666
+ return [4 /*yield*/, contract.health_calculator(address, _collateral, _debt, full, range, llamalend.constantOptions)];
2667
+ case 2:
2668
+ _health = _c.sent();
2669
+ _health = _health * BigInt(100);
2670
+ return [2 /*return*/, formatUnits(_health)];
2671
+ }
2672
+ });
2673
+ });
2674
+ };
2675
+ MintMarketTemplate.prototype.leveragePriceImpact = function (collateral, debt) {
2676
+ return __awaiter(this, void 0, void 0, function () {
2677
+ var x_BN, small_x_BN, _a, _collateral, routeIdx, _y, _small_y, y_BN, small_y_BN, rateBN, smallRateBN;
2678
+ return __generator(this, function (_c) {
2679
+ switch (_c.label) {
2680
+ case 0:
2681
+ x_BN = BN(debt);
2682
+ small_x_BN = BN(100);
2683
+ return [4 /*yield*/, this._leverageCreateLoanCollateral(collateral, debt)];
2684
+ case 1:
2685
+ _a = _c.sent(), _collateral = _a._collateral, routeIdx = _a.routeIdx;
2686
+ _y = _collateral - parseUnits(collateral, this.collateralDecimals);
2687
+ return [4 /*yield*/, llamalend.contracts[this.leverageZap].contract.get_collateral(fromBN(small_x_BN), routeIdx)];
2688
+ case 2:
2689
+ _small_y = _c.sent();
2690
+ y_BN = toBN(_y, this.collateralDecimals);
2691
+ small_y_BN = toBN(_small_y, this.collateralDecimals);
2692
+ rateBN = y_BN.div(x_BN);
2693
+ smallRateBN = small_y_BN.div(small_x_BN);
2694
+ if (rateBN.gt(smallRateBN))
2695
+ return [2 /*return*/, "0.0"];
2696
+ return [2 /*return*/, BN(1).minus(rateBN.div(smallRateBN)).times(100).toFixed(4)];
2697
+ }
2698
+ });
2699
+ });
2700
+ };
2701
+ MintMarketTemplate.prototype._leverageCreateLoan = function (collateral, debt, range, slippage, estimateGas) {
2702
+ return __awaiter(this, void 0, void 0, function () {
2703
+ var _collateral, _debt, leverageContract, routeIdx, _expected, minRecvBN, _minRecv, contract, value, gas, gasLimit;
2704
+ return __generator(this, function (_a) {
2705
+ switch (_a.label) {
2706
+ case 0: return [4 /*yield*/, this.loanExists()];
2707
+ case 1:
2708
+ if (_a.sent())
2709
+ throw Error("Loan already created");
2710
+ this._checkRange(range);
2711
+ _collateral = parseUnits(collateral, this.collateralDecimals);
2712
+ _debt = parseUnits(debt);
2713
+ leverageContract = llamalend.contracts[this.leverageZap].contract;
2714
+ return [4 /*yield*/, this._getRouteIdx(collateral, debt)];
2715
+ case 2:
2716
+ routeIdx = _a.sent();
2717
+ return [4 /*yield*/, leverageContract.get_collateral_underlying(_debt, routeIdx, llamalend.constantOptions)];
2718
+ case 3:
2719
+ _expected = _a.sent();
2720
+ minRecvBN = toBN(_expected, this.collateralDecimals).times(100 - slippage).div(100);
2721
+ _minRecv = fromBN(minRecvBN, this.collateralDecimals);
2722
+ contract = llamalend.contracts[this.controller].contract;
2723
+ value = isEth(this.collateral) ? _collateral : llamalend.parseUnits("0");
2724
+ return [4 /*yield*/, contract.create_loan_extended.estimateGas(_collateral, _debt, range, this.leverageZap, [routeIdx, _minRecv], __assign(__assign({}, llamalend.constantOptions), { value: value }))];
2725
+ case 4:
2726
+ gas = _a.sent();
2727
+ if (estimateGas)
2728
+ return [2 /*return*/, smartNumber(gas)];
2729
+ return [4 /*yield*/, llamalend.updateFeeData()];
2730
+ case 5:
2731
+ _a.sent();
2732
+ gasLimit = _mulBy1_3(DIGas(gas));
2733
+ return [4 /*yield*/, contract.create_loan_extended(_collateral, _debt, range, this.leverageZap, [routeIdx, _minRecv], __assign(__assign({}, llamalend.options), { gasLimit: gasLimit, value: value }))];
2734
+ case 6: return [2 /*return*/, (_a.sent()).hash];
2735
+ }
2736
+ });
2737
+ });
2738
+ };
2739
+ MintMarketTemplate.prototype.leverageCreateLoanEstimateGas = function (collateral, debt, range, slippage) {
2740
+ if (slippage === void 0) { slippage = 0.1; }
2741
+ return __awaiter(this, void 0, void 0, function () {
2742
+ return __generator(this, function (_a) {
2743
+ switch (_a.label) {
2744
+ case 0:
2745
+ this._checkLeverageZap();
2746
+ return [4 /*yield*/, this.createLoanIsApproved(collateral)];
2747
+ case 1:
2748
+ if (!(_a.sent()))
2749
+ throw Error("Approval is needed for gas estimation");
2750
+ return [4 /*yield*/, this._leverageCreateLoan(collateral, debt, range, slippage, true)];
2751
+ case 2: return [2 /*return*/, _a.sent()];
2752
+ }
2753
+ });
2754
+ });
2755
+ };
2756
+ MintMarketTemplate.prototype.leverageCreateLoan = function (collateral, debt, range, slippage) {
2757
+ if (slippage === void 0) { slippage = 0.1; }
2758
+ return __awaiter(this, void 0, void 0, function () {
2759
+ return __generator(this, function (_a) {
2760
+ switch (_a.label) {
2761
+ case 0:
2762
+ this._checkLeverageZap();
2763
+ return [4 /*yield*/, this.createLoanApprove(collateral)];
2764
+ case 1:
2765
+ _a.sent();
2766
+ return [4 /*yield*/, this._leverageCreateLoan(collateral, debt, range, slippage, false)];
2767
+ case 2: return [2 /*return*/, _a.sent()];
2768
+ }
2769
+ });
2770
+ });
2771
+ };
2772
+ // ---------------- DELEVERAGE REPAY ----------------
2773
+ MintMarketTemplate.prototype._checkDeleverageZap = function () {
2774
+ if (this.deleverageZap === "0x0000000000000000000000000000000000000000")
2775
+ throw Error("There is no deleverage for ".concat(this.id, " market"));
2776
+ };
2777
+ MintMarketTemplate.prototype.deleverageGetRouteName = function (routeIdx) {
2778
+ return __awaiter(this, void 0, void 0, function () {
2779
+ return __generator(this, function (_a) {
2780
+ switch (_a.label) {
2781
+ case 0:
2782
+ this._checkDeleverageZap();
2783
+ return [4 /*yield*/, llamalend.contracts[this.deleverageZap].contract.route_names(routeIdx)];
2784
+ case 1: return [2 /*return*/, _a.sent()];
2785
+ }
2786
+ });
2787
+ });
2788
+ };
2789
+ MintMarketTemplate.prototype.deleverageIsFullRepayment = function (deleverageCollateral, address) {
2790
+ if (address === void 0) { address = ""; }
2791
+ return __awaiter(this, void 0, void 0, function () {
2792
+ var _a, stablecoin, debt, deleverageStablecoins;
2793
+ return __generator(this, function (_c) {
2794
+ switch (_c.label) {
2795
+ case 0:
2796
+ address = _getAddress(address);
2797
+ return [4 /*yield*/, this.userState(address)];
2798
+ case 1:
2799
+ _a = _c.sent(), stablecoin = _a.stablecoin, debt = _a.debt;
2800
+ return [4 /*yield*/, this.deleverageRepayStablecoins(deleverageCollateral)];
2801
+ case 2:
2802
+ deleverageStablecoins = (_c.sent()).stablecoins;
2803
+ return [2 /*return*/, BN(stablecoin).plus(deleverageStablecoins).gt(debt)];
2804
+ }
2805
+ });
2806
+ });
2807
+ };
2808
+ MintMarketTemplate.prototype.deleverageIsAvailable = function (deleverageCollateral, address) {
2809
+ if (address === void 0) { address = ""; }
2810
+ return __awaiter(this, void 0, void 0, function () {
2811
+ var _a, collateral, stablecoin, debt;
2812
+ return __generator(this, function (_c) {
2813
+ switch (_c.label) {
2814
+ case 0:
2815
+ // 0. const { collateral, stablecoin, debt } = await this.userState(address);
2816
+ // 1. maxCollateral for deleverage is collateral from line above (0).
2817
+ // 2. If user is underwater (stablecoin > 0), only full repayment is available:
2818
+ // await this.deleverageRepayStablecoins(deleverageCollateral) + stablecoin > debt
2819
+ // There is no deleverage zap
2820
+ if (this.deleverageZap === "0x0000000000000000000000000000000000000000")
2821
+ return [2 /*return*/, false];
2822
+ address = _getAddress(address);
2823
+ return [4 /*yield*/, this.userState(address)];
2824
+ case 1:
2825
+ _a = _c.sent(), collateral = _a.collateral, stablecoin = _a.stablecoin, debt = _a.debt;
2826
+ // Loan does not exist
2827
+ if (BN(debt).eq(0))
2828
+ return [2 /*return*/, false];
2829
+ // Can't spend more than user has
2830
+ if (BN(deleverageCollateral).gt(collateral))
2831
+ return [2 /*return*/, false];
2832
+ if (!BN(stablecoin).gt(0)) return [3 /*break*/, 3];
2833
+ return [4 /*yield*/, this.deleverageIsFullRepayment(deleverageCollateral, address)];
2834
+ case 2: return [2 /*return*/, _c.sent()];
2835
+ case 3: return [2 /*return*/, true];
2836
+ }
2837
+ });
2838
+ });
2839
+ };
2840
+ MintMarketTemplate.prototype.deleverageRepayBands = function (collateral, address) {
2841
+ if (address === void 0) { address = ""; }
2842
+ return __awaiter(this, void 0, void 0, function () {
2843
+ var _a, _n2, _n1;
2844
+ return __generator(this, function (_c) {
2845
+ switch (_c.label) {
2846
+ case 0:
2847
+ this._checkDeleverageZap();
2848
+ return [4 /*yield*/, this._deleverageRepayBands(collateral, address)];
2849
+ case 1:
2850
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
2851
+ return [2 /*return*/, [Number(_n2), Number(_n1)]];
2852
+ }
2853
+ });
2854
+ });
2855
+ };
2856
+ MintMarketTemplate.prototype.deleverageRepayPrices = function (debt, address) {
2857
+ if (address === void 0) { address = ""; }
2858
+ return __awaiter(this, void 0, void 0, function () {
2859
+ var _a, _n2, _n1;
2860
+ return __generator(this, function (_c) {
2861
+ switch (_c.label) {
2862
+ case 0:
2863
+ this._checkDeleverageZap();
2864
+ return [4 /*yield*/, this._deleverageRepayBands(debt, address)];
2865
+ case 1:
2866
+ _a = _c.sent(), _n2 = _a[0], _n1 = _a[1];
2867
+ return [4 /*yield*/, this._getPrices(_n2, _n1)];
2868
+ case 2: return [2 /*return*/, _c.sent()];
2869
+ }
2870
+ });
2871
+ });
2872
+ };
2873
+ MintMarketTemplate.prototype.deleverageRepayHealth = function (collateral, full, address) {
2874
+ var _a;
2875
+ if (full === void 0) { full = true; }
2876
+ if (address === void 0) { address = ""; }
2877
+ return __awaiter(this, void 0, void 0, function () {
2878
+ var _c, _stablecoin, _debt, deleverageStablecoins, _d_collateral, _d_debt, N, contract, _health;
2879
+ return __generator(this, function (_d) {
2880
+ switch (_d.label) {
2881
+ case 0:
2882
+ this._checkDeleverageZap();
2883
+ address = _getAddress(address);
2884
+ return [4 /*yield*/, this.deleverageIsAvailable(collateral, address)];
2885
+ case 1:
2886
+ if (!(_d.sent()))
2887
+ return [2 /*return*/, "0.0"];
2888
+ return [4 /*yield*/, this._userState(address)];
2889
+ case 2:
2890
+ _c = _d.sent(), _stablecoin = _c._stablecoin, _debt = _c._debt;
2891
+ return [4 /*yield*/, this.deleverageRepayStablecoins(collateral)];
2892
+ case 3:
2893
+ deleverageStablecoins = (_d.sent()).stablecoins;
2894
+ _d_collateral = parseUnits(collateral, this.collateralDecimals) * BigInt(-1);
2895
+ _d_debt = (parseUnits(deleverageStablecoins) + _stablecoin) * BigInt(-1);
2896
+ return [4 /*yield*/, this.userRange(address)];
2897
+ case 4:
2898
+ N = _d.sent();
2899
+ if ((_debt + _d_debt) < 0)
2900
+ return [2 /*return*/, "0.0"];
2901
+ contract = llamalend.contracts[(_a = this.healthCalculator) !== null && _a !== void 0 ? _a : this.controller].contract;
2902
+ return [4 /*yield*/, contract.health_calculator(address, _d_collateral, _d_debt, full, N, llamalend.constantOptions)];
2903
+ case 5:
2904
+ _health = _d.sent();
2905
+ _health = _health * BigInt(100);
2906
+ return [2 /*return*/, formatUnits(_health)];
2907
+ }
2908
+ });
2909
+ });
2910
+ };
2911
+ MintMarketTemplate.prototype.deleveragePriceImpact = function (collateral) {
2912
+ return __awaiter(this, void 0, void 0, function () {
2913
+ var x_BN, small_x_BN, _a, stablecoins, routeIdx, _y, _small_y, y_BN, small_y_BN, rateBN, smallRateBN;
2914
+ return __generator(this, function (_c) {
2915
+ switch (_c.label) {
2916
+ case 0:
2917
+ x_BN = BN(collateral);
2918
+ small_x_BN = BN(0.001);
2919
+ return [4 /*yield*/, this.deleverageRepayStablecoins(collateral)];
2920
+ case 1:
2921
+ _a = _c.sent(), stablecoins = _a.stablecoins, routeIdx = _a.routeIdx;
2922
+ _y = parseUnits(stablecoins);
2923
+ return [4 /*yield*/, llamalend.contracts[this.deleverageZap].contract.get_stablecoins(fromBN(small_x_BN, this.collateralDecimals), routeIdx)];
2924
+ case 2:
2925
+ _small_y = _c.sent();
2926
+ y_BN = toBN(_y);
2927
+ small_y_BN = toBN(_small_y);
2928
+ rateBN = y_BN.div(x_BN);
2929
+ smallRateBN = small_y_BN.div(small_x_BN);
2930
+ if (rateBN.gt(smallRateBN))
2931
+ return [2 /*return*/, "0.0"];
2932
+ return [2 /*return*/, BN(1).minus(rateBN.div(smallRateBN)).times(100).toFixed(4)];
2933
+ }
2934
+ });
2935
+ });
2936
+ };
2937
+ MintMarketTemplate.prototype._deleverageRepay = function (collateral, slippage, estimateGas) {
2938
+ return __awaiter(this, void 0, void 0, function () {
2939
+ var currentDebt, _a, stablecoins, routeIdx, _collateral, _debt, minRecvBN, _minRecv, contract, gas, gasLimit;
2940
+ return __generator(this, function (_c) {
2941
+ switch (_c.label) {
2942
+ case 0: return [4 /*yield*/, this.userState(llamalend.signerAddress)];
2943
+ case 1:
2944
+ currentDebt = (_c.sent()).debt;
2945
+ if (Number(currentDebt) === 0)
2946
+ throw Error("Loan for ".concat(llamalend.signerAddress, " does not exist"));
2947
+ return [4 /*yield*/, this.deleverageRepayStablecoins(collateral)];
2948
+ case 2:
2949
+ _a = _c.sent(), stablecoins = _a.stablecoins, routeIdx = _a.routeIdx;
2950
+ _collateral = parseUnits(collateral, this.collateralDecimals);
2951
+ _debt = parseUnits(stablecoins);
2952
+ minRecvBN = toBN(_debt).times(100 - slippage).div(100);
2953
+ _minRecv = fromBN(minRecvBN);
2954
+ contract = llamalend.contracts[this.controller].contract;
2955
+ return [4 /*yield*/, contract.repay_extended.estimateGas(this.deleverageZap, [routeIdx, _collateral, _minRecv], llamalend.constantOptions)];
2956
+ case 3:
2957
+ gas = _c.sent();
2958
+ if (estimateGas)
2959
+ return [2 /*return*/, smartNumber(gas)];
2960
+ return [4 /*yield*/, llamalend.updateFeeData()];
2961
+ case 4:
2962
+ _c.sent();
2963
+ gasLimit = _mulBy1_3(DIGas(gas));
2964
+ return [4 /*yield*/, contract.repay_extended(this.deleverageZap, [routeIdx, _collateral, _minRecv], __assign(__assign({}, llamalend.options), { gasLimit: gasLimit }))];
2965
+ case 5: return [2 /*return*/, (_c.sent()).hash];
2966
+ }
2967
+ });
2968
+ });
2969
+ };
2970
+ MintMarketTemplate.prototype.deleverageRepayEstimateGas = function (collateral, slippage) {
2971
+ if (slippage === void 0) { slippage = 0.1; }
2972
+ return __awaiter(this, void 0, void 0, function () {
2973
+ return __generator(this, function (_a) {
2974
+ switch (_a.label) {
2975
+ case 0:
2976
+ this._checkDeleverageZap();
2977
+ return [4 /*yield*/, this._deleverageRepay(collateral, slippage, true)];
2978
+ case 1: return [2 /*return*/, _a.sent()];
2979
+ }
2980
+ });
2981
+ });
2982
+ };
2983
+ MintMarketTemplate.prototype.deleverageRepay = function (collateral, slippage) {
2984
+ if (slippage === void 0) { slippage = 0.1; }
2985
+ return __awaiter(this, void 0, void 0, function () {
2986
+ return __generator(this, function (_a) {
2987
+ switch (_a.label) {
2988
+ case 0:
2989
+ this._checkDeleverageZap();
2990
+ return [4 /*yield*/, this._deleverageRepay(collateral, slippage, false)];
2991
+ case 1: return [2 /*return*/, _a.sent()];
2992
+ }
2993
+ });
2994
+ });
2995
+ };
2996
+ return MintMarketTemplate;
2997
+ }());
2998
+ export { MintMarketTemplate };