From e4f19a1db59141419c4b39cb2bbdeb4a2def41cf Mon Sep 17 00:00:00 2001 From: asalef10 Date: Sun, 20 Apr 2025 16:09:07 +0300 Subject: [PATCH 1/4] calculate APR --- .../stakingPage/components/StakingCard.tsx | 3 +- src/web3Config/staking/hooks.ts | 40 ++++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/pages/stakingPage/components/StakingCard.tsx b/src/pages/stakingPage/components/StakingCard.tsx index d075fa9..fab135a 100644 --- a/src/pages/stakingPage/components/StakingCard.tsx +++ b/src/pages/stakingPage/components/StakingCard.tsx @@ -87,8 +87,7 @@ export const StakingCard: React.FC = ({ }, [address, tokenAddress]); const fetchAPR = useCallback(async () => { - if (!address) return; - const calculatedAPR = await calculateAPR(address); + const calculatedAPR = await calculateAPR(); setApr(calculatedAPR); }, [address]); diff --git a/src/web3Config/staking/hooks.ts b/src/web3Config/staking/hooks.ts index 53a9068..6b89d92 100644 --- a/src/web3Config/staking/hooks.ts +++ b/src/web3Config/staking/hooks.ts @@ -246,31 +246,33 @@ export const getTotalStaked = async (userAddress: string) => { } }; //Staking APR Formula = (ETH rewards + esGS emissions annualized) / (Total GS + esGS staked) * 100 -export const calculateAPR = async (userAddress: string) => { - // Get ETH reward rate - const ethRewardRate = await getRewardRate(); - - const esGrixRewardRate = await getTokenPerInterval(); +export const calculateAPR = async () => { + // Get total staked amount using totalSupply from the reward tracker + const totalStaked = await readContract(wagmiConfig, { + abi: rewardTrackerAbi, + address: normalizeAddress(stakingContracts.rewardTracker.address), + functionName: 'totalSupply', + args: [], + }); - const totalStaked = await getTotalStaked(userAddress); - if (totalStaked === 0n) { - return 0; - } + if (totalStaked === 0n) return 0; - const SECONDS_PER_YEAR = 365n * 24n * 60n * 60n; + // Get ETH reward rate from rewardDistributor + const ethRewardRate = await getTokenPerInterval(); - // Calculate annualized rewards for both ETH and esGS - const ethRewardsPerYear = ethRewardRate * SECONDS_PER_YEAR; - const esGrixRewardsPerYear = esGrixRewardRate * SECONDS_PER_YEAR; + // Get esGrix emission rate (assuming it's from the reward distributor as well) + const esGrixRewardRate = await getTokenPerInterval(); - // Calculate total rewards (ETH + esGS) - const totalRewardsPerYear = ethRewardsPerYear + esGrixRewardsPerYear; + // Calculate annual rewards (seconds in a year * tokens per interval) + const SECONDS_PER_YEAR = 365n * 24n * 60n * 60n; + const annualEthRewards = (ethRewardRate as bigint) * SECONDS_PER_YEAR; + const annualEsGrixRewards = (esGrixRewardRate as bigint) * SECONDS_PER_YEAR; + const totalAnnualRewards = annualEthRewards + annualEsGrixRewards; - // Calculate APR including both reward types - const aprBips = (totalRewardsPerYear * 10000n) / totalStaked; - const aprPercentage = Number(aprBips) / 100; + // Calculate APR: (totalAnnualRewards / totalStaked) * 100 + const apr = (totalAnnualRewards * 100n) / (totalStaked as bigint); - return aprPercentage; + return Number(apr); }; // Add vesting allowance check export const checkVestingAllowance = async (owner: string, token: string) => { From 61d9cb37c6c8e3a1119b2d5f3908b50c925b1bb8 Mon Sep 17 00:00:00 2001 From: asalef10 Date: Sun, 20 Apr 2025 16:13:57 +0300 Subject: [PATCH 2/4] lint --- src/web3Config/staking/hooks.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web3Config/staking/hooks.ts b/src/web3Config/staking/hooks.ts index 6b89d92..d0d3a1a 100644 --- a/src/web3Config/staking/hooks.ts +++ b/src/web3Config/staking/hooks.ts @@ -265,8 +265,8 @@ export const calculateAPR = async () => { // Calculate annual rewards (seconds in a year * tokens per interval) const SECONDS_PER_YEAR = 365n * 24n * 60n * 60n; - const annualEthRewards = (ethRewardRate as bigint) * SECONDS_PER_YEAR; - const annualEsGrixRewards = (esGrixRewardRate as bigint) * SECONDS_PER_YEAR; + const annualEthRewards = (ethRewardRate) * SECONDS_PER_YEAR; + const annualEsGrixRewards = (esGrixRewardRate) * SECONDS_PER_YEAR; const totalAnnualRewards = annualEthRewards + annualEsGrixRewards; // Calculate APR: (totalAnnualRewards / totalStaked) * 100 From be6b396caea5db2471a48277bfffc929bc30bba0 Mon Sep 17 00:00:00 2001 From: asalef10 Date: Sun, 20 Apr 2025 16:18:37 +0300 Subject: [PATCH 3/4] remove dependency --- src/pages/stakingPage/components/StakingCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/stakingPage/components/StakingCard.tsx b/src/pages/stakingPage/components/StakingCard.tsx index fab135a..1747298 100644 --- a/src/pages/stakingPage/components/StakingCard.tsx +++ b/src/pages/stakingPage/components/StakingCard.tsx @@ -89,7 +89,7 @@ export const StakingCard: React.FC = ({ const fetchAPR = useCallback(async () => { const calculatedAPR = await calculateAPR(); setApr(calculatedAPR); - }, [address]); + }, []); useEffect(() => { void fetchBalance(); From 8a62d6997d856d4420829838c277640d6bd35d23 Mon Sep 17 00:00:00 2001 From: asalef10 Date: Sun, 20 Apr 2025 16:19:33 +0300 Subject: [PATCH 4/4] lint --- src/web3Config/staking/hooks.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web3Config/staking/hooks.ts b/src/web3Config/staking/hooks.ts index d0d3a1a..f66ebef 100644 --- a/src/web3Config/staking/hooks.ts +++ b/src/web3Config/staking/hooks.ts @@ -265,8 +265,8 @@ export const calculateAPR = async () => { // Calculate annual rewards (seconds in a year * tokens per interval) const SECONDS_PER_YEAR = 365n * 24n * 60n * 60n; - const annualEthRewards = (ethRewardRate) * SECONDS_PER_YEAR; - const annualEsGrixRewards = (esGrixRewardRate) * SECONDS_PER_YEAR; + const annualEthRewards = ethRewardRate * SECONDS_PER_YEAR; + const annualEsGrixRewards = esGrixRewardRate * SECONDS_PER_YEAR; const totalAnnualRewards = annualEthRewards + annualEsGrixRewards; // Calculate APR: (totalAnnualRewards / totalStaked) * 100