@curvefi/api 1.21.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -241,6 +241,9 @@ import curve from "@curvefi/api";
241
241
 
242
242
  (async () => {
243
243
  await curve.init('JsonRpc', {}, {gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0});
244
+
245
+ console.log(await curve.getTVL());
246
+ // 19281307454.671753
244
247
 
245
248
  const aave = new curve.Pool('aave');
246
249
 
@@ -0,0 +1,3 @@
1
+ import { IExtendedPoolDataFromApi } from "./interfaces";
2
+ import memoize from "memoizee";
3
+ export declare const _getPoolsFromApi: ((network: "ethereum" | "polygon", poolType: "main" | "crypto" | "factory" | "factory-crypto") => Promise<IExtendedPoolDataFromApi>) & memoize.Memoized<(network: "ethereum" | "polygon", poolType: "main" | "crypto" | "factory" | "factory-crypto") => Promise<IExtendedPoolDataFromApi>>;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports._getPoolsFromApi = void 0;
43
+ var axios_1 = __importDefault(require("axios"));
44
+ var memoizee_1 = __importDefault(require("memoizee"));
45
+ exports._getPoolsFromApi = (0, memoizee_1.default)(function (network, poolType) { return __awaiter(void 0, void 0, void 0, function () {
46
+ var url, response, err_1;
47
+ return __generator(this, function (_a) {
48
+ switch (_a.label) {
49
+ case 0:
50
+ url = "https://api.curve.fi/api/getPools/".concat(network, "/").concat(poolType);
51
+ _a.label = 1;
52
+ case 1:
53
+ _a.trys.push([1, 3, , 4]);
54
+ return [4 /*yield*/, axios_1.default.get(url)];
55
+ case 2:
56
+ response = _a.sent();
57
+ return [2 /*return*/, response.data.data];
58
+ case 3:
59
+ err_1 = _a.sent();
60
+ return [2 /*return*/, { poolData: [], tvl: 0, tvlAll: 0 }];
61
+ case 4: return [2 /*return*/];
62
+ }
63
+ });
64
+ }); }, {
65
+ promise: true,
66
+ maxAge: 5 * 60 * 1000, // 5m
67
+ });
package/lib/index.d.ts CHANGED
@@ -30,6 +30,7 @@ declare const curve: {
30
30
  getFactoryPoolList: () => string[];
31
31
  getCryptoFactoryPoolList: () => string[];
32
32
  getUsdRate: (coin: string) => Promise<number>;
33
+ getTVL: (chainId?: number) => Promise<number>;
33
34
  setCustomFeeData: typeof setCustomFeeData;
34
35
  signerAddress: string;
35
36
  chainId: number;
package/lib/index.js CHANGED
@@ -94,6 +94,7 @@ var curve = {
94
94
  getFactoryPoolList: utils_1.getFactoryPoolList,
95
95
  getCryptoFactoryPoolList: utils_1.getCryptoFactoryPoolList,
96
96
  getUsdRate: utils_1.getUsdRate,
97
+ getTVL: utils_1.getTVL,
97
98
  setCustomFeeData: setCustomFeeData,
98
99
  signerAddress: '',
99
100
  chainId: 0,
@@ -92,6 +92,7 @@ export interface ICoinFromPoolDataApi {
92
92
  address: string;
93
93
  symbol: string;
94
94
  decimals: string;
95
+ usdPrice: number | string;
95
96
  }
96
97
  export interface IPoolDataFromApi {
97
98
  id: string;
@@ -104,6 +105,12 @@ export interface IPoolDataFromApi {
104
105
  implementation: string;
105
106
  implementationAddress: string;
106
107
  coins: ICoinFromPoolDataApi[];
108
+ usdTotal: number;
109
+ }
110
+ export interface IExtendedPoolDataFromApi {
111
+ poolData: IPoolDataFromApi[];
112
+ tvl?: number;
113
+ tvlAll: number;
107
114
  }
108
115
  export interface RewardsApyInterface {
109
116
  token: string;
package/lib/pools.d.ts CHANGED
@@ -64,7 +64,7 @@ export declare class Pool {
64
64
  }>;
65
65
  getPoolBalances: () => Promise<string[]>;
66
66
  getPoolWrappedBalances: () => Promise<string[]>;
67
- getTotalLiquidity: () => Promise<string>;
67
+ getTotalLiquidity: (useApi?: boolean) => Promise<string>;
68
68
  getVolume: () => Promise<string>;
69
69
  getBaseApy: () => Promise<{
70
70
  day: string;
package/lib/pools.js CHANGED
@@ -60,10 +60,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
60
60
  };
61
61
  Object.defineProperty(exports, "__esModule", { value: true });
62
62
  exports.getUserPoolList = exports.crossAssetExchange = exports.crossAssetExchangeEstimateGas = exports.crossAssetExchangeApprove = exports.crossAssetExchangeApproveEstimateGas = exports.crossAssetExchangeIsApproved = exports.crossAssetExchangeExpected = exports.crossAssetExchangeOutputAndSlippage = exports._crossAssetExchangeInfo = exports._getSmallAmountForCoin = exports.crossAssetExchangeAvailable = exports.exchange = exports.exchangeEstimateGas = exports.exchangeApprove = exports.exchangeApproveEstimateGas = exports.exchangeIsApproved = exports.exchangeExpected = exports.getBestPoolAndOutput = exports.Pool = void 0;
63
+ var axios_1 = __importDefault(require("axios"));
63
64
  var ethers_1 = require("ethers");
65
+ var external_api_1 = require("./external-api");
64
66
  var utils_1 = require("./utils");
65
67
  var curve_1 = require("./curve");
66
- var axios_1 = __importDefault(require("axios"));
67
68
  var Pool = /** @class */ (function () {
68
69
  function Pool(id) {
69
70
  var _this = this;
@@ -224,26 +225,48 @@ var Pool = /** @class */ (function () {
224
225
  }
225
226
  });
226
227
  }); };
227
- this.getTotalLiquidity = function () { return __awaiter(_this, void 0, void 0, function () {
228
- var balances, promises, _i, _a, addr, prices, totalLiquidity;
229
- return __generator(this, function (_c) {
230
- switch (_c.label) {
231
- case 0: return [4 /*yield*/, this.getPoolBalances()];
232
- case 1:
233
- balances = _c.sent();
234
- promises = [];
235
- for (_i = 0, _a = this.underlyingCoinAddresses; _i < _a.length; _i++) {
236
- addr = _a[_i];
237
- promises.push((0, utils_1._getUsdRate)(addr));
238
- }
239
- return [4 /*yield*/, Promise.all(promises)];
240
- case 2:
241
- prices = _c.sent();
242
- totalLiquidity = balances.reduce(function (liquidity, b, i) { return liquidity + (Number(b) * prices[i]); }, 0);
243
- return [2 /*return*/, totalLiquidity.toFixed(8)];
244
- }
228
+ this.getTotalLiquidity = function (useApi) {
229
+ if (useApi === void 0) { useApi = true; }
230
+ return __awaiter(_this, void 0, void 0, function () {
231
+ var network, poolType, poolsData, totalLiquidity_1, balances, promises, _i, _a, addr, prices, totalLiquidity;
232
+ var _this = this;
233
+ return __generator(this, function (_c) {
234
+ switch (_c.label) {
235
+ case 0:
236
+ if (!useApi) return [3 /*break*/, 2];
237
+ network = curve_1.curve.chainId === 137 ? "polygon" : "ethereum";
238
+ poolType = !this.isFactory && !this.isCrypto ? "main" :
239
+ !this.isFactory ? "crypto" :
240
+ !this.isCryptoFactory ? "factory" :
241
+ "factory-crypto";
242
+ return [4 /*yield*/, (0, external_api_1._getPoolsFromApi)(network, poolType)];
243
+ case 1:
244
+ poolsData = (_c.sent()).poolData;
245
+ try {
246
+ totalLiquidity_1 = poolsData.filter(function (data) { return data.address.toLowerCase() === _this.swap.toLowerCase(); })[0].usdTotal;
247
+ return [2 /*return*/, String(totalLiquidity_1)];
248
+ }
249
+ catch (err) {
250
+ console.log(err.message);
251
+ }
252
+ _c.label = 2;
253
+ case 2: return [4 /*yield*/, this.getPoolBalances()];
254
+ case 3:
255
+ balances = _c.sent();
256
+ promises = [];
257
+ for (_i = 0, _a = this.underlyingCoinAddresses; _i < _a.length; _i++) {
258
+ addr = _a[_i];
259
+ promises.push((0, utils_1._getUsdRate)(addr));
260
+ }
261
+ return [4 /*yield*/, Promise.all(promises)];
262
+ case 4:
263
+ prices = _c.sent();
264
+ totalLiquidity = balances.reduce(function (liquidity, b, i) { return liquidity + (Number(b) * prices[i]); }, 0);
265
+ return [2 /*return*/, totalLiquidity.toFixed(8)];
266
+ }
267
+ });
245
268
  });
246
- }); };
269
+ };
247
270
  this._getPoolStats = function () { return __awaiter(_this, void 0, void 0, function () {
248
271
  var statsUrl, name, key;
249
272
  return __generator(this, function (_a) {
@@ -273,7 +296,7 @@ var Pool = /** @class */ (function () {
273
296
  if (!(this.isCrypto || (curve_1.curve.chainId === 1 && this.isFactory))) return [3 /*break*/, 2];
274
297
  _a = 1;
275
298
  return [3 /*break*/, 4];
276
- case 2: return [4 /*yield*/, (0, utils_1._getUsdRate)(this.referenceAsset)];
299
+ case 2: return [4 /*yield*/, (0, utils_1._getUsdRate)(this.coinAddresses[0])];
277
300
  case 3:
278
301
  _a = _c.sent();
279
302
  _c.label = 4;
package/lib/utils.d.ts CHANGED
@@ -21,6 +21,7 @@ export declare const _ensureAllowance: (coins: string[], amounts: ethers.BigNumb
21
21
  export declare const ensureAllowanceEstimateGas: (coins: string[], amounts: string[], spender: string) => Promise<number>;
22
22
  export declare const ensureAllowance: (coins: string[], amounts: string[], spender: string) => Promise<string[]>;
23
23
  export declare const getPoolNameBySwapAddress: (swapAddress: string) => string;
24
+ export declare const _getUsdPricesFromApi: () => Promise<DictInterface<number>>;
24
25
  export declare const _getUsdRate: (assetId: string) => Promise<number>;
25
26
  export declare const _getFactoryStatsUrl: () => string;
26
27
  export declare const _getStatsUrl: (isCrypto?: boolean) => string;
@@ -31,3 +32,4 @@ export declare const getPoolList: () => string[];
31
32
  export declare const getFactoryPoolList: () => string[];
32
33
  export declare const getCryptoFactoryPoolList: () => string[];
33
34
  export declare const getUsdRate: (coin: string) => Promise<number>;
35
+ export declare const getTVL: (chainId?: number) => Promise<number>;
package/lib/utils.js CHANGED
@@ -59,13 +59,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
59
59
  return (mod && mod.__esModule) ? mod : { "default": mod };
60
60
  };
61
61
  Object.defineProperty(exports, "__esModule", { value: true });
62
- exports.getUsdRate = exports.getCryptoFactoryPoolList = exports.getFactoryPoolList = exports.getPoolList = exports._getFactoryStatsPolygon = exports._getFactoryStatsEthereum = exports._getStats = exports._getStatsUrl = exports._getFactoryStatsUrl = exports._getUsdRate = exports.getPoolNameBySwapAddress = exports.ensureAllowance = exports.ensureAllowanceEstimateGas = exports._ensureAllowance = exports.hasAllowance = exports.getAllowance = exports._getAllowance = exports.getBalances = exports._prepareAddresses = exports._getBalances = exports._getCoinDecimals = exports._getCoinAddresses = exports.getEthIndex = exports.isEth = exports.fromBN = exports.toStringFromBN = exports.toBN = exports.BN = exports.MAX_ALLOWANCE = void 0;
62
+ exports.getTVL = exports.getUsdRate = exports.getCryptoFactoryPoolList = exports.getFactoryPoolList = exports.getPoolList = exports._getFactoryStatsPolygon = exports._getFactoryStatsEthereum = exports._getStats = exports._getStatsUrl = exports._getFactoryStatsUrl = exports._getUsdRate = exports._getUsdPricesFromApi = exports.getPoolNameBySwapAddress = exports.ensureAllowance = exports.ensureAllowanceEstimateGas = exports._ensureAllowance = exports.hasAllowance = exports.getAllowance = exports._getAllowance = exports.getBalances = exports._prepareAddresses = exports._getBalances = exports._getCoinDecimals = exports._getCoinAddresses = exports.getEthIndex = exports.isEth = exports.fromBN = exports.toStringFromBN = exports.toBN = exports.BN = exports.MAX_ALLOWANCE = void 0;
63
63
  var axios_1 = __importDefault(require("axios"));
64
64
  var memoizee_1 = __importDefault(require("memoizee"));
65
65
  var ethers_1 = require("ethers");
66
66
  var bignumber_js_1 = __importDefault(require("bignumber.js"));
67
67
  var curve_1 = require("./curve");
68
68
  var curve_2 = require("./curve");
69
+ var external_api_1 = require("./external-api");
69
70
  var ETH_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
70
71
  exports.MAX_ALLOWANCE = ethers_1.ethers.BigNumber.from(2).pow(ethers_1.ethers.BigNumber.from(256)).sub(ethers_1.ethers.BigNumber.from(1));
71
72
  // bignumber.js
@@ -374,13 +375,49 @@ var getPoolNameBySwapAddress = function (swapAddress) {
374
375
  })[0][0];
375
376
  };
376
377
  exports.getPoolNameBySwapAddress = getPoolNameBySwapAddress;
378
+ var _getUsdPricesFromApi = function () { return __awaiter(void 0, void 0, void 0, function () {
379
+ var network, promises, allTypesExtendedPoolData, priceDict, _i, allTypesExtendedPoolData_1, extendedPoolData, _a, _b, pool, _c, _d, coin;
380
+ return __generator(this, function (_e) {
381
+ switch (_e.label) {
382
+ case 0:
383
+ network = curve_1.curve.chainId === 137 ? "polygon" : "ethereum";
384
+ promises = [
385
+ (0, external_api_1._getPoolsFromApi)(network, "main"),
386
+ (0, external_api_1._getPoolsFromApi)(network, "crypto"),
387
+ (0, external_api_1._getPoolsFromApi)(network, "factory"),
388
+ (0, external_api_1._getPoolsFromApi)(network, "factory-crypto"),
389
+ ];
390
+ return [4 /*yield*/, Promise.all(promises)];
391
+ case 1:
392
+ allTypesExtendedPoolData = _e.sent();
393
+ priceDict = {};
394
+ for (_i = 0, allTypesExtendedPoolData_1 = allTypesExtendedPoolData; _i < allTypesExtendedPoolData_1.length; _i++) {
395
+ extendedPoolData = allTypesExtendedPoolData_1[_i];
396
+ for (_a = 0, _b = extendedPoolData.poolData; _a < _b.length; _a++) {
397
+ pool = _b[_a];
398
+ for (_c = 0, _d = pool.coins; _c < _d.length; _c++) {
399
+ coin = _d[_c];
400
+ if (typeof coin.usdPrice === "number")
401
+ priceDict[coin.address.toLowerCase()] = coin.usdPrice;
402
+ }
403
+ }
404
+ }
405
+ return [2 /*return*/, priceDict];
406
+ }
407
+ });
408
+ }); };
409
+ exports._getUsdPricesFromApi = _getUsdPricesFromApi;
377
410
  var _usdRatesCache = {};
378
411
  var _getUsdRate = function (assetId) { return __awaiter(void 0, void 0, void 0, function () {
379
- var chainName, url, response;
412
+ var pricesFromApi, chainName, url, response;
380
413
  var _a, _b;
381
414
  return __generator(this, function (_c) {
382
415
  switch (_c.label) {
383
- case 0:
416
+ case 0: return [4 /*yield*/, (0, exports._getUsdPricesFromApi)()];
417
+ case 1:
418
+ pricesFromApi = _c.sent();
419
+ if (assetId.toLowerCase() in pricesFromApi)
420
+ return [2 /*return*/, pricesFromApi[assetId.toLowerCase()]];
384
421
  if (assetId === 'USD' || (curve_1.curve.chainId === 137 && (assetId.toLowerCase() === curve_2.COINS.am3crv.toLowerCase())))
385
422
  return [2 /*return*/, 1];
386
423
  chainName = {
@@ -403,12 +440,12 @@ var _getUsdRate = function (assetId) { return __awaiter(void 0, void 0, void 0,
403
440
  chainName = 'ethereum';
404
441
  assetId = '0xC581b735A1688071A1746c968e0798D642EDE491'.toLowerCase(); // EURT Ethereum
405
442
  }
406
- if (!((((_a = _usdRatesCache[assetId]) === null || _a === void 0 ? void 0 : _a.time) || 0) + 600000 < Date.now())) return [3 /*break*/, 2];
443
+ if (!((((_a = _usdRatesCache[assetId]) === null || _a === void 0 ? void 0 : _a.time) || 0) + 600000 < Date.now())) return [3 /*break*/, 3];
407
444
  url = ['bitcoin', 'ethereum', 'link'].includes(assetId.toLowerCase()) ?
408
445
  "https://api.coingecko.com/api/v3/simple/price?ids=".concat(assetId, "&vs_currencies=usd") :
409
446
  "https://api.coingecko.com/api/v3/simple/token_price/".concat(chainName, "?contract_addresses=").concat(assetId, "&vs_currencies=usd");
410
447
  return [4 /*yield*/, axios_1.default.get(url)];
411
- case 1:
448
+ case 2:
412
449
  response = _c.sent();
413
450
  try {
414
451
  _usdRatesCache[assetId] = { 'rate': (_b = response.data[assetId]['usd']) !== null && _b !== void 0 ? _b : 1, 'time': Date.now() };
@@ -416,8 +453,8 @@ var _getUsdRate = function (assetId) { return __awaiter(void 0, void 0, void 0,
416
453
  catch (err) { // TODO pay attention!
417
454
  _usdRatesCache[assetId] = { 'rate': 1, 'time': Date.now() };
418
455
  }
419
- _c.label = 2;
420
- case 2: return [2 /*return*/, _usdRatesCache[assetId]['rate']];
456
+ _c.label = 3;
457
+ case 3: return [2 /*return*/, _usdRatesCache[assetId]['rate']];
421
458
  }
422
459
  });
423
460
  }); };
@@ -546,3 +583,26 @@ var getUsdRate = function (coin) { return __awaiter(void 0, void 0, void 0, func
546
583
  });
547
584
  }); };
548
585
  exports.getUsdRate = getUsdRate;
586
+ var getTVL = function (chainId) {
587
+ if (chainId === void 0) { chainId = curve_1.curve.chainId; }
588
+ return __awaiter(void 0, void 0, void 0, function () {
589
+ var network, promises, allTypesExtendedPoolData;
590
+ return __generator(this, function (_a) {
591
+ switch (_a.label) {
592
+ case 0:
593
+ network = chainId === 137 ? "polygon" : "ethereum";
594
+ promises = [
595
+ (0, external_api_1._getPoolsFromApi)(network, "main"),
596
+ (0, external_api_1._getPoolsFromApi)(network, "crypto"),
597
+ (0, external_api_1._getPoolsFromApi)(network, "factory"),
598
+ (0, external_api_1._getPoolsFromApi)(network, "factory-crypto"),
599
+ ];
600
+ return [4 /*yield*/, Promise.all(promises)];
601
+ case 1:
602
+ allTypesExtendedPoolData = _a.sent();
603
+ return [2 /*return*/, allTypesExtendedPoolData.reduce(function (sum, data) { var _a; return sum + ((_a = data.tvl) !== null && _a !== void 0 ? _a : data.tvlAll); }, 0)];
604
+ }
605
+ });
606
+ });
607
+ };
608
+ exports.getTVL = getTVL;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curvefi/api",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "JavaScript library for curve.fi",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {