Zenon AMM

Project Name: Zenon AMM: a custodial swap venue on NoM

Description: A swap venue for ZTS pairs on the Network of Momentum. It prices trades with Uniswap V2’s constant-product curve and settles on-chain against its own reserves. It is closer to Boltz or SideShift than to Uniswap: NoM has ten fixed embedded contracts, no way to add one, and frozen sporks, so no contract can hold a pool. A key has to.

It is custodial, and says so. What it adds is making that key as accountable as possible:

  • The price is recomputable by anyone. Quotes are x·y=k over published reserves, so anyone can check they were paid what they were owed.
  • Swaps above a cap settle as a pair of HTLCs, so the venue can’t take your input and pay nothing.
  • LP shares are real ZTS tokens held in your own wallet.
  • Solvency is arithmetic anyone can do from L1 with amm-audit.
  • Terms sit in an append-only, hash-chained policy record on-chain.

Why it matters for Zenon: a ZTS has no standing, priced market on NoM today. Trading one means finding a counterparty and negotiating (a Syrius P2P swap, OTC, or off-chain). This venue:

  • Gives any token a market through permissionless pool creation.
  • Pays LPs the fee.
  • Needs no spork, so it doesn’t wait on an upgrade path that currently has no date.

URL: Source to be published at https://github.com/sol-znn (currently private while the proof of concept is in development).

Docs: https://pdflink.to/623f5d80/

WIP Interface:

Team:

  • sol: design, implementation, testing, documentation. Also built Ferry (atomic swaps) and verified FROST-Ed25519 threshold signing on NoM, both of which this venue is built on.

Phases

Phase 1: The venue, from devnet proof of concept to a deployable release

High-level overview of main tasks:

  • Built and verified on the go-zenon devnet:
    • engine/curve: Uniswap V2’s curve over base units (swaps, single-sided zap in and out, feeTo operator fee as minted shares, the 1,000-share minimum), tested against Uniswap V2’s own vectors to the base unit
    • Three settlement modes:
      • custodial under a published cap, paid from the operator’s own float
      • atomic above the cap, as two htlc entries with the pool holding the preimage
      • degen, opt-in and uncapped with no protection, which the user must arm and name, which auto never selects, and which the policy record discloses
    • A quote is an address, so any wallet or exchange withdrawal works. Deposit addresses are pre-fused with plasma so they don’t mine PoW
    • A block journal that writes each block down before signing it, so a crash leaves a state the chain can settle
    • LP share ZTS, permissionless pool creation, multi-hop routing through the ZNN hub, and the hash-chained policy record
    • FROST t-of-n (RFC 9591, Ed25519) committee keys for pool reserves, with a FROST-signed block confirmed to be accepted by go-zenon
    • amm-audit (L1-only solvency audit), ammd (daemon, API, and web page on the Zenon design system), and e2e (every flow over the API)
  • Remaining:
    1. Publish the source
    2. Distributed key generation and separate signer processes (today every share lives in one process)
    3. Signer-side price enforcement: each signer re-derives the curve and refuses a mismatched payout
    4. A watchtower that reclaims a user’s leg if the venue is down past the deadline
    5. Replace the devnet demo wallet with the Syrius browser extension
    6. Encrypt operator key storage
    7. Mainnet measurement and a public deployment with a published hot-float cap

Completion of Phase 1 will be measured by:

  • :white_check_mark: Every flow settled end to end on devnet (2026-09-13):
    • custodial swap 30 s
    • atomic swap 1 m 51 s
    • degen swap of 250 ZNN in 30 s
    • two-hop atomic swap 2 m 0 s
    • deposit 1 m 9 s, withdrawal 27 s
    • pool creation 5 m 21 s
  • :white_check_mark: A hard kill mid-settlement recovered without paying twice: the hot float came out at exactly 500 ZNN and 5,000 QSR
  • :white_check_mark: amm-audit closed with every gap at exactly zero, and √k per share rose, showing the fee reached LPs
  • :hourglass_not_done: Source public, signers running as separate processes from a DKG, and signers refusing a payout that doesn’t match the curve
  • :hourglass_not_done: Watchtower running, and swaps driven from the Syrius extension rather than the demo wallet
  • :hourglass_not_done: Latency re-measured on mainnet, and a public deployment with its policy record live
  • :hourglass_not_done: Security audit completed, and any findings addressed

