@macalinao/react-quarry
Version:
React hooks for Quarry
70 lines (60 loc) • 1.84 kB
text/typescript
import type { Address, Signature } from "@solana/kit";
import { useKitWallet, useSendTX } from "@macalinao/grill";
import { createWithdrawMergeMinerIxs } from "@macalinao/quarry";
import { useCallback } from "react";
import { useMergeMinerContext } from "../contexts/merge-miner.js";
import { usePoolInfo } from "../contexts/pool-info.js";
export interface QuarryWithdrawMMArgs {
amount: bigint;
tokenDestination?: Address;
}
export interface UseQuarryWithdrawMMResult {
withdraw: (args: QuarryWithdrawMMArgs) => Promise<Signature>;
isReady: boolean;
}
export const useQuarryWithdrawMM = (): UseQuarryWithdrawMMResult => {
const { mergePool, mergePoolAddress } = useMergeMinerContext();
const { poolInfo } = usePoolInfo();
const { signer } = useKitWallet();
const sendTX = useSendTX();
const withdraw = useCallback(
async ({
amount,
tokenDestination,
}: QuarryWithdrawMMArgs): Promise<Signature> => {
if (!signer) {
throw new Error("Wallet not connected");
}
if (!poolInfo.primaryRewards.rewarder) {
throw new Error("No primary rewarder found");
}
const ixs = await createWithdrawMergeMinerIxs({
amount,
tokenDestination,
rewarder: poolInfo.primaryRewards.rewarder,
mergePool: {
address: mergePoolAddress,
data: mergePool,
},
owner: signer,
payer: signer,
replicaRewarders:
poolInfo.secondaryRewards?.map((r) => r.rewarder) ?? [],
});
return sendTX("Withdraw from Merge Miner", ixs);
},
[
signer,
poolInfo.primaryRewards.rewarder,
poolInfo.secondaryRewards,
mergePoolAddress,
mergePool,
sendTX,
],
);
const isReady = !!signer && !!mergePool;
return {
withdraw,
isReady,
};
};