Docs & FAQ

Everything the protocol actually does, written against the deployed code.

This page describes the contracts as they are deployed, not as they are planned. Where something is unfinished or unaudited it says so. The whitepaper covers the maths; this covers the practical questions.


1. Getting started

What do I need before I deposit?

Three things:

  1. A wallet on Robinhood Chain (chain id 4663).
  2. A little ETH for gas. Blocks are about a tenth of a second and gas is cheap, but you still need some.
  3. The two tokens of the pair, in the vault's own terms. A WETH/USDG vault takes WETH and USDG.

I have ETH but the vault wants WETH.

A vault is an ERC-20 contract holding a Uniswap V3 position, and native ETH cannot be moved by an ERC-20 transfer. It has to be wrapped first. The app has a Wrap control that calls deposit() on the canonical WETH9 at 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73. Wrapping is one to one and reversible at any time.

Do I have to supply both tokens in the right ratio?

You supply both, and the vault takes them in whatever ratio its current position needs. Anything left over is returned in the same transaction. You are never forced to pre-swap.

How many shares do I get?

Your share of the vault is your share of what you added, measured against what was already there. The deposit path reads no price at all, which means it cannot be manipulated by moving the pool immediately before your transaction.

The first deposit into a fresh vault permanently burns 1000 shares to a dead address. That is a standard defence against the first-depositor inflation attack, and it costs you a rounding error.


2. How the vault works

What is the Flow Engine?

It is the rule that decides how wide the position should be and when to move it.

The vault keeps an exponentially weighted estimate of the pool's variance, updated from the pool's own tick oracle with a decay of 0.94 per observation. From that it computes a half width:

w = k · σ · √H

σ is the estimated volatility, H is the horizon the position is meant to survive, and k is the strategy's aggression. A quiet market produces a narrow band and more fee income per dollar. A violent market produces a wide band and fewer forced moves.

When does it reposition?

When price drifts more than θ of the way from the centre of the band to its edge, and the cooldown has expired. θ is configurable between 30% and 95%.

Repositioning early wastes gas and realises divergence loss for nothing. Repositioning late leaves the position idle. θ is the dial between those two mistakes.

A reposition never reopens tighter than the drift that triggered it. Doing so would guarantee an immediate second reposition.

What are the strategies?

kBehaviour
Narrow0.6Tightest bands, most fee income per dollar, most repositions
Balanced1.5The default
Wide4.0Widest bands, fewest moves, least sensitive to a spike

k is bounded in the contract between 0.5 and 6.0. Nobody can set a value outside that, including us.

Who actually calls the rebalance?

Anyone. rebalance() is permissionless and pays a bounty out of the fees it harvests, capped at 10% and set to 5% on the live vaults. We run a keeper so that it happens reliably, but the vault does not depend on our keeper being alive. If we vanish, anybody can keep the vaults working and get paid for it.

What stops someone rebalancing at a manipulated price?

Every entry point compares spot against a TWAP and reverts if they have diverged by more than maxDeviationTicks, which is hard capped at 500 ticks and set to 100 on the live vaults. The vault also caps the tick impact of its own swap, so it cannot be induced to trade through its own liquidity into a bad price.

The TWAP window on the live vaults is 20 minutes rather than the 30 in the paper. This pool's oracle only reads back about 5400 seconds and the engine samples three windows behind the current one, so a 30 minute window would sit exactly on that boundary with no margin.

Why does a new vault need bootstrapOracle?

Almost every Uniswap V3 pool on this chain sits at observation cardinality 1, which means it stores no price history. A vault that reads a TWAP over a pool with no history reverts on every entry point and is inert.

bootstrapOracle(n) grows the pool's observation array. Anyone can call it and whoever does pays for the storage. Growing the array does not backfill history, so the pool then has to actually trade before the vault becomes usable.


3. Fees

What does Fluid charge?

10% of harvested fees. Nothing else.

If the position earns nothing, Fluid earns nothing. The performance fee is set at deployment, is capped in the contract at 20%, and is immutable. There is no function that changes it, for anyone.

And the keeper bounty?

Also taken from harvested fees only, capped at 10%, currently 5%. It is what makes the vaults self-sustaining without us.

So where does my yield come from?

Uniswap V3 swap fees on the pair, earned while your liquidity is in range, compounded back into the position on each harvest. Fluid does not lend your assets, does not lever them, and does not route them anywhere other than the one pool the vault was deployed against.


4. Risk

Fluid is unaudited.

The contracts are deployed and the test suite is green, but no third party has reviewed them. Treat any deposit as capital you are willing to lose entirely. The live vaults hold a deliberately small position for this reason.

Impermanent loss has not been repealed.

Concentrated liquidity concentrates divergence loss along with the fees. A vault that keeps you in range keeps you earning, and it also keeps you exposed. If one side of the pair moves a long way against the other, you can end up worse off than if you had simply held the two tokens. The app shows a vs holding figure precisely so you can see this rather than guess at it.

Repositioning realises that loss instead of leaving it on paper. That is the cost of not going idle.

What can the guardian do?

The guardian role is deliberately narrow. It can:

It cannot:

What if the keeper stops?

Your position stays exactly where it is. It keeps earning while price is inside the band and stops earning when price leaves it, which is the same thing that happens to any manually managed position. Nothing is at risk, and anyone can call rebalance() to restart it and collect the bounty.

What if the whole team disappears?

Deposits and withdrawals are permissionless and need nothing from us. Rebalancing is permissionless and pays whoever does it. The vaults keep working.


5. Using the app

How do I see what I have made?

The app reconstructs your position from the vault's own Deposit and Withdraw events, so it shows the same numbers on any device with no account and nothing stored server side. It displays what you put in, what the position is worth now, time held, and the result against simply holding the same two tokens.

Why does a vault say it has no position?

Because it has never been seeded. A vault with no deposits has no range to be inside or outside of, and the app says so rather than rendering a misleading "out of range".

Can I withdraw at any time?

There is no lock, no queue, no notice period, and no permission required. Withdrawal is pro rata over everything the vault holds: the position, uncollected fees, and any idle balance.

One honest caveat. Withdrawal runs the same spot against TWAP check as every other entry point, so while the pool's spot price sits more than maxDeviationTicks away from its own TWAP, a withdrawal reverts and you have to try again shortly after. On the live vaults that threshold is 100 ticks, about 1%, against a 20 minute window.

This exists so that nobody can shove the pool, withdraw against the dislocated price, and take more than their share out of everyone else's position. It is a deliberate trade: a short wait during a violent move, in exchange for the vault not being drainable during one. It is not a lock and no one can extend it. It clears on its own as soon as the TWAP catches up with spot.


6. The token

Fluid will have a token. Its design is not finished, and nothing about it is being promised here. When there is something concrete it will be published on this site and announced from @FluidRobinhood.

Anything you see elsewhere claiming to be a Fluid token today is not one.


7. Addresses

ChainRobinhood Chain, id 4663
RPChttps://rpc.mainnet.chain.robinhood.com
Explorerhttps://robinhoodchain.blockscout.com
WETH90x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73

Vault addresses are listed in the app, read from chain. Always confirm an address in the app or on the explorer rather than from a message.