Skip to content

Commit c56a8dc

Browse files
author
onyxcoindev
committed
show points apr
1 parent 2b1814b commit c56a8dc

10 files changed

Lines changed: 121 additions & 4 deletions

File tree

src/clients/api/queries/getPointLeaderBoard/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export const getLeaderBoard = async ({ page, limit }: GetLeaderBoardPayload) =>
3939
export const getSquidLeaderboard = async ({ page, limit }: GetLeaderBoardPayload) => {
4040
try {
4141
const data = await getLeaderboardSubsquid(config.chainId, { page, limit });
42-
console.log('data', data);
4342
return {
4443
data: data.results as Leaderboard[],
4544
totalPage: data.meta.totalPages,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import BigNumber from 'bignumber.js';
2+
import config from 'config';
3+
4+
import { TOKENS } from 'constants/tokens';
5+
import getPointsInfoSubsquid from 'utilities/getPointsInfoSubsquid';
6+
7+
export interface GetPointsAprInput {
8+
totalStaked: BigNumber;
9+
}
10+
11+
const fromWei = (value: BigNumber, decimals: number) =>
12+
value.dividedBy(new BigNumber(10).pow(decimals)).decimalPlaces(decimals);
13+
14+
const getPointsApr = async ({ totalStaked }: GetPointsAprInput): Promise<BigNumber> => {
15+
try {
16+
if (totalStaked.isZero()) {
17+
return new BigNumber(0);
18+
}
19+
20+
const data = await getPointsInfoSubsquid(config.chainId);
21+
const { weight, pointsPerDay } = data;
22+
const totalStakedFromWei = fromWei(totalStaked, TOKENS.xcn.decimals);
23+
24+
return new BigNumber(pointsPerDay ?? 0)
25+
.times(weight ?? 0)
26+
.times(365)
27+
.times(100)
28+
.div(totalStakedFromWei);
29+
} catch (error) {
30+
console.error('Error fetching points apr:', error);
31+
return new BigNumber(0);
32+
}
33+
};
34+
35+
export default getPointsApr;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import BigNumber from 'bignumber.js';
2+
import { useQuery } from 'react-query';
3+
4+
import FunctionKey from 'constants/functionKey';
5+
6+
import getPointsApr from '.';
7+
8+
const useGetPointsApr = (totalStaked: BigNumber) =>
9+
useQuery([FunctionKey.GET_POINTS_APR, totalStaked.toString()], () =>
10+
getPointsApr({ totalStaked }),
11+
);
12+
13+
export default useGetPointsApr;

src/constants/functionKey.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ enum FunctionKey {
2525
GET_PRIOR_VOTES = 'GET_PRIOR_VOTES',
2626
GET_STAKING_INFOS = 'GET_STAKING_INFOS',
2727
GET_STAKING_APY = 'GET_STAKING_APY',
28+
GET_POINTS_APR = 'GET_POINTS_APR',
2829
GET_VOTERS = 'GET_VOTERS',
2930
GET_PENDING_XCN = 'GET_PENDING_XCN',
3031
GET_STAKE_HISTORIES = 'GET_STAKE_HISTORIES',

src/pages/Stake/FarmItem/index.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export interface FarmItemUiProps {
4040
className?: string;
4141
xcnBalance: BigNumber;
4242
apy: number;
43+
pointsApr: number;
4344
totalStaked: BigNumber;
4445
rewardPerBlock: BigNumber;
4546
staked: BigNumber;
@@ -57,6 +58,7 @@ export const FarmItemUi: React.FC<FarmItemUiProps> = ({
5758
className,
5859
xcnBalance,
5960
apy,
61+
pointsApr,
6062
totalStaked,
6163
rewardPerBlock,
6264
staked,
@@ -177,6 +179,10 @@ export const FarmItemUi: React.FC<FarmItemUiProps> = ({
177179
title: t('farmItem.stakingApr', { stakeTokenName: '' }),
178180
value: formatToReadablePercentage(apy),
179181
},
182+
{
183+
title: t('farmItem.pointsApr', { stakeTokenName: '' }),
184+
value: formatToReadablePercentage(pointsApr),
185+
},
180186
{
181187
title: t('farmItem.dailyEmission'),
182188
value: (
@@ -222,7 +228,7 @@ export const FarmItemUi: React.FC<FarmItemUiProps> = ({
222228
),
223229
},
224230
],
225-
[totalStaked, apy, xcnAsset, i18n.language, treasury, isLoadingTreasury],
231+
[totalStaked, apy, pointsApr, xcnAsset, i18n.language, treasury, isLoadingTreasury],
226232
);
227233

228234
return (
@@ -332,6 +338,7 @@ export const FarmItemUi: React.FC<FarmItemUiProps> = ({
332338
export interface FarmItemProps {
333339
xcnBalance: BigNumber;
334340
apy: number;
341+
pointsApr: number;
335342
totalStaked: BigNumber;
336343
rewardPerBlock: BigNumber;
337344
staked: BigNumber;

src/pages/Stake/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import BigNumber from 'bignumber.js';
33
import React, { useContext } from 'react';
44

55
import { useGetBalanceOf, useGetStakingApy, useGetStakingInfos } from 'clients/api';
6+
import useGetPointsApr from 'clients/api/queries/getPointsApr/useGetPointsApr';
67
import { TOKENS } from 'constants/tokens';
78
import { AuthContext } from 'context/AuthContext';
89

@@ -21,12 +22,14 @@ const FarmPage: React.FC = () => {
2122

2223
const { data: stakingInfo } = useGetStakingInfos({ accountAddress: account?.address || '' });
2324
const { data: stakingApy } = useGetStakingApy();
25+
const { data: pointsApr } = useGetPointsApr(stakingInfo?.totalStaked || new BigNumber(0));
2426

2527
return (
2628
<div css={styles.container}>
2729
<FarmItem
2830
xcnBalance={xcnBalance?.balanceWei || new BigNumber(0)}
2931
apy={stakingApy?.apy.toNumber() || 0}
32+
pointsApr={pointsApr?.toNumber() || 0}
3033
totalStaked={stakingInfo?.totalStaked || new BigNumber(0)}
3134
rewardPerBlock={stakingInfo?.rewardPerBlock || new BigNumber(0)}
3235
staked={stakingInfo?.staked || new BigNumber(0)}

src/translation/translations/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,7 @@
684684
"reward": "Reward:",
685685
"stakeButton": "Stake",
686686
"stakingApr": "{{stakeTokenName}} Staking APR",
687+
"pointsApr": "{{stakeTokenName}} Points APR",
687688
"successfulClaimRewardTransactionModal": {
688689
"description": "You successfully claimed your reward",
689690
"title": "Your claim was successful"

src/utilities/getLeaderboardSubsquid.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,14 @@ const getLeaderboardSubsquid = (
5757
}),
5858
})
5959
.then(response => response.json())
60-
.then(({ data: { leaderboard } }) => resolve(leaderboard)),
60+
.then(({ data: { leaderboard } }) => resolve(leaderboard))
61+
.catch(error => {
62+
console.error('Error fetching leaderboard from subsquid:', error);
63+
resolve({
64+
meta: { limit: 0, total: 0, totalPages: 1, page: 1 },
65+
results: [],
66+
});
67+
}),
6168
);
6269
};
6370

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { EthChainId } from 'types';
2+
3+
import { SUBSQUID_LINKS } from 'constants/endpoints';
4+
5+
interface PointsInfoResponse {
6+
weight: number;
7+
pointsPerDay: number;
8+
}
9+
10+
const getPointsInfoSubsquid = (network: EthChainId): Promise<PointsInfoResponse> => {
11+
if (!SUBSQUID_LINKS[network]) {
12+
return Promise.resolve({
13+
weight: 0,
14+
pointsPerDay: 0,
15+
});
16+
}
17+
18+
return new Promise(resolve =>
19+
fetch(SUBSQUID_LINKS[network], {
20+
method: 'POST',
21+
headers: {
22+
'Content-Type': 'application/json',
23+
},
24+
body: JSON.stringify({
25+
query: `
26+
query pointSettingsQuery {
27+
pointSettings(orderBy: ethStartBlock_DESC, limit: 1) {
28+
weight:ethWeight
29+
pointsPerDay
30+
}
31+
}
32+
`,
33+
}),
34+
})
35+
.then(response => response.json())
36+
.then(({ data: { pointSettings } }) => resolve(pointSettings?.[0] ?? {}))
37+
.catch(error => {
38+
console.error('Error fetching points info from subsquid:', error);
39+
resolve({
40+
weight: 0,
41+
pointsPerDay: 0,
42+
});
43+
}),
44+
);
45+
};
46+
47+
export default getPointsInfoSubsquid;

src/utilities/getUserPointsSubsquid.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ const getUserPointsSubsquid = (
3030
}),
3131
})
3232
.then(response => response.json())
33-
.then(({ data: { user } }) => resolve(user)),
33+
.then(({ data: { user } }) => resolve(user))
34+
.catch(error => {
35+
console.error('Error fetching user points from subsquid:', error);
36+
resolve({ points: 0, address: input.address, id: input.address });
37+
}),
3438
);
3539
};
3640

0 commit comments

Comments
 (0)