Skip to content

Markets and parameters ​

The current values below are those of the current deployment (Solana devnet). The deployment scripts state that devnet uses the same economics and execution parameters intended for mainnet. Where the runbook says mainnet values will differ, the "Mainnet" column says so; "TBD" means not yet decided. Every value marked Proposal can change only through a timelocked governance proposal after launch.

Markets ​

IndexSymbolPyth feed idStatus
0BTCe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43Live
1ETHff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0aceLive
2SOLef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56dBeing added by an AddMarket proposal

Launch markets: BTC, ETH and SOL. New markets are added by an AddMarket proposal.

Market parameters (MarketParams, per market; Proposal) ​

ParameterMeaningCurrent (BTC, ETH, SOL)Program boundsMainnet
max_leverageHighest leverage for new opens10001–1000—
min_marginSmallest margin per open$1> 0TBD
max_position_notionalLargest notional per position$10,000,000> 0TBD ("start very low")
oi_cap_long, oi_cap_shortOI ceiling per side (live + pending)$5,000,000,000—TBD (size to Pyth depth)
impact.base_rate_bpsWin haircut floor770 (7.7%)< 10,000—
impact.c_e9Haircut curve constant185,000 (1.85 bps)< 1e9—
impact.deadband_e9Moves at or below this pay no win31,000 (0.31 bps)< 1e9—
retiredNo new opens; closes continuefalse——
crowd_oi, avg_samples, avg_step_sCrowded-side averaging (disabled)u64::MAX, 8, 4Production builds require crowd_oi = u64::MAX. All builds require avg_samples 3–8, avg_step_s 1–30, and (avg_samples − 1) × avg_step_s ≤ 120Disabled

Live market state (not parameters) ​

FieldChanged byMeaning
oi_limit_long/shortRisk keeper, instantly; must stay between current usage and the ceilingTrailing OI limit for new requests. The keeper keeps it at usage + $5M, ±10%.
oi_brake_long/shortAdmin or guardian lower it; only the admin raises itEmergency cap on requests and fills. Off = u64::MAX.
last_oracle_ts, last_oracle_priceFills, heartbeats and liquidations; a liquidation price that fails the confidence check advances only last_oracle_tsOracle watermark: newest recorded publish time and its price
settle_pin_tspropose(SettleMarket) sets it to the proposal's eta; cancelling the proposal or re-opening the market clears it, allowed only while both the Solana clock and the market's last_oracle_ts are more than 1 h before its pin, or after the settlement lapses (more than 7 days after the pin)Settlement pin (0 = none). From it on, close requests must be pinned before it and liquidations must use prices published before it
settle_priceSettleMarket proposal, onceA retired market's final price: the Pyth update pinned at settle_pin_ts if it is admissible under the limits recorded in the proposal, otherwise the proposed price (Oracle and safety)

Economics (Economics, global; Proposal) ​

ParameterMeaningCurrentProgram bounds
fee_bpsLoss fee and payout fee200 (2%)≤ 1,000
staker_share_bpsStakers' share of fees (the rest goes to dev)5,000 (50%)≤ 10,000
bust_buffer_e9Bust trigger distance before zero equity500,000 (0.05%)< 1,000,000
staker_capTreasury above this is swept to stakers while the queue is empty$5,000,0000 to i64::MAX base units
cliffHouse size where the mint rate starts decaying$2,000,0000 to i64::MAX base units
decay_sMint decay constant S$120,000,000> 0
flat_per_usd$NOTE per $1 of PnL basis (wins and losses) in the flat region440–1,000,000 (0 stops emission)
reward_stream_sStaker revenue vesting window3,600 s3,600 s–7 days (0–7 days in test and devnet-feature builds)
monotonic_mintMint rate never resets to flattrue—

Execution (ExecParams, global; Proposal) ​

ParameterMeaningCurrentProgram boundsMainnet (runbook)
pin_delay_sPin = max(clock, watermark + 1) + this6 s4–60 (1–60 in test and devnet-feature builds)6, open decision (possibly 8) after mainnet measurement
fill_window_sFill deadline after the pin30 s5–60030–60
liq_max_age_sMaximum age of a liquidation price (also of a heartbeat price)10 s1–12010
max_conf_bpsMaximum Pyth confidence / price50 (0.5%)1–1,00050
max_ema_dev_bpsMaximum price deviation from EMA500 (5%)1–5,000500
max_obs_age_sMaximum watermark age for new requests60 s1–6060
max_clock_lag_sMaximum watermark lead over the Solana clock5 s1–605
exec_fee_lamportsSOL per request, paid to the price poster500,000≤ 10,000,000200,000–1,000,000

Other global settings ​

SettingMeaningCurrentChanged by
max_trader_notionalOpen + pending notional per trader, all markets$10,000,000Proposal (> 0); mainnet TBD
timelock_delay_sDelay before a proposal can execute60 s (devnet, set before the launch floor existed)Proposal, ≤ 30 days and never below the lesser of the current delay and 24 h. Production builds refuse to launch below 24 h. Mainnet ≥ 48 h per runbook
pausedBlocks new opensfalseGuardian or admin pause; admin unpause
guardian, risk_keeper, adminRolesDevnet: admin = guardian = upgrade authority; risk keeper = the primary keeperProposal (admin handover also needs accept_admin)

Fixed in the program (an upgrade is needed to change these) ​

ConstantValue
Maximum leverage1000
Pyth receiver programrec2HHDDnjLfj4kE7VyEtFA1HPGQLK33259532cRyHp
Pinned update may lead the Solana clock by≤ 60 s
Maximum session-key lifetime30 days
Cancel bounty¼ of the execution fee
Proposal grace period after eta7 days
Maximum timelock30 days
Settlement price bandProposed price within 10% of the last verified oracle price (checked when proposed, and again on the dead-feed path)
Settlement execution delayOnly after pin + 120 s (the liq_max_age_s ceiling), when no pre-pin price can still liquidate
Settlement veto margin3,600 s (2 s in test and devnet-feature builds): a settlement can be cancelled, or its market re-opened, only while both the Solana clock and last_oracle_ts are earlier than pin − this, or after it lapses
Dead-feed settlementAdmin only, at least 24 h after the pin, and only if no update at or after the pin was ever recorded
Production floorsLaunch timelock ≥ 24 h; reward_stream_s ≥ 3,600 s; pin_delay_s ≥ 4 s (relaxed in test and devnet-feature builds)
Timelock change floor (all builds)≥ the lesser of the current delay and 24 h
Staking tranches10 slots; epoch = ceil(reward_stream_s / 8)
UnitsUSDC 6 decimals; prices 8 decimals; $NOTE 6 decimals

Keeper settings (off-chain, operational) ​

These are defaults of the Papersol keeper software, not program rules:

SettingDefault
Heartbeat period30 s per quiet market
Liquidation scanevery 1 s per market
Trailing OI headroom$5,000,000 per side, re-targeted outside ±10%
Harvest attemptevery 2 s while the queue has backing
Retired-market settlementevery 10 s: executes a due SettleMarket proposal with the pinned update as soon as the program allows, keeps filling closes committed before the pin, and runs settle_retired on each position in a settled market that has no pending close
Stuck-settlement alerta due settlement still not executed 10 min after its pin
Undecodable-request alertrequest accounts are decoded one by one; one that doesn't decode (a pre-upgrade layout) is skipped and alerted (undecodable-requests) until someone runs migrate_request on it
Standby keepertakes over fills unfilled 6 s after their pin; posts heartbeats once the watermark is 4 s old

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