@defisaver/positions-sdk 0.0.166 → 0.0.167
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/cjs/aaveV2/index.js +1 -1
- package/cjs/morphoAaveV2/index.js +1 -1
- package/cjs/staking/staking.d.ts +4 -4
- package/cjs/staking/staking.js +19 -14
- package/esm/aaveV2/index.js +2 -2
- package/esm/morphoAaveV2/index.js +2 -2
- package/esm/staking/staking.d.ts +4 -4
- package/esm/staking/staking.js +15 -10
- package/package.json +1 -1
- package/src/aaveV2/index.ts +2 -2
- package/src/morphoAaveV2/index.ts +2 -2
- package/src/staking/staking.ts +15 -11
package/cjs/aaveV2/index.js
CHANGED
|
@@ -66,7 +66,7 @@ const getAaveV2MarketsData = (web3, network, selectedMarket, mainnetWeb3) => __a
|
|
|
66
66
|
}));
|
|
67
67
|
const stEthMarket = markets.find(({ symbol }) => symbol === 'stETH');
|
|
68
68
|
if (stEthMarket) {
|
|
69
|
-
stEthMarket.incentiveSupplyApy = yield (0, staking_1.
|
|
69
|
+
stEthMarket.incentiveSupplyApy = yield (0, staking_1.getStETHApy)(mainnetWeb3);
|
|
70
70
|
stEthMarket.incentiveSupplyToken = 'stETH';
|
|
71
71
|
}
|
|
72
72
|
const payload = {};
|
|
@@ -93,7 +93,7 @@ const getMorphoAaveV2MarketsData = (web3, network, mainnetWeb3) => __awaiter(voi
|
|
|
93
93
|
});
|
|
94
94
|
const stEthMarket = assetsData.find(({ symbol }) => symbol === 'stETH');
|
|
95
95
|
if (stEthMarket) {
|
|
96
|
-
stEthMarket.incentiveSupplyApy = yield (0, staking_1.
|
|
96
|
+
stEthMarket.incentiveSupplyApy = yield (0, staking_1.getStETHApy)(mainnetWeb3);
|
|
97
97
|
stEthMarket.incentiveSupplyToken = 'stETH';
|
|
98
98
|
}
|
|
99
99
|
const payload = {};
|
package/cjs/staking/staking.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import Web3 from 'web3';
|
|
2
2
|
import { MMAssetsData, MMUsedAssets } from '../types/common';
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
3
|
+
export declare const getStETHApy: (web3: Web3, fromBlock?: number, blockNumber?: 'latest' | number) => Promise<string>;
|
|
4
|
+
export declare const getCbETHApy: (web3: Web3, blockNumber?: 'latest' | number) => Promise<string>;
|
|
5
|
+
export declare const getREthApy: (web3: Web3, blockNumber?: 'latest' | number) => Promise<string>;
|
|
6
6
|
export declare const getDsrApy: (web3: Web3, blockNumber?: 'latest' | number) => Promise<string>;
|
|
7
7
|
export declare const getSsrApy: () => Promise<string>;
|
|
8
8
|
export declare const STAKING_ASSETS: string[];
|
|
9
|
-
export declare const getStakingApy: (asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<any> |
|
|
9
|
+
export declare const getStakingApy: (asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => "0" | Promise<any> | undefined;
|
|
10
10
|
export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
|
|
11
11
|
export declare const calculateNetApy: (usedAssets: MMUsedAssets, assetsData: MMAssetsData, isMorpho?: boolean) => {
|
|
12
12
|
netApy: string;
|
package/cjs/staking/staking.js
CHANGED
|
@@ -12,13 +12,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.getStETHByWstETHMultiple = exports.getStETHByWstETH = exports.getWstETHByStETH = exports.calculateNetApy = exports.calculateInterestEarned = exports.getStakingApy = exports.STAKING_ASSETS = exports.getSsrApy = exports.getDsrApy = exports.
|
|
15
|
+
exports.getStETHByWstETHMultiple = exports.getStETHByWstETH = exports.getWstETHByStETH = exports.calculateNetApy = exports.calculateInterestEarned = exports.getStakingApy = exports.STAKING_ASSETS = exports.getSsrApy = exports.getDsrApy = exports.getREthApy = exports.getCbETHApy = exports.getStETHApy = void 0;
|
|
16
16
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
17
17
|
const contracts_1 = require("../contracts");
|
|
18
18
|
const common_1 = require("../types/common");
|
|
19
19
|
const constants_1 = require("../constants");
|
|
20
20
|
const multicall_1 = require("../multicall");
|
|
21
|
-
const
|
|
21
|
+
const moneymarket_1 = require("../moneymarket");
|
|
22
|
+
const getStETHApy = (web3, fromBlock = 17900000, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
23
|
try {
|
|
23
24
|
const tokenRebasedEvents = yield (0, contracts_1.LidoContract)(web3, common_1.NetworkNumber.Eth).getPastEvents('TokenRebased', { fromBlock, toBlock: blockNumber });
|
|
24
25
|
tokenRebasedEvents.sort((a, b) => b.blockNumber - a.blockNumber); // sort from highest to lowest block number
|
|
@@ -30,17 +31,17 @@ const getStETHApr = (web3, fromBlock = 17900000, blockNumber = 'latest') => __aw
|
|
|
30
31
|
.div(event.timeElapsed.toString()).mul(100)
|
|
31
32
|
.toNumber();
|
|
32
33
|
});
|
|
33
|
-
return aprs.reduce((a, b) => a + b, 0) / aprs.length;
|
|
34
|
+
return (0, moneymarket_1.aprToApy)(aprs.reduce((a, b) => a + b, 0) / aprs.length);
|
|
34
35
|
}
|
|
35
36
|
catch (e) {
|
|
36
37
|
console.warn('Failed to fetch stETH APY from events, falling back to Lido API');
|
|
37
38
|
const res = yield fetch('https://eth-api.lido.fi/v1/protocol/steth/apr/sma');
|
|
38
39
|
const data = yield res.json();
|
|
39
|
-
return data.data.smaApr;
|
|
40
|
+
return (0, moneymarket_1.aprToApy)(data.data.smaApr);
|
|
40
41
|
}
|
|
41
42
|
});
|
|
42
|
-
exports.
|
|
43
|
-
const
|
|
43
|
+
exports.getStETHApy = getStETHApy;
|
|
44
|
+
const getCbETHApy = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
44
45
|
let currentBlock = blockNumber;
|
|
45
46
|
if (blockNumber === 'latest')
|
|
46
47
|
currentBlock = yield web3.eth.getBlockNumber();
|
|
@@ -55,10 +56,10 @@ const getCbETHApr = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0,
|
|
|
55
56
|
.mul(constants_1.BLOCKS_IN_A_YEAR / blockDiff)
|
|
56
57
|
.mul(100)
|
|
57
58
|
.toString();
|
|
58
|
-
return apr;
|
|
59
|
+
return (0, moneymarket_1.aprToApy)(apr);
|
|
59
60
|
});
|
|
60
|
-
exports.
|
|
61
|
-
const
|
|
61
|
+
exports.getCbETHApy = getCbETHApy;
|
|
62
|
+
const getREthApy = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
62
63
|
let currentBlock = blockNumber;
|
|
63
64
|
if (blockNumber === 'latest')
|
|
64
65
|
currentBlock = yield web3.eth.getBlockNumber();
|
|
@@ -73,9 +74,9 @@ const getREthApr = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0, v
|
|
|
73
74
|
.mul(constants_1.BLOCKS_IN_A_YEAR / blockDiff)
|
|
74
75
|
.mul(100)
|
|
75
76
|
.toString();
|
|
76
|
-
return apr;
|
|
77
|
+
return (0, moneymarket_1.aprToApy)(apr);
|
|
77
78
|
});
|
|
78
|
-
exports.
|
|
79
|
+
exports.getREthApy = getREthApy;
|
|
79
80
|
const getDsrApy = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
80
81
|
const potContract = (0, contracts_1.PotContract)(web3, common_1.NetworkNumber.Eth);
|
|
81
82
|
return new decimal_js_1.default(yield potContract.methods.dsr().call())
|
|
@@ -113,6 +114,10 @@ const getSuperOETHApy = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
113
114
|
const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function* () {
|
|
114
115
|
const res = yield fetch(`https://app.defisaver.com/api/staking/apy?asset=${asset}`);
|
|
115
116
|
const data = yield res.json();
|
|
117
|
+
// if our server returns apr, transform it into apy
|
|
118
|
+
if (['weETH'].includes(asset)) {
|
|
119
|
+
return (0, moneymarket_1.aprToApy)(data.apy);
|
|
120
|
+
}
|
|
116
121
|
return data.apy;
|
|
117
122
|
});
|
|
118
123
|
exports.STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS'];
|
|
@@ -120,11 +125,11 @@ const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = undefine
|
|
|
120
125
|
console.log('getStakingApy', asset, blockNumber, fromBlock);
|
|
121
126
|
try {
|
|
122
127
|
if (asset === 'stETH' || asset === 'wstETH')
|
|
123
|
-
return (0, exports.
|
|
128
|
+
return (0, exports.getStETHApy)(web3, fromBlock, blockNumber);
|
|
124
129
|
if (asset === 'cbETH')
|
|
125
|
-
return (0, exports.
|
|
130
|
+
return (0, exports.getCbETHApy)(web3, blockNumber);
|
|
126
131
|
if (asset === 'rETH')
|
|
127
|
-
return (0, exports.
|
|
132
|
+
return (0, exports.getREthApy)(web3, blockNumber);
|
|
128
133
|
if (asset === 'sDAI')
|
|
129
134
|
return (0, exports.getDsrApy)(web3);
|
|
130
135
|
if (asset === 'sUSDe')
|
package/esm/aaveV2/index.js
CHANGED
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import Dec from 'decimal.js';
|
|
11
11
|
import { assetAmountInEth, getAssetInfo } from '@defisaver/tokens';
|
|
12
|
-
import { calculateNetApy,
|
|
12
|
+
import { calculateNetApy, getStETHApy } from '../staking';
|
|
13
13
|
import { ethToWeth, wethToEth, wethToEthByAddress } from '../services/utils';
|
|
14
14
|
import { AaveLoanInfoV2Contract, createContractWrapper } from '../contracts';
|
|
15
15
|
import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
|
|
@@ -60,7 +60,7 @@ export const getAaveV2MarketsData = (web3, network, selectedMarket, mainnetWeb3)
|
|
|
60
60
|
}));
|
|
61
61
|
const stEthMarket = markets.find(({ symbol }) => symbol === 'stETH');
|
|
62
62
|
if (stEthMarket) {
|
|
63
|
-
stEthMarket.incentiveSupplyApy = yield
|
|
63
|
+
stEthMarket.incentiveSupplyApy = yield getStETHApy(mainnetWeb3);
|
|
64
64
|
stEthMarket.incentiveSupplyToken = 'stETH';
|
|
65
65
|
}
|
|
66
66
|
const payload = {};
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { assetAmountInEth, getAssetInfoByAddress } from '@defisaver/tokens';
|
|
11
11
|
import Dec from 'decimal.js';
|
|
12
12
|
import { wethToEthByAddress } from '../services/utils';
|
|
13
|
-
import {
|
|
13
|
+
import { getStETHApy } from '../staking';
|
|
14
14
|
import { MorphoAaveV2ViewContract } from '../contracts';
|
|
15
15
|
import { AaveVersions, } from '../types';
|
|
16
16
|
import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
|
|
@@ -87,7 +87,7 @@ export const getMorphoAaveV2MarketsData = (web3, network, mainnetWeb3) => __awai
|
|
|
87
87
|
});
|
|
88
88
|
const stEthMarket = assetsData.find(({ symbol }) => symbol === 'stETH');
|
|
89
89
|
if (stEthMarket) {
|
|
90
|
-
stEthMarket.incentiveSupplyApy = yield
|
|
90
|
+
stEthMarket.incentiveSupplyApy = yield getStETHApy(mainnetWeb3);
|
|
91
91
|
stEthMarket.incentiveSupplyToken = 'stETH';
|
|
92
92
|
}
|
|
93
93
|
const payload = {};
|
package/esm/staking/staking.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import Web3 from 'web3';
|
|
2
2
|
import { MMAssetsData, MMUsedAssets } from '../types/common';
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
3
|
+
export declare const getStETHApy: (web3: Web3, fromBlock?: number, blockNumber?: 'latest' | number) => Promise<string>;
|
|
4
|
+
export declare const getCbETHApy: (web3: Web3, blockNumber?: 'latest' | number) => Promise<string>;
|
|
5
|
+
export declare const getREthApy: (web3: Web3, blockNumber?: 'latest' | number) => Promise<string>;
|
|
6
6
|
export declare const getDsrApy: (web3: Web3, blockNumber?: 'latest' | number) => Promise<string>;
|
|
7
7
|
export declare const getSsrApy: () => Promise<string>;
|
|
8
8
|
export declare const STAKING_ASSETS: string[];
|
|
9
|
-
export declare const getStakingApy: (asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<any> |
|
|
9
|
+
export declare const getStakingApy: (asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => "0" | Promise<any> | undefined;
|
|
10
10
|
export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
|
|
11
11
|
export declare const calculateNetApy: (usedAssets: MMUsedAssets, assetsData: MMAssetsData, isMorpho?: boolean) => {
|
|
12
12
|
netApy: string;
|
package/esm/staking/staking.js
CHANGED
|
@@ -12,7 +12,8 @@ import { CbEthContract, LidoContract, PotContract, REthContract, wstETHContract,
|
|
|
12
12
|
import { NetworkNumber } from '../types/common';
|
|
13
13
|
import { BLOCKS_IN_A_YEAR, SECONDS_PER_YEAR, AVG_BLOCK_TIME } from '../constants';
|
|
14
14
|
import { multicall } from '../multicall';
|
|
15
|
-
|
|
15
|
+
import { aprToApy } from '../moneymarket';
|
|
16
|
+
export const getStETHApy = (web3, fromBlock = 17900000, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
17
|
try {
|
|
17
18
|
const tokenRebasedEvents = yield LidoContract(web3, NetworkNumber.Eth).getPastEvents('TokenRebased', { fromBlock, toBlock: blockNumber });
|
|
18
19
|
tokenRebasedEvents.sort((a, b) => b.blockNumber - a.blockNumber); // sort from highest to lowest block number
|
|
@@ -24,16 +25,16 @@ export const getStETHApr = (web3, fromBlock = 17900000, blockNumber = 'latest')
|
|
|
24
25
|
.div(event.timeElapsed.toString()).mul(100)
|
|
25
26
|
.toNumber();
|
|
26
27
|
});
|
|
27
|
-
return aprs.reduce((a, b) => a + b, 0) / aprs.length;
|
|
28
|
+
return aprToApy(aprs.reduce((a, b) => a + b, 0) / aprs.length);
|
|
28
29
|
}
|
|
29
30
|
catch (e) {
|
|
30
31
|
console.warn('Failed to fetch stETH APY from events, falling back to Lido API');
|
|
31
32
|
const res = yield fetch('https://eth-api.lido.fi/v1/protocol/steth/apr/sma');
|
|
32
33
|
const data = yield res.json();
|
|
33
|
-
return data.data.smaApr;
|
|
34
|
+
return aprToApy(data.data.smaApr);
|
|
34
35
|
}
|
|
35
36
|
});
|
|
36
|
-
export const
|
|
37
|
+
export const getCbETHApy = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
38
|
let currentBlock = blockNumber;
|
|
38
39
|
if (blockNumber === 'latest')
|
|
39
40
|
currentBlock = yield web3.eth.getBlockNumber();
|
|
@@ -48,9 +49,9 @@ export const getCbETHApr = (web3, blockNumber = 'latest') => __awaiter(void 0, v
|
|
|
48
49
|
.mul(BLOCKS_IN_A_YEAR / blockDiff)
|
|
49
50
|
.mul(100)
|
|
50
51
|
.toString();
|
|
51
|
-
return apr;
|
|
52
|
+
return aprToApy(apr);
|
|
52
53
|
});
|
|
53
|
-
export const
|
|
54
|
+
export const getREthApy = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
54
55
|
let currentBlock = blockNumber;
|
|
55
56
|
if (blockNumber === 'latest')
|
|
56
57
|
currentBlock = yield web3.eth.getBlockNumber();
|
|
@@ -65,7 +66,7 @@ export const getREthApr = (web3, blockNumber = 'latest') => __awaiter(void 0, vo
|
|
|
65
66
|
.mul(BLOCKS_IN_A_YEAR / blockDiff)
|
|
66
67
|
.mul(100)
|
|
67
68
|
.toString();
|
|
68
|
-
return apr;
|
|
69
|
+
return aprToApy(apr);
|
|
69
70
|
});
|
|
70
71
|
export const getDsrApy = (web3, blockNumber = 'latest') => __awaiter(void 0, void 0, void 0, function* () {
|
|
71
72
|
const potContract = PotContract(web3, NetworkNumber.Eth);
|
|
@@ -102,6 +103,10 @@ const getSuperOETHApy = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
102
103
|
const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function* () {
|
|
103
104
|
const res = yield fetch(`https://app.defisaver.com/api/staking/apy?asset=${asset}`);
|
|
104
105
|
const data = yield res.json();
|
|
106
|
+
// if our server returns apr, transform it into apy
|
|
107
|
+
if (['weETH'].includes(asset)) {
|
|
108
|
+
return aprToApy(data.apy);
|
|
109
|
+
}
|
|
105
110
|
return data.apy;
|
|
106
111
|
});
|
|
107
112
|
export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS'];
|
|
@@ -109,11 +114,11 @@ export const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = u
|
|
|
109
114
|
console.log('getStakingApy', asset, blockNumber, fromBlock);
|
|
110
115
|
try {
|
|
111
116
|
if (asset === 'stETH' || asset === 'wstETH')
|
|
112
|
-
return
|
|
117
|
+
return getStETHApy(web3, fromBlock, blockNumber);
|
|
113
118
|
if (asset === 'cbETH')
|
|
114
|
-
return
|
|
119
|
+
return getCbETHApy(web3, blockNumber);
|
|
115
120
|
if (asset === 'rETH')
|
|
116
|
-
return
|
|
121
|
+
return getREthApy(web3, blockNumber);
|
|
117
122
|
if (asset === 'sDAI')
|
|
118
123
|
return getDsrApy(web3);
|
|
119
124
|
if (asset === 'sUSDe')
|
package/package.json
CHANGED
package/src/aaveV2/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { assetAmountInEth, getAssetInfo } from '@defisaver/tokens';
|
|
|
4
4
|
import {
|
|
5
5
|
Blockish, EthAddress, NetworkNumber, PositionBalances,
|
|
6
6
|
} from '../types/common';
|
|
7
|
-
import { calculateNetApy,
|
|
7
|
+
import { calculateNetApy, getStETHApy } from '../staking';
|
|
8
8
|
import { ethToWeth, wethToEth, wethToEthByAddress } from '../services/utils';
|
|
9
9
|
import { AaveLoanInfoV2Contract, createContractWrapper } from '../contracts';
|
|
10
10
|
import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
|
|
@@ -60,7 +60,7 @@ export const getAaveV2MarketsData = async (web3: Web3, network: NetworkNumber, s
|
|
|
60
60
|
|
|
61
61
|
const stEthMarket = markets.find(({ symbol }) => symbol === 'stETH');
|
|
62
62
|
if (stEthMarket) {
|
|
63
|
-
stEthMarket.incentiveSupplyApy = await
|
|
63
|
+
stEthMarket.incentiveSupplyApy = await getStETHApy(mainnetWeb3);
|
|
64
64
|
stEthMarket.incentiveSupplyToken = 'stETH';
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -5,7 +5,7 @@ import { wethToEthByAddress } from '../services/utils';
|
|
|
5
5
|
import {
|
|
6
6
|
Blockish, EthAddress, NetworkNumber, PositionBalances,
|
|
7
7
|
} from '../types/common';
|
|
8
|
-
import {
|
|
8
|
+
import { getStETHApy } from '../staking';
|
|
9
9
|
import { MorphoAaveV2ViewContract } from '../contracts';
|
|
10
10
|
import {
|
|
11
11
|
AavePositionData,
|
|
@@ -103,7 +103,7 @@ export const getMorphoAaveV2MarketsData = async (web3: Web3, network: NetworkNum
|
|
|
103
103
|
|
|
104
104
|
const stEthMarket = assetsData.find(({ symbol }) => symbol === 'stETH');
|
|
105
105
|
if (stEthMarket) {
|
|
106
|
-
stEthMarket.incentiveSupplyApy = await
|
|
106
|
+
stEthMarket.incentiveSupplyApy = await getStETHApy(mainnetWeb3);
|
|
107
107
|
stEthMarket.incentiveSupplyToken = 'stETH';
|
|
108
108
|
}
|
|
109
109
|
|
package/src/staking/staking.ts
CHANGED
|
@@ -7,9 +7,10 @@ import { MMAssetsData, MMUsedAssets, NetworkNumber } from '../types/common';
|
|
|
7
7
|
import { ContractEventLog } from '../types/contracts/generated/types';
|
|
8
8
|
import { BLOCKS_IN_A_YEAR, SECONDS_PER_YEAR, AVG_BLOCK_TIME } from '../constants';
|
|
9
9
|
import { multicall } from '../multicall';
|
|
10
|
+
import { aprToApy } from '../moneymarket';
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
export const
|
|
13
|
+
export const getStETHApy = async (web3: Web3, fromBlock = 17900000, blockNumber: 'latest' | number = 'latest') => {
|
|
13
14
|
try {
|
|
14
15
|
const tokenRebasedEvents: ContractEventLog<{ [key: string]: any }>[] = await LidoContract(web3, NetworkNumber.Eth).getPastEvents('TokenRebased', { fromBlock, toBlock: blockNumber });
|
|
15
16
|
tokenRebasedEvents.sort((a, b) => b.blockNumber - a.blockNumber); // sort from highest to lowest block number
|
|
@@ -21,17 +22,16 @@ export const getStETHApr = async (web3: Web3, fromBlock = 17900000, blockNumber:
|
|
|
21
22
|
.div(event.timeElapsed.toString()).mul(100)
|
|
22
23
|
.toNumber();
|
|
23
24
|
});
|
|
24
|
-
return aprs.reduce((a, b) => a + b, 0) / aprs.length;
|
|
25
|
+
return aprToApy(aprs.reduce((a, b) => a + b, 0) / aprs.length);
|
|
25
26
|
} catch (e) {
|
|
26
27
|
console.warn('Failed to fetch stETH APY from events, falling back to Lido API');
|
|
27
28
|
const res = await fetch('https://eth-api.lido.fi/v1/protocol/steth/apr/sma');
|
|
28
29
|
const data = await res.json();
|
|
29
|
-
return data.data.smaApr;
|
|
30
|
+
return aprToApy(data.data.smaApr);
|
|
30
31
|
}
|
|
31
32
|
};
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
export const getCbETHApr = async (web3: Web3, blockNumber: 'latest' | number = 'latest') => {
|
|
34
|
+
export const getCbETHApy = async (web3: Web3, blockNumber: 'latest' | number = 'latest') => {
|
|
35
35
|
let currentBlock = blockNumber;
|
|
36
36
|
if (blockNumber === 'latest') currentBlock = await web3.eth.getBlockNumber();
|
|
37
37
|
const blockDiff = 6 * 24 * 60 * 60 / AVG_BLOCK_TIME;
|
|
@@ -45,11 +45,11 @@ export const getCbETHApr = async (web3: Web3, blockNumber: 'latest' | number = '
|
|
|
45
45
|
.mul(BLOCKS_IN_A_YEAR / blockDiff)
|
|
46
46
|
.mul(100)
|
|
47
47
|
.toString();
|
|
48
|
-
return apr;
|
|
48
|
+
return aprToApy(apr);
|
|
49
49
|
};
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
export const
|
|
52
|
+
export const getREthApy = async (web3: Web3, blockNumber: 'latest' | number = 'latest') => {
|
|
53
53
|
let currentBlock = blockNumber;
|
|
54
54
|
if (blockNumber === 'latest') currentBlock = await web3.eth.getBlockNumber();
|
|
55
55
|
const blockDiff = 8 * 24 * 60 * 60 / AVG_BLOCK_TIME;
|
|
@@ -64,7 +64,7 @@ export const getREthApr = async (web3: Web3, blockNumber: 'latest' | number = 'l
|
|
|
64
64
|
.mul(100)
|
|
65
65
|
.toString();
|
|
66
66
|
|
|
67
|
-
return apr;
|
|
67
|
+
return aprToApy(apr);
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
export const getDsrApy = async (web3: Web3, blockNumber: 'latest' | number = 'latest') => {
|
|
@@ -106,6 +106,10 @@ const getSuperOETHApy = async () => {
|
|
|
106
106
|
const getApyFromDfsApi = async (asset: string) => {
|
|
107
107
|
const res = await fetch(`https://app.defisaver.com/api/staking/apy?asset=${asset}`);
|
|
108
108
|
const data = await res.json();
|
|
109
|
+
// if our server returns apr, transform it into apy
|
|
110
|
+
if (['weETH'].includes(asset)) {
|
|
111
|
+
return aprToApy(data.apy);
|
|
112
|
+
}
|
|
109
113
|
return data.apy;
|
|
110
114
|
};
|
|
111
115
|
|
|
@@ -114,9 +118,9 @@ export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weET
|
|
|
114
118
|
export const getStakingApy = (asset: string, web3: Web3, blockNumber: 'latest' | number = 'latest', fromBlock: number | undefined = undefined) => {
|
|
115
119
|
console.log('getStakingApy', asset, blockNumber, fromBlock);
|
|
116
120
|
try {
|
|
117
|
-
if (asset === 'stETH' || asset === 'wstETH') return
|
|
118
|
-
if (asset === 'cbETH') return
|
|
119
|
-
if (asset === 'rETH') return
|
|
121
|
+
if (asset === 'stETH' || asset === 'wstETH') return getStETHApy(web3, fromBlock, blockNumber);
|
|
122
|
+
if (asset === 'cbETH') return getCbETHApy(web3, blockNumber);
|
|
123
|
+
if (asset === 'rETH') return getREthApy(web3, blockNumber);
|
|
120
124
|
if (asset === 'sDAI') return getDsrApy(web3);
|
|
121
125
|
if (asset === 'sUSDe') return getApyFromDfsApi('sUSDe');
|
|
122
126
|
if (asset === 'weETH') return getApyFromDfsApi('weETH');
|