import React, { useState, useEffect } from 'react'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { useWallet } from '@/contexts/WalletContext'; import { X, AlertCircle, Loader2, CheckCircle, Info } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { useToast } from '@/hooks/use-toast'; interface InitializeHezPoolModalProps { isOpen: boolean; onClose: () => void; onSuccess?: () => void; } type TransactionStatus = 'idle' | 'signing' | 'submitting' | 'success' | 'error'; export const InitializeHezPoolModal: React.FC = ({ isOpen, onClose, onSuccess, }) => { const { api, isApiReady } = usePezkuwi(); const { account, signer } = useWallet(); const { toast } = useToast(); const [hezAmount, setHezAmount] = useState('100000'); const [hezBalance, setHezBalance] = useState('0'); const [whezBalance, setWhezBalance] = useState('0'); const [txStatus, setTxStatus] = useState('idle'); const [errorMessage, setErrorMessage] = useState(''); // Reset form when modal closes useEffect(() => { if (!isOpen) { setHezAmount('100000'); setTxStatus('idle'); setErrorMessage(''); } }, [isOpen]); // Fetch balances useEffect(() => { const fetchBalances = async () => { if (!api || !isApiReady || !account) return; try { // HEZ balance (native) const balance = await api.query.system.account(account); const freeBalance = balance.data.free.toString(); setHezBalance(freeBalance); // wHEZ balance (asset 0) const whezData = await api.query.assets.account(0, account); setWhezBalance(whezData.isSome ? whezData.unwrap().balance.toString() : '0'); } catch (error) { if (process.env.NODE_ENV !== 'production') console.error('Failed to fetch balances:', error); } }; fetchBalances(); }, [api, isApiReady, account]); const handleWrap = async () => { if (!api || !isApiReady || !signer || !account) { toast({ title: 'Error', description: 'Please connect your wallet', variant: 'destructive', }); return; } const hezAmountRaw = BigInt(parseFloat(hezAmount) * 10 ** 12); if (hezAmountRaw <= BigInt(0)) { setErrorMessage('Amount must be greater than zero'); return; } if (hezAmountRaw > BigInt(hezBalance)) { setErrorMessage('Insufficient HEZ balance'); return; } setTxStatus('signing'); setErrorMessage(''); try { if (process.env.NODE_ENV !== 'production') console.log('🔄 Wrapping HEZ to wHEZ...', { hezAmount, hezAmountRaw: hezAmountRaw.toString(), }); const wrapTx = api.tx.tokenWrapper.wrap(hezAmountRaw.toString()); setTxStatus('submitting'); await wrapTx.signAndSend( account, { signer }, ({ status, dispatchError, events }) => { if (process.env.NODE_ENV !== 'production') console.log('📦 Transaction status:', status.type); if (status.isInBlock) { if (process.env.NODE_ENV !== 'production') console.log('✅ In block:', status.asInBlock.toHex()); if (dispatchError) { let errorMsg = ''; if (dispatchError.isModule) { const decoded = api.registry.findMetaError(dispatchError.asModule); errorMsg = `${decoded.section}.${decoded.name}: ${decoded.docs.join(' ')}`; if (process.env.NODE_ENV !== 'production') console.error('❌ Module error:', errorMsg); } else { errorMsg = dispatchError.toString(); if (process.env.NODE_ENV !== 'production') console.error('❌ Dispatch error:', errorMsg); } setErrorMessage(errorMsg); setTxStatus('error'); toast({ title: 'Transaction Failed', description: errorMsg, variant: 'destructive', }); } else { if (process.env.NODE_ENV !== 'production') console.log('✅ Wrap successful!'); if (process.env.NODE_ENV !== 'production') console.log('📋 Events:', events.map(e => e.event.method).join(', ')); setTxStatus('success'); toast({ title: 'Success!', description: `Successfully wrapped ${hezAmount} HEZ to wHEZ`, }); setTimeout(() => { onSuccess?.(); onClose(); }, 2000); } } } ); } catch (error) { if (process.env.NODE_ENV !== 'production') console.error('Wrap failed:', error); setErrorMessage(error instanceof Error ? error.message : 'Transaction failed'); setTxStatus('error'); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Wrap failed', variant: 'destructive', }); } }; if (!isOpen) return null; const hezBalanceDisplay = (parseFloat(hezBalance) / 10 ** 12).toFixed(4); const whezBalanceDisplay = (parseFloat(whezBalance) / 10 ** 12).toFixed(4); return (
Wrap HEZ to wHEZ
Admin Only - Token Wrapping
{/* Info Banner */} Convert native HEZ tokens to wHEZ (wrapped HEZ) tokens for use in DEX pools. Ratio is always 1:1. {/* HEZ Amount */}
Balance: {hezBalanceDisplay} HEZ
setHezAmount(e.target.value)} placeholder="1000" className="w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg text-white text-lg" disabled={txStatus === 'signing' || txStatus === 'submitting'} />

💡 You will receive {hezAmount} wHEZ (1:1 ratio)

{/* Current wHEZ Balance */}
Current wHEZ Balance
{whezBalanceDisplay} wHEZ
{/* Error Message */} {errorMessage && ( {errorMessage} )} {/* Success Message */} {txStatus === 'success' && ( Successfully wrapped {hezAmount} HEZ to wHEZ! )} {/* Action Buttons */}
); };