@curvefi/api 2.63.0 → 2.63.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 (83) hide show
  1. package/lib/boosting.js +247 -645
  2. package/lib/constants/L2Networks.js +1 -1
  3. package/lib/constants/aliases.js +19 -19
  4. package/lib/constants/coins/arbitrum.js +5 -5
  5. package/lib/constants/coins/aurora.js +5 -5
  6. package/lib/constants/coins/avalanche.js +6 -6
  7. package/lib/constants/coins/base.js +5 -5
  8. package/lib/constants/coins/bsc.js +5 -5
  9. package/lib/constants/coins/celo.js +5 -5
  10. package/lib/constants/coins/ethereum.js +9 -9
  11. package/lib/constants/coins/fantom.js +7 -7
  12. package/lib/constants/coins/fraxtal.js +5 -5
  13. package/lib/constants/coins/kava.js +5 -5
  14. package/lib/constants/coins/mantle.js +5 -5
  15. package/lib/constants/coins/moonbeam.js +5 -5
  16. package/lib/constants/coins/optimism.js +5 -5
  17. package/lib/constants/coins/polygon.js +6 -6
  18. package/lib/constants/coins/xdai.js +5 -5
  19. package/lib/constants/coins/xlayer.js +5 -5
  20. package/lib/constants/coins/zksync.js +5 -5
  21. package/lib/constants/pools/arbitrum.js +1 -1
  22. package/lib/constants/pools/aurora.js +1 -1
  23. package/lib/constants/pools/avalanche.js +1 -1
  24. package/lib/constants/pools/base.js +1 -1
  25. package/lib/constants/pools/bsc.js +1 -1
  26. package/lib/constants/pools/celo.js +1 -1
  27. package/lib/constants/pools/ethereum.js +2 -2
  28. package/lib/constants/pools/fantom.js +1 -1
  29. package/lib/constants/pools/fraxtal.js +1 -1
  30. package/lib/constants/pools/kava.js +1 -1
  31. package/lib/constants/pools/mantle.js +1 -1
  32. package/lib/constants/pools/moonbeam.js +1 -1
  33. package/lib/constants/pools/optimism.js +1 -1
  34. package/lib/constants/pools/polygon.js +1 -1
  35. package/lib/constants/pools/xdai.js +1 -1
  36. package/lib/constants/pools/xlayer.js +1 -1
  37. package/lib/constants/pools/zksync.js +1 -1
  38. package/lib/constants/tricryptoDeployImplementations.js +1 -1
  39. package/lib/constants/utils.js +18 -19
  40. package/lib/constants/volumeNetworks.js +1 -1
  41. package/lib/curve.d.ts +10 -6
  42. package/lib/curve.js +534 -909
  43. package/lib/dao.js +351 -705
  44. package/lib/external-api.js +127 -256
  45. package/lib/factory/common.js +4 -4
  46. package/lib/factory/constants-crypto.js +33 -33
  47. package/lib/factory/constants.js +34 -34
  48. package/lib/factory/deploy.js +542 -907
  49. package/lib/factory/factory-api.js +205 -269
  50. package/lib/factory/factory-crypto.js +202 -342
  51. package/lib/factory/factory-tricrypto.js +164 -286
  52. package/lib/factory/factory-twocrypto.js +151 -269
  53. package/lib/factory/factory.js +245 -385
  54. package/lib/index.js +109 -198
  55. package/lib/interfaces.d.ts +46 -6
  56. package/lib/pools/PoolTemplate.js +1774 -3027
  57. package/lib/pools/gaugePool.js +112 -251
  58. package/lib/pools/mixins/common.js +22 -93
  59. package/lib/pools/mixins/depositBalancedAmountsMixins.js +52 -118
  60. package/lib/pools/mixins/depositMixins.js +160 -386
  61. package/lib/pools/mixins/depositWrappedMixins.js +79 -205
  62. package/lib/pools/mixins/poolBalancesMixin.js +24 -87
  63. package/lib/pools/mixins/swapMixins.js +139 -324
  64. package/lib/pools/mixins/swapWrappedMixins.js +111 -265
  65. package/lib/pools/mixins/withdrawExpectedMixins.js +27 -91
  66. package/lib/pools/mixins/withdrawImbalanceMixins.js +111 -293
  67. package/lib/pools/mixins/withdrawImbalanceWrappedMixins.js +58 -169
  68. package/lib/pools/mixins/withdrawMixins.js +139 -359
  69. package/lib/pools/mixins/withdrawOneCoinExpectedMixins.js +20 -75
  70. package/lib/pools/mixins/withdrawOneCoinMixins.js +140 -360
  71. package/lib/pools/mixins/withdrawOneCoinWrappedExpectedMixins.js +10 -51
  72. package/lib/pools/mixins/withdrawOneCoinWrappedMixins.js +60 -167
  73. package/lib/pools/mixins/withdrawWrappedMixins.js +57 -167
  74. package/lib/pools/poolConstructor.js +11 -31
  75. package/lib/pools/utils.js +301 -469
  76. package/lib/route-finder.worker.d.ts +9 -0
  77. package/lib/route-finder.worker.js +112 -0
  78. package/lib/route-graph.worker.d.ts +11 -0
  79. package/lib/route-graph.worker.js +334 -0
  80. package/lib/router.js +323 -912
  81. package/lib/utils.d.ts +8 -7
  82. package/lib/utils.js +540 -927
  83. package/package.json +3 -2
package/lib/utils.js CHANGED
@@ -1,14 +1,3 @@
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
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -18,94 +7,53 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
18
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
19
8
  });
20
9
  };
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
10
  import axios from 'axios';
58
11
  import { Contract } from 'ethers';
59
12
  import { Contract as MulticallContract } from "@curvefi/ethcall";
60
13
  import BigNumber from 'bignumber.js';
61
14
  import { curve, NETWORK_CONSTANTS } from "./curve.js";
62
- import { _getAllPoolsFromApi, _getFactoryAPYs, _getSubgraphData, _getVolumes, } from "./external-api.js";
15
+ import { _getAllPoolsFromApi, _getFactoryAPYs, _getSubgraphData, _getVolumes } from "./external-api.js";
63
16
  import ERC20Abi from './constants/abis/ERC20.json' assert { type: 'json' };
64
17
  import { L2Networks } from './constants/L2Networks.js';
65
18
  import { volumeNetworks } from "./constants/volumeNetworks.js";
66
19
  import { getPool } from "./pools/index.js";
67
- export var ETH_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
20
+ export const ETH_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
68
21
  // export const MAX_ALLOWANCE = curve.parseUnits(new BigNumber(2).pow(256).minus(1).toFixed(), 0);
69
- export var MAX_ALLOWANCE = BigInt("115792089237316195423570985008687907853269984665640564039457584007913129639935"); // 2**256 - 1
22
+ export const MAX_ALLOWANCE = BigInt("115792089237316195423570985008687907853269984665640564039457584007913129639935"); // 2**256 - 1
70
23
  // Formatting numbers