Funding

Total Requested Funding = 10,000 ZNN and 100,000 QSR
Project Duration = 2-4 weeks

How did you calculate your budget?

  • Scope.
    • The amm curve engine, three settlement state machines, a FROST implementation, the chain client, the auditor, the daemon and the web page.
    • The remaining work is the part that turns a demo into a venue: distributed keys, signer-side enforcement, a watchtower, and a mainnet deployment.
  • Split. The request is filed as two maximum-size projects, matching the two halves of the work: (1) the venue as built and verified, and (2) the path off devnet.

Project and Payment Milestones:

Phase 1, the venue as built and on mainnet
Funding Request:

  • sol: 10,000 ZNN and 100,000 QSR
    Duration: delivered on mainnet; paid when the source is published

Other Information

Risks, Assumptions, Known Issues, Dependencies:

  • The price is a signed promise on every path, not something the chain enforces. On the atomic path the pool sets leg B after the user’s leg is funded and holds the preimage. The user can neither refuse a short leg B nor reclaim ahead of it. A short fill is provable against the signed quote and public reserves, but that is reputational recourse, not a contract.
  • LP capital is custodial. Nothing on mainnet today offers pooled passive liquidity together with self-custody.
  • Degen mode removes every protection. Whether it ships enabled is an operator decision to settle in this thread.
  • Devnet numbers don’t carry over. The devnet runs v2 momentums with dynamic plasma, while mainnet runs v1 with a 100-block-per-momentum cap. Every latency figure is re-measured on mainnet before it’s shown to users.
  • Deposit-address plasma. The plasma contract locks each stake for ten hours, so the stake budget has to be sized against the real quote rate.
  • Open decisions:
    • The hot-float cap (currently 1,000 ZNN, with 100 ZNN per trade)
    • The signer set and threshold (who, how many, how they are paid)
    • Whether the ZNN/QSR pool should be seeded by the operator before outside LPs arrive

Have you previously submitted a proposal (either in Accelerator-Z or Incubator)?

Fees and economics. 30 bps: 25 to LPs and 5 to the operator, taken as minted LP shares (Uniswap V2’s split and mechanism). Fees accrue into reserves, so a share grows in value rather than paying a stream. That keeps every claim on a pool a readable ZTS balance.

On-chain filing.

Project name Funds
Zenon AMM (1/2) 5,000 ZNN / 50,000 QSR
Zenon AMM (2/2) 5,000 ZNN / 50,000 QSR

Documentation (published with the source):

  • PLAN.md: design, prior art, trust ladder, economics
  • docs/PHASE0.md: spike measurements
  • docs/POC.md: running-venue measurements
  • docs/amm-settlement-paths.pdf: every flow drawn with its trust assumptions
1 Like

Discontinuing this plan in order to focus on ZVM. It will natively support AMMs with much fewer trust assumptions/risks.

1 Like

NoM currently has no practical way to provide standing on-chain liquidity for arbitrary ZTS pairs, and I think this is a reasonable attempt to fill that gap under the constraints the network has today.

What I particularly appreciate is that the proposal doesn’t pretend the system is trustless where it isn’t. LP capital is custodial, and the limitations are stated directly. From there, the design tries to make that trust as observable and accountable as possible through public reserves, deterministic pricing, on-chain policy records, solvency auditing and HTLC settlement for larger trades.

For me, the most important remaining milestone is turning FROST from multiple shares inside one process into actual fault separation: DKG, independent signer processes/operators, and signer-side verification of the curve before approving payouts.

I would also strongly prefer degen mode to ship disabled by default.

One additional improvement I would like to see is quotes committing to enough context that an independent observer can later reproduce exactly what the venue should have paid — for example the policy-record hash and the relevant reserve state or momentum height.

If the custody model, signer threshold, hot-float cap and settlement mode are clearly exposed to users before every trade, I think this can be valuable infrastructure for Zenon while a fully trustless AMM isn’t possible on NoM.

Definitely worth funding and taking through the remaining security and mainnet work.