diff --git a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts index 0fd8baca9..027005f4e 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts @@ -1,8 +1,8 @@ import { fixed } from "@delvtech/fixed-point-wasm"; import { appConfig, + getRewardsFn, HyperdriveConfig, - rewardFunctions, } from "@delvtech/hyperdrive-appconfig"; import { Block, ReadHyperdrive } from "@delvtech/hyperdrive-viem"; import { getPublicClient } from "@wagmi/core"; @@ -78,11 +78,12 @@ export async function getLpApy({ const publicClient = getPublicClient(wagmiConfig as any, { chainId: hyperdrive.chainId, }) as PublicClient; - // TODO: Create an appconfig selector to grab the rewards function from a - // given hyperdrive - const rewardsFn = appConfig.yieldSources[hyperdrive.yieldSource].rewardsFn; + const rewardsFn = getRewardsFn({ + yieldSourceId: hyperdrive.yieldSource, + appConfig, + }); if (rewardsFn) { - const rewards = await rewardFunctions[rewardsFn](publicClient); + const rewards = await rewardsFn(publicClient); rewards?.forEach((reward) => { if (reward.type === "transferableToken") { netLpApy = fixed(reward.apy).add( diff --git a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts index b75335e79..bca577f14 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts @@ -2,8 +2,8 @@ import { fixed } from "@delvtech/fixed-point-wasm"; import { AppConfig, findHyperdriveConfig, + getRewardsFn, HyperdriveConfig, - rewardFunctions, } from "@delvtech/hyperdrive-appconfig"; import { Block, ReadHyperdrive } from "@delvtech/hyperdrive-viem"; import { getPublicClient } from "@wagmi/core"; @@ -79,14 +79,15 @@ async function calcNetRate( hyperdrive: HyperdriveConfig, ) { let netRate = rate; - // TODO: Create an appconfig selector to grab the rewards function from a - // given hyperdrive - const rewardsFn = appConfig.yieldSources[hyperdrive.yieldSource].rewardsFn; + const rewardsFn = getRewardsFn({ + yieldSourceId: hyperdrive.yieldSource, + appConfig, + }); if (rewardsFn) { const publicClient = getPublicClient(wagmiConfig as any, { chainId: hyperdrive.chainId, }) as PublicClient; - const rewards = await rewardFunctions[rewardsFn](publicClient); + const rewards = await rewardsFn(publicClient); rewards?.forEach((reward) => { if (reward.type === "transferableToken") { netRate = fixed(reward.apy).add( @@ -116,11 +117,3 @@ function getNumBlocksForHistoricalRate({ return numBlocksForHistoricalRate; } - -function getDaysSinceInitialization({ - hyperdrive, -}: { - hyperdrive: HyperdriveConfig; -}): number { - return Number(hyperdrive.initializationTimestamp * 1000n) - Date.now(); -} diff --git a/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts b/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts index 59ea341ce..557888e2c 100644 --- a/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts +++ b/apps/hyperdrive-trading/src/ui/rewards/useRewards.ts @@ -1,8 +1,8 @@ import { AnyReward, appConfig, + getRewardsFn, HyperdriveConfig, - rewardFunctions, } from "@delvtech/hyperdrive-appconfig"; import { useQuery } from "@tanstack/react-query"; import { getPublicClient } from "@wagmi/core"; @@ -14,8 +14,10 @@ export function useRewards(hyperdriveConfig: HyperdriveConfig): { rewards: AnyReward[] | undefined; status: "error" | "success" | "loading"; } { - const rewardsFn = - appConfig.yieldSources[hyperdriveConfig.yieldSource].rewardsFn; + const rewardsFn = getRewardsFn({ + yieldSourceId: hyperdriveConfig.yieldSource, + appConfig, + }); const queryEnabled = !!rewardsFn; @@ -30,7 +32,7 @@ export function useRewards(hyperdriveConfig: HyperdriveConfig): { const publicClient = getPublicClient(wagmiConfig as any, { chainId: hyperdriveConfig.chainId, }) as PublicClient; - return rewardFunctions[rewardsFn](publicClient); + return rewardsFn(publicClient); } : undefined, }); diff --git a/packages/hyperdrive-appconfig/src/index.ts b/packages/hyperdrive-appconfig/src/index.ts index 339d1d5ee..7f49c4160 100644 --- a/packages/hyperdrive-appconfig/src/index.ts +++ b/packages/hyperdrive-appconfig/src/index.ts @@ -32,12 +32,12 @@ export type { YieldSource, YieldSourceId } from "src/yieldSources/types"; export { yieldSources } from "src/yieldSources/yieldSources"; // rewards -export { rewardFunctions } from "src/rewards/rewards"; +export { getRewardsFn } from "src/rewards/selectors"; export type { AnyReward, InfoReward, NonTransferableTokenReward, - RewardsResolver as RewardsFn, + RewardsResolver, TransferableTokenReward, } from "src/rewards/types"; diff --git a/packages/hyperdrive-appconfig/src/rewards/selectors.ts b/packages/hyperdrive-appconfig/src/rewards/selectors.ts new file mode 100644 index 000000000..61593884a --- /dev/null +++ b/packages/hyperdrive-appconfig/src/rewards/selectors.ts @@ -0,0 +1,25 @@ +import { AppConfig } from "src/appconfig/AppConfig"; +import { rewardFunctions } from "src/rewards/rewards"; +import { RewardsResolver } from "src/rewards/types"; +import { YieldSourceId } from "src/yieldSources/types"; + +/** + * Find the rewards resolver for a given yield source. This will return + * `undefined` if no rewards function exists for this yield source. + */ +export function getRewardsFn({ + yieldSourceId, + appConfig, +}: { + // TODO: change this type to YieldSourceId once YieldSourceId can be used outside + // of the appconfig package.k + yieldSourceId: string; + appConfig: AppConfig; +}): RewardsResolver | undefined { + // casting this for now because YieldSourceId doesn't work outside of the appconfig package + const yieldSource = appConfig.yieldSources[yieldSourceId as YieldSourceId]; + if (!yieldSource.rewardsFn) { + return; + } + return rewardFunctions[yieldSource.rewardsFn]; +}