71
- export var _cutZeros = function (strn) {
24
+ export const _cutZeros = (strn) => {
72
25
  return strn.replace(/(\.\d*[1-9])0+$/gi, '$1').replace(/\.0+$/gi, '');
73
26
  };
74
- export var checkNumber = function (n) {
27
+ export const checkNumber = (n) => {
75
28
  if (Number(n) !== Number(n))
76
- throw Error("".concat(n, " is not a number")); // NaN
29
+ throw Error(`${n} is not a number`); // NaN
77
30
  return n;
78
31
  };
79
- export var formatNumber = function (n, decimals) {
80
- if (decimals === void 0) { decimals = 18; }
32
+ export const formatNumber = (n, decimals = 18) => {
81
33
  if (Number(n) !== Number(n))
82
- throw Error("".concat(n, " is not a number")); // NaN
83
- var _a = String(n).split("."), integer = _a[0], fractional = _a[1];
34
+ throw Error(`${n} is not a number`); // NaN
35
+ const [integer, fractional] = String(n).split(".");
84
36
  return !fractional ? integer : integer + "." + fractional.slice(0, decimals);
85
37
  };
86
- export var parseUnits = function (n, decimals) {
87
- if (decimals === void 0) { decimals = 18; }
38
+ export const parseUnits = (n, decimals = 18) => {
88
39
  return curve.parseUnits(formatNumber(n, decimals), decimals);
89
40
  };
90
41
  // bignumber.js
91
- export var BN = function (val) { return new BigNumber(checkNumber(val)); };
92
- export var toBN = function (n, decimals) {
93
- if (decimals === void 0) { decimals = 18; }
42
+ export const BN = (val) => new BigNumber(checkNumber(val));
43
+ export const toBN = (n, decimals = 18) => {
94
44
  return BN(curve.formatUnits(n, decimals));
95
45
  };
96
- export var toStringFromBN = function (bn, decimals) {
97
- if (decimals === void 0) { decimals = 18; }
46
+ export const toStringFromBN = (bn, decimals = 18) => {
98
47
  return bn.toFixed(decimals);
99
48
  };
100
- export var fromBN = function (bn, decimals) {
101
- if (decimals === void 0) { decimals = 18; }
49
+ export const fromBN = (bn, decimals = 18) => {
102
50
  return curve.parseUnits(toStringFromBN(bn, decimals), decimals);
103
51
  };
104
52
  // -------------------
105
- export var isEth = function (address) { return address.toLowerCase() === ETH_ADDRESS.toLowerCase(); };
106
- export var getEthIndex = function (addresses) { return addresses.map(function (address) { return address.toLowerCase(); }).indexOf(ETH_ADDRESS.toLowerCase()); };
107
- export var mulBy1_3 = function (n) { return n * curve.parseUnits("130", 0) / curve.parseUnits("100", 0); };
108
- export var smartNumber = function (abstractNumber) {
53
+ export const isEth = (address) => address.toLowerCase() === ETH_ADDRESS.toLowerCase();
54
+ export const getEthIndex = (addresses) => addresses.map((address) => address.toLowerCase()).indexOf(ETH_ADDRESS.toLowerCase());
55
+ export const mulBy1_3 = (n) => n * curve.parseUnits("130", 0) / curve.parseUnits("100", 0);
56
+ export const smartNumber = (abstractNumber) => {
109
57
  if (Array.isArray(abstractNumber)) {
110
58
  return [Number(abstractNumber[0]), Number(abstractNumber[1])];
111
59
  }
@@ -113,7 +61,7 @@ export var smartNumber = function (abstractNumber) {
113
61
  return Number(abstractNumber);
114
62
  }
115
63
  };
116
- export var DIGas = function (gas) {
64
+ export const DIGas = (gas) => {
117
65
  if (Array.isArray(gas)) {
118
66
  return gas[0];
119
67
  }
@@ -121,7 +69,7 @@ export var DIGas = function (gas) {
121
69
  return gas;
122
70
  }
123
71
  };
124
- export var getGasFromArray = function (gas) {
72
+ export const getGasFromArray = (gas) => {
125
73
  if (gas[1] === 0) {
126
74
  return gas[0];
127
75
  }
@@ -129,7 +77,7 @@ export var getGasFromArray = function (gas) {
129
77
  return gas;
130
78
  }
131
79
  };
132
- export var gasSum = function (gas, currentGas) {
80
+ export const gasSum = (gas, currentGas) => {
133
81
  if (Array.isArray(currentGas)) {
134
82
  gas[0] = gas[0] + currentGas[0];
135
83
  gas[1] = gas[1] + currentGas[1];
@@ -140,701 +88,445 @@ export var gasSum = function (gas, currentGas) {
140
88
  return gas;
141
89
  };
142
90
  // coins can be either addresses or symbols
143
- export var _getCoinAddressesNoCheck = function () {
144
- var coins = [];
145
- for (var _i = 0; _i < arguments.length; _i++) {
146
- coins[_i] = arguments[_i];
147
- }
91
+ export const _getCoinAddressesNoCheck = (...coins) => {
148
92
  if (coins.length == 1 && Array.isArray(coins[0]))
149
93
  coins = coins[0];
150
94
  coins = coins;
151
- return coins.map(function (c) { return c.toLowerCase(); }).map(function (c) { return curve.constants.COINS[c] || c; });
95
+ return coins.map((c) => c.toLowerCase()).map((c) => curve.constants.COINS[c] || c);
152
96
  };
153
- export var _getCoinAddresses = function () {
154
- var coins = [];
155
- for (var _i = 0; _i < arguments.length; _i++) {
156
- coins[_i] = arguments[_i];
157
- }
158
- var coinAddresses = _getCoinAddressesNoCheck.apply(void 0, coins);
159
- var availableAddresses = __spreadArray(__spreadArray([], Object.keys(curve.constants.DECIMALS), true), curve.constants.GAUGES, true);
160
- for (var _a = 0, coinAddresses_1 = coinAddresses; _a < coinAddresses_1.length; _a++) {
161
- var coinAddr = coinAddresses_1[_a];
97
+ export const _getCoinAddresses = (...coins) => {
98
+ const coinAddresses = _getCoinAddressesNoCheck(...coins);
99
+ const availableAddresses = [...Object.keys(curve.constants.DECIMALS), ...curve.constants.GAUGES];
100
+ for (const coinAddr of coinAddresses) {
162
101
  if (!availableAddresses.includes(coinAddr))
163
- throw Error("Coin with address '".concat(coinAddr, "' is not available"));
102
+ throw Error(`Coin with address '${coinAddr}' is not available`);
164
103
  }
165
104
  return coinAddresses;
166
105
  };
167
- export var _getCoinDecimals = function () {
168
- var coinAddresses = [];
169
- for (var _i = 0; _i < arguments.length; _i++) {
170
- coinAddresses[_i] = arguments[_i];
171
- }
106
+ export const _getCoinDecimals = (...coinAddresses) => {
172
107
  if (coinAddresses.length == 1 && Array.isArray(coinAddresses[0]))
173
108
  coinAddresses = coinAddresses[0];
174
109
  coinAddresses = coinAddresses;
175
- return coinAddresses.map(function (coinAddr) { var _a; return (_a = curve.constants.DECIMALS[coinAddr.toLowerCase()]) !== null && _a !== void 0 ? _a : 18; }); // 18 for gauges
176
- };
177
- export var _getBalances = function (coins, addresses) { return __awaiter(void 0, void 0, void 0, function () {
178
- var coinAddresses, decimals, ethIndex, contractCalls, _loop_1, _i, coinAddresses_2, coinAddr, _response, ethBalances, _a, addresses_1, address, _b, _c, _balances, balances, _d, addresses_2, address;
179
- return __generator(this, function (_e) {
180
- switch (_e.label) {
181
- case 0:
182
- coinAddresses = _getCoinAddresses(coins);
183
- decimals = _getCoinDecimals(coinAddresses);
184
- ethIndex = getEthIndex(coinAddresses);
185
- if (ethIndex !== -1) {
186
- coinAddresses.splice(ethIndex, 1);
187
- }
188
- contractCalls = [];
189
- _loop_1 = function (coinAddr) {
190
- contractCalls.push.apply(contractCalls, addresses.map(function (address) { return curve.contracts[coinAddr].multicallContract.balanceOf(address); }));
191
- };
192
- for (_i = 0, coinAddresses_2 = coinAddresses; _i < coinAddresses_2.length; _i++) {
193
- coinAddr = coinAddresses_2[_i];
194
- _loop_1(coinAddr);
195
- }
196
- return [4 /*yield*/, curve.multicallProvider.all(contractCalls)];
197
- case 1:
198
- _response = _e.sent();
199
- if (!(ethIndex !== -1)) return [3 /*break*/, 6];
200
- ethBalances = [];
201
- _a = 0, addresses_1 = addresses;
202
- _e.label = 2;
203
- case 2:
204
- if (!(_a < addresses_1.length)) return [3 /*break*/, 5];
205
- address = addresses_1[_a];
206
- _c = (_b = ethBalances).push;
207
- return [4 /*yield*/, curve.provider.getBalance(address)];
208
- case 3:
209
- _c.apply(_b, [_e.sent()]);
210
- _e.label = 4;
211
- case 4:
212
- _a++;
213
- return [3 /*break*/, 2];
214
- case 5:
215
- _response.splice.apply(_response, __spreadArray([ethIndex * addresses.length, 0], ethBalances, false));
216
- _e.label = 6;
217
- case 6:
218
- _balances = {};
219
- addresses.forEach(function (address, i) {
220
- _balances[address] = coins.map(function (_, j) { return _response[i + (j * addresses.length)]; });
221
- });
222
- balances = {};
223
- for (_d = 0, addresses_2 = addresses; _d < addresses_2.length; _d++) {
224
- address = addresses_2[_d];
225
- balances[address] = _balances[address].map(function (b, i) { return curve.formatUnits(b, decimals[i]); });
226
- }
227
- return [2 /*return*/, balances];
110
+ return coinAddresses.map((coinAddr) => { var _a; return (_a = curve.constants.DECIMALS[coinAddr.toLowerCase()]) !== null && _a !== void 0 ? _a : 18; }); // 18 for gauges
111
+ };
112
+ export const _getBalances = (coins, addresses) => __awaiter(void 0, void 0, void 0, function* () {
113
+ const coinAddresses = _getCoinAddresses(coins);
114
+ const decimals = _getCoinDecimals(coinAddresses);
115
+ const ethIndex = getEthIndex(coinAddresses);
116
+ if (ethIndex !== -1) {
117
+ coinAddresses.splice(ethIndex, 1);
118
+ }
119
+ const contractCalls = [];
120
+ for (const coinAddr of coinAddresses) {
121
+ contractCalls.push(...addresses.map((address) => curve.contracts[coinAddr].multicallContract.balanceOf(address)));
122
+ }
123
+ const _response = yield curve.multicallProvider.all(contractCalls);
124
+ if (ethIndex !== -1) {
125
+ const ethBalances = [];
126
+ for (const address of addresses) {
127
+ ethBalances.push(yield curve.provider.getBalance(address));
228
128
  }
129
+ _response.splice(ethIndex * addresses.length, 0, ...ethBalances);
130
+ }
131
+ const _balances = {};
132
+ addresses.forEach((address, i) => {
133
+ _balances[address] = coins.map((_, j) => _response[i + (j * addresses.length)]);
229
134
  });
230
- }); };
231
- export var _prepareAddresses = function (addresses) {
135
+ const balances = {};
136
+ for (const address of addresses) {
137
+ balances[address] = _balances[address].map((b, i) => curve.formatUnits(b, decimals[i]));
138
+ }
139
+ return balances;
140
+ });
141
+ export const _prepareAddresses = (addresses) => {
232
142
  if (addresses.length == 1 && Array.isArray(addresses[0]))
233
143
  addresses = addresses[0];
234
144
  if (addresses.length === 0 && curve.signerAddress !== '')
235
145
  addresses = [curve.signerAddress];
236
146
  addresses = addresses;
237
- return addresses.filter(function (val, idx, arr) { return arr.indexOf(val) === idx; });
147
+ return addresses.filter((val, idx, arr) => arr.indexOf(val) === idx);
238
148
  };
239
- export var _getAddress = function (address) {
149
+ export const _getAddress = (address) => {
240
150
  address = address || curve.signerAddress;
241
151
  if (!address)
242
152
  throw Error("Need to connect wallet or pass address into args");
243
153
  return address;
244
154
  };
245
- export var getBalances = function (coins) {
246
- var addresses = [];
247
- for (var _i = 1; _i < arguments.length; _i++) {
248
- addresses[_i - 1] = arguments[_i];
155
+ export const getBalances = (coins, ...addresses) => __awaiter(void 0, void 0, void 0, function* () {
156
+ addresses = _prepareAddresses(addresses);
157
+ const balances = yield _getBalances(coins, addresses);
158
+ return addresses.length === 1 ? balances[addresses[0]] : balances;
159
+ });
160
+ export const _getAllowance = (coins, address, spender) => __awaiter(void 0, void 0, void 0, function* () {
161
+ const _coins = [...coins];
162
+ const ethIndex = getEthIndex(_coins);
163
+ if (ethIndex !== -1) {
164
+ _coins.splice(ethIndex, 1);
165
+ }
166
+ let allowance;
167
+ if (_coins.length === 1) {
168
+ allowance = [yield curve.contracts[_coins[0]].contract.allowance(address, spender, curve.constantOptions)];
249
169
  }
250
- return __awaiter(void 0, void 0, void 0, function () {
251
- var balances;
252
- return __generator(this, function (_a) {
253
- switch (_a.label) {
254
- case 0:
255
- addresses = _prepareAddresses(addresses);
256
- return [4 /*yield*/, _getBalances(coins, addresses)];
257
- case 1:
258
- balances = _a.sent();
259
- return [2 /*return*/, addresses.length === 1 ? balances[addresses[0]] : balances];
260
- }
261
- });
262
- });
263
- };
264
- export var _getAllowance = function (coins, address, spender) { return __awaiter(void 0, void 0, void 0, function () {
265
- var _coins, ethIndex, allowance, contractCalls;
266
- return __generator(this, function (_a) {
267
- switch (_a.label) {
268
- case 0:
269
- _coins = __spreadArray([], coins, true);
270
- ethIndex = getEthIndex(_coins);
271
- if (ethIndex !== -1) {
272
- _coins.splice(ethIndex, 1);
273
- }
274
- if (!(_coins.length === 1)) return [3 /*break*/, 2];
275
- return [4 /*yield*/, curve.contracts[_coins[0]].contract.allowance(address, spender, curve.constantOptions)];
276
- case 1:
277
- allowance = [_a.sent()];
278
- return [3 /*break*/, 4];
279
- case 2:
280
- contractCalls = _coins.map(function (coinAddr) { return curve.contracts[coinAddr].multicallContract.allowance(address, spender); });
281
- return [4 /*yield*/, curve.multicallProvider.all(contractCalls)];
282
- case 3:
283
- allowance = _a.sent();
284
- _a.label = 4;
285
- case 4:
286
- if (ethIndex !== -1) {
287
- allowance.splice(ethIndex, 0, MAX_ALLOWANCE);
288
- }
289
- return [2 /*return*/, allowance];
290
- }
291
- });
292
- }); };
170
+ else {
171
+ const contractCalls = _coins.map((coinAddr) => curve.contracts[coinAddr].multicallContract.allowance(address, spender));
172
+ allowance = yield curve.multicallProvider.all(contractCalls);
173
+ }
174
+ if (ethIndex !== -1) {
175
+ allowance.splice(ethIndex, 0, MAX_ALLOWANCE);
176
+ }
177
+ return allowance;
178
+ });
293
179
  // coins can be either addresses or symbols
294
- export var getAllowance = function (coins, address, spender) { return __awaiter(void 0, void 0, void 0, function () {
295
- var coinAddresses, decimals, _allowance;
296
- return __generator(this, function (_a) {
297
- switch (_a.label) {
298
- case 0:
299
- coinAddresses = _getCoinAddresses(coins);
300
- decimals = _getCoinDecimals(coinAddresses);
301
- return [4 /*yield*/, _getAllowance(coinAddresses, address, spender)];
302
- case 1:
303
- _allowance = _a.sent();
304
- return [2 /*return*/, _allowance.map(function (a, i) { return curve.formatUnits(a, decimals[i]); })];
305
- }
306
- });
307
- }); };
180
+ export const getAllowance = (coins, address, spender) => __awaiter(void 0, void 0, void 0, function* () {
181
+ const coinAddresses = _getCoinAddresses(coins);
182
+ const decimals = _getCoinDecimals(coinAddresses);
183
+ const _allowance = yield _getAllowance(coinAddresses, address, spender);
184
+ return _allowance.map((a, i) => curve.formatUnits(a, decimals[i]));
185
+ });
308
186
  // coins can be either addresses or symbols
309
- export var hasAllowance = function (coins, amounts, address, spender) { return __awaiter(void 0, void 0, void 0, function () {
310
- var coinAddresses, decimals, _allowance, _amounts;
311
- return __generator(this, function (_a) {
312
- switch (_a.label) {
313
- case 0:
314
- coinAddresses = _getCoinAddresses(coins);
315
- decimals = _getCoinDecimals(coinAddresses);
316
- return [4 /*yield*/, _getAllowance(coinAddresses, address, spender)];
317
- case 1:
318
- _allowance = _a.sent();
319
- _amounts = amounts.map(function (a, i) { return parseUnits(a, decimals[i]); });
320
- return [2 /*return*/, _allowance.map(function (a, i) { return a >= _amounts[i]; }).reduce(function (a, b) { return a && b; })];
321
- }
322
- });
323
- }); };
324
- export var _ensureAllowance = function (coins, amounts, spender, isMax) {
325
- if (isMax === void 0) { isMax = true; }
326
- return __awaiter(void 0, void 0, void 0, function () {
327
- var address, allowance, txHashes, i, contract, _approveAmount, gasLimit_1, _a, _b, resetTx, gasLimit, _c, _d, approveTx;
328
- return __generator(this, function (_e) {
329
- switch (_e.label) {
330
- case 0:
331
- address = curve.signerAddress;
332
- return [4 /*yield*/, _getAllowance(coins, address, spender)];
333
- case 1:
334
- allowance = _e.sent();
335
- txHashes = [];
336
- i = 0;
337
- _e.label = 2;
338
- case 2:
339
- if (!(i < allowance.length)) return [3 /*break*/, 12];
340
- if (!(allowance[i] < amounts[i])) return [3 /*break*/, 11];
341
- contract = curve.contracts[coins[i]].contract;
342
- _approveAmount = isMax ? MAX_ALLOWANCE : amounts[i];
343
- return [4 /*yield*/, curve.updateFeeData()];
344
- case 3:
345
- _e.sent();
346
- if (!(allowance[i] > curve.parseUnits("0"))) return [3 /*break*/, 7];
347
- _a = mulBy1_3;
348
- _b = DIGas;
349
- return [4 /*yield*/, contract.approve.estimateGas(spender, curve.parseUnits("0"), curve.constantOptions)];
350
- case 4:
351
- gasLimit_1 = _a.apply(void 0, [_b.apply(void 0, [_e.sent()])]);
352
- return [4 /*yield*/, contract.approve(spender, curve.parseUnits("0"), __assign(__assign({}, curve.options), { gasLimit: gasLimit_1 }))];
353
- case 5:
354
- resetTx = _e.sent();
355
- txHashes.push(resetTx.hash);
356
- return [4 /*yield*/, resetTx.wait()];
357
- case 6:
358
- _e.sent();
359
- _e.label = 7;
360
- case 7:
361
- _c = mulBy1_3;
362
- _d = DIGas;
363
- return [4 /*yield*/, contract.approve.estimateGas(spender, _approveAmount, curve.constantOptions)];
364
- case 8:
365
- gasLimit = _c.apply(void 0, [_d.apply(void 0, [_e.sent()])]);
366
- return [4 /*yield*/, contract.approve(spender, _approveAmount, __assign(__assign({}, curve.options), { gasLimit: gasLimit }))];
367
- case 9:
368
- approveTx = _e.sent();
369
- txHashes.push(approveTx.hash);
370
- return [4 /*yield*/, approveTx.wait()];
371
- case 10:
372
- _e.sent();
373
- _e.label = 11;
374
- case 11:
375
- i++;
376
- return [3 /*break*/, 2];
377
- case 12: return [2 /*return*/, txHashes];
187
+ export const hasAllowance = (coins, amounts, address, spender) => __awaiter(void 0, void 0, void 0, function* () {
188
+ const coinAddresses = _getCoinAddresses(coins);
189
+ const decimals = _getCoinDecimals(coinAddresses);
190
+ const _allowance = yield _getAllowance(coinAddresses, address, spender);
191
+ const _amounts = amounts.map((a, i) => parseUnits(a, decimals[i]));
192
+ return _allowance.map((a, i) => a >= _amounts[i]).reduce((a, b) => a && b);
193
+ });
194
+ export const _ensureAllowance = (coins, amounts, spender, isMax = true) => __awaiter(void 0, void 0, void 0, function* () {
195
+ const address = curve.signerAddress;
196
+ const allowance = yield _getAllowance(coins, address, spender);
197
+ const txHashes = [];
198
+ for (let i = 0; i < allowance.length; i++) {
199
+ if (allowance[i] < amounts[i]) {
200
+ const contract = curve.contracts[coins[i]].contract;
201
+ const _approveAmount = isMax ? MAX_ALLOWANCE : amounts[i];
202
+ yield curve.updateFeeData();
203
+ if (allowance[i] > curve.parseUnits("0")) {
204
+ const gasLimit = mulBy1_3(DIGas(yield contract.approve.estimateGas(spender, curve.parseUnits("0"), curve.constantOptions)));
205
+ const resetTx = yield contract.approve(spender, curve.parseUnits("0"), Object.assign(Object.assign({}, curve.options), { gasLimit }));
206
+ txHashes.push(resetTx.hash);
207
+ yield resetTx.wait();
378
208
  }
379
- });
380
- });
381
- };
209
+ const gasLimit = mulBy1_3(DIGas(yield contract.approve.estimateGas(spender, _approveAmount, curve.constantOptions)));
210
+ const approveTx = yield contract.approve(spender, _approveAmount, Object.assign(Object.assign({}, curve.options), { gasLimit }));
211
+ txHashes.push(approveTx.hash);
212
+ yield approveTx.wait();
213
+ }
214
+ }
215
+ return txHashes;
216
+ });
382
217
  // coins can be either addresses or symbols
383
- export var ensureAllowanceEstimateGas = function (coins, amounts, spender, isMax) {
384
- if (isMax === void 0) { isMax = true; }
385
- return __awaiter(void 0, void 0, void 0, function () {
386
- var coinAddresses, decimals, _amounts, address, _allowance, gas, i, contract, _approveAmount, currentGas, _a, currentGas, _b;
387
- return __generator(this, function (_c) {
388
- switch (_c.label) {
389
- case 0:
390
- coinAddresses = _getCoinAddresses(coins);
391
- decimals = _getCoinDecimals(coinAddresses);
392
- _amounts = amounts.map(function (a, i) { return parseUnits(a, decimals[i]); });
393
- address = curve.signerAddress;
394
- return [4 /*yield*/, _getAllowance(coinAddresses, address, spender)];
395
- case 1:
396
- _allowance = _c.sent();
397
- gas = [0, 0];
398
- i = 0;
399
- _c.label = 2;
400
- case 2:
401
- if (!(i < _allowance.length)) return [3 /*break*/, 7];
402
- if (!(_allowance[i] < _amounts[i])) return [3 /*break*/, 6];
403
- contract = curve.contracts[coinAddresses[i]].contract;
404
- _approveAmount = isMax ? MAX_ALLOWANCE : _amounts[i];
405
- if (!(_allowance[i] > curve.parseUnits("0"))) return [3 /*break*/, 4];
406
- _a = smartNumber;
407
- return [4 /*yield*/, contract.approve.estimateGas(spender, curve.parseUnits("0"), curve.constantOptions)];
408
- case 3:
409
- currentGas = _a.apply(void 0, [_c.sent()]);
410
- // For some coins (crv for example ) we can't estimate the second tx gas (approve: 0 --> amount), so we assume it will cost the same amount of gas
411
- if (typeof currentGas === "number") {
412
- currentGas = currentGas * 2;
413
- }
414
- else {
415
- currentGas = currentGas.map(function (g) { return g * 2; });
416
- }
417
- gas = gasSum(gas, currentGas);
418
- return [3 /*break*/, 6];
419
- case 4:
420
- _b = smartNumber;
421
- return [4 /*yield*/, contract.approve.estimateGas(spender, _approveAmount, curve.constantOptions)];
422
- case 5:
423
- currentGas = _b.apply(void 0, [_c.sent()]);
424
- gas = gasSum(gas, currentGas);
425
- _c.label = 6;
426
- case 6:
427
- i++;
428
- return [3 /*break*/, 2];
429
- case 7: return [2 /*return*/, getGasFromArray(gas)];
218
+ export const ensureAllowanceEstimateGas = (coins, amounts, spender, isMax = true) => __awaiter(void 0, void 0, void 0, function* () {
219
+ const coinAddresses = _getCoinAddresses(coins);
220
+ const decimals = _getCoinDecimals(coinAddresses);
221
+ const _amounts = amounts.map((a, i) => parseUnits(a, decimals[i]));
222
+ const address = curve.signerAddress;
223
+ const _allowance = yield _getAllowance(coinAddresses, address, spender);
224
+ let gas = [0, 0];
225
+ for (let i = 0; i < _allowance.length; i++) {
226
+ if (_allowance[i] < _amounts[i]) {
227
+ const contract = curve.contracts[coinAddresses[i]].contract;
228
+ const _approveAmount = isMax ? MAX_ALLOWANCE : _amounts[i];
229
+ if (_allowance[i] > curve.parseUnits("0")) {
230
+ let currentGas = smartNumber(yield contract.approve.estimateGas(spender, curve.parseUnits("0"), curve.constantOptions));
231
+ // For some coins (crv for example ) we can't estimate the second tx gas (approve: 0 --> amount), so we assume it will cost the same amount of gas
232
+ if (typeof currentGas === "number") {
233
+ currentGas = currentGas * 2;
234
+ }
235
+ else {
236
+ currentGas = currentGas.map((g) => g * 2);
237
+ }
238
+ gas = gasSum(gas, currentGas);
430
239
  }
431
- });
432
- });
433
- };
434
- // coins can be either addresses or symbols
435
- export var ensureAllowance = function (coins, amounts, spender, isMax) {
436
- if (isMax === void 0) { isMax = true; }
437
- return __awaiter(void 0, void 0, void 0, function () {
438
- var coinAddresses, decimals, _amounts;
439
- return __generator(this, function (_a) {
440
- switch (_a.label) {
441
- case 0:
442
- coinAddresses = _getCoinAddresses(coins);
443
- decimals = _getCoinDecimals(coinAddresses);
444
- _amounts = amounts.map(function (a, i) { return parseUnits(a, decimals[i]); });
445
- return [4 /*yield*/, _ensureAllowance(coinAddresses, _amounts, spender, isMax)];
446
- case 1: return [2 /*return*/, _a.sent()];
240
+ else {
241
+ const currentGas = smartNumber(yield contract.approve.estimateGas(spender, _approveAmount, curve.constantOptions));
242
+ gas = gasSum(gas, currentGas);
447
243
  }
448
- });
449
- });
450
- };
451
- export var getPoolIdBySwapAddress = function (swapAddress) {
452
- var poolsData = curve.getPoolsData();
453
- var poolIds = Object.entries(poolsData).filter(function (_a) {
454
- var _ = _a[0], poolData = _a[1];
455
- return poolData.swap_address.toLowerCase() === swapAddress.toLowerCase();
456
- });
244
+ }
245
+ }
246
+ return getGasFromArray(gas);
247
+ });
248
+ // coins can be either addresses or symbols
249
+ export const ensureAllowance = (coins, amounts, spender, isMax = true) => __awaiter(void 0, void 0, void 0, function* () {
250
+ const coinAddresses = _getCoinAddresses(coins);
251
+ const decimals = _getCoinDecimals(coinAddresses);
252
+ const _amounts = amounts.map((a, i) => parseUnits(a, decimals[i]));
253
+ return yield _ensureAllowance(coinAddresses, _amounts, spender, isMax);
254
+ });
255
+ export const getPoolIdBySwapAddress = (swapAddress) => {
256
+ const poolsData = curve.getPoolsData();
257
+ const poolIds = Object.entries(poolsData).filter(([, poolData]) => poolData.swap_address.toLowerCase() === swapAddress.toLowerCase());
457
258
  if (poolIds.length === 0)
458
259
  return "";
459
260
  return poolIds[0][0];
460
261
  };
461
- var _getTokenAddressBySwapAddress = function (swapAddress) {
462
- var poolsData = curve.getPoolsData();
463
- var res = Object.entries(poolsData).filter(function (_a) {
464
- var _ = _a[0], poolData = _a[1];
465
- return poolData.swap_address.toLowerCase() === swapAddress.toLowerCase();
466
- });
467
- if (res.length === 0)
468
- return "";
469
- return res[0][1].token_address;
470
- };
471
- export var _getUsdPricesFromApi = function () { return __awaiter(void 0, void 0, void 0, function () {
472
- var network, allTypesExtendedPoolData, priceDict, priceDictByMaxTvl, _i, allTypesExtendedPoolData_1, extendedPoolData, _a, _b, pool, lpTokenAddress, totalSupply, _c, _d, coin, _e, _f, coin, address, maxTvlItem;
473
- var _g, _h;
474
- return __generator(this, function (_j) {
475
- switch (_j.label) {
476
- case 0:
477
- network = curve.constants.NETWORK_NAME;
478
- return [4 /*yield*/, _getAllPoolsFromApi(network)];
479
- case 1:
480
- allTypesExtendedPoolData = _j.sent();
481
- priceDict = {};
482
- priceDictByMaxTvl = {};
483
- for (_i = 0, allTypesExtendedPoolData_1 = allTypesExtendedPoolData; _i < allTypesExtendedPoolData_1.length; _i++) {
484
- extendedPoolData = allTypesExtendedPoolData_1[_i];
485
- for (_a = 0, _b = extendedPoolData.poolData; _a < _b.length; _a++) {
486
- pool = _b[_a];
487
- lpTokenAddress = (_g = pool.lpTokenAddress) !== null && _g !== void 0 ? _g : pool.address;
488
- totalSupply = pool.totalSupply / (Math.pow(10, 18));
489
- if (lpTokenAddress.toLowerCase() in priceDict) {
490
- priceDict[lpTokenAddress.toLowerCase()].push({
491
- price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0,
492
- tvl: pool.usdTotal,
493
- });
494
- }
495
- else {
496
- priceDict[lpTokenAddress.toLowerCase()] = [];
497
- priceDict[lpTokenAddress.toLowerCase()].push({
498
- price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0,
499
- tvl: pool.usdTotal,
500
- });
501
- }
502
- for (_c = 0, _d = pool.coins; _c < _d.length; _c++) {
503
- coin = _d[_c];
504
- if (typeof coin.usdPrice === "number") {
505
- if (coin.address.toLowerCase() in priceDict) {
506
- priceDict[coin.address.toLowerCase()].push({
507
- price: coin.usdPrice,
508
- tvl: pool.usdTotal,
509
- });
510
- }
511
- else {
512
- priceDict[coin.address.toLowerCase()] = [];
513
- priceDict[coin.address.toLowerCase()].push({
514
- price: coin.usdPrice,
515
- tvl: pool.usdTotal,
516
- });
517
- }
518
- }
519
- }
520
- for (_e = 0, _f = (_h = pool.gaugeRewards) !== null && _h !== void 0 ? _h : []; _e < _f.length; _e++) {
521
- coin = _f[_e];
522
- if (typeof coin.tokenPrice === "number") {
523
- if (coin.tokenAddress.toLowerCase() in priceDict) {
524
- priceDict[coin.tokenAddress.toLowerCase()].push({
525
- price: coin.tokenPrice,
526
- tvl: pool.usdTotal,
527
- });
528
- }
529
- else {
530
- priceDict[coin.tokenAddress.toLowerCase()] = [];
531
- priceDict[coin.tokenAddress.toLowerCase()].push({
532
- price: coin.tokenPrice,
533
- tvl: pool.usdTotal,
534
- });
535
- }
536
- }
537
- }
538
- }
539
- }
540
- for (address in priceDict) {
541
- if (priceDict[address].length > 0) {
542
- maxTvlItem = priceDict[address].reduce(function (prev, current) {
543
- if (+current.tvl > +prev.tvl) {
544
- return current;
545
- }
546
- else {
547
- return prev;
548
- }
262
+ export const _getUsdPricesFromApi = () => __awaiter(void 0, void 0, void 0, function* () {
263
+ var _a, _b;
264
+ const network = curve.constants.NETWORK_NAME;
265
+ const allTypesExtendedPoolData = yield _getAllPoolsFromApi(network);
266
+ const priceDict = {};
267
+ const priceDictByMaxTvl = {};
268
+ for (const extendedPoolData of allTypesExtendedPoolData) {
269
+ for (const pool of extendedPoolData.poolData) {
270
+ const lpTokenAddress = (_a = pool.lpTokenAddress) !== null && _a !== void 0 ? _a : pool.address;
271
+ const totalSupply = pool.totalSupply / (Math.pow(10, 18));
272
+ if (lpTokenAddress.toLowerCase() in priceDict) {
273
+ priceDict[lpTokenAddress.toLowerCase()].push({
274
+ price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0,
275
+ tvl: pool.usdTotal,
276
+ });
277
+ }
278
+ else {
279
+ priceDict[lpTokenAddress.toLowerCase()] = [];
280
+ priceDict[lpTokenAddress.toLowerCase()].push({
281
+ price: pool.usdTotal && totalSupply ? pool.usdTotal / totalSupply : 0,
282
+ tvl: pool.usdTotal,
283
+ });
284
+ }
285
+ for (const coin of pool.coins) {
286
+ if (typeof coin.usdPrice === "number") {
287
+ if (coin.address.toLowerCase() in priceDict) {
288
+ priceDict[coin.address.toLowerCase()].push({
289
+ price: coin.usdPrice,
290
+ tvl: pool.usdTotal,
549
291
  });
550
- priceDictByMaxTvl[address] = maxTvlItem.price;
551
292
  }
552
293
  else {
553
- priceDictByMaxTvl[address] = 0;
294
+ priceDict[coin.address.toLowerCase()] = [];
295
+ priceDict[coin.address.toLowerCase()].push({
296
+ price: coin.usdPrice,
297
+ tvl: pool.usdTotal,
298
+ });
554
299
  }
555
300
  }
556
- return [2 /*return*/, priceDictByMaxTvl];
557
- }
558
- });
559
- }); };
560
- export var _getCrvApyFromApi = function () { return __awaiter(void 0, void 0, void 0, function () {
561
- var network, allTypesExtendedPoolData, apyDict, _i, allTypesExtendedPoolData_2, extendedPoolData, _a, _b, pool;
562
- var _c, _d;
563
- return __generator(this, function (_e) {
564
- switch (_e.label) {
565
- case 0:
566
- network = curve.constants.NETWORK_NAME;
567
- return [4 /*yield*/, _getAllPoolsFromApi(network)];
568
- case 1:
569
- allTypesExtendedPoolData = _e.sent();
570
- apyDict = {};
571
- for (_i = 0, allTypesExtendedPoolData_2 = allTypesExtendedPoolData; _i < allTypesExtendedPoolData_2.length; _i++) {
572
- extendedPoolData = allTypesExtendedPoolData_2[_i];
573
- for (_a = 0, _b = extendedPoolData.poolData; _a < _b.length; _a++) {
574
- pool = _b[_a];
575
- if (pool.gaugeAddress) {
576
- if (!pool.gaugeCrvApy) {
577
- apyDict[pool.gaugeAddress.toLowerCase()] = [0, 0];
578
- }
579
- else {
580
- apyDict[pool.gaugeAddress.toLowerCase()] = [(_c = pool.gaugeCrvApy[0]) !== null && _c !== void 0 ? _c : 0, (_d = pool.gaugeCrvApy[1]) !== null && _d !== void 0 ? _d : 0];
581
- }
582
- }
301
+ }
302
+ for (const coin of (_b = pool.gaugeRewards) !== null && _b !== void 0 ? _b : []) {
303
+ if (typeof coin.tokenPrice === "number") {
304
+ if (coin.tokenAddress.toLowerCase() in priceDict) {
305
+ priceDict[coin.tokenAddress.toLowerCase()].push({
306
+ price: coin.tokenPrice,
307
+ tvl: pool.usdTotal,
308
+ });
583
309
  }
584
- }
585
- return [2 /*return*/, apyDict];
586
- }
587
- });
588
- }); };
589
- export var _getRewardsFromApi = function () { return __awaiter(void 0, void 0, void 0, function () {
590
- var network, allTypesExtendedPoolData, rewardsDict, _i, allTypesExtendedPoolData_3, extendedPoolData, _a, _b, pool;
591
- var _c;
592
- return __generator(this, function (_d) {
593
- switch (_d.label) {
594
- case 0:
595
- network = curve.constants.NETWORK_NAME;
596
- return [4 /*yield*/, _getAllPoolsFromApi(network)];
597
- case 1:
598
- allTypesExtendedPoolData = _d.sent();
599
- rewardsDict = {};
600
- for (_i = 0, allTypesExtendedPoolData_3 = allTypesExtendedPoolData; _i < allTypesExtendedPoolData_3.length; _i++) {
601
- extendedPoolData = allTypesExtendedPoolData_3[_i];
602
- for (_a = 0, _b = extendedPoolData.poolData; _a < _b.length; _a++) {
603
- pool = _b[_a];
604
- if (pool.gaugeAddress) {
605
- rewardsDict[pool.gaugeAddress.toLowerCase()] = ((_c = pool.gaugeRewards) !== null && _c !== void 0 ? _c : [])
606
- .filter(function (r) { return curve.chainId === 1 || r.tokenAddress.toLowerCase() !== curve.constants.COINS.crv; });
607
- }
310
+ else {
311
+ priceDict[coin.tokenAddress.toLowerCase()] = [];
312
+ priceDict[coin.tokenAddress.toLowerCase()].push({
313
+ price: coin.tokenPrice,
314
+ tvl: pool.usdTotal,
315
+ });
608
316
  }
609
317
  }
610
- return [2 /*return*/, rewardsDict];
318
+ }
611
319
  }
612
- });
613
- }); };
614
- var _usdRatesCache = {};
615
- export var _getUsdRate = function (assetId) { return __awaiter(void 0, void 0, void 0, function () {
616
- var pricesFromApi, chainName, nativeTokenName, url, response;
617
- var _a, _b;
618
- return __generator(this, function (_c) {
619
- switch (_c.label) {
620
- case 0:
621
- if (curve.chainId === 1 && assetId.toLowerCase() === '0x8762db106b2c2a0bccb3a80d1ed41273552616e8')
622
- return [2 /*return*/, 0]; // RSR
623
- return [4 /*yield*/, _getUsdPricesFromApi()];
624
- case 1:
625
- pricesFromApi = _c.sent();
626
- if (assetId.toLowerCase() in pricesFromApi)
627
- return [2 /*return*/, pricesFromApi[assetId.toLowerCase()]];
628
- if (assetId === 'USD' || (curve.chainId === 137 && (assetId.toLowerCase() === curve.constants.COINS.am3crv.toLowerCase())))
629
- return [2 /*return*/, 1];
630
- chainName = {
631
- 1: 'ethereum',
632
- 10: 'optimistic-ethereum',
633
- 56: "binance-smart-chain",
634
- 100: 'xdai',
635
- 137: 'polygon-pos',
636
- 196: 'x-layer',
637
- 250: 'fantom',
638
- 252: 'fraxtal',
639
- 324: 'zksync',
640
- 1284: 'moonbeam',
641
- 2222: 'kava',
642
- 5000: 'mantle',
643
- 8453: 'base',
644
- 42220: 'celo',
645
- 43114: 'avalanche',
646
- 42161: 'arbitrum-one',
647
- 1313161554: 'aurora',
648
- }[curve.chainId];
649
- nativeTokenName = {
650
- 1: 'ethereum',
651
- 10: 'ethereum',
652
- 56: 'binancecoin',
653
- 100: 'xdai',
654
- 137: 'matic-network',
655
- 196: 'okb',
656
- 250: 'fantom',
657
- 252: 'frax-ether',
658
- 324: 'ethereum',
659
- 1284: 'moonbeam',
660
- 2222: 'kava',
661
- 5000: 'mantle',
662
- 8453: 'ethereum',
663
- 42220: 'celo',
664
- 43114: 'avalanche-2',
665
- 42161: 'ethereum',
666
- 1313161554: 'ethereum',
667
- }[curve.chainId];
668
- if (chainName === undefined) {
669
- throw Error('curve object is not initialized');
670
- }
671
- assetId = {
672
- 'CRV': 'curve-dao-token',
673
- 'EUR': 'stasis-eurs',
674
- 'BTC': 'bitcoin',
675
- 'ETH': 'ethereum',
676
- 'LINK': 'link',
677
- }[assetId.toUpperCase()] || assetId;
678
- assetId = isEth(assetId) ? nativeTokenName : assetId.toLowerCase();
679
- // No EURT on Coingecko Polygon
680
- if (curve.chainId === 137 && assetId.toLowerCase() === curve.constants.COINS.eurt) {
681
- chainName = 'ethereum';
682
- assetId = '0xC581b735A1688071A1746c968e0798D642EDE491'.toLowerCase(); // EURT Ethereum
683
- }
684
- // CRV
685
- if (assetId.toLowerCase() === curve.constants.ALIASES.crv) {
686
- assetId = 'curve-dao-token';
687
- }
688
- if (!((((_a = _usdRatesCache[assetId]) === null || _a === void 0 ? void 0 : _a.time) || 0) + 600000 < Date.now())) return [3 /*break*/, 3];
689
- url = [nativeTokenName, 'ethereum', 'bitcoin', 'link', 'curve-dao-token', 'stasis-eurs'].includes(assetId.toLowerCase()) ?
690
- "https://api.coingecko.com/api/v3/simple/price?ids=".concat(assetId, "&vs_currencies=usd") :
691
- "https://api.coingecko.com/api/v3/simple/token_price/".concat(chainName, "?contract_addresses=").concat(assetId, "&vs_currencies=usd");
692
- return [4 /*yield*/, axios.get(url)];
693
- case 2:
694
- response = _c.sent();
695
- try {
696
- _usdRatesCache[assetId] = { 'rate': (_b = response.data[assetId]['usd']) !== null && _b !== void 0 ? _b : 0, 'time': Date.now() };
697
- }
698
- catch (err) { // TODO pay attention!
699
- _usdRatesCache[assetId] = { 'rate': 0, 'time': Date.now() };
700
- }
701
- _c.label = 3;
702
- case 3: return [2 /*return*/, _usdRatesCache[assetId]['rate']];
320
+ }
321
+ for (const address in priceDict) {
322
+ if (priceDict[address].length) {
323
+ const maxTvlItem = priceDict[address].reduce((prev, current) => +current.tvl > +prev.tvl ? current : prev);
324
+ priceDictByMaxTvl[address] = maxTvlItem.price;
703
325
  }
704
- });
705
- }); };
706
- export var getUsdRate = function (coin) { return __awaiter(void 0, void 0, void 0, function () {
707
- var coinAddress;
708
- return __generator(this, function (_a) {
709
- switch (_a.label) {
710
- case 0:
711
- coinAddress = _getCoinAddressesNoCheck(coin)[0];
712
- return [4 /*yield*/, _getUsdRate(coinAddress)];
713
- case 1: return [2 /*return*/, _a.sent()];
326
+ else {
327
+ priceDictByMaxTvl[address] = 0;
714
328
  }
715
- });
716
- }); };
717
- export var getBaseFeeByLastBlock = function () { return __awaiter(void 0, void 0, void 0, function () {
718
- var provider, block, error_1;
719
- return __generator(this, function (_a) {
720
- switch (_a.label) {
721
- case 0:
722
- provider = curve.provider;
723
- _a.label = 1;
724
- case 1:
725
- _a.trys.push([1, 3, , 4]);
726
- return [4 /*yield*/, provider.getBlock('latest')];
727
- case 2:
728
- block = _a.sent();
729
- if (!block) {
730
- return [2 /*return*/, 0.01];
329
+ }
330
+ return priceDictByMaxTvl;
331
+ });
332
+ export const _getCrvApyFromApi = () => __awaiter(void 0, void 0, void 0, function* () {
333
+ var _c, _d;
334
+ const network = curve.constants.NETWORK_NAME;
335
+ const allTypesExtendedPoolData = yield _getAllPoolsFromApi(network);
336
+ const apyDict = {};
337
+ for (const extendedPoolData of allTypesExtendedPoolData) {
338
+ for (const pool of extendedPoolData.poolData) {
339
+ if (pool.gaugeAddress) {
340
+ if (!pool.gaugeCrvApy) {
341
+ apyDict[pool.gaugeAddress.toLowerCase()] = [0, 0];
731
342
  }
732
- return [2 /*return*/, Number(block.baseFeePerGas) / (Math.pow(10, 9))];
733
- case 3:
734
- error_1 = _a.sent();
735
- throw new Error(error_1);
736
- case 4: return [2 /*return*/];
737
- }
738
- });
739
- }); };
740
- export var getGasPrice = function () { return __awaiter(void 0, void 0, void 0, function () {
741
- var provider, _a, _b;
742
- return __generator(this, function (_c) {
743
- switch (_c.label) {
744
- case 0:
745
- provider = curve.provider;
746
- _a = Number;
747
- _b = Number;
748
- return [4 /*yield*/, provider.getFeeData()];
749
- case 1: return [2 /*return*/, _a.apply(void 0, [(_b.apply(void 0, [(_c.sent()).gasPrice]) / 1e9).toFixed(2)])];
343
+ else {
344
+ apyDict[pool.gaugeAddress.toLowerCase()] = [(_c = pool.gaugeCrvApy[0]) !== null && _c !== void 0 ? _c : 0, (_d = pool.gaugeCrvApy[1]) !== null && _d !== void 0 ? _d : 0];
345
+ }
346
+ }
750
347
  }
751
- });
752
- }); };
753
- export var getGasPriceFromL1 = function () { return __awaiter(void 0, void 0, void 0, function () {
754
- return __generator(this, function (_a) {
755
- if (L2Networks.includes(curve.chainId) && curve.L1WeightedGasPrice) {
756
- return [2 /*return*/, curve.L1WeightedGasPrice + 1e9]; // + 1 gwei
348
+ }
349
+ return apyDict;
350
+ });
351
+ export const _getRewardsFromApi = () => __awaiter(void 0, void 0, void 0, function* () {
352
+ var _e;
353
+ const network = curve.constants.NETWORK_NAME;
354
+ const allTypesExtendedPoolData = yield _getAllPoolsFromApi(network);
355
+ const rewardsDict = {};
356
+ for (const extendedPoolData of allTypesExtendedPoolData) {
357
+ for (const pool of extendedPoolData.poolData) {
358
+ if (pool.gaugeAddress) {
359
+ rewardsDict[pool.gaugeAddress.toLowerCase()] = ((_e = pool.gaugeRewards) !== null && _e !== void 0 ? _e : [])
360
+ .filter((r) => curve.chainId === 1 || r.tokenAddress.toLowerCase() !== curve.constants.COINS.crv);
361
+ }
757
362
  }
758
- else {
759
- throw Error("This method exists only for L2 networks");
363
+ }
364
+ return rewardsDict;
365
+ });
366
+ const _usdRatesCache = {};
367
+ export const _getUsdRate = (assetId) => __awaiter(void 0, void 0, void 0, function* () {
368
+ var _f, _g;
369
+ if (curve.chainId === 1 && assetId.toLowerCase() === '0x8762db106b2c2a0bccb3a80d1ed41273552616e8')
370
+ return 0; // RSR
371
+ const pricesFromApi = yield _getUsdPricesFromApi();
372
+ if (assetId.toLowerCase() in pricesFromApi)
373
+ return pricesFromApi[assetId.toLowerCase()];
374
+ if (assetId === 'USD' || (curve.chainId === 137 && (assetId.toLowerCase() === curve.constants.COINS.am3crv.toLowerCase())))
375
+ return 1;
376
+ let chainName = {
377
+ 1: 'ethereum',
378
+ 10: 'optimistic-ethereum',
379
+ 56: "binance-smart-chain",
380
+ 100: 'xdai',
381
+ 137: 'polygon-pos',
382
+ 196: 'x-layer',
383
+ 250: 'fantom',
384
+ 252: 'fraxtal',
385
+ 324: 'zksync',
386
+ 1284: 'moonbeam',
387
+ 2222: 'kava',
388
+ 5000: 'mantle',
389
+ 8453: 'base',
390
+ 42220: 'celo',
391
+ 43114: 'avalanche',
392
+ 42161: 'arbitrum-one',
393
+ 1313161554: 'aurora',
394
+ }[curve.chainId];
395
+ const nativeTokenName = {
396
+ 1: 'ethereum',
397
+ 10: 'ethereum',
398
+ 56: 'binancecoin',
399
+ 100: 'xdai',
400
+ 137: 'matic-network',
401
+ 196: 'okb',
402
+ 250: 'fantom',
403
+ 252: 'frax-ether',
404
+ 324: 'ethereum',
405
+ 1284: 'moonbeam',
406
+ 2222: 'kava',
407
+ 5000: 'mantle',
408
+ 8453: 'ethereum',
409
+ 42220: 'celo',
410
+ 43114: 'avalanche-2',
411
+ 42161: 'ethereum',
412
+ 1313161554: 'ethereum',
413
+ }[curve.chainId];
414
+ if (chainName === undefined) {
415
+ throw Error('curve object is not initialized');
416
+ }
417
+ assetId = {
418
+ 'CRV': 'curve-dao-token',
419
+ 'EUR': 'stasis-eurs',
420
+ 'BTC': 'bitcoin',
421
+ 'ETH': 'ethereum',
422
+ 'LINK': 'link',
423
+ }[assetId.toUpperCase()] || assetId;
424
+ assetId = isEth(assetId) ? nativeTokenName : assetId.toLowerCase();
425
+ // No EURT on Coingecko Polygon
426
+ if (curve.chainId === 137 && assetId.toLowerCase() === curve.constants.COINS.eurt) {
427
+ chainName = 'ethereum';
428
+ assetId = '0xC581b735A1688071A1746c968e0798D642EDE491'.toLowerCase(); // EURT Ethereum
429
+ }
430
+ // CRV
431
+ if (assetId.toLowerCase() === curve.constants.ALIASES.crv) {
432
+ assetId = 'curve-dao-token';
433
+ }
434
+ if ((((_f = _usdRatesCache[assetId]) === null || _f === void 0 ? void 0 : _f.time) || 0) + 600000 < Date.now()) {
435
+ const url = [nativeTokenName, 'ethereum', 'bitcoin', 'link', 'curve-dao-token', 'stasis-eurs'].includes(assetId.toLowerCase()) ?
436
+ `https://api.coingecko.com/api/v3/simple/price?ids=${assetId}&vs_currencies=usd` :
437
+ `https://api.coingecko.com/api/v3/simple/token_price/${chainName}?contract_addresses=${assetId}&vs_currencies=usd`;
438
+ const response = yield axios.get(url);
439
+ try {
440
+ _usdRatesCache[assetId] = { 'rate': (_g = response.data[assetId]['usd']) !== null && _g !== void 0 ? _g : 0, 'time': Date.now() };
760
441
  }
761
- return [2 /*return*/];
762
- });
763
- }); };
764
- export var getGasPriceFromL2 = function () { return __awaiter(void 0, void 0, void 0, function () {
765
- var gasPrice;
766
- return __generator(this, function (_a) {
767
- switch (_a.label) {
768
- case 0:
769
- if (!(curve.chainId === 42161)) return [3 /*break*/, 2];
770
- return [4 /*yield*/, getBaseFeeByLastBlock()];
771
- case 1: return [2 /*return*/, _a.sent()];
772
- case 2:
773
- if (!(curve.chainId === 196)) return [3 /*break*/, 4];
774
- return [4 /*yield*/, getGasPrice()]; // gwei
775
- case 3: return [2 /*return*/, _a.sent()]; // gwei
776
- case 4:
777
- if (!(curve.chainId === 324)) return [3 /*break*/, 6];
778
- return [4 /*yield*/, getGasPrice()]; // gwei
779
- case 5: return [2 /*return*/, _a.sent()]; // gwei
780
- case 6:
781
- if (!(curve.chainId === 5000)) return [3 /*break*/, 8];
782
- return [4 /*yield*/, getGasPrice()]; // gwei
783
- case 7: return [2 /*return*/, _a.sent()]; // gwei
784
- case 8:
785
- if (!L2Networks.includes(curve.chainId)) return [3 /*break*/, 10];
786
- return [4 /*yield*/, curve.contracts[curve.constants.ALIASES.gas_oracle_blob].contract.gasPrice({ "gasPrice": "0x2000000" })];
787
- case 9:
788
- gasPrice = _a.sent();
789
- return [2 /*return*/, Number(gasPrice)];
790
- case 10: throw Error("This method exists only for L2 networks");
442
+ catch (err) { // TODO pay attention!
443
+ _usdRatesCache[assetId] = { 'rate': 0, 'time': Date.now() };
791
444
  }
792
- });
793
- }); };
794
- export var getGasInfoForL2 = function () { return __awaiter(void 0, void 0, void 0, function () {
795
- var baseFee, gasPrice, gasPrice, baseFee;
796
- return __generator(this, function (_a) {
797
- switch (_a.label) {
798
- case 0:
799
- if (!(curve.chainId === 42161)) return [3 /*break*/, 2];
800
- return [4 /*yield*/, getBaseFeeByLastBlock()];
801
- case 1:
802
- baseFee = _a.sent();
803
- return [2 /*return*/, {
804
- maxFeePerGas: Number(((baseFee * 1.1) + 0.01).toFixed(2)),
805
- maxPriorityFeePerGas: 0.01,
806
- }];
807
- case 2:
808
- if (!(curve.chainId === 196)) return [3 /*break*/, 4];
809
- return [4 /*yield*/, getGasPrice()];
810
- case 3:
811
- gasPrice = _a.sent();
812
- return [2 /*return*/, {
813
- gasPrice: gasPrice,
814
- }];
815
- case 4:
816
- if (!(curve.chainId === 324)) return [3 /*break*/, 6];
817
- return [4 /*yield*/, getGasPrice()];
818
- case 5:
819
- gasPrice = _a.sent();
820
- return [2 /*return*/, {
821
- gasPrice: gasPrice,
822
- }];
823
- case 6:
824
- if (!(curve.chainId === 5000)) return [3 /*break*/, 8];
825
- return [4 /*yield*/, getBaseFeeByLastBlock()];
826
- case 7:
827
- baseFee = _a.sent();
828
- return [2 /*return*/, {
829
- maxFeePerGas: Number(((baseFee * 1.1) + 0.01).toFixed(2)),
830
- maxPriorityFeePerGas: 0.01,
831
- }];
832
- case 8: throw Error("This method exists only for L2 networks");
445
+ }
446
+ return _usdRatesCache[assetId]['rate'];
447
+ });
448
+ export const getUsdRate = (coin) => __awaiter(void 0, void 0, void 0, function* () {
449
+ const [coinAddress] = _getCoinAddressesNoCheck(coin);
450
+ return yield _getUsdRate(coinAddress);
451
+ });
452
+ export const getBaseFeeByLastBlock = () => __awaiter(void 0, void 0, void 0, function* () {
453
+ const provider = curve.provider;
454
+ try {
455
+ const block = yield provider.getBlock('latest');
456
+ if (!block) {
457
+ return 0.01;
833
458
  }
834
- });
835
- }); };
836
- export var getTxCostsUsd = function (ethUsdRate, gasPrice, gas, gasPriceL1) {
837
- if (gasPriceL1 === void 0) { gasPriceL1 = 0; }
459
+ return Number(block.baseFeePerGas) / (Math.pow(10, 9));
460
+ }
461
+ catch (error) {
462
+ throw new Error(error);
463
+ }
464
+ });
465
+ export const getGasPrice = () => __awaiter(void 0, void 0, void 0, function* () {
466
+ const provider = curve.provider;
467
+ return Number((Number((yield provider.getFeeData()).gasPrice) / 1e9).toFixed(2));
468
+ });
469
+ export const getGasPriceFromL1 = () => __awaiter(void 0, void 0, void 0, function* () {
470
+ if (L2Networks.includes(curve.chainId) && curve.L1WeightedGasPrice) {
471
+ return curve.L1WeightedGasPrice + 1e9; // + 1 gwei
472
+ }
473
+ else {
474
+ throw Error("This method exists only for L2 networks");
475
+ }
476
+ });
477
+ export const getGasPriceFromL2 = () => __awaiter(void 0, void 0, void 0, function* () {
478
+ if (curve.chainId === 42161) {
479
+ return yield getBaseFeeByLastBlock();
480
+ }
481
+ if (curve.chainId === 196) {
482
+ return yield getGasPrice(); // gwei
483
+ }
484
+ if (curve.chainId === 324) {
485
+ return yield getGasPrice(); // gwei
486
+ }
487
+ if (curve.chainId === 5000) {
488
+ return yield getGasPrice(); // gwei
489
+ }
490
+ if (L2Networks.includes(curve.chainId)) {
491
+ const gasPrice = yield curve.contracts[curve.constants.ALIASES.gas_oracle_blob].contract.gasPrice({ "gasPrice": "0x2000000" });
492
+ return Number(gasPrice);
493
+ }
494
+ else {
495
+ throw Error("This method exists only for L2 networks");
496
+ }
497
+ });
498
+ export const getGasInfoForL2 = () => __awaiter(void 0, void 0, void 0, function* () {
499
+ if (curve.chainId === 42161) {
500
+ const baseFee = yield getBaseFeeByLastBlock();
501
+ return {
502
+ maxFeePerGas: Number(((baseFee * 1.1) + 0.01).toFixed(2)),
503
+ maxPriorityFeePerGas: 0.01,
504
+ };
505
+ }
506
+ else if (curve.chainId === 196) {
507
+ const gasPrice = yield getGasPrice();
508
+ return {
509
+ gasPrice,
510
+ };
511
+ }
512
+ else if (curve.chainId === 324) {
513
+ const gasPrice = yield getGasPrice();
514
+ return {
515
+ gasPrice,
516
+ };
517
+ }
518
+ else if (curve.chainId === 5000) {
519
+ const baseFee = yield getBaseFeeByLastBlock();
520
+ return {
521
+ maxFeePerGas: Number(((baseFee * 1.1) + 0.01).toFixed(2)),
522
+ maxPriorityFeePerGas: 0.01,
523
+ };
524
+ }
525
+ else {
526
+ throw Error("This method exists only for L2 networks");
527
+ }
528
+ });
529
+ export const getTxCostsUsd = (ethUsdRate, gasPrice, gas, gasPriceL1 = 0) => {
838
530
  if (Array.isArray(gas)) {
839
531
  return ethUsdRate * ((gas[0] * gasPrice / 1e18) + (gas[1] * gasPriceL1 / 1e18));
840
532
  }
@@ -842,84 +534,42 @@ export var getTxCostsUsd = function (ethUsdRate, gasPrice, gas, gasPriceL1) {
842
534
  return ethUsdRate * gas * gasPrice / 1e18;
843
535
  }
844
536
  };
845
- var _getNetworkName = function (network) {
846
- if (network === void 0) { network = curve.chainId; }
537
+ const _getNetworkName = (network = curve.chainId) => {
847
538
  if (typeof network === "number" && NETWORK_CONSTANTS[network]) {
848
539
  return NETWORK_CONSTANTS[network].NAME;
849
540
  }
850
- else if (typeof network === "string" && Object.values(NETWORK_CONSTANTS).map(function (n) { return n.NAME; }).includes(network)) {
541
+ else if (typeof network === "string" && Object.values(NETWORK_CONSTANTS).map((n) => n.NAME).includes(network)) {
851
542
  return network;
852
543
  }
853
544
  else {
854
- throw Error("Wrong network name or id: ".concat(network));
855
- }
856
- };
857
- var _getChainId = function (network) {
858
- if (network === void 0) { network = curve.chainId; }
859
- if (typeof network === "number" && NETWORK_CONSTANTS[network]) {
860
- return network;
861
- }
862
- else if (typeof network === "string" && Object.values(NETWORK_CONSTANTS).map(function (n) { return n.NAME; }).includes(network)) {
863
- var idx = Object.values(NETWORK_CONSTANTS).map(function (n) { return n.NAME; }).indexOf(network);
864
- return Number(Object.keys(NETWORK_CONSTANTS)[idx]);
865
- }
866
- else {
867
- throw Error("Wrong network name or id: ".concat(network));
868
- }
869
- };
870
- export var getTVL = function (network) {
871
- if (network === void 0) { network = curve.chainId; }
872
- return __awaiter(void 0, void 0, void 0, function () {
873
- var allTypesExtendedPoolData;
874
- return __generator(this, function (_a) {
875
- switch (_a.label) {
876
- case 0:
877
- network = _getNetworkName(network);
878
- return [4 /*yield*/, _getAllPoolsFromApi(network)];
879
- case 1:
880
- allTypesExtendedPoolData = _a.sent();
881
- return [2 /*return*/, allTypesExtendedPoolData.reduce(function (sum, data) { var _a, _b; return sum + ((_b = (_a = data.tvl) !== null && _a !== void 0 ? _a : data.tvlAll) !== null && _b !== void 0 ? _b : 0); }, 0)];
882
- }
883
- });
884
- });
885
- };
886
- export var getVolumeApiController = function (network) { return __awaiter(void 0, void 0, void 0, function () {
887
- return __generator(this, function (_a) {
888
- switch (_a.label) {
889
- case 0:
890
- if (!volumeNetworks.getVolumes.includes(curve.chainId)) return [3 /*break*/, 2];
891
- return [4 /*yield*/, _getVolumes(network)];
892
- case 1: return [2 /*return*/, _a.sent()];
893
- case 2:
894
- if (!volumeNetworks.getFactoryAPYs.includes(curve.chainId)) return [3 /*break*/, 4];
895
- return [4 /*yield*/, _getFactoryAPYs(network)];
896
- case 3: return [2 /*return*/, _a.sent()];
897
- case 4:
898
- if (!volumeNetworks.getSubgraphData.includes(curve.chainId)) return [3 /*break*/, 6];
899
- return [4 /*yield*/, _getSubgraphData(network)];
900
- case 5: return [2 /*return*/, _a.sent()];
901
- case 6: throw Error("Can't get volume for network: ".concat(network));
902
- }
903
- });
904
- }); };
905
- export var getVolume = function (network) {
906
- if (network === void 0) { network = curve.chainId; }
907
- return __awaiter(void 0, void 0, void 0, function () {
908
- var _a, totalVolume, cryptoVolume, cryptoShare;
909
- return __generator(this, function (_b) {
910
- switch (_b.label) {
911
- case 0:
912
- network = _getNetworkName(network);
913
- return [4 /*yield*/, getVolumeApiController(network)];
914
- case 1:
915
- _a = _b.sent(), totalVolume = _a.totalVolume, cryptoVolume = _a.cryptoVolume, cryptoShare = _a.cryptoShare;
916
- return [2 /*return*/, { totalVolume: totalVolume, cryptoVolume: cryptoVolume, cryptoShare: cryptoShare }];
917
- }
918
- });
919
- });
920
- };
921
- export var _setContracts = function (address, abi) {
545
+ throw Error(`Wrong network name or id: ${network}`);
546
+ }
547
+ };
548
+ export const getTVL = (network = curve.chainId) => __awaiter(void 0, void 0, void 0, function* () {
549
+ network = _getNetworkName(network);
550
+ const allTypesExtendedPoolData = yield _getAllPoolsFromApi(network);
551
+ return allTypesExtendedPoolData.reduce((sum, data) => { var _a, _b; return sum + ((_b = (_a = data.tvl) !== null && _a !== void 0 ? _a : data.tvlAll) !== null && _b !== void 0 ? _b : 0); }, 0);
552
+ });
553
+ export const getVolumeApiController = (network) => __awaiter(void 0, void 0, void 0, function* () {
554
+ if (volumeNetworks.getVolumes.includes(curve.chainId)) {
555
+ return yield _getVolumes(network);
556
+ }
557
+ if (volumeNetworks.getFactoryAPYs.includes(curve.chainId)) {
558
+ return yield _getFactoryAPYs(network);
559
+ }
560
+ if (volumeNetworks.getSubgraphData.includes(curve.chainId)) {
561
+ return yield _getSubgraphData(network);
562
+ }
563
+ throw Error(`Can't get volume for network: ${network}`);
564
+ });
565
+ export const getVolume = (network = curve.chainId) => __awaiter(void 0, void 0, void 0, function* () {
566
+ network = _getNetworkName(network);
567
+ const { totalVolume, cryptoVolume, cryptoShare } = yield getVolumeApiController(network);
568
+ return { totalVolume, cryptoVolume, cryptoShare };
569
+ });
570
+ export const _setContracts = (address, abi) => {
922
571
  curve.contracts[address] = {
572
+ abi,
923
573
  contract: new Contract(address, abi, curve.signer || curve.provider),
924
574
  multicallContract: new MulticallContract(address, abi),
925
575
  };
@@ -927,91 +577,61 @@ export var _setContracts = function (address, abi) {
927
577
  // Find k for which x * k = target_x or y * k = target_y
928
578
  // k = max(target_x / x, target_y / y)
929
579
  // small_x = x * k
930
- export var _get_small_x = function (_x, _y, x_decimals, y_decimals) {
931
- var target_x = BN(Math.pow(10, (x_decimals > 5 ? x_decimals - 3 : x_decimals)));
932
- var target_y = BN(Math.pow(10, (y_decimals > 5 ? y_decimals - 3 : y_decimals)));
933
- var x_int_BN = toBN(_x, 0);
934
- var y_int_BN = toBN(_y, 0);
935
- var k = BigNumber.max(target_x.div(x_int_BN), target_y.div(y_int_BN));
580
+ export const _get_small_x = (_x, _y, x_decimals, y_decimals) => {
581
+ const target_x = BN(Math.pow(10, (x_decimals > 5 ? x_decimals - 3 : x_decimals)));
582
+ const target_y = BN(Math.pow(10, (y_decimals > 5 ? y_decimals - 3 : y_decimals)));
583
+ const x_int_BN = toBN(_x, 0);
584
+ const y_int_BN = toBN(_y, 0);
585
+ const k = BigNumber.max(target_x.div(x_int_BN), target_y.div(y_int_BN));
936
586
  return BigNumber.min(x_int_BN.times(k), BN(Math.pow(10, x_decimals)));
937
587
  };
938
- export var _get_price_impact = function (_x, _y, _small_x, _small_y, x_decimals, y_decimals) {
939
- var x_BN = toBN(_x, x_decimals);
940
- var y_BN = toBN(_y, y_decimals);
941
- var small_x_BN = toBN(_small_x, x_decimals);
942
- var small_y_BN = toBN(_small_y, y_decimals);
943
- var rateBN = y_BN.div(x_BN);
944
- var smallRateBN = small_y_BN.div(small_x_BN);
588
+ export const _get_price_impact = (_x, _y, _small_x, _small_y, x_decimals, y_decimals) => {
589
+ const x_BN = toBN(_x, x_decimals);
590
+ const y_BN = toBN(_y, y_decimals);
591
+ const small_x_BN = toBN(_small_x, x_decimals);
592
+ const small_y_BN = toBN(_small_y, y_decimals);
593
+ const rateBN = y_BN.div(x_BN);
594
+ const smallRateBN = small_y_BN.div(small_x_BN);
945
595
  if (rateBN.gt(smallRateBN))
946
596
  return BN(0);
947
597
  return BN(1).minus(rateBN.div(smallRateBN)).times(100);
948
598
  };
949
- export var getCoinsData = function () {
950
- var coins = [];
951
- for (var _i = 0; _i < arguments.length; _i++) {
952
- coins[_i] = arguments[_i];
953
- }
954
- return __awaiter(void 0, void 0, void 0, function () {
955
- var coinAddresses, ethIndex, contractCalls, _a, coinAddresses_3, coinAddr, coinContract, _response, res;
956
- return __generator(this, function (_b) {
957
- switch (_b.label) {
958
- case 0:
959
- if (coins.length == 1 && Array.isArray(coins[0]))
960
- coins = coins[0];
961
- coins = coins;
962
- coinAddresses = _getCoinAddressesNoCheck(coins);
963
- console.log(coinAddresses);
964
- ethIndex = getEthIndex(coinAddresses);
965
- if (ethIndex !== -1) {
966
- coinAddresses.splice(ethIndex, 1);
967
- }
968
- contractCalls = [];
969
- for (_a = 0, coinAddresses_3 = coinAddresses; _a < coinAddresses_3.length; _a++) {
970
- coinAddr = coinAddresses_3[_a];
971
- coinContract = new MulticallContract(coinAddr, ERC20Abi);
972
- contractCalls.push(coinContract.name(), coinContract.symbol(), coinContract.decimals());
973
- }
974
- return [4 /*yield*/, curve.multicallProvider.all(contractCalls)];
975
- case 1:
976
- _response = _b.sent();
977
- if (ethIndex !== -1) {
978
- _response.splice.apply(_response, __spreadArray([ethIndex * 2, 0], ['Ethereum', 'ETH', 18], false));
979
- }
980
- res = [];
981
- coins.forEach(function (address, i) {
982
- res.push({
983
- name: _response.shift(),
984
- symbol: _response.shift(),
985
- decimals: Number(curve.formatUnits(_response.shift(), 0)),
986
- });
987
- });
988
- return [2 /*return*/, res];
989
- }
599
+ export const getCoinsData = (...coins) => __awaiter(void 0, void 0, void 0, function* () {
600
+ if (coins.length == 1 && Array.isArray(coins[0]))
601
+ coins = coins[0];
602
+ coins = coins;
603
+ const coinAddresses = _getCoinAddressesNoCheck(coins);
604
+ console.log(coinAddresses);
605
+ const ethIndex = getEthIndex(coinAddresses);
606
+ if (ethIndex !== -1) {
607
+ coinAddresses.splice(ethIndex, 1);
608
+ }
609
+ const contractCalls = [];
610
+ for (const coinAddr of coinAddresses) {
611
+ const coinContract = new MulticallContract(coinAddr, ERC20Abi);
612
+ contractCalls.push(coinContract.name(), coinContract.symbol(), coinContract.decimals());
613
+ }
614
+ const _response = yield curve.multicallProvider.all(contractCalls);
615
+ if (ethIndex !== -1) {
616
+ _response.splice(ethIndex * 2, 0, ...['Ethereum', 'ETH', 18]);
617
+ }
618
+ const res = [];
619
+ coins.forEach(() => {
620
+ res.push({
621
+ name: _response.shift(),
622
+ symbol: _response.shift(),
623
+ decimals: Number(curve.formatUnits(_response.shift(), 0)),
990
624
  });
991
625
  });
992
- };
993
- export var hasDepositAndStake = function () { return curve.constants.ALIASES.deposit_and_stake !== curve.constants.ZERO_ADDRESS; };
994
- export var hasRouter = function () { return curve.constants.ALIASES.router !== curve.constants.ZERO_ADDRESS; };
995
- export var getCountArgsOfMethodByContract = function (contract, methodName) {
996
- var func = contract.interface.fragments.find(function (item) { return item.name === methodName; });
997
- if (func) {
998
- return func.inputs.length;
999
- }
1000
- else {
1001
- return -1;
1002
- }
1003
- };
1004
- export var isMethodExist = function (contract, methodName) {
1005
- var func = contract.interface.fragments.find(function (item) { return item.name === methodName; });
1006
- if (func) {
1007
- return true;
1008
- }
1009
- else {
1010
- return false;
1011
- }
1012
- };
1013
- export var getPoolName = function (name) {
1014
- var separatedName = name.split(": ");
626
+ return res;
627
+ });
628
+ export const hasDepositAndStake = () => curve.constants.ALIASES.deposit_and_stake !== curve.constants.ZERO_ADDRESS;
629
+ export const hasRouter = () => curve.constants.ALIASES.router !== curve.constants.ZERO_ADDRESS;
630
+ export const findAbiFunction = (abi, methodName) => abi.filter((item) => item.type == 'function' && item.name === methodName);
631
+ export const getCountArgsOfMethodByAbi = (abi, methodName) => { var _a, _b; return (_b = (_a = findAbiFunction(abi, methodName)[0]) === null || _a === void 0 ? void 0 : _a.inputs.length) !== null && _b !== void 0 ? _b : -1; };
632
+ export const findAbiSignature = (abi, methodName, signature) => findAbiFunction(abi, methodName).find((func) => func.inputs.map((i) => `${i.type}`).join(',') == signature);
633
+ export const getPoolName = (name) => {
634
+ const separatedName = name.split(": ");
1015
635
  if (separatedName.length > 1) {
1016
636
  return separatedName[1].trim();
1017
637
  }
@@ -1019,10 +639,8 @@ export var getPoolName = function (name) {
1019
639
  return separatedName[0].trim();
1020
640
  }
1021
641
  };
1022
- export var isStableNgPool = function (name) {
1023
- return name.includes('factory-stable-ng');
1024
- };
1025
- export var assetTypeNameHandler = function (assetTypeName) {
642
+ export const isStableNgPool = (name) => name.includes('factory-stable-ng');
643
+ export const assetTypeNameHandler = (assetTypeName) => {
1026
644
  if (assetTypeName.toUpperCase() === 'UNKNOWN') {
1027
645
  return 'OTHER';
1028
646
  }
@@ -1030,63 +648,58 @@ export var assetTypeNameHandler = function (assetTypeName) {
1030
648
  return assetTypeName.toUpperCase();
1031
649
  }
1032
650
  };
1033
- export var getBasePools = function () { return __awaiter(void 0, void 0, void 0, function () {
1034
- var factoryContract, factoryMulticallContract, basePoolCount, _a, _b, _c, calls, i, basePoolList, pools, basePoolIds;
1035
- return __generator(this, function (_d) {
1036
- switch (_d.label) {
1037
- case 0:
1038
- factoryContract = curve.contracts[curve.constants.ALIASES['stable_ng_factory']].contract;
1039
- factoryMulticallContract = curve.contracts[curve.constants.ALIASES['stable_ng_factory']].multicallContract;
1040
- _a = Number;
1041
- _c = (_b = curve).formatUnits;
1042
- return [4 /*yield*/, factoryContract.base_pool_count()];
1043
- case 1:
1044
- basePoolCount = _a.apply(void 0, [_c.apply(_b, [_d.sent(), 0])]);
1045
- calls = [];
1046
- for (i = 0; i < basePoolCount; i++) {
1047
- calls.push(factoryMulticallContract.base_pool_list(i));
1048
- }
1049
- return [4 /*yield*/, curve.multicallProvider.all(calls)];
1050
- case 2:
1051
- basePoolList = (_d.sent()).map(function (item) { return item.toLowerCase(); });
1052
- pools = __assign(__assign(__assign({}, curve.constants.STABLE_NG_FACTORY_POOLS_DATA), curve.constants.FACTORY_POOLS_DATA), curve.constants.POOLS_DATA);
1053
- basePoolIds = Object.keys(pools).filter(function (item) { return basePoolList.includes(pools[item].swap_address); });
1054
- return [2 /*return*/, basePoolIds.map(function (poolId) {
1055
- var pool = getPool(poolId);
1056
- return {
1057
- id: poolId,
1058
- name: pool.name,
1059
- pool: pool.address,
1060
- token: pool.lpToken,
1061
- coins: pool.underlyingCoinAddresses,
1062
- };
1063
- })];
1064
- }
651
+ export const getBasePools = () => __awaiter(void 0, void 0, void 0, function* () {
652
+ const factoryContract = curve.contracts[curve.constants.ALIASES['stable_ng_factory']].contract;
653
+ const factoryMulticallContract = curve.contracts[curve.constants.ALIASES['stable_ng_factory']].multicallContract;
654
+ const basePoolCount = Number(curve.formatUnits(yield factoryContract.base_pool_count(), 0));
655
+ const calls = [];
656
+ for (let i = 0; i < basePoolCount; i++) {
657
+ calls.push(factoryMulticallContract.base_pool_list(i));
658
+ }
659
+ const basePoolList = (yield curve.multicallProvider.all(calls)).map((item) => item.toLowerCase());
660
+ const pools = Object.assign(Object.assign(Object.assign({}, curve.constants.STABLE_NG_FACTORY_POOLS_DATA), curve.constants.FACTORY_POOLS_DATA), curve.constants.POOLS_DATA);
661
+ const basePoolIds = Object.keys(pools).filter((item) => basePoolList.includes(pools[item].swap_address));
662
+ return basePoolIds.map((poolId) => {
663
+ const pool = getPool(poolId);
664
+ return {
665
+ id: poolId,
666
+ name: pool.name,
667
+ pool: pool.address,
668
+ token: pool.lpToken,
669
+ coins: pool.underlyingCoinAddresses,
670
+ };
1065
671
  });
1066
- }); };
1067
- export var memoizedContract = function () {
1068
- var cache = {};
1069
- return function (address, abi, provider) {
1070
- if (address in cache) {
1071
- return cache[address];
1072
- }
1073
- else {
1074
- var result = new Contract(address, abi, provider);
1075
- cache[address] = result;
1076
- return result;
1077
- }
1078
- };
1079
- };
1080
- export var memoizedMulticallContract = function () {
1081
- var cache = {};
1082
- return function (address, abi) {
1083
- if (address in cache) {
1084
- return cache[address];
1085
- }
1086
- else {
1087
- var result = new MulticallContract(address, abi);
1088
- cache[address] = result;
1089
- return result;
1090
- }
1091
- };
1092
- };
672
+ });
673
+ export function log(fnName, ...args) {
674
+ if (process.env.NODE_ENV === 'development') {
675
+ console.log(`curve-js@${new Date().toISOString()} -> ${fnName}:`, ...args);
676
+ }
677
+ }
678
+ export function runWorker(code, syncFn, inputData, timeout = 30000) {
679
+ if (typeof Worker === 'undefined') {
680
+ // in nodejs run worker in main thread
681
+ return Promise.resolve(syncFn()(inputData));
682
+ }
683
+ const blob = new Blob([code], { type: 'application/javascript' });
684
+ const blobUrl = URL.createObjectURL(blob);
685
+ const worker = new Worker(blobUrl, { type: 'module' });
686
+ return new Promise((resolve, reject) => {
687
+ const timer = setTimeout(() => reject(new Error('Timeout')), timeout);
688
+ worker.onerror = (e) => {
689
+ clearTimeout(timer);
690
+ console.error(code, inputData, e);
691
+ reject(e);
692
+ };
693
+ worker.onmessage = (e) => {
694
+ const { type, result } = e.data;
695
+ if (type === inputData.type) {
696
+ clearTimeout(timer);
697
+ resolve(result);
698
+ // console.log(code, inputData, result, start - Date.now());
699
+ }
700
+ };
701
+ worker.postMessage(inputData);
702
+ }).finally(() => {
703
+ worker.terminate();
704
+ });
705
+ }