panoplia.eth

Non-custodial MPC wallet: privacy-first deposits, fiat ramps, and DeFi yield.

panoplia.eth

Created At

HackMoney 2026

Project Description

Panoplia is an MPC wallet that plugs directly into ZKP2P for fiat on/off-ramping. Pay with Venmo, Zelle, Cash App, or Wise — a zero-knowledge proof settles the trade on-chain, no KYC middleman in the loop. Off-ramp by locking USDC into a contract and letting a peer send fiat; the ZK proof handles the rest. We pair that with 2-of-2 threshold signing (Vultisig), LiFi privacy routing to fresh addresses, and optional DeFi yield entry at deposit time so funds never sit idle.

How it's Made

The project is split into five repos stitched together as git submodules:

  • panoplia.mpc: Express + TypeScript server that wraps the Vultisig SDK (WASM). It runs 2-of-2 MPC key generation and co-signing ceremonies through Vultisig's relay — the server fires the ceremony in a background promise, returns session info immediately, and the client joins from its own SDK instance in the browser. Vault shares are encrypted at rest with AES-256-GCM (scrypt-derived key from a master secret, random salt + IV per write). SQLite (better-sqlite3, WAL mode) stores everything — vault metadata, derived addresses across Ethereum/Bitcoin/Solana, transaction audit logs, and Shamir recovery configs. Social recovery uses Privy's shamir-secret-sharing library to split shares across guardians with a 72-hour recovery window.

  • panoplia.peer: Our React hooks library wrapping @zkp2p/sdk. On-ramp uses a strategy pattern: in a browser it talks to the PeerAuth Chrome extension (checks window.peer), in Electron it falls back to a redirect strategy that opens the system browser. Off-ramp is a standard REST client (OfframpClient from the SDK) — deposit USDC into a contract, peers match and send fiat, ZK proof settles it. One gotcha worth mentioning: getPaymentMethodsCatalog() in the ZKP2P SDK is synchronous, not async, so we use useMemo instead of useEffect for it.

  • panoplia.lifi (published as panoplia.swap): Wraps @lifi/sdk v3 for token discovery, swap routing, cross-chain bridges, and "zap" hooks that bundle a swap + contract call into one transaction. We use this for the privacy routing feature: LiFi moves funds to a fresh address that's still controlled by the same MPC key pair.

  • panoplia.app: Electron 39 desktop wallet built with electron-vite + React 19 + Tailwind v4. State lives in two Zustand stores (auth + wallet). The window is sized to 480x860 to feel like a mobile wallet. Uses Radix UI primitives and shadcn components.

  • panoplia.demo: Web-only version of the same app (React 18, Vite, wagmi + viem for wallet connection, Tailwind v3). Runs alongside the MPC server via concurrently. Dockerized as a two-stage build, first stage clones the repo, builds the submodule libraries, builds the Vite app; second stage serves it from nginx with SPA fallback. Playwright handles E2E tests across auth, wallet creation (which triggers an actual MPC keygen), and navigation guards.

All libraries (peer, lifi) are built with tsup to dual-publish ESM + CJS, consumed as file: dependencies in the demo.

background image mobile

Join the mailing list

Get the latest news and updates

panoplia.eth | ETHGlobal