import { mainnet } from "viem/chains";
import {
prepareDepositAuthorization,
prepareDeposit,
isPermitAuth,
isApprovalAuth,
isAlreadyApprovedAuth,
YieldType,
} from "@paxoslabs/amplify-sdk";
const params = {
yieldType: YieldType.CORE,
depositAsset: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" as `0x${string}`, // USDC
depositAmount: "1000",
to: userAddress,
chainId: mainnet.id,
};
// Step 1: Get authorization method
const auth = await prepareDepositAuthorization(params);
// Step 2: Handle based on method using type guards
if (isPermitAuth(auth)) {
// Sign permit off-chain
const signature = await walletClient.signTypedData({
account: userAddress,
...auth.permitData,
});
// Prepare and execute deposit with permit
const prepared = await prepareDeposit({
...params,
signature,
deadline: BigInt(auth.permitData.message.deadline),
});
await walletClient.writeContract(prepared.txData);
} else if (isApprovalAuth(auth)) {
// Execute approval first
await walletClient.writeContract(auth.txData);
// Then deposit
const prepared = await prepareDeposit(params);
await walletClient.writeContract(prepared.txData);
} else if (isAlreadyApprovedAuth(auth)) {
// Deposit directly
const prepared = await prepareDeposit(params);
await walletClient.writeContract(prepared.txData);
}