import React, { useState, useEffect } from 'react'; import { DollarSign, TrendingUp, Shield, AlertTriangle, RefreshCw, ExternalLink } from 'lucide-react'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { usePolkadot } from '@/contexts/PolkadotContext'; import { getWUSDTTotalSupply, checkReserveHealth, formatWUSDT } from '@pezkuwi/lib/usdt'; import { MultisigMembers } from './MultisigMembers'; interface ReservesDashboardProps { specificAddresses?: Record; offChainReserveAmount?: number; // Manual input for MVP } export const ReservesDashboard: React.FC = ({ specificAddresses = {}, offChainReserveAmount = 0, }) => { const { api, isApiReady } = usePolkadot(); const [wusdtSupply, setWusdtSupply] = useState(0); const [offChainReserve, setOffChainReserve] = useState(offChainReserveAmount); const [collateralRatio, setCollateralRatio] = useState(0); const [isHealthy, setIsHealthy] = useState(true); const [loading, setLoading] = useState(true); const [lastUpdate, setLastUpdate] = useState(new Date()); // Fetch reserve data const fetchReserveData = async () => { if (!api || !isApiReady) return; setLoading(true); try { const supply = await getWUSDTTotalSupply(api); setWusdtSupply(supply); const health = await checkReserveHealth(api, offChainReserve); setCollateralRatio(health.collateralRatio); setIsHealthy(health.isHealthy); setLastUpdate(new Date()); } catch (error) { console.error('Error fetching reserve data:', error); } finally { setLoading(false); } }; useEffect(() => { fetchReserveData(); // Auto-refresh every 30 seconds const interval = setInterval(fetchReserveData, 30000); return () => clearInterval(interval); }, [api, isApiReady, offChainReserve]); const getHealthColor = () => { if (collateralRatio >= 105) return 'text-green-500'; if (collateralRatio >= 100) return 'text-yellow-500'; return 'text-red-500'; }; const getHealthStatus = () => { if (collateralRatio >= 105) return 'Healthy'; if (collateralRatio >= 100) return 'Warning'; return 'Critical'; }; return (
{/* Header */}

USDT Reserves Dashboard

Real-time reserve status and multisig info

{/* Key Metrics */}
{/* Total Supply */}

Total wUSDT Supply

${formatWUSDT(wusdtSupply)}

On-chain (Assets pallet)

{/* Off-chain Reserve */}

Off-chain USDT Reserve

${formatWUSDT(offChainReserve)}

setOffChainReserve(parseFloat(e.target.value) || 0)} className="w-24 text-xs bg-gray-700 border border-gray-600 rounded px-2 py-1 text-white" placeholder="Amount" />
{/* Collateral Ratio */}

Collateral Ratio

{collateralRatio.toFixed(2)}%

{getHealthStatus()}
{/* Health Alert */} {!isHealthy && (

Under-collateralized!

Reserve ratio is below 100%. Off-chain USDT reserves ({formatWUSDT(offChainReserve)}) are less than on-chain wUSDT supply ({formatWUSDT(wusdtSupply)}).

)} {/* Tabs */} Overview Multisig Proof of Reserves {/* Overview Tab */}

Reserve Details

On-chain wUSDT ${formatWUSDT(wusdtSupply)}
Off-chain USDT ${formatWUSDT(offChainReserve)}
Backing Ratio {collateralRatio.toFixed(2)}%
Status {getHealthStatus()}
Last Updated {lastUpdate.toLocaleTimeString()}

1:1 Backing

Every wUSDT is backed by real USDT held in the multisig treasury. Target ratio: ≥100% (ideally 105% for safety buffer).

{/* Multisig Tab */} {/* Proof of Reserves Tab */}

Proof of Reserves

How to Verify Reserves:

  1. Check on-chain wUSDT supply via Polkadot.js Apps
  2. Verify multisig account balance (if reserves on-chain)
  3. Compare with off-chain treasury (bank/exchange account)
  4. Ensure ratio ≥ 100%

Note: Off-chain Reserves

In this MVP implementation, off-chain USDT reserves are manually reported. For full decentralization, consider integrating with oracle services or using XCM bridge for on-chain verification.

); };