import { useState, useCallback } from 'react'; import { useDubs } from '../provider'; import { signAndSendBase64Transaction } from '../utils/transaction'; import type { MutationStatus } from '../types'; export interface EnterJackpotMutationResult { roundId: string; amount: string; amountSol: number; signature: string; } export function useEnterJackpot() { const { client, wallet, connection } = useDubs(); const [status, setStatus] = useState('idle'); const [error, setError] = useState(null); const [data, setData] = useState(null); const reset = useCallback(() => { setStatus('idle'); setError(null); setData(null); }, []); const execute = useCallback(async (amountLamports: number): Promise => { if (!wallet.publicKey) throw new Error('Wallet not connected'); const walletAddress = wallet.publicKey.toBase58(); setStatus('building'); setError(null); setData(null); try { // 1. Build unsigned transaction console.log('[useEnterJackpot] Step 1: Building transaction...', { walletAddress, amountLamports }); const buildResult = await client.buildJackpotEnter(walletAddress, amountLamports); console.log('[useEnterJackpot] Step 1 done:', { roundId: buildResult.roundId, amount: buildResult.amount }); // 2. Sign and send transaction setStatus('signing'); console.log('[useEnterJackpot] Step 2: Signing and sending...'); const signature = await signAndSendBase64Transaction( buildResult.transaction, wallet, connection, ); console.log('[useEnterJackpot] Step 2 done. Signature:', signature); // 3. Confirm entry with backend (creates developer attribution) setStatus('confirming'); console.log('[useEnterJackpot] Step 3: Confirming with backend...'); await client.confirmJackpotEnter({ playerAddress: walletAddress, roundId: buildResult.roundId, amount: amountLamports, signature, }); console.log('[useEnterJackpot] Step 3 done. Entry confirmed + attributed.'); const result: EnterJackpotMutationResult = { roundId: buildResult.roundId, amount: buildResult.amount, amountSol: buildResult.amountSol, signature, }; setData(result); setStatus('success'); return result; } catch (err) { console.error('[useEnterJackpot] FAILED:', err); const e = err instanceof Error ? err : new Error(String(err)); setError(e); setStatus('error'); throw e; } }, [client, wallet, connection]); return { execute, status, error, data, reset }; }