import { MergeMiner } from "@quarryprotocol/quarry-sdk"; import { useSail } from "@saberhq/sail"; import type { TransactionEnvelope } from "@saberhq/solana-contrib"; import { useCallback } from "react"; import invariant from "tiny-invariant"; import { useQuarrySDK } from "../.."; import { useMergedQuarries } from "./context"; /** * Claims tokens across all merge pools. * @returns */ export const useMergedClaim = (): (() => Promise) => { const { sdkMut } = useQuarrySDK(); const { handleTXs } = useSail(); const { mergePool, mergeMiner, quarries } = useMergedQuarries(); return useCallback(async () => { invariant(sdkMut, "sdk not connected"); invariant(mergePool, "merge pool"); invariant(mergeMiner, "merge miner"); const mm = new MergeMiner( sdkMut.mergeMine, { key: mergePool.publicKey, data: mergePool.account, }, { key: mergeMiner.publicKey, data: mergeMiner.account, } ); const activeQuarries = quarries.filter((q) => q.miner); const { pending, success, errors } = await handleTXs( ( await Promise.all([ // only claim from quarries where we have a miner ...activeQuarries.map((quarry) => quarry.isReplica ? mm.claimReplicaRewards(quarry.rewarder.publicKey) : mm.claimPrimaryRewards(quarry.rewarder.publicKey) ), ]) ).filter((tx): tx is TransactionEnvelope => !!tx), "Claim tokens" ); if (!success) { throw new Error( `Error claiming tokens: ${errors?.toString() ?? "unknown error"}` ); } await Promise.all(pending.map((p) => p.wait())); }, [handleTXs, mergeMiner, mergePool, quarries, sdkMut]); };