Nox

Private perp DEX trading with ZK notes and a proxy linking dark pool to ClearingHouse.

Nox

Created At

ETHGlobal New Delhi

Winner of

ETHGlobal

ETHGlobal - 🏆 ETHGlobal New Delhi 2025 Finalist

Project Description

Nox is a privacy-preserving trading layer for perpetual futures. Users deposit tokens into a dark pool where balances are represented as ZK notes instead of public addresses. A PrivacyProxy owns all on-chain positions on the underlying ClearingHouseV2, while real user ownership is tracked off-chain using signatures derived from a private “dark-pool secret.” This lets traders open/close positions and move collateral without revealing their identity or balances on-chain.

Funds flow in two directions:

  • Into the DEX: Users prove note ownership in the TokenPool using ZK (withdraw/transfer proofs). The pool “approvesWithdrawal” and the PrivacyProxy pulls collateral, credits private free-collateral for the user’s pubkey, and deposits into ClearingHouseV2.
  • Back to the dark pool: Users sign a withdraw intent; the proxy withdraws collateral from ClearingHouseV2 and calls TokenPool.depositFor to mint a new private note to the user’s receiver hash.

An HTTP backend indexes on-chain events and serves a privacy-aware API. It tracks open/historical positions per user pubkey and maintains a local view of unspent notes keyed by receiver hash. The frontend bootstraps a per-user secret via a signed message, derives a pubkey and receiver hash, and interacts with the backend using signed headers. As a result, positions and balances can be queried privately, while the public ledger only shows activity of the proxy and the DEX.

How it's Made

Smart contracts (Solidity):

  • TokenPool: Private note system with Poseidon commitments, incremental Merkle tree, nullifiers, and two ZK verifiers (Claim and Withdraw/Transfer). Supports deposit, withdraw, transfer, claim, approveWithdrawal, and depositFor.
  • PrivacyProxy: Bridges the dark pool and ClearingHouseV2. Manages per-user free collateral mapped by a pubkey (keccak of the user’s secret EOA). Requires ECDSA signatures over action-specific messages to authorize trading or withdrawals.
  • ClearingHouseV2: Minimal perp engine with collateral accounting, fees, PnL, margin checks, liquidations, and position events. Collateral token is mintable for positive PnL to settle profit into the system.
  • ZK verifiers: Ultra Honk-based on-chain verifiers for claim and withdraw/transfer circuits.
  • Libraries: Poseidon2, Merkle tree, ProofLib for public input decoding.

ZK Circuits (Noir):

  • Claim circuit merges a new claim with an existing commitment via Lean IMT inclusion proofs and Poseidon hashing, enforcing correct receiver secret and (optional) previous state accumulation.
  • Withdraw/Transfer circuit (in repo) validates spending via nullifier, root inclusion, and new commitment computation for change notes.

Backend (Rust, Axum + sled + ethers):

  • Dual services: API server and indexer.
  • Indexer queries logs from PrivacyProxy, ClearingHouseV2, and TokenPool (NoteCreated/NoteClaimed) and persists:
    • Open positions by user pubkey (private), historical positions (closed/liquidated), and public positions by EOA for transparency.
    • Unspent notes by receiver hash, allowing users to fetch notes privately using only their hash.
  • API endpoints require signed headers. Server derives the same pubkey as the contracts (keccak of recovered EOA), aligning off-chain identity with on-chain checks. Also stores small encrypted metadata blobs per user (e.g., last-used nullifier nonce and latest commitment info).

Frontend (Vite + React + wagmi + Zustand + axios):

  • On “private mode” init, asks the user to sign a message; derives a private key used to form a “secret wallet,” then derives:
    • pubKey: keccak(address(secretWallet))
    • receiverHash: Poseidon(receiverSecret)
  • Uses signed headers to call the backend for:
    • Private open/historical positions pagination
    • Unspent notes for the user’s receiver hash
    • Small encrypted metadata storage (to track nullifier nonce and commitment leaf index)
  • Public mode can view public open positions by EOA via indexer endpoints.

Integrations and hacky bits:

  • The proxy pattern concentrates all public DEX activity under PrivacyProxy, hiding actual owners while preserving correctness with signatures bound to a derived pubkey.
  • sled is used for a lightweight append-only style DB to serve fast pagination and note lookups without external infra.
  • The indexer converts websocket RPC to HTTP polling to safely chunk through historical ranges and avoid missed events, with retry loops and chunking to handle RPC limits.
  • Mint-on-profit in ClearingHouseV2 simplifies PnL settlement for a hackathon demo environment.

Partner/stack benefits:

  • Noir/Honk verifiers on-chain let us prove note ownership and state transitions without revealing identities.
  • Ethers + Axum provide a fast Rust indexer and HTTP server.
  • wagmi and ethers on the frontend streamline wallet interactions and message signing.

This delivers privacy-preserving perp trading: users keep balances and actions private in a ZK note system, while a proxy safely intermediates interaction with a standard DEX.

background image mobile

Join the mailing list

Get the latest news and updates