import { useCallback, useMemo, useState } from "react";
import { encodeFunctionData } from "viem";
import {
isDepositSpendApproved,
prepareApproveDepositTokenTxData,
prepareDepositTxData,
type YieldType,
} from "@paxoslabs/amplify-sdk";
import { usePrivy, useWallets } from "@privy-io/react-auth";
interface DepositParams {
yieldType: YieldType;
depositToken: `0x${string}`;
recipientAddress: `0x${string}`;
depositAmount: string;
chainId: number;
slippage?: number;
}
export function usePrivyDeposit() {
const { sendTransaction } = usePrivy();
const { wallets } = useWallets();
const wallet = useMemo(() => wallets.find(Boolean), [wallets]);
const [txHash, setTxHash] = useState<`0x${string}` | null>(null);
const [status, setStatus] = useState<
"idle" | "checking" | "approving" | "depositing" | "success"
>("idle");
const [error, setError] = useState<Error | null>(null);
const run = useCallback(
async ({
yieldType,
depositToken,
recipientAddress,
depositAmount,
chainId,
slippage = 100,
}: DepositParams) => {
if (!wallet) {
throw new Error("Connect a Privy wallet before depositing.");
}
setStatus("checking");
setError(null);
setTxHash(null);
try {
const approved = await isDepositSpendApproved({
yieldType,
depositToken,
recipientAddress,
chainId,
});
if (!approved) {
setStatus("approving");
const approval = await prepareApproveDepositTokenTxData({
yieldType,
depositToken,
depositAmount,
chainId,
});
await sendTransaction({
chainId: approval.chainId,
to: approval.address,
data: encodeFunctionData({
abi: approval.abi,
functionName: approval.functionName,
args: approval.args,
}),
});
}
setStatus("depositing");
const deposit = await prepareDepositTxData({
yieldType,
recipientAddress,
depositToken,
depositAmount,
chainId,
slippage,
});
const hash = await sendTransaction({
chainId: deposit.chainId,
to: deposit.address,
data: encodeFunctionData({
abi: deposit.abi,
functionName: deposit.functionName,
args: deposit.args,
}),
});
setTxHash(hash as `0x${string}`);
setStatus("success");
} catch (err) {
const message = err instanceof Error ? err : new Error(String(err));
setError(message);
setStatus("idle");
throw err;
}
},
[wallet, sendTransaction]
);
return { run, status, error, txHash };
}