import type { AssociatedTokenAccount } from "@saberhq/sail"; import { useToken, useUserATAs } from "@saberhq/sail"; import type { Token } from "@saberhq/token-utils"; import { TokenAmount } from "@saberhq/token-utils"; import BN from "bn.js"; import { useMemo } from "react"; import { createContainer } from "unstated-next"; import type { QuarryInfo } from "../rewarder"; import { useRewarder } from "../rewarder"; export interface UseQuarryArgs { quarry?: QuarryInfo; } export interface UseQuarry { quarry: QuarryInfo; rewardToken: Token | null | undefined; stakedToken: Token | null | undefined; userStakedTokenBalance?: AssociatedTokenAccount | null; totalDeposits: TokenAmount | null | undefined; totalRewardsPerDay?: TokenAmount | null; } const useQuarryInternal = (args: UseQuarryArgs = {}): UseQuarry => { const { quarry } = args; const { rewardToken } = useRewarder(); if (!quarry) { throw new Error("no quarry"); } const { data: stakedToken } = useToken(quarry.quarry.account.tokenMintKey); const [userStakedTokenBalance] = useUserATAs(stakedToken); const totalDeposits = useMemo(() => { if (!stakedToken) { return stakedToken; } return new TokenAmount( stakedToken, quarry.quarry.account.totalTokensDeposited ); }, [quarry.quarry.account.totalTokensDeposited, stakedToken]); const totalRewardsPerDay = useMemo(() => { if (!rewardToken) { return rewardToken; } return new TokenAmount( rewardToken, quarry.quarry.account.annualRewardsRate.div(new BN(365)) ); }, [quarry.quarry.account.annualRewardsRate, rewardToken]); return { quarry, rewardToken, stakedToken, userStakedTokenBalance, totalDeposits, totalRewardsPerDay, }; }; export const { Provider: QuarryProvider, useContainer: useQuarry } = createContainer(useQuarryInternal);