Overview
DarkpoolFi is a private execution venue for stock tokens on Robinhood Chain. Funds sit in a shielded pool as private notes, orders are sealed so their side, size and limit are not public, and every eligible order in a 5-minute window crosses at one shared Chainlink reference price.
- No public order book. Other traders never see your orders; the market only sees that an order joined a window.
- Proofs are made in your browser. Zero-knowledge proofs show a spend or order is valid without revealing which notes it uses.
- One price per window. Nobody gains by being first; everyone in the window gets the same reference.
- Self-custody. Only your wallet can derive the keys that spend your notes.
Everything a transaction does on chain is public data. DarkpoolFi keeps order intent and the link between your deposits and later activity private; it does not make every action invisible. See the privacy model.
Getting started
Requirements
- MetaMask. DarkpoolFi works with MetaMask only. If another extension such as Phantom also injects a wallet, the dashboard still selects MetaMask.
- Robinhood Chain (chain ID 4663, gas in ETH). The dashboard asks MetaMask to switch or add the network when needed.
- ETH for gas. Keep about 0.001 ETH spare in your wallet: proof transactions reserve their full gas up front and refund what they don't use.
First steps
- Open the dashboard and go to the Shielded pool tab.
- Click Unlock shielded account and sign the message in MetaMask. Signing is free and sends no transaction; it derives your private pool keys in the page.
- Deposit ETH. The deposit becomes Spendable once it joins the pool tree, usually within a couple of minutes.
- Seal an order from the Trading desk or the Shielded pool tab.
Your keys
Your keys exist only in memory while the page is open and are never sent to a server. Reloading the page locks the account; sign again to unlock. Because the keys come from your wallet's signature, the same wallet recovers the full account on any device: balances, orders and history are rebuilt from the pool's public events.
The dashboard
Trading desk
Markets with their live Chainlink reference prices, the countdown to the current window's close, and an order ticket. The ticket seals a standard shielded order from your unlocked account; your open orders and recent results appear below it. Other order types are in the Shielded pool tab.
Private balance
Your shielded account at a glance: available ETH (spendable plus arriving), ETH committed to open orders, token holdings valued at reference prices, and funding history. Deposit and Withdraw open the matching Shielded pool forms.
Activity
Your activity lists deposits, withdrawals, note changes, sealed orders and fills, tagged Shielded pool, and can be exported as CSV. The Crossing windows and Delayed public tape views currently cover the previous private balance system.
Shielded pool
The full toolkit: account status and balances (Spendable, Arriving, In orders, Notes), deposit, withdraw, sealed orders of every type, merge and split, backstop liquidity, and selective disclosure. A status card shows each step while an action runs.
Notes and the pool tree
Your balance is a set of notes: private commitments to an owner, an asset, an amount and the deposit they descend from. Spending a note publishes a one-time nullifier, so a note can never be spent twice, without revealing which note it was.
Balance states
| State | Meaning |
|---|---|
| Spendable | Notes already in the pool tree, ready to use. |
| Arriving | New notes (deposits, change, fills, refunds) queued for the next tree batch. |
| In orders | Amounts locked by open orders: ETH for buys, tokens for sells. |
| Notes | How many unspent notes you hold, including arriving ones. |
Tree batches
New notes are queued on chain and appended to the pool's Merkle tree in batches of up to 16. A note becomes spendable once its batch lands, typically within a couple of minutes. The tree holds just over one million notes.
The same-deposit rule
Every deposit carries a private label that follows its funds through every later note. Only notes from the same deposit can be combined in one transaction. A withdrawal can draw on at most two notes from one deposit; if your balance is spread over several deposits, withdraw in parts.
Merge and split
- Merge joins your two largest spendable notes from the same deposit into one.
- Split carves an exact amount out of a single note. The note must cover the amount plus the relayer fee. The usual reason to split is to create a small, separate ETH note for paying relayed order fees.
Deposits and withdrawals
Deposits
Deposit ETH or a listed stock token from your wallet. Tokens ask for an approval of the exact amount first. Each deposit also carries a small ETH deposit fee that pays for adding it to the pool tree; the form shows the current amount.
A deposit is visible on chain: your wallet, the asset and the amount. What you do with those funds afterwards is not linked back to it.
Withdrawals
Withdraw any amount to any Robinhood Chain address. Whatever is left in the notes you spend returns to you as a new change note.
| Path | Who sends it | Cost | Privacy |
|---|---|---|---|
| Relayer (default for ETH) | The DarkpoolFi relayer; your wallet signs nothing | Relayer fee from your notes | The destination is not linked to your wallet |
| Your wallet | Your wallet | Network gas only | Your wallet is visible as the sender |
Token withdrawals are always sent from your wallet. The relayer fee tracks network gas: around 0.0004 ETH at normal gas, higher during spikes. The form always shows the live fee.
Association set
The pool supports an association set: a published list of screened deposits. When it is enforced, a withdrawal proves in zero knowledge that its funds come from an approved deposit, without saying which one. Deposits from blocked addresses are refused at the door.
Sealed orders
Crossing windows
Orders collect in 5-minute windows, numbered by time. An order joins whichever window is open when its transaction lands. After the window closes, the reference price is sealed from Chainlink and the window is settled.
- Seal. Your order is proved and encrypted in the browser, then submitted through the relayer (or your wallet).
- Collect. It rests in the window. Its side, size and limit are not public.
- Cross. After the window closes, eligible orders cross at one reference price. Leftover interest can fill against the backstop vault.
- Settle. Fills, refunds and released locks return to you as private notes, typically within about 10 minutes of placing the order.
Placing an order
- Size in tokens: at least 0.001, up to 6 decimals.
- Price limit (optional), in USD per token. A buy is eligible when the reference is at or below the limit; a sell when it is at or above.
- Buys lock ETH from a single note. The suggested amount is size × reference ÷ ETH price plus 2.05% for the fee and headroom; unused ETH is returned. Sells lock tokens from a single token note.
- Relayed orders pay their relayer fee from a separate ETH note, so the fee reveals nothing about the order. Split a note first if you need one.
If it doesn't fill
| Policy | What happens to the unfilled part |
|---|---|
| Keep for the next windows | Rolls forward for up to 11 more windows (12 in total). |
| Release the rest | The remaining lock returns to you as a note after the window settles. |
Sealed orders cannot be cancelled. A lock is freed only when its window settles, or by reclaiming it if the window is never settled.
Live windows
A window is live when both price feeds are fresh, the token's oracle is active, and the time falls in the trading session (Sunday 20:00 to Friday 20:00, New York time). Nothing fills in a window that is not live: orders set to keep roll forward, and released orders get their lock back.
Reclaiming a lock
If a window is not settled within one hour of closing, its orders show Window was not settled · reclaim your lock. Reclaiming closes the window if needed and returns your lock as a note. Both steps are sent from your wallet.
Order types
The Trading desk ticket places standard orders. Every type below is available in the Shielded pool tab's Sealed order form.
| Type | Input | Behaviour |
|---|---|---|
| Standard | None | Joins the window's uniform cross; leftovers may fill against the backstop. |
| Minimum fill | Minimum tokens (up to the size) | Fills at least the minimum or nothing that window. Never fills against the backstop. |
| Iceberg | Tokens shown per window (up to the size) | Offers only that slice each window. Pair it with Keep for the next windows; with Release only one slice can fill. |
| TWAP | Windows to split over (2–12) | Offers an equal slice each window; always carries forward. |
| Pegged · backstop only | Most spread to accept, 0–200 bps | Never joins the cross; fills only against the backstop vault, and only when its spread is within your peg. |
| RFQ block | Block commitment agreed off-venue | Crosses only whole, at the reference, against its matching counter-order. Negotiation tooling is not part of the dashboard yet. |
Backstop liquidity
The backstop vault gives each market depth when a window's own interest is one-sided. Liquidity providers add ETH and/or one stock token to a market's book. After the uniform cross, leftover buy interest fills at reference + spread and leftover sell interest at reference − spread, pro rata, with the normal venue fee.
- Spread: 50 bps per book (maximum 200 bps).
- Next-window offer: the tokens the vault can sell and the ETH it can spend next window, capped per window. A book holding only ETH can only buy from sellers, and vice versa.
- Adding liquidity mints shares at Chainlink value; withdrawing burns shares for the same fraction of the book's ETH and tokens. Both go straight from your wallet. The dashboard does not show your share balance yet, so keep a record of the shares you add.
- Rebalancing: the vault can swap toward an even ETH/token split on Uniswap v3 within a slippage bound. Only the vault trades on the AMM, never user orders.
Vault liquidity takes the other side of leftover flow at reference ± spread, so providers carry price and inventory risk. Vault flows per window are public.
Privacy model
What is public and what stays private
| Action | Public on chain | Private |
|---|---|---|
| Deposit | Wallet, asset, amount | Everything you do with the funds afterwards |
| Withdrawal | Asset, amount, destination, fee | Which deposit the funds came from; your wallet, when relayed |
| Merge or split | That notes of an asset changed, fee | Amounts, which notes, owner |
| Sealed order | Market, window, relayer fee | Side, size, limit, lock; your wallet, when relayed |
| Settlement | Reference price, new note commitments, vault totals | Each owner's fill and refund |
Proofs in the browser
Deposits, transactions, orders and reclaims are proved on your device with Noir circuits and the Barretenberg UltraHonk backend, using Poseidon2 hashing; on-chain verifiers check every proof. The Merkle path to your notes is also built locally, so no server learns which note you are spending. Window crossings and tree batches are proved by the operator and verified on chain in the same way.
Who can read what
- The public and other traders never see order details, only the data listed above.
- The settlement operator decrypts sealed orders to compute each window's cross. It sees the order's terms and the deposit its funds came from, but it cannot spend your notes or change the outcome: settlement must pass an on-chain proof.
- You decrypt your own notes, orders and results with your viewing key, derived from your wallet signature.
Messages are encrypted with ECIES (secp256k1 key exchange with AES-256-GCM). Your spending key never leaves your device.
Selective disclosure
For audits or compliance, you can seal your viewing keys to an auditor's public key and publish the grant on chain. The auditor can then rebuild every note, order and result of the account, past and future, but can never spend.
Disclosure is permanent and cannot be revoked. Only disclose to a key you trust.
Fees
| Fee | Amount | When |
|---|---|---|
| Deposit fee | 0.0001 ETH per deposit (the form shows the live value) | Every deposit, on top of the amount |
| Relayer fee | Tracks network gas; about 0.0004 ETH at normal gas | Relayed withdrawals, merges, splits and orders |
| Venue fee | 5 bps of the ETH value, per side | Only when an order fills |
| Backstop spread | 50 bps from the reference | Fills against the backstop vault |
| Network gas | Market rate | Anything sent from your wallet: deposits, self-submitted actions, reclaims, disclosure, liquidity |
Limits
| Limit | Value |
|---|---|
| Window length | 5 minutes |
| Settlement deadline before reclaim | 1 hour after the window closes |
| Minimum order size | 0.001 tokens |
| Order size, limit and ETH lock precision | 6 decimals |
| Open orders per market | 64 across unsettled windows |
| Carry-forward | Up to 12 windows in total |
| TWAP | 2 to 12 windows |
| Pegged spread | 0 to 200 bps |
| Notes per spend | Up to 2, from the same deposit |
| Tree batch | Up to 16 notes |
Troubleshooting
| Message | What it means | What to do |
|---|---|---|
| Install MetaMask… | MetaMask was not found. | Install or enable MetaMask, then reload. |
| Cancelled in your wallet. | The request was rejected in MetaMask. | Try again and approve it. |
| Not enough shielded ETH. | Your spendable ETH does not cover the amount plus the relayer fee. | Lower the amount, or deposit more. |
| Your ETH is spread over notes from different deposits… | No single note, or pair from one deposit, covers the amount plus fee, or new notes are still arriving. | Wait for the tree batch, withdraw in parts, or use a smaller amount. Check the relayer fee in the form. |
| A relayed order pays its … relayer fee from a separate ETH note. | You have no second ETH note large enough for the fee. | Split off a note bigger than the fee, or submit from your wallet. |
| You have no two spendable ETH notes from the same deposit. | Merge needs two notes that share a deposit. | Wait for arriving notes, or skip the merge. |
| The pool index is catching up / The pool tree just changed. | A new batch landed while you were acting. | Try again in a minute. |
| relayer fee below … | Gas rose after the fee was quoted. | Try again; the new quote is used. |
| the relayer is busy… | The relayer is sending another transaction. | Try again in a minute. |
| the pool rejects this transaction: … | The pool refused it in simulation, most often because the note was already spent by an earlier submission. | Wait for your balance to refresh before retrying. Click once and watch the status card. |
| The operator can still settle this window… | Reclaiming opens one hour after the window closed. | Wait until the hour has passed. |
Proofs take time on slower devices. The status card shows each step with a timer, so click once and let it finish.
Previous private balance
Before the shielded pool, DarkpoolFi ran an account-based private balance. It no longer takes deposits or new orders. Wallets that still hold funds there see a Previous private balance · Withdraw only panel in the Private balance tab. Nothing is moved automatically: withdraw to your wallet, then deposit into the shielded pool.
Contracts
DarkpoolFi runs on Robinhood Chain (chain ID 4663). Verify any address on the block explorer.
| Contract | Address |
|---|---|
| Shielded pool | 0xFCa786642cEeB58F4cC1543B5d7FC91cdD254B93 |
| Backstop vault | 0xA7607E0De63b4F908e6E86b597ECFBad6F04344D |
| Screening gate | 0x3482ca7f3095D43BC4dCD31778de1535F7D839Bc |
| Disclosure registry | 0x489d22e768Fbe852453985CADfde562CB9f8aA5C |
Questions? Reach us on X or Telegram. Read the Risk Disclosure before trading.
