@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.
- package/.eslintrc.json +40 -0
- package/.github/workflows/lint.yml +15 -0
- package/.github/workflows/publish.yml +55 -0
- package/LICENSE +21 -0
- package/README.md +1976 -0
- package/lib/cache/index.d.ts +14 -0
- package/lib/cache/index.js +31 -0
- package/lib/constants/L2Networks.d.ts +1 -0
- package/lib/constants/L2Networks.js +1 -0
- package/lib/constants/abis/Controller.json +1027 -0
- package/lib/constants/abis/ERC20.json +222 -0
- package/lib/constants/abis/ERC4626.json +1674 -0
- package/lib/constants/abis/GaugeController.json +794 -0
- package/lib/constants/abis/GaugeFactoryMainnet.json +1 -0
- package/lib/constants/abis/GaugeFactorySidechain.json +475 -0
- package/lib/constants/abis/GaugeV5.json +958 -0
- package/lib/constants/abis/LeverageZap.json +35 -0
- package/lib/constants/abis/Llamma.json +984 -0
- package/lib/constants/abis/Minter.json +1 -0
- package/lib/constants/abis/MonetaryPolicy.json +221 -0
- package/lib/constants/abis/OneWayLendingFactoryABI.json +899 -0
- package/lib/constants/abis/SidechainGauge.json +939 -0
- package/lib/constants/abis/Vault.json +721 -0
- package/lib/constants/abis/crvUSD/DeleverageZap.json +248 -0
- package/lib/constants/abis/crvUSD/Factory.json +514 -0
- package/lib/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
- package/lib/constants/abis/crvUSD/LeverageZap.json +312 -0
- package/lib/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
- package/lib/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
- package/lib/constants/abis/crvUSD/PegKeeper.json +411 -0
- package/lib/constants/abis/crvUSD/controller.json +991 -0
- package/lib/constants/abis/crvUSD/llamma.json +984 -0
- package/lib/constants/abis/gas_oracle_optimism.json +149 -0
- package/lib/constants/abis/gas_oracle_optimism_blob.json +203 -0
- package/lib/constants/aliases.d.ts +16 -0
- package/lib/constants/aliases.js +124 -0
- package/lib/constants/coins.d.ts +16 -0
- package/lib/constants/coins.js +24 -0
- package/lib/constants/llammas.d.ts +2 -0
- package/lib/constants/llammas.js +96 -0
- package/lib/constants/utils.d.ts +4 -0
- package/lib/constants/utils.js +27 -0
- package/lib/external-api.d.ts +13 -0
- package/lib/external-api.js +436 -0
- package/lib/index.d.ts +104 -0
- package/lib/index.js +123 -0
- package/lib/interfaces.d.ts +228 -0
- package/lib/interfaces.js +1 -0
- package/lib/lendMarkets/LendMarketTemplate.d.ts +510 -0
- package/lib/lendMarkets/LendMarketTemplate.js +4682 -0
- package/lib/lendMarkets/index.d.ts +3 -0
- package/lib/lendMarkets/index.js +3 -0
- package/lib/lendMarkets/lendMarketConstructor.d.ts +2 -0
- package/lib/lendMarkets/lendMarketConstructor.js +6 -0
- package/lib/llamalend.d.ts +80 -0
- package/lib/llamalend.js +878 -0
- package/lib/mintMarkets/MintMarketTemplate.d.ts +308 -0
- package/lib/mintMarkets/MintMarketTemplate.js +2998 -0
- package/lib/mintMarkets/index.d.ts +3 -0
- package/lib/mintMarkets/index.js +3 -0
- package/lib/mintMarkets/mintMarketConstructor.d.ts +2 -0
- package/lib/mintMarkets/mintMarketConstructor.js +4 -0
- package/lib/st-crvUSD.d.ts +35 -0
- package/lib/st-crvUSD.js +505 -0
- package/lib/utils.d.ts +58 -0
- package/lib/utils.js +661 -0
- package/package.json +42 -0
- package/src/cache/index.ts +41 -0
- package/src/constants/L2Networks.ts +1 -0
- package/src/constants/abis/Controller.json +1027 -0
- package/src/constants/abis/ERC20.json +222 -0
- package/src/constants/abis/ERC4626.json +1674 -0
- package/src/constants/abis/GaugeController.json +794 -0
- package/src/constants/abis/GaugeFactoryMainnet.json +1 -0
- package/src/constants/abis/GaugeFactorySidechain.json +475 -0
- package/src/constants/abis/GaugeV5.json +958 -0
- package/src/constants/abis/LeverageZap.json +35 -0
- package/src/constants/abis/Llamma.json +984 -0
- package/src/constants/abis/Minter.json +1 -0
- package/src/constants/abis/MonetaryPolicy.json +221 -0
- package/src/constants/abis/OneWayLendingFactoryABI.json +899 -0
- package/src/constants/abis/SidechainGauge.json +939 -0
- package/src/constants/abis/Vault.json +721 -0
- package/src/constants/abis/crvUSD/DeleverageZap.json +248 -0
- package/src/constants/abis/crvUSD/ERC20.json +222 -0
- package/src/constants/abis/crvUSD/Factory.json +514 -0
- package/src/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
- package/src/constants/abis/crvUSD/LeverageZap.json +312 -0
- package/src/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
- package/src/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
- package/src/constants/abis/crvUSD/PegKeeper.json +411 -0
- package/src/constants/abis/crvUSD/controller.json +991 -0
- package/src/constants/abis/crvUSD/llamma.json +984 -0
- package/src/constants/abis/gas_oracle_optimism.json +149 -0
- package/src/constants/abis/gas_oracle_optimism_blob.json +203 -0
- package/src/constants/aliases.ts +141 -0
- package/src/constants/coins.ts +41 -0
- package/src/constants/llammas.ts +99 -0
- package/src/constants/utils.ts +33 -0
- package/src/external-api.ts +325 -0
- package/src/index.ts +128 -0
- package/src/interfaces.ts +237 -0
- package/src/lendMarkets/LendMarketTemplate.ts +3022 -0
- package/src/lendMarkets/index.ts +7 -0
- package/src/lendMarkets/lendMarketConstructor.ts +7 -0
- package/src/llamalend.ts +785 -0
- package/src/mintMarkets/MintMarketTemplate.ts +1781 -0
- package/src/mintMarkets/index.ts +7 -0
- package/src/mintMarkets/mintMarketConstructor.ts +5 -0
- package/src/st-crvUSD.ts +244 -0
- package/src/utils.ts +497 -0
- package/test/fetch.test.ts +152 -0
- package/test/general.test.ts +216 -0
- package/test/leverageBorrowMore.test.ts +245 -0
- package/test/leverageCreateLoan.test.ts +236 -0
- package/test/leverageRepay.test.ts +240 -0
- package/test/readme.test.ts +475 -0
- package/test/selfLiquidate.test.ts +57 -0
- package/test/selfLiquidateCrvUSD.test.ts +54 -0
- package/test/st_crvUSD.test.ts +68 -0
- package/test/swap.test.ts +62 -0
- package/test/swapCrvUSD.test.ts +56 -0
- package/test/vault.test.ts +112 -0
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +72 -0
package/lib/utils.js
ADDED
|
@@ -0,0 +1,661 @@
|
|
|
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 axios from "axios";
|
|
58
|
+
import { ethers } from "ethers";
|
|
59
|
+
import BigNumber from 'bignumber.js';
|
|
60
|
+
import { _getUsdPricesFromApi } from "./external-api.js";
|
|
61
|
+
import { llamalend } from "./llamalend.js";
|
|
62
|
+
import { L2Networks } from "./constants/L2Networks.js";
|
|
63
|
+
import memoize from "memoizee";
|
|
64
|
+
export var MAX_ALLOWANCE = BigInt("115792089237316195423570985008687907853269984665640564039457584007913129639935"); // 2**256 - 1
|
|
65
|
+
export var MAX_ACTIVE_BAND = BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819967"); // 2**255 - 1
|
|
66
|
+
// Common
|
|
67
|
+
export var createCall = function (contract, name, params) {
|
|
68
|
+
var _abi = contract.abi;
|
|
69
|
+
var _name = name.split('-')[0];
|
|
70
|
+
var func = _abi.find(function (f) { return f.name === _name; });
|
|
71
|
+
var inputs = (func === null || func === void 0 ? void 0 : func.inputs) || [];
|
|
72
|
+
var outputs = (func === null || func === void 0 ? void 0 : func.outputs) || [];
|
|
73
|
+
return {
|
|
74
|
+
contract: {
|
|
75
|
+
address: contract.address,
|
|
76
|
+
},
|
|
77
|
+
name: _name,
|
|
78
|
+
inputs: inputs,
|
|
79
|
+
outputs: outputs,
|
|
80
|
+
params: params,
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
// Formatting numbers
|
|
84
|
+
export var _cutZeros = function (strn) {
|
|
85
|
+
return strn.replace(/0+$/gi, '').replace(/\.$/gi, '');
|
|
86
|
+
};
|
|
87
|
+
export var checkNumber = function (n) {
|
|
88
|
+
if (Number(n) !== Number(n))
|
|
89
|
+
throw Error("".concat(n, " is not a number")); // NaN
|
|
90
|
+
return n;
|
|
91
|
+
};
|
|
92
|
+
export var formatNumber = function (n, decimals) {
|
|
93
|
+
if (decimals === void 0) { decimals = 18; }
|
|
94
|
+
n = checkNumber(n);
|
|
95
|
+
var _a = String(n).split("."), integer = _a[0], fractional = _a[1];
|
|
96
|
+
return !fractional ? integer : integer + "." + fractional.slice(0, decimals);
|
|
97
|
+
};
|
|
98
|
+
export var formatUnits = function (value, unit) {
|
|
99
|
+
return ethers.formatUnits(value, unit);
|
|
100
|
+
};
|
|
101
|
+
export var parseUnits = function (n, decimals) {
|
|
102
|
+
if (decimals === void 0) { decimals = 18; }
|
|
103
|
+
return ethers.parseUnits(formatNumber(n, decimals), decimals);
|
|
104
|
+
};
|
|
105
|
+
// bignumber.js
|
|
106
|
+
export var BN = function (val) { return new BigNumber(checkNumber(val)); };
|
|
107
|
+
export var toBN = function (n, decimals) {
|
|
108
|
+
if (decimals === void 0) { decimals = 18; }
|
|
109
|
+
return BN(formatUnits(n, decimals));
|
|
110
|
+
};
|
|
111
|
+
export var toStringFromBN = function (bn, decimals) {
|
|
112
|
+
if (decimals === void 0) { decimals = 18; }
|
|
113
|
+
return bn.toFixed(decimals);
|
|
114
|
+
};
|
|
115
|
+
export var fromBN = function (bn, decimals) {
|
|
116
|
+
if (decimals === void 0) { decimals = 18; }
|
|
117
|
+
return parseUnits(toStringFromBN(bn, decimals), decimals);
|
|
118
|
+
};
|
|
119
|
+
// -----------------------------------------------------------------------------------------------
|
|
120
|
+
export var ETH_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
|
|
121
|
+
export var isEth = function (address) { return address.toLowerCase() === ETH_ADDRESS.toLowerCase(); };
|
|
122
|
+
export var getEthIndex = function (addresses) { return addresses.map(function (address) { return address.toLowerCase(); }).indexOf(ETH_ADDRESS.toLowerCase()); };
|
|
123
|
+
export var _mulBy1_3 = function (n) { return n * parseUnits("130", 0) / parseUnits("100", 0); };
|
|
124
|
+
export var smartNumber = function (abstractNumber) {
|
|
125
|
+
if (Array.isArray(abstractNumber)) {
|
|
126
|
+
return [Number(abstractNumber[0]), Number(abstractNumber[1])];
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
return Number(abstractNumber);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
export var DIGas = function (gas) {
|
|
133
|
+
if (Array.isArray(gas)) {
|
|
134
|
+
return gas[0];
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
return gas;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
export var getGasFromArray = function (gas) {
|
|
141
|
+
if (gas[1] === 0) {
|
|
142
|
+
return gas[0];
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
return gas;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
export var gasSum = function (gas, currentGas) {
|
|
149
|
+
if (Array.isArray(currentGas)) {
|
|
150
|
+
gas[0] = gas[0] + currentGas[0];
|
|
151
|
+
gas[1] = gas[1] + currentGas[1];
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
gas[0] = gas[0] + currentGas;
|
|
155
|
+
}
|
|
156
|
+
return gas;
|
|
157
|
+
};
|
|
158
|
+
export var _getAddress = function (address) {
|
|
159
|
+
address = address || llamalend.signerAddress;
|
|
160
|
+
if (!address)
|
|
161
|
+
throw Error("Need to connect wallet or pass address into args");
|
|
162
|
+
return address;
|
|
163
|
+
};
|
|
164
|
+
export var handleMultiCallResponse = function (callsMap, response) {
|
|
165
|
+
var result = {};
|
|
166
|
+
var responseLength = callsMap.length;
|
|
167
|
+
var _loop_1 = function (i) {
|
|
168
|
+
result[callsMap[i]] = response.filter(function (a, j) { return j % responseLength === i; });
|
|
169
|
+
};
|
|
170
|
+
for (var i = 0; i < responseLength; i++) {
|
|
171
|
+
_loop_1(i);
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
};
|
|
175
|
+
// coins can be either addresses or symbols
|
|
176
|
+
export var _getCoinAddressesNoCheck = function () {
|
|
177
|
+
var coins = [];
|
|
178
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
179
|
+
coins[_i] = arguments[_i];
|
|
180
|
+
}
|
|
181
|
+
if (coins.length == 1 && Array.isArray(coins[0]))
|
|
182
|
+
coins = coins[0];
|
|
183
|
+
coins = coins;
|
|
184
|
+
return coins.map(function (c) { return c.toLowerCase(); }).map(function (c) { return llamalend.constants.COINS[c] || c; });
|
|
185
|
+
};
|
|
186
|
+
export var _getCoinAddresses = function (coins) {
|
|
187
|
+
var coinAddresses = _getCoinAddressesNoCheck(coins);
|
|
188
|
+
var availableAddresses = Object.keys(llamalend.constants.DECIMALS);
|
|
189
|
+
for (var _i = 0, coinAddresses_1 = coinAddresses; _i < coinAddresses_1.length; _i++) {
|
|
190
|
+
var coinAddr = coinAddresses_1[_i];
|
|
191
|
+
if (!availableAddresses.includes(coinAddr))
|
|
192
|
+
throw Error("Coin with address '".concat(coinAddr, "' is not available"));
|
|
193
|
+
}
|
|
194
|
+
return coinAddresses;
|
|
195
|
+
};
|
|
196
|
+
export var _getCoinDecimals = function (coinAddresses) {
|
|
197
|
+
return coinAddresses.map(function (coinAddr) { var _a; return (_a = llamalend.constants.DECIMALS[coinAddr.toLowerCase()]) !== null && _a !== void 0 ? _a : 18; });
|
|
198
|
+
};
|
|
199
|
+
// --- BALANCES ---
|
|
200
|
+
export var _getBalances = function (coinAddresses, address) {
|
|
201
|
+
if (address === void 0) { address = ""; }
|
|
202
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
203
|
+
var _coinAddresses, ethIndex, contractCalls, _i, _coinAddresses_1, coinAddr, _balances, ethBalance;
|
|
204
|
+
return __generator(this, function (_a) {
|
|
205
|
+
switch (_a.label) {
|
|
206
|
+
case 0:
|
|
207
|
+
address = _getAddress(address);
|
|
208
|
+
_coinAddresses = __spreadArray([], coinAddresses, true);
|
|
209
|
+
ethIndex = getEthIndex(_coinAddresses);
|
|
210
|
+
if (ethIndex !== -1) {
|
|
211
|
+
_coinAddresses.splice(ethIndex, 1);
|
|
212
|
+
}
|
|
213
|
+
contractCalls = [];
|
|
214
|
+
for (_i = 0, _coinAddresses_1 = _coinAddresses; _i < _coinAddresses_1.length; _i++) {
|
|
215
|
+
coinAddr = _coinAddresses_1[_i];
|
|
216
|
+
contractCalls.push(llamalend.contracts[coinAddr].multicallContract.balanceOf(address));
|
|
217
|
+
}
|
|
218
|
+
return [4 /*yield*/, llamalend.multicallProvider.all(contractCalls)];
|
|
219
|
+
case 1:
|
|
220
|
+
_balances = _a.sent();
|
|
221
|
+
if (!(ethIndex !== -1)) return [3 /*break*/, 3];
|
|
222
|
+
return [4 /*yield*/, llamalend.provider.getBalance(address)];
|
|
223
|
+
case 2:
|
|
224
|
+
ethBalance = _a.sent();
|
|
225
|
+
_balances.splice(ethIndex, 0, ethBalance);
|
|
226
|
+
_a.label = 3;
|
|
227
|
+
case 3: return [2 /*return*/, _balances];
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
};
|
|
232
|
+
export var getBalances = function (coins, address) {
|
|
233
|
+
if (address === void 0) { address = ""; }
|
|
234
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
235
|
+
var coinAddresses, decimals, _balances;
|
|
236
|
+
return __generator(this, function (_a) {
|
|
237
|
+
switch (_a.label) {
|
|
238
|
+
case 0:
|
|
239
|
+
coinAddresses = _getCoinAddresses(coins);
|
|
240
|
+
decimals = _getCoinDecimals(coinAddresses);
|
|
241
|
+
return [4 /*yield*/, _getBalances(coinAddresses, address)];
|
|
242
|
+
case 1:
|
|
243
|
+
_balances = _a.sent();
|
|
244
|
+
return [2 /*return*/, _balances.map(function (_b, i) { return formatUnits(_b, decimals[i]); })];
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
export var _getAllowance = memoize(function (coins, address, spender) { return __awaiter(void 0, void 0, void 0, function () {
|
|
250
|
+
var _coins, ethIndex, allowance, contractCalls;
|
|
251
|
+
return __generator(this, function (_a) {
|
|
252
|
+
switch (_a.label) {
|
|
253
|
+
case 0:
|
|
254
|
+
_coins = __spreadArray([], coins, true);
|
|
255
|
+
ethIndex = getEthIndex(_coins);
|
|
256
|
+
if (ethIndex !== -1) {
|
|
257
|
+
_coins.splice(ethIndex, 1);
|
|
258
|
+
}
|
|
259
|
+
if (!(_coins.length === 1)) return [3 /*break*/, 2];
|
|
260
|
+
return [4 /*yield*/, llamalend.contracts[_coins[0]].contract.allowance(address, spender, llamalend.constantOptions)];
|
|
261
|
+
case 1:
|
|
262
|
+
allowance = [_a.sent()];
|
|
263
|
+
return [3 /*break*/, 4];
|
|
264
|
+
case 2:
|
|
265
|
+
contractCalls = _coins.map(function (coinAddr) { return llamalend.contracts[coinAddr].multicallContract.allowance(address, spender); });
|
|
266
|
+
return [4 /*yield*/, llamalend.multicallProvider.all(contractCalls)];
|
|
267
|
+
case 3:
|
|
268
|
+
allowance = _a.sent();
|
|
269
|
+
_a.label = 4;
|
|
270
|
+
case 4:
|
|
271
|
+
if (ethIndex !== -1) {
|
|
272
|
+
allowance.splice(ethIndex, 0, MAX_ALLOWANCE);
|
|
273
|
+
}
|
|
274
|
+
return [2 /*return*/, allowance];
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}); }, {
|
|
278
|
+
promise: true,
|
|
279
|
+
maxAge: 5 * 1000,
|
|
280
|
+
primitive: true,
|
|
281
|
+
length: 3,
|
|
282
|
+
});
|
|
283
|
+
// coins can be either addresses or symbols
|
|
284
|
+
export var getAllowance = function (coins, address, spender) { return __awaiter(void 0, void 0, void 0, function () {
|
|
285
|
+
var coinAddresses, decimals, _allowance;
|
|
286
|
+
return __generator(this, function (_a) {
|
|
287
|
+
switch (_a.label) {
|
|
288
|
+
case 0:
|
|
289
|
+
coinAddresses = _getCoinAddresses(coins);
|
|
290
|
+
decimals = _getCoinDecimals(coinAddresses);
|
|
291
|
+
return [4 /*yield*/, _getAllowance(coinAddresses, address, spender)];
|
|
292
|
+
case 1:
|
|
293
|
+
_allowance = _a.sent();
|
|
294
|
+
return [2 /*return*/, _allowance.map(function (a, i) { return llamalend.formatUnits(a, decimals[i]); })];
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}); };
|
|
298
|
+
// coins can be either addresses or symbols
|
|
299
|
+
export var hasAllowance = function (coins, amounts, address, spender) { return __awaiter(void 0, void 0, void 0, function () {
|
|
300
|
+
var coinAddresses, decimals, _allowance, _amounts;
|
|
301
|
+
return __generator(this, function (_a) {
|
|
302
|
+
switch (_a.label) {
|
|
303
|
+
case 0:
|
|
304
|
+
coinAddresses = _getCoinAddresses(coins);
|
|
305
|
+
decimals = _getCoinDecimals(coinAddresses);
|
|
306
|
+
return [4 /*yield*/, _getAllowance(coinAddresses, address, spender)];
|
|
307
|
+
case 1:
|
|
308
|
+
_allowance = _a.sent();
|
|
309
|
+
_amounts = amounts.map(function (a, i) { return parseUnits(a, decimals[i]); });
|
|
310
|
+
return [2 /*return*/, _allowance.map(function (a, i) { return a >= _amounts[i]; }).reduce(function (a, b) { return a && b; })];
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}); };
|
|
314
|
+
export var _ensureAllowance = function (coins, _amounts, spender, isMax) {
|
|
315
|
+
if (isMax === void 0) { isMax = true; }
|
|
316
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
317
|
+
var address, _allowance, txHashes, i, contract, _approveAmount, gasLimit, _a, _c, _d, _e;
|
|
318
|
+
return __generator(this, function (_f) {
|
|
319
|
+
switch (_f.label) {
|
|
320
|
+
case 0:
|
|
321
|
+
address = llamalend.signerAddress;
|
|
322
|
+
return [4 /*yield*/, _getAllowance(coins, address, spender)];
|
|
323
|
+
case 1:
|
|
324
|
+
_allowance = _f.sent();
|
|
325
|
+
txHashes = [];
|
|
326
|
+
i = 0;
|
|
327
|
+
_f.label = 2;
|
|
328
|
+
case 2:
|
|
329
|
+
if (!(i < _allowance.length)) return [3 /*break*/, 7];
|
|
330
|
+
if (!(_allowance[i] < _amounts[i])) return [3 /*break*/, 6];
|
|
331
|
+
contract = llamalend.contracts[coins[i]].contract;
|
|
332
|
+
_approveAmount = isMax ? MAX_ALLOWANCE : _amounts[i];
|
|
333
|
+
return [4 /*yield*/, llamalend.updateFeeData()];
|
|
334
|
+
case 3:
|
|
335
|
+
_f.sent();
|
|
336
|
+
_a = _mulBy1_3;
|
|
337
|
+
_c = DIGas;
|
|
338
|
+
return [4 /*yield*/, contract.approve.estimateGas(spender, _approveAmount, llamalend.constantOptions)];
|
|
339
|
+
case 4:
|
|
340
|
+
gasLimit = _a.apply(void 0, [_c.apply(void 0, [_f.sent()])]);
|
|
341
|
+
_e = (_d = txHashes).push;
|
|
342
|
+
return [4 /*yield*/, contract.approve(spender, _approveAmount, __assign(__assign({}, llamalend.options), { gasLimit: gasLimit }))];
|
|
343
|
+
case 5:
|
|
344
|
+
_e.apply(_d, [(_f.sent()).hash]);
|
|
345
|
+
_f.label = 6;
|
|
346
|
+
case 6:
|
|
347
|
+
i++;
|
|
348
|
+
return [3 /*break*/, 2];
|
|
349
|
+
case 7: return [2 /*return*/, txHashes];
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
};
|
|
354
|
+
// coins can be either addresses or symbols
|
|
355
|
+
export var ensureAllowanceEstimateGas = function (coins, amounts, spender, isMax) {
|
|
356
|
+
if (isMax === void 0) { isMax = true; }
|
|
357
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
358
|
+
var coinAddresses, decimals, _amounts, _allowance, gas, i, contract, _approveAmount, currentGas, _a;
|
|
359
|
+
return __generator(this, function (_c) {
|
|
360
|
+
switch (_c.label) {
|
|
361
|
+
case 0:
|
|
362
|
+
coinAddresses = _getCoinAddresses(coins);
|
|
363
|
+
decimals = _getCoinDecimals(coinAddresses);
|
|
364
|
+
_amounts = amounts.map(function (a, i) { return parseUnits(a, decimals[i]); });
|
|
365
|
+
return [4 /*yield*/, _getAllowance(coinAddresses, llamalend.signerAddress, spender)];
|
|
366
|
+
case 1:
|
|
367
|
+
_allowance = _c.sent();
|
|
368
|
+
gas = [0, 0];
|
|
369
|
+
i = 0;
|
|
370
|
+
_c.label = 2;
|
|
371
|
+
case 2:
|
|
372
|
+
if (!(i < _allowance.length)) return [3 /*break*/, 5];
|
|
373
|
+
if (!(_allowance[i] < _amounts[i])) return [3 /*break*/, 4];
|
|
374
|
+
contract = llamalend.contracts[coinAddresses[i]].contract;
|
|
375
|
+
_approveAmount = isMax ? MAX_ALLOWANCE : _amounts[i];
|
|
376
|
+
_a = smartNumber;
|
|
377
|
+
return [4 /*yield*/, contract.approve.estimateGas(spender, _approveAmount, llamalend.constantOptions)];
|
|
378
|
+
case 3:
|
|
379
|
+
currentGas = _a.apply(void 0, [_c.sent()]);
|
|
380
|
+
gas = gasSum(gas, currentGas);
|
|
381
|
+
_c.label = 4;
|
|
382
|
+
case 4:
|
|
383
|
+
i++;
|
|
384
|
+
return [3 /*break*/, 2];
|
|
385
|
+
case 5: return [2 /*return*/, getGasFromArray(gas)];
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
};
|
|
390
|
+
// coins can be either addresses or symbols
|
|
391
|
+
export var ensureAllowance = function (coins, amounts, spender, isMax) {
|
|
392
|
+
if (isMax === void 0) { isMax = true; }
|
|
393
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
394
|
+
var coinAddresses, decimals, _amounts;
|
|
395
|
+
return __generator(this, function (_a) {
|
|
396
|
+
switch (_a.label) {
|
|
397
|
+
case 0:
|
|
398
|
+
coinAddresses = _getCoinAddresses(coins);
|
|
399
|
+
decimals = _getCoinDecimals(coinAddresses);
|
|
400
|
+
_amounts = amounts.map(function (a, i) { return parseUnits(a, decimals[i]); });
|
|
401
|
+
return [4 /*yield*/, _ensureAllowance(coinAddresses, _amounts, spender, isMax)];
|
|
402
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
};
|
|
407
|
+
var _usdRatesCache = {};
|
|
408
|
+
export var _getUsdRate = function (assetId) { return __awaiter(void 0, void 0, void 0, function () {
|
|
409
|
+
var pricesFromApi, chainName, nativeTokenName, url, response;
|
|
410
|
+
var _a, _c;
|
|
411
|
+
return __generator(this, function (_d) {
|
|
412
|
+
switch (_d.label) {
|
|
413
|
+
case 0:
|
|
414
|
+
if (llamalend.chainId === 1 && assetId.toLowerCase() === '0x8762db106b2c2a0bccb3a80d1ed41273552616e8')
|
|
415
|
+
return [2 /*return*/, 0]; // RSR
|
|
416
|
+
return [4 /*yield*/, _getUsdPricesFromApi()];
|
|
417
|
+
case 1:
|
|
418
|
+
pricesFromApi = _d.sent();
|
|
419
|
+
if (assetId.toLowerCase() in pricesFromApi)
|
|
420
|
+
return [2 /*return*/, pricesFromApi[assetId.toLowerCase()]];
|
|
421
|
+
if (assetId === 'USD' || (llamalend.chainId === 137 && (assetId.toLowerCase() === llamalend.constants.COINS.am3crv.toLowerCase())))
|
|
422
|
+
return [2 /*return*/, 1];
|
|
423
|
+
chainName = {
|
|
424
|
+
1: 'ethereum',
|
|
425
|
+
10: 'optimistic-ethereum',
|
|
426
|
+
56: "binance-smart-chain",
|
|
427
|
+
100: 'xdai',
|
|
428
|
+
137: 'polygon-pos',
|
|
429
|
+
156: 'sonic',
|
|
430
|
+
196: 'x-layer',
|
|
431
|
+
250: 'fantom',
|
|
432
|
+
252: 'fraxtal',
|
|
433
|
+
324: 'zksync',
|
|
434
|
+
1284: 'moonbeam',
|
|
435
|
+
2222: 'kava',
|
|
436
|
+
5000: 'mantle',
|
|
437
|
+
8453: 'base',
|
|
438
|
+
42220: 'celo',
|
|
439
|
+
43114: 'avalanche',
|
|
440
|
+
42161: 'arbitrum-one',
|
|
441
|
+
1313161554: 'aurora',
|
|
442
|
+
}[llamalend.chainId];
|
|
443
|
+
nativeTokenName = {
|
|
444
|
+
1: 'ethereum',
|
|
445
|
+
10: 'ethereum',
|
|
446
|
+
56: 'binancecoin',
|
|
447
|
+
100: 'xdai',
|
|
448
|
+
137: 'matic-network',
|
|
449
|
+
156: 'sonic-3',
|
|
450
|
+
196: 'okb',
|
|
451
|
+
250: 'fantom',
|
|
452
|
+
252: 'frax-ether',
|
|
453
|
+
324: 'ethereum',
|
|
454
|
+
1284: 'moonbeam',
|
|
455
|
+
2222: 'kava',
|
|
456
|
+
5000: 'mantle',
|
|
457
|
+
8453: 'ethereum',
|
|
458
|
+
42220: 'celo',
|
|
459
|
+
43114: 'avalanche-2',
|
|
460
|
+
42161: 'ethereum',
|
|
461
|
+
1313161554: 'ethereum',
|
|
462
|
+
}[llamalend.chainId];
|
|
463
|
+
if (chainName === undefined) {
|
|
464
|
+
throw Error('curve object is not initialized');
|
|
465
|
+
}
|
|
466
|
+
assetId = {
|
|
467
|
+
'CRV': 'curve-dao-token',
|
|
468
|
+
'EUR': 'stasis-eurs',
|
|
469
|
+
'BTC': 'bitcoin',
|
|
470
|
+
'ETH': 'ethereum',
|
|
471
|
+
'LINK': 'link',
|
|
472
|
+
}[assetId.toUpperCase()] || assetId;
|
|
473
|
+
assetId = isEth(assetId) ? nativeTokenName : assetId.toLowerCase();
|
|
474
|
+
// No EURT on Coingecko Polygon
|
|
475
|
+
if (llamalend.chainId === 137 && assetId.toLowerCase() === llamalend.constants.COINS.eurt) {
|
|
476
|
+
chainName = 'ethereum';
|
|
477
|
+
assetId = '0xC581b735A1688071A1746c968e0798D642EDE491'.toLowerCase(); // EURT Ethereum
|
|
478
|
+
}
|
|
479
|
+
// CRV
|
|
480
|
+
if (assetId.toLowerCase() === llamalend.constants.ALIASES.crv) {
|
|
481
|
+
assetId = 'curve-dao-token';
|
|
482
|
+
}
|
|
483
|
+
if (!((((_a = _usdRatesCache[assetId]) === null || _a === void 0 ? void 0 : _a.time) || 0) + 600000 < Date.now())) return [3 /*break*/, 3];
|
|
484
|
+
url = [nativeTokenName, 'ethereum', 'bitcoin', 'link', 'curve-dao-token', 'stasis-eurs'].includes(assetId.toLowerCase()) ?
|
|
485
|
+
"https://api.coingecko.com/api/v3/simple/price?ids=".concat(assetId, "&vs_currencies=usd") :
|
|
486
|
+
"https://api.coingecko.com/api/v3/simple/token_price/".concat(chainName, "?contract_addresses=").concat(assetId, "&vs_currencies=usd");
|
|
487
|
+
return [4 /*yield*/, axios.get(url)];
|
|
488
|
+
case 2:
|
|
489
|
+
response = _d.sent();
|
|
490
|
+
try {
|
|
491
|
+
_usdRatesCache[assetId] = { 'rate': (_c = response.data[assetId]['usd']) !== null && _c !== void 0 ? _c : 0, 'time': Date.now() };
|
|
492
|
+
}
|
|
493
|
+
catch (err) { // TODO pay attention!
|
|
494
|
+
_usdRatesCache[assetId] = { 'rate': 0, 'time': Date.now() };
|
|
495
|
+
}
|
|
496
|
+
_d.label = 3;
|
|
497
|
+
case 3: return [2 /*return*/, _usdRatesCache[assetId]['rate']];
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
}); };
|
|
501
|
+
export var getUsdRate = function (coin) { return __awaiter(void 0, void 0, void 0, function () {
|
|
502
|
+
var coinAddress;
|
|
503
|
+
return __generator(this, function (_a) {
|
|
504
|
+
switch (_a.label) {
|
|
505
|
+
case 0:
|
|
506
|
+
coinAddress = _getCoinAddressesNoCheck(coin)[0];
|
|
507
|
+
return [4 /*yield*/, _getUsdRate(coinAddress)];
|
|
508
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
}); };
|
|
512
|
+
export var getBaseFeeByLastBlock = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
513
|
+
var provider, block, error_1;
|
|
514
|
+
return __generator(this, function (_a) {
|
|
515
|
+
switch (_a.label) {
|
|
516
|
+
case 0:
|
|
517
|
+
provider = llamalend.provider;
|
|
518
|
+
_a.label = 1;
|
|
519
|
+
case 1:
|
|
520
|
+
_a.trys.push([1, 3, , 4]);
|
|
521
|
+
return [4 /*yield*/, provider.getBlock('latest')];
|
|
522
|
+
case 2:
|
|
523
|
+
block = _a.sent();
|
|
524
|
+
if (!block) {
|
|
525
|
+
return [2 /*return*/, 0.01];
|
|
526
|
+
}
|
|
527
|
+
return [2 /*return*/, Number(block.baseFeePerGas) / (Math.pow(10, 9))];
|
|
528
|
+
case 3:
|
|
529
|
+
error_1 = _a.sent();
|
|
530
|
+
throw new Error(error_1);
|
|
531
|
+
case 4: return [2 /*return*/];
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
}); };
|
|
535
|
+
export var getGasPriceFromL1 = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
536
|
+
return __generator(this, function (_a) {
|
|
537
|
+
if (L2Networks.includes(llamalend.chainId) && llamalend.L1WeightedGasPrice) {
|
|
538
|
+
return [2 /*return*/, llamalend.L1WeightedGasPrice + 1e9]; // + 1 gwei
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
throw Error("This method exists only for L2 networks");
|
|
542
|
+
}
|
|
543
|
+
return [2 /*return*/];
|
|
544
|
+
});
|
|
545
|
+
}); };
|
|
546
|
+
export var getGasPriceFromL2 = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
547
|
+
var e_1;
|
|
548
|
+
return __generator(this, function (_a) {
|
|
549
|
+
switch (_a.label) {
|
|
550
|
+
case 0:
|
|
551
|
+
if (!(llamalend.chainId === 42161)) return [3 /*break*/, 5];
|
|
552
|
+
_a.label = 1;
|
|
553
|
+
case 1:
|
|
554
|
+
_a.trys.push([1, 3, , 4]);
|
|
555
|
+
return [4 /*yield*/, getBaseFeeByLastBlock()];
|
|
556
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
557
|
+
case 3:
|
|
558
|
+
e_1 = _a.sent();
|
|
559
|
+
throw Error(e_1);
|
|
560
|
+
case 4: return [3 /*break*/, 6];
|
|
561
|
+
case 5: throw Error("This method exists only for ARBITRUM network");
|
|
562
|
+
case 6: return [2 /*return*/];
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
}); };
|
|
566
|
+
export var getGasInfoForL2 = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
567
|
+
var baseFee, e_2;
|
|
568
|
+
return __generator(this, function (_a) {
|
|
569
|
+
switch (_a.label) {
|
|
570
|
+
case 0:
|
|
571
|
+
if (!(llamalend.chainId === 42161)) return [3 /*break*/, 5];
|
|
572
|
+
_a.label = 1;
|
|
573
|
+
case 1:
|
|
574
|
+
_a.trys.push([1, 3, , 4]);
|
|
575
|
+
return [4 /*yield*/, getBaseFeeByLastBlock()];
|
|
576
|
+
case 2:
|
|
577
|
+
baseFee = _a.sent();
|
|
578
|
+
return [2 /*return*/, {
|
|
579
|
+
maxFeePerGas: Number(((baseFee * 1.1) + 0.01).toFixed(2)),
|
|
580
|
+
maxPriorityFeePerGas: 0.01,
|
|
581
|
+
}];
|
|
582
|
+
case 3:
|
|
583
|
+
e_2 = _a.sent();
|
|
584
|
+
throw Error(e_2);
|
|
585
|
+
case 4: return [3 /*break*/, 6];
|
|
586
|
+
case 5: throw Error("This method exists only for ARBITRUM network");
|
|
587
|
+
case 6: return [2 /*return*/];
|
|
588
|
+
}
|
|
589
|
+
});
|
|
590
|
+
}); };
|
|
591
|
+
export var totalSupply = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
592
|
+
var calls, _i, _a, llammaId, controllerAddress, controllerContract, _c, _d, pegKeeper, res, mintedBN, i, _e, _minted, _redeemed, pegKeepersBN, _f, res_1, _pegKeeperDebt;
|
|
593
|
+
return __generator(this, function (_g) {
|
|
594
|
+
switch (_g.label) {
|
|
595
|
+
case 0:
|
|
596
|
+
calls = [];
|
|
597
|
+
for (_i = 0, _a = llamalend.getMintMarketList(); _i < _a.length; _i++) {
|
|
598
|
+
llammaId = _a[_i];
|
|
599
|
+
controllerAddress = llamalend.constants.LLAMMAS[llammaId].controller_address;
|
|
600
|
+
controllerContract = llamalend.contracts[controllerAddress].multicallContract;
|
|
601
|
+
calls.push(controllerContract.minted(), controllerContract.redeemed());
|
|
602
|
+
}
|
|
603
|
+
for (_c = 0, _d = llamalend.constants.PEG_KEEPERS; _c < _d.length; _c++) {
|
|
604
|
+
pegKeeper = _d[_c];
|
|
605
|
+
calls.push(llamalend.contracts[pegKeeper].multicallContract.debt());
|
|
606
|
+
}
|
|
607
|
+
return [4 /*yield*/, llamalend.multicallProvider.all(calls)];
|
|
608
|
+
case 1:
|
|
609
|
+
res = _g.sent();
|
|
610
|
+
mintedBN = BN(0);
|
|
611
|
+
for (i = 0; i < llamalend.getMintMarketList().length; i++) {
|
|
612
|
+
_e = res.splice(0, 2), _minted = _e[0], _redeemed = _e[1];
|
|
613
|
+
mintedBN = toBN(_minted).minus(toBN(_redeemed)).plus(mintedBN);
|
|
614
|
+
}
|
|
615
|
+
pegKeepersBN = BN(0);
|
|
616
|
+
for (_f = 0, res_1 = res; _f < res_1.length; _f++) {
|
|
617
|
+
_pegKeeperDebt = res_1[_f];
|
|
618
|
+
pegKeepersBN = pegKeepersBN.plus(toBN(_pegKeeperDebt));
|
|
619
|
+
}
|
|
620
|
+
return [2 /*return*/, { total: mintedBN.plus(pegKeepersBN).toString(), minted: mintedBN.toString(), pegKeepersDebt: pegKeepersBN.toString() }];
|
|
621
|
+
}
|
|
622
|
+
});
|
|
623
|
+
}); };
|
|
624
|
+
export var getLsdApy = memoize(function (name) { return __awaiter(void 0, void 0, void 0, function () {
|
|
625
|
+
var response, data, params, result;
|
|
626
|
+
return __generator(this, function (_a) {
|
|
627
|
+
switch (_a.label) {
|
|
628
|
+
case 0: return [4 /*yield*/, axios.get('https://yields.llama.fi/pools')];
|
|
629
|
+
case 1:
|
|
630
|
+
response = _a.sent();
|
|
631
|
+
data = response.data;
|
|
632
|
+
params = {
|
|
633
|
+
'wstETH': {
|
|
634
|
+
project: 'lido',
|
|
635
|
+
symbol: 'STETH',
|
|
636
|
+
},
|
|
637
|
+
'sfrxETH': {
|
|
638
|
+
project: 'frax-ether',
|
|
639
|
+
symbol: 'SFRXETH',
|
|
640
|
+
},
|
|
641
|
+
};
|
|
642
|
+
result = data.find(function (_a) {
|
|
643
|
+
var chain = _a.chain, project = _a.project, symbol = _a.symbol;
|
|
644
|
+
return (chain === 'Ethereum' &&
|
|
645
|
+
project === params[name].project &&
|
|
646
|
+
symbol === params[name].symbol);
|
|
647
|
+
});
|
|
648
|
+
if (result) {
|
|
649
|
+
return [2 /*return*/, {
|
|
650
|
+
apy: result.apy,
|
|
651
|
+
baseApy: result.apyBase,
|
|
652
|
+
apyMean30d: result.apyMean30d,
|
|
653
|
+
}];
|
|
654
|
+
}
|
|
655
|
+
throw new Error('Pool not found');
|
|
656
|
+
}
|
|
657
|
+
});
|
|
658
|
+
}); }, {
|
|
659
|
+
promise: true,
|
|
660
|
+
maxAge: 60 * 1000, // 1m
|
|
661
|
+
});
|