Pricing and fees
Every number here is a constant in programs/today/src/constants.rs or a function in pricing.rs. The site's calculators use a line-for-line port of the same code.
The premium
The close is modelled as today's price plus a normal move (Bachelier). Over a few hours the normal and lognormal models differ by far less than the error in any volatility estimate, and the normal one needs no logarithm in integer math.
For a stock at price S, a strike K and t seconds to the close:
sd = S x vol x 1.10 x sqrt(remaining(t))
calm = sd / sqrt(1.525)
wild = calm x 2.5
price = 0.9 x bachelier(S, K, calm) + 0.1 x bachelier(S, K, wild)
bachelier(S, K, sd) = (S - K) x N((S - K) / sd) + sd x n((S - K) / sd)
volis the market's daily (open to close) volatility: the square root of its learned variance, never below its floor.1.10isVOL_MARKUP: the vault charges 10% over its own estimate.- The two normals mix calm days with a 10% chance of a day with 2.5 times the move, which gives the tails real stocks show.
1 / sqrt(1.525)keeps the mix's variance equal to the input. - The result is rounded up by one unit so the vault never sells below its model.
How much of the day is left
Variance does not arrive evenly through a session: the first and last hours move most. remaining(t) is the share of a day's open-to-close variance still ahead, measured on hourly NVDA, SPY and TSLA bars from October 2023 to October 2026 with the top 1% of days trimmed.
| Time to the close | Share of the day's variance still ahead |
|---|---|
| 6 h 30 min (the open) | 100% |
| 5 h 30 min | 59.3% |
| 4 h 30 min | 43.3% |
| 3 h 30 min | 34.4% |
| 2 h 30 min | 23.8% |
| 1 h 30 min | 15.8% |
| 30 min | 8.5% |
| 0 | 0% |
Values in between are interpolated linearly.
Volatility at launch and after
| Market | Starting daily volatility | Floor | Strike tick |
|---|---|---|---|
| NVDAx | 1.42% | 1.2% | $0.50 |
| AAPLx | 1.07% | 0.9% | $1 |
| TSLAx | 1.86% | 1.6% | $1 |
After each settled day the program updates the variance on chain as an exponentially weighted average with decay 0.94, using the day's squared move from the listing price to the 4 pm price, scaled up for the share of the day that was left at listing. A day listed after about 11 am (less than half of the variance ahead) teaches nothing, and one day's squared move is capped at (20%)^2.
Example
NVDAx at $214.00 at the open, launch volatility:
| Strike | At the open | With 2 hours left | With 10 minutes left |
|---|---|---|---|
| $214.00 | $1.2424 | $0.5528 | $0.2091 |
| $216.00 | $0.5078 | $0.0676 | $0.0018 |
| $217.50 | $0.2431 | $0.0188 | $0.0000 |
| $219.00 | $0.1215 | $0.0061 | $0.0000 |
| $220.50 | $0.0674 | $0.0017 | $0.0000 |
These are premiums per share before the fee, with the price held at $214.00 all day. That fall in value as the clock runs is what the holders are paid for.
The fee and the burn
Buyers pay FEE_BPS = 1,000 bps, 10% of the premium, on top of it. The fee is held in the market's USDC vault during the day and moved to the burn account at settlement. All of it is spent on TAPER:
burn(amount)can be called by anyone. It swaps up to 1,000 USDC per call, and at most 0.1% of the pool's USDC side, for TAPER on the Raydium CPMM pool set at launch, then burns what it bought.- The swap must return at least 98% of what the pool's own 30-minute TWAP promises. Moving the pool 2% to sandwich a crank costs more in pool fees than the crank can give up.
- There is no treasury and no wallet of ours in the path.
Worked example: $1,000,000 of premium sold carries $100,000 of fees, and all $100,000 buys TAPER and burns it. In notional terms, $1,000,000 of at-the-money NVDA calls bought at the open costs about $8,190 of premium (0.82%), so $819 of TAPER is burned.
Payouts
A call on q shares at strike K, settled at price S above K, pays q x (S - K) / S shares of the xStock: worth exactly q x (S - K) dollars at the 4 pm price. Paying in the stock means the vault never needs USDC to settle. The xStock's dividend multiplier cancels out of the payout.
