import React, { useState, useEffect } from 'react'; import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from './ui/card'; import { Button } from './ui/button'; import { Badge } from './ui/badge'; import { Input } from './ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs'; import { Alert, AlertDescription, AlertTitle } from './ui/alert'; import { Progress } from './ui/progress'; import { Separator } from './ui/separator'; import { Wallet, Send, Settings, Clock, TrendingUp, AlertTriangle, CheckCircle, ArrowUpRight, ArrowDownLeft, DollarSign, Shield, Activity } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; import { useWallet } from '@/hooks/use-wallet'; interface WalletInfo { agentId: string; owner: string; balance: string; totalAllowance: string; spentAmount: string; spendingLimit: string; transactionCount: number; createdAt: string; lastActivity: string; isActive: boolean; microTransactionEnabled: boolean; } interface Transaction { id: string; agent: string; recipient: string; amount: string; purpose: string; timestamp: string; isMicroTransaction: boolean; status: 'pending' | 'completed' | 'failed'; } interface WalletStats { balance: string; totalAllowance: string; spentAmount: string; remainingAllowance: string; transactionCount: number; utilizationRate: number; } const AgentWallet: React.FC = () => { const { toast } = useToast(); const { isConnected, address } = useWallet(); const [wallets, setWallets] = useState([]); const [selectedWallet, setSelectedWallet] = useState(null); const [transactions, setTransactions] = useState([]); const [walletStats, setWalletStats] = useState(null); const [activeTab, setActiveTab] = useState('overview'); const [loading, setLoading] = useState(true); // Form states const [allowanceAmount, setAllowanceAmount] = useState(''); const [spendingLimit, setSpendingLimit] = useState(''); const [recipient, setRecipient] = useState(''); const [amount, setAmount] = useState(''); const [purpose, setPurpose] = useState(''); const [selectedAgent, setSelectedAgent] = useState(''); // Mock data for demonstration const mockWallets: WalletInfo[] = [ { agentId: 'agent_001', owner: '0x1234...5678', balance: '850.50', totalAllowance: '1000.00', spentAmount: '149.50', spendingLimit: '500.00', transactionCount: 23, createdAt: '2024-01-15T10:30:00Z', lastActivity: '2024-01-25T14:20:00Z', isActive: true, microTransactionEnabled: true }, { agentId: 'agent_002', owner: '0xabcd...efgh', balance: '1200.75', totalAllowance: '2000.00', spentAmount: '799.25', spendingLimit: '1000.00', transactionCount: 45, createdAt: '2024-01-18T09:15:00Z', lastActivity: '2024-01-26T16:45:00Z', isActive: true, microTransactionEnabled: true }, { agentId: 'agent_003', owner: '0x5678...9abc', balance: '450.25', totalAllowance: '500.00', spentAmount: '49.75', spendingLimit: '250.00', transactionCount: 12, createdAt: '2024-01-20T11:45:00Z', lastActivity: '2024-01-24T13:30:00Z', isActive: true, microTransactionEnabled: false } ]; const mockTransactions: Transaction[] = [ { id: 'tx_001', agent: 'agent_001', recipient: 'provider_gpu_001', amount: '0.05', purpose: 'GPU rental - text processing', timestamp: '2024-01-25T14:20:00Z', isMicroTransaction: true, status: 'completed' }, { id: 'tx_002', agent: 'agent_002', recipient: 'provider_gpu_002', amount: '0.15', purpose: 'GPU rental - image processing', timestamp: '2024-01-26T16:45:00Z', isMicroTransaction: true, status: 'completed' }, { id: 'tx_003', agent: 'agent_001', recipient: 'data_provider_001', amount: '2.50', purpose: 'Dataset purchase', timestamp: '2024-01-24T10:15:00Z', isMicroTransaction: false, status: 'completed' } ]; useEffect(() => { // Load mock data setTimeout(() => { setWallets(mockWallets); setTransactions(mockTransactions); if (mockWallets.length > 0) { setSelectedWallet(mockWallets[0]); updateWalletStats(mockWallets[0]); } setLoading(false); }, 1000); }, []); const updateWalletStats = (wallet: WalletInfo) => { const stats: WalletStats = { balance: wallet.balance, totalAllowance: wallet.totalAllowance, spentAmount: wallet.spentAmount, remainingAllowance: (parseFloat(wallet.totalAllowance) - parseFloat(wallet.spentAmount)).toFixed(2), transactionCount: wallet.transactionCount, utilizationRate: (parseFloat(wallet.spentAmount) / parseFloat(wallet.totalAllowance)) * 100 }; setWalletStats(stats); }; const handleGrantAllowance = async () => { if (!isConnected || !selectedWallet || !allowanceAmount) { toast({ title: "Missing Information", description: "Please connect wallet and fill in all fields", variant: "destructive" }); return; } try { // Simulate allowance grant toast({ title: "Granting Allowance", description: `Granting ${allowanceAmount} AITBC to ${selectedWallet.agentId}`, variant: "default" }); // Update wallet state const updatedWallet = { ...selectedWallet, totalAllowance: (parseFloat(selectedWallet.totalAllowance) + parseFloat(allowanceAmount)).toFixed(2), balance: (parseFloat(selectedWallet.balance) + parseFloat(allowanceAmount)).toFixed(2) }; setSelectedWallet(updatedWallet); setWallets(wallets.map(w => w.agentId === updatedWallet.agentId ? updatedWallet : w)); updateWalletStats(updatedWallet); setAllowanceAmount(''); toast({ title: "Allowance Granted", description: `Successfully granted ${allowanceAmount} AITBC to ${selectedWallet.agentId}`, variant: "default" }); } catch (error) { toast({ title: "Grant Failed", description: "There was an error granting the allowance", variant: "destructive" }); } }; const handleUpdateSpendingLimit = async () => { if (!isConnected || !selectedWallet || !spendingLimit) { toast({ title: "Missing Information", description: "Please connect wallet and fill in all fields", variant: "destructive" }); return; } try { // Simulate spending limit update toast({ title: "Updating Spending Limit", description: `Updating spending limit to ${spendingLimit} AITBC`, variant: "default" }); // Update wallet state const updatedWallet = { ...selectedWallet, spendingLimit: spendingLimit }; setSelectedWallet(updatedWallet); setWallets(wallets.map(w => w.agentId === updatedWallet.agentId ? updatedWallet : w)); setSpendingLimit(''); toast({ title: "Spending Limit Updated", description: `Successfully updated spending limit to ${spendingLimit} AITBC`, variant: "default" }); } catch (error) { toast({ title: "Update Failed", description: "There was an error updating the spending limit", variant: "destructive" }); } }; const handleExecuteTransaction = async () => { if (!isConnected || !selectedWallet || !recipient || !amount || !purpose) { toast({ title: "Missing Information", description: "Please fill in all transaction fields", variant: "destructive" }); return; } try { // Simulate transaction execution toast({ title: "Executing Transaction", description: `Sending ${amount} AITBC to ${recipient}`, variant: "default" }); // Create new transaction const newTransaction: Transaction = { id: `tx_${Date.now()}`, agent: selectedWallet.agentId, recipient: recipient, amount: amount, purpose: purpose, timestamp: new Date().toISOString(), isMicroTransaction: parseFloat(amount) < 0.001, status: 'completed' }; // Update wallet state const updatedWallet = { ...selectedWallet, balance: (parseFloat(selectedWallet.balance) - parseFloat(amount)).toFixed(2), spentAmount: (parseFloat(selectedWallet.spentAmount) + parseFloat(amount)).toFixed(2), transactionCount: selectedWallet.transactionCount + 1, lastActivity: new Date().toISOString() }; setSelectedWallet(updatedWallet); setWallets(wallets.map(w => w.agentId === updatedWallet.agentId ? updatedWallet : w)); setTransactions([newTransaction, ...transactions]); updateWalletStats(updatedWallet); // Clear form setRecipient(''); setAmount(''); setPurpose(''); toast({ title: "Transaction Completed", description: `Successfully sent ${amount} AITBC to ${recipient}`, variant: "default" }); } catch (error) { toast({ title: "Transaction Failed", description: "There was an error executing the transaction", variant: "destructive" }); } }; const handleToggleMicroTransactions = async () => { if (!isConnected || !selectedWallet) return; try { const updatedWallet = { ...selectedWallet, microTransactionEnabled: !selectedWallet.microTransactionEnabled }; setSelectedWallet(updatedWallet); setWallets(wallets.map(w => w.agentId === updatedWallet.agentId ? updatedWallet : w)); toast({ title: "Settings Updated", description: `Micro-transactions ${updatedWallet.microTransactionEnabled ? 'enabled' : 'disabled'}`, variant: "default" }); } catch (error) { toast({ title: "Update Failed", description: "There was an error updating the settings", variant: "destructive" }); } }; if (loading) { return (

Loading agent wallets...

); } return (

Agent Wallet Management

Manage and monitor autonomous agent wallets with micro-transaction support

{wallets.length} Active Wallets {transactions.length} Transactions
{/* Wallet Selection */}
Agent Wallets Select an agent wallet to manage {wallets.map((wallet) => (
{ setSelectedWallet(wallet); updateWalletStats(wallet); }} >

{wallet.agentId}

{wallet.isActive ? "Active" : "Inactive"}
Balance: {wallet.balance} AITBC
Spent: {wallet.spentAmount} AITBC
Transactions: {wallet.transactionCount}
{wallet.microTransactionEnabled && ( Micro-transactions )}
))}
{/* Wallet Details */}
{selectedWallet ? ( Overview Transactions Manage Settings {/* Wallet Stats */}
Balance
{walletStats?.balance} AITBC
Total Allowance
{walletStats?.totalAllowance} AITBC
Spent
{walletStats?.spentAmount} AITBC
Transactions
{walletStats?.transactionCount}
{/* Utilization */} Allowance Utilization Current spending vs. total allowance
Spent: {walletStats?.spentAmount} AITBC Remaining: {walletStats?.remainingAllowance} AITBC
{walletStats?.utilizationRate?.toFixed(1)}% utilized
{/* Recent Activity */} Recent Activity Latest transactions and wallet events
{transactions.slice(0, 5).map((tx) => (

{tx.purpose}

To: {tx.recipient.slice(0, 8)}...{tx.recipient.slice(-6)}

{tx.amount} AITBC

{new Date(tx.timestamp).toLocaleDateString()}

))}
Transaction History All transactions for this agent wallet
{transactions.map((tx) => (

{tx.purpose}

{tx.isMicroTransaction ? 'Micro-transaction' : 'Standard transaction'}

To: {tx.recipient}

{tx.amount} AITBC

{new Date(tx.timestamp).toLocaleString()}

{tx.status}
))}
{/* Grant Allowance */} Grant Allowance Add funds to the agent's allowance
setAllowanceAmount(e.target.value)} />
{/* Execute Transaction */} Execute Transaction Send funds from agent wallet
setRecipient(e.target.value)} />
setAmount(e.target.value)} />
setPurpose(e.target.value)} />
{/* Update Spending Limit */} Update Spending Limit Set maximum spending limit per period
setSpendingLimit(e.target.value)} />
{/* Wallet Settings */} Wallet Settings Configure agent wallet behavior

Micro-transactions

Enable transactions below 0.001 AITBC

Wallet Information

Agent ID:

{selectedWallet.agentId}

Owner:

{selectedWallet.owner.slice(0, 8)}...{selectedWallet.owner.slice(-6)}

Created:

{new Date(selectedWallet.createdAt).toLocaleDateString()}

Last Activity:

{new Date(selectedWallet.lastActivity).toLocaleDateString()}

{/* Security */} Security Security settings and permissions Wallet Secured This agent wallet is protected by smart contract security measures and spending limits.
) : (

Select an agent wallet to manage

)}
); }; export default AgentWallet;