From d10abd9550b3d40fd1c6161de7cb4566ff9a703a Mon Sep 17 00:00:00 2001 From: jackburrus Date: Wed, 16 Oct 2024 07:39:26 -0700 Subject: [PATCH 1/3] adds to lpAPy --- .../src/ui/markets/PoolRow.tsx | 34 ++++++++++++++++--- .../src/ui/rewards/useRewards.ts | 2 +- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/apps/hyperdrive-trading/src/ui/markets/PoolRow.tsx b/apps/hyperdrive-trading/src/ui/markets/PoolRow.tsx index 9e4d90460..831c7d1bd 100644 --- a/apps/hyperdrive-trading/src/ui/markets/PoolRow.tsx +++ b/apps/hyperdrive-trading/src/ui/markets/PoolRow.tsx @@ -19,6 +19,9 @@ import { AssetStack } from "src/ui/markets/AssetStack"; import { formatTermLength2 } from "src/ui/markets/formatTermLength"; import { MARKET_DETAILS_ROUTE } from "src/ui/markets/routes"; import { RewardsTooltip } from "src/ui/rewards/RewardsTooltip"; +import { useMorphoVaultRewards } from "src/ui/rewards/useMorphoRate"; +import { eligibleMarketsForMorphoVaultRewards } from "src/ui/rewards/useRewards"; +import { base } from "viem/chains"; export interface PoolRowProps { hyperdrive: HyperdriveConfig; tvl: bigint; @@ -55,6 +58,14 @@ export function PoolRow({ hyperdriveAddress: hyperdrive.address, }); + const { morphoVaultReward } = useMorphoVaultRewards({ + hyperdrive, + enabled: + eligibleMarketsForMorphoVaultRewards[base.id]?.includes( + hyperdrive.address + ) ?? false, + }); + return ( {" "} {formatTermLength2( - Number(hyperdrive.poolConfig.positionDuration * 1000n), + Number(hyperdrive.poolConfig.positionDuration * 1000n) )} @@ -185,7 +196,10 @@ export function PoolRow({ hyperdriveAddress={hyperdrive.address} chainId={hyperdrive.chainId} > - {`${calculateMarketYieldMultiplier(longPrice).format({ decimals: 2, rounding: "trunc" })}x`} + {`${calculateMarketYieldMultiplier(longPrice).format({ + decimals: 2, + rounding: "trunc", + })}x`} ) : ( "-" @@ -217,7 +231,19 @@ export function PoolRow({ chainId={hyperdrive.chainId} hyperdriveAddress={hyperdrive.address} > - + {morphoVaultReward ? ( + + ) : ( + + )} ) : ( "-" @@ -299,7 +325,7 @@ function PercentLabel({ value }: { value: string }) {
{value} diff --git a/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts b/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts index a14dfc53a..8ec631d86 100644 --- a/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts +++ b/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts @@ -26,7 +26,7 @@ const eligibleMarketsForMorphoRewards: Record = { ], }; -const eligibleMarketsForMorphoVaultRewards: Record = { +export const eligibleMarketsForMorphoVaultRewards: Record = { [base.id]: [ // 182d Moonwell Flagship ETH "0xceD9F810098f8329472AEFbaa1112534E96A5c7b", From 9f438777f555c30cebcc92024a12548f6e66cbb0 Mon Sep 17 00:00:00 2001 From: jackburrus Date: Wed, 16 Oct 2024 07:50:20 -0700 Subject: [PATCH 2/3] morpho rate added to openshort form --- .../shorts/OpenShortForm/OpenShortForm.tsx | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx index a19cb26df..aceb16430 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx @@ -33,6 +33,8 @@ import { useMaxShort } from "src/ui/hyperdrive/shorts/hooks/useMaxShort"; import { useOpenShort } from "src/ui/hyperdrive/shorts/hooks/useOpenShort"; import { usePreviewOpenShort } from "src/ui/hyperdrive/shorts/hooks/usePreviewOpenShort"; import { PositionPicker } from "src/ui/markets/PositionPicker"; +import { useMorphoVaultRewards } from "src/ui/rewards/useMorphoRate"; +import { eligibleMarketsForMorphoVaultRewards } from "src/ui/rewards/useRewards"; import { ApproveTokenChoices } from "src/ui/token/ApproveTokenChoices"; import { SlippageSettingsTwo } from "src/ui/token/SlippageSettingsTwo"; import { TokenInputTwo } from "src/ui/token/TokenInputTwo"; @@ -44,6 +46,7 @@ import { useTokenBalance } from "src/ui/token/hooks/useTokenBalance"; import { useTokenFiatPrice } from "src/ui/token/hooks/useTokenFiatPrice"; import { useYieldSourceRate } from "src/ui/vaults/useYieldSourceRate"; import { formatUnits } from "viem"; +import { base } from "viem/chains"; import { useAccount, useChainId } from "wagmi"; (window as any).fixed = fixed; @@ -237,6 +240,14 @@ export function OpenShortForm({ percentage: slippageAsBigInt, }); + const { morphoVaultReward } = useMorphoVaultRewards({ + hyperdrive, + enabled: + eligibleMarketsForMorphoVaultRewards[base.id]?.includes( + hyperdrive.address + ) ?? false, + }); + const { openShort, openShortStatus } = useOpenShort({ chainId: hyperdrive.chainId, hyperdriveAddress: hyperdrive.address, @@ -266,7 +277,7 @@ export function OpenShortForm({ activeTokenBalance.value > maxBondsOut ? maxBondsOut : activeTokenBalance?.value, - activeToken.decimals, + activeToken.decimals ); } @@ -281,7 +292,7 @@ export function OpenShortForm({ }); const maturesOnLabel = formatDate( - Date.now() + Number(hyperdrive.poolConfig.positionDuration * 1000n), + Date.now() + Number(hyperdrive.poolConfig.positionDuration * 1000n) ); return ( @@ -335,7 +346,18 @@ export function OpenShortForm({ vaultRateStatus === "success" && vaultRate ? ( <> {appConfig.yieldSources[hyperdrive.yieldSource].shortName} @{" "} - {isNewPool ? "✨New✨" : `${vaultRate.formatted} APY`} + {isNewPool + ? "✨New✨" + : `${ + morphoVaultReward + ? `${formatRate( + vaultRate.vaultRate + + BigInt(morphoVaultReward.supplyApr * 1e18), + 18, + false + )}%` + : vaultRate.formatted + } APY`} ) : null } @@ -348,7 +370,7 @@ export function OpenShortForm({ baseTokenPrice && traderDeposit ? fixed( amountOfBondsToShortAsBigInt || 0n, - baseToken.decimals, + baseToken.decimals ).mul(baseTokenPrice).bigint : 0n, decimals: baseToken.decimals, @@ -392,7 +414,7 @@ export function OpenShortForm({ balance: activeTokenPrice && traderDeposit ? fixed(traderDeposit, activeToken.decimals).mul( - activeTokenPrice, + activeTokenPrice ).bigint : 0n, decimals: activeToken.decimals, @@ -421,7 +443,9 @@ export function OpenShortForm({
{exposureMultiplier} } @@ -520,7 +544,7 @@ export function OpenShortForm({ amountAsBigInt={paddedTraderDepositForAllowance} amount={formatUnits( paddedTraderDepositForAllowance || 0n, - activeToken.decimals, + activeToken.decimals )} /> ); From 99b6284651ba8430149bb1c3bb044b05edd7fc64 Mon Sep 17 00:00:00 2001 From: jackburrus Date: Wed, 16 Oct 2024 08:11:25 -0700 Subject: [PATCH 3/3] adds net apy to tooltip --- .../src/ui/rewards/RewardsTooltip.tsx | 72 ++++++++++++++----- .../src/ui/rewards/useRewards.ts | 27 ++++--- 2 files changed, 69 insertions(+), 30 deletions(-) diff --git a/apps/hyperdrive-trading/src/ui/rewards/RewardsTooltip.tsx b/apps/hyperdrive-trading/src/ui/rewards/RewardsTooltip.tsx index c25d74e18..5bc7c4780 100644 --- a/apps/hyperdrive-trading/src/ui/rewards/RewardsTooltip.tsx +++ b/apps/hyperdrive-trading/src/ui/rewards/RewardsTooltip.tsx @@ -2,9 +2,12 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; +import { ChartBarIcon, SparklesIcon } from "@heroicons/react/16/solid"; import * as Tooltip from "@radix-ui/react-tooltip"; import { PropsWithChildren, ReactNode } from "react"; import { assertNever } from "src/base/assertNever"; +import { formatRate } from "src/base/formatRate"; +import { useLpApy } from "src/ui/hyperdrive/hooks/useLpApy"; import { useRewards } from "src/ui/rewards/useRewards"; import { Address } from "viem"; @@ -24,6 +27,8 @@ export function RewardsTooltip({ const rewards = useRewards(hyperdrive); + const { lpApy } = useLpApy({ chainId, hyperdriveAddress }); + if (!rewards || (rewards && rewards.length === 0)) { return children; } @@ -74,25 +79,60 @@ export function RewardsTooltip({ case "MorphoVault": return ( -
-
- {`${reward.name} - {reward.name} + <> +
+
+ {`${reward.name} + {reward.name} +
+ +
+

+ +{reward.amount} +

+
+
+
+ + Rate +
-
-

- +{reward.amount} -

+
+

+ +{formatRate(BigInt(lpApy?.lpApy || 0), 18, false)}% +

+
-
+
+
+ + Net APY +
+ +
+

+ + + {formatRate( + (lpApy?.lpApy || 0n) + + BigInt( + (parseFloat(reward.amount) * 10 ** 18) / 100 + ), + 18, + false + )} + % +

+
+
+ ); case "LineaLXPL": return ( diff --git a/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts b/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts index 8ec631d86..9ee1b424c 100644 --- a/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts +++ b/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts @@ -88,6 +88,19 @@ export function useRewards(hyperdrive: HyperdriveConfig): Reward[] | undefined { }; rewards.push(morphoReward); } + if ( + eligibleMarketsForMorphoVaultRewards[base.id]?.includes(hyperdrive.address) + ) { + const vaultReward: Reward = { + id: "MorphoVault", + name: morphoVaultReward?.asset.name ?? "WELL", + iconUrl: WELL_ICON_URL, + amount: morphoVaultReward?.supplyApr + ? `${(morphoVaultReward.supplyApr * 100).toFixed(2)}%` + : "0%", + }; + rewards.push(vaultReward); + } // Add any linea rewards for this market if ( @@ -103,19 +116,5 @@ export function useRewards(hyperdrive: HyperdriveConfig): Reward[] | undefined { rewards.push(lineaReward); } - if ( - eligibleMarketsForMorphoVaultRewards[base.id]?.includes(hyperdrive.address) - ) { - const vaultReward: Reward = { - id: "MorphoVault", - name: morphoVaultReward?.asset.name ?? "WELL", - iconUrl: WELL_ICON_URL, - amount: morphoVaultReward?.supplyApr - ? `${(morphoVaultReward.supplyApr * 100).toFixed(2)}%` - : "0%", - }; - rewards.push(vaultReward); - } - return rewards; }