impact PnL
zero spread at 1000× only works if tiny moves do not pay in full. so a win is trimmed. small moves are trimmed hard and big moves barely. a loss is not trimmed. you lose what the price took and nothing more.
all of it is integer math in the program. nothing below is an estimate.
the win
a winning close runs five steps:
size N = margin × leverage
move = favourable price change / entry price
m = move − deadband if m ≤ 0, the win pays 0
raw = N × m
G = raw × (1 − b) × m / (m + c) the trimmed gain
fee = ceil(2% × G)
W = G − fee what you keep on top of your marginyour margin always comes back first, in the same transaction, and is never trimmed. only the profit W can wait in the line.
the scale applied to the raw gain is (1 − b) × m / (m + c). it is the documented form (1 − b) / (1 + 1/(m·r) + N_ref/(10^6·m·p)) multiplied through by m.
the parameters
| symbol | meaning | BTC | ETH | SOL | unit and bounds |
|---|---|---|---|---|---|
| deadband | the first part of a win that pays nothing | 0.2 bp | 0.2 bp | 0.2 bp | stored as db_fp 20,000,000 of FP. bound 0 to 2 bp |
| b | the ceiling of the trim | 1000 bps | 1000 bps | 1000 bps | 10%. at most 2000 bps |
| r | curve rate | 15000 | 15000 | 15000 | 1000 to 1,000,000 |
| N_ref | reference size | $100,000 | $100,000 | $100,000 | $1,000 to $10,000,000 |
| p | per asset position multiplier | 814.598 | 483.979 | set at launch | stored as p_milli. 10,000 to 10,000,000 |
| c | derived constant | 189,426,606 | 273,287,203 | set at launch | in units of 1e-12. must stay between 10^7 and 10^10 |
| bust buffer | distance before margin hits zero | 5 bp | 5 bp | 5 bp | 1 to 9 bp |
the devnet SOL listing uses ETH's p as a placeholder. no SOL calibration exists yet. mainnet values for all three: set at launch.
c is computed as ceil(1e12 / r) + ceil(N_ref × 1000 / p_milli), rounded up so the scale is never larger than the exact one. for BTC that is 66,666,667 + 122,759,939 = 189,426,606.
what the curve does
- for a big move,
m / (m + c)goes to 1 and the scale goes to1 − b, which is 90%. a huge win keeps at most 90% before the fee. - when
mequalsc, the scale is 50% of1 − b. for BTCcis about 1.9 bp, so a win of about 2 bp past the deadband keeps about 45%. - for a tiny move, the scale is about
m / c. it falls to zero as the move does.
the examples
BTC long, entry $83,000, $100 margin at 1000×. every number is from the exact integer function.
| move | exit | raw gain | after the 0.2 bp zone | trimmed gain | share of raw | fee 2% | you keep |
|---|---|---|---|---|---|---|---|
| +0.0015% | $83,001.245 | $1.50 | $0.00 | $0.00 | 0% | $0.00 | $0.00 |
| +0.005% | $83,004.15 | $5.00 | $3.00 | $0.369143 | 7.38% | $0.007383 | $0.361760 |
| +0.1% | $83,083 | $100.00 | $98.00 | $73.913146 | 73.91% | $1.478263 | $72.434883 |
| +0.5% | $83,415 | $500.00 | $498.00 | $431.776320 | 86.36% | $8.635527 | $423.140793 |
| +1% | $83,830 | $1,000.00 | $998.00 | $881.469167 | 88.15% | $17.629384 | $863.839783 |
| +5% | $87,150 | $5,000.00 | $4,998.00 | $4,481.215975 | 89.62% | $89.624320 | $4,391.591655 |
the first row is inside the deadband, so it pays nothing. the +0.5% row is also the worked example 15.1(a) of the spec.
the same numbers for a short work the same way when the price falls.
the loss
loss = min(margin, ceil(N × adverse move / entry)) rounded up
you get back margin − loss, at oncethe loss is rounded up, so you pay the rounding, not the house. it can never exceed the margin.
example: BTC −0.03%, exit $82,975.10. you lose $30.000000 and $70 comes back.
the bust
each bet has a bust price, set one bust buffer (5 bp) before the margin hits zero:
distance = 1 / leverage − 5 bp
bust = entry × (1 − distance) long
bust = entry × (1 + distance) short| leverage | distance to bust |
|---|---|
| 1000× | 0.05% |
| 100× | 0.95% |
| 10× | 9.95% |
| 1× | 99.95% |
the distance is rounded toward the entry, so the trigger is never farther than the exact figure. a tick at or past the bust dusts the bet and the whole margin is forfeited.
example: 1000× long at $83,000 busts at $82,958.50. a tick at $82,950 dusts it. the bounty is $0.10 and the house side fee is $2.00 if the line is empty.
fees
| fee | rate | taken from | when |
|---|---|---|---|
| open | none | never. no entry fee, no funding, no spread | |
| win | 2% of the trimmed gain, rounded up | your gain | only if the line is empty and the win is paid in full and the house holds the cash for the fee |
| loss | 2% of the loss, rounded down | the house side, not on top of your loss | only while nobody waits in the line |
| bust | 2% of the margin, rounded down | the house side | only while nobody waits in the line |
| activation | $1 | your first deposit | once |
the win and loss fee are owner settable, never above 500 bps (5%) each.
a win that has to wait in the line pays no fee. take profit and stop loss add no fee.
where a fee goes
a fee is split once, when it is paid:
stakers = floor(fee × STAKER_SHARE_BPS / 10000) STAKER_SHARE_BPS = 5000
dev cut = fee − stakers
referrer = floor(dev cut × REF_BPS[tier] / 10000) 20% at tier 0, 40% at tier 1
dev kept = dev cut − referrerthe referrer comes out of the dev cut only. stakers and the house see no change.
worked split of the +0.5% win fee, 8,635,527 micro USDC:
| to | no referrer | tier 0 referrer | tier 1 referrer |
|---|---|---|---|
| stakers | 4,317,763 | 4,317,763 | 4,317,763 |
| referrer | 0 | 863,552 | 1,727,105 |
| dev | 4,317,764 | 3,454,212 | 2,590,659 |
orders and the price they use
- take profit. closes at exactly the trigger price, on the win path. the overshoot of the crossing tick stays with the house.
- stop loss. closes at the worse of the trigger and the tick that crossed it, on the loss path. a gap through a stop is paid by the trader, not by the house.
- limit order. fills at exactly the limit price. the jump past it stays with the house.
- a tick that is at or past the bust belongs to
liquidate, never to a stop or a take profit.
DUST MODE
a DUST MODE round is binary. the payout is between −1× and +1× the margin.
g0 = min(L × move, 1) the move scaled by leverage, capped at 100% of margin
g1 = max(g0 − L × deadband, 0) the cell's deadband in margin units
mh = g1 / L the price move that g1 equals
G = M × g1 × (1 − b_dm) × mh / (mh + c_dm)
fee = ceil(2% × G)
adverse move: loss = min(M, ceil(M × L × move)) there is no deadband on a loss
g1 = 0: push, margin back, no fee, no $DUSTb_dm, c_dm and the deadband are set per cell: one for each leverage (5000×, 10000×) and horizon (5 s, 15 s, 60 s) pair. with c_dm at 0 the haircut is flat: G = M × g1 × (1 − b_dm).
examples with the pre calibration cell, deadband 0.1 bp and no haircut:
| round | move | gain before fee | fee | you keep |
|---|---|---|---|---|
| 10000×, $100 | +1.3 bp | $90.00 | $1.80 | $88.20 |
| 5000×, $100 | +1.3 bp | $60.00 | $1.20 | $58.80 |
| 10000×, $100 | −1.3 bp | lose $100 | $0 | |
| 10000×, $100 | +0.05 bp | push | $100 back |
the devnet cell values are in parameters. a round can lose at most its margin and win at most its margin, so the house has no gap risk on it.
rounding
the rule is one line: whatever you receive rounds down, whatever you pay rounds up, a bust trigger rounds toward the entry, and emissions round down. the test suite checks it against exact fractions.
