Lethe

Zcash → NEAR Intents 1Click · wallet-side

A new refund address and recipient for every swap.

Every swap out of Zcash through 1Click names a refund address and a recipient in a public request. Lethe gives each swap a refund address used once and its own NEAR account, both from one seed, and tells you what still links them.

The one-time refund key for 1Click's refundTo builds on Zakura's quantum-unlinkability proposal (Oct 19) and its draft crate zakura-one-time-ivk. Lethe adds a NEAR recipient per swap from the same seed, recovery from the seed alone on both chains, a locked index book that refuses a reused recipient, opt-in amount and timing decorrelation with a linkability report, and MCP tools.

Loading pass 2…

The same three swaps, two wallets

The refundTo each wallet puts on three public 1Click requests.

A wallet that reuses its address

    One address on all three: anyone who reads the requests sees one wallet.

    Lethe

      Three addresses, three viewing keys. The addresses alone don't connect them.

      Before: the first run

      The first run's three requests, every field checked for what could link them.

      Why not 1Click's Confidential Intents?

      1Click's own private mode (confidentiality: basic or advanced) keeps the quote request out of public view. It is worth using, and Lethe passes it through (--confidentiality). It does not replace a refund address and a recipient per swap:

      Found again, from the seed alone

      1Click has no testnet, so a demo provider wallet paid each one-time testnet address as a stand-in refund. A compact-block scan finds each payment with its own key only.

      Not yet

      Run it

      Rust, a compact-block scanner, a CLI and an MCP server. The tests call the real 1Click API with dry quotes and scan Zcash testnet.

      pnpm install && pnpm build && pnpm test
      pnpm --filter @zswap/cli zswap init                              # a seed and its index book in .demo/
      pnpm --filter @zswap/cli zswap quote 0.1 nep141:wrap.near        # its own refund address and NEAR recipient
      pnpm --filter @zswap/cli zswap plan 0.35 nep141:wrap.near --split --window 180
      ZSWAP_BOOK=/tmp/restored.json pnpm --filter @zswap/cli zswap recover <from-height> --lookup   # from the seed alone
      pnpm --filter @zswap/dashboard dev                                # the dashboard: http://localhost:5182