@curvefi/llamalend-api 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.eslintrc.json +40 -0
  2. package/.github/workflows/lint.yml +15 -0
  3. package/.github/workflows/publish.yml +55 -0
  4. package/LICENSE +21 -0
  5. package/README.md +1976 -0
  6. package/lib/cache/index.d.ts +14 -0
  7. package/lib/cache/index.js +31 -0
  8. package/lib/constants/L2Networks.d.ts +1 -0
  9. package/lib/constants/L2Networks.js +1 -0
  10. package/lib/constants/abis/Controller.json +1027 -0
  11. package/lib/constants/abis/ERC20.json +222 -0
  12. package/lib/constants/abis/ERC4626.json +1674 -0
  13. package/lib/constants/abis/GaugeController.json +794 -0
  14. package/lib/constants/abis/GaugeFactoryMainnet.json +1 -0
  15. package/lib/constants/abis/GaugeFactorySidechain.json +475 -0
  16. package/lib/constants/abis/GaugeV5.json +958 -0
  17. package/lib/constants/abis/LeverageZap.json +35 -0
  18. package/lib/constants/abis/Llamma.json +984 -0
  19. package/lib/constants/abis/Minter.json +1 -0
  20. package/lib/constants/abis/MonetaryPolicy.json +221 -0
  21. package/lib/constants/abis/OneWayLendingFactoryABI.json +899 -0
  22. package/lib/constants/abis/SidechainGauge.json +939 -0
  23. package/lib/constants/abis/Vault.json +721 -0
  24. package/lib/constants/abis/crvUSD/DeleverageZap.json +248 -0
  25. package/lib/constants/abis/crvUSD/Factory.json +514 -0
  26. package/lib/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
  27. package/lib/constants/abis/crvUSD/LeverageZap.json +312 -0
  28. package/lib/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
  29. package/lib/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
  30. package/lib/constants/abis/crvUSD/PegKeeper.json +411 -0
  31. package/lib/constants/abis/crvUSD/controller.json +991 -0
  32. package/lib/constants/abis/crvUSD/llamma.json +984 -0
  33. package/lib/constants/abis/gas_oracle_optimism.json +149 -0
  34. package/lib/constants/abis/gas_oracle_optimism_blob.json +203 -0
  35. package/lib/constants/aliases.d.ts +16 -0
  36. package/lib/constants/aliases.js +124 -0
  37. package/lib/constants/coins.d.ts +16 -0
  38. package/lib/constants/coins.js +24 -0
  39. package/lib/constants/llammas.d.ts +2 -0
  40. package/lib/constants/llammas.js +96 -0
  41. package/lib/constants/utils.d.ts +4 -0
  42. package/lib/constants/utils.js +27 -0
  43. package/lib/external-api.d.ts +13 -0
  44. package/lib/external-api.js +436 -0
  45. package/lib/index.d.ts +104 -0
  46. package/lib/index.js +123 -0
  47. package/lib/interfaces.d.ts +228 -0
  48. package/lib/interfaces.js +1 -0
  49. package/lib/lendMarkets/LendMarketTemplate.d.ts +510 -0
  50. package/lib/lendMarkets/LendMarketTemplate.js +4682 -0
  51. package/lib/lendMarkets/index.d.ts +3 -0
  52. package/lib/lendMarkets/index.js +3 -0
  53. package/lib/lendMarkets/lendMarketConstructor.d.ts +2 -0
  54. package/lib/lendMarkets/lendMarketConstructor.js +6 -0
  55. package/lib/llamalend.d.ts +80 -0
  56. package/lib/llamalend.js +878 -0
  57. package/lib/mintMarkets/MintMarketTemplate.d.ts +308 -0
  58. package/lib/mintMarkets/MintMarketTemplate.js +2998 -0
  59. package/lib/mintMarkets/index.d.ts +3 -0
  60. package/lib/mintMarkets/index.js +3 -0
  61. package/lib/mintMarkets/mintMarketConstructor.d.ts +2 -0
  62. package/lib/mintMarkets/mintMarketConstructor.js +4 -0
  63. package/lib/st-crvUSD.d.ts +35 -0
  64. package/lib/st-crvUSD.js +505 -0
  65. package/lib/utils.d.ts +58 -0
  66. package/lib/utils.js +661 -0
  67. package/package.json +42 -0
  68. package/src/cache/index.ts +41 -0
  69. package/src/constants/L2Networks.ts +1 -0
  70. package/src/constants/abis/Controller.json +1027 -0
  71. package/src/constants/abis/ERC20.json +222 -0
  72. package/src/constants/abis/ERC4626.json +1674 -0
  73. package/src/constants/abis/GaugeController.json +794 -0
  74. package/src/constants/abis/GaugeFactoryMainnet.json +1 -0
  75. package/src/constants/abis/GaugeFactorySidechain.json +475 -0
  76. package/src/constants/abis/GaugeV5.json +958 -0
  77. package/src/constants/abis/LeverageZap.json +35 -0
  78. package/src/constants/abis/Llamma.json +984 -0
  79. package/src/constants/abis/Minter.json +1 -0
  80. package/src/constants/abis/MonetaryPolicy.json +221 -0
  81. package/src/constants/abis/OneWayLendingFactoryABI.json +899 -0
  82. package/src/constants/abis/SidechainGauge.json +939 -0
  83. package/src/constants/abis/Vault.json +721 -0
  84. package/src/constants/abis/crvUSD/DeleverageZap.json +248 -0
  85. package/src/constants/abis/crvUSD/ERC20.json +222 -0
  86. package/src/constants/abis/crvUSD/Factory.json +514 -0
  87. package/src/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
  88. package/src/constants/abis/crvUSD/LeverageZap.json +312 -0
  89. package/src/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
  90. package/src/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
  91. package/src/constants/abis/crvUSD/PegKeeper.json +411 -0
  92. package/src/constants/abis/crvUSD/controller.json +991 -0
  93. package/src/constants/abis/crvUSD/llamma.json +984 -0
  94. package/src/constants/abis/gas_oracle_optimism.json +149 -0
  95. package/src/constants/abis/gas_oracle_optimism_blob.json +203 -0
  96. package/src/constants/aliases.ts +141 -0
  97. package/src/constants/coins.ts +41 -0
  98. package/src/constants/llammas.ts +99 -0
  99. package/src/constants/utils.ts +33 -0
  100. package/src/external-api.ts +325 -0
  101. package/src/index.ts +128 -0
  102. package/src/interfaces.ts +237 -0
  103. package/src/lendMarkets/LendMarketTemplate.ts +3022 -0
  104. package/src/lendMarkets/index.ts +7 -0
  105. package/src/lendMarkets/lendMarketConstructor.ts +7 -0
  106. package/src/llamalend.ts +785 -0
  107. package/src/mintMarkets/MintMarketTemplate.ts +1781 -0
  108. package/src/mintMarkets/index.ts +7 -0
  109. package/src/mintMarkets/mintMarketConstructor.ts +5 -0
  110. package/src/st-crvUSD.ts +244 -0
  111. package/src/utils.ts +497 -0
  112. package/test/fetch.test.ts +152 -0
  113. package/test/general.test.ts +216 -0
  114. package/test/leverageBorrowMore.test.ts +245 -0
  115. package/test/leverageCreateLoan.test.ts +236 -0
  116. package/test/leverageRepay.test.ts +240 -0
  117. package/test/readme.test.ts +475 -0
  118. package/test/selfLiquidate.test.ts +57 -0
  119. package/test/selfLiquidateCrvUSD.test.ts +54 -0
  120. package/test/st_crvUSD.test.ts +68 -0
  121. package/test/swap.test.ts +62 -0
  122. package/test/swapCrvUSD.test.ts +56 -0
  123. package/test/vault.test.ts +112 -0
  124. package/tsconfig.build.json +10 -0
  125. package/tsconfig.json +72 -0
