'use client'; import { useState, useCallback } from 'react'; import { useWallet, useConnection } from '@solana/wallet-adapter-react'; import { WalletMultiButton } from '@solana/wallet-adapter-react-ui'; import { Transaction } from '@solana/web3.js'; type Status = 'idle' | 'creating' | 'signing' | 'verifying' | 'done' | 'error'; interface InvoiceData { transaction: string; memo: string; amount: string; startTime: string; endTime: string; displayAmount: string; } async function signAndSendPayment( txBase64: string, signTransaction: (tx: Transaction) => Promise, connection: ReturnType['connection'], ): Promise { if (!signTransaction) { throw new Error('Wallet does not support signing'); } const tx = Transaction.from(Buffer.from(txBase64, 'base64')); const signedTx = await signTransaction(tx); const signature = await connection.sendRawTransaction(signedTx.serialize(), { skipPreflight: false, preflightCommitment: 'confirmed', }); const latestBlockhash = await connection.getLatestBlockhash('confirmed'); await connection.confirmTransaction( { signature, ...latestBlockhash }, 'confirmed', ); return signature; } export default function RandomNumberGenerator() { const { publicKey, signTransaction, connected } = useWallet(); const { connection } = useConnection(); const [status, setStatus] = useState('idle'); const [randomNumber, setRandomNumber] = useState(null); const [error, setError] = useState(null); const [txSignature, setTxSignature] = useState(null); const handleGenerate = useCallback(async () => { if (!publicKey || !signTransaction) return; setError(null); setRandomNumber(null); setTxSignature(null); setStatus('creating'); try { // Step 1: Create invoice on server const invoiceRes = await fetch('/api/pump-fun/create-invoice', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ walletAddress: publicKey.toBase58() }), }); if (!invoiceRes.ok) throw new Error('Failed to create invoice'); const invoice: InvoiceData = await invoiceRes.json(); // Step 2: Sign and send transaction setStatus('signing'); const signature = await signAndSendPayment( invoice.transaction, signTransaction, connection, ); setTxSignature(signature); // Step 3: Verify payment and get random number setStatus('verifying'); const verifyRes = await fetch('/api/pump-fun/verify-payment', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ walletAddress: publicKey.toBase58(), memo: invoice.memo, amount: invoice.amount, startTime: invoice.startTime, endTime: invoice.endTime, }), }); const result = await verifyRes.json(); if (result.verified) { setRandomNumber(result.randomNumber); setStatus('done'); } else { throw new Error(result.error || 'Payment verification failed'); } } catch (err) { setError(err instanceof Error ? err.message : 'Something went wrong'); setStatus('error'); } }, [publicKey, signTransaction, connection]); return (

Random Number Generator

Pay 0.1 SOL to generate a random number (0-1000)

Powered by pump.fun Tokenized Agent Payments

{connected && (
{publicKey?.toBase58()}
{status === 'verifying' && (
Verifying on-chain payment...
)} {randomNumber !== null && (

Your number:

{randomNumber}

{txSignature && ( View transaction on Solscan )}
)} {error && (

{error}

)}
)} {!connected && (

Connect your Solana wallet to get started

)}
); }