@gearbox-protocol/sdk 2.1.7 → 2.1.9

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.
@@ -30,7 +30,7 @@ contract SupportedContracts is Test, ISupportedContracts {
30
30
 
31
31
  uint256 public override contractCount;
32
32
 
33
- constructor() {
33
+ constructor(uint256 _chainId) {
34
34
  contractDataByNetwork[1].push(
35
35
  ContractData({
36
36
  id: Contracts.UNISWAP_V2_ROUTER,
@@ -349,7 +349,7 @@ contract SupportedContracts is Test, ISupportedContracts {
349
349
  })
350
350
  );
351
351
 
352
- ContractData[] storage cd = contractDataByNetwork[block.chainid];
352
+ ContractData[] storage cd = contractDataByNetwork[_chainId];
353
353
 
354
354
  uint256 len = cd.length;
355
355
  contractCount = len;
@@ -1,5 +1,5 @@
1
1
  import { BigNumber } from "ethers";
2
- import { ConvexPoolContract, ConvexPoolParams } from "../contracts/contracts";
2
+ import { ConvexPoolContract, ConvexPoolParams, CurveGEARPoolParams, CurveParams, CurveSteCRVPoolParams } from "../contracts/contracts";
3
3
  import { NetworkType } from "../core/chains";
4
4
  import { CurveLPToken } from "../tokens/curveLP";
5
5
  import { SupportedToken } from "../tokens/token";
@@ -12,30 +12,39 @@ export interface GetConvexAPYBulkProps {
12
12
  generated: GetConvexAPYBulkCallsReturns;
13
13
  response: Array<BigNumber>;
14
14
  }
15
- export declare function getConvexAPYBulk({ generated, response, getTokenPrice, curveAPY, }: GetConvexAPYBulkProps): bigint[];
15
+ export declare function getConvexAPYBulk(props: GetConvexAPYBulkProps): bigint[];
16
+ interface PoolInfo {
17
+ cvxPool: ConvexPoolParams;
18
+ cvxPoolAddress: string;
19
+ cvxExtraPools: string[];
20
+ crvPoolAddress: string;
21
+ crvToken: CurveLPToken;
22
+ crvPool: CrvParams;
23
+ crvLpPrice: Array<string>;
24
+ tokenList: Record<SupportedToken, string>;
25
+ }
26
+ type CrvParams = CurveParams | CurveSteCRVPoolParams | CurveGEARPoolParams;
16
27
  type GetConvexAPYBulkCallsReturns = ReturnType<typeof getConvexAPYBulkCalls>;
17
28
  export interface GetConvexAPYBulkCallsProps {
18
29
  pools: Array<ConvexPoolContract>;
19
30
  networkType: NetworkType;
20
31
  }
21
32
  export declare function getConvexAPYBulkCalls({ pools, networkType, }: GetConvexAPYBulkCallsProps): {
22
- poolsInfo: (readonly [ConvexPoolParams, string, string, CurveLPToken, string[], Record<SupportedToken, string>])[];
23
- calls: [MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/curve/ICurvePool").ICurvePoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IConvexToken").IConvexTokenInterface>, ...MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>[]][];
33
+ poolsInfo: PoolInfo[];
34
+ calls: [MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/curve/ICurvePool").ICurvePoolInterface>, MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IConvexToken").IConvexTokenInterface>, ...(MCall<any> | MCall<import("../types/@gearbox-protocol/integrations-v2/contracts/integrations/convex/IBaseRewardPool").IBaseRewardPoolInterface>)[]][];
24
35
  };
25
- export declare function getCVXMintAmount(crvAmount: bigint, cvxSupply: bigint): bigint;
26
36
  export interface CalculateConvexAPYProps {
27
- baseRewardsFinish: bigint;
28
- basePoolRate: bigint;
29
- basePoolSupply: bigint;
30
- vPrice: bigint;
31
- cvxSupply: bigint;
32
- extra: Array<bigint>;
33
- extraRewardsFinish: Array<bigint>;
34
- extraPoolAddresses: string[];
35
- poolParams: ConvexPoolParams;
36
- underlying: CurveLPToken;
37
+ cvxPoolRate: bigint;
38
+ cvxPoolSupply: bigint;
39
+ cvxTokenSupply: bigint;
40
+ cvxPoolRewardsFinish: bigint;
41
+ cvxExtraRewards: Array<bigint>;
42
+ cvxExtraRewardsFinish: Array<bigint>;
43
+ crvVPrice: bigint;
44
+ crvLpPrice: Array<bigint>;
45
+ info: PoolInfo;
37
46
  getTokenPrice: GetTokenPriceCallback;
38
47
  curveAPY: CurveAPYResult;
39
- tokenList: Record<SupportedToken, string>;
40
48
  }
49
+ export declare function getCVXMintAmount(crvAmount: bigint, cvxTokenSupply: bigint): bigint;
41
50
  export {};
@@ -1,37 +1,41 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getCVXMintAmount = exports.getConvexAPYBulkCalls = exports.getConvexAPYBulk = void 0;
4
+ const utils_1 = require("ethers/lib/utils");
4
5
  const contracts_1 = require("../contracts/contracts");
5
6
  const constants_1 = require("../core/constants");
6
7
  const token_1 = require("../tokens/token");
7
8
  const types_1 = require("../types");
8
9
  const formatter_1 = require("../utils/formatter");
9
- function getConvexAPYBulk({ generated, response, getTokenPrice, curveAPY, }) {
10
- const { poolsInfo, calls } = generated;
10
+ const V2_POOLS = { 20: true };
11
+ function getConvexAPYBulk(props) {
12
+ const { poolsInfo, calls } = props.generated;
11
13
  const [parsedResponse] = calls.reduce(([acc, start], call) => {
12
14
  const end = start + call.length;
13
- const currentResponse = response.slice(start, end);
15
+ const currentResponse = props.response.slice(start, end);
14
16
  acc.push(currentResponse);
15
17
  return [acc, end];
16
18
  }, [[], 0]);
17
- const apyList = parsedResponse.map(([baseRewardsFinish, basePoolRate, basePoolSupply, vPrice, cvxSupply, ...rest], i) => {
18
- const [poolParams, , , underlying, extraPoolAddresses, tokenList] = poolsInfo[i];
19
- const extra = rest.slice(0, extraPoolAddresses.length);
20
- const extraRewardsFinish = rest.slice(extraPoolAddresses.length);
19
+ const apyList = parsedResponse.map(([cvxPoolRewardsFinish, cvxPoolRate, cvxPoolSupply, crvVPrice, cvxTokenSupply, ...rest], i) => {
20
+ const { cvxExtraPools, crvLpPrice: crvLpPriceList } = poolsInfo[i];
21
+ const extraEnd = cvxExtraPools.length;
22
+ const cvxExtraRewards = rest.slice(0, extraEnd);
23
+ const extraFinishEnd = cvxExtraPools.length * 2;
24
+ const cvxExtraRewardsFinish = rest.slice(extraEnd, extraFinishEnd);
25
+ const lpPriceEnd = extraFinishEnd + crvLpPriceList.length;
26
+ const crvLpPrice = rest.slice(extraFinishEnd, lpPriceEnd);
21
27
  const apy = calculateConvexAPY({
22
- baseRewardsFinish: (0, formatter_1.toBigInt)(baseRewardsFinish),
23
- basePoolRate: (0, formatter_1.toBigInt)(basePoolRate),
24
- basePoolSupply: (0, formatter_1.toBigInt)(basePoolSupply),
25
- vPrice: (0, formatter_1.toBigInt)(vPrice),
26
- cvxSupply: (0, formatter_1.toBigInt)(cvxSupply),
27
- extra: extra.map(v => (0, formatter_1.toBigInt)(v)),
28
- extraRewardsFinish: extraRewardsFinish.map(v => (0, formatter_1.toBigInt)(v)),
29
- extraPoolAddresses,
30
- poolParams,
31
- underlying,
32
- getTokenPrice,
33
- curveAPY,
34
- tokenList,
28
+ cvxPoolRewardsFinish: (0, formatter_1.toBigInt)(cvxPoolRewardsFinish),
29
+ cvxPoolRate: (0, formatter_1.toBigInt)(cvxPoolRate),
30
+ cvxPoolSupply: (0, formatter_1.toBigInt)(cvxPoolSupply),
31
+ crvVPrice: (0, formatter_1.toBigInt)(crvVPrice),
32
+ cvxTokenSupply: (0, formatter_1.toBigInt)(cvxTokenSupply),
33
+ cvxExtraRewards: cvxExtraRewards.map(v => (0, formatter_1.toBigInt)(v)),
34
+ cvxExtraRewardsFinish: cvxExtraRewardsFinish.map(v => (0, formatter_1.toBigInt)(v)),
35
+ crvLpPrice: crvLpPrice.map(v => (0, formatter_1.toBigInt)(v)),
36
+ info: poolsInfo[i],
37
+ getTokenPrice: props.getTokenPrice,
38
+ curveAPY: props.curveAPY,
35
39
  });
36
40
  return apy;
37
41
  });
@@ -42,118 +46,144 @@ function getPoolInfo({ pool, networkType }) {
42
46
  const tokenList = token_1.tokenDataByNetwork[networkType];
43
47
  const contractsList = contracts_1.contractsByNetwork[networkType];
44
48
  const poolParams = contracts_1.contractParams[pool];
49
+ const basePoolAddress = contractsList[pool];
50
+ const extraPoolAddresses = poolParams.extraRewards.map(d => d.poolAddress[networkType]);
45
51
  const stakedTokenParams = token_1.supportedTokens[poolParams.stakedToken];
46
52
  const { underlying } = stakedTokenParams;
47
- const basePoolAddress = contractsList[pool];
48
53
  const crvParams = token_1.supportedTokens[underlying];
49
54
  const swapPoolAddress = contractsList[crvParams.pool];
50
- const extraPoolAddresses = poolParams.extraRewards.map(d => d.poolAddress[networkType]);
51
- return [
52
- poolParams,
53
- basePoolAddress,
54
- swapPoolAddress,
55
- underlying,
56
- extraPoolAddresses,
55
+ const crvPoolParams = contracts_1.contractParams[crvParams.pool];
56
+ const crvLpPrice = V2_POOLS[crvPoolParams["version"]]
57
+ ? [swapPoolAddress]
58
+ : [];
59
+ return {
60
+ cvxPool: poolParams,
61
+ cvxPoolAddress: basePoolAddress,
62
+ cvxExtraPools: extraPoolAddresses,
63
+ crvPoolAddress: swapPoolAddress,
64
+ crvPool: crvPoolParams,
65
+ crvToken: underlying,
66
+ crvLpPrice,
57
67
  tokenList,
58
- ];
68
+ };
59
69
  }
60
70
  function getConvexAPYBulkCalls({ pools, networkType, }) {
61
71
  const poolsInfo = pools.map(pool => getPoolInfo({ networkType, pool }));
62
- const calls = poolsInfo.map(([, basePoolAddress, swapPoolAddress, , extraPoolAddresses, tokenList]) => getPoolDataCalls({
63
- basePoolAddress,
64
- swapPoolAddress,
65
- cvxAddress: tokenList.CVX,
66
- extraPoolAddresses,
67
- }));
72
+ const calls = poolsInfo.map(info => getPoolDataCalls(info));
68
73
  return { poolsInfo, calls };
69
74
  }
70
75
  exports.getConvexAPYBulkCalls = getConvexAPYBulkCalls;
71
- function getPoolDataCalls({ basePoolAddress, swapPoolAddress, cvxAddress, extraPoolAddresses, }) {
76
+ function getPoolDataCalls(props) {
72
77
  const calls = [
73
78
  {
74
- address: basePoolAddress,
79
+ address: props.cvxPoolAddress,
75
80
  interface: types_1.IBaseRewardPool__factory.createInterface(),
76
81
  method: "periodFinish()",
77
82
  },
78
83
  {
79
- address: basePoolAddress,
84
+ address: props.cvxPoolAddress,
80
85
  interface: types_1.IBaseRewardPool__factory.createInterface(),
81
86
  method: "rewardRate()",
82
87
  },
83
88
  {
84
- address: basePoolAddress,
89
+ address: props.cvxPoolAddress,
85
90
  interface: types_1.IBaseRewardPool__factory.createInterface(),
86
91
  method: "totalSupply()",
87
92
  },
88
93
  {
89
- address: swapPoolAddress,
94
+ address: props.crvPoolAddress,
90
95
  interface: types_1.ICurvePool__factory.createInterface(),
91
96
  method: "get_virtual_price()",
92
97
  },
93
98
  {
94
- address: cvxAddress,
99
+ address: props.tokenList.CVX,
95
100
  interface: types_1.IConvexToken__factory.createInterface(),
96
101
  method: "totalSupply()",
97
102
  },
98
- ...extraPoolAddresses.map((extraPoolAddress) => ({
103
+ ...props.cvxExtraPools.map((extraPoolAddress) => ({
99
104
  address: extraPoolAddress,
100
105
  interface: types_1.IBaseRewardPool__factory.createInterface(),
101
106
  method: "rewardRate()",
102
107
  })),
103
- ...extraPoolAddresses.map((extraPoolAddress) => ({
108
+ ...props.cvxExtraPools.map((extraPoolAddress) => ({
104
109
  address: extraPoolAddress,
105
110
  interface: types_1.IBaseRewardPool__factory.createInterface(),
106
111
  method: "periodFinish()",
107
112
  })),
113
+ ...(V2_POOLS[props.crvPool["version"]]
114
+ ? [
115
+ {
116
+ address: props.crvPoolAddress,
117
+ interface: new utils_1.Interface([
118
+ "function lp_price() view returns (uint256)",
119
+ ]),
120
+ method: "lp_price()",
121
+ },
122
+ ]
123
+ : []),
108
124
  ];
109
125
  return calls;
110
126
  }
111
127
  const CVX_MAX_SUPPLY = constants_1.WAD * 100000000n;
112
128
  const CVX_REDUCTION_PER_CLIFF = 100000n;
113
129
  const CVX_TOTAL_CLIFFS = constants_1.WAD * 1000n;
114
- function getCVXMintAmount(crvAmount, cvxSupply) {
115
- const currentCliff = cvxSupply / CVX_REDUCTION_PER_CLIFF;
116
- if (currentCliff < CVX_TOTAL_CLIFFS) {
117
- const remainingCliffs = CVX_TOTAL_CLIFFS - currentCliff;
118
- const mintedAmount = (crvAmount * remainingCliffs) / CVX_TOTAL_CLIFFS;
119
- const amountTillMax = CVX_MAX_SUPPLY - cvxSupply;
120
- return mintedAmount > amountTillMax ? amountTillMax : mintedAmount;
121
- }
122
- return 0n;
123
- }
124
- exports.getCVXMintAmount = getCVXMintAmount;
125
- function getTimestampInSeconds() {
126
- return Math.floor(Date.now() / 1000);
127
- }
128
130
  const CURRENCY_LIST = {
129
131
  stkcvxsteCRV: "WETH",
132
+ stkcvxcrvCVXETH: "WETH",
133
+ stkcvxcrvCRVETH: "WETH",
134
+ stkcvxLDOETH: "WETH",
135
+ stkcvxcrvUSDTWBTCWETH: "USDT",
130
136
  };
131
- function calculateConvexAPY({ baseRewardsFinish, basePoolRate, basePoolSupply, vPrice, cvxSupply, extra, extraRewardsFinish, extraPoolAddresses, poolParams, underlying, getTokenPrice, curveAPY, tokenList, }) {
137
+ function calculateConvexAPY(props) {
138
+ const { tokenList, cvxPool, crvToken, cvxExtraPools } = props.info;
132
139
  const currentTimestamp = getTimestampInSeconds();
133
- const currencySymbol = CURRENCY_LIST[poolParams.stakedToken];
140
+ const currencySymbol = CURRENCY_LIST[cvxPool.stakedToken];
134
141
  const currency = currencySymbol && tokenList[currencySymbol || ""];
135
- const cvxPrice = getTokenPrice(tokenList.CVX, currency);
136
- const crvPrice = getTokenPrice(tokenList.CRV, currency);
137
- const crvPerSecond = basePoolRate;
138
- const virtualSupply = (basePoolSupply * vPrice) / constants_1.WAD;
142
+ const cvxPrice = props.getTokenPrice(tokenList.CVX, currency);
143
+ const crvPrice = props.getTokenPrice(tokenList.CRV, currency);
144
+ const crvPerSecond = props.cvxPoolRate;
145
+ const vPrice = getVirtualPrice(props);
146
+ const virtualSupply = (props.cvxPoolSupply * vPrice) / constants_1.WAD;
139
147
  const crvPerUnderlying = (crvPerSecond * constants_1.WAD) / virtualSupply;
140
148
  const crvPerYear = crvPerUnderlying * BigInt(constants_1.SECONDS_PER_YEAR);
141
- const cvxPerYear = getCVXMintAmount(crvPerYear, cvxSupply);
142
- const baseFinished = baseRewardsFinish <= currentTimestamp;
149
+ const cvxPerYear = getCVXMintAmount(crvPerYear, props.cvxTokenSupply);
150
+ const baseFinished = props.cvxPoolRewardsFinish <= currentTimestamp;
143
151
  const crvAPY = baseFinished ? 0n : (crvPerYear * crvPrice) / constants_1.PRICE_DECIMALS;
144
152
  const cvxAPY = baseFinished ? 0n : (cvxPerYear * cvxPrice) / constants_1.PRICE_DECIMALS;
145
- const extraAPRs = extraPoolAddresses.map((_, index) => {
146
- const extraRewardSymbol = poolParams.extraRewards[index].rewardToken;
147
- const extraPoolRate = extra[index];
148
- const extraFinished = extraRewardsFinish[index];
153
+ const extraAPRs = cvxExtraPools.map((_, index) => {
154
+ const extraRewardSymbol = cvxPool.extraRewards[index].rewardToken;
155
+ const extraPoolRate = props.cvxExtraRewards[index];
156
+ const extraFinished = props.cvxExtraRewardsFinish[index];
149
157
  const perUnderlying = (extraPoolRate * constants_1.WAD) / virtualSupply;
150
158
  const perYear = perUnderlying * BigInt(constants_1.SECONDS_PER_YEAR);
151
- const extraPrice = getTokenPrice(tokenList[extraRewardSymbol], currency);
159
+ const extraPrice = props.getTokenPrice(tokenList[extraRewardSymbol], currency);
152
160
  const extraAPY = (perYear * extraPrice) / constants_1.PRICE_DECIMALS;
153
161
  const finished = extraFinished <= currentTimestamp;
154
162
  return finished ? 0n : extraAPY;
155
163
  });
156
164
  const extraAPYTotal = extraAPRs.reduce((acc, apy) => acc + apy, 0n);
157
- const baseApyWAD = curveAPY[underlying].base;
165
+ const baseApyWAD = props.curveAPY[crvToken].base;
158
166
  return baseApyWAD + crvAPY + cvxAPY + extraAPYTotal;
159
167
  }
168
+ function getTimestampInSeconds() {
169
+ return Math.floor(Date.now() / 1000);
170
+ }
171
+ function getCVXMintAmount(crvAmount, cvxTokenSupply) {
172
+ const currentCliff = cvxTokenSupply / CVX_REDUCTION_PER_CLIFF;
173
+ if (currentCliff < CVX_TOTAL_CLIFFS) {
174
+ const remainingCliffs = CVX_TOTAL_CLIFFS - currentCliff;
175
+ const mintedAmount = (crvAmount * remainingCliffs) / CVX_TOTAL_CLIFFS;
176
+ const amountTillMax = CVX_MAX_SUPPLY - cvxTokenSupply;
177
+ return mintedAmount > amountTillMax ? amountTillMax : mintedAmount;
178
+ }
179
+ return 0n;
180
+ }
181
+ exports.getCVXMintAmount = getCVXMintAmount;
182
+ function getVirtualPrice(props) {
183
+ if (V2_POOLS[props.info.crvPool.version]) {
184
+ return props.crvLpPrice[0] ?? props.crvVPrice;
185
+ }
186
+ else {
187
+ return props.crvVPrice;
188
+ }
189
+ }
@@ -31,6 +31,7 @@ type UniswapV3Params = {
31
31
  export type CurveParams = {
32
32
  protocol: Protocols.Curve;
33
33
  type: AdapterInterface.CURVE_V1_2ASSETS | AdapterInterface.CURVE_V1_3ASSETS | AdapterInterface.CURVE_V1_4ASSETS | AdapterInterface.CURVE_V1_WRAPPER;
34
+ version: number;
34
35
  lpToken: CurveLPToken;
35
36
  tokens: Array<NormalToken | CurveLPToken>;
36
37
  underlyings?: Array<NormalToken>;
@@ -39,6 +40,7 @@ export type CurveParams = {
39
40
  export type CurveSteCRVPoolParams = {
40
41
  protocol: Protocols.Curve;
41
42
  type: AdapterInterface.CURVE_V1_STECRV_POOL;
43
+ version: number;
42
44
  pool: Record<NetworkType, string>;
43
45
  tokens: ["WETH", "STETH"];
44
46
  lpToken: "steCRV";
@@ -46,6 +48,7 @@ export type CurveSteCRVPoolParams = {
46
48
  export type CurveGEARPoolParams = {
47
49
  protocol: Protocols.Curve;
48
50
  type: AdapterInterface.CURVE_V1_2ASSETS;
51
+ version: number;
49
52
  pool: Record<NetworkType, string>;
50
53
  tokens: ["GEAR", "WETH"];
51
54
  lpToken: "GEAR";
@@ -167,6 +167,7 @@ exports.contractParams = {
167
167
  name: "Curve 3Pool",
168
168
  protocol: protocols_1.Protocols.Curve,
169
169
  type: adapters_1.AdapterInterface.CURVE_V1_3ASSETS,
170
+ version: 10,
170
171
  lpToken: "3Crv",
171
172
  tokens: ["DAI", "USDC", "USDT"],
172
173
  },
@@ -174,6 +175,7 @@ exports.contractParams = {
174
175
  name: "Curve crvFRAX",
175
176
  protocol: protocols_1.Protocols.Curve,
176
177
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
178
+ version: 10,
177
179
  lpToken: "crvFRAX",
178
180
  tokens: ["FRAX", "USDC"],
179
181
  },
@@ -181,6 +183,7 @@ exports.contractParams = {
181
183
  name: "Curve stETH",
182
184
  protocol: protocols_1.Protocols.Curve,
183
185
  type: adapters_1.AdapterInterface.CURVE_V1_STECRV_POOL,
186
+ version: 10,
184
187
  pool: {
185
188
  Mainnet: "0xDC24316b9AE028F1497c275EB9192a3Ea0f67022",
186
189
  Arbitrum: constants_1.NOT_DEPLOYED, // CURVE_STECRV_POOL
@@ -192,6 +195,7 @@ exports.contractParams = {
192
195
  name: "Curve GEAR",
193
196
  protocol: protocols_1.Protocols.Curve,
194
197
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
198
+ version: 10,
195
199
  pool: {
196
200
  Mainnet: "0x0E9B5B092caD6F1c5E6bc7f89Ffe1abb5c95F1C2",
197
201
  Arbitrum: constants_1.NOT_DEPLOYED,
@@ -203,6 +207,7 @@ exports.contractParams = {
203
207
  name: "Curve FRAX",
204
208
  protocol: protocols_1.Protocols.Curve,
205
209
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
210
+ version: 10,
206
211
  lpToken: "FRAX3CRV",
207
212
  tokens: ["FRAX", "3Crv"],
208
213
  underlyings: ["FRAX", "DAI", "USDC", "USDT"],
@@ -211,6 +216,7 @@ exports.contractParams = {
211
216
  name: "Curve LUSD",
212
217
  protocol: protocols_1.Protocols.Curve,
213
218
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
219
+ version: 10,
214
220
  lpToken: "LUSD3CRV",
215
221
  tokens: ["LUSD", "3Crv"],
216
222
  underlyings: ["LUSD", "DAI", "USDC", "USDT"],
@@ -219,6 +225,7 @@ exports.contractParams = {
219
225
  name: "Curve SUSD",
220
226
  protocol: protocols_1.Protocols.Curve,
221
227
  type: adapters_1.AdapterInterface.CURVE_V1_4ASSETS,
228
+ version: 10,
222
229
  lpToken: "crvPlain3andSUSD",
223
230
  tokens: ["DAI", "USDC", "USDT", "sUSD"],
224
231
  wrapper: "CURVE_SUSD_DEPOSIT",
@@ -227,6 +234,7 @@ exports.contractParams = {
227
234
  name: "Curve SUSD",
228
235
  protocol: protocols_1.Protocols.Curve,
229
236
  type: adapters_1.AdapterInterface.CURVE_V1_WRAPPER,
237
+ version: 10,
230
238
  lpToken: "crvPlain3andSUSD",
231
239
  tokens: ["DAI", "USDC", "USDT", "sUSD"],
232
240
  },
@@ -234,30 +242,34 @@ exports.contractParams = {
234
242
  name: "Curve GUSD",
235
243
  protocol: protocols_1.Protocols.Curve,
236
244
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
245
+ version: 10,
237
246
  lpToken: "gusd3CRV",
238
247
  tokens: ["GUSD", "3Crv"],
239
248
  underlyings: ["GUSD", "DAI", "USDC", "USDT"],
240
249
  },
241
- CURVE_OHMFRAXBP_POOL: {
242
- name: "Curve OHM_FRAXBP",
243
- protocol: protocols_1.Protocols.Curve,
244
- type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
245
- lpToken: "OHMFRAXBP",
246
- tokens: ["OHM", "crvFRAX"],
247
- underlyings: ["OHM", "FRAX", "USDC"],
248
- },
249
250
  CURVE_MIM_POOL: {
250
251
  name: "Curve MIM",
251
252
  protocol: protocols_1.Protocols.Curve,
252
253
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
254
+ version: 10,
253
255
  lpToken: "MIM_3LP3CRV",
254
256
  tokens: ["MIM", "3Crv"],
255
257
  underlyings: ["MIM", "DAI", "USDC", "USDT"],
256
258
  },
259
+ CURVE_OHMFRAXBP_POOL: {
260
+ name: "Curve OHM_FRAXBP",
261
+ protocol: protocols_1.Protocols.Curve,
262
+ type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
263
+ version: 20,
264
+ lpToken: "OHMFRAXBP",
265
+ tokens: ["OHM", "crvFRAX"],
266
+ underlyings: ["OHM", "FRAX", "USDC"],
267
+ },
257
268
  CURVE_CRVETH_POOL: {
258
269
  name: "Curve CRVETH",
259
270
  protocol: protocols_1.Protocols.Curve,
260
271
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
272
+ version: 20,
261
273
  lpToken: "crvCRVETH",
262
274
  tokens: ["WETH", "CRV"],
263
275
  },
@@ -265,6 +277,7 @@ exports.contractParams = {
265
277
  name: "Curve CVXETH",
266
278
  protocol: protocols_1.Protocols.Curve,
267
279
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
280
+ version: 20,
268
281
  lpToken: "crvCVXETH",
269
282
  tokens: ["WETH", "CVX"],
270
283
  },
@@ -272,6 +285,7 @@ exports.contractParams = {
272
285
  name: "Curve 3Crypto",
273
286
  protocol: protocols_1.Protocols.Curve,
274
287
  type: adapters_1.AdapterInterface.CURVE_V1_3ASSETS,
288
+ version: 20,
275
289
  lpToken: "crvUSDTWBTCWETH",
276
290
  tokens: ["USDT", "WBTC", "WETH"],
277
291
  },
@@ -279,6 +293,7 @@ exports.contractParams = {
279
293
  name: "Curve LDOETH",
280
294
  protocol: protocols_1.Protocols.Curve,
281
295
  type: adapters_1.AdapterInterface.CURVE_V1_2ASSETS,
296
+ version: 20,
282
297
  lpToken: "LDOETH",
283
298
  tokens: ["WETH", "LDO"],
284
299
  },
@@ -409,13 +424,6 @@ exports.contractParams = {
409
424
  },
410
425
  ],
411
426
  },
412
- CONVEX_OHMFRAXBP_POOL: {
413
- name: "Convex OHMFRAXBP",
414
- protocol: protocols_1.Protocols.Convex,
415
- type: adapters_1.AdapterInterface.CONVEX_V1_BASE_REWARD_POOL,
416
- stakedToken: "stkcvxOHMFRAXBP",
417
- extraRewards: [],
418
- },
419
427
  CONVEX_MIM3CRV_POOL: {
420
428
  name: "Convex MIM3CRV",
421
429
  protocol: protocols_1.Protocols.Convex,
@@ -431,6 +439,13 @@ exports.contractParams = {
431
439
  },
432
440
  ],
433
441
  },
442
+ CONVEX_OHMFRAXBP_POOL: {
443
+ name: "Convex OHMFRAXBP",
444
+ protocol: protocols_1.Protocols.Convex,
445
+ type: adapters_1.AdapterInterface.CONVEX_V1_BASE_REWARD_POOL,
446
+ stakedToken: "stkcvxOHMFRAXBP",
447
+ extraRewards: [],
448
+ },
434
449
  CONVEX_CRVETH_POOL: {
435
450
  name: "Convex crvCRVETH",
436
451
  protocol: protocols_1.Protocols.Convex,
@@ -1,11 +1,22 @@
1
1
  import { NetworkType } from "../core/chains";
2
2
  export declare const stEthPoolWrapper: Record<NetworkType, string>;
3
- export declare const CREDIT_MANAGER_DAI_V2_MAINNET: string;
4
- export declare const CREDIT_MANAGER_USDC_V2_MAINNET: string;
5
- export declare const CREDIT_MANAGER_WETH_V2_MAINNET: string;
6
- export declare const CREDIT_MANAGER_WSTETH_V2_MAINNET: string;
7
- export declare const CREDIT_MANAGER_WBTC_V2_MAINNET: string;
8
- export declare const CREDIT_MANAGER_FRAX_V2_MAINNET: string;
9
- export type CreditManagersV2 = typeof CREDIT_MANAGER_DAI_V2_MAINNET | typeof CREDIT_MANAGER_USDC_V2_MAINNET | typeof CREDIT_MANAGER_WETH_V2_MAINNET | typeof CREDIT_MANAGER_WSTETH_V2_MAINNET | typeof CREDIT_MANAGER_WBTC_V2_MAINNET | typeof CREDIT_MANAGER_FRAX_V2_MAINNET;
10
- export declare const deployedContracts: Record<string, string>;
3
+ type MainnetCreditManagersV1 = "DAI_V1" | "USDC_V1" | "WETH_V1" | "WBTC_V1";
4
+ type MainnetCreditManagersV2 = "DAI_V2" | "USDC_V2" | "WETH_V2" | "WSTETH_V2" | "WBTC_V2" | "FRAX_V2";
5
+ type MainnetCreditManagersV2_1 = "WETH_V2_1";
6
+ export type MainnetCreditManagers = MainnetCreditManagersV1 | MainnetCreditManagersV2 | MainnetCreditManagersV2_1;
7
+ export type ArbitrumCreditManagers = never;
8
+ type CreditManagersListType = {
9
+ [key in NetworkType]: key extends "Mainnet" ? Record<MainnetCreditManagers, string> : key extends "Arbitrum" ? Record<ArbitrumCreditManagers, string> : never;
10
+ };
11
+ export declare const creditManagerByNetwork: CreditManagersListType;
12
+ export type SupportedCreditManagers = MainnetCreditManagers | ArbitrumCreditManagers;
13
+ export declare const creditManagerByAddress: Record<string, SupportedCreditManagers>;
14
+ export type MainnetPools = "DAI_V1" | "USDC_V1" | "WETH_V1" | "WBTC_V1" | "WSTETH_V1" | "FRAX_V1";
15
+ export type ArbitrumPools = never;
16
+ type PoolsListType = {
17
+ [key in NetworkType]: key extends "Mainnet" ? Record<MainnetPools, string> : key extends "Arbitrum" ? Record<ArbitrumPools, string> : never;
18
+ };
19
+ export declare const poolByNetwork: PoolsListType;
20
+ export type SupportedCreditPools = MainnetPools | ArbitrumPools;
11
21
  export declare function getContractName(address: string): string;
22
+ export {};
@@ -1,38 +1,67 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getContractName = exports.deployedContracts = exports.CREDIT_MANAGER_FRAX_V2_MAINNET = exports.CREDIT_MANAGER_WBTC_V2_MAINNET = exports.CREDIT_MANAGER_WSTETH_V2_MAINNET = exports.CREDIT_MANAGER_WETH_V2_MAINNET = exports.CREDIT_MANAGER_USDC_V2_MAINNET = exports.CREDIT_MANAGER_DAI_V2_MAINNET = exports.stEthPoolWrapper = void 0;
3
+ exports.getContractName = exports.poolByNetwork = exports.creditManagerByAddress = exports.creditManagerByNetwork = exports.stEthPoolWrapper = void 0;
4
4
  const mappers_1 = require("../utils/mappers");
5
5
  const contracts_1 = require("./contracts");
6
6
  exports.stEthPoolWrapper = {
7
7
  Mainnet: "0x5a97e3E43dCBFe620ccF7865739075f92E93F5E4",
8
8
  Arbitrum: "0x3fe62a62C022A069952069b32C9d56718D30B7ec",
9
9
  };
10
- exports.CREDIT_MANAGER_DAI_V2_MAINNET = "0x672461Bfc20DD783444a830Ad4c38b345aB6E2f7".toLowerCase();
11
- exports.CREDIT_MANAGER_USDC_V2_MAINNET = "0x95357303f995e184A7998dA6C6eA35cC728A1900".toLowerCase();
12
- exports.CREDIT_MANAGER_WETH_V2_MAINNET = "0x5887ad4Cb2352E7F01527035fAa3AE0Ef2cE2b9B".toLowerCase();
13
- exports.CREDIT_MANAGER_WSTETH_V2_MAINNET = "0xe0bCE4460795281d39c91da9B0275BcA968293de".toLowerCase();
14
- exports.CREDIT_MANAGER_WBTC_V2_MAINNET = "0xc62BF8a7889AdF1c5Dc4665486c7683ae6E74e0F".toLowerCase();
15
- exports.CREDIT_MANAGER_FRAX_V2_MAINNET = "0xA3E1e0d58FE8dD8C9dd48204699a1178f1B274D8".toLowerCase();
16
- exports.deployedContracts = {
17
- // MAINNET
18
- "0x777E23A2AcB2fCbB35f6ccF98272d03C722Ba6EB": "DAI",
19
- "0x2664cc24CBAd28749B3Dd6fC97A6B402484De527": "USDC",
20
- "0x968f9a68a98819E2e6Bb910466e191A7b6cf02F0": "WETH",
21
- "0xC38478B0A4bAFE964C3526EEFF534d70E1E09017": "WBTC",
22
- "0x79012c8d491dcf3a30db20d1f449b14caf01da6c": "FRAX",
23
- // MAINNET POOLS
24
- "0x24946bCbBd028D5ABb62ad9B635EB1b1a67AF668": "DAI",
25
- "0x86130bDD69143D8a4E5fc50bf4323D48049E98E4": "USDC",
26
- "0xB03670c20F87f2169A7c4eBE35746007e9575901": "WETH",
27
- "0xB8cf3Ed326bB0E51454361Fb37E9E8df6DC5C286": "wstETH",
28
- "0xB2A015c71c17bCAC6af36645DEad8c572bA08A08": "WBTC",
10
+ exports.creditManagerByNetwork = {
11
+ Mainnet: {
12
+ DAI_V1: "0x777E23A2AcB2fCbB35f6ccF98272d03C722Ba6EB".toLowerCase(),
13
+ USDC_V1: "0x2664cc24CBAd28749B3Dd6fC97A6B402484De527".toLowerCase(),
14
+ WETH_V1: "0x968f9a68a98819E2e6Bb910466e191A7b6cf02F0".toLowerCase(),
15
+ WBTC_V1: "0xC38478B0A4bAFE964C3526EEFF534d70E1E09017".toLowerCase(),
16
+ DAI_V2: "0x672461Bfc20DD783444a830Ad4c38b345aB6E2f7".toLowerCase(),
17
+ USDC_V2: "0x95357303f995e184A7998dA6C6eA35cC728A1900".toLowerCase(),
18
+ WETH_V2: "0x5887ad4Cb2352E7F01527035fAa3AE0Ef2cE2b9B".toLowerCase(),
19
+ WSTETH_V2: "0xe0bCE4460795281d39c91da9B0275BcA968293de".toLowerCase(),
20
+ WBTC_V2: "0xc62BF8a7889AdF1c5Dc4665486c7683ae6E74e0F".toLowerCase(),
21
+ FRAX_V2: "0xA3E1e0d58FE8dD8C9dd48204699a1178f1B274D8".toLowerCase(),
22
+ WETH_V2_1: "0x4C6309fe2085EfE7A0Cfb426C16Ef3b41198cCE3".toLowerCase(),
23
+ },
24
+ Arbitrum: {},
25
+ };
26
+ exports.creditManagerByAddress = mappers_1.TypedObjectUtils.entries(exports.creditManagerByNetwork).reduce((acc, [, cms]) => ({
27
+ ...acc,
28
+ ...mappers_1.TypedObjectUtils.fromEntries(mappers_1.TypedObjectUtils.entries(cms)
29
+ .map(([k, v]) => [v.toLowerCase(), k])
30
+ .filter(k => !!k)),
31
+ }), {});
32
+ exports.poolByNetwork = {
33
+ Mainnet: {
34
+ DAI_V1: "0x24946bCbBd028D5ABb62ad9B635EB1b1a67AF668".toLowerCase(),
35
+ USDC_V1: "0x86130bDD69143D8a4E5fc50bf4323D48049E98E4".toLowerCase(),
36
+ WETH_V1: "0xB03670c20F87f2169A7c4eBE35746007e9575901".toLowerCase(),
37
+ WBTC_V1: "0xB2A015c71c17bCAC6af36645DEad8c572bA08A08".toLowerCase(),
38
+ WSTETH_V1: "0xB8cf3Ed326bB0E51454361Fb37E9E8df6DC5C286".toLowerCase(),
39
+ FRAX_V1: "0x79012c8d491dcf3a30db20d1f449b14caf01da6c".toLowerCase(),
40
+ },
41
+ Arbitrum: {},
42
+ };
43
+ const deployedContractNames = {
44
+ // MAINNET V1 CM
45
+ [exports.creditManagerByNetwork.Mainnet.DAI_V1]: "DAI",
46
+ [exports.creditManagerByNetwork.Mainnet.USDC_V1]: "USDC",
47
+ [exports.creditManagerByNetwork.Mainnet.WETH_V1]: "WETH",
48
+ [exports.creditManagerByNetwork.Mainnet.WBTC_V1]: "WBTC",
29
49
  // MAINNET V2 CM
30
- [exports.CREDIT_MANAGER_DAI_V2_MAINNET]: "DAI",
31
- [exports.CREDIT_MANAGER_USDC_V2_MAINNET]: "USDC",
32
- [exports.CREDIT_MANAGER_WETH_V2_MAINNET]: "WETH",
33
- [exports.CREDIT_MANAGER_WSTETH_V2_MAINNET]: "wstETH",
34
- [exports.CREDIT_MANAGER_WBTC_V2_MAINNET]: "WBTC",
35
- [exports.CREDIT_MANAGER_FRAX_V2_MAINNET]: "FRAX",
50
+ [exports.creditManagerByNetwork.Mainnet.DAI_V2]: "DAI",
51
+ [exports.creditManagerByNetwork.Mainnet.USDC_V2]: "USDC",
52
+ [exports.creditManagerByNetwork.Mainnet.WETH_V2]: "WETH",
53
+ [exports.creditManagerByNetwork.Mainnet.WSTETH_V2]: "wstETH",
54
+ [exports.creditManagerByNetwork.Mainnet.WBTC_V2]: "WBTC",
55
+ [exports.creditManagerByNetwork.Mainnet.FRAX_V2]: "FRAX",
56
+ // MAINNET V2_1 CM
57
+ [exports.creditManagerByNetwork.Mainnet.WETH_V2_1]: "WETH-Alpha",
58
+ // MAINNET POOLS
59
+ [exports.poolByNetwork.Mainnet.DAI_V1]: "DAI",
60
+ [exports.poolByNetwork.Mainnet.USDC_V1]: "USDC",
61
+ [exports.poolByNetwork.Mainnet.WETH_V1]: "WETH",
62
+ [exports.poolByNetwork.Mainnet.WBTC_V1]: "WBTC",
63
+ [exports.poolByNetwork.Mainnet.WSTETH_V1]: "wstETH",
64
+ [exports.poolByNetwork.Mainnet.FRAX_V1]: "FRAX",
36
65
  };
37
66
  const contractNames = Object.entries(contracts_1.contractsByAddress).reduce((acc, [addr, cSymbol]) => {
38
67
  const params = contracts_1.contractParams[cSymbol];
@@ -41,7 +70,7 @@ const contractNames = Object.entries(contracts_1.contractsByAddress).reduce((acc
41
70
  return { ...acc, [addr]: params.name };
42
71
  }, {});
43
72
  const contractsFullList = {
44
- ...mappers_1.TypedObjectUtils.keyToLowercase(exports.deployedContracts),
73
+ ...mappers_1.TypedObjectUtils.keyToLowercase(deployedContractNames),
45
74
  ...contractNames,
46
75
  };
47
76
  function getContractName(address) {
@@ -14,6 +14,7 @@ export declare class CreditManagerData {
14
14
  readonly maxLeverageFactor: number;
15
15
  readonly availableLiquidity: bigint;
16
16
  readonly collateralTokens: Array<string>;
17
+ readonly supportedTokens: Record<string, true>;
17
18
  readonly adapters: Record<string, string>;
18
19
  readonly liquidationThresholds: Record<string, bigint>;
19
20
  readonly version: number;
@@ -18,7 +18,8 @@ class CreditManagerData {
18
18
  maxAmount;
19
19
  maxLeverageFactor; // for V1 only
20
20
  availableLiquidity;
21
- collateralTokens;
21
+ collateralTokens = [];
22
+ supportedTokens = {};
22
23
  adapters;
23
24
  liquidationThresholds;
24
25
  version;
@@ -50,7 +51,11 @@ class CreditManagerData {
50
51
  this.maxAmount = (0, formatter_1.toBigInt)(payload.maxAmount || 0);
51
52
  this.maxLeverageFactor = Number((0, formatter_1.toBigInt)(payload.maxLeverageFactor || 0));
52
53
  this.availableLiquidity = (0, formatter_1.toBigInt)(payload.availableLiquidity || 0);
53
- this.collateralTokens = payload.collateralTokens.map(t => t.toLowerCase());
54
+ payload.collateralTokens.forEach(t => {
55
+ const tLc = t.toLowerCase();
56
+ this.collateralTokens.push(tLc);
57
+ this.supportedTokens[tLc] = true;
58
+ });
54
59
  this.adapters = payload.adapters.reduce((acc, { allowedContract, adapter }) => ({
55
60
  ...acc,
56
61
  [allowedContract.toLowerCase()]: adapter.toLowerCase(),
@@ -89,7 +94,7 @@ class CreditManagerData {
89
94
  return this.adapters[contractAddress];
90
95
  }
91
96
  encodeAddCollateral(accountAddress, tokenAddress, amount) {
92
- if (this.version !== 2)
97
+ if (this.version === 1)
93
98
  throw new Error("Multicall is eligible only for version 2");
94
99
  return {
95
100
  target: this.creditFacade,
@@ -97,7 +102,7 @@ class CreditManagerData {
97
102
  };
98
103
  }
99
104
  encodeIncreaseDebt(amount) {
100
- if (this.version !== 2)
105
+ if (this.version === 1)
101
106
  throw new Error("Multicall is eligible only for version 2");
102
107
  return {
103
108
  target: this.creditFacade,
@@ -105,7 +110,7 @@ class CreditManagerData {
105
110
  };
106
111
  }
107
112
  encodeDecreaseDebt(amount) {
108
- if (this.version !== 2)
113
+ if (this.version === 1)
109
114
  throw new Error("Multicall is eligible only for version 2");
110
115
  return {
111
116
  target: this.creditFacade,
@@ -113,9 +118,9 @@ class CreditManagerData {
113
118
  };
114
119
  }
115
120
  validateOpenAccount(collateral, debt) {
116
- return this.version === 2
117
- ? this.validateOpenAccountV2(debt)
118
- : this.validateOpenAccountV1(collateral, debt);
121
+ return this.version === 1
122
+ ? this.validateOpenAccountV1(collateral, debt)
123
+ : this.validateOpenAccountV2(debt);
119
124
  }
120
125
  validateOpenAccountV1(collateral, debt) {
121
126
  if (collateral < this.minAmount)
@@ -3,10 +3,10 @@ export interface StrategyPayload {
3
3
  apy?: number;
4
4
  name: string;
5
5
  lpToken: string;
6
- pools: Array<string>;
6
+ creditManagers: Array<string>;
7
+ baseAssets: Array<string>;
7
8
  unleveragableCollateral: Array<string>;
8
9
  leveragableCollateral: Array<string>;
9
- baseAssets: Array<string>;
10
10
  }
11
11
  interface LiquidationPriceProps {
12
12
  prices: Record<string, bigint>;
@@ -20,18 +20,15 @@ export declare class Strategy {
20
20
  apy: number | undefined;
21
21
  name: string;
22
22
  lpToken: string;
23
- pools: Array<string>;
23
+ baseAssets: Array<string>;
24
24
  unleveragableCollateral: Array<string>;
25
25
  leveragableCollateral: Array<string>;
26
- baseAssets: Array<string>;
26
+ creditManagers: Array<string>;
27
27
  constructor(payload: StrategyPayload);
28
28
  static maxLeverage(lpToken: string, cms: Array<PartialCM>): number;
29
29
  maxAPY(baseAPY: number, maxLeverage: number, borrowAPY: number): number;
30
- overallAPY(apy: number, leverage: number, depositCollateral: string, borrowAPY: number): number;
31
30
  static liquidationPrice({ prices, liquidationThresholds, borrowed, underlyingToken, lpAmount, lpToken, }: LiquidationPriceProps): bigint;
32
- protected farmLev(leverage: number, depositCollateral: string): number;
33
- protected inBaseAssets(depositCollateral: string): boolean;
34
- protected inLeveragableAssets(depositCollateral: string): boolean;
31
+ protected static maxLeverageThreshold(lpToken: string, cms: Array<PartialCM>): readonly [bigint, string];
35
32
  }
36
33
  type PartialCM = Pick<CreditManagerData, "liquidationThresholds" | "address">;
37
34
  export {};
@@ -9,21 +9,21 @@ class Strategy {
9
9
  apy;
10
10
  name;
11
11
  lpToken;
12
- pools;
12
+ baseAssets;
13
13
  unleveragableCollateral;
14
14
  leveragableCollateral;
15
- baseAssets;
15
+ creditManagers;
16
16
  constructor(payload) {
17
17
  this.apy = payload.apy;
18
18
  this.name = payload.name;
19
19
  this.lpToken = payload.lpToken.toLowerCase();
20
- this.pools = payload.pools.map(addr => addr.toLowerCase());
20
+ this.creditManagers = payload.creditManagers.map(addr => addr.toLowerCase());
21
+ this.baseAssets = payload.baseAssets.map(addr => addr.toLowerCase());
21
22
  this.unleveragableCollateral = payload.unleveragableCollateral.map(addr => addr.toLowerCase());
22
23
  this.leveragableCollateral = payload.leveragableCollateral.map(addr => addr.toLowerCase());
23
- this.baseAssets = payload.baseAssets.map(addr => addr.toLowerCase());
24
24
  }
25
25
  static maxLeverage(lpToken, cms) {
26
- const [maxThreshold] = maxLeverageThreshold(lpToken, cms);
26
+ const [maxThreshold] = Strategy.maxLeverageThreshold(lpToken, cms);
27
27
  const maxLeverage = (constants_1.PERCENTAGE_FACTOR * constants_1.LEVERAGE_DECIMALS) /
28
28
  (constants_1.PERCENTAGE_FACTOR - maxThreshold);
29
29
  return Number(maxLeverage - constants_1.LEVERAGE_DECIMALS);
@@ -33,10 +33,6 @@ class Strategy {
33
33
  ((baseAPY - borrowAPY) * (maxLeverage - Number(constants_1.LEVERAGE_DECIMALS))) /
34
34
  Number(constants_1.LEVERAGE_DECIMALS));
35
35
  }
36
- overallAPY(apy, leverage, depositCollateral, borrowAPY) {
37
- const farmLev = this.farmLev(leverage, depositCollateral);
38
- return roi(apy, farmLev, leverage - Number(constants_1.LEVERAGE_DECIMALS), borrowAPY);
39
- }
40
36
  static liquidationPrice({ prices, liquidationThresholds, borrowed, underlyingToken, lpAmount, lpToken, }) {
41
37
  const underlyingTokenAddressLC = underlyingToken.toLowerCase();
42
38
  const underlyingTokenSymbol = token_1.tokenSymbolByAddress[underlyingTokenAddressLC];
@@ -56,36 +52,21 @@ class Strategy {
56
52
  }
57
53
  return 0n;
58
54
  }
59
- farmLev(leverage, depositCollateral) {
60
- return this.inBaseAssets(depositCollateral) ||
61
- this.inLeveragableAssets(depositCollateral)
62
- ? leverage
63
- : leverage - Number(constants_1.LEVERAGE_DECIMALS);
64
- }
65
- inBaseAssets(depositCollateral) {
66
- return this.baseAssets.some(c => c === depositCollateral.toLowerCase());
67
- }
68
- inLeveragableAssets(depositCollateral) {
69
- return this.leveragableCollateral.some(c => c === depositCollateral.toLowerCase());
55
+ static maxLeverageThreshold(lpToken, cms) {
56
+ const lpTokenLC = lpToken.toLowerCase();
57
+ const ltByCM = cms.map(cm => {
58
+ const lt = cm.liquidationThresholds[lpTokenLC] || 0n;
59
+ return [cm.address, lt];
60
+ });
61
+ const sorted = ltByCM.sort(([, ltA], [, ltB]) => {
62
+ if (ltA > ltB)
63
+ return 1;
64
+ if (ltB > ltA)
65
+ return -1;
66
+ return 0;
67
+ });
68
+ const [cm = "", lt = 0n] = sorted[0] || [];
69
+ return [lt, cm];
70
70
  }
71
71
  }
72
72
  exports.Strategy = Strategy;
73
- function roi(apy, farmLev, debtLev, borrowAPY) {
74
- return (apy * farmLev - borrowAPY * debtLev) / Number(constants_1.LEVERAGE_DECIMALS);
75
- }
76
- function maxLeverageThreshold(lpToken, cms) {
77
- const lpTokenLC = lpToken.toLowerCase();
78
- const ltByCM = cms.map(cm => {
79
- const lt = cm.liquidationThresholds[lpTokenLC] || 0n;
80
- return [cm.address, lt];
81
- });
82
- const sorted = ltByCM.sort(([, ltA], [, ltB]) => {
83
- if (ltA > ltB)
84
- return 1;
85
- if (ltB > ltA)
86
- return -1;
87
- return 0;
88
- });
89
- const [cm = "", lt = 0n] = sorted[0] || [];
90
- return [lt, cm];
91
- }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const chai_1 = require("chai");
4
+ const contractsRegister_1 = require("../contracts/contractsRegister");
4
5
  const decimals_1 = require("../tokens/decimals");
5
6
  const token_1 = require("../tokens/token");
6
7
  const formatter_1 = require("../utils/formatter");
@@ -10,7 +11,7 @@ const lidoPayload = {
10
11
  name: "Lido",
11
12
  lpToken: token_1.tokenDataByNetwork.Mainnet.STETH,
12
13
  apy: 38434,
13
- pools: [token_1.tokenDataByNetwork.Mainnet.WETH],
14
+ creditManagers: [contractsRegister_1.creditManagerByNetwork.Mainnet.WETH_V2],
14
15
  unleveragableCollateral: [
15
16
  token_1.tokenDataByNetwork.Mainnet.USDC,
16
17
  token_1.tokenDataByNetwork.Mainnet.DAI,
@@ -43,10 +44,6 @@ describe("Strategy test", () => {
43
44
  const result = lidoStrategy.maxAPY(53203, 10 * Number(constants_1.LEVERAGE_DECIMALS), pools["0x1"].borrowRate);
44
45
  (0, chai_1.expect)(result).to.be.eq(284143);
45
46
  });
46
- it("overallAPY calculation is correct", () => {
47
- const result = lidoStrategy.overallAPY(lidoStrategy.apy || 0, 10 * Number(constants_1.LEVERAGE_DECIMALS), token_1.tokenDataByNetwork.Mainnet.WETH, pools["0x2"].borrowRate);
48
- (0, chai_1.expect)(result).to.be.eq(332716);
49
- });
50
47
  it("liquidationPrice calculation is correct", () => {
51
48
  const result = strategy_1.Strategy.liquidationPrice({
52
49
  liquidationThresholds,
@@ -15,7 +15,7 @@ export declare class PathFinder {
15
15
  network: NetworkType;
16
16
  static connectors: Array<SupportedToken>;
17
17
  protected readonly _connectors: Array<string>;
18
- constructor(address: string, provider: Signer | providers.Provider, network?: NetworkType, connectors?: Array<SupportedToken>);
18
+ constructor(address: string, provider: Signer | providers.Provider, network?: NetworkType, connectors?: SupportedToken[]);
19
19
  findAllSwaps(creditAccount: CreditAccountData, swapOperation: SwapOperation, tokenIn: SupportedToken | string, tokenOut: SupportedToken | string, amount: BigNumberish, slippage: number): Promise<Array<PathFinderResult>>;
20
20
  findOneTokenPath(creditAccount: CreditAccountData, tokenIn: SupportedToken | string, tokenOut: SupportedToken | string, amount: BigNumberish, slippage: number): Promise<PathFinderResult>;
21
21
  /**
@@ -41,4 +41,6 @@ export declare class PathFinder {
41
41
  */
42
42
  findBestClosePath(creditAccount: CreditAccountData, slippage: number, noConcurency?: boolean): Promise<PathFinderCloseResult>;
43
43
  static compare(r1: CloseResult, r2: CloseResult, gasPriceRAY: bigint): CloseResult;
44
+ getAvailableConnectors(availableList: Record<string, bigint> | Record<string, true>): string[];
45
+ static getAvailableConnectors(availableList: Record<string, bigint> | Record<string, true>, connectors: string[]): string[];
44
46
  }
@@ -13,19 +13,22 @@ class PathFinder {
13
13
  network;
14
14
  static connectors = ["USDC", "WETH", "DAI"];
15
15
  _connectors;
16
- constructor(address, provider, network = "Mainnet", connectors) {
16
+ constructor(address, provider, network = "Mainnet", connectors = PathFinder.connectors) {
17
17
  this.pathFinder = types_1.IRouter__factory.connect(address, provider);
18
18
  this.network = network;
19
- this._connectors = (connectors || PathFinder.connectors).map(c => token_1.tokenDataByNetwork[this.network][c]);
19
+ this._connectors = connectors
20
+ .map(c => token_1.tokenDataByNetwork[this.network][c]?.toLowerCase())
21
+ .filter(t => !t);
20
22
  }
21
23
  async findAllSwaps(creditAccount, swapOperation, tokenIn, tokenOut, amount, slippage) {
24
+ const connectors = this.getAvailableConnectors(creditAccount.balances);
22
25
  const swapTask = {
23
26
  swapOperation: swapOperation,
24
27
  creditAccount: creditAccount.addr,
25
28
  tokenIn: token_1.tokenDataByNetwork[this.network][tokenIn] || tokenIn,
26
29
  tokenOut: token_1.tokenDataByNetwork[this.network][tokenOut] ||
27
30
  tokenOut,
28
- connectors: this._connectors,
31
+ connectors,
29
32
  amount: amount,
30
33
  slippage,
31
34
  externalSlippage: false,
@@ -47,10 +50,8 @@ class PathFinder {
47
50
  }
48
51
  async findOneTokenPath(creditAccount, tokenIn, tokenOut, amount, slippage) {
49
52
  const tokenInAddr = token_1.tokenDataByNetwork[this.network][tokenIn] || tokenIn;
50
- // if (creditAccount.balances[tokenInAddr.toLowerCase()].lt(amount)) {
51
- // throw new Error(`Not enough balance for token ${tokenIn}`);
52
- // }
53
- const result = await this.pathFinder.callStatic.findOneTokenPath(tokenInAddr, amount, token_1.tokenDataByNetwork[this.network][tokenOut] || tokenOut, creditAccount.addr, this._connectors, slippage, {
53
+ const connectors = this.getAvailableConnectors(creditAccount.balances);
54
+ const result = await this.pathFinder.callStatic.findOneTokenPath(tokenInAddr, amount, token_1.tokenDataByNetwork[this.network][tokenOut] || tokenOut, creditAccount.addr, connectors, slippage, {
54
55
  gasLimit: GAS_PER_BLOCK,
55
56
  });
56
57
  return {
@@ -80,7 +81,8 @@ class PathFinder {
80
81
  token,
81
82
  balance: expectedBalancesAddr[token] || 0,
82
83
  }));
83
- const result = await this.pathFinder.callStatic.findOpenStrategyPath(cm.address, balances, targetAddr, this._connectors, slippage, {
84
+ const connectors = this.getAvailableConnectors(cm.supportedTokens);
85
+ const result = await this.pathFinder.callStatic.findOpenStrategyPath(cm.address, balances, targetAddr, connectors, slippage, {
84
86
  gasLimit: GAS_PER_BLOCK,
85
87
  });
86
88
  const balancesAfter = result[0].reduce((acc, b) => {
@@ -104,16 +106,17 @@ class PathFinder {
104
106
  async findBestClosePath(creditAccount, slippage, noConcurency = false) {
105
107
  const loopsPerTx = Math.floor(GAS_PER_BLOCK / MAX_GAS_PER_ROUTE);
106
108
  const pathOptions = pathOptions_1.PathOptionFactory.generatePathOptions(creditAccount.allBalances, loopsPerTx);
109
+ const connectors = this.getAvailableConnectors(creditAccount.balances);
107
110
  let results = [];
108
111
  if (noConcurency) {
109
112
  for (const po of pathOptions) {
110
- results.push(await this.pathFinder.callStatic.findBestClosePath(creditAccount.addr, this._connectors, slippage, po, loopsPerTx, false, {
113
+ results.push(await this.pathFinder.callStatic.findBestClosePath(creditAccount.addr, connectors, slippage, po, loopsPerTx, false, {
111
114
  gasLimit: GAS_PER_BLOCK,
112
115
  }));
113
116
  }
114
117
  }
115
118
  else {
116
- const requests = pathOptions.map(po => this.pathFinder.callStatic.findBestClosePath(creditAccount.addr, this._connectors, slippage, po, loopsPerTx, false, {
119
+ const requests = pathOptions.map(po => this.pathFinder.callStatic.findBestClosePath(creditAccount.addr, connectors, slippage, po, loopsPerTx, false, {
117
120
  gasLimit: GAS_PER_BLOCK,
118
121
  }));
119
122
  results = await Promise.all(requests);
@@ -137,5 +140,11 @@ class PathFinder {
137
140
  const comparator = ({ amount, gasUsage }, gasPrice) => amount - (gasUsage * gasPrice) / constants_1.RAY;
138
141
  return comparator(r1, gasPriceRAY) > comparator(r2, gasPriceRAY) ? r1 : r2;
139
142
  }
143
+ getAvailableConnectors(availableList) {
144
+ return PathFinder.getAvailableConnectors(availableList, this._connectors);
145
+ }
146
+ static getAvailableConnectors(availableList, connectors) {
147
+ return connectors.filter(t => availableList[t] !== undefined);
148
+ }
140
149
  }
141
150
  exports.PathFinder = PathFinder;
@@ -13,3 +13,4 @@ export type GearboxTokenData = {
13
13
  type: TokenType.GEAR_TOKEN;
14
14
  } & TokenBase;
15
15
  export declare const gearTokens: Record<DieselTokenTypes | GearboxToken, DieselTokenData | GearboxTokenData>;
16
+ export declare const isDieselToken: (t: unknown) => t is DieselTokenTypes;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.gearTokens = void 0;
3
+ exports.isDieselToken = exports.gearTokens = void 0;
4
4
  const tokenType_1 = require("./tokenType");
5
- exports.gearTokens = {
5
+ const dieselTokens = {
6
6
  // GEARBOX
7
7
  dDAI: {
8
8
  name: "dDAI",
@@ -34,9 +34,14 @@ exports.gearTokens = {
34
34
  symbol: "dFRAX",
35
35
  type: tokenType_1.TokenType.DIESEL_LP_TOKEN,
36
36
  },
37
+ };
38
+ exports.gearTokens = {
39
+ ...dieselTokens,
37
40
  GEAR: {
38
41
  name: "GEAR",
39
42
  symbol: "GEAR",
40
43
  type: tokenType_1.TokenType.GEAR_TOKEN,
41
44
  },
42
45
  };
46
+ const isDieselToken = (t) => typeof t === "string" && !!dieselTokens[t];
47
+ exports.isDieselToken = isDieselToken;
@@ -258,12 +258,9 @@ exports.tokenDataByNetwork = {
258
258
  };
259
259
  exports.tokenSymbolByAddress = mappers_1.TypedObjectUtils.entries(exports.tokenDataByNetwork).reduce((acc, [, tokens]) => ({
260
260
  ...acc,
261
- ...{
262
- ...acc,
263
- ...mappers_1.TypedObjectUtils.fromEntries(mappers_1.TypedObjectUtils.entries(tokens)
264
- .map(([k, v]) => [v.toLowerCase(), k])
265
- .filter(k => !!k)),
266
- },
261
+ ...mappers_1.TypedObjectUtils.fromEntries(mappers_1.TypedObjectUtils.entries(tokens)
262
+ .map(([k, v]) => [v.toLowerCase(), k])
263
+ .filter(k => !!k)),
267
264
  }), {});
268
265
  const isSupportedToken = (t) => typeof t === "string" && !!exports.supportedTokens[t];
269
266
  exports.isSupportedToken = isSupportedToken;
@@ -3,7 +3,7 @@ interface Target {
3
3
  decimals: number | undefined;
4
4
  }
5
5
  export declare class PriceUtils {
6
- static calcTotalPrice: (price: bigint, amount: bigint, decimals?: number) => bigint;
6
+ static calcTotalPrice: (price: bigint, amount: bigint, decimals?: number | undefined) => bigint;
7
7
  static convertByPrice(totalMoney: bigint, { price: targetPrice, decimals: targetDecimals }: Target): bigint;
8
8
  }
9
9
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gearbox-protocol/sdk",
3
- "version": "2.1.7",
3
+ "version": "2.1.9",
4
4
  "description": "Gearbox SDK",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",