Skip to content

Commit 3282350

Browse files
authored
Wire up variable apys in points card (#1693)
* Handle missing rewards by returning empty array * Show correct multiplier in banner * Wire up variable rate cell * Fix type
1 parent a6898ae commit 3282350

File tree

4 files changed

+56
-11
lines changed

4 files changed

+56
-11
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"editor.defaultFormatter": "esbenp.prettier-vscode"
99
},
1010
"[typescript]": {
11-
"editor.defaultFormatter": "ms-vsliveshare.vsliveshare"
11+
"editor.defaultFormatter": "esbenp.prettier-vscode"
1212
},
1313
"[javascriptreact]": {
1414
"editor.defaultFormatter": "esbenp.prettier-vscode"

apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useUnpausedPools.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ export function useUnpausedPools(): {
6666
appConfig: appConfigForConnectedChain,
6767
});
6868

69-
const rewards = !rewardsFn ? [] : await rewardsFn(publicClient);
69+
const rewards = !rewardsFn
70+
? []
71+
: await rewardsFn(publicClient).catch(() => []);
7072

7173
return { ...hyperdrive, rewards };
7274
}),

apps/hyperdrive-trading/src/ui/markets/PointsMarkets/PointsMarkets.tsx

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
1-
import { fixed } from "@delvtech/fixed-point-wasm";
1+
import { fixed, parseFixed } from "@delvtech/fixed-point-wasm";
22
import {
33
getYieldSource,
44
HyperdriveConfig,
5+
PointMultiplierReward,
56
} from "@delvtech/hyperdrive-appconfig";
67
import { Link, useSearch } from "@tanstack/react-router";
78
import { ReactElement, ReactNode } from "react";
9+
import Skeleton from "react-loading-skeleton";
10+
import { formatRate } from "src/base/formatRate";
11+
import { calculateMarketYieldMultiplier } from "src/hyperdrive/calculateMarketYieldMultiplier";
812
import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain";
913
import { Well } from "src/ui/base/components/Well/Well";
14+
import { useCurrentLongPrice } from "src/ui/hyperdrive/longs/hooks/useCurrentLongPrice";
1015
import { useLpApy } from "src/ui/hyperdrive/lp/hooks/useLpApy";
1116
import { AssetStack } from "src/ui/markets/AssetStack";
1217
import { usePoolsList } from "src/ui/markets/hooks/usePoolsList";
1318
import {
1419
MARKET_DETAILS_ROUTE,
1520
POINTS_MARKETS_ROUTE,
1621
} from "src/ui/markets/routes";
22+
import { useRewards } from "src/ui/rewards/useRewards";
1723
import { useYieldSourceRate } from "src/ui/vaults/useYieldSourceRate";
1824
import { useAccount } from "wagmi";
1925

@@ -110,7 +116,27 @@ function PointsMarketCardBanner({
110116
}: {
111117
hyperdrive: HyperdriveConfig;
112118
}) {
113-
const multipliers = [{ multiplier: "64x", label: "SPIN Rewards" }];
119+
const { rewards } = useRewards(hyperdrive);
120+
const { longPrice } = useCurrentLongPrice({
121+
chainId: hyperdrive.chainId,
122+
hyperdriveAddress: hyperdrive.address,
123+
});
124+
const pointRewards = rewards?.filter(
125+
({ type }) => type === "pointMultiplier",
126+
) as PointMultiplierReward[] | undefined;
127+
128+
const multipliers =
129+
longPrice && pointRewards
130+
? pointRewards.map(({ pointMultiplier, pointTokenLabel }) => {
131+
const capitalMultiplier = calculateMarketYieldMultiplier(longPrice);
132+
return {
133+
multiplier: capitalMultiplier
134+
.mul(parseFixed(pointMultiplier))
135+
.format({ decimals: 0 }),
136+
label: pointTokenLabel,
137+
};
138+
})
139+
: [];
114140
return (
115141
<div className="flex w-full items-center justify-between rounded-xl bg-base-200 p-5">
116142
<div className="flex w-full flex-col items-center justify-center gap-1.5">
@@ -124,7 +150,7 @@ function PointsMarketCardBanner({
124150
className="flex w-full flex-col items-center justify-center gap-1.5"
125151
>
126152
<div className="font-chakraPetch text-h4 font-medium">
127-
{multiplier}
153+
{multiplier}x
128154
</div>
129155
<p className="font-medium text-neutral-content sm:text-sm">
130156
{label}
@@ -139,11 +165,11 @@ function PointsMarketCardBanner({
139165

140166
function PointsMarketTable({ hyperdrive }: { hyperdrive: HyperdriveConfig }) {
141167
const { address: account } = useAccount();
142-
const { lpApy } = useLpApy({
168+
const { lpApy, lpApyStatus } = useLpApy({
143169
chainId: hyperdrive.chainId,
144170
hyperdriveAddress: hyperdrive.address,
145171
});
146-
const { vaultRate } = useYieldSourceRate({
172+
const { vaultRate, vaultRateStatus } = useYieldSourceRate({
147173
chainId: hyperdrive.chainId,
148174
hyperdriveAddress: hyperdrive.address,
149175
});
@@ -212,8 +238,24 @@ function PointsMarketTable({ hyperdrive }: { hyperdrive: HyperdriveConfig }) {
212238
col1={
213239
<span className="text-sm text-neutral-content">Variable APY</span>
214240
}
215-
col2={<span className="mr-5 text-sm">13.84%</span>}
216-
col3={<span className="mr-3 text-sm">13.84%</span>}
241+
col2={
242+
<span className="mr-5 text-sm">
243+
{vaultRateStatus !== "success" ? (
244+
<Skeleton width={100} />
245+
) : (
246+
formatRate({ rate: vaultRate!.netVaultRate })
247+
)}
248+
</span>
249+
}
250+
col3={
251+
<span className="mr-3 text-sm">
252+
{lpApyStatus !== "success" ? (
253+
<Skeleton width={100} />
254+
) : (
255+
formatRate({ rate: lpApy!.netLpApy! })
256+
)}
257+
</span>
258+
}
217259
/>
218260
<PointsMarketRow
219261
col1={

packages/hyperdrive-appconfig/src/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ export type { YieldSourceConfig, YieldSourceId } from "src/yieldSources/types";
3333
export { getRewardsFn } from "src/rewards/selectors";
3434
export type {
3535
AnyReward,
36+
ApyReward,
3637
InfoReward,
37-
TokenAmountReward as NonTransferableTokenReward,
38+
PointMultiplierReward,
3839
RewardsResolver,
39-
ApyReward as TransferableTokenReward,
40+
TokenAmountReward,
4041
} from "src/rewards/types";
4142

4243
// protocols

0 commit comments

Comments
 (0)