import type { HandleTXResponse } from "@saberhq/sail"; import { useSail } from "@saberhq/sail"; import type { TokenAmount } from "@saberhq/token-utils"; import { useCallback } from "react"; import invariant from "tiny-invariant"; import { useQuarrySDK } from "../../sdk"; import { useRewarder } from "../rewarder"; import { useQuarry } from "./context"; export const useQuarryStake = (): (( amount: TokenAmount ) => Promise) => { const { sdkMut } = useQuarrySDK(); const { handleTX } = useSail(); const { rewarderKey } = useRewarder(); const { stakedToken } = useQuarry(); return useCallback( async (amount: TokenAmount) => { invariant(sdkMut, "sdk not connected"); invariant(stakedToken, "staked token"); const authority = sdkMut.provider.wallet.publicKey; const rewarderW = await sdkMut.mine.loadRewarderWrapper(rewarderKey); const quarryW = await rewarderW.getQuarry(stakedToken); const minerW = await quarryW.getMinerActions(authority); const stakeTX = minerW.stake(amount); if (!(await sdkMut.provider.getAccountInfo(minerW.minerKey))) { const newMiner = await quarryW.createMiner(); stakeTX.instructions.unshift(...newMiner.tx.instructions); } const ataTX = await minerW.createATAIfNotExists(); if (ataTX) { return await handleTX( ataTX.combine(stakeTX), `Stake ${amount.formatUnits()}` ); } return await handleTX(stakeTX, `Stake ${amount.formatUnits()}`); }, [handleTX, rewarderKey, sdkMut, stakedToken] ); };