// packages/dapp-kit/src/hooks/bitcoin/useRenewUtxos.ts import { normalizePsbtToBase64, type IBitcoinWalletProvider } from '@sodax/sdk'; import { useQueryClient } from '@tanstack/react-query'; import { loadRadfiSession } from './useRadfiAuth.js'; import { useSodaxContext } from '../shared/useSodaxContext.js'; import type { MutationHookParams } from '../shared/types.js'; import { useSafeMutation, type SafeUseMutationResult } from '../shared/useSafeMutation.js'; export type UseRenewUtxosVars = { txIdVouts: string[]; walletProvider: IBitcoinWalletProvider; }; /** * React hook for renewing expired UTXOs in the user's Radfi trading wallet. Pure mutation: pass * `{ txIdVouts, walletProvider }` to `mutate({...})`. */ export function useRenewUtxos({ mutationOptions, }: MutationHookParams = {}): SafeUseMutationResult { const { sodax } = useSodaxContext(); const queryClient = useQueryClient(); return useSafeMutation({ mutationKey: ['bitcoin', 'renewUtxos'], ...mutationOptions, mutationFn: async ({ txIdVouts, walletProvider }) => { const radfi = sodax.spoke.bitcoin.radfi; const userAddress = await walletProvider.getWalletAddress(); const session = loadRadfiSession(userAddress); const accessToken = session?.accessToken || radfi.accessToken; if (!accessToken) { throw new Error('Radfi authentication required. Please login first.'); } const buildResult = await radfi.buildRenewUtxoTransaction({ userAddress, txIdVouts }, accessToken); const signedTx = await walletProvider.signTransaction(buildResult.base64Psbt, false); const signedBase64Tx = normalizePsbtToBase64(signedTx); return radfi.signAndBroadcastRenewUtxo({ userAddress, signedBase64Tx }, accessToken); }, onSuccess: async (data, vars, ctx) => { queryClient.invalidateQueries({ queryKey: ['bitcoin', 'expiredUtxos'] }); queryClient.invalidateQueries({ queryKey: ['bitcoin', 'tradingWalletBalance'] }); await mutationOptions?.onSuccess?.(data, vars, ctx); }, }); }