DOCSProtocol reference

How Reflex works, end to end.

A precise account of the mechanism — the curve that seeds supply, the lifecycle that stakes ETH, the Reflex Arc that discharges yield, and the floor that ratchets. Every parameter here is fixed at deploy.

01Overview

Reflex is a liquidity protocol built as a Uniswap v4 hook. One million RFLX are seeded as single-sided liquidity across 100 price bands before the first trade. As buyers cross bands, the ETH they pay is staked on Lido; the staking yield is periodically converted back to ETH and used to buy RFLX at the floor — deepening the lowest active band. That buy-side liquidity has no withdrawal path, so it accumulates rather than draining away.

There is no treasury, no governance and no mint function. After launch the owner is renounced and the hook runs autonomously for as long as Uniswap v4 exists.

In one line

Trading → staked ETH → stETH yield → floor liquidity → a deeper floor that invites the next trade. The loop is mechanical.

02The bonding curve

Supply is distributed by a softened hyperbolic curve with exponent α = 0.75:

f(x) = 1 / (VETH + x)0.75

where x is cumulative ETH into the curve and V_ETH ≈ 10.22 is a virtual reserve that sets the launch price at roughly 68,027 RFLX/ETH. The curve runs to a maximum of 10,000 ETH across all 100 bands. Early bands are narrow and dense; later bands widen and require real ETH depth to cross.

03Distribution

Band widths follow a linear ramp — each band is wider than the one before, so no two bands fill at the same rate. RFLX per band is then shaped by a power compression (k = 0.75) applied to the raw curve allocation, concentrating supply in the early bands without making the tail negligible.

Band 0 width2.5 ETH
Band width step≈ 1.970 ETH per band
Distributionsoftened hyperbolic · k = 0.75
Curve depth10,000 ETH across 100 bands
Band 99remainder to exactly 10,000 ETH

Price (the Uniswap ticks) is derived from the curve; the RFLX amounts are shaped independently. Both are computed deterministically on-chain in the RFLDF library.

04Band lifecycle

When price crosses a band its RFLX converts to ETH. That ETH does not sit idle — it moves through four states:

LiveRFLX liquidity active in the pool
Triggeredjust crossed; ETH held liquid for instant retrace
Conditioningafter 20 blocks · 50% staked on Lido
Reflexedafter 100 blocks · 100% staked and earning

The most recently crossed band always stays Triggered so a price retrace re-adds liquidity instantly. Staked positions are tracked in wstETH shares — a non-rebasing wrapper — so yield accrues without changing the share count.

05The discharge

When harvestable yield clears 0.1 ETH, anyone can call triggerReflexArc() — the discharge. It is permissionless, pays the caller a keeper reward, and runs with no operator deciding to act. Each discharge:

  1. 01Unwraps wstETH to stETH, then swaps to ETH through the Curve stETH/ETH pool under a 5% slippage guard.
  2. 02Splits the proceeds: 98% discharge · 1% keeper · 1% operations.
  3. 03Deploys a bounded amount into the floor (capped per discharge) and buys RFLX at the lowest active band.
  4. 04Adds the RFLX as liquidity to that band — deepening it.
  5. 05Advances the floor band once that band reaches 2× its original depth.
Guards

Gas is capped at 30 gwei, the Curve leg has a 5% slippage guard, and each cycle deploys only a bounded amount into the floor — so no single buy is large enough to be worth sandwiching. A stricter observation-based price oracle is planned as future hardening.

06The reflexive floor

The floor is buy-side liquidity placed in the pool at the lowest active band, owned by no one. Three properties make it a ratchet:

It only adds. Each cycle buys RFLX and deepens band 0. There is no withdrawal path in the contract — liquidity placed at a band stays there.

It climbs in steps. When a band doubles its original depth, the target advances to the next band and the floor price steps up the curve.

It cannot retreat. Sellers meet accumulated depth on every trade. Progress locks in, cycle after cycle — the ratchet has a pawl.

07Parameters

All values are fixed at deploy and cannot be changed.

Total supply1,000,000 RFLX
Virtual reserve (V_ETH)≈ 10.2168 ETH
Curve maximum10,000 ETH
Bands100
Launch price≈ 68,027 RFLX / ETH
Swap fee1% (0.5% ops · 0.5% floor)
Yield split98% floor · 1% keeper · 1% ops
Yield threshold0.1 ETH
Max discharge / cycle1 ETH
Curve slippage guard5%
Keeper gas cap30 gwei

08Contracts

Reflex deploys two contracts — the RFLX token and the ReflexHook. Everything else is existing mainnet infrastructure.

ReflexToken (RFLX)TBA at launch
ReflexHookTBA at launch
Uniswap v4 PoolManager0x0000…08a90
Lido stETH0xae7a…fE84
wstETH0x7f39…2Ca0
Curve stETH/ETH0xDC24…7022
Verify

On launch day, every parameter above maps to a public view function you can read directly on Etherscan — nothing here is off-chain.

09Security & trust

startReflex() is called once and ownership is renounced on the spot. After that there are no admin keys, no upgrade path, no parameter setters. External liquidity changes are blocked at the hook level, so no one can add or remove pool liquidity except the protocol itself.

Ownershiprenounced at launch
Upgradeableno — no proxy
Admin functionsnone post-launch
External LPblocked at hook
Yield custodywstETH held by the hook
Withdrawal pathnone — floor liquidity is permanent

10Glossary

Band
One of 100 cumulative-ETH price intervals holding single-sided RFLX liquidity.
Floor band
The lowest active band — where discharged RFLX is currently being added.
The Reflex Arc
The stimulus-to-response pathway: trading → staked ETH → yield → discharge into the floor. No decision step in between.
Discharge
The act of converting harvested yield into permanent floor liquidity (triggerReflexArc).
Reflexive floor
The self-reinforcing price floor that deepens with every discharge.
wstETH
Wrapped stETH — non-rebasing, so staking yield shows as a rising ETH value per share.
Keeper
Anyone who fires the discharge and earns the 1% reward.

Deployed once.
No one can touch it.

Reflex deploys immutably on Ethereum mainnet and ownership is renounced at launch. After that, no one can change the parameters, move funds, or pause it — the contract just runs.

Contract0x0000…dEaD