@stake-dao/reader 0.5.20 → 0.5.22
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/dist/esm/sdt/fetch.js +21 -28
- package/dist/esm/sdt/fetch.js.map +1 -1
- package/dist/esm/strategies/pendle/getPendleApiData.js +7 -2
- package/dist/esm/strategies/pendle/getPendleApiData.js.map +1 -1
- package/dist/esm/strategies/stakeDao/fetch.js +1 -1
- package/dist/esm/strategies/stakeDao/fetch.js.map +1 -1
- package/dist/esm/utils/getAverageYearlyRewards.js +8 -6
- package/dist/esm/utils/getAverageYearlyRewards.js.map +1 -1
- package/dist/types/sdt/fetch.d.ts +0 -3
- package/dist/types/sdt/fetch.d.ts.map +1 -1
- package/dist/types/strategies/pendle/getPendleApiData.d.ts.map +1 -1
- package/dist/types/utils/getAverageYearlyRewards.d.ts +1 -1
- package/dist/types/utils/getAverageYearlyRewards.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/sdt/fetch.ts +19 -28
- package/src/strategies/pendle/getPendleApiData.ts +6 -2
- package/src/strategies/stakeDao/fetch.ts +1 -1
- package/src/utils/getAverageYearlyRewards.ts +14 -6
package/dist/esm/sdt/fetch.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { formatUnits, parseAbi, parseUnits } from 'viem';
|
|
2
|
-
import { ONE_DAY, contract, tokenWithId } from '@stake-dao/constants';
|
|
2
|
+
import { ONE_DAY, OneEther, contract, tokenWithId } from '@stake-dao/constants';
|
|
3
3
|
import { mainnet } from 'viem/chains';
|
|
4
4
|
import {} from '../prices.js';
|
|
5
5
|
import { equalTlc, multicall } from '../utils.js';
|
|
6
6
|
import { getLogsFromEtherscan } from '../utils/etherscan.js';
|
|
7
7
|
import getAverageYearlyRewards from '../utils/getAverageYearlyRewards.js';
|
|
8
8
|
import veSdtAlternativeYields from './veSdtAlternativeYields.js';
|
|
9
|
-
const NB_EVENTS_TO_USE =
|
|
9
|
+
const NB_EVENTS_TO_USE = 10;
|
|
10
10
|
const EVENT_TOPIC = '0xce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6';
|
|
11
|
-
// Need SDT and
|
|
11
|
+
// Need SDT and USDC price
|
|
12
12
|
export const fetchSdt = async ({ provider, prices, explorerApiKey }) => {
|
|
13
13
|
const sdtToken = tokenWithId('sdt');
|
|
14
|
-
const
|
|
14
|
+
const usdcToken = tokenWithId('usdc');
|
|
15
15
|
const now = Math.ceil(new Date().getTime() / 1000);
|
|
16
16
|
const lastCheck = now - ONE_DAY * 60;
|
|
17
17
|
const lastCheckBlock = await (await fetch(`https://coins.llama.fi/block/ethereum/${lastCheck}`)).json();
|
|
@@ -19,22 +19,20 @@ export const fetchSdt = async ({ provider, prices, explorerApiKey }) => {
|
|
|
19
19
|
try {
|
|
20
20
|
const rawEventsData = await getLogsFromEtherscan({
|
|
21
21
|
chainId: mainnet.id,
|
|
22
|
-
address: contract('
|
|
22
|
+
address: contract('usdcVeSdtFeeDistributor'),
|
|
23
23
|
apikey: explorerApiKey,
|
|
24
24
|
extraQueryParams: {
|
|
25
25
|
fromBlock: `${lastCheckBlock.height}`,
|
|
26
26
|
topic0: EVENT_TOPIC,
|
|
27
27
|
},
|
|
28
28
|
});
|
|
29
|
-
amountPerYear = await getAverageYearlyRewards(rawEventsData, NB_EVENTS_TO_USE);
|
|
29
|
+
amountPerYear = await getAverageYearlyRewards(rawEventsData, NB_EVENTS_TO_USE, false, usdcToken.decimals);
|
|
30
30
|
}
|
|
31
31
|
catch {
|
|
32
32
|
amountPerYear = 0;
|
|
33
33
|
}
|
|
34
34
|
const rawSdtData = await multicall(provider, [
|
|
35
|
-
{ address: contract('sdFrx3CrvVault'), name: 'getPricePerFullShare' },
|
|
36
35
|
{ address: sdtToken.address, name: 'balanceOf', params: [contract('veSdt')] },
|
|
37
|
-
{ address: sdtToken.address, name: 'balanceOf', params: [contract('vestedSdt')] },
|
|
38
36
|
{ address: sdtToken.address, name: 'totalSupply' },
|
|
39
37
|
{ address: contract('veSdt'), name: 'totalSupply' },
|
|
40
38
|
{
|
|
@@ -42,42 +40,37 @@ export const fetchSdt = async ({ provider, prices, explorerApiKey }) => {
|
|
|
42
40
|
name: 'received_balance',
|
|
43
41
|
params: [contract('voteBoosterStrategy')],
|
|
44
42
|
},
|
|
45
|
-
{ address: contract('liquidLockersGaugeController'), name: 'get_total_weight' },
|
|
46
|
-
{ address: frax3CrvToken.address, name: 'get_virtual_price' },
|
|
47
43
|
], parseAbi([
|
|
48
|
-
'function getPricePerFullShare() external view returns (uint256)',
|
|
49
44
|
'function balanceOf(address user) external view returns (uint256)',
|
|
50
45
|
'function totalSupply() external view returns (uint256)',
|
|
51
46
|
'function received_balance(address user) external view returns (uint256)',
|
|
52
47
|
'function get_total_weight() external view returns (uint256)',
|
|
53
|
-
'function get_virtual_price() external view returns (uint256)',
|
|
54
48
|
]));
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
49
|
+
const lockedSdtBalance = rawSdtData[0].result;
|
|
50
|
+
const sdtTotalSupply = rawSdtData[1].result;
|
|
51
|
+
const veSdtTotalSupply = rawSdtData[2].result;
|
|
52
|
+
const voteBoosterVeSdt = rawSdtData[3].result;
|
|
53
|
+
let sdtPrice = 0;
|
|
54
|
+
let usdcPrice = 0;
|
|
55
|
+
for (const p of prices) {
|
|
56
|
+
if (equalTlc(p.address, sdtToken.address))
|
|
57
|
+
sdtPrice = p.usdPrice;
|
|
58
|
+
if (equalTlc(p.address, usdcToken.address))
|
|
59
|
+
usdcPrice = p.usdPrice;
|
|
60
|
+
}
|
|
61
|
+
const lockedInUsd = (parseUnits(`${sdtPrice}`, sdtToken.decimals) * lockedSdtBalance) / OneEther;
|
|
66
62
|
const percentLocked = parseUnits(formatUnits(lockedSdtBalance, 0), sdtToken.decimals) / sdtTotalSupply;
|
|
67
63
|
const averageLock = (parseUnits(formatUnits(veSdtTotalSupply, 0), sdtToken.decimals) / lockedSdtBalance) * BigInt(4);
|
|
68
|
-
const apr = (
|
|
64
|
+
const apr = (usdcPrice * amountPerYear) / Number(formatUnits(lockedInUsd, 18));
|
|
69
65
|
const parsedData = {
|
|
70
66
|
alternativeYields: veSdtAlternativeYields,
|
|
71
67
|
veSdtTotalSupply: Number(formatUnits(veSdtTotalSupply, 18)),
|
|
72
68
|
locked: Number(formatUnits(lockedSdtBalance, sdtToken.decimals)),
|
|
73
|
-
lockedInUsd: Number(formatUnits(lockedInUsd, sdtToken.decimals
|
|
74
|
-
vestedInUsd: Number(formatUnits(vestedInUsd, sdtToken.decimals * 2)),
|
|
69
|
+
lockedInUsd: Number(formatUnits(lockedInUsd, sdtToken.decimals)),
|
|
75
70
|
percentLocked: Number(formatUnits(percentLocked, 18)) * 100,
|
|
76
71
|
averageLockInYears: Number(formatUnits(averageLock, 18)),
|
|
77
72
|
apr: apr * 100,
|
|
78
73
|
voteBoosterVeSdt: Number(formatUnits(voteBoosterVeSdt, sdtToken.decimals)),
|
|
79
|
-
lockersTotalWeight,
|
|
80
|
-
frax3CrvPrice,
|
|
81
74
|
};
|
|
82
75
|
return parsedData;
|
|
83
76
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/sdt/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAExD,OAAO,EAAE,OAAO,EAAc,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/sdt/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,14 @@ const getPendleApiData = async () => {
|
|
|
5
5
|
let pendleApiData;
|
|
6
6
|
let pendleStrats = [];
|
|
7
7
|
do {
|
|
8
|
-
pendleApiData = await
|
|
8
|
+
pendleApiData = await fetch(URL(totalFetched)).then((res) => res.json());
|
|
9
9
|
totalFetched += LIMIT;
|
|
10
|
-
|
|
10
|
+
if (pendleApiData.error) {
|
|
11
|
+
console.error(`${pendleApiData.error} - ${pendleApiData.message.toString()}`);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
pendleStrats = pendleStrats.concat(pendleApiData.results);
|
|
15
|
+
}
|
|
11
16
|
} while (pendleApiData.total > totalFetched);
|
|
12
17
|
return pendleStrats;
|
|
13
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPendleApiData.js","sourceRoot":"","sources":["../../../../src/strategies/pendle/getPendleApiData.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,GAAG,CAAA;AACjB,MAAM,GAAG,GAAG,CAAC,OAAe,CAAC,EAAE,EAAE,CAC/B,yDAAyD,KAAK,oBAAoB,IAAI,EAAE,CAAA;AAE1F,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;IAClC,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,aAAkB,CAAA;IACtB,IAAI,YAAY,GAAU,EAAE,CAAA;IAE5B,GAAG,CAAC;QACF,aAAa,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"getPendleApiData.js","sourceRoot":"","sources":["../../../../src/strategies/pendle/getPendleApiData.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,GAAG,CAAA;AACjB,MAAM,GAAG,GAAG,CAAC,OAAe,CAAC,EAAE,EAAE,CAC/B,yDAAyD,KAAK,oBAAoB,IAAI,EAAE,CAAA;AAE1F,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;IAClC,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,aAAkB,CAAA;IACtB,IAAI,YAAY,GAAU,EAAE,CAAA;IAE5B,GAAG,CAAC;QACF,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,YAAY,IAAI,KAAK,CAAA;QAErB,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC/E,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC,QAAQ,aAAa,CAAC,KAAK,GAAG,YAAY,EAAC;IAE5C,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -15,7 +15,7 @@ export const fetchStakeDao = async ({ provider, chainId, lockers, prices, explor
|
|
|
15
15
|
const queryParams = { ...baseQueryParams, chainid: `${chainId}`, apikey: explorerApiKey };
|
|
16
16
|
const url = `https://api.etherscan.io/v2/api?${new URLSearchParams(queryParams)}`;
|
|
17
17
|
const rawEventsData = await (await fetch(url)).json();
|
|
18
|
-
amountPerYear = await getAverageYearlyRewards(rawEventsData, 5);
|
|
18
|
+
amountPerYear = await getAverageYearlyRewards(rawEventsData, 5, false, 18);
|
|
19
19
|
}
|
|
20
20
|
catch {
|
|
21
21
|
amountPerYear = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../src/strategies/stakeDao/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,uBAAuB,MAAM,wCAAwC,CAAA;AAE5E,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,GAAG,QAAQ,EAAE;IACxB,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,oEAAoE;CAC7E,CAAA;AAUD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,EAAE,EAAE;IAC5G,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACzF,MAAM,GAAG,GAAG,mCAAmC,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE,CAAA;QAEjF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACrD,aAAa,GAAG,MAAM,uBAAuB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../src/strategies/stakeDao/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,uBAAuB,MAAM,wCAAwC,CAAA;AAE5E,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,GAAG,QAAQ,EAAE;IACxB,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,oEAAoE;CAC7E,CAAA;AAUD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,EAAE,EAAE;IAC5G,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACzF,MAAM,GAAG,GAAG,mCAAmC,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE,CAAA;QAEjF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACrD,aAAa,GAAG,MAAM,uBAAuB,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,OAAO,GAAQ,MAAM,SAAS,CAClC,QAAQ,EACR;QACE;YACE,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC;YACzC,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;SAC1C;KACF,EACD,QAAQ,CAAC,CAAC,yEAAyE,CAAC,CAAC,CACtF,CAAA;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAA;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAA;QAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAA;QAE1E,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;QACzC,MAAM,GAAG,GAAG,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;QAE/D,MAAM,UAAU,GAAG,CAAC,CAAC,aAAa,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;QAC/D,MAAM,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEnG,OAAO;YACL,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,YAAY;YACZ,SAAS,EAAE,aAAa,GAAG,CAAC;YAC5B,GAAG;YACH,GAAG,EAAE;gBACH,KAAK;gBACL,OAAO,EAAE;oBACP,KAAK,EAAE,UAAU;oBACjB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,KAAK;4BACZ,KAAK,EAAE,CAAC,UAAU,CAAC;yBACpB;qBACF;iBACF;gBACD,SAAS,EAAE;oBACT,KAAK,EAAE,YAAY;oBACnB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,KAAK;4BACZ,KAAK,EAAE,CAAC,YAAY,CAAC;yBACtB;qBACF;iBACF;aACF;YACD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3B,OAAO;oBACL,KAAK,EAAE;wBACL,IAAI,EAAE,CAAE,CAAC,IAAI;wBACb,QAAQ,EAAE,CAAE,CAAC,QAAQ;wBACrB,MAAM,EAAE,CAAE,CAAC,MAAM;wBACjB,OAAO,EAAE,CAAE,CAAC,OAAO;qBACpB;oBACD,WAAW,EAAE,WAAW;oBACxB,YAAY,EAAE,GAAG;oBACjB,IAAI,EAAE,GAAG;oBACT,UAAU,EAAE,GAAG;oBACf,QAAQ,EAAE,GAAG;oBACb,uBAAuB,EAAE,GAAG;iBAC7B,CAAA;YACH,CAAC,CAAC;YACF,gBAAgB;YAChB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,YAAY;YACpB,WAAW;YACX,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;SACzC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;SACxD;QACD,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,IAAI;KACd,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ONE_YEAR, Zero } from '@stake-dao/constants';
|
|
1
|
+
import { ONE_WEEK, ONE_YEAR, Zero } from '@stake-dao/constants';
|
|
2
2
|
import { decodeAbiParameters, formatUnits } from 'viem';
|
|
3
3
|
const decodeEvent = (rawEventsData) => {
|
|
4
4
|
return rawEventsData.result?.map((event) => {
|
|
@@ -19,19 +19,21 @@ const decodeEventWithRewardToken = (rawEventsData) => {
|
|
|
19
19
|
return { eventTimestamp: Number(eventTimestamp), eventAmount, eventRewardToken };
|
|
20
20
|
});
|
|
21
21
|
};
|
|
22
|
-
const getAverageYearlyRewards = async (rawEventsData, nbEvents, withRewardToken) => {
|
|
22
|
+
const getAverageYearlyRewards = async (rawEventsData, nbEvents, withRewardToken, decimals) => {
|
|
23
23
|
const eventsData = (withRewardToken ? decodeEventWithRewardToken(rawEventsData) : decodeEvent(rawEventsData))
|
|
24
24
|
.filter((event) => event.eventAmount > Zero)
|
|
25
25
|
.sort((a, b) => b.eventTimestamp - a.eventTimestamp);
|
|
26
|
+
const eventsSize = Math.min(nbEvents, eventsData.length);
|
|
26
27
|
const amountPerYear = eventsData
|
|
27
|
-
.slice(0,
|
|
28
|
+
.slice(0, eventsSize)
|
|
28
29
|
.map((_, index) => {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
30
|
+
const prevTimestamp = eventsData[index + 1]?.eventTimestamp || eventsData[index].eventTimestamp - ONE_WEEK;
|
|
31
|
+
const duration = eventsData[index].eventTimestamp - prevTimestamp;
|
|
32
|
+
const amount = Number(formatUnits(eventsData[index].eventAmount, decimals));
|
|
31
33
|
// Annualized Reward
|
|
32
34
|
return (amount / duration) * ONE_YEAR;
|
|
33
35
|
})
|
|
34
|
-
.reduce((total, x) => (total += x), 0) /
|
|
36
|
+
.reduce((total, x) => (total += x), 0) / eventsSize;
|
|
35
37
|
return amountPerYear;
|
|
36
38
|
};
|
|
37
39
|
export default getAverageYearlyRewards;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAverageYearlyRewards.js","sourceRoot":"","sources":["../../../src/utils/getAverageYearlyRewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"getAverageYearlyRewards.js","sourceRoot":"","sources":["../../../src/utils/getAverageYearlyRewards.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,13 +25,10 @@ export declare const fetchSdt: ({ provider, prices, explorerApiKey }: TFetchSdt)
|
|
|
25
25
|
veSdtTotalSupply: number;
|
|
26
26
|
locked: number;
|
|
27
27
|
lockedInUsd: number;
|
|
28
|
-
vestedInUsd: number;
|
|
29
28
|
percentLocked: number;
|
|
30
29
|
averageLockInYears: number;
|
|
31
30
|
apr: number;
|
|
32
31
|
voteBoosterVeSdt: number;
|
|
33
|
-
lockersTotalWeight: number;
|
|
34
|
-
frax3CrvPrice: number;
|
|
35
32
|
}>;
|
|
36
33
|
export {};
|
|
37
34
|
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/sdt/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,cAAc,CAAA;AASzC,UAAU,SAAS;IACjB,QAAQ,EAAE,GAAG,CAAA;IACb,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;CACvB;AAGD,eAAO,MAAM,QAAQ,yCAAgD,SAAS
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/sdt/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,cAAc,CAAA;AASzC,UAAU,SAAS;IACjB,QAAQ,EAAE,GAAG,CAAA;IACb,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;CACvB;AAGD,eAAO,MAAM,QAAQ,yCAAgD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;EA4E7E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPendleApiData.d.ts","sourceRoot":"","sources":["../../../../src/strategies/pendle/getPendleApiData.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"getPendleApiData.d.ts","sourceRoot":"","sources":["../../../../src/strategies/pendle/getPendleApiData.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,gBAAgB,sBAiBrB,CAAA;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
declare const getAverageYearlyRewards: (rawEventsData: any, nbEvents: number, withRewardToken
|
|
1
|
+
declare const getAverageYearlyRewards: (rawEventsData: any, nbEvents: number, withRewardToken: boolean, decimals: number) => Promise<number>;
|
|
2
2
|
export default getAverageYearlyRewards;
|
|
3
3
|
//# sourceMappingURL=getAverageYearlyRewards.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAverageYearlyRewards.d.ts","sourceRoot":"","sources":["../../../src/utils/getAverageYearlyRewards.ts"],"names":[],"mappings":"AAgCA,QAAA,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"getAverageYearlyRewards.d.ts","sourceRoot":"","sources":["../../../src/utils/getAverageYearlyRewards.ts"],"names":[],"mappings":"AAgCA,QAAA,MAAM,uBAAuB,kBACZ,GAAG,YACR,MAAM,mBACC,OAAO,YACd,MAAM,oBAsBjB,CAAA;AAED,eAAe,uBAAuB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stake-dao/reader",
|
|
3
3
|
"description": "",
|
|
4
|
-
"version": "0.5.
|
|
4
|
+
"version": "0.5.22",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"graphql-request": "^6.0.0",
|
|
36
36
|
"lodash-es": "^4.17.21",
|
|
37
37
|
"viem": "2.35.0",
|
|
38
|
-
"@stake-dao/constants": "0.5.
|
|
38
|
+
"@stake-dao/constants": "0.5.7"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/lodash-es": "^4.17.12",
|
package/src/sdt/fetch.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { formatUnits, parseAbi, parseUnits } from 'viem'
|
|
2
2
|
|
|
3
|
-
import { ONE_DAY, type Token, contract, tokenWithId } from '@stake-dao/constants'
|
|
3
|
+
import { ONE_DAY, OneEther, type Token, contract, tokenWithId } from '@stake-dao/constants'
|
|
4
4
|
import { mainnet } from 'viem/chains'
|
|
5
5
|
import { type Price } from '../prices.js'
|
|
6
6
|
import { equalTlc, multicall } from '../utils.js'
|
|
@@ -8,7 +8,7 @@ import { getLogsFromEtherscan } from '../utils/etherscan.js'
|
|
|
8
8
|
import getAverageYearlyRewards from '../utils/getAverageYearlyRewards.js'
|
|
9
9
|
import veSdtAlternativeYields from './veSdtAlternativeYields.js'
|
|
10
10
|
|
|
11
|
-
const NB_EVENTS_TO_USE =
|
|
11
|
+
const NB_EVENTS_TO_USE = 10
|
|
12
12
|
const EVENT_TOPIC = '0xce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6'
|
|
13
13
|
|
|
14
14
|
interface TFetchSdt {
|
|
@@ -17,10 +17,10 @@ interface TFetchSdt {
|
|
|
17
17
|
explorerApiKey: string
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
// Need SDT and
|
|
20
|
+
// Need SDT and USDC price
|
|
21
21
|
export const fetchSdt = async ({ provider, prices, explorerApiKey }: TFetchSdt) => {
|
|
22
22
|
const sdtToken = tokenWithId('sdt') as Token
|
|
23
|
-
const
|
|
23
|
+
const usdcToken = tokenWithId('usdc') as Token
|
|
24
24
|
|
|
25
25
|
const now = Math.ceil(new Date().getTime() / 1000)
|
|
26
26
|
const lastCheck = now - ONE_DAY * 60
|
|
@@ -31,14 +31,14 @@ export const fetchSdt = async ({ provider, prices, explorerApiKey }: TFetchSdt)
|
|
|
31
31
|
try {
|
|
32
32
|
const rawEventsData = await getLogsFromEtherscan({
|
|
33
33
|
chainId: mainnet.id,
|
|
34
|
-
address: contract('
|
|
34
|
+
address: contract('usdcVeSdtFeeDistributor'),
|
|
35
35
|
apikey: explorerApiKey,
|
|
36
36
|
extraQueryParams: {
|
|
37
37
|
fromBlock: `${lastCheckBlock.height}`,
|
|
38
38
|
topic0: EVENT_TOPIC,
|
|
39
39
|
},
|
|
40
40
|
})
|
|
41
|
-
amountPerYear = await getAverageYearlyRewards(rawEventsData, NB_EVENTS_TO_USE)
|
|
41
|
+
amountPerYear = await getAverageYearlyRewards(rawEventsData, NB_EVENTS_TO_USE, false, usdcToken.decimals)
|
|
42
42
|
} catch {
|
|
43
43
|
amountPerYear = 0
|
|
44
44
|
}
|
|
@@ -46,9 +46,7 @@ export const fetchSdt = async ({ provider, prices, explorerApiKey }: TFetchSdt)
|
|
|
46
46
|
const rawSdtData: any = await multicall(
|
|
47
47
|
provider,
|
|
48
48
|
[
|
|
49
|
-
{ address: contract('sdFrx3CrvVault'), name: 'getPricePerFullShare' },
|
|
50
49
|
{ address: sdtToken.address, name: 'balanceOf', params: [contract('veSdt')] },
|
|
51
|
-
{ address: sdtToken.address, name: 'balanceOf', params: [contract('vestedSdt')] },
|
|
52
50
|
{ address: sdtToken.address, name: 'totalSupply' },
|
|
53
51
|
{ address: contract('veSdt'), name: 'totalSupply' },
|
|
54
52
|
{
|
|
@@ -56,50 +54,43 @@ export const fetchSdt = async ({ provider, prices, explorerApiKey }: TFetchSdt)
|
|
|
56
54
|
name: 'received_balance',
|
|
57
55
|
params: [contract('voteBoosterStrategy')],
|
|
58
56
|
},
|
|
59
|
-
{ address: contract('liquidLockersGaugeController'), name: 'get_total_weight' },
|
|
60
|
-
{ address: frax3CrvToken.address, name: 'get_virtual_price' },
|
|
61
57
|
],
|
|
62
58
|
parseAbi([
|
|
63
|
-
'function getPricePerFullShare() external view returns (uint256)',
|
|
64
59
|
'function balanceOf(address user) external view returns (uint256)',
|
|
65
60
|
'function totalSupply() external view returns (uint256)',
|
|
66
61
|
'function received_balance(address user) external view returns (uint256)',
|
|
67
62
|
'function get_total_weight() external view returns (uint256)',
|
|
68
|
-
'function get_virtual_price() external view returns (uint256)',
|
|
69
63
|
]),
|
|
70
64
|
)
|
|
71
65
|
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
const veSdtTotalSupply = rawSdtData[4].result
|
|
77
|
-
const voteBoosterVeSdt = rawSdtData[5].result
|
|
66
|
+
const lockedSdtBalance = rawSdtData[0].result
|
|
67
|
+
const sdtTotalSupply = rawSdtData[1].result
|
|
68
|
+
const veSdtTotalSupply = rawSdtData[2].result
|
|
69
|
+
const voteBoosterVeSdt = rawSdtData[3].result
|
|
78
70
|
|
|
79
|
-
|
|
80
|
-
|
|
71
|
+
let sdtPrice = 0
|
|
72
|
+
let usdcPrice = 0
|
|
81
73
|
|
|
82
|
-
const
|
|
74
|
+
for (const p of prices) {
|
|
75
|
+
if (equalTlc(p.address, sdtToken.address)) sdtPrice = p.usdPrice
|
|
76
|
+
if (equalTlc(p.address, usdcToken.address)) usdcPrice = p.usdPrice
|
|
77
|
+
}
|
|
83
78
|
|
|
84
|
-
const lockedInUsd = parseUnits(`${sdtPrice}`, sdtToken.decimals) * lockedSdtBalance
|
|
85
|
-
const vestedInUsd = parseUnits(`${sdtPrice}`, sdtToken.decimals) * vestedSdtBalance
|
|
79
|
+
const lockedInUsd = (parseUnits(`${sdtPrice}`, sdtToken.decimals) * lockedSdtBalance) / OneEther
|
|
86
80
|
const percentLocked = parseUnits(formatUnits(lockedSdtBalance, 0), sdtToken.decimals) / sdtTotalSupply
|
|
87
81
|
const averageLock = (parseUnits(formatUnits(veSdtTotalSupply, 0), sdtToken.decimals) / lockedSdtBalance) * BigInt(4)
|
|
88
82
|
|
|
89
|
-
const apr = (
|
|
83
|
+
const apr = (usdcPrice * amountPerYear) / Number(formatUnits(lockedInUsd, 18))
|
|
90
84
|
|
|
91
85
|
const parsedData = {
|
|
92
86
|
alternativeYields: veSdtAlternativeYields,
|
|
93
87
|
veSdtTotalSupply: Number(formatUnits(veSdtTotalSupply, 18)),
|
|
94
88
|
locked: Number(formatUnits(lockedSdtBalance, sdtToken.decimals)),
|
|
95
|
-
lockedInUsd: Number(formatUnits(lockedInUsd, sdtToken.decimals
|
|
96
|
-
vestedInUsd: Number(formatUnits(vestedInUsd, sdtToken.decimals * 2)),
|
|
89
|
+
lockedInUsd: Number(formatUnits(lockedInUsd, sdtToken.decimals)),
|
|
97
90
|
percentLocked: Number(formatUnits(percentLocked, 18)) * 100,
|
|
98
91
|
averageLockInYears: Number(formatUnits(averageLock, 18)),
|
|
99
92
|
apr: apr * 100,
|
|
100
93
|
voteBoosterVeSdt: Number(formatUnits(voteBoosterVeSdt, sdtToken.decimals)),
|
|
101
|
-
lockersTotalWeight,
|
|
102
|
-
frax3CrvPrice,
|
|
103
94
|
}
|
|
104
95
|
|
|
105
96
|
return parsedData
|
|
@@ -8,10 +8,14 @@ const getPendleApiData = async () => {
|
|
|
8
8
|
let pendleStrats: any[] = []
|
|
9
9
|
|
|
10
10
|
do {
|
|
11
|
-
pendleApiData = await
|
|
11
|
+
pendleApiData = await fetch(URL(totalFetched)).then((res) => res.json())
|
|
12
12
|
totalFetched += LIMIT
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
if (pendleApiData.error) {
|
|
15
|
+
console.error(`${pendleApiData.error} - ${pendleApiData.message.toString()}`)
|
|
16
|
+
} else {
|
|
17
|
+
pendleStrats = pendleStrats.concat(pendleApiData.results)
|
|
18
|
+
}
|
|
15
19
|
} while (pendleApiData.total > totalFetched)
|
|
16
20
|
|
|
17
21
|
return pendleStrats
|
|
@@ -28,7 +28,7 @@ export const fetchStakeDao = async ({ provider, chainId, lockers, prices, explor
|
|
|
28
28
|
const url = `https://api.etherscan.io/v2/api?${new URLSearchParams(queryParams)}`
|
|
29
29
|
|
|
30
30
|
const rawEventsData = await (await fetch(url)).json()
|
|
31
|
-
amountPerYear = await getAverageYearlyRewards(rawEventsData, 5)
|
|
31
|
+
amountPerYear = await getAverageYearlyRewards(rawEventsData, 5, false, 18)
|
|
32
32
|
} catch {
|
|
33
33
|
amountPerYear = 0
|
|
34
34
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ONE_YEAR, Zero } from '@stake-dao/constants'
|
|
1
|
+
import { ONE_WEEK, ONE_YEAR, Zero } from '@stake-dao/constants'
|
|
2
2
|
import { decodeAbiParameters, formatUnits } from 'viem'
|
|
3
3
|
|
|
4
4
|
const decodeEvent = (rawEventsData: any) => {
|
|
@@ -30,22 +30,30 @@ const decodeEventWithRewardToken = (rawEventsData: any) => {
|
|
|
30
30
|
})
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
const getAverageYearlyRewards = async (
|
|
33
|
+
const getAverageYearlyRewards = async (
|
|
34
|
+
rawEventsData: any,
|
|
35
|
+
nbEvents: number,
|
|
36
|
+
withRewardToken: boolean,
|
|
37
|
+
decimals: number,
|
|
38
|
+
) => {
|
|
34
39
|
const eventsData = (withRewardToken ? decodeEventWithRewardToken(rawEventsData) : decodeEvent(rawEventsData))
|
|
35
40
|
.filter((event) => event.eventAmount > Zero)
|
|
36
41
|
.sort((a, b) => b.eventTimestamp - a.eventTimestamp)
|
|
37
42
|
|
|
43
|
+
const eventsSize = Math.min(nbEvents, eventsData.length)
|
|
44
|
+
|
|
38
45
|
const amountPerYear =
|
|
39
46
|
eventsData
|
|
40
|
-
.slice(0,
|
|
47
|
+
.slice(0, eventsSize)
|
|
41
48
|
.map((_, index) => {
|
|
42
|
-
const
|
|
43
|
-
const
|
|
49
|
+
const prevTimestamp = eventsData[index + 1]?.eventTimestamp || eventsData[index].eventTimestamp - ONE_WEEK
|
|
50
|
+
const duration = eventsData[index].eventTimestamp - prevTimestamp
|
|
51
|
+
const amount = Number(formatUnits(eventsData[index].eventAmount, decimals))
|
|
44
52
|
|
|
45
53
|
// Annualized Reward
|
|
46
54
|
return (amount / duration) * ONE_YEAR
|
|
47
55
|
})
|
|
48
|
-
.reduce((total, x) => (total += x), 0) /
|
|
56
|
+
.reduce((total, x) => (total += x), 0) / eventsSize
|
|
49
57
|
|
|
50
58
|
return amountPerYear
|
|
51
59
|
}
|