diff --git a/components/AccountStats.tsx b/components/AccountStats.tsx
index 2befd9a..e122e0f 100644
--- a/components/AccountStats.tsx
+++ b/components/AccountStats.tsx
@@ -1,13 +1,58 @@
+import useStakeRates from 'hooks/useStakeRates'
import { formatTokenSymbol } from 'utils/tokens'
+import SheenLoader from './shared/SheenLoader'
+import { useMemo } from 'react'
+import Decimal from 'decimal.js'
+import useMangoGroup from 'hooks/useMangoGroup'
+import FormatNumericValue from './shared/FormatNumericValue'
const AccountStats = ({ token }: { token: string }) => {
+ const { data: stakeRates, isLoading: loadingRates } = useStakeRates()
+ const { group } = useMangoGroup()
+
+ const solBank = useMemo(() => {
+ return group?.banksMapByName.get('SOL')?.[0]
+ }, [group, token])
+
+ const tokenBank = useMemo(() => {
+ return group?.banksMapByName.get(token)?.[0]
+ }, [group, token])
+
+ const solDeposits = useMemo(() => {
+ if (!solBank) return null
+ return solBank.uiDeposits()
+ }, [solBank])
+
+ const tokenDeposits = useMemo(() => {
+ if (!tokenBank) return null
+ return tokenBank.uiDeposits()
+ }, [tokenBank])
+
+ const solAvailable = useMemo(() => {
+ if (!solBank || !solDeposits) return 0
+ const availableVaultBalance = group
+ ? group.getTokenVaultBalanceByMintUi(solBank.mint) -
+ solDeposits * solBank.minVaultToDepositsRatio
+ : 0
+ return Decimal.max(0, availableVaultBalance.toFixed(solBank.mintDecimals))
+ }, [solBank, solDeposits, group])
+
return (
<>
{`Boosted ${formatTokenSymbol(token)}`}
-
Est. APR
-
14.89%
+
Max Est. APY
+
+ {loadingRates ? (
+
+
+
+ ) : stakeRates?.[token.toLowerCase()] ? (
+ `${(stakeRates?.[token.toLowerCase()] * 100).toFixed(2)}%`
+ ) : null}
+ % SOL
+
Max Leverage
@@ -15,11 +60,16 @@ const AccountStats = ({ token }: { token: string }) => {
Capacity Remaining
-
100,000 SOL
+
+ SOL
+
Total Staked
-
{`100,000 ${token}`}
+
+ {' '}
+ {token}
+
>
diff --git a/components/Positions.tsx b/components/Positions.tsx
index 3eb53b9..a6a472a 100644
--- a/components/Positions.tsx
+++ b/components/Positions.tsx
@@ -107,7 +107,7 @@ const Positions = ({
-
Est. APR
+
Est. APY
14.89%
diff --git a/components/StakeForm.tsx b/components/StakeForm.tsx
index b9e87b9..99d044a 100644
--- a/components/StakeForm.tsx
+++ b/components/StakeForm.tsx
@@ -132,7 +132,7 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
if (!solPrice || !stakePrice || !Number(inputAmount)) return 0
const priceDifference = (stakePrice - solPrice) / solPrice
const borrowAmount =
- (1 + priceDifference) * Number(inputAmount) * (leverage - 1)
+ (1 + priceDifference) * Number(inputAmount) * Math.min(leverage - 1, 1)
return borrowAmount
}, [leverage, solBank, stakeBank, inputAmount])
@@ -339,7 +339,7 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
-
{selectedToken} Leveraged APR
+
{selectedToken} Leveraged APY
SOL Borrow Rate
%
diff --git a/components/TokenButton.tsx b/components/TokenButton.tsx
index 2dd1c25..d0aa4fa 100644
--- a/components/TokenButton.tsx
+++ b/components/TokenButton.tsx
@@ -1,4 +1,4 @@
-import useStakeApr from 'hooks/useStakeAprs'
+import useStakeRates from 'hooks/useStakeRates'
import Image from 'next/image'
import { formatTokenSymbol } from 'utils/tokens'
import SheenLoader from './shared/SheenLoader'
@@ -13,12 +13,12 @@ const TokenButton = ({
handleTokenSelect: (v: string) => void
}) => {
const {
- data: stakeAprs,
- isLoading: loadingStakeAprs,
- isFetching: fetchingStakeAprs,
- } = useStakeApr()
+ data: stakeRates,
+ isLoading: loadingStakeRates,
+ isFetching: fetchingStakeRates,
+ } = useStakeRates()
- const loadingAprs = loadingStakeAprs || fetchingStakeAprs
+ const loadingRates = loadingStakeRates || fetchingStakeRates
return (
diff --git a/hooks/useStakeAprs.ts b/hooks/useStakeRates.ts
similarity index 69%
rename from hooks/useStakeAprs.ts
rename to hooks/useStakeRates.ts
index f61199d..b779cb3 100644
--- a/hooks/useStakeAprs.ts
+++ b/hooks/useStakeRates.ts
@@ -7,7 +7,7 @@ import {
PERIOD,
} from '@glitchful-dev/sol-apy-sdk'
-const fetchApr = async () => {
+const fetchRates = async () => {
const [msolPrices, jitoPrices, bsolPrices, lidoPrices] = await Promise.all([
fetchAndParsePricesCsv(DATA_SOURCE.MARINADE_CSV),
fetchAndParsePricesCsv(DATA_SOURCE.JITO_CSV),
@@ -17,34 +17,34 @@ const fetchApr = async () => {
console.log('jitosol', jitoPrices)
// may be null if the price range cannot be calculated
- const msolRange = getPriceRangeFromPeriod(msolPrices, PERIOD.DAYS_14)
- const jitoRange = getPriceRangeFromPeriod(jitoPrices, PERIOD.DAYS_14)
- const bsolRange = getPriceRangeFromPeriod(bsolPrices, PERIOD.DAYS_14)
- const lidoRange = getPriceRangeFromPeriod(lidoPrices, PERIOD.DAYS_14)
+ const msolRange = getPriceRangeFromPeriod(msolPrices, PERIOD.DAYS_7)
+ const jitoRange = getPriceRangeFromPeriod(jitoPrices, PERIOD.DAYS_7)
+ const bsolRange = getPriceRangeFromPeriod(bsolPrices, PERIOD.DAYS_7)
+ const lidoRange = getPriceRangeFromPeriod(lidoPrices, PERIOD.DAYS_7)
+ console.log('msol prices', msolPrices)
- const aprData: Record
= {}
+ const rateData: Record = {}
if (msolRange) {
- console.log('APR: ', calcYield(msolRange)?.apr) // 0.06493501845986677 => 6.49 %
console.log('APY: ', calcYield(msolRange)?.apy) // 0.06707557862842384 => 6.71 %
- aprData.msol = calcYield(msolRange)?.apr
+ rateData.msol = calcYield(msolRange)?.apy
}
if (jitoRange) {
- aprData.jitosol = calcYield(jitoRange)?.apr
+ rateData.jitosol = calcYield(jitoRange)?.apy
}
if (bsolRange) {
- aprData.bsol = calcYield(bsolRange)?.apr
+ rateData.bsol = calcYield(bsolRange)?.apy
}
if (lidoRange) {
- aprData.stsol = calcYield(lidoRange)?.apr
+ rateData.stsol = calcYield(lidoRange)?.apy
}
- return aprData
+ return rateData
}
-fetchApr()
+fetchRates()
-export default function useStakeApr() {
- const response = useQuery(['apr'], () => fetchApr(), {
+export default function useStakeRates() {
+ const response = useQuery(['stake-rates'], () => fetchRates(), {
cacheTime: 1000 * 60 * 5,
staleTime: 1000 * 60,
retry: 3,