SenddySenddy Docs

Architecture

High-level overview of how Senddy works under the hood.

System Overview

Senddy is a privacy-preserving payment system built on zero-knowledge proofs, smart contracts, and a trusted execution environment. Here's how the pieces fit together.

Components

Client (Browser/Mobile)

The user's device handles:

  • Key derivation — Senddy keys are derived from an EIP-712 signature, no seed phrase needed
  • Note management — Tracking which private "notes" belong to you via the sync engine
  • Proof generation — Zero-knowledge proofs are generated client-side in 2-5 seconds using WebAssembly
  • Memo encryption — Encrypted using X25519 ECDH + XChaCha20-Poly1305

Smart Contracts (Base)

The on-chain contracts include:

  • Pool Contract — The main contract that holds all funds and processes deposits, shields, spends, and withdrawals
  • Verifier Contracts — Verify zero-knowledge proofs for shield and spend operations
  • Yield Strategy — Manages yield generation by deploying funds to trusted DeFi lending protocols

Attestor Service

The attestor verifies ZK proofs off-chain in a hardware-isolated trusted execution environment (TEE):

  • Runs in a secure enclave — isolated, tamper-proof, no persistent storage
  • Verifies proofs using the UltraHonk verifier
  • Signs attestations via a hardware security module (HSM) — the signing key never leaves the enclave

Data Indexer

Indexes on-chain events for efficient querying:

  • Commitments, nullifiers, deposits, withdrawals
  • Pool state and asset statistics
  • Daily aggregated data

Relayer Network

Enables gasless transactions:

  • Users never need ETH for gas
  • Transaction fees are embedded in the ZK circuit
  • Relayed via a third-party relayer network for reliable execution

Transaction Flow

Deposit and Shield

  1. User deposits USDC into the pool contract (public transaction)
  2. Client generates a shield proof — proves the deposit converts to valid private notes
  3. Attestor verifies the proof in the secure enclave
  4. Attestor signs an attestation
  5. The shield transaction is submitted on-chain with the attestation
  6. Private notes (commitments) are added to the Merkle tree

Private Transfer (Spend)

  1. Client selects notes to spend and constructs new output notes
  2. Client generates a spend proof — proves:
    • The input notes exist in the Merkle tree
    • The user knows the secret keys for those notes
    • The input and output values balance (conservation)
    • The nullifiers are correctly derived
  3. Attestor verifies the proof and signs an attestation
  4. The spend transaction is submitted on-chain
  5. Input note nullifiers are recorded (preventing double-spend)
  6. New output note commitments are added to the Merkle tree

Withdrawal

Same as a spend, but one of the output notes is a "withdrawal" that sends USDC to a public Ethereum address.

Key Design Decisions

  • Universal setup — Our proving system uses a universal trusted setup, meaning the same setup ceremony works for any circuit. No per-circuit trusted setup required, and the system can be upgraded without new ceremonies.
  • Attestation-based verification — Proofs are verified off-chain in a TEE rather than on-chain, reducing gas costs dramatically
  • UTXO model — Like Bitcoin/Zcash, not account-based. Each "note" is a discrete value that can be spent atomically
  • Client-side proving — Proofs are generated on the user's device, so no server ever sees transaction details
  • Gasless transactions — Fees are embedded in the ZK circuit and paid from the user's private balance

On this page