@gearbox-protocol/sdk 0.0.109 → 0.0.110
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/apy/convexAPY copy.d.ts +6 -0
- package/lib/apy/convexAPY copy.js +201 -0
- package/lib/apy/convexAPY.d.ts +9 -5
- package/lib/apy/convexAPY.js +29 -69
- package/lib/apy/curveAPY.d.ts +4 -0
- package/lib/apy/curveAPY.js +94 -0
- package/lib/apy/index.d.ts +6 -0
- package/lib/apy/index.js +20 -0
- package/lib/apy/lidoAPY.d.ts +1 -1
- package/lib/apy/lidoAPY.js +3 -3
- package/lib/apy/yearnAPY.d.ts +4 -0
- package/lib/apy/yearnAPY.js +90 -0
- package/lib/contracts/contractsRegister.js +2 -1
- package/lib/core/creditAccount.d.ts +2 -1
- package/lib/core/creditAccount.js +19 -12
- package/lib/core/creditManager.d.ts +3 -1
- package/lib/core/creditManager.js +22 -8
- package/lib/core/errors.d.ts +1 -1
- package/lib/core/pool.js +4 -4
- package/lib/core/strategy.d.ts +5 -3
- package/lib/core/strategy.js +6 -4
- package/lib/index.d.ts +4 -4
- package/lib/index.js +7 -6
- package/lib/tokens/convex.d.ts +3 -0
- package/lib/tokens/convex.js +44 -18
- package/lib/tokens/curveLP.d.ts +1 -0
- package/lib/tokens/curveLP.js +11 -7
- package/lib/tokens/normal.d.ts +1 -0
- package/lib/tokens/normal.js +5 -1
- package/lib/tokens/token.d.ts +7 -2
- package/lib/tokens/token.js +10 -1
- package/lib/tokens/tokenData.js +2 -3
- package/lib/tokens/yearn.d.ts +1 -0
- package/lib/tokens/yearn.js +11 -7
- package/lib/utils/extracter.d.ts +11 -0
- package/lib/utils/extracter.js +19 -0
- package/lib/utils/mappers.d.ts +2 -2
- package/lib/utils/price.d.ts +8 -0
- package/lib/utils/price.js +26 -0
- package/package.json +1 -1
- package/src/apy/convexAPY.ts +47 -96
- package/src/apy/curveAPY.ts +68 -0
- package/src/apy/index.ts +8 -0
- package/src/apy/lidoAPY.ts +1 -1
- package/src/apy/yearnAPY.ts +66 -0
- package/src/contracts/contractsRegister.ts +2 -1
- package/src/core/creditAccount.ts +20 -12
- package/src/core/creditManager.ts +35 -10
- package/src/core/errors.ts +1 -0
- package/src/core/pool.ts +4 -4
- package/src/core/strategy.ts +16 -10
- package/src/index.ts +4 -4
- package/src/tokens/convex.ts +43 -20
- package/src/tokens/curveLP.ts +9 -6
- package/src/tokens/normal.ts +3 -0
- package/src/tokens/token.ts +24 -6
- package/src/tokens/tokenData.ts +2 -4
- package/src/tokens/yearn.ts +9 -6
- package/src/utils/extracter.ts +30 -0
- package/src/utils/mappers.ts +2 -2
- package/src/utils/price.ts +33 -0
- package/lib/core/price.d.ts +0 -2
- package/lib/core/price.js +0 -14
- package/lib/types/@chainlink/contracts/src/v0.6/index.d.ts +0 -2
- package/lib/types/@chainlink/contracts/src/v0.6/index.js +0 -2
- package/lib/types/@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.d.ts +0 -146
- package/lib/types/@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.js +0 -2
- package/lib/types/@chainlink/contracts/src/v0.6/interfaces/index.d.ts +0 -1
- package/lib/types/@chainlink/contracts/src/v0.6/interfaces/index.js +0 -2
- package/lib/types/contracts/integrations/lido/IstETH.d.ts +0 -154
- package/lib/types/contracts/integrations/lido/IstETH.js +0 -2
- package/lib/types/contracts/interfaces/ICreditFacade.sol/ICreditFacadeBalanceChecker.d.ts +0 -50
- package/lib/types/contracts/interfaces/ICreditFacade.sol/ICreditFacadeBalanceChecker.js +0 -2
- package/lib/types/contracts/pathfinder/Balances.sol/BalanceOps.d.ts +0 -27
- package/lib/types/contracts/pathfinder/Balances.sol/BalanceOps.js +0 -2
- package/lib/types/contracts/pathfinder/Balances.sol/index.d.ts +0 -1
- package/lib/types/contracts/pathfinder/Balances.sol/index.js +0 -2
- package/lib/types/contracts/pathfinder/NormalTokenPathFinder.sol/PathFinder.d.ts +0 -269
- package/lib/types/contracts/pathfinder/NormalTokenPathFinder.sol/PathFinder.js +0 -2
- package/lib/types/contracts/pathfinder/NormalTokenPathFinder.sol/index.d.ts +0 -1
- package/lib/types/contracts/pathfinder/NormalTokenPathFinder.sol/index.js +0 -2
- package/lib/types/contracts/test/mocks/integrations/ConvexTokenRewardContractMock.sol/VirtualBalanceWrapper.d.ts +0 -58
- package/lib/types/contracts/test/mocks/integrations/ConvexTokenRewardContractMock.sol/VirtualBalanceWrapper.js +0 -2
- package/lib/types/contracts/test/pathfinder/UniswapV2PathFinder.t.sol/UniswapV2PathFinderAdapterTest.d.ts +0 -528
- package/lib/types/contracts/test/pathfinder/UniswapV2PathFinder.t.sol/UniswapV2PathFinderAdapterTest.js +0 -2
- package/lib/types/contracts/test/pathfinder/UniswapV3PathFinder.t.sol/UniswapV3PathFinderAdapterTest.d.ts +0 -528
- package/lib/types/contracts/test/pathfinder/UniswapV3PathFinder.t.sol/UniswapV3PathFinderAdapterTest.js +0 -2
- package/lib/types/factories/@chainlink/contracts/src/v0.6/index.d.ts +0 -1
- package/lib/types/factories/@chainlink/contracts/src/v0.6/index.js +0 -30
- package/lib/types/factories/@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface__factory.d.ts +0 -22
- package/lib/types/factories/@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface__factory.js +0 -133
- package/lib/types/factories/@chainlink/contracts/src/v0.6/interfaces/index.d.ts +0 -1
- package/lib/types/factories/@chainlink/contracts/src/v0.6/interfaces/index.js +0 -8
- package/lib/types/factories/contracts/integrations/lido/IstETH__factory.d.ts +0 -35
- package/lib/types/factories/contracts/integrations/lido/IstETH__factory.js +0 -224
- package/lib/types/factories/contracts/interfaces/ICreditFacade.sol/ICreditFacadeBalanceChecker__factory.d.ts +0 -18
- package/lib/types/factories/contracts/interfaces/ICreditFacade.sol/ICreditFacadeBalanceChecker__factory.js +0 -40
- package/lib/types/factories/contracts/pathfinder/Balances.sol/BalanceOps__factory.d.ts +0 -28
- package/lib/types/factories/contracts/pathfinder/Balances.sol/BalanceOps__factory.js +0 -76
- package/lib/types/factories/contracts/pathfinder/Balances.sol/index.d.ts +0 -1
- package/lib/types/factories/contracts/pathfinder/Balances.sol/index.js +0 -8
- package/lib/types/factories/contracts/pathfinder/NormalTokenPathFinder.sol/PathFinder__factory.d.ts +0 -144
- package/lib/types/factories/contracts/pathfinder/NormalTokenPathFinder.sol/PathFinder__factory.js +0 -522
- package/lib/types/factories/contracts/pathfinder/NormalTokenPathFinder.sol/index.d.ts +0 -1
- package/lib/types/factories/contracts/pathfinder/NormalTokenPathFinder.sol/index.js +0 -8
- package/lib/types/factories/contracts/test/mocks/integrations/ConvexTokenRewardContractMock.sol/VirtualBalanceWrapper__factory.d.ts +0 -34
- package/lib/types/factories/contracts/test/mocks/integrations/ConvexTokenRewardContractMock.sol/VirtualBalanceWrapper__factory.js +0 -110
- package/lib/types/factories/contracts/test/pathfinder/UniswapV2PathFinder.t.sol/UniswapV2PathFinderAdapterTest__factory.d.ts +0 -65
- package/lib/types/factories/contracts/test/pathfinder/UniswapV2PathFinder.t.sol/UniswapV2PathFinderAdapterTest__factory.js +0 -775
- package/lib/types/factories/contracts/test/pathfinder/UniswapV3PathFinder.t.sol/UniswapV3PathFinderAdapterTest__factory.d.ts +0 -65
- package/lib/types/factories/contracts/test/pathfinder/UniswapV3PathFinder.t.sol/UniswapV3PathFinderAdapterTest__factory.js +0 -775
- package/src/core/price.ts +0 -13
package/lib/tokens/yearn.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.yearnTokens = void 0;
|
|
3
|
+
exports.isYearnLPToken = exports.yearnTokens = void 0;
|
|
4
4
|
var tradeTypes_1 = require("../pathfinder/tradeTypes");
|
|
5
5
|
var tokenType_1 = require("./tokenType");
|
|
6
6
|
exports.yearnTokens = {
|
|
7
7
|
// YEARN TOKENS
|
|
8
8
|
yvDAI: {
|
|
9
|
-
name: "yvDAI",
|
|
9
|
+
name: "Yearn yvDAI",
|
|
10
10
|
decimals: 18,
|
|
11
11
|
symbol: "yvDAI",
|
|
12
12
|
type: tokenType_1.TokenType.YEARN_VAULT,
|
|
@@ -21,7 +21,7 @@ exports.yearnTokens = {
|
|
|
21
21
|
]
|
|
22
22
|
},
|
|
23
23
|
yvUSDC: {
|
|
24
|
-
name: "yvUSDC",
|
|
24
|
+
name: "Yearn yvUSDC",
|
|
25
25
|
decimals: 6,
|
|
26
26
|
symbol: "yvUSDC",
|
|
27
27
|
type: tokenType_1.TokenType.YEARN_VAULT,
|
|
@@ -36,7 +36,7 @@ exports.yearnTokens = {
|
|
|
36
36
|
]
|
|
37
37
|
},
|
|
38
38
|
yvWETH: {
|
|
39
|
-
name: "yvWETH",
|
|
39
|
+
name: "Yearn yvWETH",
|
|
40
40
|
decimals: 18,
|
|
41
41
|
symbol: "yvWETH",
|
|
42
42
|
type: tokenType_1.TokenType.YEARN_VAULT,
|
|
@@ -51,7 +51,7 @@ exports.yearnTokens = {
|
|
|
51
51
|
]
|
|
52
52
|
},
|
|
53
53
|
yvWBTC: {
|
|
54
|
-
name: "yvWBTC",
|
|
54
|
+
name: "Yearn yvWBTC",
|
|
55
55
|
decimals: 8,
|
|
56
56
|
symbol: "yvWBTC",
|
|
57
57
|
type: tokenType_1.TokenType.YEARN_VAULT,
|
|
@@ -67,7 +67,7 @@ exports.yearnTokens = {
|
|
|
67
67
|
},
|
|
68
68
|
// YEARN- CURVE TOKENS
|
|
69
69
|
yvCurve_stETH: {
|
|
70
|
-
name: "yvCurve-stETH",
|
|
70
|
+
name: "Yearn yvCurve-stETH",
|
|
71
71
|
decimals: 18,
|
|
72
72
|
symbol: "yvCurve_stETH",
|
|
73
73
|
type: tokenType_1.TokenType.YEARN_VAULT_OF_CURVE_LP,
|
|
@@ -82,7 +82,7 @@ exports.yearnTokens = {
|
|
|
82
82
|
]
|
|
83
83
|
},
|
|
84
84
|
yvCurve_FRAX: {
|
|
85
|
-
name: "yvCurve-FRAX",
|
|
85
|
+
name: "Yearn yvCurve-FRAX",
|
|
86
86
|
decimals: 18,
|
|
87
87
|
symbol: "yvCurve_FRAX",
|
|
88
88
|
type: tokenType_1.TokenType.YEARN_VAULT_OF_META_CURVE_LP,
|
|
@@ -97,3 +97,7 @@ exports.yearnTokens = {
|
|
|
97
97
|
]
|
|
98
98
|
}
|
|
99
99
|
};
|
|
100
|
+
var isYearnLPToken = function (t) {
|
|
101
|
+
return typeof t === "string" && !!exports.yearnTokens[t];
|
|
102
|
+
};
|
|
103
|
+
exports.isYearnLPToken = isYearnLPToken;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PoolData } from "../core/pool";
|
|
2
|
+
export interface PoolTokens {
|
|
3
|
+
dieselToken: string | undefined;
|
|
4
|
+
underlyingToken: string | undefined;
|
|
5
|
+
}
|
|
6
|
+
export declare function getPoolTokens(pool: PoolData | undefined | Error): PoolTokens;
|
|
7
|
+
interface WithUnderlyingToken {
|
|
8
|
+
readonly underlyingToken: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function getUnderlyingToken(c: WithUnderlyingToken | undefined | Error): string | undefined;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUnderlyingToken = exports.getPoolTokens = void 0;
|
|
4
|
+
function getPoolTokens(pool) {
|
|
5
|
+
var safePool = pool instanceof Error ? undefined : pool;
|
|
6
|
+
var _a = safePool || {}, dieselToken = _a.dieselToken, underlyingToken = _a.underlyingToken;
|
|
7
|
+
return {
|
|
8
|
+
dieselToken: dieselToken,
|
|
9
|
+
underlyingToken: underlyingToken
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
exports.getPoolTokens = getPoolTokens;
|
|
13
|
+
function getUnderlyingToken(c) {
|
|
14
|
+
if (!c || c instanceof Error) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return c.underlyingToken;
|
|
18
|
+
}
|
|
19
|
+
exports.getUnderlyingToken = getUnderlyingToken;
|
package/lib/utils/mappers.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
declare type SupportedValue = string | number;
|
|
2
2
|
declare const objectEntries: <K extends SupportedValue, T>(o: Record<K, T>) => [K, T][];
|
|
3
3
|
declare const swapKeyValue: <K extends SupportedValue, T extends SupportedValue>(o: Record<K, T>) => Record<T, K>;
|
|
4
|
-
declare const keyToLowercase: <K extends SupportedValue, T
|
|
5
|
-
declare const filterEmptyKeys: <K extends SupportedValue, T
|
|
4
|
+
declare const keyToLowercase: <K extends SupportedValue, T>(o: Record<K, T>) => Record<K, T>;
|
|
5
|
+
declare const filterEmptyKeys: <K extends SupportedValue, T>(o: Record<K, T>) => Record<K, T>;
|
|
6
6
|
export type { SupportedValue };
|
|
7
7
|
export { objectEntries, swapKeyValue, keyToLowercase, filterEmptyKeys };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BigNumber } from "ethers";
|
|
2
|
+
export declare const calcTotalPrice: (price: BigNumber, amount: BigNumber, decimals?: number) => BigNumber;
|
|
3
|
+
interface Target {
|
|
4
|
+
price: BigNumber;
|
|
5
|
+
decimals: number | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare function convertByPrice(totalMoney: BigNumber, { price: targetPrice, decimals: targetDecimals }: Target): BigNumber;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertByPrice = exports.calcTotalPrice = void 0;
|
|
4
|
+
var ethers_1 = require("ethers");
|
|
5
|
+
var constants_1 = require("../core/constants");
|
|
6
|
+
var calcTotalPrice = function (price, amount, decimals) {
|
|
7
|
+
if (decimals === void 0) { decimals = 18; }
|
|
8
|
+
return amount
|
|
9
|
+
.mul(constants_1.WAD)
|
|
10
|
+
.mul(price)
|
|
11
|
+
.div(ethers_1.BigNumber.from(10).pow(decimals))
|
|
12
|
+
.div(constants_1.PRICE_DECIMALS);
|
|
13
|
+
};
|
|
14
|
+
exports.calcTotalPrice = calcTotalPrice;
|
|
15
|
+
function convertByPrice(totalMoney, _a) {
|
|
16
|
+
var targetPrice = _a.price, _b = _a.decimals, targetDecimals = _b === void 0 ? 18 : _b;
|
|
17
|
+
var isWrongTargetPrice = targetPrice.isZero() || targetPrice.isNegative();
|
|
18
|
+
return isWrongTargetPrice
|
|
19
|
+
? ethers_1.BigNumber.from(0)
|
|
20
|
+
: totalMoney
|
|
21
|
+
.mul(ethers_1.BigNumber.from(10).pow(targetDecimals))
|
|
22
|
+
.mul(constants_1.PRICE_DECIMALS)
|
|
23
|
+
.div(targetPrice)
|
|
24
|
+
.div(constants_1.WAD);
|
|
25
|
+
}
|
|
26
|
+
exports.convertByPrice = convertByPrice;
|
package/package.json
CHANGED
package/src/apy/convexAPY.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { BigNumber, providers } from "ethers";
|
|
2
|
-
import axios from "axios";
|
|
3
2
|
import {
|
|
4
3
|
ConvexPoolContract,
|
|
5
4
|
ConvexPoolParams,
|
|
6
5
|
contractsByNetwork,
|
|
7
|
-
contractParams
|
|
8
|
-
CurvePoolContract
|
|
6
|
+
contractParams
|
|
9
7
|
} from "../contracts/contracts";
|
|
10
8
|
|
|
11
9
|
import { tokenDataByNetwork, supportedTokens } from "../tokens/token";
|
|
12
|
-
import {
|
|
10
|
+
import { CurveLPTokenData } from "../tokens/curveLP";
|
|
13
11
|
import { ConvexPhantomTokenData } from "../tokens/convex";
|
|
14
12
|
|
|
15
13
|
import {
|
|
@@ -22,49 +20,32 @@ import {
|
|
|
22
20
|
} from "../types";
|
|
23
21
|
|
|
24
22
|
import { multicall, MCall } from "../utils/multicall";
|
|
25
|
-
import { toBN } from "../utils/formatter";
|
|
26
23
|
import { AwaitedRes } from "../utils/types";
|
|
27
24
|
|
|
28
25
|
import {
|
|
29
26
|
SECONDS_PER_YEAR,
|
|
30
27
|
WAD,
|
|
31
|
-
WAD_DECIMALS_POW,
|
|
32
28
|
NetworkType,
|
|
33
29
|
PRICE_DECIMALS
|
|
34
30
|
} from "../core/constants";
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const curveSwapByPool: Record<SupportedPools, SupportedConvex> = {
|
|
55
|
-
CONVEX_3CRV_POOL: "CURVE_3CRV_POOL",
|
|
56
|
-
CONVEX_FRAX3CRV_POOL: "CURVE_FRAX_POOL",
|
|
57
|
-
CONVEX_LUSD3CRV_POOL: "CURVE_LUSD_POOL",
|
|
58
|
-
CONVEX_GUSD_POOL: "CURVE_GUSD_POOL",
|
|
59
|
-
CONVEX_SUSD_POOL: "CURVE_SUSD_POOL"
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export async function getConvexApy(
|
|
63
|
-
pool: SupportedPools,
|
|
64
|
-
provider: providers.Provider,
|
|
65
|
-
networkType: NetworkType,
|
|
66
|
-
getTokenPrice: (tokenAddress: string) => BigNumber
|
|
67
|
-
) {
|
|
32
|
+
import { CurveAPYResult } from "./curveAPY";
|
|
33
|
+
|
|
34
|
+
export interface GetConvexAPYProps {
|
|
35
|
+
pool: ConvexPoolContract;
|
|
36
|
+
provider: providers.Provider;
|
|
37
|
+
networkType: NetworkType;
|
|
38
|
+
getTokenPrice: (tokenAddress: string) => BigNumber;
|
|
39
|
+
curveAPY: CurveAPYResult;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function getConvexAPY({
|
|
43
|
+
pool,
|
|
44
|
+
provider,
|
|
45
|
+
networkType,
|
|
46
|
+
getTokenPrice,
|
|
47
|
+
curveAPY
|
|
48
|
+
}: GetConvexAPYProps) {
|
|
68
49
|
const tokenList = tokenDataByNetwork[networkType];
|
|
69
50
|
const contractsList = contractsByNetwork[networkType];
|
|
70
51
|
|
|
@@ -75,7 +56,10 @@ export async function getConvexApy(
|
|
|
75
56
|
|
|
76
57
|
const { underlying } = stakedTokenParams;
|
|
77
58
|
const basePoolAddress = contractsList[pool];
|
|
78
|
-
|
|
59
|
+
|
|
60
|
+
const crvParams = supportedTokens[underlying] as CurveLPTokenData;
|
|
61
|
+
|
|
62
|
+
const swapPoolAddress = contractsList[crvParams.pool];
|
|
79
63
|
const cvxAddress = tokenList.CVX;
|
|
80
64
|
|
|
81
65
|
const extraPoolAddresses = poolParams.extraRewards.map(
|
|
@@ -83,13 +67,13 @@ export async function getConvexApy(
|
|
|
83
67
|
);
|
|
84
68
|
|
|
85
69
|
const [basePoolRate, basePoolSupply, vPrice, cvxSupply, ...extra] =
|
|
86
|
-
await getPoolData(
|
|
70
|
+
await getPoolData({
|
|
87
71
|
basePoolAddress,
|
|
88
72
|
swapPoolAddress,
|
|
89
73
|
cvxAddress,
|
|
90
74
|
extraPoolAddresses,
|
|
91
75
|
provider
|
|
92
|
-
);
|
|
76
|
+
});
|
|
93
77
|
|
|
94
78
|
const cvxPrice = getTokenPrice(tokenList.CVX);
|
|
95
79
|
const crvPrice = getTokenPrice(tokenList.CRV);
|
|
@@ -101,8 +85,8 @@ export async function getConvexApy(
|
|
|
101
85
|
const crvPerYear = crvPerUnderlying.mul(SECONDS_PER_YEAR);
|
|
102
86
|
const cvxPerYear = getCVXMintAmount(crvPerYear, cvxSupply);
|
|
103
87
|
|
|
104
|
-
const crvAPY = crvPerYear.mul(
|
|
105
|
-
const cvxAPY = cvxPerYear.mul(
|
|
88
|
+
const crvAPY = crvPerYear.mul(crvPrice).div(PRICE_DECIMALS);
|
|
89
|
+
const cvxAPY = cvxPerYear.mul(cvxPrice).div(PRICE_DECIMALS);
|
|
106
90
|
|
|
107
91
|
const extraAPRs = await Promise.all(
|
|
108
92
|
extraPoolAddresses.map(async (_, index) => {
|
|
@@ -112,9 +96,9 @@ export async function getConvexApy(
|
|
|
112
96
|
const perUnderlying = extraPoolRate.mul(WAD).div(virtualSupply);
|
|
113
97
|
const perYear = perUnderlying.mul(SECONDS_PER_YEAR);
|
|
114
98
|
|
|
115
|
-
const
|
|
99
|
+
const extraPrice = getTokenPrice(tokenList[extraRewardSymbol]);
|
|
116
100
|
|
|
117
|
-
const extraAPY = perYear.mul(
|
|
101
|
+
const extraAPY = perYear.mul(extraPrice).div(PRICE_DECIMALS);
|
|
118
102
|
|
|
119
103
|
return extraAPY;
|
|
120
104
|
})
|
|
@@ -125,9 +109,9 @@ export async function getConvexApy(
|
|
|
125
109
|
BigNumber.from(0)
|
|
126
110
|
);
|
|
127
111
|
|
|
128
|
-
const
|
|
112
|
+
const baseApyWAD = curveAPY[underlying];
|
|
129
113
|
|
|
130
|
-
return
|
|
114
|
+
return baseApyWAD.add(crvAPY).add(cvxAPY).add(extraAPYTotal);
|
|
131
115
|
}
|
|
132
116
|
|
|
133
117
|
const CVX_MAX_SUPPLY = WAD.mul(100000000);
|
|
@@ -154,13 +138,21 @@ type IBaseRewardPoolInterface = IBaseRewardPool["interface"];
|
|
|
154
138
|
type IConvexTokenInterface = IConvexToken["interface"];
|
|
155
139
|
type CurveV1AdapterStETHInterface = CurveV1AdapterStETH["interface"];
|
|
156
140
|
|
|
157
|
-
|
|
158
|
-
basePoolAddress: string
|
|
159
|
-
|
|
160
|
-
cvxAddress: string
|
|
161
|
-
extraPoolAddresses: string[]
|
|
162
|
-
provider: providers.Provider
|
|
163
|
-
|
|
141
|
+
interface GetPoolDataProps {
|
|
142
|
+
basePoolAddress: string;
|
|
143
|
+
swapPoolAddress: string;
|
|
144
|
+
cvxAddress: string;
|
|
145
|
+
extraPoolAddresses: string[];
|
|
146
|
+
provider: providers.Provider;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function getPoolData({
|
|
150
|
+
basePoolAddress,
|
|
151
|
+
swapPoolAddress,
|
|
152
|
+
cvxAddress,
|
|
153
|
+
extraPoolAddresses,
|
|
154
|
+
provider
|
|
155
|
+
}: GetPoolDataProps) {
|
|
164
156
|
const calls: [
|
|
165
157
|
MCall<IBaseRewardPoolInterface>,
|
|
166
158
|
MCall<IBaseRewardPoolInterface>,
|
|
@@ -179,7 +171,7 @@ async function getPoolData(
|
|
|
179
171
|
method: "totalSupply()"
|
|
180
172
|
},
|
|
181
173
|
{
|
|
182
|
-
address:
|
|
174
|
+
address: swapPoolAddress,
|
|
183
175
|
interface: CurveV1AdapterStETH__factory.createInterface(),
|
|
184
176
|
method: "get_virtual_price()"
|
|
185
177
|
},
|
|
@@ -207,44 +199,3 @@ async function getPoolData(
|
|
|
207
199
|
]
|
|
208
200
|
>(calls, provider);
|
|
209
201
|
}
|
|
210
|
-
|
|
211
|
-
interface CurveAPRData {
|
|
212
|
-
baseApy: number;
|
|
213
|
-
crvApy: number;
|
|
214
|
-
crvBoost: number;
|
|
215
|
-
crvPrice: number;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
interface APYResponse {
|
|
219
|
-
apys: Record<string, CurveAPRData>;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const curveLPTokenToPoolName: Record<CurveLPToken, string> = {
|
|
223
|
-
"3Crv": "3pool",
|
|
224
|
-
FRAX3CRV: "frax",
|
|
225
|
-
gusd3CRV: "gusd",
|
|
226
|
-
LUSD3CRV: "lusd",
|
|
227
|
-
crvPlain3andSUSD: "susdv2",
|
|
228
|
-
steCRV: "steth"
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
const RESPONSE_DECIMALS = 100;
|
|
232
|
-
|
|
233
|
-
// https://www.convexfinance.com/api/curve-apys
|
|
234
|
-
|
|
235
|
-
export async function getCurveBaseApy(
|
|
236
|
-
curveLPToken: CurveLPToken
|
|
237
|
-
): Promise<BigNumber> {
|
|
238
|
-
const poolName = curveLPTokenToPoolName[curveLPToken];
|
|
239
|
-
|
|
240
|
-
try {
|
|
241
|
-
const url = "https://www.convexfinance.com/api/curve-apys";
|
|
242
|
-
const result = await axios.get<APYResponse>(url);
|
|
243
|
-
|
|
244
|
-
const { baseApy = 0 } = result.data.apys[poolName] || {};
|
|
245
|
-
|
|
246
|
-
return toBN((baseApy / RESPONSE_DECIMALS).toString(), WAD_DECIMALS_POW);
|
|
247
|
-
} catch (e) {
|
|
248
|
-
return BigNumber.from(0);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { BigNumber } from "ethers";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
|
|
4
|
+
import { CurveLPToken } from "../tokens/curveLP";
|
|
5
|
+
|
|
6
|
+
import { toBN } from "../utils/formatter";
|
|
7
|
+
|
|
8
|
+
import { WAD_DECIMALS_POW } from "../core/constants";
|
|
9
|
+
import { objectEntries } from "../utils/mappers";
|
|
10
|
+
|
|
11
|
+
interface CurveAPYData {
|
|
12
|
+
baseApy: number;
|
|
13
|
+
crvApy: number;
|
|
14
|
+
crvBoost: number;
|
|
15
|
+
crvPrice: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface Response {
|
|
19
|
+
apys: Record<string, CurveAPYData>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const NAME_DICTIONARY: Record<CurveLPToken, string> = {
|
|
23
|
+
"3Crv": "3pool",
|
|
24
|
+
FRAX3CRV: "frax",
|
|
25
|
+
gusd3CRV: "gusd",
|
|
26
|
+
LUSD3CRV: "lusd",
|
|
27
|
+
crvPlain3andSUSD: "susdv2",
|
|
28
|
+
steCRV: "steth"
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const RESPONSE_DECIMALS = 100;
|
|
32
|
+
const ZERO = BigNumber.from(0);
|
|
33
|
+
|
|
34
|
+
// https://www.convexfinance.com/api/curve-apys
|
|
35
|
+
// http://localhost:8000/api/curve-apys
|
|
36
|
+
const URL = "https://www.convexfinance.com/api/curve-apys";
|
|
37
|
+
|
|
38
|
+
export type CurveAPYResult = Record<CurveLPToken, BigNumber>;
|
|
39
|
+
|
|
40
|
+
export async function getCurveAPY(): Promise<CurveAPYResult> {
|
|
41
|
+
try {
|
|
42
|
+
const { data } = await axios.get<Response>(URL);
|
|
43
|
+
const { apys } = data || {};
|
|
44
|
+
|
|
45
|
+
const curveAPY = objectEntries(NAME_DICTIONARY).reduce<CurveAPYResult>(
|
|
46
|
+
(acc, [curveSymbol, apiEntry]) => {
|
|
47
|
+
const { baseApy = 0 } = apys[apiEntry] || {};
|
|
48
|
+
acc[curveSymbol] = toBN(
|
|
49
|
+
(baseApy / RESPONSE_DECIMALS).toString(),
|
|
50
|
+
WAD_DECIMALS_POW
|
|
51
|
+
);
|
|
52
|
+
return acc;
|
|
53
|
+
},
|
|
54
|
+
{} as CurveAPYResult
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
return curveAPY;
|
|
58
|
+
} catch (e) {
|
|
59
|
+
return {
|
|
60
|
+
"3Crv": ZERO,
|
|
61
|
+
FRAX3CRV: ZERO,
|
|
62
|
+
gusd3CRV: ZERO,
|
|
63
|
+
LUSD3CRV: ZERO,
|
|
64
|
+
crvPlain3andSUSD: ZERO,
|
|
65
|
+
steCRV: ZERO
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
package/src/apy/index.ts
ADDED
package/src/apy/lidoAPY.ts
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { BigNumber } from "ethers";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
|
|
4
|
+
import { YearnLPToken, yearnTokens } from "../tokens/yearn";
|
|
5
|
+
|
|
6
|
+
import { toBN } from "../utils/formatter";
|
|
7
|
+
|
|
8
|
+
import { WAD_DECIMALS_POW } from "../core/constants";
|
|
9
|
+
import { objectEntries } from "../utils/mappers";
|
|
10
|
+
|
|
11
|
+
interface YearnAPYData {
|
|
12
|
+
apy: {
|
|
13
|
+
gross_apr: number;
|
|
14
|
+
net_apy: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
symbol: string;
|
|
18
|
+
display_name: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type Response = Array<YearnAPYData>;
|
|
22
|
+
|
|
23
|
+
const RESPONSE_DECIMALS = 1;
|
|
24
|
+
const ZERO = BigNumber.from(0);
|
|
25
|
+
|
|
26
|
+
const URL = "https://api.yearn.finance/v1/chains/1/vaults/all";
|
|
27
|
+
|
|
28
|
+
export type YearnAPYResult = Record<YearnLPToken, BigNumber>;
|
|
29
|
+
|
|
30
|
+
const transformSymbol = (s: string) => s.replaceAll("_", "-").toLowerCase();
|
|
31
|
+
|
|
32
|
+
export async function getYearnAPY(): Promise<YearnAPYResult> {
|
|
33
|
+
try {
|
|
34
|
+
const { data } = await axios.get<Response>(URL);
|
|
35
|
+
|
|
36
|
+
const dataBySymbol = data.reduce<Record<string, YearnAPYData>>((acc, d) => {
|
|
37
|
+
acc[d.symbol.toLowerCase()] = d;
|
|
38
|
+
return acc;
|
|
39
|
+
}, {});
|
|
40
|
+
|
|
41
|
+
const yearnAPY = objectEntries(yearnTokens).reduce<YearnAPYResult>(
|
|
42
|
+
(acc, [yearnSymbol]) => {
|
|
43
|
+
const { apy } = dataBySymbol[transformSymbol(yearnSymbol)] || {};
|
|
44
|
+
const { net_apy: netApy } = apy || {};
|
|
45
|
+
|
|
46
|
+
acc[yearnSymbol] = toBN(
|
|
47
|
+
(netApy / RESPONSE_DECIMALS).toString(),
|
|
48
|
+
WAD_DECIMALS_POW
|
|
49
|
+
);
|
|
50
|
+
return acc;
|
|
51
|
+
},
|
|
52
|
+
{} as YearnAPYResult
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
return yearnAPY;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
return {
|
|
58
|
+
yvDAI: ZERO,
|
|
59
|
+
yvUSDC: ZERO,
|
|
60
|
+
yvWETH: ZERO,
|
|
61
|
+
yvWBTC: ZERO,
|
|
62
|
+
yvCurve_stETH: ZERO,
|
|
63
|
+
yvCurve_FRAX: ZERO
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { keyToLowercase } from "../utils/mappers";
|
|
2
|
+
import { shortAddress } from "../utils/formatter";
|
|
2
3
|
import { contractsByAddress, contractParams } from "./contracts";
|
|
3
4
|
|
|
4
5
|
export const deployedContracts: Record<string, string> = {
|
|
@@ -63,5 +64,5 @@ const contractsFullList = {
|
|
|
63
64
|
};
|
|
64
65
|
|
|
65
66
|
export function getContractName(address: string): string {
|
|
66
|
-
return contractsFullList[address.toLowerCase()] || address;
|
|
67
|
+
return contractsFullList[address.toLowerCase()] || shortAddress(address);
|
|
67
68
|
}
|
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
CreditAccountDataExtendedPayload,
|
|
4
4
|
CreditAccountDataPayload
|
|
5
5
|
} from "../payload/creditAccount";
|
|
6
|
+
import { calcTotalPrice } from "../utils/price";
|
|
7
|
+
|
|
6
8
|
import {
|
|
7
9
|
PERCENTAGE_FACTOR,
|
|
8
10
|
RAY,
|
|
@@ -10,7 +12,6 @@ import {
|
|
|
10
12
|
PRICE_DECIMALS
|
|
11
13
|
} from "./constants";
|
|
12
14
|
import { TokenData } from "../tokens/tokenData";
|
|
13
|
-
import { calcTotalPrice } from "./price";
|
|
14
15
|
|
|
15
16
|
export type Balance = { address: string; balance: BigNumber };
|
|
16
17
|
|
|
@@ -48,12 +49,12 @@ export class CreditAccountData {
|
|
|
48
49
|
public readonly version: number = 1;
|
|
49
50
|
|
|
50
51
|
constructor(payload: CreditAccountDataPayload) {
|
|
51
|
-
this.id = payload.creditManager;
|
|
52
|
-
this.addr = payload.addr;
|
|
53
|
-
this.borrower = payload.borrower;
|
|
52
|
+
this.id = payload.creditManager.toLowerCase();
|
|
53
|
+
this.addr = payload.addr.toLowerCase();
|
|
54
|
+
this.borrower = payload.borrower.toLowerCase();
|
|
54
55
|
this.inUse = payload.inUse;
|
|
55
|
-
this.creditManager = payload.creditManager;
|
|
56
|
-
this.underlyingToken = payload.underlying;
|
|
56
|
+
this.creditManager = payload.creditManager.toLowerCase();
|
|
57
|
+
this.underlyingToken = payload.underlying.toLowerCase();
|
|
57
58
|
this.borrowedAmountPlusInterest = BigNumber.from(
|
|
58
59
|
payload.borrowedAmountPlusInterest
|
|
59
60
|
);
|
|
@@ -68,13 +69,14 @@ export class CreditAccountData {
|
|
|
68
69
|
.toNumber() / PERCENTAGE_FACTOR;
|
|
69
70
|
|
|
70
71
|
(payload.balances || []).forEach(b => {
|
|
72
|
+
const tokenLC = b.token.toLowerCase();
|
|
71
73
|
if (b.isAllowed) {
|
|
72
|
-
this.balances[
|
|
73
|
-
this.allowedTokens.push(
|
|
74
|
+
this.balances[tokenLC] = BigNumber.from(b.balance);
|
|
75
|
+
this.allowedTokens.push(tokenLC);
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
this.allBalances[
|
|
77
|
-
this.allTokens.push(
|
|
78
|
+
this.allBalances[tokenLC] = BigNumber.from(b.balance);
|
|
79
|
+
this.allTokens.push(tokenLC);
|
|
78
80
|
});
|
|
79
81
|
|
|
80
82
|
this.isDeleting = false;
|
|
@@ -94,7 +96,7 @@ export function sortBalances(
|
|
|
94
96
|
balances: Record<string, BigNumber>,
|
|
95
97
|
prices: Record<string, BigNumber>,
|
|
96
98
|
tokens: Record<string, TokenData>
|
|
97
|
-
) {
|
|
99
|
+
): Array<[string, BigNumber]> {
|
|
98
100
|
return Object.entries(balances).sort(([addr1, amount1], [addr2, amount2]) => {
|
|
99
101
|
const addr1Lc = addr1.toLowerCase();
|
|
100
102
|
const addr2Lc = addr2.toLowerCase();
|
|
@@ -109,7 +111,9 @@ export function sortBalances(
|
|
|
109
111
|
const totalPrice2 = calcTotalPrice(price2, amount2, token2?.decimals);
|
|
110
112
|
|
|
111
113
|
if (totalPrice1.eq(totalPrice2)) {
|
|
112
|
-
return
|
|
114
|
+
return amount1.eq(amount2)
|
|
115
|
+
? tokensAbcComparator(token1, token2)
|
|
116
|
+
: amountAbcComparator(amount1, amount2);
|
|
113
117
|
}
|
|
114
118
|
|
|
115
119
|
if (totalPrice1.gt(totalPrice2)) {
|
|
@@ -127,6 +131,10 @@ export function tokensAbcComparator(t1?: TokenData, t2?: TokenData) {
|
|
|
127
131
|
return symbol1 > symbol2 ? 1 : -1;
|
|
128
132
|
}
|
|
129
133
|
|
|
134
|
+
export function amountAbcComparator(t1: BigNumber, t2: BigNumber) {
|
|
135
|
+
return t1?.gt(t2) ? -1 : 1;
|
|
136
|
+
}
|
|
137
|
+
|
|
130
138
|
export class CreditAccountDataExtended extends CreditAccountData {
|
|
131
139
|
public readonly repayAmount: BigNumber;
|
|
132
140
|
|