@stake-dao/reader 0.5.20 → 0.5.21

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.
@@ -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 = 5;
9
+ const NB_EVENTS_TO_USE = 10;
10
10
  const EVENT_TOPIC = '0xce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6';
11
- // Need SDT and frax3Crv price
11
+ // Need SDT and USDC price
12
12
  export const fetchSdt = async ({ provider, prices, explorerApiKey }) => {
13
13
  const sdtToken = tokenWithId('sdt');
14
- const frax3CrvToken = tokenWithId('frax3crv');
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('veSdtFeeDistributor'),
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 vaultRatio = rawSdtData[0].result;
56
- const lockedSdtBalance = rawSdtData[1].result;
57
- const vestedSdtBalance = rawSdtData[2].result;
58
- const sdtTotalSupply = rawSdtData[3].result;
59
- const veSdtTotalSupply = rawSdtData[4].result;
60
- const voteBoosterVeSdt = rawSdtData[5].result;
61
- const lockersTotalWeight = Number(formatUnits(rawSdtData[6].result, sdtToken.decimals * 2));
62
- const frax3CrvPrice = Number(formatUnits(rawSdtData[7].result, frax3CrvToken.decimals));
63
- const sdtPrice = prices.find((p) => equalTlc(p.address, sdtToken.address))?.usdPrice || 0;
64
- const lockedInUsd = parseUnits(`${sdtPrice}`, sdtToken.decimals) * lockedSdtBalance;
65
- const vestedInUsd = parseUnits(`${sdtPrice}`, sdtToken.decimals) * vestedSdtBalance;
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 = ((frax3CrvPrice * amountPerYear) / Number(formatUnits(lockedInUsd, 18))) * Number(vaultRatio);
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 * 2)),
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":"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"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/sdt/fetch.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../src/strategies/stakeDao/fetch.ts"],"names":[],"mappings":"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"}
@@ -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, nbEvents)
28
+ .slice(0, eventsSize)
28
29
  .map((_, index) => {
29
- const duration = eventsData[index].eventTimestamp - eventsData[index + 1].eventTimestamp;
30
- const amount = Number(formatUnits(eventsData[index].eventAmount, 18));
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) / nbEvents;
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;AACrD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAEvD,MAAM,WAAW,GAAG,CAAC,aAAkB,EAAE,EAAE;IACzC,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACzC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,mBAAmB,CACvD;YACE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;SACpC,EACD,KAAK,CAAC,IAAI,CACX,CAAA;QAED,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,0BAA0B,GAAG,CAAC,aAAkB,EAAE,EAAE;IACxD,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACzC,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,WAAW,CAAC,GAAG,mBAAmB,CACzE;YACE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE;YACxC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;SACpC,EACD,KAAK,CAAC,IAAI,CACX,CAAA;QAED,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAClF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,KAAK,EAAE,aAAkB,EAAE,QAAgB,EAAE,eAAyB,EAAE,EAAE;IACxG,MAAM,UAAU,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;SAC1G,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAA;IAEtD,MAAM,aAAa,GACjB,UAAU;SACP,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAChB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,CAAA;QACxF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;QAErE,oBAAoB;QACpB,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAA;IACvC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAA;IAErD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAED,eAAe,uBAAuB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqF7E,CAAA"}
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,3 +1,3 @@
1
- declare const getAverageYearlyRewards: (rawEventsData: any, nbEvents: number, withRewardToken?: boolean) => Promise<number>;
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,kBAAyB,GAAG,YAAY,MAAM,oBAAoB,OAAO,oBAkBrG,CAAA;AAED,eAAe,uBAAuB,CAAA"}
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.20",
4
+ "version": "0.5.21",
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.6"
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 = 5
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 frax3Crv price
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 frax3CrvToken = tokenWithId('frax3crv') as Token
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('veSdtFeeDistributor'),
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 vaultRatio = rawSdtData[0].result
73
- const lockedSdtBalance = rawSdtData[1].result
74
- const vestedSdtBalance = rawSdtData[2].result
75
- const sdtTotalSupply = rawSdtData[3].result
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
- const lockersTotalWeight = Number(formatUnits(rawSdtData[6].result, sdtToken.decimals * 2))
80
- const frax3CrvPrice = Number(formatUnits(rawSdtData[7].result, frax3CrvToken.decimals))
71
+ let sdtPrice = 0
72
+ let usdcPrice = 0
81
73
 
82
- const sdtPrice = prices.find((p) => equalTlc(p.address, sdtToken.address))?.usdPrice || 0
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 = ((frax3CrvPrice * amountPerYear) / Number(formatUnits(lockedInUsd, 18))) * Number(vaultRatio)
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 * 2)),
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
@@ -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 (rawEventsData: any, nbEvents: number, withRewardToken?: boolean) => {
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, nbEvents)
47
+ .slice(0, eventsSize)
41
48
  .map((_, index) => {
42
- const duration = eventsData[index].eventTimestamp - eventsData[index + 1].eventTimestamp
43
- const amount = Number(formatUnits(eventsData[index].eventAmount, 18))
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) / nbEvents
56
+ .reduce((total, x) => (total += x), 0) / eventsSize
49
57
 
50
58
  return amountPerYear
51
59
  }