Paperps docs
Synthetic perpetuals settled fully on-chain against a protocol-owned pool. This is a public testnet: every balance is play money, and this page describes how it behaves today.
Overview
Every trade is a synthetic long or short against the protocol LP, priced at the oracle mid. There is no order book, no counterparty matching, no funding rate and no spread. The LP starts empty and is funded only by traders' realised losses; it pays traders' realised wins.
Opening a position
Pick a side, commit USDC margin and choose leverage from 1× to 1000×. The minimum margin is $1 per order, the value set at listing; the exchange refuses anything smaller. The position's notional is margin × leverage. Positions are discrete: you can hold many at once and each one closes on its own.
Trading is two-step. Placing an order locks its margin; the order then fills at the first price the oracle pushes after the block it was placed in, so a price you could already see is never the price you get. The fill can therefore differ slightly from the mid shown on the ticket. A close works the same way.
Order expiry
An order can be filled for at least 20 blocks and 20 seconds after it is placed, whichever ends later. If it has not filled by then it can be cancelled by anyone and its margin goes back to your balance; before that it cannot be cancelled, so nobody can watch the price arrive and walk away from it. A close that has not filled is cancelled the same way.
If a rule no longer holds at the moment an order fills, the order is refunded instead of failing the others. The reasons you can see:
| Open-interest limit | This market has reached its limit on that side, or too much is open on that side overall, or you would hold more than one account may on one side. Try a smaller size or later. |
| Market paused | Opens are paused for the market or for everything. Closes still work. |
| Position below the minimum | Margin under $1. |
| Insufficient balance | Your balance no longer covers the margin. |
| Price window passed | The oracle price needed to fill the order was no longer available. |
| Account can only close | The account is restricted to closing positions. |
Open-interest limits
Three limits apply to new opens on each side (long and short). Positions already open are never affected when a limit changes.
- Per-market cap. Each market has a cap on long and on short open interest, kept by the market keeper below a ceiling the owner sets.
- Overall budget. All markets together, one side may hold at most a floor plus a multiple of the house's net equity. The values set when the contracts were deployed are a $500,000 floor and 5× equity; the owner can change them.
- Per-account share. One account may hold at most a share of that budget on one side (25% at deployment). Open interest is notional: margin × leverage.
The ticket disables Place Trade with "Limited by OI cap" when the market cap would be crossed. The overall budget and the account share are checked when the order fills, so those refunds can arrive after you placed it.
Busts
A position busts when price moves against it by about 1/leverage minus the market's adverse bust spread (0.0476% on BTC, 0.0481% on ETH). At 1000× that is about 0.05% (the zero-equity move is 0.1%, then the spread is applied); at 100× about 0.95%; at 10× about 9.96%. On a bust the whole margin goes to the LP and mints FEESHARE.
Winning closes
Wins are paid in three steps:
- A 0.2 bp dead band is removed from the move; a smaller win pays nothing.
- An impact haircut scales the gain:
scale = (1 − baseRate) / (1 + 1/(move·rateMult) + refNotional/(1e6·move·posMult)). Small moves on big size are cut hardest; scale never exceeds 90%. - A 2% win fee comes off the scaled gain, split between stakers and the developer.
Losing closes
Losses are taken at face value, floored at your margin, with nothing extra charged. A 2% fee is carved from the LP's gain (waived while the payout queue is active), and every $1 lost mints FEESHARE.
Solvency and the payout queue
If the LP's free cash can't cover a win, the unpaid part joins a first-in-first-out queue and is paid from later losses through a permissionless harvest(). Queued balances are claims, not cash: they can be used as margin, and they settle strictly in order.
FEESHARE
FEESHARE is minted on realised losses and busts: a flat 100 FEESHARE per $1 lost while the tracked LP is under $2M. Above that, the rate follows a one-way high-water-mark ratchet: it only ever goes down, so early losses earn the most.
Staking
Staked FEESHARE earns USDC. A close fee of 2% of the adjusted PnL is charged and, by default, half of every fee goes to stakers (about 1% of settled trader PnL), plus everything in the LP above the $5M cap. Fees are pushed to stakers only while the payout queue is empty, and released over one day.
- Minimum stake: 1,000 FEESHARE. Topping up an existing stake of 1,000 or more has no minimum; an unstake must leave nothing or at least 1,000.
- Unstake cooldown: 1 day. A stake must stay a day before it can leave, and each top-up restarts the day for the whole balance. Claiming rewards has no cooldown.
Deposits
On testnet, deposits come from Sepolia test tokens. The minimum deposit is $1.
- Create or unlock your trading wallet, then press Deposit. Your external wallet needs a little Sepolia ETH for gas, and test USDC (the deposit window has a button to get 1,000).
- Confirm the Sepolia transaction in your external wallet. This locks the test USDC in the Sepolia vault.
- You can close the tab once that Sepolia transaction is sent. The crediting happens on our servers, not in your browser: they pool the lock, mint USDC on the exchange chain and credit your account. The deposit shows as pending until it is credited, usually within a few minutes.
- Deposits above $1,000 wait for extra confirmation first, usually about 15 to 20 minutes. Your funds are safe in the meantime and show as pending.
Session keys
Enabling trading registers a session key with one wallet signature. It signs open and close intents silently, so trading needs no wallet pop-ups. It can never withdraw, stake or claim, but it can trade, so a stolen key could still lose the balance of the account through bad trades.
- Lifetime: up to 7 days, then you enable trading again (the app asks in the last hour). A key whose owner has set hard limits may live up to 30 days.
- Limits an owner can put on a key: the most margin per open, the most margin over the key's whole life (a budget that a close does not give back), and the most leverage. Set the limits before registering the key.
- Intents expire 15 minutes after they are signed.
Arena
Arena is a game on top of the exchange: you trade as usual and your closed positions give you a class, a level, badges, a season ranking, duels and legions. It never touches your trading funds, except legions, and adds no extra bets. The full rules are in the Arena pages.
- Class and level. After 5 closed positions you get a class from how you trade (Rogue, Berserker, Sage, Tank or Ranger); the level grows with the number of closes.
- Seasons. A season is a 14-day return board. To be ranked you need at least 5 positions opened in the season and capital between $100 and $10,000 (what the account held at the start plus what it paid in). On the final board, margin still open when the season ends counts as lost, so close positions before it ends. The top places can win a testnet prize pool.
- Duels. A 1v1 match with agreed capital ($10 to $10,000), a leverage cap (1× to 10×) and a duration (5 minutes to 24 hours). Only positions opened inside the window with the match key count; open margin at the end counts as lost, and returns within 5 bp are a draw.
- Legions. A commander funds soldiers who trade with a key that can open and close but never withdraw. Profit above the allocation is shared at a fixed ratio; a stop line (at most 50% loss) ends the cycle.
Fees at a glance
| Opening | None |
| Funding / spread | None |
| Winning close | Impact haircut, then 2% of the scaled gain |
| Losing close | Nothing extra (2% carved from LP gain) |
| Staker share | Half of every fee (about 1% of settled PnL) + LP overflow above $5M |
| Minimum margin | $1 per order |
| Unstake cooldown | 1 day |
Risks
- Leverage. At 1000× a 0.05% move ends the position.
- Oracle. Prices come from an external feed. A manipulated or stale mid moves every position; staleness and deviation guards reduce but don't remove this.
- Queue. If wins outrun losses, payouts wait in the queue until new losses refill the LP.
- Admin. On this testnet a single owner key can pause markets, change parameters and upgrade the contracts, and there is no timelock yet. A multisig behind a 7-day timelock is the plan for mainnet; it is not live today.
- Code. The contracts are unaudited. Testnet only.