@@ -0,0 +1,878 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
+ if (ar || !(i in from)) {
51
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
+ ar[i] = from[i];
53
+ }
54
+ }
55
+ return to.concat(ar || Array.prototype.slice.call(from));
56
+ };
57
+ import { ethers, Contract, AbstractProvider } from "ethers";
58
+ import { Provider as MulticallProvider, Contract as MulticallContract } from '@curvefi/ethcall';
59
+ // OneWayMarket ABIs
60
+ import OneWayLendingFactoryABI from "./constants/abis/OneWayLendingFactoryABI.json" assert { type: 'json' };
61
+ import ERC20ABI from './constants/abis/ERC20.json' assert { type: 'json' };
62
+ import ERC4626ABI from './constants/abis/ERC4626.json' assert { type: 'json' };
63
+ import LlammaABI from './constants/abis/Llamma.json' assert { type: 'json' };
64
+ import ControllerABI from './constants/abis/Controller.json' assert { type: 'json' };
65
+ import MonetaryPolicyABI from './constants/abis/MonetaryPolicy.json' assert { type: 'json' };
66
+ import VaultABI from './constants/abis/Vault.json' assert { type: 'json' };
67
+ import GaugeABI from './constants/abis/GaugeV5.json' assert { type: 'json' };
68
+ import SidechainGaugeABI from './constants/abis/SidechainGauge.json' assert { type: 'json' };
69
+ import GaugeControllerABI from './constants/abis/GaugeController.json' assert { type: 'json' };
70
+ import GaugeFactoryMainnetABI from './constants/abis/GaugeFactoryMainnet.json' assert { type: 'json' };
71
+ import GaugeFactorySidechainABI from './constants/abis/GaugeFactorySidechain.json' assert { type: 'json' };
72
+ import MinterABI from './constants/abis/Minter.json' assert { type: 'json' };
73
+ import LeverageZapABI from './constants/abis/LeverageZap.json' assert { type: 'json' };
74
+ import gasOracleABI from './constants/abis/gas_oracle_optimism.json' assert { type: 'json' };
75
+ import gasOracleBlobABI from './constants/abis/gas_oracle_optimism_blob.json' assert { type: 'json' };
76
+ // crvUSD ABIs
77
+ import llammaABI from "./constants/abis/crvUSD/llamma.json" assert { type: 'json' };
78
+ import controllerABI from "./constants/abis/crvUSD/controller.json" assert { type: 'json' };
79
+ import PegKeeper from "./constants/abis/crvUSD/PegKeeper.json" assert { type: 'json' };
80
+ import FactoryABI from "./constants/abis/crvUSD/Factory.json" assert { type: 'json' };
81
+ import MonetaryPolicy2ABI from "./constants/abis/crvUSD/MonetaryPolicy2.json" assert { type: 'json' };
82
+ import HealthCalculatorZapABI from "./constants/abis/crvUSD/HealthCalculatorZap.json" assert { type: 'json' };
83
+ import LeverageZapCrvUSDABI from "./constants/abis/crvUSD/LeverageZap.json" assert { type: 'json' };
84
+ import DeleverageZapABI from "./constants/abis/crvUSD/DeleverageZap.json" assert { type: 'json' };
85
+ import { ALIASES_ETHEREUM, ALIASES_OPTIMISM, ALIASES_POLYGON, ALIASES_FANTOM, ALIASES_AVALANCHE, ALIASES_ARBITRUM, ALIASES_XDAI, ALIASES_MOONBEAM, ALIASES_AURORA, ALIASES_KAVA, ALIASES_CELO, ALIASES_ZKSYNC, ALIASES_BASE, ALIASES_BSC, ALIASES_FRAXTAL, ALIASES_SONIC, } from "./constants/aliases.js";
86
+ import { COINS_ETHEREUM, COINS_OPTIMISM, COINS_POLYGON, COINS_FANTOM, COINS_AVALANCHE, COINS_ARBITRUM, COINS_XDAI, COINS_MOONBEAM, COINS_AURORA, COINS_KAVA, COINS_CELO, COINS_ZKSYNC, COINS_BASE, COINS_BSC, COINS_FRAXTAL, COINS_SONIC, } from "./constants/coins.js";
87
+ import { LLAMMAS } from "./constants/llammas";
88
+ import { L2Networks } from "./constants/L2Networks.js";
89
+ import { createCall, handleMultiCallResponse } from "./utils.js";
90
+ import { cacheKey, cacheStats } from "./cache/index.js";
91
+ import { _getMarketsData } from "./external-api.js";
92
+ import { extractDecimals } from "./constants/utils.js";
93
+ export var NETWORK_CONSTANTS = {
94
+ 1: {
95
+ NAME: 'ethereum',
96
+ ALIASES: ALIASES_ETHEREUM,
97
+ COINS: COINS_ETHEREUM,
98
+ EXCLUDED_PROTOCOLS_1INCH: "CURVE_V2_LLAMMA",
99
+ },
100
+ 10: {
101
+ NAME: 'optimism',
102
+ ALIASES: ALIASES_OPTIMISM,
103
+ COINS: COINS_OPTIMISM,
104
+ },
105
+ 56: {
106
+ NAME: 'bsc',
107
+ ALIASES: ALIASES_BSC,
108
+ COINS: COINS_BSC,
109
+ },
110
+ 100: {
111
+ NAME: 'xdai',
112
+ ALIASES: ALIASES_XDAI,
113
+ COINS: COINS_XDAI,
114
+ },
115
+ 137: {
116
+ NAME: 'polygon',
117
+ ALIASES: ALIASES_POLYGON,
118
+ COINS: COINS_POLYGON,
119
+ },
120
+ 146: {
121
+ NAME: 'sonic',
122
+ ALIASES: ALIASES_SONIC,
123
+ COINS: COINS_SONIC,
124
+ },
125
+ 250: {
126
+ NAME: 'fantom',
127
+ ALIASES: ALIASES_FANTOM,
128
+ COINS: COINS_FANTOM,
129
+ },
130
+ 252: {
131
+ NAME: 'fraxtal',
132
+ ALIASES: ALIASES_FRAXTAL,
133
+ COINS: COINS_FRAXTAL,
134
+ },
135
+ 324: {
136
+ NAME: 'zksync',
137
+ ALIASES: ALIASES_ZKSYNC,
138
+ COINS: COINS_ZKSYNC,
139
+ },
140
+ 1284: {
141
+ NAME: 'moonbeam',
142
+ ALIASES: ALIASES_MOONBEAM,
143
+ COINS: COINS_MOONBEAM,
144
+ },
145
+ 2222: {
146
+ NAME: 'kava',
147
+ ALIASES: ALIASES_KAVA,
148
+ COINS: COINS_KAVA,
149
+ },
150
+ 8453: {
151
+ NAME: 'base',
152
+ ALIASES: ALIASES_BASE,
153
+ COINS: COINS_BASE,
154
+ },
155
+ 42161: {
156
+ NAME: 'arbitrum',
157
+ ALIASES: ALIASES_ARBITRUM,
158
+ COINS: COINS_ARBITRUM,
159
+ EXCLUDED_PROTOCOLS_1INCH: "",
160
+ },
161
+ 42220: {
162
+ NAME: 'celo',
163
+ ALIASES: ALIASES_CELO,
164
+ COINS: COINS_CELO,
165
+ },
166
+ 43114: {
167
+ NAME: 'avalanche',
168
+ ALIASES: ALIASES_AVALANCHE,
169
+ COINS: COINS_AVALANCHE,
170
+ },
171
+ 1313161554: {
172
+ NAME: 'aurora',
173
+ ALIASES: ALIASES_AURORA,
174
+ COINS: COINS_AURORA,
175
+ },
176
+ };
177
+ var Llamalend = /** @class */ (function () {
178
+ function Llamalend() {
179
+ var _this = this;
180
+ this.getLendMarketList = function () { return Object.keys(_this.constants.ONE_WAY_MARKETS); };
181
+ this.getMintMarketList = function () { return Object.keys(_this.constants.LLAMMAS); };
182
+ this.getFactoryMarketData = function () { return __awaiter(_this, void 0, void 0, function () {
183
+ var factory, factoryContract, markets_count, callsMap, calls, _loop_1, i, res;
184
+ return __generator(this, function (_a) {
185
+ switch (_a.label) {
186
+ case 0:
187
+ factory = this.contracts[this.constants.ALIASES['one_way_factory']];
188
+ factoryContract = this.contracts[this.constants.ALIASES['one_way_factory']].contract;
189
+ return [4 /*yield*/, factoryContract.market_count()];
190
+ case 1:
191
+ markets_count = _a.sent();
192
+ callsMap = ['names', 'amms', 'controllers', 'borrowed_tokens', 'collateral_tokens', 'monetary_policies', 'vaults', 'gauges'];
193
+ calls = [];
194
+ _loop_1 = function (i) {
195
+ callsMap.forEach(function (item) {
196
+ calls.push(createCall(factory, item, [i]));
197
+ });
198
+ };
199
+ for (i = 0; i < markets_count; i++) {
200
+ _loop_1(i);
201
+ }
202
+ return [4 /*yield*/, this.multicallProvider.all(calls)];
203
+ case 2:
204
+ res = (_a.sent()).map(function (addr) { return addr.toLowerCase(); });
205
+ return [2 /*return*/, handleMultiCallResponse(callsMap, res)];
206
+ }
207
+ });
208
+ }); };
209
+ this.getFactoryMarketDataByAPI = function () { return __awaiter(_this, void 0, void 0, function () {
210
+ var apiData, result;
211
+ var _this = this;
212
+ return __generator(this, function (_a) {
213
+ switch (_a.label) {
214
+ case 0: return [4 /*yield*/, _getMarketsData(this.constants.NETWORK_NAME)];
215
+ case 1:
216
+ apiData = (_a.sent()).lendingVaultData;
217
+ result = {
218
+ names: [],
219
+ amms: [],
220
+ controllers: [],
221
+ borrowed_tokens: [],
222
+ collateral_tokens: [],
223
+ monetary_policies: [],
224
+ vaults: [],
225
+ gauges: [],
226
+ };
227
+ apiData.forEach(function (market) {
228
+ var _a;
229
+ result.names.push(market.name);
230
+ result.amms.push(market.ammAddress.toLowerCase());
231
+ result.controllers.push(market.controllerAddress.toLowerCase());
232
+ result.borrowed_tokens.push(market.assets.borrowed.address.toLowerCase());
233
+ result.collateral_tokens.push(market.assets.collateral.address.toLowerCase());
234
+ result.monetary_policies.push(market.monetaryPolicyAddress.toLowerCase());
235
+ result.vaults.push(market.address.toLowerCase());
236
+ result.gauges.push(((_a = market.gaugeAddress) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || _this.constants.ZERO_ADDRESS);
237
+ });
238
+ return [2 /*return*/, result];
239
+ }
240
+ });
241
+ }); };
242
+ this.getCoins = function (collateral_tokens, borrowed_tokens, useApi) {
243
+ if (useApi === void 0) { useApi = false; }
244
+ return __awaiter(_this, void 0, void 0, function () {
245
+ var coins, COINS_DATA, apiData, calls_1, callsMap_1, res, _a, name_1, decimals_1, symbol_1;
246
+ var _this = this;
247
+ return __generator(this, function (_b) {
248
+ switch (_b.label) {
249
+ case 0:
250
+ coins = new Set(__spreadArray(__spreadArray([], collateral_tokens, true), borrowed_tokens, true));
251
+ COINS_DATA = {};
252
+ if (!useApi) return [3 /*break*/, 2];
253
+ return [4 /*yield*/, _getMarketsData(this.constants.NETWORK_NAME)];
254
+ case 1:
255
+ apiData = (_b.sent()).lendingVaultData;
256
+ apiData.forEach(function (market) {
257
+ var borrowedCoin = market.assets.borrowed;
258
+ var collateralCoin = market.assets.collateral;
259
+ if (coins.has(borrowedCoin.address)) {
260
+ _this.setContract(borrowedCoin.address, ERC20ABI);
261
+ COINS_DATA[borrowedCoin.address] = {
262
+ address: borrowedCoin.address,
263
+ decimals: borrowedCoin.decimals,
264
+ name: borrowedCoin.symbol,
265
+ symbol: borrowedCoin.symbol,
266
+ };
267
+ }
268
+ if (coins.has(collateralCoin.address)) {
269
+ _this.setContract(collateralCoin.address, ERC20ABI);
270
+ COINS_DATA[collateralCoin.address] = {
271
+ address: collateralCoin.address,
272
+ decimals: collateralCoin.decimals,
273
+ name: collateralCoin.symbol,
274
+ symbol: collateralCoin.symbol,
275
+ };
276
+ }
277
+ });
278
+ return [3 /*break*/, 4];
279
+ case 2:
280
+ calls_1 = [];
281
+ callsMap_1 = ['name', 'decimals', 'symbol'];
282
+ coins.forEach(function (coin) {
283
+ _this.setContract(coin, ERC20ABI);
284
+ callsMap_1.forEach(function (item) {
285
+ calls_1.push(createCall(_this.contracts[coin], item, []));
286
+ });
287
+ });
288
+ return [4 /*yield*/, this.multicallProvider.all(calls_1)];
289
+ case 3:
290
+ res = _b.sent();
291
+ _a = handleMultiCallResponse(callsMap_1, res), name_1 = _a.name, decimals_1 = _a.decimals, symbol_1 = _a.symbol;
292
+ Array.from(coins).forEach(function (coin, index) {
293
+ COINS_DATA[coin] = {
294
+ address: coin,
295
+ decimals: Number(decimals_1[index]),
296
+ name: name_1[index],
297
+ symbol: symbol_1[index],
298
+ };
299
+ });
300
+ _b.label = 4;
301
+ case 4: return [2 /*return*/, COINS_DATA];
302
+ }
303
+ });
304
+ });
305
+ };
306
+ this.fetchStats = function (amms, controllers, vaults, borrowed_tokens, collateral_tokens) { return __awaiter(_this, void 0, void 0, function () {
307
+ var marketCount, calls, i, res, i;
308
+ return __generator(this, function (_a) {
309
+ switch (_a.label) {
310
+ case 0:
311
+ cacheStats.clear();
312
+ marketCount = controllers.length;
313
+ calls = [];
314
+ for (i = 0; i < marketCount; i++) {
315
+ calls.push(createCall(this.contracts[controllers[i]], 'total_debt', []));
316
+ calls.push(createCall(this.contracts[vaults[i]], 'totalAssets', [controllers[i]]));
317
+ calls.push(createCall(this.contracts[borrowed_tokens[i]], 'balanceOf', [controllers[i]]));
318
+ calls.push(createCall(this.contracts[amms[i]], 'rate', []));
319
+ calls.push(createCall(this.contracts[borrowed_tokens[i]], 'balanceOf', [amms[i]]));
320
+ calls.push(createCall(this.contracts[amms[i]], 'admin_fees_x', []));
321
+ calls.push(createCall(this.contracts[amms[i]], 'admin_fees_y', []));
322
+ calls.push(createCall(this.contracts[collateral_tokens[i]], 'balanceOf', [amms[i]]));
323
+ }
324
+ return [4 /*yield*/, this.multicallProvider.all(calls)];
325
+ case 1:
326
+ res = _a.sent();
327
+ for (i = 0; i < marketCount; i++) {
328
+ cacheStats.set(cacheKey(controllers[i], 'total_debt'), res[(i * 8) + 0]);
329
+ cacheStats.set(cacheKey(vaults[i], 'totalAssets', controllers[i]), res[(i * 8) + 1]);
330
+ cacheStats.set(cacheKey(borrowed_tokens[i], 'balanceOf', controllers[i]), res[(i * 8) + 2]);
331
+ cacheStats.set(cacheKey(amms[i], 'rate'), res[(i * 8) + 3]);
332
+ cacheStats.set(cacheKey(borrowed_tokens[i], 'balanceOf', amms[i]), res[(i * 8) + 4]);
333
+ cacheStats.set(cacheKey(amms[i], 'admin_fees_x'), res[(i * 8) + 5]);
334
+ cacheStats.set(cacheKey(amms[i], 'admin_fees_y'), res[(i * 8) + 6]);
335
+ cacheStats.set(cacheKey(collateral_tokens[i], 'balanceOf', amms[i]), res[(i * 8) + 7]);
336
+ }
337
+ return [2 /*return*/];
338
+ }
339
+ });
340
+ }); };
341
+ this.fetchLendMarkets = function (useAPI) {
342
+ if (useAPI === void 0) { useAPI = true; }
343
+ return __awaiter(_this, void 0, void 0, function () {
344
+ return __generator(this, function (_a) {
345
+ switch (_a.label) {
346
+ case 0:
347
+ if (!useAPI) return [3 /*break*/, 2];
348
+ return [4 /*yield*/, this._fetchOneWayMarketsByAPI()];
349
+ case 1:
350
+ _a.sent();
351
+ return [3 /*break*/, 4];
352
+ case 2: return [4 /*yield*/, this._fetchOneWayMarketsByBlockchain()];
353
+ case 3:
354
+ _a.sent();
355
+ _a.label = 4;
356
+ case 4: return [2 /*return*/];
357
+ }
358
+ });
359
+ });
360
+ };
361
+ this._fetchOneWayMarketsByBlockchain = function () { return __awaiter(_this, void 0, void 0, function () {
362
+ var _a, names, amms, controllers, borrowed_tokens, collateral_tokens, monetary_policies, vaults, gauges, COIN_DATA, c;
363
+ var _this = this;
364
+ return __generator(this, function (_b) {
365
+ switch (_b.label) {
366
+ case 0: return [4 /*yield*/, this.getFactoryMarketData()];
367
+ case 1:
368
+ _a = _b.sent(), names = _a.names, amms = _a.amms, controllers = _a.controllers, borrowed_tokens = _a.borrowed_tokens, collateral_tokens = _a.collateral_tokens, monetary_policies = _a.monetary_policies, vaults = _a.vaults, gauges = _a.gauges;
369
+ return [4 /*yield*/, this.getCoins(collateral_tokens, borrowed_tokens)];
370
+ case 2:
371
+ COIN_DATA = _b.sent();
372
+ for (c in COIN_DATA) {
373
+ this.constants.DECIMALS[c] = COIN_DATA[c].decimals;
374
+ }
375
+ amms.forEach(function (amm, index) {
376
+ _this.setContract(amm, LlammaABI);
377
+ _this.setContract(controllers[index], ControllerABI);
378
+ _this.setContract(monetary_policies[index], MonetaryPolicyABI);
379
+ _this.setContract(vaults[index], VaultABI);
380
+ _this.setContract(gauges[index], _this.chainId === 1 ? GaugeABI : SidechainGaugeABI);
381
+ COIN_DATA[vaults[index]] = {
382
+ address: vaults[index],
383
+ decimals: 18,
384
+ name: "Curve Vault for " + COIN_DATA[borrowed_tokens[index]].name,
385
+ symbol: "cv" + COIN_DATA[borrowed_tokens[index]].symbol,
386
+ };
387
+ COIN_DATA[gauges[index]] = {
388
+ address: gauges[index],
389
+ decimals: 18,
390
+ name: "Curve.fi " + COIN_DATA[borrowed_tokens[index]].name + " Gauge Deposit",
391
+ symbol: "cv" + COIN_DATA[borrowed_tokens[index]].symbol + "-gauge",
392
+ };
393
+ _this.constants.DECIMALS[vaults[index]] = 18;
394
+ _this.constants.DECIMALS[gauges[index]] = 18;
395
+ _this.constants.ONE_WAY_MARKETS["one-way-market-".concat(index)] = {
396
+ name: names[index],
397
+ addresses: {
398
+ amm: amms[index],
399
+ controller: controllers[index],
400
+ borrowed_token: borrowed_tokens[index],
401
+ collateral_token: collateral_tokens[index],
402
+ monetary_policy: monetary_policies[index],
403
+ vault: vaults[index],
404
+ gauge: gauges[index],
405
+ },
406
+ borrowed_token: COIN_DATA[borrowed_tokens[index]],
407
+ collateral_token: COIN_DATA[collateral_tokens[index]],
408
+ };
409
+ });
410
+ return [4 /*yield*/, this.fetchStats(amms, controllers, vaults, borrowed_tokens, collateral_tokens)];
411
+ case 3:
412
+ _b.sent();
413
+ return [2 /*return*/];
414
+ }
415
+ });
416
+ }); };
417
+ this._fetchOneWayMarketsByAPI = function () { return __awaiter(_this, void 0, void 0, function () {
418
+ var _a, names, amms, controllers, borrowed_tokens, collateral_tokens, monetary_policies, vaults, gauges, COIN_DATA, c;
419
+ var _this = this;
420
+ return __generator(this, function (_b) {
421
+ switch (_b.label) {
422
+ case 0: return [4 /*yield*/, this.getFactoryMarketDataByAPI()];
423
+ case 1:
424
+ _a = _b.sent(), names = _a.names, amms = _a.amms, controllers = _a.controllers, borrowed_tokens = _a.borrowed_tokens, collateral_tokens = _a.collateral_tokens, monetary_policies = _a.monetary_policies, vaults = _a.vaults, gauges = _a.gauges;
425
+ return [4 /*yield*/, this.getCoins(collateral_tokens, borrowed_tokens, true)];
426
+ case 2:
427
+ COIN_DATA = _b.sent();
428
+ for (c in COIN_DATA) {
429
+ this.constants.DECIMALS[c] = COIN_DATA[c].decimals;
430
+ }
431
+ amms.forEach(function (amm, index) {
432
+ _this.setContract(amms[index], LlammaABI);
433
+ _this.setContract(controllers[index], ControllerABI);
434
+ _this.setContract(monetary_policies[index], MonetaryPolicyABI);
435
+ _this.setContract(vaults[index], VaultABI);
436
+ if (gauges[index]) {
437
+ _this.setContract(gauges[index], _this.chainId === 1 ? GaugeABI : SidechainGaugeABI);
438
+ }
439
+ COIN_DATA[vaults[index]] = {
440
+ address: vaults[index],
441
+ decimals: 18,
442
+ name: "Curve Vault for " + COIN_DATA[borrowed_tokens[index]].name,
443
+ symbol: "cv" + COIN_DATA[borrowed_tokens[index]].symbol,
444
+ };
445
+ COIN_DATA[gauges[index]] = {
446
+ address: gauges[index],
447
+ decimals: 18,
448
+ name: "Curve.fi " + COIN_DATA[borrowed_tokens[index]].name + " Gauge Deposit",
449
+ symbol: "cv" + COIN_DATA[borrowed_tokens[index]].symbol + "-gauge",
450
+ };
451
+ _this.constants.DECIMALS[vaults[index]] = 18;
452
+ _this.constants.DECIMALS[gauges[index]] = 18;
453
+ _this.constants.ONE_WAY_MARKETS["one-way-market-".concat(index)] = {
454
+ name: names[index],
455
+ addresses: {
456
+ amm: amms[index],
457
+ controller: controllers[index],
458
+ borrowed_token: borrowed_tokens[index],
459
+ collateral_token: collateral_tokens[index],
460
+ monetary_policy: monetary_policies[index],
461
+ vault: vaults[index],
462
+ gauge: gauges[index],
463
+ },
464
+ borrowed_token: COIN_DATA[borrowed_tokens[index]],
465
+ collateral_token: COIN_DATA[collateral_tokens[index]],
466
+ };
467
+ });
468
+ return [2 /*return*/];
469
+ }
470
+ });
471
+ }); };
472
+ this.address = '00000'; //COINS.lending.toLowerCase();
473
+ // @ts-ignore
474
+ this.provider = null;
475
+ this.signer = null;
476
+ this.signerAddress = "";
477
+ this.chainId = 1;
478
+ // @ts-ignore
479
+ this.multicallProvider = null;
480
+ this.contracts = {};
481
+ this.feeData = {};
482
+ this.constantOptions = { gasLimit: 12000000 };
483
+ this.options = {};
484
+ this.constants = {
485
+ ONE_WAY_MARKETS: {},
486
+ LLAMMAS: LLAMMAS,
487
+ COINS: {},
488
+ DECIMALS: {},
489
+ NETWORK_NAME: 'ethereum',
490
+ ALIASES: {},
491
+ ZERO_ADDRESS: '0x000',
492
+ EXCLUDED_PROTOCOLS_1INCH: "",
493
+ FACTORY: "0xC9332fdCB1C491Dcc683bAe86Fe3cb70360738BC".toLowerCase(),
494
+ PEG_KEEPERS: [
495
+ '0x9201da0d97caaaff53f01b2fb56767c7072de340'.toLowerCase(),
496
+ '0xfb726f57d251ab5c731e5c64ed4f5f94351ef9f3'.toLowerCase(),
497
+ '0x3fa20eaa107de08b38a8734063d605d5842fe09c'.toLowerCase(),
498
+ '0x0a05ff644878b908ef8eb29542aa88c07d9797d3'.toLowerCase(),
499
+ '0x503E1Bf274e7a6c64152395aE8eB57ec391F91F8'.toLowerCase(),
500
+ ],
501
+ WETH: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2".toLowerCase(),
502
+ };
503
+ }
504
+ Llamalend.prototype.init = function (providerType, providerSettings, options // gasPrice in Gwei
505
+ ) {
506
+ var _a;
507
+ if (options === void 0) { options = {}; }
508
+ return __awaiter(this, void 0, void 0, function () {
509
+ var jsonRpcApiProviderOptions, _b, e_1, _c, network, _d, err_1, _i, _e, llamma, monetary_policy_address, _f, _g, pegKeeper, factoryContract, factoryMulticallContract, N1, N2, calls, i, res, collaterals, amms, controllers, _h, collaterals_1, collateral, _j, collaterals_2, collateral, res_1, i, is_eth, _k, collateral_symbol, collateral_decimals, monetary_policy_address, _llammaId, llammaId, j, lendingInstance_1, originalEstimate_1, oldEstimate, newEstimate;
510
+ return __generator(this, function (_l) {
511
+ switch (_l.label) {
512
+ case 0:
513
+ // @ts-ignore
514
+ this.provider = null;
515
+ // @ts-ignore
516
+ this.signer = null;
517
+ this.signerAddress = "";
518
+ this.chainId = 1;
519
+ // @ts-ignore
520
+ this.multicallProvider = null;
521
+ this.contracts = {};
522
+ this.feeData = {};
523
+ this.constantOptions = { gasLimit: 12000000 };
524
+ this.options = {};
525
+ this.constants = {
526
+ ONE_WAY_MARKETS: {},
527
+ LLAMMAS: LLAMMAS,
528
+ COINS: {},
529
+ DECIMALS: {},
530
+ NETWORK_NAME: 'ethereum',
531
+ ALIASES: {},
532
+ ZERO_ADDRESS: ethers.ZeroAddress,
533
+ EXCLUDED_PROTOCOLS_1INCH: "",
534
+ FACTORY: "0xC9332fdCB1C491Dcc683bAe86Fe3cb70360738BC".toLowerCase(),
535
+ PEG_KEEPERS: [
536
+ '0x9201da0d97caaaff53f01b2fb56767c7072de340'.toLowerCase(),
537
+ '0xfb726f57d251ab5c731e5c64ed4f5f94351ef9f3'.toLowerCase(),
538
+ '0x3fa20eaa107de08b38a8734063d605d5842fe09c'.toLowerCase(),
539
+ '0x0a05ff644878b908ef8eb29542aa88c07d9797d3'.toLowerCase(),
540
+ '0x503E1Bf274e7a6c64152395aE8eB57ec391F91F8'.toLowerCase(),
541
+ ],
542
+ WETH: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2".toLowerCase(),
543
+ };
544
+ if (!(providerType.toLowerCase() === 'JsonRpc'.toLowerCase())) return [3 /*break*/, 6];
545
+ providerSettings = providerSettings;
546
+ jsonRpcApiProviderOptions = void 0;
547
+ if (providerSettings.batchMaxCount) {
548
+ jsonRpcApiProviderOptions = {
549
+ batchMaxCount: providerSettings.batchMaxCount,
550
+ };
551
+ }
552
+ if (providerSettings.url) {
553
+ this.provider = new ethers.JsonRpcProvider(providerSettings.url, undefined, jsonRpcApiProviderOptions);
554
+ }
555
+ else {
556
+ this.provider = new ethers.JsonRpcProvider('http://localhost:8545/', undefined, jsonRpcApiProviderOptions);
557
+ }
558
+ if (!providerSettings.privateKey) return [3 /*break*/, 1];
559
+ this.signer = new ethers.Wallet(providerSettings.privateKey, this.provider);
560
+ return [3 /*break*/, 5];
561
+ case 1:
562
+ if (!!((_a = providerSettings.url) === null || _a === void 0 ? void 0 : _a.startsWith("https://rpc.gnosischain.com"))) return [3 /*break*/, 5];
563
+ _l.label = 2;
564
+ case 2:
565
+ _l.trys.push([2, 4, , 5]);
566
+ _b = this;
567
+ return [4 /*yield*/, this.provider.getSigner()];
568
+ case 3:
569
+ _b.signer = _l.sent();
570
+ return [3 /*break*/, 5];
571
+ case 4:
572
+ e_1 = _l.sent();
573
+ this.signer = null;
574
+ return [3 /*break*/, 5];
575
+ case 5: return [3 /*break*/, 9];
576
+ case 6:
577
+ if (!(providerType.toLowerCase() === 'Web3'.toLowerCase())) return [3 /*break*/, 8];
578
+ providerSettings = providerSettings;
579
+ this.provider = new ethers.BrowserProvider(providerSettings.externalProvider);
580
+ _c = this;
581
+ return [4 /*yield*/, this.provider.getSigner()];
582
+ case 7:
583
+ _c.signer = _l.sent();
584
+ return [3 /*break*/, 9];
585
+ case 8:
586
+ if (providerType.toLowerCase() === 'Infura'.toLowerCase()) {
587
+ providerSettings = providerSettings;
588
+ this.provider = new ethers.InfuraProvider(providerSettings.network, providerSettings.apiKey);
589
+ this.signer = null;
590
+ // Alchemy provider
591
+ }
592
+ else if (providerType.toLowerCase() === 'Alchemy'.toLowerCase()) {
593
+ providerSettings = providerSettings;
594
+ this.provider = new ethers.AlchemyProvider(providerSettings.network, providerSettings.apiKey);
595
+ this.signer = null;
596
+ }
597
+ else {
598
+ throw Error('Wrong providerType');
599
+ }
600
+ _l.label = 9;
601
+ case 9: return [4 /*yield*/, this.provider.getNetwork()];
602
+ case 10:
603
+ network = _l.sent();
604
+ this.chainId = Number(network.chainId) === 133 || Number(network.chainId) === 31337 ? 1 : Number(network.chainId);
605
+ console.log("CURVE-LENDING-JS IS CONNECTED TO NETWORK:", { name: network.name.toUpperCase(), chainId: Number(this.chainId) });
606
+ if (this.chainId === 42161) {
607
+ this.constantOptions = { gasLimit: 1125899906842624 }; // https://arbiscan.io/chart/gaslimit
608
+ }
609
+ this.constants.NETWORK_NAME = NETWORK_CONSTANTS[this.chainId].NAME;
610
+ this.constants.ALIASES = NETWORK_CONSTANTS[this.chainId].ALIASES;
611
+ this.constants.COINS = NETWORK_CONSTANTS[this.chainId].COINS;
612
+ this.constants.EXCLUDED_PROTOCOLS_1INCH = NETWORK_CONSTANTS[this.chainId].EXCLUDED_PROTOCOLS_1INCH;
613
+ this.setContract(this.constants.ALIASES.crv, ERC20ABI);
614
+ this.setContract(this.constants.ALIASES.crvUSD, ERC20ABI);
615
+ this.setContract(this.constants.ALIASES.st_crvUSD, ERC4626ABI);
616
+ this.constants.DECIMALS[this.constants.ALIASES.crv] = 18;
617
+ this.constants.DECIMALS[this.constants.ALIASES.crvUSD] = 18;
618
+ this.constants.DECIMALS[this.constants.ALIASES.st_crvUSD] = 18;
619
+ this.multicallProvider = new MulticallProvider(this.chainId, this.provider);
620
+ if (!this.signer) return [3 /*break*/, 15];
621
+ _l.label = 11;
622
+ case 11:
623
+ _l.trys.push([11, 13, , 14]);
624
+ _d = this;
625
+ return [4 /*yield*/, this.signer.getAddress()];
626
+ case 12:
627
+ _d.signerAddress = _l.sent();
628
+ return [3 /*break*/, 14];
629
+ case 13:
630
+ err_1 = _l.sent();
631
+ this.signer = null;
632
+ return [3 /*break*/, 14];
633
+ case 14: return [3 /*break*/, 16];
634
+ case 15:
635
+ this.signerAddress = '';
636
+ _l.label = 16;
637
+ case 16:
638
+ this.feeData = { gasPrice: options.gasPrice, maxFeePerGas: options.maxFeePerGas, maxPriorityFeePerGas: options.maxPriorityFeePerGas };
639
+ return [4 /*yield*/, this.updateFeeData()];
640
+ case 17:
641
+ _l.sent();
642
+ // oneWayMarkets contracts
643
+ this.setContract(this.constants.ALIASES['one_way_factory'], OneWayLendingFactoryABI);
644
+ this.setContract(this.constants.ALIASES['gauge_controller'], GaugeControllerABI);
645
+ this.setContract(this.constants.ALIASES['leverage_zap'], LeverageZapABI);
646
+ if (this.chainId === 1) {
647
+ this.setContract(this.constants.ALIASES.minter, MinterABI);
648
+ this.setContract(this.constants.ALIASES.gauge_factory, GaugeFactoryMainnetABI);
649
+ }
650
+ else {
651
+ this.constants.ALIASES.minter = this.constants.ALIASES.gauge_factory;
652
+ this.setContract(this.constants.ALIASES.gauge_factory, GaugeFactorySidechainABI);
653
+ }
654
+ if (!(this.chainId === 1)) return [3 /*break*/, 22];
655
+ this.setContract(this.constants.COINS.crvusd.toLowerCase(), ERC20ABI);
656
+ _i = 0, _e = Object.values(this.constants.LLAMMAS);
657
+ _l.label = 18;
658
+ case 18:
659
+ if (!(_i < _e.length)) return [3 /*break*/, 21];
660
+ llamma = _e[_i];
661
+ this.setContract(llamma.amm_address, llammaABI);
662
+ this.setContract(llamma.controller_address, controllerABI);
663
+ return [4 /*yield*/, this.contracts[llamma.controller_address].contract.monetary_policy(this.constantOptions)];
664
+ case 19:
665
+ monetary_policy_address = _l.sent();
666
+ llamma.monetary_policy_address = monetary_policy_address.toLowerCase();
667
+ this.setContract(llamma.monetary_policy_address, llamma.monetary_policy_abi);
668
+ if (llamma.collateral_address === "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") {
669
+ this.setContract(this.constants.WETH, ERC20ABI);
670
+ }
671
+ else {
672
+ this.setContract(llamma.collateral_address, ERC20ABI);
673
+ }
674
+ this.setContract(llamma.leverage_zap, LeverageZapCrvUSDABI);
675
+ this.setContract(llamma.deleverage_zap, DeleverageZapABI);
676
+ if (llamma.health_calculator_zap)
677
+ this.setContract(llamma.health_calculator_zap, HealthCalculatorZapABI);
678
+ _l.label = 20;
679
+ case 20:
680
+ _i++;
681
+ return [3 /*break*/, 18];
682
+ case 21:
683
+ for (_f = 0, _g = this.constants.PEG_KEEPERS; _f < _g.length; _f++) {
684
+ pegKeeper = _g[_f];
685
+ this.setContract(pegKeeper, PegKeeper);
686
+ }
687
+ _l.label = 22;
688
+ case 22:
689
+ // TODO Put it in a separate method
690
+ // Fetch new llammas
691
+ this.setContract(this.constants.FACTORY, FactoryABI);
692
+ factoryContract = this.contracts[this.constants.FACTORY].contract;
693
+ factoryMulticallContract = this.contracts[this.constants.FACTORY].multicallContract;
694
+ N1 = Object.keys(this.constants.LLAMMAS).length;
695
+ return [4 /*yield*/, factoryContract.n_collaterals(this.constantOptions)];
696
+ case 23:
697
+ N2 = _l.sent();
698
+ calls = [];
699
+ for (i = N1; i < N2; i++) {
700
+ calls.push(factoryMulticallContract.collaterals(i), factoryMulticallContract.amms(i), factoryMulticallContract.controllers(i));
701
+ }
702
+ return [4 /*yield*/, this.multicallProvider.all(calls)];
703
+ case 24:
704
+ res = (_l.sent()).map(function (c) { return c.toLowerCase(); });
705
+ collaterals = res.filter(function (a, i) { return i % 3 == 0; });
706
+ amms = res.filter(function (a, i) { return i % 3 == 1; });
707
+ controllers = res.filter(function (a, i) { return i % 3 == 2; });
708
+ if (!(collaterals.length > 0)) return [3 /*break*/, 29];
709
+ for (_h = 0, collaterals_1 = collaterals; _h < collaterals_1.length; _h++) {
710
+ collateral = collaterals_1[_h];
711
+ this.setContract(collateral, ERC20ABI);
712
+ }
713
+ calls = [];
714
+ for (_j = 0, collaterals_2 = collaterals; _j < collaterals_2.length; _j++) {
715
+ collateral = collaterals_2[_j];
716
+ calls.push(this.contracts[collateral].multicallContract.symbol(), this.contracts[collateral].multicallContract.decimals());
717
+ }
718
+ return [4 /*yield*/, this.multicallProvider.all(calls)];
719
+ case 25:
720
+ res_1 = (_l.sent()).map(function (x) {
721
+ if (typeof x === "string")
722
+ return x.toLowerCase();
723
+ return x;
724
+ });
725
+ i = 0;
726
+ _l.label = 26;
727
+ case 26:
728
+ if (!(i < collaterals.length)) return [3 /*break*/, 29];
729
+ is_eth = collaterals[i] === this.constants.WETH;
730
+ _k = res_1.splice(0, 2), collateral_symbol = _k[0], collateral_decimals = _k[1];
731
+ this.setContract(amms[i], llammaABI);
732
+ this.setContract(controllers[i], controllerABI);
733
+ return [4 /*yield*/, this.contracts[controllers[i]].contract.monetary_policy(this.constantOptions)];
734
+ case 27:
735
+ monetary_policy_address = (_l.sent()).toLowerCase();
736
+ this.setContract(monetary_policy_address, MonetaryPolicy2ABI);
737
+ _llammaId = is_eth ? "eth" : collateral_symbol.toLowerCase();
738
+ llammaId = _llammaId;
739
+ j = 2;
740
+ while (llammaId in this.constants.LLAMMAS)
741
+ llammaId = _llammaId + j++;
742
+ this.constants.LLAMMAS[llammaId] = {
743
+ amm_address: amms[i],
744
+ controller_address: controllers[i],
745
+ monetary_policy_address: monetary_policy_address,
746
+ collateral_address: is_eth ? "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" : collaterals[i],
747
+ leverage_zap: "0x0000000000000000000000000000000000000000",
748
+ deleverage_zap: "0x0000000000000000000000000000000000000000",
749
+ collateral_symbol: is_eth ? "ETH" : collateral_symbol,
750
+ collateral_decimals: collateral_decimals,
751
+ min_bands: 4,
752
+ max_bands: 50,
753
+ default_bands: 10,
754
+ A: 100,
755
+ monetary_policy_abi: MonetaryPolicy2ABI,
756
+ };
757
+ _l.label = 28;
758
+ case 28:
759
+ i++;
760
+ return [3 /*break*/, 26];
761
+ case 29:
762
+ this.constants.DECIMALS = extractDecimals(this.constants.LLAMMAS);
763
+ this.constants.DECIMALS[this.address] = 18;
764
+ if (L2Networks.includes(this.chainId)) {
765
+ lendingInstance_1 = this;
766
+ lendingInstance_1.setContract(lendingInstance_1.constants.ALIASES.gas_oracle, gasOracleABI);
767
+ lendingInstance_1.setContract(lendingInstance_1.constants.ALIASES.gas_oracle_blob, gasOracleBlobABI);
768
+ // @ts-ignore
769
+ if (AbstractProvider.prototype.originalEstimate) {
770
+ // @ts-ignore
771
+ AbstractProvider.prototype.estimateGas = AbstractProvider.prototype.originalEstimate;
772
+ }
773
+ originalEstimate_1 = AbstractProvider.prototype.estimateGas;
774
+ oldEstimate = function (arg) {
775
+ return __awaiter(this, void 0, void 0, function () {
776
+ var originalEstimateFunc, gas;
777
+ return __generator(this, function (_a) {
778
+ switch (_a.label) {
779
+ case 0:
780
+ originalEstimateFunc = originalEstimate_1.bind(this);
781
+ return [4 /*yield*/, originalEstimateFunc(arg)];
782
+ case 1:
783
+ gas = _a.sent();
784
+ return [2 /*return*/, gas];
785
+ }
786
+ });
787
+ });
788
+ };
789
+ newEstimate = function (arg) {
790
+ return __awaiter(this, void 0, void 0, function () {
791
+ var L2EstimateGas, L1GasUsed, L1Fee, L2GasUsed;
792
+ return __generator(this, function (_a) {
793
+ switch (_a.label) {
794
+ case 0:
795
+ L2EstimateGas = originalEstimate_1.bind(this);
796
+ return [4 /*yield*/, lendingInstance_1.contracts[lendingInstance_1.constants.ALIASES.gas_oracle_blob].contract.getL1GasUsed(arg.data)];
797
+ case 1:
798
+ L1GasUsed = _a.sent();
799
+ return [4 /*yield*/, lendingInstance_1.contracts[lendingInstance_1.constants.ALIASES.gas_oracle_blob].contract.getL1Fee(arg.data)];
800
+ case 2:
801
+ L1Fee = _a.sent();
802
+ lendingInstance_1.L1WeightedGasPrice = Number(L1Fee) / Number(L1GasUsed);
803
+ return [4 /*yield*/, L2EstimateGas(arg)];
804
+ case 3:
805
+ L2GasUsed = _a.sent();
806
+ return [2 /*return*/, [L2GasUsed, L1GasUsed]];
807
+ }
808
+ });
809
+ });
810
+ };
811
+ // @ts-ignore
812
+ AbstractProvider.prototype.estimateGas = newEstimate;
813
+ // @ts-ignore
814
+ AbstractProvider.prototype.originalEstimate = oldEstimate;
815
+ }
816
+ else {
817
+ // @ts-ignore
818
+ if (AbstractProvider.prototype.originalEstimate) {
819
+ // @ts-ignore
820
+ AbstractProvider.prototype.estimateGas = AbstractProvider.prototype.originalEstimate;
821
+ }
822
+ }
823
+ return [2 /*return*/];
824
+ }
825
+ });
826
+ });
827
+ };
828
+ Llamalend.prototype.setContract = function (address, abi) {
829
+ if (address === this.constants.ZERO_ADDRESS || address === undefined)
830
+ return;
831
+ this.contracts[address] = {
832
+ contract: new Contract(address, abi, this.signer || this.provider),
833
+ multicallContract: new MulticallContract(address, abi),
834
+ address: address,
835
+ abi: abi,
836
+ };
837
+ };
838
+ Llamalend.prototype.setCustomFeeData = function (customFeeData) {
839
+ this.feeData = __assign(__assign({}, this.feeData), customFeeData);
840
+ };
841
+ Llamalend.prototype.formatUnits = function (value, unit) {
842
+ return ethers.formatUnits(value, unit);
843
+ };
844
+ Llamalend.prototype.parseUnits = function (value, unit) {
845
+ return ethers.parseUnits(value, unit);
846
+ };
847
+ Llamalend.prototype.updateFeeData = function () {
848
+ return __awaiter(this, void 0, void 0, function () {
849
+ var feeData;
850
+ return __generator(this, function (_a) {
851
+ switch (_a.label) {
852
+ case 0: return [4 /*yield*/, this.provider.getFeeData()];
853
+ case 1:
854
+ feeData = _a.sent();
855
+ if (feeData.maxFeePerGas === null || feeData.maxPriorityFeePerGas === null) {
856
+ delete this.options.maxFeePerGas;
857
+ delete this.options.maxPriorityFeePerGas;
858
+ this.options.gasPrice = this.feeData.gasPrice !== undefined ?
859
+ this.parseUnits(this.feeData.gasPrice.toString(), "gwei") :
860
+ (feeData.gasPrice || this.parseUnits("20", "gwei"));
861
+ }
862
+ else {
863
+ delete this.options.gasPrice;
864
+ this.options.maxFeePerGas = this.feeData.maxFeePerGas !== undefined ?
865
+ this.parseUnits(this.feeData.maxFeePerGas.toString(), "gwei") :
866
+ feeData.maxFeePerGas;
867
+ this.options.maxPriorityFeePerGas = this.feeData.maxPriorityFeePerGas !== undefined ?
868
+ this.parseUnits(this.feeData.maxPriorityFeePerGas.toString(), "gwei") :
869
+ feeData.maxPriorityFeePerGas;
870
+ }
871
+ return [2 /*return*/];
872
+ }
873
+ });
874
+ });
875
+ };
876
+ return Llamalend;
877
+ }());
878
+ export var llamalend = new Llamalend();