Providing liquidity
A liquidity provider seeds one option pool with USDC and option tokens, and earns every swap fee paid by everyone who trades that leg. The dApp page is /add_liquidity.
This is the role the protocol's economics are built around. Options are hard to make markets in — that is exactly why the fee that pays you for it starts at 2% rather than 30 basis points, and rises from there. Simulated against the deployed curve, that design puts the median liquidity provider at around 10% a year.
What you need first
A pool always receives two assets, for the same option leg:
- USDC — ordinary balance
- Option tokens of the leg you want to make a market in
You can bring the option tokens yourself — mint them first: post collateral, receive both legs, then put one leg into a pool. Or start from USDC only and let the dApp mint them in the same flow (see USDC only below).
The pool is always two-sided
The contract has no single-asset deposit. A pool is a pair, and seeding it means supplying both sides in the ratio the pool is already at (or, if you are first, in whatever ratio you choose — which sets the opening price). The dApp's USDC only mode does not change that: it mints the options for you, then deposits them with USDC.
Adding liquidity in the dApp
The page header shows the selected pair, as on /swaps; Change pair opens the list. Below it:
| Block | What it shows |
|---|---|
| Pool | Pool price, theoretical (model) price, USDC reserve, option reserve, LP supply |
| Your position | Your LP tokens, pool share, what they hold, their value at the pool price — and your share and value after this deposit |
| Pool activity | Swaps and volume over 7 days, and the latest liquidity events |
The ticket on the right has two modes.
USDC + option
Deposit USDC and options you already hold, in the pool's ratio.
- Enter the USDC to deposit or the Options to deposit. The other field fills in at the pool ratio.
- Check You deposit, LP tokens and Your pool share after.
- Click Provide liquidity. The first time, the wallet asks for USDC and option approvals for the router; then it asks for the deposit.

USDC only
You enter a number of options. The dApp mints them (1 USDC of collateral each, as on Issue options) and deposits them with USDC at the pool price.
- Switch to USDC only and enter Options to mint.
- Check Options minted, You spend (collateral plus the USDC side of the deposit) and LP tokens.
- Click Mint and provide liquidity. The wallet asks for up to five signatures: two USDC approvals, the mint, the option approval, the deposit. The page shows which step is running.

Two things to know:
- The other leg stays in your wallet. Minting always gives both legs. Mint for a Call 2,527 Long pool and you also get the same number of Call 2,527 Short. You can sell it, put it in its own pool, or hold it.
- It needs an existing pool. The mint amount is sized from the pool price, so on a new pool this mode is off. Open the pool with USDC + option first.
Slippage (1% by default, the gear button) sets how far the pool ratio may move before the deposit reverts. "Pool read 14s ago" shows how old the reserves are; the round arrow reads them again.
Adding liquidity on-chain
addLiquidity(
tradeToken, // SF Options address
tokenId, // the leg
amountStableDesired, // USDC you'd like to add
amountTradeDesired, // option units you'd like to add
amountStableMin, // slippage guards against a ratio shift
amountTradeMin,
to, // who receives the LP shares
deadline
) returns (amountStable, amountTrade, liquidity)
If a pool for that leg doesn't exist yet, the router creates it. The pair address is deterministic, derived from (option contract, tokenId), so it can be computed before it exists.
You receive LP shares — an ERC-20 token (SFSwap V0 / SFS-V0) specific to that one pool. They are transferable: whoever holds them can withdraw the underlying, which means LP positions can be moved or sold without touching the pool.
Opening a new pool
The first deposit sets the price. Shares minted are the geometric mean of the two amounts:
$$s_{minted} = \sqrt{x_{USDC} \cdot y_{option}}$$
Two consequences for the first provider:
- You are choosing the opening price. Deposit at a ratio far from the model price and the first arbitrageur will correct it at your expense. Price your opening deposit off
getOptionPrice. - A fixed
1,000,000share units — 1 LP token — are permanently locked. They are minted toaddress(1)and can never be redeemed. This is a standard anti-donation measure — it stops an attacker inflating the value of a single share unit to make the pool unusable for small providers. It costs you1 / s_mintedof the deposit: about 11% on 8.61 USDC + 10 options, under 0.1% once $\sqrt{x \cdot y}$ passes 1,000. It only ever applies to the first deposit.
On a new pool /add_liquidity says so: the Pool block reads "New pool, no liquidity yet", the theoretical price is shown so you can match it, and a warning gives the locked amount for your deposit in USDC.

Subsequent deposits mint shares pro-rata to the reserves and don't touch this.
How you earn
Every swap against your pool pays a fee in USDC, and 100% of it stays with you. Nothing is split with the protocol, nothing is routed to a treasury, and there is nothing to claim — the fee simply increases the reserves your shares are a claim on, so each share is worth more when you withdraw.
The fee starts at a 2% floor and rises with the gap between the pool price and the model price, to a 100% cap. That is far above what a spot AMM charges, and deliberately so: an option's fair value moves continuously as spot moves and as time decays, so a pool that isn't traded constantly is always somewhat stale. A 30bp fee would hand that staleness to arbitrageurs for free. Here, they pay you for it. See Dynamic swap fee.
What liquidity providers earn
Simulated against the deployed fee curve, the median liquidity provider earns around 10% a year, and the fee income comfortably outruns the cost of rebalancing.
What was simulated
A weekly cycle, repeated across hundreds of price paths, with the underlying following geometric Brownian motion at 65% annual volatility. Within each week:
- Both legs of an at-the-money weekly option are seeded at fair value, so the LP starts market-neutral.
- The week is divided into 24 sub-steps. At each one, arbitrage pushes each pool back to the edge of the no-arbitrage band — the band being exactly as wide as the dynamic fee makes it — and then one organic trade arrives.
- Organic trades are sized by a slippage budget rather than a fixed notional, so a trader cannot farm fees off their own price impact.
Weekly results are compounded to an annual figure. The model tracks four flows separately — arbitrage fees earned, organic fees earned, adverse selection paid, and the net — so the result can be decomposed rather than taken on faith.
The results

With a plausible 20% of organic flow informed, the annualised return has a median of +9.6%, a 95th percentile of +17.2%, and a distribution that clusters tightly in the 5–15% band.
The engine behind it is turnover: annual swap volume runs at roughly 6× the pooled capital. At a 2% floor and considerably more whenever the pool drifts, that volume generates fee income that outweighs the cost of being rebalanced by arbitrageurs.
Where the return comes from
Practical guidance
- Weekly options need weekly attention. Positions do not roll themselves. Each Friday's expiry is a decision point.
Next
- Withdrawing & rolling — getting capital back out
- Dynamic swap fee — the mechanics of what you earn
- Payoff & pricing — what option inventory is worth at expiry