mainnet is not live yetdevnet beta is live at play.dust.bid
skip to content

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 margin

your 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 ​

symbolmeaningBTCETHSOLunit and bounds
deadbandthe first part of a win that pays nothing0.2 bp0.2 bp0.2 bpstored as db_fp 20,000,000 of FP. bound 0 to 2 bp
bthe ceiling of the trim1000 bps1000 bps1000 bps10%. at most 2000 bps
rcurve rate1500015000150001000 to 1,000,000
N_refreference size$100,000$100,000$100,000$1,000 to $10,000,000
pper asset position multiplier814.598483.979set at launchstored as p_milli. 10,000 to 10,000,000
cderived constant189,426,606273,287,203set at launchin units of 1e-12. must stay between 10^7 and 10^10
bust bufferdistance before margin hits zero5 bp5 bp5 bp1 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 to 1 − b, which is 90%. a huge win keeps at most 90% before the fee.
  • when m equals c, the scale is 50% of 1 − b. for BTC c is 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.

moveexitraw gainafter the 0.2 bp zonetrimmed gainshare of rawfee 2%you keep
+0.0015%$83,001.245$1.50$0.00$0.000%$0.00$0.00
+0.005%$83,004.15$5.00$3.00$0.3691437.38%$0.007383$0.361760
+0.1%$83,083$100.00$98.00$73.91314673.91%$1.478263$72.434883
+0.5%$83,415$500.00$498.00$431.77632086.36%$8.635527$423.140793
+1%$83,830$1,000.00$998.00$881.46916788.15%$17.629384$863.839783
+5%$87,150$5,000.00$4,998.00$4,481.21597589.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 once

the 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
leveragedistance 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 ​

feeratetaken fromwhen
opennonenever. no entry fee, no funding, no spread
win2% of the trimmed gain, rounded upyour gainonly if the line is empty and the win is paid in full and the house holds the cash for the fee
loss2% of the loss, rounded downthe house side, not on top of your lossonly while nobody waits in the line
bust2% of the margin, rounded downthe house sideonly while nobody waits in the line
activation$1your first depositonce

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 − referrer

the 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:

tono referrertier 0 referrertier 1 referrer
stakers4,317,7634,317,7634,317,763
referrer0863,5521,727,105
dev4,317,7643,454,2122,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 $DUST

b_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:

roundmovegain before feefeeyou 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 bplose $100$0
10000×, $100+0.05 bppush$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.