Components
Client
- Next.js 14 App Router, React 18, TypeScript, Tailwind CSS, Framer Motion
- Privy auth — Google OAuth + embedded wallet, or wallet login (MetaMask / Rabby as the signing key), plus a signature-free backup-key link
- Wallets are Safe multisigs with computed profiles — starter / guarded / protected / detached
- Signs standard SafeTxs (EIP-712), 1 of the threshold, then POSTs to
/queue - WalletConnect v2 — acts as a wallet for DApps; requests flow through the same pipeline
- Portfolio via Zerion API (live balances, prices, 24h change)
Server
- Express with TypeScript (
tsxfor dev, PM2 for production) - Runs
analyzeRisk()inline on every/queuerequest — no async roundtrip - Hard-validates every proposal: signature recovery against the recorded owner set, threshold arithmetic for screening-off, and owner-management transitions
- Mirrors every proposal to the Safe Transaction Service so it appears in app.safe.global at 1/2; a
safeSyncworker reconciles transactions confirmed or executed there directly - Relays execution: the agent EOA submits
execTransactionand pays BNB gas — relay-only (no agent signature) whenever user signatures meet the threshold - Derives addresses server-side through a versioned registry; user records and transactions persist in Supabase (Postgres)
Agent
- NanoBot/Hermes skill pack — holds the agent owner key
- Responds to Telegram commands from the owner
- Runs deep analysis (GoPlus + Honeypot.is) on REVIEW-tier transactions
- Records patterns after every confirmed transaction
- Never signs unscreened transactions — with screening off it either relays only (v2) or, for legacy v1 accounts, co-signs by explicit exemption
