import React, { useState, useEffect } from 'react'; import { Shield, Users, CheckCircle, XCircle, ExternalLink } from 'lucide-react'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { usePolkadot } from '@/contexts/PolkadotContext'; import { getMultisigMemberInfo, calculateMultisigAddress, USDT_MULTISIG_CONFIG, formatMultisigAddress, } from '@pezkuwi/lib/multisig'; import { getTikiDisplayName, getTikiEmoji } from '@pezkuwi/lib/tiki'; interface MultisigMembersProps { specificAddresses?: Record; showMultisigAddress?: boolean; } export const MultisigMembers: React.FC = ({ specificAddresses = {}, showMultisigAddress = true, }) => { const { api, isApiReady } = usePolkadot(); const [members, setMembers] = useState([]); const [multisigAddress, setMultisigAddress] = useState(''); const [loading, setLoading] = useState(true); useEffect(() => { if (!api || !isApiReady) return; const fetchMembers = async () => { setLoading(true); try { const memberInfo = await getMultisigMemberInfo(api, specificAddresses); setMembers(memberInfo); // Calculate multisig address const addresses = memberInfo.map((m) => m.address); if (addresses.length > 0) { const multisig = calculateMultisigAddress(addresses); setMultisigAddress(multisig); } } catch (error) { console.error('Error fetching multisig members:', error); } finally { setLoading(false); } }; fetchMembers(); }, [api, isApiReady, specificAddresses]); if (loading) { return (
); } return ( {/* Header */}

USDT Treasury Multisig

{USDT_MULTISIG_CONFIG.threshold}/{members.length} Signatures Required

{members.length} Members
{/* Multisig Address */} {showMultisigAddress && multisigAddress && (

Multisig Account

{formatMultisigAddress(multisigAddress)}
)} {/* Members List */}
{members.map((member, index) => (
{getTikiEmoji(member.tiki)}

{member.role}

{getTikiDisplayName(member.tiki)} {member.isUnique && ( On-Chain )}
{member.address.slice(0, 6)}...{member.address.slice(-4)}
{member.isUnique ? ( ) : ( )}
))}
{/* Info Alert */}

Security Features

  • • {USDT_MULTISIG_CONFIG.threshold} out of {members.length} signatures required
  • • {members.filter(m => m.isUnique).length} members verified on-chain via Tiki
  • • No single person can control funds
  • • All transactions visible on blockchain
{/* Explorer Link */} {multisigAddress && (
View on Polkadot.js
)}
); };