@curvefi/llamalend-api 1.0.21 → 1.0.22-beta.1

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.
@@ -9,7 +9,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import memoize from "memoizee";
11
11
  import BigNumber from "bignumber.js";
12
- import { llamalend } from "../llamalend.js";
13
12
  import { _getAddress, parseUnits, BN, toBN, fromBN, getBalances, _ensureAllowance, ensureAllowance, hasAllowance, ensureAllowanceEstimateGas, _cutZeros, formatUnits, formatNumber, MAX_ALLOWANCE, MAX_ACTIVE_BAND, _mulBy1_3, _getUsdRate, DIGas, smartNumber, } from "../utils.js";
14
13
  import { _getExpectedOdos, _getQuoteOdos, _assembleTxOdos, _getUserCollateral, _getMarketsData } from "../external-api.js";
15
14
  import ERC20Abi from '../constants/abis/ERC20.json' assert { type: 'json' };
@@ -17,7 +16,7 @@ import { cacheKey, cacheStats } from "../cache/index.js";
17
16
  const DAY = 86400;
18
17
  const WEEK = 7 * DAY;
19
18
  export class LendMarketTemplate {
20
- constructor(id, marketData) {
19
+ constructor(id, marketData, llamalend) {
21
20
  this.swapDataCache = {};
22
21
  this._getMarketId = () => Number(this.id.split("-").slice(-1)[0]);
23
22
  this._calcCrvApr = (...args_1) => __awaiter(this, [...args_1], void 0, function* (futureWorkingSupplyBN = null) {
@@ -25,26 +24,26 @@ export class LendMarketTemplate {
25
24
  if (Number(totalLiquidityUSD) === 0)
26
25
  return [0, 0];
27
26
  let inflationRateBN, workingSupplyBN, totalSupplyBN;
28
- if (llamalend.chainId !== 1) {
29
- const gaugeContract = llamalend.contracts[this.addresses.gauge].multicallContract;
30
- const lpTokenContract = llamalend.contracts[this.addresses.vault].multicallContract;
31
- const crvContract = llamalend.contracts[llamalend.constants.ALIASES.crv].contract;
27
+ if (this.llamalend.chainId !== 1) {
28
+ const gaugeContract = this.llamalend.contracts[this.addresses.gauge].multicallContract;
29
+ const lpTokenContract = this.llamalend.contracts[this.addresses.vault].multicallContract;
30
+ const crvContract = this.llamalend.contracts[this.llamalend.constants.ALIASES.crv].contract;
32
31
  const currentWeek = Math.floor(Date.now() / 1000 / WEEK);
33
- [inflationRateBN, workingSupplyBN, totalSupplyBN] = (yield llamalend.multicallProvider.all([
32
+ [inflationRateBN, workingSupplyBN, totalSupplyBN] = (yield this.llamalend.multicallProvider.all([
34
33
  gaugeContract.inflation_rate(currentWeek),
35
34
  gaugeContract.working_supply(),
36
35
  lpTokenContract.totalSupply(),
37
36
  ])).map((value) => toBN(value));
38
37
  if (inflationRateBN.eq(0)) {
39
- inflationRateBN = toBN(yield crvContract.balanceOf(this.addresses.gauge, llamalend.constantOptions)).div(WEEK);
38
+ inflationRateBN = toBN(yield crvContract.balanceOf(this.addresses.gauge, this.llamalend.constantOptions)).div(WEEK);
40
39
  }
41
40
  }
42
41
  else {
43
- const gaugeContract = llamalend.contracts[this.addresses.gauge].multicallContract;
44
- const lpTokenContract = llamalend.contracts[this.addresses.vault].multicallContract;
45
- const gaugeControllerContract = llamalend.contracts[llamalend.constants.ALIASES.gauge_controller].multicallContract;
42
+ const gaugeContract = this.llamalend.contracts[this.addresses.gauge].multicallContract;
43
+ const lpTokenContract = this.llamalend.contracts[this.addresses.vault].multicallContract;
44
+ const gaugeControllerContract = this.llamalend.contracts[this.llamalend.constants.ALIASES.gauge_controller].multicallContract;
46
45
  let weightBN;
47
- [inflationRateBN, weightBN, workingSupplyBN, totalSupplyBN] = (yield llamalend.multicallProvider.all([
46
+ [inflationRateBN, weightBN, workingSupplyBN, totalSupplyBN] = (yield this.llamalend.multicallProvider.all([
48
47
  gaugeContract.inflation_rate(),
49
48
  gaugeControllerContract.gauge_relative_weight(this.addresses.gauge),
50
49
  gaugeContract.working_supply(),
@@ -59,13 +58,13 @@ export class LendMarketTemplate {
59
58
  // If you added 1$ value of LP it would be 0.4$ of working LP. So your annual reward per 1$ in USD is:
60
59
  // (annual reward per working liquidity in $) * (0.4$ of working LP)
61
60
  const rateBN = inflationRateBN.times(31536000).div(workingSupplyBN).times(totalSupplyBN).div(Number(totalLiquidityUSD)).times(0.4);
62
- const crvPrice = yield _getUsdRate(llamalend.constants.ALIASES.crv);
61
+ const crvPrice = yield _getUsdRate.call(this.llamalend, this.llamalend.constants.ALIASES.crv);
63
62
  const baseApyBN = rateBN.times(crvPrice);
64
63
  const boostedApyBN = baseApyBN.times(2.5);
65
64
  return [baseApyBN.times(100).toNumber(), boostedApyBN.times(100).toNumber()];
66
65
  });
67
66
  this.vaultRewardTokens = memoize(() => __awaiter(this, void 0, void 0, function* () {
68
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS)
67
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS)
69
68
  return [];
70
69
  // if (useApi) {
71
70
  // const rewards = await _getRewardsFromApi();
@@ -73,26 +72,26 @@ export class LendMarketTemplate {
73
72
  // rewards[this.addresses.gauge].forEach((r) => _setContracts(r.tokenAddress, ERC20Abi));
74
73
  // return rewards[this.addresses.gauge].map((r) => ({ token: r.tokenAddress, symbol: r.symbol, decimals: Number(r.decimals) }));
75
74
  // }
76
- const gaugeContract = llamalend.contracts[this.addresses.gauge].contract;
77
- const gaugeMulticallContract = llamalend.contracts[this.addresses.gauge].multicallContract;
78
- const rewardCount = Number(llamalend.formatUnits(yield gaugeContract.reward_count(llamalend.constantOptions), 0));
75
+ const gaugeContract = this.llamalend.contracts[this.addresses.gauge].contract;
76
+ const gaugeMulticallContract = this.llamalend.contracts[this.addresses.gauge].multicallContract;
77
+ const rewardCount = Number(this.llamalend.formatUnits(yield gaugeContract.reward_count(this.llamalend.constantOptions), 0));
79
78
  const tokenCalls = [];
80
79
  for (let i = 0; i < rewardCount; i++) {
81
80
  tokenCalls.push(gaugeMulticallContract.reward_tokens(i));
82
81
  }
83
- const tokens = (yield llamalend.multicallProvider.all(tokenCalls))
84
- .filter((addr) => addr !== llamalend.constants.ZERO_ADDRESS)
82
+ const tokens = (yield this.llamalend.multicallProvider.all(tokenCalls))
83
+ .filter((addr) => addr !== this.llamalend.constants.ZERO_ADDRESS)
85
84
  .map((addr) => addr.toLowerCase())
86
- .filter((addr) => llamalend.chainId === 1 || addr !== llamalend.constants.COINS.crv);
85
+ .filter((addr) => this.llamalend.chainId === 1 || addr !== this.llamalend.constants.COINS.crv);
87
86
  const tokenInfoCalls = [];
88
87
  for (const token of tokens) {
89
- llamalend.setContract(token, ERC20Abi);
90
- const tokenMulticallContract = llamalend.contracts[token].multicallContract;
88
+ this.llamalend.setContract(token, ERC20Abi);
89
+ const tokenMulticallContract = this.llamalend.contracts[token].multicallContract;
91
90
  tokenInfoCalls.push(tokenMulticallContract.symbol(), tokenMulticallContract.decimals());
92
91
  }
93
- const tokenInfo = yield llamalend.multicallProvider.all(tokenInfoCalls);
92
+ const tokenInfo = yield this.llamalend.multicallProvider.all(tokenInfoCalls);
94
93
  for (let i = 0; i < tokens.length; i++) {
95
- llamalend.constants.DECIMALS[tokens[i]] = Number(tokenInfo[(i * 2) + 1]);
94
+ this.llamalend.constants.DECIMALS[tokens[i]] = Number(tokenInfo[(i * 2) + 1]);
96
95
  }
97
96
  return tokens.map((token, i) => ({ token, symbol: tokenInfo[i * 2], decimals: Number(tokenInfo[(i * 2) + 1]) }));
98
97
  }), {
@@ -101,7 +100,7 @@ export class LendMarketTemplate {
101
100
  });
102
101
  this.vaultRewardsApr = (...args_1) => __awaiter(this, [...args_1], void 0, function* (useApi = true) {
103
102
  if (useApi) {
104
- const response = yield _getMarketsData(llamalend.constants.NETWORK_NAME);
103
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
105
104
  const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.addresses.vault.toLowerCase());
106
105
  if (market) {
107
106
  return market.gaugeRewards;
@@ -111,9 +110,9 @@ export class LendMarketTemplate {
111
110
  }
112
111
  }
113
112
  else {
114
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS)
113
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS)
115
114
  return [];
116
- // const isDisabledChain = [1313161554].includes(llamalend.chainId); // Disable Aurora
115
+ // const isDisabledChain = [1313161554].includes(this.llamalend.chainId); // Disable Aurora
117
116
  // if (useApi && !isDisabledChain) {
118
117
  // const rewards = await _getRewardsFromApi();
119
118
  // if (!rewards[this.addresses.gauge]) return [];
@@ -122,12 +121,12 @@ export class LendMarketTemplate {
122
121
  const apy = [];
123
122
  const rewardTokens = yield this.vaultRewardTokens();
124
123
  for (const rewardToken of rewardTokens) {
125
- const gaugeContract = llamalend.contracts[this.addresses.gauge].multicallContract;
126
- const lpTokenContract = llamalend.contracts[this.addresses.vault].multicallContract;
127
- const rewardContract = llamalend.contracts[this.addresses.gauge].multicallContract;
124
+ const gaugeContract = this.llamalend.contracts[this.addresses.gauge].multicallContract;
125
+ const lpTokenContract = this.llamalend.contracts[this.addresses.vault].multicallContract;
126
+ const rewardContract = this.llamalend.contracts[this.addresses.gauge].multicallContract;
128
127
  const totalLiquidityUSD = yield this.vaultTotalLiquidity();
129
- const rewardRate = yield _getUsdRate(rewardToken.token);
130
- const [rewardData, _stakedSupply, _totalSupply] = yield llamalend.multicallProvider.all([
128
+ const rewardRate = yield _getUsdRate.call(this.llamalend, rewardToken.token);
129
+ const [rewardData, _stakedSupply, _totalSupply] = yield this.llamalend.multicallProvider.all([
131
130
  rewardContract.reward_data(rewardToken.token),
132
131
  gaugeContract.totalSupply(),
133
132
  lpTokenContract.totalSupply(),
@@ -135,7 +134,7 @@ export class LendMarketTemplate {
135
134
  const stakedSupplyBN = toBN(_stakedSupply);
136
135
  const totalSupplyBN = toBN(_totalSupply);
137
136
  const inflationBN = toBN(rewardData.rate, rewardToken.decimals);
138
- const periodFinish = Number(llamalend.formatUnits(rewardData.period_finish, 0)) * 1000;
137
+ const periodFinish = Number(this.llamalend.formatUnits(rewardData.period_finish, 0)) * 1000;
139
138
  const baseApy = periodFinish > Date.now() ?
140
139
  inflationBN.times(31536000).times(rewardRate).div(stakedSupplyBN).times(totalSupplyBN).div(Number(totalLiquidityUSD)) :
141
140
  BN(0);
@@ -151,8 +150,8 @@ export class LendMarketTemplate {
151
150
  });
152
151
  // ---------------- STATS ----------------
153
152
  this.statsParameters = memoize(() => __awaiter(this, void 0, void 0, function* () {
154
- const llammaContract = llamalend.contracts[this.addresses.amm].multicallContract;
155
- const controllerContract = llamalend.contracts[this.addresses.controller].multicallContract;
153
+ const llammaContract = this.llamalend.contracts[this.addresses.amm].multicallContract;
154
+ const controllerContract = this.llamalend.contracts[this.addresses.controller].multicallContract;
156
155
  const calls = [
157
156
  llammaContract.fee(),
158
157
  llammaContract.admin_fee(),
@@ -161,7 +160,7 @@ export class LendMarketTemplate {
161
160
  llammaContract.get_base_price(),
162
161
  llammaContract.A(),
163
162
  ];
164
- const [_fee, _admin_fee, _liquidation_discount, _loan_discount, _base_price, _A] = yield llamalend.multicallProvider.all(calls);
163
+ const [_fee, _admin_fee, _liquidation_discount, _loan_discount, _base_price, _A] = yield this.llamalend.multicallProvider.all(calls);
165
164
  const A = formatUnits(_A, 0);
166
165
  const base_price = formatUnits(_base_price);
167
166
  const [fee, admin_fee, liquidation_discount, loan_discount] = [_fee, _admin_fee, _liquidation_discount, _loan_discount]
@@ -177,23 +176,23 @@ export class LendMarketTemplate {
177
176
  _rate = cacheStats.get(cacheKey(this.addresses.amm, 'rate'));
178
177
  }
179
178
  else {
180
- _rate = yield llamalend.contracts[this.addresses.amm].contract.rate(llamalend.constantOptions);
179
+ _rate = yield this.llamalend.contracts[this.addresses.amm].contract.rate(this.llamalend.constantOptions);
181
180
  cacheStats.set(cacheKey(this.addresses.controller, 'rate'), _rate);
182
181
  }
183
182
  return _rate;
184
183
  });
185
184
  this._getFutureRate = (_dReserves, _dDebt) => __awaiter(this, void 0, void 0, function* () {
186
- const mpContract = llamalend.contracts[this.addresses.monetary_policy].contract;
185
+ const mpContract = this.llamalend.contracts[this.addresses.monetary_policy].contract;
187
186
  return yield mpContract.future_rate(this.addresses.controller, _dReserves, _dDebt);
188
187
  });
189
188
  this.statsBandsInfo = memoize(() => __awaiter(this, void 0, void 0, function* () {
190
- const ammContract = llamalend.contracts[this.addresses.amm].multicallContract;
189
+ const ammContract = this.llamalend.contracts[this.addresses.amm].multicallContract;
191
190
  const calls = [
192
191
  ammContract.active_band_with_skip(),
193
192
  ammContract.max_band(),
194
193
  ammContract.min_band(),
195
194
  ];
196
- const [activeBand, maxBand, minBand] = (yield llamalend.multicallProvider.all(calls)).map((_b) => Number(_b));
195
+ const [activeBand, maxBand, minBand] = (yield this.llamalend.multicallProvider.all(calls)).map((_b) => Number(_b));
197
196
  const { borrowed, collateral } = yield this.statsBandBalances(activeBand);
198
197
  let liquidationBand = null;
199
198
  if (Number(borrowed) > 0 && Number(collateral) > 0)
@@ -205,7 +204,7 @@ export class LendMarketTemplate {
205
204
  });
206
205
  this.statsAmmBalances = (...args_1) => __awaiter(this, [...args_1], void 0, function* (isGetter = true, useAPI = false) {
207
206
  if (useAPI) {
208
- const response = yield _getMarketsData(llamalend.constants.NETWORK_NAME);
207
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
209
208
  const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.addresses.vault.toLowerCase());
210
209
  if (market) {
211
210
  return {
@@ -218,9 +217,9 @@ export class LendMarketTemplate {
218
217
  }
219
218
  }
220
219
  else {
221
- const borrowedContract = llamalend.contracts[this.addresses.borrowed_token].multicallContract;
222
- const collateralContract = llamalend.contracts[this.addresses.collateral_token].multicallContract;
223
- const ammContract = llamalend.contracts[this.addresses.amm].multicallContract;
220
+ const borrowedContract = this.llamalend.contracts[this.addresses.borrowed_token].multicallContract;
221
+ const collateralContract = this.llamalend.contracts[this.addresses.collateral_token].multicallContract;
222
+ const ammContract = this.llamalend.contracts[this.addresses.amm].multicallContract;
224
223
  let _balance_x, _fee_x, _balance_y, _fee_y;
225
224
  if (isGetter) {
226
225
  [_balance_x, _fee_x, _balance_y, _fee_y] = [
@@ -231,7 +230,7 @@ export class LendMarketTemplate {
231
230
  ];
232
231
  }
233
232
  else {
234
- [_balance_x, _fee_x, _balance_y, _fee_y] = yield llamalend.multicallProvider.all([
233
+ [_balance_x, _fee_x, _balance_y, _fee_y] = yield this.llamalend.multicallProvider.all([
235
234
  borrowedContract.balanceOf(this.addresses.amm),
236
235
  ammContract.admin_fees_x(),
237
236
  collateralContract.balanceOf(this.addresses.amm),
@@ -250,30 +249,30 @@ export class LendMarketTemplate {
250
249
  });
251
250
  // ---------------- PRICES ----------------
252
251
  this.A = memoize(() => __awaiter(this, void 0, void 0, function* () {
253
- const _A = yield llamalend.contracts[this.addresses.amm].contract.A(llamalend.constantOptions);
252
+ const _A = yield this.llamalend.contracts[this.addresses.amm].contract.A(this.llamalend.constantOptions);
254
253
  return formatUnits(_A, 0);
255
254
  }), {
256
255
  promise: true,
257
256
  maxAge: 86400 * 1000, // 1d
258
257
  });
259
258
  this.basePrice = memoize(() => __awaiter(this, void 0, void 0, function* () {
260
- const _price = yield llamalend.contracts[this.addresses.amm].contract.get_base_price(llamalend.constantOptions);
259
+ const _price = yield this.llamalend.contracts[this.addresses.amm].contract.get_base_price(this.llamalend.constantOptions);
261
260
  return formatUnits(_price);
262
261
  }), {
263
262
  promise: true,
264
263
  maxAge: 86400 * 1000, // 1d
265
264
  });
266
265
  this.oraclePrice = memoize(() => __awaiter(this, void 0, void 0, function* () {
267
- const _price = yield llamalend.contracts[this.addresses.amm].contract.price_oracle(llamalend.constantOptions);
266
+ const _price = yield this.llamalend.contracts[this.addresses.amm].contract.price_oracle(this.llamalend.constantOptions);
268
267
  return formatUnits(_price);
269
268
  }), {
270
269
  promise: true,
271
270
  maxAge: 60 * 1000, // 1m
272
271
  });
273
272
  this._userState = memoize((...args_1) => __awaiter(this, [...args_1], void 0, function* (address = "") {
274
- address = _getAddress(address);
275
- const contract = llamalend.contracts[this.addresses.controller].contract;
276
- const [_collateral, _borrowed, _debt, _N] = yield contract.user_state(address, llamalend.constantOptions);
273
+ address = _getAddress.call(this.llamalend, address);
274
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
275
+ const [_collateral, _borrowed, _debt, _N] = yield contract.user_state(address, this.llamalend.constantOptions);
277
276
  return { _collateral, _borrowed, _debt, _N };
278
277
  }), {
279
278
  promise: true,
@@ -283,9 +282,9 @@ export class LendMarketTemplate {
283
282
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
284
283
  const calls = [];
285
284
  for (let N = this.minBands; N <= this.maxBands; N++) {
286
- calls.push(llamalend.contracts[this.addresses.controller].multicallContract.max_borrowable(_collateral, N, 0));
285
+ calls.push(this.llamalend.contracts[this.addresses.controller].multicallContract.max_borrowable(_collateral, N, 0));
287
286
  }
288
- const _amounts = yield llamalend.multicallProvider.all(calls);
287
+ const _amounts = yield this.llamalend.multicallProvider.all(calls);
289
288
  const res = {};
290
289
  for (let N = this.minBands; N <= this.maxBands; N++) {
291
290
  res[N] = formatUnits(_amounts[N - this.minBands], this.borrowed_token.decimals);
@@ -297,13 +296,13 @@ export class LendMarketTemplate {
297
296
  });
298
297
  // ---------------- LEVERAGE CREATE LOAN ----------------
299
298
  this.hasLeverage = () => {
300
- return llamalend.constants.ALIASES.leverage_zap !== llamalend.constants.ZERO_ADDRESS &&
301
- this._getMarketId() >= Number(llamalend.constants.ALIASES["leverage_markets_start_id"]);
299
+ return this.llamalend.constants.ALIASES.leverage_zap !== this.llamalend.constants.ZERO_ADDRESS &&
300
+ this._getMarketId() >= Number(this.llamalend.constants.ALIASES["leverage_markets_start_id"]);
302
301
  };
303
302
  this.leverageCreateLoanMaxRecvAllRanges = memoize((userCollateral, userBorrowed) => __awaiter(this, void 0, void 0, function* () {
304
303
  this._checkLeverageZap();
305
304
  const _userCollateral = parseUnits(userCollateral, this.collateral_token.decimals);
306
- const contract = llamalend.contracts[llamalend.constants.ALIASES.leverage_zap].multicallContract;
305
+ const contract = this.llamalend.contracts[this.llamalend.constants.ALIASES.leverage_zap].multicallContract;
307
306
  const oraclePriceBand = yield this.oraclePriceBand();
308
307
  const pAvgApproxBN = BN(yield this.calcTickPrice(oraclePriceBand)); // upper tick of oracle price band
309
308
  let pAvgBN = null;
@@ -322,7 +321,7 @@ export class LendMarketTemplate {
322
321
  const j = N - this.minBands;
323
322
  calls.push(contract.max_borrowable(this.addresses.controller, _userEffectiveCollateral, _maxLeverageCollateral[j], N, fromBN(pBN)));
324
323
  }
325
- _maxBorrowable = (yield llamalend.multicallProvider.all(calls)).map((_mb) => _mb * BigInt(998) / BigInt(1000));
324
+ _maxBorrowable = (yield this.llamalend.multicallProvider.all(calls)).map((_mb) => _mb * BigInt(998) / BigInt(1000));
326
325
  maxBorrowableBN = _maxBorrowable.map((_mb) => toBN(_mb, this.borrowed_token.decimals));
327
326
  const deltaBN = maxBorrowableBN.map((mb, l) => mb.minus(maxBorrowablePrevBN[l]).abs().div(mb));
328
327
  if (BigNumber.max(...deltaBN).lt(0.0005)) {
@@ -330,7 +329,7 @@ export class LendMarketTemplate {
330
329
  break;
331
330
  }
332
331
  if (pAvgBN === null) {
333
- const _y = BigInt(yield _getExpectedOdos(this.addresses.borrowed_token, this.addresses.collateral_token, _maxBorrowable[0], this.addresses.amm));
332
+ const _y = BigInt(yield _getExpectedOdos.call(this.llamalend, this.addresses.borrowed_token, this.addresses.collateral_token, _maxBorrowable[0], this.addresses.amm));
334
333
  const yBN = toBN(_y, this.collateral_token.decimals);
335
334
  pAvgBN = maxBorrowableBN[0].div(yBN);
336
335
  }
@@ -357,9 +356,9 @@ export class LendMarketTemplate {
357
356
  maxAge: 60 * 1000, // 1m
358
357
  });
359
358
  this._setSwapDataToCache = (inputCoinAddress, outputCoinAddress, _amount, slippage) => __awaiter(this, void 0, void 0, function* () {
360
- let swapData = yield _getQuoteOdos(inputCoinAddress, outputCoinAddress, _amount, this.addresses.amm, true, slippage);
359
+ let swapData = yield _getQuoteOdos.call(this.llamalend, inputCoinAddress, outputCoinAddress, _amount, this.addresses.amm, true, slippage);
361
360
  while (swapData.pathId == null) {
362
- swapData = yield _getQuoteOdos(inputCoinAddress, outputCoinAddress, _amount, this.addresses.amm, true, slippage);
361
+ swapData = yield _getQuoteOdos.call(this.llamalend, inputCoinAddress, outputCoinAddress, _amount, this.addresses.amm, true, slippage);
363
362
  }
364
363
  const key = `${inputCoinAddress}-${_amount}`;
365
364
  this.swapDataCache[key] = Object.assign(Object.assign({}, swapData), { slippage });
@@ -401,11 +400,11 @@ export class LendMarketTemplate {
401
400
  throw Error(`User ${user} is already in liquidation mode`);
402
401
  _stateDebt = _debt;
403
402
  if (range < 0)
404
- range = Number(llamalend.formatUnits(_N, 0));
403
+ range = Number(this.llamalend.formatUnits(_N, 0));
405
404
  }
406
405
  const { _futureStateCollateral } = yield this._leverageExpectedCollateral(userCollateral, userBorrowed, debt, user);
407
406
  const _debt = _stateDebt + parseUnits(debt, this.borrowed_token.decimals);
408
- return yield llamalend.contracts[this.addresses.controller].contract.calculate_debt_n1(_futureStateCollateral, _debt, range, llamalend.constantOptions);
407
+ return yield this.llamalend.contracts[this.addresses.controller].contract.calculate_debt_n1(_futureStateCollateral, _debt, range, this.llamalend.constantOptions);
409
408
  }), {
410
409
  promise: true,
411
410
  maxAge: 60 * 1000, // 1m
@@ -415,9 +414,9 @@ export class LendMarketTemplate {
415
414
  const _debt = parseUnits(debt, this.borrowed_token.decimals);
416
415
  const calls = [];
417
416
  for (let N = this.minBands; N <= maxN; N++) {
418
- calls.push(llamalend.contracts[this.addresses.controller].multicallContract.calculate_debt_n1(_futureStateCollateral, _debt, N));
417
+ calls.push(this.llamalend.contracts[this.addresses.controller].multicallContract.calculate_debt_n1(_futureStateCollateral, _debt, N));
419
418
  }
420
- return yield llamalend.multicallProvider.all(calls);
419
+ return yield this.llamalend.multicallProvider.all(calls);
421
420
  }), {
422
421
  promise: true,
423
422
  maxAge: 60 * 1000, // 1m
@@ -456,7 +455,7 @@ export class LendMarketTemplate {
456
455
  };
457
456
  });
458
457
  this._leverageRepayBands = memoize((stateCollateral, userCollateral, userBorrowed, address) => __awaiter(this, void 0, void 0, function* () {
459
- address = _getAddress(address);
458
+ address = _getAddress.call(this.llamalend, address);
460
459
  if (!(yield this.leverageRepayIsAvailable(stateCollateral, userCollateral, userBorrowed, address)))
461
460
  return [parseUnits(0, 0), parseUnits(0, 0)];
462
461
  const _stateRepayCollateral = parseUnits(stateCollateral, this.collateral_token.decimals);
@@ -469,7 +468,7 @@ export class LendMarketTemplate {
469
468
  let _n2 = parseUnits(0, 0);
470
469
  const { _totalBorrowed: _repayExpected } = this._leverageRepayExpectedBorrowed(stateCollateral, userCollateral, userBorrowed);
471
470
  try {
472
- _n1 = yield llamalend.contracts[this.addresses.controller].contract.calculate_debt_n1(_stateCollateral - _stateRepayCollateral, _stateDebt - _repayExpected, _N);
471
+ _n1 = yield this.llamalend.contracts[this.addresses.controller].contract.calculate_debt_n1(_stateCollateral - _stateRepayCollateral, _stateDebt - _repayExpected, _N);
473
472
  _n2 = _n1 + (_N - BigInt(1));
474
473
  }
475
474
  catch (_a) {
@@ -480,6 +479,7 @@ export class LendMarketTemplate {
480
479
  promise: true,
481
480
  maxAge: 5 * 60 * 1000, // 5m
482
481
  });
482
+ this.llamalend = llamalend;
483
483
  this.id = id;
484
484
  this.name = marketData.name;
485
485
  this.addresses = marketData.addresses;
@@ -621,43 +621,43 @@ export class LendMarketTemplate {
621
621
  // ---------------- VAULT ----------------
622
622
  vaultMaxDeposit() {
623
623
  return __awaiter(this, arguments, void 0, function* (address = "") {
624
- address = _getAddress(address);
625
- // const _amount = await llamalend.contracts[this.addresses.vault].contract.maxDeposit(address); TODO use maxDeposit
626
- const _amount = yield llamalend.contracts[this.addresses.borrowed_token].contract.balanceOf(address);
624
+ address = _getAddress.call(this.llamalend, address);
625
+ // const _amount = await this.llamalend.contracts[this.addresses.vault].contract.maxDeposit(address); TODO use maxDeposit
626
+ const _amount = yield this.llamalend.contracts[this.addresses.borrowed_token].contract.balanceOf(address);
627
627
  return formatUnits(_amount, this.borrowed_token.decimals);
628
628
  });
629
629
  }
630
630
  vaultPreviewDeposit(amount) {
631
631
  return __awaiter(this, void 0, void 0, function* () {
632
632
  const _amount = parseUnits(amount, this.borrowed_token.decimals);
633
- const _shares = yield llamalend.contracts[this.addresses.vault].contract.previewDeposit(_amount);
633
+ const _shares = yield this.llamalend.contracts[this.addresses.vault].contract.previewDeposit(_amount);
634
634
  return formatUnits(_shares, 18);
635
635
  });
636
636
  }
637
637
  vaultDepositIsApproved(borrowed) {
638
638
  return __awaiter(this, void 0, void 0, function* () {
639
- return yield hasAllowance([this.borrowed_token.address], [borrowed], llamalend.signerAddress, this.addresses.vault);
639
+ return yield hasAllowance.call(this.llamalend, [this.borrowed_token.address], [borrowed], this.llamalend.signerAddress, this.addresses.vault);
640
640
  });
641
641
  }
642
642
  vaultDepositApproveEstimateGas(borrowed) {
643
643
  return __awaiter(this, void 0, void 0, function* () {
644
- return yield ensureAllowanceEstimateGas([this.borrowed_token.address], [borrowed], this.addresses.vault);
644
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.borrowed_token.address], [borrowed], this.addresses.vault);
645
645
  });
646
646
  }
647
647
  vaultDepositApprove(borrowed) {
648
648
  return __awaiter(this, void 0, void 0, function* () {
649
- return yield ensureAllowance([this.borrowed_token.address], [borrowed], this.addresses.vault);
649
+ return yield ensureAllowance.call(this.llamalend, [this.borrowed_token.address], [borrowed], this.addresses.vault);
650
650
  });
651
651
  }
652
652
  _vaultDeposit(amount_1) {
653
653
  return __awaiter(this, arguments, void 0, function* (amount, estimateGas = false) {
654
654
  const _amount = parseUnits(amount, this.borrowed_token.decimals);
655
- const gas = yield llamalend.contracts[this.addresses.vault].contract.deposit.estimateGas(_amount, Object.assign({}, llamalend.constantOptions));
655
+ const gas = yield this.llamalend.contracts[this.addresses.vault].contract.deposit.estimateGas(_amount, Object.assign({}, this.llamalend.constantOptions));
656
656
  if (estimateGas)
657
657
  return smartNumber(gas);
658
- yield llamalend.updateFeeData();
658
+ yield this.llamalend.updateFeeData();
659
659
  const gasLimit = _mulBy1_3(DIGas(gas));
660
- return (yield llamalend.contracts[this.addresses.vault].contract.deposit(_amount, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
660
+ return (yield this.llamalend.contracts[this.addresses.vault].contract.deposit(_amount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
661
661
  });
662
662
  }
663
663
  vaultDepositEstimateGas(amount) {
@@ -675,44 +675,44 @@ export class LendMarketTemplate {
675
675
  }
676
676
  vaultMaxMint() {
677
677
  return __awaiter(this, arguments, void 0, function* (address = "") {
678
- address = _getAddress(address);
679
- // const _shares = await llamalend.contracts[this.addresses.vault].contract.maxMint(address); TODO use maxMint
680
- const _assetBalance = yield llamalend.contracts[this.addresses.borrowed_token].contract.balanceOf(address);
681
- const _shares = yield llamalend.contracts[this.addresses.vault].contract.convertToShares(_assetBalance);
678
+ address = _getAddress.call(this.llamalend, address);
679
+ // const _shares = await this.llamalend.contracts[this.addresses.vault].contract.maxMint(address); TODO use maxMint
680
+ const _assetBalance = yield this.llamalend.contracts[this.addresses.borrowed_token].contract.balanceOf(address);
681
+ const _shares = yield this.llamalend.contracts[this.addresses.vault].contract.convertToShares(_assetBalance);
682
682
  return formatUnits(_shares, 18);
683
683
  });
684
684
  }
685
685
  vaultPreviewMint(amount) {
686
686
  return __awaiter(this, void 0, void 0, function* () {
687
687
  const _amount = parseUnits(amount, 18);
688
- const _assets = yield llamalend.contracts[this.addresses.vault].contract.previewMint(_amount);
688
+ const _assets = yield this.llamalend.contracts[this.addresses.vault].contract.previewMint(_amount);
689
689
  return formatUnits(_assets, this.borrowed_token.decimals);
690
690
  });
691
691
  }
692
692
  vaultMintIsApproved(borrowed) {
693
693
  return __awaiter(this, void 0, void 0, function* () {
694
- return yield hasAllowance([this.borrowed_token.address], [borrowed], llamalend.signerAddress, this.addresses.vault);
694
+ return yield hasAllowance.call(this.llamalend, [this.borrowed_token.address], [borrowed], this.llamalend.signerAddress, this.addresses.vault);
695
695
  });
696
696
  }
697
697
  vaultMintApproveEstimateGas(borrowed) {
698
698
  return __awaiter(this, void 0, void 0, function* () {
699
- return yield ensureAllowanceEstimateGas([this.borrowed_token.address], [borrowed], this.addresses.vault);
699
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.borrowed_token.address], [borrowed], this.addresses.vault);
700
700
  });
701
701
  }
702
702
  vaultMintApprove(borrowed) {
703
703
  return __awaiter(this, void 0, void 0, function* () {
704
- return yield ensureAllowance([this.borrowed_token.address], [borrowed], this.addresses.vault);
704
+ return yield ensureAllowance.call(this.llamalend, [this.borrowed_token.address], [borrowed], this.addresses.vault);
705
705
  });
706
706
  }
707
707
  _vaultMint(amount_1) {
708
708
  return __awaiter(this, arguments, void 0, function* (amount, estimateGas = false) {
709
709
  const _amount = parseUnits(amount, 18);
710
- const gas = yield llamalend.contracts[this.addresses.vault].contract.mint.estimateGas(_amount, Object.assign({}, llamalend.constantOptions));
710
+ const gas = yield this.llamalend.contracts[this.addresses.vault].contract.mint.estimateGas(_amount, Object.assign({}, this.llamalend.constantOptions));
711
711
  if (estimateGas)
712
712
  return smartNumber(gas);
713
- yield llamalend.updateFeeData();
713
+ yield this.llamalend.updateFeeData();
714
714
  const gasLimit = _mulBy1_3(DIGas(gas));
715
- return (yield llamalend.contracts[this.addresses.vault].contract.mint(_amount, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
715
+ return (yield this.llamalend.contracts[this.addresses.vault].contract.mint(_amount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
716
716
  });
717
717
  }
718
718
  vaultMintEstimateGas(amount) {
@@ -730,27 +730,27 @@ export class LendMarketTemplate {
730
730
  }
731
731
  vaultMaxWithdraw() {
732
732
  return __awaiter(this, arguments, void 0, function* (address = "") {
733
- address = _getAddress(address);
734
- const _assets = yield llamalend.contracts[this.addresses.vault].contract.maxWithdraw(address);
733
+ address = _getAddress.call(this.llamalend, address);
734
+ const _assets = yield this.llamalend.contracts[this.addresses.vault].contract.maxWithdraw(address);
735
735
  return formatUnits(_assets, this.borrowed_token.decimals);
736
736
  });
737
737
  }
738
738
  vaultPreviewWithdraw(amount) {
739
739
  return __awaiter(this, void 0, void 0, function* () {
740
740
  const _amount = parseUnits(amount, this.borrowed_token.decimals);
741
- const _shares = yield llamalend.contracts[this.addresses.vault].contract.previewWithdraw(_amount);
741
+ const _shares = yield this.llamalend.contracts[this.addresses.vault].contract.previewWithdraw(_amount);
742
742
  return formatUnits(_shares, 18);
743
743
  });
744
744
  }
745
745
  _vaultWithdraw(amount_1) {
746
746
  return __awaiter(this, arguments, void 0, function* (amount, estimateGas = false) {
747
747
  const _amount = parseUnits(amount, this.borrowed_token.decimals);
748
- const gas = yield llamalend.contracts[this.addresses.vault].contract.withdraw.estimateGas(_amount, Object.assign({}, llamalend.constantOptions));
748
+ const gas = yield this.llamalend.contracts[this.addresses.vault].contract.withdraw.estimateGas(_amount, Object.assign({}, this.llamalend.constantOptions));
749
749
  if (estimateGas)
750
750
  return smartNumber(gas);
751
- yield llamalend.updateFeeData();
751
+ yield this.llamalend.updateFeeData();
752
752
  const gasLimit = _mulBy1_3(DIGas(gas));
753
- return (yield llamalend.contracts[this.addresses.vault].contract.withdraw(_amount, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
753
+ return (yield this.llamalend.contracts[this.addresses.vault].contract.withdraw(_amount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
754
754
  });
755
755
  }
756
756
  vaultWithdrawEstimateGas(amount) {
@@ -765,27 +765,27 @@ export class LendMarketTemplate {
765
765
  }
766
766
  vaultMaxRedeem() {
767
767
  return __awaiter(this, arguments, void 0, function* (address = "") {
768
- address = _getAddress(address);
769
- const _shares = yield llamalend.contracts[this.addresses.vault].contract.maxRedeem(address);
768
+ address = _getAddress.call(this.llamalend, address);
769
+ const _shares = yield this.llamalend.contracts[this.addresses.vault].contract.maxRedeem(address);
770
770
  return formatUnits(_shares, 18);
771
771
  });
772
772
  }
773
773
  vaultPreviewRedeem(amount) {
774
774
  return __awaiter(this, void 0, void 0, function* () {
775
775
  const _amount = parseUnits(amount, 18);
776
- const _assets = yield llamalend.contracts[this.addresses.vault].contract.previewRedeem(_amount);
776
+ const _assets = yield this.llamalend.contracts[this.addresses.vault].contract.previewRedeem(_amount);
777
777
  return formatUnits(_assets, this.borrowed_token.decimals);
778
778
  });
779
779
  }
780
780
  _vaultRedeem(amount_1) {
781
781
  return __awaiter(this, arguments, void 0, function* (amount, estimateGas = false) {
782
782
  const _amount = parseUnits(amount, 18);
783
- const gas = yield llamalend.contracts[this.addresses.vault].contract.redeem.estimateGas(_amount, Object.assign({}, llamalend.constantOptions));
783
+ const gas = yield this.llamalend.contracts[this.addresses.vault].contract.redeem.estimateGas(_amount, Object.assign({}, this.llamalend.constantOptions));
784
784
  if (estimateGas)
785
785
  return smartNumber(gas);
786
- yield llamalend.updateFeeData();
786
+ yield this.llamalend.updateFeeData();
787
787
  const gasLimit = _mulBy1_3(DIGas(gas));
788
- return (yield llamalend.contracts[this.addresses.vault].contract.redeem(_amount, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
788
+ return (yield this.llamalend.contracts[this.addresses.vault].contract.redeem(_amount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
789
789
  });
790
790
  }
791
791
  vaultRedeemEstimateGas(amount) {
@@ -802,96 +802,96 @@ export class LendMarketTemplate {
802
802
  vaultConvertToShares(assets) {
803
803
  return __awaiter(this, void 0, void 0, function* () {
804
804
  const _assets = parseUnits(assets, this.borrowed_token.decimals);
805
- const _shares = yield llamalend.contracts[this.addresses.vault].contract.convertToShares(_assets);
806
- return llamalend.formatUnits(_shares);
805
+ const _shares = yield this.llamalend.contracts[this.addresses.vault].contract.convertToShares(_assets);
806
+ return this.llamalend.formatUnits(_shares);
807
807
  });
808
808
  }
809
809
  vaultConvertToAssets(shares) {
810
810
  return __awaiter(this, void 0, void 0, function* () {
811
811
  const _shares = parseUnits(shares);
812
- const _assets = yield llamalend.contracts[this.addresses.vault].contract.convertToAssets(_shares);
813
- return llamalend.formatUnits(_assets, this.borrowed_token.decimals);
812
+ const _assets = yield this.llamalend.contracts[this.addresses.vault].contract.convertToAssets(_shares);
813
+ return this.llamalend.formatUnits(_assets, this.borrowed_token.decimals);
814
814
  });
815
815
  }
816
816
  // ---------------- VAULT STAKING ----------------
817
817
  vaultStakeIsApproved(vaultShares) {
818
818
  return __awaiter(this, void 0, void 0, function* () {
819
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
819
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
820
820
  throw Error(`stakeIsApproved method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
821
821
  }
822
- return yield hasAllowance([this.addresses.vault], [vaultShares], llamalend.signerAddress, this.addresses.gauge);
822
+ return yield hasAllowance.call(this.llamalend, [this.addresses.vault], [vaultShares], this.llamalend.signerAddress, this.addresses.gauge);
823
823
  });
824
824
  }
825
825
  vaultStakeApproveEstimateGas(vaultShares) {
826
826
  return __awaiter(this, void 0, void 0, function* () {
827
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
827
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
828
828
  throw Error(`stakeApproveEstimateGas method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
829
829
  }
830
- return yield ensureAllowanceEstimateGas([this.addresses.vault], [vaultShares], this.addresses.gauge);
830
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.addresses.vault], [vaultShares], this.addresses.gauge);
831
831
  });
832
832
  }
833
833
  vaultStakeApprove(vaultShares) {
834
834
  return __awaiter(this, void 0, void 0, function* () {
835
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
835
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
836
836
  throw Error(`stakeApprove method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
837
837
  }
838
- return yield ensureAllowance([this.addresses.vault], [vaultShares], this.addresses.gauge);
838
+ return yield ensureAllowance.call(this.llamalend, [this.addresses.vault], [vaultShares], this.addresses.gauge);
839
839
  });
840
840
  }
841
841
  vaultStakeEstimateGas(vaultShares) {
842
842
  return __awaiter(this, void 0, void 0, function* () {
843
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
843
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
844
844
  throw Error(`stakeEstimateGas method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
845
845
  }
846
846
  const _vaultShares = parseUnits(vaultShares);
847
- return smartNumber(yield llamalend.contracts[this.addresses.gauge].contract.deposit.estimateGas(_vaultShares, llamalend.constantOptions));
847
+ return smartNumber(yield this.llamalend.contracts[this.addresses.gauge].contract.deposit.estimateGas(_vaultShares, this.llamalend.constantOptions));
848
848
  });
849
849
  }
850
850
  vaultStake(vaultShares) {
851
851
  return __awaiter(this, void 0, void 0, function* () {
852
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
852
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
853
853
  throw Error(`stake method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
854
854
  }
855
855
  const _vaultShares = parseUnits(vaultShares);
856
- yield _ensureAllowance([this.addresses.vault], [_vaultShares], this.addresses.gauge);
857
- yield llamalend.updateFeeData();
858
- const gasLimit = _mulBy1_3(DIGas(yield llamalend.contracts[this.addresses.gauge].contract.deposit.estimateGas(_vaultShares, llamalend.constantOptions)));
859
- return (yield llamalend.contracts[this.addresses.gauge].contract.deposit(_vaultShares, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
856
+ yield _ensureAllowance.call(this.llamalend, [this.addresses.vault], [_vaultShares], this.addresses.gauge);
857
+ yield this.llamalend.updateFeeData();
858
+ const gasLimit = _mulBy1_3(DIGas(yield this.llamalend.contracts[this.addresses.gauge].contract.deposit.estimateGas(_vaultShares, this.llamalend.constantOptions)));
859
+ return (yield this.llamalend.contracts[this.addresses.gauge].contract.deposit(_vaultShares, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
860
860
  });
861
861
  }
862
862
  vaultUnstakeEstimateGas(vaultShares) {
863
863
  return __awaiter(this, void 0, void 0, function* () {
864
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
864
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
865
865
  throw Error(`unstakeEstimateGas method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
866
866
  }
867
867
  const _vaultShares = parseUnits(vaultShares);
868
- return smartNumber(yield llamalend.contracts[this.addresses.gauge].contract.withdraw.estimateGas(_vaultShares, llamalend.constantOptions));
868
+ return smartNumber(yield this.llamalend.contracts[this.addresses.gauge].contract.withdraw.estimateGas(_vaultShares, this.llamalend.constantOptions));
869
869
  });
870
870
  }
871
871
  vaultUnstake(vaultShares) {
872
872
  return __awaiter(this, void 0, void 0, function* () {
873
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
873
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
874
874
  throw Error(`unstake method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
875
875
  }
876
876
  const _vaultShares = parseUnits(vaultShares);
877
- yield llamalend.updateFeeData();
878
- const gasLimit = _mulBy1_3(DIGas((yield llamalend.contracts[this.addresses.gauge].contract.withdraw.estimateGas(_vaultShares, llamalend.constantOptions))));
879
- return (yield llamalend.contracts[this.addresses.gauge].contract.withdraw(_vaultShares, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
877
+ yield this.llamalend.updateFeeData();
878
+ const gasLimit = _mulBy1_3(DIGas((yield this.llamalend.contracts[this.addresses.gauge].contract.withdraw.estimateGas(_vaultShares, this.llamalend.constantOptions))));
879
+ return (yield this.llamalend.contracts[this.addresses.gauge].contract.withdraw(_vaultShares, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
880
880
  });
881
881
  }
882
882
  // ---------------- VAULT STAKING REWARDS ----------------
883
883
  vaultRewardsOnly() {
884
- if (llamalend.chainId === 2222 || llamalend.chainId === 324)
884
+ if (this.llamalend.chainId === 2222 || this.llamalend.chainId === 324)
885
885
  return true; // TODO remove this for Kava and ZkSync
886
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS)
886
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS)
887
887
  throw Error(`${this.name} doesn't have gauge`);
888
- const gaugeContract = llamalend.contracts[this.addresses.gauge].contract;
888
+ const gaugeContract = this.llamalend.contracts[this.addresses.gauge].contract;
889
889
  return !('inflation_rate()' in gaugeContract || 'inflation_rate(uint256)' in gaugeContract);
890
890
  }
891
891
  vaultTotalLiquidity() {
892
892
  return __awaiter(this, arguments, void 0, function* (useAPI = true) {
893
893
  const { cap } = yield this.statsCapAndAvailable(true, useAPI);
894
- const price = yield _getUsdRate(this.addresses.borrowed_token);
894
+ const price = yield _getUsdRate.call(this.llamalend, this.addresses.borrowed_token);
895
895
  return BN(cap).times(price).toFixed(6);
896
896
  });
897
897
  }
@@ -899,7 +899,7 @@ export class LendMarketTemplate {
899
899
  return __awaiter(this, void 0, void 0, function* () {
900
900
  if (this.vaultRewardsOnly())
901
901
  throw Error(`${this.name} has Rewards-Only Gauge. Use stats.rewardsApy instead`);
902
- // const isDisabledChain = [1313161554].includes(llamalend.chainId); // Disable Aurora
902
+ // const isDisabledChain = [1313161554].includes(this.llamalend.chainId); // Disable Aurora
903
903
  // if (useApi && !isDisabledChain) {
904
904
  // const crvAPYs = await _getCrvApyFromApi();
905
905
  // const poolCrvApy = crvAPYs[this.addresses.gauge] ?? [0, 0]; // new pools might be missing
@@ -912,10 +912,10 @@ export class LendMarketTemplate {
912
912
  return __awaiter(this, arguments, void 0, function* (address = "") {
913
913
  if (this.vaultRewardsOnly())
914
914
  throw Error(`${this.name} has Rewards-Only Gauge. Use claimableRewards instead`);
915
- address = address || llamalend.signerAddress;
915
+ address = address || this.llamalend.signerAddress;
916
916
  if (!address)
917
917
  throw Error("Need to connect wallet or pass address into args");
918
- return llamalend.formatUnits(yield llamalend.contracts[this.addresses.gauge].contract.claimable_tokens(address, llamalend.constantOptions));
918
+ return this.llamalend.formatUnits(yield this.llamalend.contracts[this.addresses.gauge].contract.claimable_tokens(address, this.llamalend.constantOptions));
919
919
  });
920
920
  }
921
921
  _vaultClaimCrv(estimateGas) {
@@ -924,10 +924,10 @@ export class LendMarketTemplate {
924
924
  throw Error(`${this.name} has Rewards-Only Gauge. Use claimRewards instead`);
925
925
  let isOldFactory = false;
926
926
  let contract;
927
- if (llamalend.chainId !== 1) {
928
- if (llamalend.constants.ALIASES.gauge_factory_old && llamalend.constants.ALIASES.gauge_factory_old !== llamalend.constants.ZERO_ADDRESS) {
929
- const oldFactoryContract = llamalend.contracts[llamalend.constants.ALIASES.gauge_factory_old].contract;
930
- const lpToken = yield llamalend.contracts[this.addresses.gauge].contract.lp_token();
927
+ if (this.llamalend.chainId !== 1) {
928
+ if (this.llamalend.constants.ALIASES.gauge_factory_old && this.llamalend.constants.ALIASES.gauge_factory_old !== this.llamalend.constants.ZERO_ADDRESS) {
929
+ const oldFactoryContract = this.llamalend.contracts[this.llamalend.constants.ALIASES.gauge_factory_old].contract;
930
+ const lpToken = yield this.llamalend.contracts[this.addresses.gauge].contract.lp_token();
931
931
  const gaugeAddress = yield oldFactoryContract.get_gauge_from_lp_token(lpToken);
932
932
  isOldFactory = gaugeAddress.toLowerCase() === this.addresses.gauge.toLowerCase();
933
933
  if (isOldFactory) {
@@ -936,17 +936,17 @@ export class LendMarketTemplate {
936
936
  }
937
937
  }
938
938
  if (!isOldFactory) {
939
- contract = llamalend.contracts[llamalend.constants.ALIASES.minter].contract;
939
+ contract = this.llamalend.contracts[this.llamalend.constants.ALIASES.minter].contract;
940
940
  }
941
941
  if (!contract) {
942
942
  throw Error(`${this.name} couldn't match gauge factory`);
943
943
  }
944
- const gas = yield contract.mint.estimateGas(this.addresses.gauge, llamalend.constantOptions);
944
+ const gas = yield contract.mint.estimateGas(this.addresses.gauge, this.llamalend.constantOptions);
945
945
  if (estimateGas)
946
946
  return smartNumber(gas);
947
- yield llamalend.updateFeeData();
947
+ yield this.llamalend.updateFeeData();
948
948
  const gasLimit = _mulBy1_3(DIGas(gas));
949
- return (yield contract.mint(this.addresses.gauge, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
949
+ return (yield contract.mint(this.addresses.gauge, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
950
950
  });
951
951
  }
952
952
  vaultClaimCrvEstimateGas() {
@@ -961,21 +961,21 @@ export class LendMarketTemplate {
961
961
  }
962
962
  vaultClaimableRewards() {
963
963
  return __awaiter(this, arguments, void 0, function* (address = "") {
964
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
964
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
965
965
  throw Error(`claimableRewards method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
966
966
  }
967
- address = address || llamalend.signerAddress;
967
+ address = address || this.llamalend.signerAddress;
968
968
  if (!address)
969
969
  throw Error("Need to connect wallet or pass address into args");
970
- const gaugeContract = llamalend.contracts[this.addresses.gauge].contract;
970
+ const gaugeContract = this.llamalend.contracts[this.addresses.gauge].contract;
971
971
  const rewardTokens = yield this.vaultRewardTokens();
972
972
  const rewards = [];
973
973
  for (const rewardToken of rewardTokens) {
974
- const _amount = yield gaugeContract.claimable_reward(address, rewardToken.token, llamalend.constantOptions);
974
+ const _amount = yield gaugeContract.claimable_reward(address, rewardToken.token, this.llamalend.constantOptions);
975
975
  rewards.push({
976
976
  token: rewardToken.token,
977
977
  symbol: rewardToken.symbol,
978
- amount: llamalend.formatUnits(_amount, rewardToken.decimals),
978
+ amount: this.llamalend.formatUnits(_amount, rewardToken.decimals),
979
979
  });
980
980
  }
981
981
  return rewards;
@@ -983,18 +983,18 @@ export class LendMarketTemplate {
983
983
  }
984
984
  _vaultClaimRewards(estimateGas) {
985
985
  return __awaiter(this, void 0, void 0, function* () {
986
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
986
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
987
987
  throw Error(`claimRewards method doesn't exist for pool ${this.name} (id: ${this.name}). There is no gauge`);
988
988
  }
989
- const gaugeContract = llamalend.contracts[this.addresses.gauge].contract;
989
+ const gaugeContract = this.llamalend.contracts[this.addresses.gauge].contract;
990
990
  if (!("claim_rewards()" in gaugeContract))
991
991
  throw Error(`${this.name} pool doesn't have such method`);
992
- const gas = yield gaugeContract.claim_rewards.estimateGas(llamalend.constantOptions);
992
+ const gas = yield gaugeContract.claim_rewards.estimateGas(this.llamalend.constantOptions);
993
993
  if (estimateGas)
994
994
  return smartNumber(gas);
995
- yield llamalend.updateFeeData();
995
+ yield this.llamalend.updateFeeData();
996
996
  const gasLimit = _mulBy1_3(DIGas(gas));
997
- return (yield gaugeContract.claim_rewards(Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
997
+ return (yield gaugeContract.claim_rewards(Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
998
998
  });
999
999
  }
1000
1000
  vaultClaimRewardsEstimateGas() {
@@ -1010,7 +1010,7 @@ export class LendMarketTemplate {
1010
1010
  statsRates() {
1011
1011
  return __awaiter(this, arguments, void 0, function* (isGetter = true, useAPI = false) {
1012
1012
  if (useAPI) {
1013
- const response = yield _getMarketsData(llamalend.constants.NETWORK_NAME);
1013
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
1014
1014
  const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.addresses.vault.toLowerCase());
1015
1015
  if (market) {
1016
1016
  return {
@@ -1066,16 +1066,16 @@ export class LendMarketTemplate {
1066
1066
  }
1067
1067
  statsBalances() {
1068
1068
  return __awaiter(this, void 0, void 0, function* () {
1069
- const borrowedContract = llamalend.contracts[this.borrowed_token.address].multicallContract;
1070
- const collateralContract = llamalend.contracts[this.collateral_token.address].multicallContract;
1071
- const ammContract = llamalend.contracts[this.addresses.amm].multicallContract;
1069
+ const borrowedContract = this.llamalend.contracts[this.borrowed_token.address].multicallContract;
1070
+ const collateralContract = this.llamalend.contracts[this.collateral_token.address].multicallContract;
1071
+ const ammContract = this.llamalend.contracts[this.addresses.amm].multicallContract;
1072
1072
  const calls = [
1073
1073
  borrowedContract.balanceOf(this.addresses.amm),
1074
1074
  collateralContract.balanceOf(this.addresses.amm),
1075
1075
  ammContract.admin_fees_x(),
1076
1076
  ammContract.admin_fees_y(),
1077
1077
  ];
1078
- const [_borrowedBalance, _collateralBalance, _borrowedAdminFees, _collateralAdminFees] = yield llamalend.multicallProvider.all(calls);
1078
+ const [_borrowedBalance, _collateralBalance, _borrowedAdminFees, _collateralAdminFees] = yield this.llamalend.multicallProvider.all(calls);
1079
1079
  return [
1080
1080
  formatUnits(_borrowedBalance - _borrowedAdminFees, this.borrowed_token.decimals),
1081
1081
  formatUnits(_collateralBalance - _collateralAdminFees, this.collateral_token.decimals),
@@ -1084,10 +1084,10 @@ export class LendMarketTemplate {
1084
1084
  }
1085
1085
  statsBandBalances(n) {
1086
1086
  return __awaiter(this, void 0, void 0, function* () {
1087
- const ammContract = llamalend.contracts[this.addresses.amm].multicallContract;
1087
+ const ammContract = this.llamalend.contracts[this.addresses.amm].multicallContract;
1088
1088
  const calls = [];
1089
1089
  calls.push(ammContract.bands_x(n), ammContract.bands_y(n));
1090
- const _balances = yield llamalend.multicallProvider.all(calls);
1090
+ const _balances = yield this.llamalend.multicallProvider.all(calls);
1091
1091
  // bands_x and bands_y always return amounts with 18 decimals
1092
1092
  return {
1093
1093
  borrowed: formatNumber(formatUnits(_balances[0]), this.borrowed_token.decimals),
@@ -1098,12 +1098,12 @@ export class LendMarketTemplate {
1098
1098
  statsBandsBalances() {
1099
1099
  return __awaiter(this, void 0, void 0, function* () {
1100
1100
  const { maxBand, minBand } = yield this.statsBandsInfo();
1101
- const ammContract = llamalend.contracts[this.addresses.amm].multicallContract;
1101
+ const ammContract = this.llamalend.contracts[this.addresses.amm].multicallContract;
1102
1102
  const calls = [];
1103
1103
  for (let i = minBand; i <= maxBand; i++) {
1104
1104
  calls.push(ammContract.bands_x(i), ammContract.bands_y(i));
1105
1105
  }
1106
- const _bands = yield llamalend.multicallProvider.all(calls);
1106
+ const _bands = yield this.llamalend.multicallProvider.all(calls);
1107
1107
  const bands = {};
1108
1108
  for (let i = minBand; i <= maxBand; i++) {
1109
1109
  const _i = i - minBand;
@@ -1119,7 +1119,7 @@ export class LendMarketTemplate {
1119
1119
  statsTotalDebt() {
1120
1120
  return __awaiter(this, arguments, void 0, function* (isGetter = true, useAPI = true) {
1121
1121
  if (useAPI) {
1122
- const response = yield _getMarketsData(llamalend.constants.NETWORK_NAME);
1122
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
1123
1123
  const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.addresses.vault.toLowerCase());
1124
1124
  if (market) {
1125
1125
  return market.borrowed.total.toString();
@@ -1134,7 +1134,7 @@ export class LendMarketTemplate {
1134
1134
  _debt = cacheStats.get(cacheKey(this.addresses.controller, 'total_debt'));
1135
1135
  }
1136
1136
  else {
1137
- _debt = yield llamalend.contracts[this.addresses.controller].contract.total_debt(llamalend.constantOptions);
1137
+ _debt = yield this.llamalend.contracts[this.addresses.controller].contract.total_debt(this.llamalend.constantOptions);
1138
1138
  cacheStats.set(cacheKey(this.addresses.controller, 'total_debt'), _debt);
1139
1139
  }
1140
1140
  return formatUnits(_debt, this.borrowed_token.decimals);
@@ -1144,7 +1144,7 @@ export class LendMarketTemplate {
1144
1144
  statsCapAndAvailable() {
1145
1145
  return __awaiter(this, arguments, void 0, function* (isGetter = true, useAPI = false) {
1146
1146
  if (useAPI) {
1147
- const response = yield _getMarketsData(llamalend.constants.NETWORK_NAME);
1147
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
1148
1148
  const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.addresses.vault.toLowerCase());
1149
1149
  if (market) {
1150
1150
  return {
@@ -1157,15 +1157,15 @@ export class LendMarketTemplate {
1157
1157
  }
1158
1158
  }
1159
1159
  else {
1160
- const vaultContract = llamalend.contracts[this.addresses.vault].multicallContract;
1161
- const borrowedContract = llamalend.contracts[this.addresses.borrowed_token].multicallContract;
1160
+ const vaultContract = this.llamalend.contracts[this.addresses.vault].multicallContract;
1161
+ const borrowedContract = this.llamalend.contracts[this.addresses.borrowed_token].multicallContract;
1162
1162
  let _cap, _available;
1163
1163
  if (isGetter) {
1164
1164
  _cap = cacheStats.get(cacheKey(this.addresses.vault, 'totalAssets', this.addresses.controller));
1165
1165
  _available = cacheStats.get(cacheKey(this.addresses.borrowed_token, 'balanceOf', this.addresses.controller));
1166
1166
  }
1167
1167
  else {
1168
- [_cap, _available] = yield llamalend.multicallProvider.all([
1168
+ [_cap, _available] = yield this.llamalend.multicallProvider.all([
1169
1169
  vaultContract.totalAssets(this.addresses.controller),
1170
1170
  borrowedContract.balanceOf(this.addresses.controller),
1171
1171
  ]);
@@ -1173,8 +1173,8 @@ export class LendMarketTemplate {
1173
1173
  cacheStats.set(cacheKey(this.addresses.borrowed_token, 'balanceOf', this.addresses.controller), _available);
1174
1174
  }
1175
1175
  return {
1176
- cap: llamalend.formatUnits(_cap, this.borrowed_token.decimals),
1177
- available: llamalend.formatUnits(_available, this.borrowed_token.decimals),
1176
+ cap: this.llamalend.formatUnits(_cap, this.borrowed_token.decimals),
1177
+ available: this.llamalend.formatUnits(_available, this.borrowed_token.decimals),
1178
1178
  };
1179
1179
  }
1180
1180
  });
@@ -1200,7 +1200,7 @@ export class LendMarketTemplate {
1200
1200
  }
1201
1201
  price() {
1202
1202
  return __awaiter(this, void 0, void 0, function* () {
1203
- const _price = yield llamalend.contracts[this.addresses.amm].contract.get_p(llamalend.constantOptions);
1203
+ const _price = yield this.llamalend.contracts[this.addresses.amm].contract.get_p(this.llamalend.constantOptions);
1204
1204
  return formatUnits(_price);
1205
1205
  });
1206
1206
  }
@@ -1228,12 +1228,12 @@ export class LendMarketTemplate {
1228
1228
  // ---------------- WALLET BALANCES ----------------
1229
1229
  walletBalances() {
1230
1230
  return __awaiter(this, arguments, void 0, function* (address = "") {
1231
- if (this.addresses.gauge === llamalend.constants.ZERO_ADDRESS) {
1232
- const [collateral, borrowed, vaultShares] = yield getBalances([this.collateral_token.address, this.borrowed_token.address, this.addresses.vault], address);
1231
+ if (this.addresses.gauge === this.llamalend.constants.ZERO_ADDRESS) {
1232
+ const [collateral, borrowed, vaultShares] = yield getBalances.call(this.llamalend, [this.collateral_token.address, this.borrowed_token.address, this.addresses.vault], address);
1233
1233
  return { collateral, borrowed, vaultShares, gauge: "0" };
1234
1234
  }
1235
1235
  else {
1236
- const [collateral, borrowed, vaultShares, gauge] = yield getBalances([this.collateral_token.address, this.borrowed_token.address, this.addresses.vault, this.addresses.gauge], address);
1236
+ const [collateral, borrowed, vaultShares, gauge] = yield getBalances.call(this.llamalend, [this.collateral_token.address, this.borrowed_token.address, this.addresses.vault, this.addresses.gauge], address);
1237
1237
  return { collateral, borrowed, vaultShares, gauge };
1238
1238
  }
1239
1239
  });
@@ -1241,8 +1241,8 @@ export class LendMarketTemplate {
1241
1241
  // ---------------- USER POSITION ----------------
1242
1242
  userLoanExists() {
1243
1243
  return __awaiter(this, arguments, void 0, function* (address = "") {
1244
- address = _getAddress(address);
1245
- return yield llamalend.contracts[this.addresses.controller].contract.loan_exists(address, llamalend.constantOptions);
1244
+ address = _getAddress.call(this.llamalend, address);
1245
+ return yield this.llamalend.contracts[this.addresses.controller].contract.loan_exists(address, this.llamalend.constantOptions);
1246
1246
  });
1247
1247
  }
1248
1248
  userState() {
@@ -1258,16 +1258,16 @@ export class LendMarketTemplate {
1258
1258
  }
1259
1259
  userHealth() {
1260
1260
  return __awaiter(this, arguments, void 0, function* (full = true, address = "") {
1261
- address = _getAddress(address);
1262
- let _health = yield llamalend.contracts[this.addresses.controller].contract.health(address, full, llamalend.constantOptions);
1261
+ address = _getAddress.call(this.llamalend, address);
1262
+ let _health = yield this.llamalend.contracts[this.addresses.controller].contract.health(address, full, this.llamalend.constantOptions);
1263
1263
  _health = _health * BigInt(100);
1264
1264
  return formatUnits(_health);
1265
1265
  });
1266
1266
  }
1267
1267
  _userBands(address) {
1268
1268
  return __awaiter(this, void 0, void 0, function* () {
1269
- address = _getAddress(address);
1270
- const _bands = yield llamalend.contracts[this.addresses.amm].contract.read_user_tick_numbers(address, llamalend.constantOptions);
1269
+ address = _getAddress.call(this.llamalend, address);
1270
+ const _bands = yield this.llamalend.contracts[this.addresses.amm].contract.read_user_tick_numbers(address, this.llamalend.constantOptions);
1271
1271
  return Array.from(_bands).reverse();
1272
1272
  });
1273
1273
  }
@@ -1286,20 +1286,20 @@ export class LendMarketTemplate {
1286
1286
  }
1287
1287
  userPrices() {
1288
1288
  return __awaiter(this, arguments, void 0, function* (address = "") {
1289
- address = _getAddress(address);
1290
- const _prices = yield llamalend.contracts[this.addresses.controller].contract.user_prices(address, llamalend.constantOptions);
1289
+ address = _getAddress.call(this.llamalend, address);
1290
+ const _prices = yield this.llamalend.contracts[this.addresses.controller].contract.user_prices(address, this.llamalend.constantOptions);
1291
1291
  return _prices.map((_p) => formatUnits(_p)).reverse();
1292
1292
  });
1293
1293
  }
1294
1294
  userLoss() {
1295
1295
  return __awaiter(this, arguments, void 0, function* (userAddress = "") {
1296
- userAddress = _getAddress(userAddress);
1296
+ userAddress = _getAddress.call(this.llamalend, userAddress);
1297
1297
  const [userCollateral, _current_collateral_estimation] = yield Promise.all([
1298
- _getUserCollateral(llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
1299
- llamalend.contracts[this.addresses.amm].contract.get_y_up(userAddress),
1298
+ _getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
1299
+ this.llamalend.contracts[this.addresses.amm].contract.get_y_up(userAddress),
1300
1300
  ]);
1301
1301
  const deposited_collateral = userCollateral.total_deposit_precise;
1302
- const current_collateral_estimation = llamalend.formatUnits(_current_collateral_estimation, this.collateral_token.decimals);
1302
+ const current_collateral_estimation = this.llamalend.formatUnits(_current_collateral_estimation, this.collateral_token.decimals);
1303
1303
  if (BN(deposited_collateral).lte(0)) {
1304
1304
  return {
1305
1305
  deposited_collateral,
@@ -1323,9 +1323,9 @@ export class LendMarketTemplate {
1323
1323
  const [n2, n1] = yield this.userBands(address);
1324
1324
  if (n1 == 0 && n2 == 0)
1325
1325
  return {};
1326
- address = _getAddress(address);
1327
- const contract = llamalend.contracts[this.addresses.amm].contract;
1328
- const [_borrowed, _collateral] = yield contract.get_xy(address, llamalend.constantOptions);
1326
+ address = _getAddress.call(this.llamalend, address);
1327
+ const contract = this.llamalend.contracts[this.addresses.amm].contract;
1328
+ const [_borrowed, _collateral] = yield contract.get_xy(address, this.llamalend.constantOptions);
1329
1329
  const res = {};
1330
1330
  for (let i = n1; i <= n2; i++) {
1331
1331
  res[i] = {
@@ -1347,8 +1347,8 @@ export class LendMarketTemplate {
1347
1347
  return __awaiter(this, void 0, void 0, function* () {
1348
1348
  this._checkRange(range);
1349
1349
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1350
- const contract = llamalend.contracts[this.addresses.controller].contract;
1351
- return formatUnits(yield contract.max_borrowable(_collateral, range, 0, llamalend.constantOptions), this.borrowed_token.decimals);
1350
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1351
+ return formatUnits(yield contract.max_borrowable(_collateral, range, 0, this.llamalend.constantOptions), this.borrowed_token.decimals);
1352
1352
  });
1353
1353
  }
1354
1354
  getMaxRange(collateral, debt) {
@@ -1364,22 +1364,22 @@ export class LendMarketTemplate {
1364
1364
  _calcN1(_collateral, _debt, range) {
1365
1365
  return __awaiter(this, void 0, void 0, function* () {
1366
1366
  this._checkRange(range);
1367
- return yield llamalend.contracts[this.addresses.controller].contract.calculate_debt_n1(_collateral, _debt, range, llamalend.constantOptions);
1367
+ return yield this.llamalend.contracts[this.addresses.controller].contract.calculate_debt_n1(_collateral, _debt, range, this.llamalend.constantOptions);
1368
1368
  });
1369
1369
  }
1370
1370
  _calcN1AllRanges(_collateral, _debt, maxN) {
1371
1371
  return __awaiter(this, void 0, void 0, function* () {
1372
1372
  const calls = [];
1373
1373
  for (let N = this.minBands; N <= maxN; N++) {
1374
- calls.push(llamalend.contracts[this.addresses.controller].multicallContract.calculate_debt_n1(_collateral, _debt, N));
1374
+ calls.push(this.llamalend.contracts[this.addresses.controller].multicallContract.calculate_debt_n1(_collateral, _debt, N));
1375
1375
  }
1376
- return yield llamalend.multicallProvider.all(calls);
1376
+ return yield this.llamalend.multicallProvider.all(calls);
1377
1377
  });
1378
1378
  }
1379
1379
  _getPrices(_n2, _n1) {
1380
1380
  return __awaiter(this, void 0, void 0, function* () {
1381
- const contract = llamalend.contracts[this.addresses.amm].multicallContract;
1382
- return (yield llamalend.multicallProvider.all([
1381
+ const contract = this.llamalend.contracts[this.addresses.amm].multicallContract;
1382
+ return (yield this.llamalend.multicallProvider.all([
1383
1383
  contract.p_oracle_down(_n2),
1384
1384
  contract.p_oracle_up(_n1),
1385
1385
  ])).map((_p) => formatUnits(_p));
@@ -1458,25 +1458,25 @@ export class LendMarketTemplate {
1458
1458
  return __awaiter(this, arguments, void 0, function* (collateral, debt, range, full = true) {
1459
1459
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1460
1460
  const _debt = parseUnits(debt, this.borrowed_token.decimals);
1461
- const contract = llamalend.contracts[this.addresses.controller].contract;
1462
- let _health = yield contract.health_calculator(llamalend.constants.ZERO_ADDRESS, _collateral, _debt, full, range, llamalend.constantOptions);
1461
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1462
+ let _health = yield contract.health_calculator(this.llamalend.constants.ZERO_ADDRESS, _collateral, _debt, full, range, this.llamalend.constantOptions);
1463
1463
  _health = _health * BigInt(100);
1464
1464
  return formatUnits(_health);
1465
1465
  });
1466
1466
  }
1467
1467
  createLoanIsApproved(collateral) {
1468
1468
  return __awaiter(this, void 0, void 0, function* () {
1469
- return yield hasAllowance([this.collateral_token.address], [collateral], llamalend.signerAddress, this.addresses.controller);
1469
+ return yield hasAllowance.call(this.llamalend, [this.collateral_token.address], [collateral], this.llamalend.signerAddress, this.addresses.controller);
1470
1470
  });
1471
1471
  }
1472
1472
  createLoanApproveEstimateGas(collateral) {
1473
1473
  return __awaiter(this, void 0, void 0, function* () {
1474
- return yield ensureAllowanceEstimateGas([this.collateral_token.address], [collateral], this.addresses.controller);
1474
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.collateral_token.address], [collateral], this.addresses.controller);
1475
1475
  });
1476
1476
  }
1477
1477
  createLoanApprove(collateral) {
1478
1478
  return __awaiter(this, void 0, void 0, function* () {
1479
- return yield ensureAllowance([this.collateral_token.address], [collateral], this.addresses.controller);
1479
+ return yield ensureAllowance.call(this.llamalend, [this.collateral_token.address], [collateral], this.addresses.controller);
1480
1480
  });
1481
1481
  }
1482
1482
  _createLoan(collateral, debt, range, estimateGas) {
@@ -1486,13 +1486,13 @@ export class LendMarketTemplate {
1486
1486
  this._checkRange(range);
1487
1487
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1488
1488
  const _debt = parseUnits(debt, this.borrowed_token.decimals);
1489
- const contract = llamalend.contracts[this.addresses.controller].contract;
1490
- const gas = yield contract.create_loan.estimateGas(_collateral, _debt, range, Object.assign({}, llamalend.constantOptions));
1489
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1490
+ const gas = yield contract.create_loan.estimateGas(_collateral, _debt, range, Object.assign({}, this.llamalend.constantOptions));
1491
1491
  if (estimateGas)
1492
1492
  return smartNumber(gas);
1493
- yield llamalend.updateFeeData();
1493
+ yield this.llamalend.updateFeeData();
1494
1494
  const gasLimit = _mulBy1_3(DIGas(gas));
1495
- return (yield contract.create_loan(_collateral, _debt, range, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
1495
+ return (yield contract.create_loan(_collateral, _debt, range, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
1496
1496
  });
1497
1497
  }
1498
1498
  createLoanEstimateGas(collateral, debt, range) {
@@ -1513,8 +1513,8 @@ export class LendMarketTemplate {
1513
1513
  return __awaiter(this, void 0, void 0, function* () {
1514
1514
  const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this._userState();
1515
1515
  const _collateral = _currentCollateral + parseUnits(collateralAmount, this.collateral_token.decimals);
1516
- const contract = llamalend.contracts[this.addresses.controller].contract;
1517
- const _debt = yield contract.max_borrowable(_collateral, _N, _currentDebt, llamalend.constantOptions);
1516
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1517
+ const _debt = yield contract.max_borrowable(_collateral, _N, _currentDebt, this.llamalend.constantOptions);
1518
1518
  return formatUnits(_debt - _currentDebt, this.borrowed_token.decimals);
1519
1519
  });
1520
1520
  }
@@ -1522,7 +1522,7 @@ export class LendMarketTemplate {
1522
1522
  return __awaiter(this, void 0, void 0, function* () {
1523
1523
  const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this._userState();
1524
1524
  if (_currentDebt === BigInt(0))
1525
- throw Error(`Loan for ${llamalend.signerAddress} does not exist`);
1525
+ throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
1526
1526
  const _collateral = _currentCollateral + parseUnits(collateral, this.collateral_token.decimals);
1527
1527
  const _debt = _currentDebt + parseUnits(debt, this.borrowed_token.decimals);
1528
1528
  const _n1 = yield this._calcN1(_collateral, _debt, Number(_N));
@@ -1544,46 +1544,46 @@ export class LendMarketTemplate {
1544
1544
  }
1545
1545
  borrowMoreHealth(collateral_1, debt_1) {
1546
1546
  return __awaiter(this, arguments, void 0, function* (collateral, debt, full = true, address = "") {
1547
- address = _getAddress(address);
1547
+ address = _getAddress.call(this.llamalend, address);
1548
1548
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1549
1549
  const _debt = parseUnits(debt, this.borrowed_token.decimals);
1550
- const contract = llamalend.contracts[this.addresses.controller].contract;
1551
- let _health = yield contract.health_calculator(address, _collateral, _debt, full, 0, llamalend.constantOptions);
1550
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1551
+ let _health = yield contract.health_calculator(address, _collateral, _debt, full, 0, this.llamalend.constantOptions);
1552
1552
  _health = _health * BigInt(100);
1553
1553
  return formatUnits(_health);
1554
1554
  });
1555
1555
  }
1556
1556
  borrowMoreIsApproved(collateral) {
1557
1557
  return __awaiter(this, void 0, void 0, function* () {
1558
- return yield hasAllowance([this.addresses.collateral_token], [collateral], llamalend.signerAddress, this.addresses.controller);
1558
+ return yield hasAllowance.call(this.llamalend, [this.addresses.collateral_token], [collateral], this.llamalend.signerAddress, this.addresses.controller);
1559
1559
  });
1560
1560
  }
1561
1561
  borrowMoreApproveEstimateGas(collateral) {
1562
1562
  return __awaiter(this, void 0, void 0, function* () {
1563
- return yield ensureAllowanceEstimateGas([this.addresses.collateral_token], [collateral], this.addresses.controller);
1563
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.addresses.collateral_token], [collateral], this.addresses.controller);
1564
1564
  });
1565
1565
  }
1566
1566
  borrowMoreApprove(collateral) {
1567
1567
  return __awaiter(this, void 0, void 0, function* () {
1568
- return yield ensureAllowance([this.addresses.collateral_token], [collateral], this.addresses.controller);
1568
+ return yield ensureAllowance.call(this.llamalend, [this.addresses.collateral_token], [collateral], this.addresses.controller);
1569
1569
  });
1570
1570
  }
1571
1571
  _borrowMore(collateral, debt, estimateGas) {
1572
1572
  return __awaiter(this, void 0, void 0, function* () {
1573
1573
  const { borrowed, debt: currentDebt } = yield this.userState();
1574
1574
  if (Number(currentDebt) === 0)
1575
- throw Error(`Loan for ${llamalend.signerAddress} does not exist`);
1575
+ throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
1576
1576
  if (Number(borrowed) > 0)
1577
- throw Error(`User ${llamalend.signerAddress} is already in liquidation mode`);
1577
+ throw Error(`User ${this.llamalend.signerAddress} is already in liquidation mode`);
1578
1578
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1579
1579
  const _debt = parseUnits(debt, this.borrowed_token.decimals);
1580
- const contract = llamalend.contracts[this.addresses.controller].contract;
1581
- const gas = yield contract.borrow_more.estimateGas(_collateral, _debt, Object.assign({}, llamalend.constantOptions));
1580
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1581
+ const gas = yield contract.borrow_more.estimateGas(_collateral, _debt, Object.assign({}, this.llamalend.constantOptions));
1582
1582
  if (estimateGas)
1583
1583
  return smartNumber(gas);
1584
- yield llamalend.updateFeeData();
1584
+ yield this.llamalend.updateFeeData();
1585
1585
  const gasLimit = _mulBy1_3(DIGas(gas));
1586
- return (yield contract.borrow_more(_collateral, _debt, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
1586
+ return (yield contract.borrow_more(_collateral, _debt, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
1587
1587
  });
1588
1588
  }
1589
1589
  borrowMoreEstimateGas(collateral, debt) {
@@ -1602,7 +1602,7 @@ export class LendMarketTemplate {
1602
1602
  // ---------------- ADD COLLATERAL ----------------
1603
1603
  _addCollateralBands(collateral_1) {
1604
1604
  return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
1605
- address = _getAddress(address);
1605
+ address = _getAddress.call(this.llamalend, address);
1606
1606
  const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this._userState(address);
1607
1607
  if (_currentDebt === BigInt(0))
1608
1608
  throw Error(`Loan for ${address} does not exist`);
@@ -1626,27 +1626,27 @@ export class LendMarketTemplate {
1626
1626
  }
1627
1627
  addCollateralHealth(collateral_1) {
1628
1628
  return __awaiter(this, arguments, void 0, function* (collateral, full = true, address = "") {
1629
- address = _getAddress(address);
1629
+ address = _getAddress.call(this.llamalend, address);
1630
1630
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1631
- const contract = llamalend.contracts[this.addresses.controller].contract;
1632
- let _health = yield contract.health_calculator(address, _collateral, 0, full, 0, llamalend.constantOptions);
1631
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1632
+ let _health = yield contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions);
1633
1633
  _health = _health * BigInt(100);
1634
1634
  return formatUnits(_health);
1635
1635
  });
1636
1636
  }
1637
1637
  addCollateralIsApproved(collateral) {
1638
1638
  return __awaiter(this, void 0, void 0, function* () {
1639
- return yield hasAllowance([this.addresses.collateral_token], [collateral], llamalend.signerAddress, this.addresses.controller);
1639
+ return yield hasAllowance.call(this.llamalend, [this.addresses.collateral_token], [collateral], this.llamalend.signerAddress, this.addresses.controller);
1640
1640
  });
1641
1641
  }
1642
1642
  addCollateralApproveEstimateGas(collateral) {
1643
1643
  return __awaiter(this, void 0, void 0, function* () {
1644
- return yield ensureAllowanceEstimateGas([this.addresses.collateral_token], [collateral], this.addresses.controller);
1644
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.addresses.collateral_token], [collateral], this.addresses.controller);
1645
1645
  });
1646
1646
  }
1647
1647
  addCollateralApprove(collateral) {
1648
1648
  return __awaiter(this, void 0, void 0, function* () {
1649
- return yield ensureAllowance([this.addresses.collateral_token], [collateral], this.addresses.controller);
1649
+ return yield ensureAllowance.call(this.llamalend, [this.addresses.collateral_token], [collateral], this.addresses.controller);
1650
1650
  });
1651
1651
  }
1652
1652
  _addCollateral(collateral, address, estimateGas) {
@@ -1657,18 +1657,18 @@ export class LendMarketTemplate {
1657
1657
  if (Number(borrowed) > 0)
1658
1658
  throw Error(`User ${address} is already in liquidation mode`);
1659
1659
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1660
- const contract = llamalend.contracts[this.addresses.controller].contract;
1661
- const gas = yield contract.add_collateral.estimateGas(_collateral, address, Object.assign({}, llamalend.constantOptions));
1660
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1661
+ const gas = yield contract.add_collateral.estimateGas(_collateral, address, Object.assign({}, this.llamalend.constantOptions));
1662
1662
  if (estimateGas)
1663
1663
  return smartNumber(gas);
1664
- yield llamalend.updateFeeData();
1664
+ yield this.llamalend.updateFeeData();
1665
1665
  const gasLimit = _mulBy1_3(DIGas(gas));
1666
- return (yield contract.add_collateral(_collateral, address, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
1666
+ return (yield contract.add_collateral(_collateral, address, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
1667
1667
  });
1668
1668
  }
1669
1669
  addCollateralEstimateGas(collateral_1) {
1670
1670
  return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
1671
- address = _getAddress(address);
1671
+ address = _getAddress.call(this.llamalend, address);
1672
1672
  if (!(yield this.addCollateralIsApproved(collateral)))
1673
1673
  throw Error("Approval is needed for gas estimation");
1674
1674
  return yield this._addCollateral(collateral, address, true);
@@ -1676,7 +1676,7 @@ export class LendMarketTemplate {
1676
1676
  }
1677
1677
  addCollateral(collateral_1) {
1678
1678
  return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
1679
- address = _getAddress(address);
1679
+ address = _getAddress.call(this.llamalend, address);
1680
1680
  yield this.addCollateralApprove(collateral);
1681
1681
  return yield this._addCollateral(collateral, address, false);
1682
1682
  });
@@ -1685,7 +1685,7 @@ export class LendMarketTemplate {
1685
1685
  maxRemovable() {
1686
1686
  return __awaiter(this, void 0, void 0, function* () {
1687
1687
  const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this._userState();
1688
- const _requiredCollateral = yield llamalend.contracts[this.addresses.controller].contract.min_collateral(_currentDebt, _N, llamalend.constantOptions);
1688
+ const _requiredCollateral = yield this.llamalend.contracts[this.addresses.controller].contract.min_collateral(_currentDebt, _N, this.llamalend.constantOptions);
1689
1689
  return formatUnits(_currentCollateral - _requiredCollateral, this.collateral_token.decimals);
1690
1690
  });
1691
1691
  }
@@ -1693,7 +1693,7 @@ export class LendMarketTemplate {
1693
1693
  return __awaiter(this, void 0, void 0, function* () {
1694
1694
  const { _collateral: _currentCollateral, _debt: _currentDebt, _N } = yield this._userState();
1695
1695
  if (_currentDebt === BigInt(0))
1696
- throw Error(`Loan for ${llamalend.signerAddress} does not exist`);
1696
+ throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
1697
1697
  const _collateral = _currentCollateral - parseUnits(collateral, this.collateral_token.decimals);
1698
1698
  const _n1 = yield this._calcN1(_collateral, _currentDebt, Number(_N));
1699
1699
  const _n2 = _n1 + _N - BigInt(1);
@@ -1714,10 +1714,10 @@ export class LendMarketTemplate {
1714
1714
  }
1715
1715
  removeCollateralHealth(collateral_1) {
1716
1716
  return __awaiter(this, arguments, void 0, function* (collateral, full = true, address = "") {
1717
- address = _getAddress(address);
1717
+ address = _getAddress.call(this.llamalend, address);
1718
1718
  const _collateral = parseUnits(collateral, this.collateral_token.decimals) * BigInt(-1);
1719
- const contract = llamalend.contracts[this.addresses.controller].contract;
1720
- let _health = yield contract.health_calculator(address, _collateral, 0, full, 0, llamalend.constantOptions);
1719
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1720
+ let _health = yield contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions);
1721
1721
  _health = _health * BigInt(100);
1722
1722
  return formatUnits(_health);
1723
1723
  });
@@ -1726,17 +1726,17 @@ export class LendMarketTemplate {
1726
1726
  return __awaiter(this, void 0, void 0, function* () {
1727
1727
  const { borrowed, debt: currentDebt } = yield this.userState();
1728
1728
  if (Number(currentDebt) === 0)
1729
- throw Error(`Loan for ${llamalend.signerAddress} does not exist`);
1729
+ throw Error(`Loan for ${this.llamalend.signerAddress} does not exist`);
1730
1730
  if (Number(borrowed) > 0)
1731
- throw Error(`User ${llamalend.signerAddress} is already in liquidation mode`);
1731
+ throw Error(`User ${this.llamalend.signerAddress} is already in liquidation mode`);
1732
1732
  const _collateral = parseUnits(collateral, this.collateral_token.decimals);
1733
- const contract = llamalend.contracts[this.addresses.controller].contract;
1734
- const gas = yield contract.remove_collateral.estimateGas(_collateral, llamalend.constantOptions);
1733
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1734
+ const gas = yield contract.remove_collateral.estimateGas(_collateral, this.llamalend.constantOptions);
1735
1735
  if (estimateGas)
1736
1736
  return smartNumber(gas);
1737
- yield llamalend.updateFeeData();
1737
+ yield this.llamalend.updateFeeData();
1738
1738
  const gasLimit = _mulBy1_3(DIGas(gas));
1739
- return (yield contract.remove_collateral(_collateral, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
1739
+ return (yield contract.remove_collateral(_collateral, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
1740
1740
  });
1741
1741
  }
1742
1742
  removeCollateralEstimateGas(collateral) {
@@ -1777,46 +1777,46 @@ export class LendMarketTemplate {
1777
1777
  }
1778
1778
  repayIsApproved(debt) {
1779
1779
  return __awaiter(this, void 0, void 0, function* () {
1780
- return yield hasAllowance([this.borrowed_token.address], [debt], llamalend.signerAddress, this.addresses.controller);
1780
+ return yield hasAllowance.call(this.llamalend, [this.borrowed_token.address], [debt], this.llamalend.signerAddress, this.addresses.controller);
1781
1781
  });
1782
1782
  }
1783
1783
  repayApproveEstimateGas(debt) {
1784
1784
  return __awaiter(this, void 0, void 0, function* () {
1785
- return yield ensureAllowanceEstimateGas([this.borrowed_token.address], [debt], this.addresses.controller);
1785
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.borrowed_token.address], [debt], this.addresses.controller);
1786
1786
  });
1787
1787
  }
1788
1788
  repayApprove(debt) {
1789
1789
  return __awaiter(this, void 0, void 0, function* () {
1790
- return yield ensureAllowance([this.borrowed_token.address], [debt], this.addresses.controller);
1790
+ return yield ensureAllowance.call(this.llamalend, [this.borrowed_token.address], [debt], this.addresses.controller);
1791
1791
  });
1792
1792
  }
1793
1793
  repayHealth(debt_1) {
1794
1794
  return __awaiter(this, arguments, void 0, function* (debt, full = true, address = "") {
1795
- address = _getAddress(address);
1795
+ address = _getAddress.call(this.llamalend, address);
1796
1796
  const _debt = parseUnits(debt) * BigInt(-1);
1797
- const contract = llamalend.contracts[this.addresses.controller].contract;
1798
- let _health = yield contract.health_calculator(address, 0, _debt, full, 0, llamalend.constantOptions);
1797
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1798
+ let _health = yield contract.health_calculator(address, 0, _debt, full, 0, this.llamalend.constantOptions);
1799
1799
  _health = _health * BigInt(100);
1800
1800
  return formatUnits(_health);
1801
1801
  });
1802
1802
  }
1803
1803
  _repay(debt, address, estimateGas) {
1804
1804
  return __awaiter(this, void 0, void 0, function* () {
1805
- address = _getAddress(address);
1805
+ address = _getAddress.call(this.llamalend, address);
1806
1806
  const { debt: currentDebt } = yield this.userState(address);
1807
1807
  if (Number(currentDebt) === 0)
1808
1808
  throw Error(`Loan for ${address} does not exist`);
1809
1809
  const _debt = parseUnits(debt);
1810
- const contract = llamalend.contracts[this.addresses.controller].contract;
1810
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
1811
1811
  const [, n1] = yield this.userBands(address);
1812
1812
  const { borrowed } = yield this.userState(address);
1813
1813
  const n = (BN(borrowed).gt(0)) ? MAX_ACTIVE_BAND : n1 - 1; // In liquidation mode it doesn't matter if active band moves
1814
- const gas = yield contract.repay.estimateGas(_debt, address, n, llamalend.constantOptions);
1814
+ const gas = yield contract.repay.estimateGas(_debt, address, n, this.llamalend.constantOptions);
1815
1815
  if (estimateGas)
1816
1816
  return smartNumber(gas);
1817
- yield llamalend.updateFeeData();
1817
+ yield this.llamalend.updateFeeData();
1818
1818
  const gasLimit = _mulBy1_3(DIGas(gas));
1819
- return (yield contract.repay(_debt, address, n, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
1819
+ return (yield contract.repay(_debt, address, n, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
1820
1820
  });
1821
1821
  }
1822
1822
  repayEstimateGas(debt_1) {
@@ -1835,35 +1835,35 @@ export class LendMarketTemplate {
1835
1835
  // ---------------- FULL REPAY ----------------
1836
1836
  _fullRepayAmount() {
1837
1837
  return __awaiter(this, arguments, void 0, function* (address = "") {
1838
- address = _getAddress(address);
1838
+ address = _getAddress.call(this.llamalend, address);
1839
1839
  const { debt } = yield this.userState(address);
1840
1840
  return BN(debt).times(1.0001).toString();
1841
1841
  });
1842
1842
  }
1843
1843
  fullRepayIsApproved() {
1844
1844
  return __awaiter(this, arguments, void 0, function* (address = "") {
1845
- address = _getAddress(address);
1845
+ address = _getAddress.call(this.llamalend, address);
1846
1846
  const fullRepayAmount = yield this._fullRepayAmount(address);
1847
1847
  return yield this.repayIsApproved(fullRepayAmount);
1848
1848
  });
1849
1849
  }
1850
1850
  fullRepayApproveEstimateGas() {
1851
1851
  return __awaiter(this, arguments, void 0, function* (address = "") {
1852
- address = _getAddress(address);
1852
+ address = _getAddress.call(this.llamalend, address);
1853
1853
  const fullRepayAmount = yield this._fullRepayAmount(address);
1854
1854
  return yield this.repayApproveEstimateGas(fullRepayAmount);
1855
1855
  });
1856
1856
  }
1857
1857
  fullRepayApprove() {
1858
1858
  return __awaiter(this, arguments, void 0, function* (address = "") {
1859
- address = _getAddress(address);
1859
+ address = _getAddress.call(this.llamalend, address);
1860
1860
  const fullRepayAmount = yield this._fullRepayAmount(address);
1861
1861
  return yield this.repayApprove(fullRepayAmount);
1862
1862
  });
1863
1863
  }
1864
1864
  fullRepayEstimateGas() {
1865
1865
  return __awaiter(this, arguments, void 0, function* (address = "") {
1866
- address = _getAddress(address);
1866
+ address = _getAddress.call(this.llamalend, address);
1867
1867
  const fullRepayAmount = yield this._fullRepayAmount(address);
1868
1868
  if (!(yield this.repayIsApproved(fullRepayAmount)))
1869
1869
  throw Error("Approval is needed for gas estimation");
@@ -1872,7 +1872,7 @@ export class LendMarketTemplate {
1872
1872
  }
1873
1873
  fullRepay() {
1874
1874
  return __awaiter(this, arguments, void 0, function* (address = "") {
1875
- address = _getAddress(address);
1875
+ address = _getAddress.call(this.llamalend, address);
1876
1876
  const fullRepayAmount = yield this._fullRepayAmount(address);
1877
1877
  yield this.repayApprove(fullRepayAmount);
1878
1878
  return yield this._repay(fullRepayAmount, address, false);
@@ -1884,8 +1884,8 @@ export class LendMarketTemplate {
1884
1884
  if (!(i === 0 && j === 1) && !(i === 1 && j === 0))
1885
1885
  throw Error("Wrong index");
1886
1886
  const inDecimals = this.coinDecimals[i];
1887
- const contract = llamalend.contracts[this.addresses.amm].contract;
1888
- const [_inAmount, _outAmount] = yield contract.get_dxdy(i, j, MAX_ALLOWANCE, llamalend.constantOptions);
1887
+ const contract = this.llamalend.contracts[this.addresses.amm].contract;
1888
+ const [_inAmount, _outAmount] = yield contract.get_dxdy(i, j, MAX_ALLOWANCE, this.llamalend.constantOptions);
1889
1889
  if (_outAmount === BigInt(0))
1890
1890
  return "0";
1891
1891
  return formatUnits(_inAmount, inDecimals);
@@ -1893,7 +1893,7 @@ export class LendMarketTemplate {
1893
1893
  }
1894
1894
  _swapExpected(i, j, _amount) {
1895
1895
  return __awaiter(this, void 0, void 0, function* () {
1896
- return yield llamalend.contracts[this.addresses.amm].contract.get_dy(i, j, _amount, llamalend.constantOptions);
1896
+ return yield this.llamalend.contracts[this.addresses.amm].contract.get_dy(i, j, _amount, this.llamalend.constantOptions);
1897
1897
  });
1898
1898
  }
1899
1899
  swapExpected(i, j, amount) {
@@ -1912,7 +1912,7 @@ export class LendMarketTemplate {
1912
1912
  throw Error("Wrong index");
1913
1913
  const [inDecimals, outDecimals] = this.coinDecimals;
1914
1914
  const _amount = parseUnits(outAmount, outDecimals);
1915
- const _expected = yield llamalend.contracts[this.addresses.amm].contract.get_dx(i, j, _amount, llamalend.constantOptions);
1915
+ const _expected = yield this.llamalend.contracts[this.addresses.amm].contract.get_dx(i, j, _amount, this.llamalend.constantOptions);
1916
1916
  return formatUnits(_expected, inDecimals);
1917
1917
  });
1918
1918
  }
@@ -1951,21 +1951,21 @@ export class LendMarketTemplate {
1951
1951
  return __awaiter(this, void 0, void 0, function* () {
1952
1952
  if (i !== 0 && i !== 1)
1953
1953
  throw Error("Wrong index");
1954
- return yield hasAllowance([this.coinAddresses[i]], [amount], llamalend.signerAddress, this.addresses.amm);
1954
+ return yield hasAllowance.call(this.llamalend, [this.coinAddresses[i]], [amount], this.llamalend.signerAddress, this.addresses.amm);
1955
1955
  });
1956
1956
  }
1957
1957
  swapApproveEstimateGas(i, amount) {
1958
1958
  return __awaiter(this, void 0, void 0, function* () {
1959
1959
  if (i !== 0 && i !== 1)
1960
1960
  throw Error("Wrong index");
1961
- return yield ensureAllowanceEstimateGas([this.coinAddresses[i]], [amount], this.addresses.amm);
1961
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.coinAddresses[i]], [amount], this.addresses.amm);
1962
1962
  });
1963
1963
  }
1964
1964
  swapApprove(i, amount) {
1965
1965
  return __awaiter(this, void 0, void 0, function* () {
1966
1966
  if (i !== 0 && i !== 1)
1967
1967
  throw Error("Wrong index");
1968
- return yield ensureAllowance([this.coinAddresses[i]], [amount], this.addresses.amm);
1968
+ return yield ensureAllowance.call(this.llamalend, [this.coinAddresses[i]], [amount], this.addresses.amm);
1969
1969
  });
1970
1970
  }
1971
1971
  _swap(i, j, amount, slippage, estimateGas) {
@@ -1977,13 +1977,13 @@ export class LendMarketTemplate {
1977
1977
  const _expected = yield this._swapExpected(i, j, _amount);
1978
1978
  const minRecvAmountBN = toBN(_expected, outDecimals).times(100 - slippage).div(100);
1979
1979
  const _minRecvAmount = fromBN(minRecvAmountBN, outDecimals);
1980
- const contract = llamalend.contracts[this.addresses.amm].contract;
1981
- const gas = yield contract.exchange.estimateGas(i, j, _amount, _minRecvAmount, llamalend.constantOptions);
1980
+ const contract = this.llamalend.contracts[this.addresses.amm].contract;
1981
+ const gas = yield contract.exchange.estimateGas(i, j, _amount, _minRecvAmount, this.llamalend.constantOptions);
1982
1982
  if (estimateGas)
1983
1983
  return smartNumber(gas);
1984
- yield llamalend.updateFeeData();
1984
+ yield this.llamalend.updateFeeData();
1985
1985
  const gasLimit = _mulBy1_3(DIGas(gas));
1986
- return (yield contract.exchange(i, j, _amount, _minRecvAmount, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
1986
+ return (yield contract.exchange(i, j, _amount, _minRecvAmount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
1987
1987
  });
1988
1988
  }
1989
1989
  swapEstimateGas(i_1, j_1, amount_1) {
@@ -2002,27 +2002,27 @@ export class LendMarketTemplate {
2002
2002
  // ---------------- LIQUIDATE ----------------
2003
2003
  tokensToLiquidate() {
2004
2004
  return __awaiter(this, arguments, void 0, function* (address = "") {
2005
- address = _getAddress(address);
2006
- const _tokens = yield llamalend.contracts[this.addresses.controller].contract.tokens_to_liquidate(address, llamalend.constantOptions);
2005
+ address = _getAddress.call(this.llamalend, address);
2006
+ const _tokens = yield this.llamalend.contracts[this.addresses.controller].contract.tokens_to_liquidate(address, this.llamalend.constantOptions);
2007
2007
  return formatUnits(_tokens, this.borrowed_token.decimals);
2008
2008
  });
2009
2009
  }
2010
2010
  liquidateIsApproved() {
2011
2011
  return __awaiter(this, arguments, void 0, function* (address = "") {
2012
2012
  const tokensToLiquidate = yield this.tokensToLiquidate(address);
2013
- return yield hasAllowance([this.addresses.borrowed_token], [tokensToLiquidate], llamalend.signerAddress, this.addresses.controller);
2013
+ return yield hasAllowance.call(this.llamalend, [this.addresses.borrowed_token], [tokensToLiquidate], this.llamalend.signerAddress, this.addresses.controller);
2014
2014
  });
2015
2015
  }
2016
2016
  liquidateApproveEstimateGas() {
2017
2017
  return __awaiter(this, arguments, void 0, function* (address = "") {
2018
2018
  const tokensToLiquidate = yield this.tokensToLiquidate(address);
2019
- return yield ensureAllowanceEstimateGas([this.addresses.borrowed_token], [tokensToLiquidate], this.addresses.controller);
2019
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.addresses.borrowed_token], [tokensToLiquidate], this.addresses.controller);
2020
2020
  });
2021
2021
  }
2022
2022
  liquidateApprove() {
2023
2023
  return __awaiter(this, arguments, void 0, function* (address = "") {
2024
2024
  const tokensToLiquidate = yield this.tokensToLiquidate(address);
2025
- return yield ensureAllowance([this.addresses.borrowed_token], [tokensToLiquidate], this.addresses.controller);
2025
+ return yield ensureAllowance.call(this.llamalend, [this.addresses.borrowed_token], [tokensToLiquidate], this.addresses.controller);
2026
2026
  });
2027
2027
  }
2028
2028
  _liquidate(address, slippage, estimateGas) {
@@ -2038,13 +2038,13 @@ export class LendMarketTemplate {
2038
2038
  throw Error(`User ${address} is not in liquidation mode`);
2039
2039
  const minAmountBN = BN(borrowed).times(100 - slippage).div(100);
2040
2040
  const _minAmount = fromBN(minAmountBN);
2041
- const contract = llamalend.contracts[this.addresses.controller].contract;
2042
- const gas = (yield contract.liquidate.estimateGas(address, _minAmount, llamalend.constantOptions));
2041
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
2042
+ const gas = (yield contract.liquidate.estimateGas(address, _minAmount, this.llamalend.constantOptions));
2043
2043
  if (estimateGas)
2044
2044
  return smartNumber(gas);
2045
- yield llamalend.updateFeeData();
2045
+ yield this.llamalend.updateFeeData();
2046
2046
  const gasLimit = _mulBy1_3(DIGas(gas));
2047
- return (yield contract.liquidate(address, _minAmount, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
2047
+ return (yield contract.liquidate(address, _minAmount, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
2048
2048
  });
2049
2049
  }
2050
2050
  liquidateEstimateGas(address_1) {
@@ -2080,13 +2080,13 @@ export class LendMarketTemplate {
2080
2080
  return __awaiter(this, arguments, void 0, function* (slippage = 0.1) {
2081
2081
  if (!(yield this.selfLiquidateIsApproved()))
2082
2082
  throw Error("Approval is needed for gas estimation");
2083
- return yield this._liquidate(llamalend.signerAddress, slippage, true);
2083
+ return yield this._liquidate(this.llamalend.signerAddress, slippage, true);
2084
2084
  });
2085
2085
  }
2086
2086
  selfLiquidate() {
2087
2087
  return __awaiter(this, arguments, void 0, function* (slippage = 0.1) {
2088
2088
  yield this.selfLiquidateApprove();
2089
- return yield this._liquidate(llamalend.signerAddress, slippage, false);
2089
+ return yield this._liquidate(this.llamalend.signerAddress, slippage, false);
2090
2090
  });
2091
2091
  }
2092
2092
  _checkLeverageZap() {
@@ -2130,7 +2130,7 @@ export class LendMarketTemplate {
2130
2130
  let maxBorrowableBN = BN(0);
2131
2131
  let _userEffectiveCollateral = BigInt(0);
2132
2132
  let _maxLeverageCollateral = BigInt(0);
2133
- const contract = llamalend.contracts[llamalend.constants.ALIASES.leverage_zap].contract;
2133
+ const contract = this.llamalend.contracts[this.llamalend.constants.ALIASES.leverage_zap].contract;
2134
2134
  for (let i = 0; i < 5; i++) {
2135
2135
  maxBorrowablePrevBN = maxBorrowableBN;
2136
2136
  _userEffectiveCollateral = _userCollateral + fromBN(BN(userBorrowed).div(pAvgBN), this.collateral_token.decimals);
@@ -2144,7 +2144,7 @@ export class LendMarketTemplate {
2144
2144
  break;
2145
2145
  }
2146
2146
  // additionalCollateral = (userBorrowed / p) + leverageCollateral
2147
- const _maxAdditionalCollateral = BigInt(yield _getExpectedOdos(this.addresses.borrowed_token, this.addresses.collateral_token, _maxBorrowable + _userBorrowed, this.addresses.amm));
2147
+ const _maxAdditionalCollateral = BigInt(yield _getExpectedOdos.call(this.llamalend, this.addresses.borrowed_token, this.addresses.collateral_token, _maxBorrowable + _userBorrowed, this.addresses.amm));
2148
2148
  pAvgBN = maxBorrowableBN.plus(userBorrowed).div(toBN(_maxAdditionalCollateral, this.collateral_token.decimals));
2149
2149
  _maxLeverageCollateral = _maxAdditionalCollateral - fromBN(BN(userBorrowed).div(pAvgBN), this.collateral_token.decimals);
2150
2150
  }
@@ -2271,7 +2271,7 @@ export class LendMarketTemplate {
2271
2271
  });
2272
2272
  }
2273
2273
  _leverageHealth(userCollateral_1, userBorrowed_1, dDebt_1, range_1, full_1) {
2274
- return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, dDebt, range, full, user = llamalend.constants.ZERO_ADDRESS) {
2274
+ return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, dDebt, range, full, user = this.llamalend.constants.ZERO_ADDRESS) {
2275
2275
  if (range > 0)
2276
2276
  this._checkRange(range);
2277
2277
  const { _totalCollateral } = yield this._leverageExpectedCollateral(userCollateral, userBorrowed, dDebt, user);
@@ -2279,10 +2279,10 @@ export class LendMarketTemplate {
2279
2279
  if (_borrowed > BigInt(0))
2280
2280
  throw Error(`User ${user} is already in liquidation mode`);
2281
2281
  if (range < 0)
2282
- range = Number(llamalend.formatUnits(_N, 0));
2282
+ range = Number(this.llamalend.formatUnits(_N, 0));
2283
2283
  const _dDebt = parseUnits(dDebt, this.borrowed_token.decimals);
2284
- const contract = llamalend.contracts[this.addresses.controller].contract;
2285
- let _health = yield contract.health_calculator(user, _totalCollateral, _dDebt, full, range, llamalend.constantOptions);
2284
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
2285
+ let _health = yield contract.health_calculator(user, _totalCollateral, _dDebt, full, range, this.llamalend.constantOptions);
2286
2286
  _health = _health * BigInt(100);
2287
2287
  return formatUnits(_health);
2288
2288
  });
@@ -2296,16 +2296,16 @@ export class LendMarketTemplate {
2296
2296
  leverageCreateLoanIsApproved(userCollateral, userBorrowed) {
2297
2297
  return __awaiter(this, void 0, void 0, function* () {
2298
2298
  this._checkLeverageZap();
2299
- const collateralAllowance = yield hasAllowance([this.collateral_token.address], [userCollateral], llamalend.signerAddress, this.addresses.controller);
2300
- const borrowedAllowance = yield hasAllowance([this.borrowed_token.address], [userBorrowed], llamalend.signerAddress, llamalend.constants.ALIASES.leverage_zap);
2299
+ const collateralAllowance = yield hasAllowance.call(this.llamalend, [this.collateral_token.address], [userCollateral], this.llamalend.signerAddress, this.addresses.controller);
2300
+ const borrowedAllowance = yield hasAllowance.call(this.llamalend, [this.borrowed_token.address], [userBorrowed], this.llamalend.signerAddress, this.llamalend.constants.ALIASES.leverage_zap);
2301
2301
  return collateralAllowance && borrowedAllowance;
2302
2302
  });
2303
2303
  }
2304
2304
  leverageCreateLoanApproveEstimateGas(userCollateral, userBorrowed) {
2305
2305
  return __awaiter(this, void 0, void 0, function* () {
2306
2306
  this._checkLeverageZap();
2307
- const collateralGas = yield ensureAllowanceEstimateGas([this.collateral_token.address], [userCollateral], this.addresses.controller);
2308
- const borrowedGas = yield ensureAllowanceEstimateGas([this.borrowed_token.address], [userBorrowed], llamalend.constants.ALIASES.leverage_zap);
2307
+ const collateralGas = yield ensureAllowanceEstimateGas.call(this.llamalend, [this.collateral_token.address], [userCollateral], this.addresses.controller);
2308
+ const borrowedGas = yield ensureAllowanceEstimateGas.call(this.llamalend, [this.borrowed_token.address], [userBorrowed], this.llamalend.constants.ALIASES.leverage_zap);
2309
2309
  if (Array.isArray(collateralGas) && Array.isArray(borrowedGas)) {
2310
2310
  return [collateralGas[0] + borrowedGas[0], collateralGas[1] + borrowedGas[1]];
2311
2311
  }
@@ -2317,8 +2317,8 @@ export class LendMarketTemplate {
2317
2317
  leverageCreateLoanApprove(userCollateral, userBorrowed) {
2318
2318
  return __awaiter(this, void 0, void 0, function* () {
2319
2319
  this._checkLeverageZap();
2320
- const collateralApproveTx = yield ensureAllowance([this.collateral_token.address], [userCollateral], this.addresses.controller);
2321
- const borrowedApproveTx = yield ensureAllowance([this.borrowed_token.address], [userBorrowed], llamalend.constants.ALIASES.leverage_zap);
2320
+ const collateralApproveTx = yield ensureAllowance.call(this.llamalend, [this.collateral_token.address], [userCollateral], this.addresses.controller);
2321
+ const borrowedApproveTx = yield ensureAllowance.call(this.llamalend, [this.borrowed_token.address], [userBorrowed], this.llamalend.constants.ALIASES.leverage_zap);
2322
2322
  return [...collateralApproveTx, ...borrowedApproveTx];
2323
2323
  });
2324
2324
  }
@@ -2341,14 +2341,14 @@ export class LendMarketTemplate {
2341
2341
  const swapData = this._getSwapDataFromCache(this.addresses.borrowed_token, _debt + _userBorrowed);
2342
2342
  if (slippage !== swapData.slippage)
2343
2343
  throw Error(`You must call leverage.createLoanExpectedCollateral() with slippage=${slippage} first`);
2344
- const calldata = yield _assembleTxOdos(swapData.pathId);
2345
- const contract = llamalend.contracts[this.addresses.controller].contract;
2346
- const gas = yield contract.create_loan_extended.estimateGas(_userCollateral, _debt, range, llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign({}, llamalend.constantOptions));
2344
+ const calldata = yield _assembleTxOdos.call(this.llamalend, swapData.pathId);
2345
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
2346
+ const gas = yield contract.create_loan_extended.estimateGas(_userCollateral, _debt, range, this.llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign({}, this.llamalend.constantOptions));
2347
2347
  if (estimateGas)
2348
2348
  return smartNumber(gas);
2349
- yield llamalend.updateFeeData();
2349
+ yield this.llamalend.updateFeeData();
2350
2350
  const gasLimit = _mulBy1_3(DIGas(gas));
2351
- return (yield contract.create_loan_extended(_userCollateral, _debt, range, llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
2351
+ return (yield contract.create_loan_extended(_userCollateral, _debt, range, this.llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
2352
2352
  });
2353
2353
  }
2354
2354
  leverageCreateLoanEstimateGas(userCollateral_1, userBorrowed_1, debt_1, range_1) {
@@ -2371,13 +2371,13 @@ export class LendMarketTemplate {
2371
2371
  return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, address = "") {
2372
2372
  // max_borrowable = userCollateral / (1 / (k_effective * max_p_base) - 1 / p_avg)
2373
2373
  this._checkLeverageZap();
2374
- address = _getAddress(address);
2374
+ address = _getAddress.call(this.llamalend, address);
2375
2375
  const { _collateral: _stateCollateral, _borrowed: _stateBorrowed, _debt: _stateDebt, _N } = yield this._userState(address);
2376
2376
  if (_stateBorrowed > BigInt(0))
2377
2377
  throw Error(`User ${address} is already in liquidation mode`);
2378
2378
  const _userCollateral = parseUnits(userCollateral, this.collateral_token.decimals);
2379
- const controllerContract = llamalend.contracts[this.addresses.controller].contract;
2380
- const _borrowedFromStateCollateral = (yield controllerContract.max_borrowable(_stateCollateral, _N, _stateDebt, llamalend.constantOptions)) - _stateDebt;
2379
+ const controllerContract = this.llamalend.contracts[this.addresses.controller].contract;
2380
+ const _borrowedFromStateCollateral = (yield controllerContract.max_borrowable(_stateCollateral, _N, _stateDebt, this.llamalend.constantOptions)) - _stateDebt;
2381
2381
  const _userBorrowed = _borrowedFromStateCollateral + parseUnits(userBorrowed, this.borrowed_token.decimals);
2382
2382
  userBorrowed = formatUnits(_userBorrowed, this.borrowed_token.decimals);
2383
2383
  const oraclePriceBand = yield this.oraclePriceBand();
@@ -2386,7 +2386,7 @@ export class LendMarketTemplate {
2386
2386
  let maxBorrowableBN = BN(0);
2387
2387
  let _userEffectiveCollateral = BigInt(0);
2388
2388
  let _maxLeverageCollateral = BigInt(0);
2389
- const contract = llamalend.contracts[llamalend.constants.ALIASES.leverage_zap].contract;
2389
+ const contract = this.llamalend.contracts[this.llamalend.constants.ALIASES.leverage_zap].contract;
2390
2390
  for (let i = 0; i < 5; i++) {
2391
2391
  maxBorrowablePrevBN = maxBorrowableBN;
2392
2392
  _userEffectiveCollateral = _userCollateral + fromBN(BN(userBorrowed).div(pAvgBN), this.collateral_token.decimals);
@@ -2400,14 +2400,14 @@ export class LendMarketTemplate {
2400
2400
  break;
2401
2401
  }
2402
2402
  // additionalCollateral = (userBorrowed / p) + leverageCollateral
2403
- const _maxAdditionalCollateral = BigInt(yield _getExpectedOdos(this.addresses.borrowed_token, this.addresses.collateral_token, _maxBorrowable + _userBorrowed, this.addresses.amm));
2403
+ const _maxAdditionalCollateral = BigInt(yield _getExpectedOdos.call(this.llamalend, this.addresses.borrowed_token, this.addresses.collateral_token, _maxBorrowable + _userBorrowed, this.addresses.amm));
2404
2404
  pAvgBN = maxBorrowableBN.plus(userBorrowed).div(toBN(_maxAdditionalCollateral, this.collateral_token.decimals));
2405
2405
  _maxLeverageCollateral = _maxAdditionalCollateral - fromBN(BN(userBorrowed).div(pAvgBN), this.collateral_token.decimals);
2406
2406
  }
2407
2407
  if (maxBorrowableBN.eq(0))
2408
2408
  _userEffectiveCollateral = BigInt(0);
2409
2409
  const _maxTotalCollateral = _userEffectiveCollateral + _maxLeverageCollateral;
2410
- let _maxBorrowable = (yield controllerContract.max_borrowable(_stateCollateral + _maxTotalCollateral, _N, _stateDebt, llamalend.constantOptions)) - _stateDebt;
2410
+ let _maxBorrowable = (yield controllerContract.max_borrowable(_stateCollateral + _maxTotalCollateral, _N, _stateDebt, this.llamalend.constantOptions)) - _stateDebt;
2411
2411
  _maxBorrowable = _maxBorrowable * BigInt(998) / BigInt(1000);
2412
2412
  return {
2413
2413
  maxDebt: formatUnits(_maxBorrowable, this.borrowed_token.decimals),
@@ -2422,7 +2422,7 @@ export class LendMarketTemplate {
2422
2422
  leverageBorrowMoreExpectedCollateral(userCollateral_1, userBorrowed_1, dDebt_1) {
2423
2423
  return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, dDebt, slippage = 0.1, address = "") {
2424
2424
  this._checkLeverageZap();
2425
- address = _getAddress(address);
2425
+ address = _getAddress.call(this.llamalend, address);
2426
2426
  const _dDebt = parseUnits(dDebt, this.borrowed_token.decimals);
2427
2427
  const _userBorrowed = parseUnits(userBorrowed, this.borrowed_token.decimals);
2428
2428
  yield this._setSwapDataToCache(this.addresses.borrowed_token, this.addresses.collateral_token, _dDebt + _userBorrowed, slippage);
@@ -2446,7 +2446,7 @@ export class LendMarketTemplate {
2446
2446
  }
2447
2447
  leverageBorrowMoreBands(userCollateral_1, userBorrowed_1, dDebt_1) {
2448
2448
  return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, dDebt, address = "") {
2449
- address = _getAddress(address);
2449
+ address = _getAddress.call(this.llamalend, address);
2450
2450
  this._checkLeverageZap();
2451
2451
  const [_n2, _n1] = yield this._leverageBands(userCollateral, userBorrowed, dDebt, -1, address);
2452
2452
  return [Number(_n2), Number(_n1)];
@@ -2454,7 +2454,7 @@ export class LendMarketTemplate {
2454
2454
  }
2455
2455
  leverageBorrowMorePrices(userCollateral_1, userBorrowed_1, dDebt_1) {
2456
2456
  return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, dDebt, address = "") {
2457
- address = _getAddress(address);
2457
+ address = _getAddress.call(this.llamalend, address);
2458
2458
  this._checkLeverageZap();
2459
2459
  const [_n2, _n1] = yield this._leverageBands(userCollateral, userBorrowed, dDebt, -1, address);
2460
2460
  return yield this._getPrices(_n2, _n1);
@@ -2463,7 +2463,7 @@ export class LendMarketTemplate {
2463
2463
  leverageBorrowMoreHealth(userCollateral_1, userBorrowed_1, dDebt_1) {
2464
2464
  return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, dDebt, full = true, address = "") {
2465
2465
  this._checkLeverageZap();
2466
- address = _getAddress(address);
2466
+ address = _getAddress.call(this.llamalend, address);
2467
2467
  return yield this._leverageHealth(userCollateral, userBorrowed, dDebt, -1, full, address);
2468
2468
  });
2469
2469
  }
@@ -2485,14 +2485,14 @@ export class LendMarketTemplate {
2485
2485
  const swapData = this._getSwapDataFromCache(this.addresses.borrowed_token, _debt + _userBorrowed);
2486
2486
  if (slippage !== swapData.slippage)
2487
2487
  throw Error(`You must call leverage.borrowMoreExpectedCollateral() with slippage=${slippage} first`);
2488
- const calldata = yield _assembleTxOdos(swapData.pathId);
2489
- const contract = llamalend.contracts[this.addresses.controller].contract;
2490
- const gas = yield contract.borrow_more_extended.estimateGas(_userCollateral, _debt, llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign({}, llamalend.constantOptions));
2488
+ const calldata = yield _assembleTxOdos.call(this.llamalend, swapData.pathId);
2489
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
2490
+ const gas = yield contract.borrow_more_extended.estimateGas(_userCollateral, _debt, this.llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign({}, this.llamalend.constantOptions));
2491
2491
  if (estimateGas)
2492
2492
  return smartNumber(gas);
2493
- yield llamalend.updateFeeData();
2493
+ yield this.llamalend.updateFeeData();
2494
2494
  const gasLimit = _mulBy1_3(DIGas(gas));
2495
- return (yield contract.borrow_more_extended(_userCollateral, _debt, llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
2495
+ return (yield contract.borrow_more_extended(_userCollateral, _debt, this.llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userBorrowed], calldata, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
2496
2496
  });
2497
2497
  }
2498
2498
  leverageBorrowMoreEstimateGas(userCollateral_1, userBorrowed_1, debt_1) {
@@ -2526,7 +2526,7 @@ export class LendMarketTemplate {
2526
2526
  leverageRepayIsFull(stateCollateral_1, userCollateral_1, userBorrowed_1) {
2527
2527
  return __awaiter(this, arguments, void 0, function* (stateCollateral, userCollateral, userBorrowed, address = "") {
2528
2528
  this._checkLeverageZap();
2529
- address = _getAddress(address);
2529
+ address = _getAddress.call(this.llamalend, address);
2530
2530
  const { _borrowed: _stateBorrowed, _debt } = yield this._userState(address);
2531
2531
  const { _totalBorrowed } = this._leverageRepayExpectedBorrowed(stateCollateral, userCollateral, userBorrowed);
2532
2532
  return _stateBorrowed + _totalBorrowed > _debt;
@@ -2539,7 +2539,7 @@ export class LendMarketTemplate {
2539
2539
  // 2. If user is underwater (stablecoin > 0), only full repayment is available:
2540
2540
  // await this.deleverageRepayStablecoins(deleverageCollateral) + stablecoin > debt
2541
2541
  this._checkLeverageZap();
2542
- address = _getAddress(address);
2542
+ address = _getAddress.call(this.llamalend, address);
2543
2543
  const { collateral, borrowed, debt } = yield this.userState(address);
2544
2544
  // Loan does not exist
2545
2545
  if (BN(debt).eq(0))
@@ -2570,7 +2570,7 @@ export class LendMarketTemplate {
2570
2570
  leverageRepayHealth(stateCollateral_1, userCollateral_1, userBorrowed_1) {
2571
2571
  return __awaiter(this, arguments, void 0, function* (stateCollateral, userCollateral, userBorrowed, full = true, address = "") {
2572
2572
  this._checkLeverageZap();
2573
- address = _getAddress(address);
2573
+ address = _getAddress.call(this.llamalend, address);
2574
2574
  const { _borrowed: _stateBorrowed, _debt, _N } = yield this._userState(address);
2575
2575
  if (_stateBorrowed > BigInt(0))
2576
2576
  return "0.0";
@@ -2581,28 +2581,28 @@ export class LendMarketTemplate {
2581
2581
  const _dDebt = _totalBorrowed * BigInt(-1);
2582
2582
  if (_debt + _dDebt <= BigInt(0))
2583
2583
  return "0.0";
2584
- const contract = llamalend.contracts[this.addresses.controller].contract;
2585
- let _health = yield contract.health_calculator(address, _dCollateral, _dDebt, full, _N, llamalend.constantOptions);
2584
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
2585
+ let _health = yield contract.health_calculator(address, _dCollateral, _dDebt, full, _N, this.llamalend.constantOptions);
2586
2586
  _health = _health * BigInt(100);
2587
- return llamalend.formatUnits(_health);
2587
+ return this.llamalend.formatUnits(_health);
2588
2588
  });
2589
2589
  }
2590
2590
  leverageRepayIsApproved(userCollateral, userBorrowed) {
2591
2591
  return __awaiter(this, void 0, void 0, function* () {
2592
2592
  this._checkLeverageZap();
2593
- return yield hasAllowance([this.collateral_token.address, this.borrowed_token.address], [userCollateral, userBorrowed], llamalend.signerAddress, llamalend.constants.ALIASES.leverage_zap);
2593
+ return yield hasAllowance.call(this.llamalend, [this.collateral_token.address, this.borrowed_token.address], [userCollateral, userBorrowed], this.llamalend.signerAddress, this.llamalend.constants.ALIASES.leverage_zap);
2594
2594
  });
2595
2595
  }
2596
2596
  leverageRepayApproveEstimateGas(userCollateral, userBorrowed) {
2597
2597
  return __awaiter(this, void 0, void 0, function* () {
2598
2598
  this._checkLeverageZap();
2599
- return yield ensureAllowanceEstimateGas([this.collateral_token.address, this.borrowed_token.address], [userCollateral, userBorrowed], llamalend.constants.ALIASES.leverage_zap);
2599
+ return yield ensureAllowanceEstimateGas.call(this.llamalend, [this.collateral_token.address, this.borrowed_token.address], [userCollateral, userBorrowed], this.llamalend.constants.ALIASES.leverage_zap);
2600
2600
  });
2601
2601
  }
2602
2602
  leverageRepayApprove(userCollateral, userBorrowed) {
2603
2603
  return __awaiter(this, void 0, void 0, function* () {
2604
2604
  this._checkLeverageZap();
2605
- return yield ensureAllowance([this.collateral_token.address, this.borrowed_token.address], [userCollateral, userBorrowed], llamalend.constants.ALIASES.leverage_zap);
2605
+ return yield ensureAllowance.call(this.llamalend, [this.collateral_token.address, this.borrowed_token.address], [userCollateral, userBorrowed], this.llamalend.constants.ALIASES.leverage_zap);
2606
2606
  });
2607
2607
  }
2608
2608
  leverageRepayRouteImage(stateCollateral, userCollateral) {
@@ -2625,16 +2625,16 @@ export class LendMarketTemplate {
2625
2625
  const swapData = this._getSwapDataFromCache(this.addresses.collateral_token, _stateCollateral + _userCollateral);
2626
2626
  if (slippage !== swapData.slippage)
2627
2627
  throw Error(`You must call leverage.repayExpectedBorrowed() with slippage=${slippage} first`);
2628
- calldata = yield _assembleTxOdos(swapData.pathId);
2628
+ calldata = yield _assembleTxOdos.call(this.llamalend, swapData.pathId);
2629
2629
  }
2630
2630
  console.log('params', [0, parseUnits(this._getMarketId(), 0), _userCollateral, _userBorrowed], calldata);
2631
- const contract = llamalend.contracts[this.addresses.controller].contract;
2632
- const gas = yield contract.repay_extended.estimateGas(llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userCollateral, _userBorrowed], calldata);
2631
+ const contract = this.llamalend.contracts[this.addresses.controller].contract;
2632
+ const gas = yield contract.repay_extended.estimateGas(this.llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userCollateral, _userBorrowed], calldata);
2633
2633
  if (estimateGas)
2634
2634
  return smartNumber(gas);
2635
- yield llamalend.updateFeeData();
2635
+ yield this.llamalend.updateFeeData();
2636
2636
  const gasLimit = _mulBy1_3(DIGas(gas));
2637
- return (yield contract.repay_extended(llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userCollateral, _userBorrowed], calldata, Object.assign(Object.assign({}, llamalend.options), { gasLimit }))).hash;
2637
+ return (yield contract.repay_extended(this.llamalend.constants.ALIASES.leverage_zap, [0, parseUnits(this._getMarketId(), 0), _userCollateral, _userBorrowed], calldata, Object.assign(Object.assign({}, this.llamalend.options), { gasLimit }))).hash;
2638
2638
  });
2639
2639
  }
2640
2640
  leverageRepayEstimateGas(stateCollateral_1, userCollateral_1, userBorrowed_1) {
@@ -2654,9 +2654,9 @@ export class LendMarketTemplate {
2654
2654
  }
2655
2655
  currentLeverage() {
2656
2656
  return __awaiter(this, arguments, void 0, function* (userAddress = '') {
2657
- userAddress = _getAddress(userAddress);
2657
+ userAddress = _getAddress.call(this.llamalend, userAddress);
2658
2658
  const [userCollateral, { collateral }] = yield Promise.all([
2659
- _getUserCollateral(llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
2659
+ _getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
2660
2660
  this.userState(userAddress),
2661
2661
  ]);
2662
2662
  const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
@@ -2665,24 +2665,24 @@ export class LendMarketTemplate {
2665
2665
  }
2666
2666
  currentPnL() {
2667
2667
  return __awaiter(this, arguments, void 0, function* (userAddress = '') {
2668
- userAddress = _getAddress(userAddress);
2668
+ userAddress = _getAddress.call(this.llamalend, userAddress);
2669
2669
  const calls = [
2670
- llamalend.contracts[this.addresses.controller].multicallContract.user_state(userAddress, llamalend.constantOptions),
2671
- llamalend.contracts[this.addresses.amm].multicallContract.price_oracle(userAddress),
2670
+ this.llamalend.contracts[this.addresses.controller].multicallContract.user_state(userAddress, this.llamalend.constantOptions),
2671
+ this.llamalend.contracts[this.addresses.amm].multicallContract.price_oracle(userAddress),
2672
2672
  ];
2673
- const [userState, oraclePrice] = yield llamalend.multicallProvider.all(calls);
2673
+ const [userState, oraclePrice] = yield this.llamalend.multicallProvider.all(calls);
2674
2674
  if (!(userState || oraclePrice)) {
2675
2675
  throw new Error('Multicall error');
2676
2676
  }
2677
2677
  const debt = userState[2];
2678
- const userCollateral = yield _getUserCollateral(llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress);
2678
+ const userCollateral = yield _getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress);
2679
2679
  const totalDepositUsdValueFull = userCollateral.total_deposit_usd_value;
2680
2680
  const totalDepositUsdValueUser = userCollateral.total_deposit_from_user_usd_value;
2681
2681
  const totalBorrowed = userCollateral.total_borrowed;
2682
- const oraclePriceFormatted = llamalend.formatUnits(oraclePrice, 18);
2683
- const debtFormatted = llamalend.formatUnits(debt, 18);
2682
+ const oraclePriceFormatted = this.llamalend.formatUnits(oraclePrice, 18);
2683
+ const debtFormatted = this.llamalend.formatUnits(debt, 18);
2684
2684
  const { _collateral: AmmCollateral, _borrowed: AmmBorrowed } = yield this._userState(userAddress);
2685
- const [AmmCollateralFormatted, AmmBorrowedFormatted] = [llamalend.formatUnits(AmmCollateral, this.collateral_token.decimals), llamalend.formatUnits(AmmBorrowed, this.borrowed_token.decimals)];
2685
+ const [AmmCollateralFormatted, AmmBorrowedFormatted] = [this.llamalend.formatUnits(AmmCollateral, this.collateral_token.decimals), this.llamalend.formatUnits(AmmBorrowed, this.borrowed_token.decimals)];
2686
2686
  const a = BN(AmmCollateralFormatted).times(oraclePriceFormatted);
2687
2687
  const b = BN(totalBorrowed).minus(debtFormatted);
2688
2688
  const currentPosition = a.plus(AmmBorrowedFormatted).plus(b);