From 584d32924c656b7f510b75c3f745b345d28c7cea Mon Sep 17 00:00:00 2001 From: iamoskvin Date: Mon, 10 Jun 2024 11:34:06 +0300 Subject: [PATCH] added STRK apr --- src/pages/Vault/index.tsx | 9 +++++---- src/pages/Vaults/index.tsx | 11 ++++++++--- src/state/vaults/hooks.tsx | 27 ++++++++++++++++++++++++++- src/state/vaults/reducer.ts | 1 + 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/pages/Vault/index.tsx b/src/pages/Vault/index.tsx index 0453cfaa..61ad09dc 100644 --- a/src/pages/Vault/index.tsx +++ b/src/pages/Vault/index.tsx @@ -461,9 +461,10 @@ export default function Vault({ className }: { className?: string }) { const tokenPrice = currentVault.prices[currentVault.mainAssetKey] const shareTokenDecimals = currentVault?.share?.decimals const shareTokenPriceInUnits = performanceData.shareTokenPrice / 10 ** (18 + shareTokenDecimals) - apr = Number(performanceData.shareTokenApr / 10 ** 4)?.toFixed(2) - feeApr = Number(performanceData.feeApr7dAvg / 10 ** 4)?.toFixed(2) - totalApr = Number((performanceData?.shareTokenApr + performanceData?.feeApr) / 10 ** 4)?.toFixed(2) + // apr = Number(performanceData.shareTokenApr / 10 ** 4)?.toFixed(2) + feeApr = Number(performanceData.feeApr7dAvg / 10 ** 4) + apr = (feeApr + currentVault.aprStarknet * 100).toFixed(2) + // totalApr = Number((performanceData?.shareTokenApr + performanceData?.feeApr) / 10 ** 4)?.toFixed(2) shareTokenPriceUsd = shareTokenPriceInUnits * tokenPrice } @@ -488,7 +489,7 @@ export default function Vault({ className }: { className?: string }) { APR - {feeApr ? `${feeApr}%` : '-'} + {apr ? `${apr}%` : '-'} {/* */} diff --git a/src/pages/Vaults/index.tsx b/src/pages/Vaults/index.tsx index 9e97e899..1c58fe43 100644 --- a/src/pages/Vaults/index.tsx +++ b/src/pages/Vaults/index.tsx @@ -443,7 +443,8 @@ const ListItem = ({ index, vaultAddress, vaultData, getUserBalance = noop }: Lis const shareTokenDecimals = vaultData?.share?.decimals const shareTokenPriceInUnits = performanceData.shareTokenPrice / 10 ** (18 + shareTokenDecimals) // apr = Number(performanceData.shareTokenApr / 10 ** 4)?.toFixed(2) - apr = Number(performanceData.feeApr7dAvg / 10 ** 4)?.toFixed(2) + const feeApr = Number(performanceData.feeApr7dAvg / 10 ** 4) + apr = (feeApr + vaultData.aprStarknet * 100).toFixed(2) shareTokenPriceUsd = shareTokenPriceInUnits * tokenPrice } @@ -567,9 +568,13 @@ export default function Vaults({ maxItems = 10 }) { const vaultAUserDeposit = userPools?.[vaultAddressA] const vaultBUserDeposit = userPools?.[vaultAddressB] const vaultAValueToCompare = - isMyVaultsFilterEnabled && vaultAUserDeposit ? vaultAUserDeposit : vaultAPerformanceData?.feeApr7dAvg + isMyVaultsFilterEnabled && vaultAUserDeposit + ? vaultAUserDeposit + : vaultAPerformanceData?.feeApr7dAvg / 10 ** 4 + vaultA.aprStarknet * 100 const vaultBValueToCompare = - isMyVaultsFilterEnabled && vaultBUserDeposit ? vaultBUserDeposit : vaultBPerformanceData?.feeApr7dAvg + isMyVaultsFilterEnabled && vaultBUserDeposit + ? vaultBUserDeposit + : vaultBPerformanceData?.feeApr7dAvg / 10 ** 4 + vaultB.aprStarknet * 100 if (vaultAValueToCompare < vaultBValueToCompare) { return 1 } diff --git a/src/state/vaults/hooks.tsx b/src/state/vaults/hooks.tsx index 142abaf3..48249a31 100644 --- a/src/state/vaults/hooks.tsx +++ b/src/state/vaults/hooks.tsx @@ -28,6 +28,8 @@ import { formatUsdPrice } from 'nft/utils' import { removeExtraDecimals } from 'utils/removeExtraDecimals' import { Vault } from './reducer' import { DEFAULT_CHAIN_ID, TEAHOUSE_LOGO_URI, vaultURL } from 'constants/tokens' +import { getClient } from 'apollo/client' +import { STRK_REWARDS_DATA } from 'apollo/queries' type Maybe = T | null | undefined @@ -142,6 +144,18 @@ const getTokenPrices = async (contracts: string[]) => { return result } +function getRewardsData(jediRewards: any, vault: any) { + if (!jediRewards) { + return + } + const pair1 = `${vault?.token0.symbol}/${vault?.token1.symbol}`.toLowerCase() + const pair2 = `${vault?.token1.symbol}/${vault?.token0.symbol}`.toLowerCase() + const pairKey = Object.keys(jediRewards).find((key) => key.toLowerCase() === pair1 || key.toLowerCase() === pair2) + if (pairKey && jediRewards[pairKey]) { + return jediRewards[pairKey] + } +} + export function useAllVaults() { const allVaults = useSelector((state: AppState) => state.vaults.allVaults) const dispatch = useAppDispatch() @@ -150,19 +164,26 @@ export function useAllVaults() { const [error, setError] = useState(null) const [isLoading, setIsLoading] = useState(true) + const graphqlClient = getClient(chainId) + useEffect(() => { let ignore = false const loadData = async () => { setError(null) setIsLoading(true) try { - const [vaultListWithContents, permissionlessVaultDataList] = await Promise.all([ + const [vaultListWithContents, permissionlessVaultDataList, rewardsResp] = await Promise.all([ getVaultListWithContents(chainId), getPermissionlessVaultDataList(chainId), + graphqlClient.query({ + query: STRK_REWARDS_DATA(), + fetchPolicy: 'cache-first', + }), ]) if (!vaultListWithContents || !permissionlessVaultDataList) { throw new Error('Failed to fetch data') } + const jediRewards = rewardsResp?.data?.strkGrantDataV2 const addresses = Object.keys(vaultListWithContents) const tokensAddresses = uniq( addresses @@ -189,6 +210,10 @@ export function useAllVaults() { token1: prices?.[token1Address] ?? null, }, } + + const rewardsData = getRewardsData(jediRewards, vaultListWithContents[address]) + acc[address].aprStarknet = rewardsData?.apr || 0 + acc[address].rewarded = acc[address].aprStarknet ? true : false return acc }, {}) if (!ignore) { diff --git a/src/state/vaults/reducer.ts b/src/state/vaults/reducer.ts index 003de83c..551b3e00 100644 --- a/src/state/vaults/reducer.ts +++ b/src/state/vaults/reducer.ts @@ -58,6 +58,7 @@ export type Vault = { strategyType: string type: string performance: any + aprStarknet: number } type Vaults = {