A privacy layer for providing liquidity
Seven Liquidity lets you provide liquidity on Robinhood Chain and earn real trading fees without publishing your position. You deposit one asset into a shared vault. The vault stakes the pool as a single position into Delta, a concentrated-liquidity engine, and you hold a private note that redeems your share with a zero-knowledge proof.
Delta makes the yield. Seven hides who is earning it.
Non-custodial
No owner, keeper or relayer key can redirect a withdrawal; only a valid proof for an unspent note moves a payout. Changing the strategy takes a 3-day public timelock, so you can exit first.
Proof-gated exits
Withdrawing proves you own a note of a given tier without revealing which deposit it came from.
Real fees
Yield comes from swap fees in Delta’s WETH/PONS pool, compounded into the vault. There are no token emissions.
From deposit to private withdrawal
Four steps, and only the first two involve your wallet. Everything that could link you to your exit happens in your browser.
- 1
Connect and sign in
Connect an EVM wallet on Robinhood Chain and sign a message. It costs no gas and opens a one-hour session that is used only for deposits and your deposit history.
- 2
Deposit a fixed tier
Choose 100, 1,000 or 10,000 shares. Your browser creates a secret note, your wallet is screened against sanctions lists, and the note is shown to you before any wallet prompt. Your own wallet then approves PONS and calls deposit. The vault inserts a leaf that seals the tier you paid for.
- 3
Earn inside one aggregate position
Pooled PONS is staked into Delta’s WETH/PONS pool as a single Seven position. Claimed trading fees compound back into the vault, so every share is worth totalAssets ÷ totalShares.
- 4
Withdraw by proof
Load your note and choose your stealth wallet or another fresh address. Your browser fetches the public leaf set, builds the Merkle path and a zero-knowledge proof, and hands it to the relayer with no session attached. The vault verifies it, marks the note spent and pays the recipient, less the relayer fee.
Your note is your position
A note is two random field elements, a nullifier and a secret, generated in your browser and never sent to any server. Whoever holds it can redeem the position, and nobody, including Seven, can recover it if it is lost. Treat it like a seed phrase.
commitment = Poseidon(nullifier, secret) // submitted with deposit()
leaf = Poseidon(commitment, shareTier) // computed and inserted by the vault
nullifierHash = Poseidon(nullifier) // revealed once, at withdrawalWhy fixed tiers
Every deposit of the same tier looks identical on-chain, so together they form one anonymity set. Arbitrary amounts would each be a fingerprint. The mainnet vault offers exactly 100, 1,000 and 10,000 shares; there is no setter, so changing them means a new vault.
How a share is priced
A deposit pays tier × totalAssets ÷ totalShares, rounded up; a withdrawal receives the same, rounded down. While the vault is empty, one share costs exactly one PONS. The tier is sealed into the leaf, so a note can only ever be redeemed at the tier it paid for.
Proved in your browser, relayed without you
The proof is built locally with the published circuit artifacts, then submitted by the relayer. The withdrawal request carries no session and no wallet signature, so the server has nothing that ties the exit back to your deposit.
| Public signal | What it binds |
|---|---|
root | A recent Merkle root; the vault accepts any of the last 128. |
nullifierHash | Poseidon(nullifier). Marked spent, so a note redeems once. |
shareTier | The tier being redeemed. It must match the tier sealed into the leaf. |
recipient | Where the payout goes. Changing it invalidates the proof. |
relayer | Who may collect the fee. Another relayer cannot reuse the proof. |
fee | The relayer’s cut, deducted from the payout. The relayer’s minimum is 2 PONS. |
Checked before relay
The relayer confirms the root is known, the note is unspent and the fee covers its floor, then simulates the full withdrawal so a bad proof never costs gas.
Settled on-chain
The vault verifies the proof, marks the nullifier spent, then pays the recipient and the relayer. A replay reverts with NoteAlreadySpent.
Remembered locally
Your withdrawal history is stored only in this browser. The server records withdrawals by nullifier, with no account attached.
Withdrawing to the wallet that deposited links the two on-chain and undoes the privacy. Because the relayer pays the gas, the recipient can be a brand-new address with no balance. The dashboard’s “My stealth wallet” option creates one for you.
Seven layers, and exactly where each one stands
Each layer closes one way a position could be traced. Five are fully live. Two are live in part, and each one says below what works today and what is still to come.
- 01
Shielded deposit pool
LiveEach deposit is a Poseidon commitment in a depth-20 Merkle tree inside SevenVault. The chain records the commitment and its tier, never an owner.
- 02
Aggregated position
LiveAll deposits sit in one vault, and one strategy stakes into Delta. On-chain there is a single Seven position, not one per provider.
- 03
Compounding share accrual
Live · keeper-drivenFees are claimed and compounded into the vault’s value by the keeper. There are no per-user payouts to trace; a share simply redeems for more.
- 04
Zero-knowledge proofs
LiveEvery withdrawal carries a Groth16 proof of note ownership, generated in your browser. The vault learns the tier and a nullifier, not which deposit is being spent.
- 05
Stealth withdrawal addresses
LiveBy default each withdrawal pays a brand-new ERC-5564 stealth address derived from your note and one wallet signature, and private payment links let others pay you the same way. The relayer pays the withdrawal gas; moving funds out of a stealth address needs a little ETH until Gasless Shielding ships.
- 06
Relayer network
Single relayerSeven’s relayer submits the dashboard’s withdrawals, so your wallet never signs the exit. The proof binds the relayer and its fee, so it can refuse a withdrawal but never redirect one. An open, staked relayer network is on the roadmap.
- 07
Timing and decoy defense
Delays liveFixed denominations make every same-tier deposit identical. Before you withdraw, the app rates how hidden your exit is, and you can have the relayer send it at a random moment 1–6 or 6–48 hours later, so its timing stops pointing at your deposit. A proof that waits can go stale if many deposits land meanwhile; you then withdraw again with the same note. Batched exits are on the roadmap.
One position in Delta, compounded by a keeper
Deposits arrive at DeltaStrategy as idle PONS. The keeper stakes them into Delta’s 1% WETH/PONS pool, where they earn swap fees from real trading. Per Delta’s documentation, fees stream in over seven days, are paid in WETH, and Delta keeps 1%.
Automation
- A scheduled job claims and compounds fees every four hours.
- The same run checks pool depth and can unstake everything if liquidity thins.
- A separate job reconciles deposits and withdrawals and runs a solvency check every ten minutes.
Value and exits
- Vault value is idle funds plus the staked position, priced at the pool, and it is public on-chain by design.
- Pricing refuses to run when spot drifts outside a band around the 10-minute TWAP, so a manipulated price can’t be used to mint or redeem.
- Exits are paid from idle funds first. If those fall short, the strategy closes positions and swaps back to PONS inside the same price band.
A concentrated-liquidity position is exposed to impermanent loss. Your note always redeems a fixed number of shares, but what a share is worth in PONS follows the pool, and can fall as well as rise.
What each role can do, and what it can’t
Authorization to move funds belongs to the proof alone. Every privileged role is bounded in the contract code, not by policy.
| Role | Can | Cannot |
|---|---|---|
| Note holder | Redeem their own note, once, to any recipient they choose. | Redeem at a larger tier than they paid for, or spend a note twice. |
| Owner (Safe multisig) | Pause and unpause deposits. Queue a strategy migration, executable only after a 3-day timelock. On the strategy: set the keeper and pool, bound slippage, and pause keeper actions. | Pause withdrawals, change tiers or the verifier, touch notes, or renounce ownership. |
| Keeper | Stake, claim, compound, unstake and swap inside the strategy, within slippage and price-band limits. | Withdraw from the strategy. Only the vault can, and only to pay a proven withdrawal. |
| Relayer | Submit a withdrawal and collect the fee bound into its proof. | Change the recipient, the fee, or the amount; each is a public signal of the proof. |
Trusted setup
The proving keys come from a two-phase ceremony. Phase 1 is the Hermez Powers of Tau (54 contributors plus a random beacon). Phase 2 was contributed by two independent parties on separate machines and sealed with drand randomness from round 6436804. The deploy script checks the verifier’s code hash against the ceremony build.
Verified and proven
SevenVault, DeltaStrategy, Groth16Verifier and PoseidonHasher are source-verified on Blockscout. Full deposit-to-withdrawal round trips, including one driven through the dashboard with the proof built in the browser, have settled on mainnet since launch.
Screened at both ends, without learning who you are
Screening checks addresses, never identities. Nothing is asked of you beyond the wallet you connect and the recipient you name.
Deposits
The connecting wallet is checked against sanctions lists before a deposit intent is recorded.
Withdrawals
The recipient is checked before the relayer submits anything. The check covers the recipient only, so it reveals nothing about the depositor.
Source list
OFAC’s SDN list, pulled from the U.S. Treasury daily at 06:00 UTC. If the check can’t be answered, the request is refused.
The interface can also restrict access by jurisdiction. Screening an address answers whether that exact address is listed; it does not trace where funds came from. The Privacy Policy sets out exactly what is processed.
What privacy here does and doesn’t cover
Seven Liquidity is experimental software. Read this section and the Terms before depositing, and only deposit what you can afford to lose.
- The contracts have not yet completed an external security audit.
- Delta is a third-party protocol without a published audit.
- Staked value is exposed to impermanent loss and pool liquidity.
- A lost note cannot be recovered by anyone.
- If the pool price is outside its safety band, an exit reverts and has to be retried later.
- The aggregate position and the vault’s value are public.
- Each deposit and withdrawal reveals its tier.
- Your anonymity set is the number of same-tier notes, so it grows with usage.
- Withdrawing soon after depositing the same tier makes the two easier to correlate.
Mainnet addresses
Robinhood Chain mainnet, chain ID 4663 (0x1237), an Arbitrum Orbit L2 with gas paid in ETH. Always check an address against this page before interacting with it.
Core protocol
The shielded pool and share vault. Holds the Merkle tree, verifies proofs, pays withdrawals.
0x1d8213eE997aeb3695D4ca9D770C7Ce77776822dYield adapter that stakes pooled PONS into Delta. Keeper-operated, owner-bounded.
0x14B3aFDba0C8C40400baD70Ba0c656ae3c40223aChecks withdrawal proofs. Built from the trusted-setup ceremony keys; immutable in the vault.
0xEC25E95870954D449B943324C96ee0D747b58981Hashes leaves and tree nodes on-chain, identically to the circuit.
0xD9A29610615E854B4a5c878D921e1bce0f4203b7Operators
Can pause deposits and migrate the strategy behind a 3-day timelock. Cannot touch notes or withdrawals.
0x12D7342B0ed835f3135788C7722584dBDdB902c1Operates the Delta position inside the strategy. Has no path to send funds anywhere else.
0x4De90e53F4DCE30c2801b33472220CEa537876B3Assets and integrations
The vault asset. 18 decimals, not upgradeable, no freeze, clawback or mint hooks.
0x39dBED3a2bd333467115dE45665cC57F813C4571The Uniswap v3 pool the strategy stakes into.
0x10CC6BD38112cAc182db90B6a71d8Bb5939526bADelta's position manager, called by the strategy to open and close positions.
0x5cA6214227D1195c4b7b4B96847b8966c688295DWhere the strategy swaps between PONS and WETH, always inside a TWAP price band.
0xCaf681a66D020601342297493863E78C959E5cb2Standard singleton where stealth payments are announced, so only the recipient can find them.
0x55649E01B5Df198D18D95b5cc5051630cfD45564| Network | Value |
|---|---|
| Chain ID | 4663 |
| Public RPC | https://rpc.mainnet.chain.robinhood.com |
| Block explorer | robinhoodchain.blockscout.com |
| Vault deploy block | 56301180 |
| Merkle depth · root history | 20 levels (1,048,576 notes) · last 128 roots |
Build against the protocol
Vault state is public and readable by anyone. The HTTP API is what the dashboard uses; the two withdrawal routes are unauthenticated by design, so an exit never carries an identity.
import { createPublicClient, http, parseAbi } from "viem";
const client = createPublicClient({
transport: http("https://rpc.mainnet.chain.robinhood.com"),
});
const vault = "0x1d8213eE997aeb3695D4ca9D770C7Ce77776822d";
const abi = parseAbi([
"function allTiers() view returns (uint256[])",
"function previewDeposit(uint256 shareTier) view returns (uint256)",
]);
const tiers = await client.readContract({ address: vault, abi, functionName: "allTiers" });
const costs = await Promise.all(
tiers.map((tier) =>
client.readContract({ address: vault, abi, functionName: "previewDeposit", args: [tier] }),
),
);| Endpoint | Auth | Rate limit | Returns |
|---|---|---|---|
GET /api/leaves | None | 30 / min | Every tree leaf in insertion order, plus the relayer address and minimum fee to bind into a proof. |
GET /api/stealth/scan | None, on purpose | 30 / min | Every withdrawal recipient and nullifier hash, plus every ERC-5564 announcement, for your browser to match against your viewing key. |
POST /api/withdraw | None, on purpose | 10 / min | Relays a proof-gated withdrawal and returns the transaction hash. |
POST /api/auth/generate-nonce | None | 30 / min | Returns the sign-in message for an address. The nonce is valid for 5 minutes and single-use. |
POST /api/auth/verify-signature | None | 30 / min | Verifies the signed message and returns a bearer token valid for 1 hour. |
POST /api/deposit | Bearer token | 20 / min | Records a deposit intent after the tier and sanctions checks. It never moves funds. |
GET /api/balance | Bearer token | 60 / min | Public vault state: asset, totalAssets, totalShares, and a deposit cost and payout for each tier. |
GET /api/history | Bearer token | 60 / min | The signed-in wallet’s deposit intents, newest first. Withdrawals are never included. |
POST /api/withdraw
{
"proof": { "a": ["…", "…"], "b": [["…", "…"], ["…", "…"]], "c": ["…", "…"] },
"root": "<uint256, decimal>",
"nullifierHash": "0x<32 bytes>",
"shareTier": "100000000000000000000",
"recipient": "0x<fresh address>",
"relayer": "0x7F94A8e6A4637Af5405dE0545b8fCb88b3e0De6e",
"fee": "2000000000000000000"
}
200 → { "txHash": "0x…" }| Event | Signature |
|---|---|
Deposit | Deposit(bytes32 indexed commitment, uint32 leafIndex, uint256 shareTier, uint256 assetsIn, uint256 timestamp) |
Withdrawal | Withdrawal(address indexed recipient, bytes32 nullifierHash, address indexed relayer, uint256 fee, uint256 assetsOut) |
| Revert | Meaning |
|---|---|
UnknownTier | The amount is not one of the vault’s fixed tiers. |
DuplicateCommitment | That commitment is already in the tree. |
CommitmentOutOfField | The commitment is not a valid BN254 field element. |
EnforcedPause | Deposits are paused. Withdrawals are unaffected. |
UnknownRoot | The proof’s root is older than the last 128 roots. Re-prove. |
InvalidProof | The proof does not verify for these public signals. |
NoteAlreadySpent | The note’s nullifier has already been used. |
FeeExceedsPayout | The bound relayer fee is larger than the payout. |
ZeroPayout | The vault would pay nothing right now. Retry later; the note stays unspent. |
PriceOutOfBand | The pool’s spot price is too far from its 10-minute TWAP, so valuation is refused. Retry. |