Skip to main content

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 (tsx for dev, PM2 for production)
  • Runs analyzeRisk() inline on every /queue request — 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 safeSync worker reconciles transactions confirmed or executed there directly
  • Relays execution: the agent EOA submits execTransaction and 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

Data Flow

Rejections execute a pre-signed empty transaction at the same nonce, so a rejected proposal never leaves a nonce hole blocking later transactions.

State

Tech Stack