Skip to content

Fees and PnL ​

Every fee ​

FeeCurrent valueWhenWho paysWhere it goes
Opening feeNone———
Funding or borrow feeNone———
Spread or price impact on entry/exitNone———
Win haircut7.7% base, more on small moves, 0.31 bp deadband (formula)Every winning closeReduces your winStays in the house
Payout fee2% (fee_bps = 200) of the haircut winEach payment of a win, whether immediate or a queue paymentDeducted from what you receiveFee split below
Loss fee2% of the realized lossLosing closes and liquidations, only while the payout queue is emptyTaken out of your loss on the house side; you never pay more than the lossFee split below
Execution fee500,000 lamports (0.0005 SOL) per requestEvery open or close requestYou, in SOLWhoever posted the pinned Pyth update. If the request expires: ¼ to the canceller, ¾ back to you.
Account rent≈ 0.0016–0.0022 SOL per accountWhen accounts are createdYou, in SOLRefundable, except the trading account's (details)
Deposit or withdrawal feeNone———

Fee split. staker_share_bps is 5000, so stakers get floor(fee × 50%) and the rest goes to dev_fees. The staker share streams to $NOTE stakers in USDC ($NOTE). The admin can withdraw dev_fees, but only up to the amount accrued.

All fee rates are governance parameters. fee_bps can never exceed 1000 (10%). The fee on a queued win is taken when it is paid, at the fee_bps in force at that moment.

How a close settles ​

Notation: amounts are in USDC base units (6 decimals) and prices have 8 decimals.

dist = |exit − entry|
favourable = (exit > entry) for a long, (exit < entry) for a short

The program evaluates these cases in order:

  1. Bust. If the exit price is at or past the bust price, the close settles as a liquidation: returned = 0, and the whole margin is lost no matter what the raw loss is. This applies to your own close too (Liquidation).
  2. Loss (unfavourable move):
    raw_loss = ceil(notional × dist / entry)
    loss     = min(raw_loss, margin)
    returned = margin − loss
    The house receives loss − floor(loss × 2%) and the fee is split. If the queue is active, the fee is waived and the whole loss goes to the house's side bucket. Either way the trader loses loss.
  3. Win (favourable move, or no move):
    raw_pnl  = floor(notional × dist / entry)
    adjusted = haircut(notional, entry, dist)
    • adjusted = 0 (the move is inside the deadband): returned = margin.
    • The queue is empty and the treasury holds at least adjusted: fee = floor(adjusted × 2%), returned = margin + adjusted − fee.
    • Otherwise the win is queued: returned = margin now, plus a payout-queue claim for adjusted. Each payment p on the claim credits p − floor(p × fee_bps / 10000), at the fee_bps in force when p is paid (The house).

$NOTE minted at close ($NOTE): a win mints on raw_pnl − floor(raw_pnl × fee_bps / 10000), its raw PnL before the haircut net of a 2% fee, whether it is paid now or queued, and even if the haircut makes it pay $0. A loss mints on loss − fee (or on loss while the queue is active), and a liquidation mints on the full margin. A close with zero raw PnL mints nothing.

returned is credited to your available balance (trading balance), not your wallet. Your margin is always returned in full on a winning close; only the win itself can queue.

Every close emits a PositionClosed event with exit, raw_pnl, adjusted, returned, queued (the claim amount), fee, the $NOTE minted and kind: 0 = loss, 1 = win, 2 = liquidation, 3 = settled at a retired market's final price.

Your net PnL is returned − margin, plus later queue payments. Loss amounts round up, and win amounts and $NOTE mints round down.

Worked examples ​

All examples use current parameters: BTC long, entry $100,000, margin $1,000, 10x leverage, notional $10,000.

Win: exit $101,000 (+1%), queue empty

Raw PnL10,000 × 1,000 / 100,000 = $100.000000
Haircut win10,000 × (0.01 − 0.000031) × 0.923 × 0.01 / 0.010185 = $90.342533
Payout feefloor(90.342533 × 2%) = $1.806850 (stakers $0.903425, dev $0.903425)
Returned1,000 + 90.342533 − 1.806850 = $1,088.535683
Net PnL+$88.535683 (88.5% of raw)
House treasury−$90.342533
$NOTE minted(100 − 2) × mint rate on the raw PnL (at the current flat rate of 44 per $1: 4,312 $NOTE)

Same win while the queue is active (or the treasury holds less than $90.342533): you get $1,000 back now and a claim for $90.342533. Paid in a single payment at a 2% fee, it nets $88.535683. Paid in several installments, it can net slightly more, because each installment's fee rounds down separately: for example $45.171284 + $45.171249 nets $88.535684. The 4,312 $NOTE is minted at close, not when the claim is paid.

Small win: exit $100,050 (+5 bps): raw $5.000000, haircut win $3.159759, fee $0.063195, net +$3.096564 (61.9% of raw). It mints on $4.90: 215.6 $NOTE at 44 per $1.

Deadband win: exit $100,002 (+0.2 bps): raw $0.200000, haircut win $0 (inside the 0.31 bp deadband), so you get your margin back with no gain, but it still mints on $0.196: 8.624 $NOTE.

Loss: exit $99,000 (−1%), queue empty

Lossceil(10,000 × 1,000 / 100,000) = $100.000000
Returned$900.000000
Loss fee$2.000000 (stakers $1, dev $1), taken from the $100
House treasury+$98.000000
$NOTE minted98 × mint rate (at the current flat rate of 44 per $1: 4,312 $NOTE, the same as the +1% win)

Loss bigger than the margin: a loss is capped at the margin. But at the bust price, which is before zero equity, the position settles as a liquidation anyway (Liquidation).

Papersol is experimental software. Trading with leverage can lose your whole margin.