Overview
Perpsons is a perpetual futures exchange on Robinhood Chain. You trade BTC, ETH and 30 US stocks and ETFs with leverage, up to 100x on crypto, margined in USDG.
- Network
- Robinhood Chain mainnet, an Arbitrum Orbit L2 that settles to Ethereum. Chain id 4663.
- Collateral
- USDG (Paxos Global Dollar). Gas is paid in ETH.
- Markets
- 32 USD-quoted perpetuals: BTC, ETH, 5 ETFs (gold, silver, oil, S&P 500, Nasdaq-100) and 25 stocks.
- Margin
- Isolated per position. Up to 100x on BTC and ETH, 50x on the ETFs and the largest stocks, 20x on the rest.
- Prices
- Signed by the Perpsons price signer every 10 s, held within 1% of Chainlink and verified on-chain in every trade.
- Counterparty
- The PLP vault takes the other side of every trade.
- Custody
- Noncustodial. Funds sit in the Perpsons contracts and only your wallet can withdraw them.
- Status
- Contracts not deployed yet. Live prices and charts are on.
A perpetual future follows the price of an asset and never expires. You do not own the asset. Gains and losses settle in USDG when you reduce or close a position, and open positions pay or receive funding over time.
Markets
| Market | Class | Price feed | Trading hours | Max leverage | Now |
|---|---|---|---|---|---|
| Crypto | BTC1 signer · Chainlink ±1% | 24/7Every day, all day | 100x | — | |
| Crypto | ETH1 signer · Chainlink ±1% | 24/7Every day, all day | 100x | — | |
| ETF | GLD1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| ETF | SLV1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| ETF | USO1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| ETF | SPY1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| ETF | QQQ1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | NVDA1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | AAPL1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | MSFT1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | GOOGL1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | AMZN1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | META1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | TSLA1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | TSM1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 50x | — | |
| Stock | ASML1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | AMD1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | MU1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | INTC1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | ORCL1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | PLTR1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | DELL1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | SNDK1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | COIN1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | MSTR1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | CRCL1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | SPCX1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | BABA1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | CRWV1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | NBIS1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | RKLB1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — | |
| Stock | GME1 signer · Chainlink ±1% | NYSE regular sessionMon–Fri 09:30–16:00 ET | 20x | — |
Every stock and ETF listed here is also a Robinhood Chain stock token with a Chainlink price feed on Robinhood Chain, which the oracle uses as its reference (see Chainlink band). A stock or ETF perpetual gives you no shares, fund units, votes or dividends, and Perpsons is not affiliated with these companies or funds.
Getting started
You need a wallet, a little ETH for gas and USDG on Robinhood Chain.
Get a wallet
Any wallet that connects through WalletConnect or a browser extension works. Perpsons runs only on Robinhood Chain (chain id 4663). The app asks your wallet to add or switch to it.Bridge ETH for gas
Every transaction costs a small amount of ETH on Robinhood Chain. Bridge some from Ethereum or another network. The Robinhood Chain bridging guide (opens in a new tab) lists the options. The canonical Arbitrum bridge takes about 10 minutes in and about 7 days out; third-party bridges are faster.Bring USDG
Perpsons accepts only USDG at0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168. USDC bridged through the canonical gateway is a different token and cannot be deposited. Check the token address before you bridge or swap.Connect and deposit
Connect your wallet, open Deposit and enter an amount. You approve that exact amount, then deposit it into your trading account: two transactions.Trade
Pick a market, set leverage and size, and place the order. Market orders fill at the next oracle price, usually 10 to 20 seconds later.Withdraw any time
Free balance, meaning USDG that is not in a position or reserved by an open order, can be withdrawn to your wallet at any time, including while trading is paused.
Network blocked?
Some internet providers block*.robinhood.com. The app falls back to another RPC on its own, but your wallet may need a custom RPC for Robinhood Chain, such as https://robinhood-rpc.publicnode.com.Prices & oracle
Every fill, liquidation and margin check uses a signed price that is verified inside the Perpsons oracle contract and must sit within 1% of the market's Chainlink price.
Signed prices
The Perpsons price signer reads public quotes every 2 seconds: Coinbase, Kraken, Bitstamp and Hyperliquid for BTC and ETH, Yahoo Finance and Hyperliquid for the stocks and ETFs. It takes the median per market and signs one price package per market every 10 seconds, plus one package with the NYSE session status. The PerpsonsOracle contract checks the signature on-chain and stores the price. Trades do not wait for prices to be pushed to the chain: the signed package travels inside the transaction that uses it.
One signer, run by the operator
There is a single price signer and the operator of Perpsons runs it, so the oracle needs one signature per price. Nobody else checks its quotes before they are used; the Chainlink band below limits how far a signed price can be from the market. Adding signers or raising the number of signatures required goes through a 2-day timelock.Chainlink band
Each market has a Chainlink price feed on Robinhood Chain (BTC / USD, ETH / USD and one feed per stock token). PerpsonsOracle accepts a signed price only within 1% of that reference, and only while the reference is fresh: at most 26 hours old for BTC and ETH and 4 days for the stocks and ETFs, whose feeds pause over weekends. Outside the band the price is refused (PriceOutOfBand), and with a stale or missing reference no price is accepted at all (ReferenceStale, ReferenceInvalid). Chainlink updates these feeds on a 0.5% move or every 24 hours, so the reference itself can lag the market by up to about 0.5%.
The fee is set to match the band. A trade opened at one edge of the band and closed at the other gains at most 2% of its notional, and the 1% fee on each side costs 2%, so a price at the edges of the band cannot be traded for a profit. Band and reference changes go through a 2-day timelock.
|signed price − Chainlink reference| ≤ 1% × reference
reference age ≤ 26 h (BTC, ETH) ≤ 4 days (stocks, ETFs)Next-price execution
A market order does not fill at the price on your screen when you click. It fills at the first oracle price published after the order was created, within 20 s. Packages are signed every 10 seconds and take a few seconds to reach the relay, so a fill usually lands 10 to 20 seconds after you place the order. Nobody, including keepers, can fill your order at a price older than the order.
order created at t0
valid price time: t0 ≤ price time ≤ t0 + max delay (20 s at launch)
→ at most two signed rounds qualifyWhen two packages qualify, the executor chooses which one to submit. Your acceptable price caps the result either way. Trigger orders and margin removals need a price at most 30 seconds old that is not older than the order (or the position's last change) and not older than the newest price already stored on-chain, so nobody can pick an older, more favourable package once a newer one is public. Liquidations need a price no older than the latest one used by the position's fills and margin removals.
Market sessions
Stocks and ETFs trade only in the NYSE regular session: Monday to Friday, 09:30 to 16:00 New York time, 13:00 on early-close days, closed on exchange holidays. The session status is signed with the prices, and the oracle refuses prices for a closed market. BTC and ETH trade around the clock.
- While a market is closed, market orders cannot get a price. After 2 min they can be cancelled: by you for a full refund, or by anyone else. Only an approved keeper that cancels it keeps the execution fee; otherwise it is refunded too.
- Limit, stop, take-profit and stop-loss orders wait and can execute once the market reopens.
- Liquidations wait too. The first price after the reopen can be far from the last close. See Risks.
- The oracle's session status is the source of truth, including holidays and early closes.
If the signer stops
Without new signed prices, market orders cannot fill and expire after 2 min, and trigger orders, margin removals and liquidations wait. Free balance can still be withdrawn. When signing resumes, the first price can be far from the last one, the same as a stock gapping at the open.
Mark and oracle prices
The market bar shows two prices. Mark is the live Hyperliquid index for the same asset: it updates every second and is for reference only. Hyperliquid lists no market for the five ETFs, so their Mark is the oracle price. Oracle is the signed price used for fills, liquidations and margin checks. The two can differ, especially outside the NYSE session, when Hyperliquid keeps trading stocks and the oracle holds the last close.
Orders
Orders are created on-chain and executed by keepers with a signed oracle price. There is no order book to match against: fills come from a pricing curve around the oracle price.
| Type | Executes when | Fills at | Fee |
|---|---|---|---|
| Market | At the next oracle price after the order | Oracle price plus spread and size impact, if within your acceptable price | Taker |
| Limit | Buy: oracle ≤ limit price Sell: oracle ≥ limit price | The same curve; the fill must be at or better than the limit price | Maker |
| Stop market | Buy: oracle ≥ trigger Sell: oracle ≤ trigger | Market, within your acceptable price | Taker |
| Take profit | Long: oracle ≥ trigger Short: oracle ≤ trigger | Market, reduce-only | Taker |
| Stop loss | Long: oracle ≤ trigger Short: oracle ≥ trigger | Market, reduce-only | Taker |
- Acceptable price. Market and stop orders carry the worst price you accept: the price when you place the order, plus or minus your max slippage (1% by default, editable in the order form). A fill beyond it does not happen. For a limit order, the limit price is the acceptable price.
- Reservation. Placing an order moves USDG from your free balance into the order: the execution fee, and for orders that open or add, the margin and the taker fee at the worst price the order can fill at. That is the acceptable price for market and stop buys, the limit price for limit orders and the trigger for stop sells. Market and limit sells have no upper limit on their fill, so they reserve at the higher of that price and the latest on-chain oracle price, plus a 1% buffer. Whatever is not used returns to your balance when the order fills or is cancelled.
- Paid only from the reservation. When an order opens or adds to a position, its margin and fee come from its reservation, never from your free balance, so a later deposit or withdrawal cannot change whether it fills. If the reservation falls short, for example when a sell fills above the price it reserved for, the position opens with what was reserved, at a higher effective leverage up to the market maximum; beyond that the fill fails.
- Reduce-only. A reduce-only order can only shrink or close a position, and its size is capped to the position when it executes. It reserves only the execution fee. If there is no position by then, it is cancelled and the rest is refunded (an approved keeper keeps the execution fee).
- Partial closes. A partial close fails while the position cannot pay its loss and pending funding at the fill price: a market order is cancelled, a limit or trigger order stays open. Close the whole position instead. Only a full close or a liquidation books the shortfall as bad debt.
- Attached TP/SL. A market or limit order can carry a take-profit and a stop-loss price. When it fills, they become reduce-only orders for the whole position, each with a 10% slippage limit from its trigger. Each one reserves its own execution fee up front.
- Closing a position cancels the reduce-only orders on that market (take profit, stop loss, reduce-only limits) and refunds their reservations.
- Leverage is a setting per market and account, 10x until you change it. A change applies to new orders; each order keeps the leverage it was created with.
- Limits. Orders that open or add must be worth at least 10 USDG. An account can have up to 20 open orders.
When an order fails
- A market order that would break your acceptable price, an open interest cap, the vault exposure cap or a margin check is cancelled. The rest is refunded; an approved keeper keeps the execution fee.
- A trigger order that fails these checks stays open and can execute later.
- A market order still unexecuted after 2 min can be cancelled by anyone. An approved keeper that does so receives the execution fee; for anyone else everything is refunded. You can cancel your own for a full refund.
Execution fee
Each order reserves a flat 0.1 USDG, plus the same for each attached take profit or stop loss. It pays the keeper for gas and price data, and only approved keepers earn it: the Perpsons keeper service and the app's relay, which the owner approves on-chain. When anyone else executes or cancels the order, including you with Execute now, an agent or a bot executor of the account, the fee is refunded to the account. When you cancel an order yourself, it is refunded as well.
Margin & leverage
Every position has its own margin. A position can lose at most its margin; your free balance and your other positions are not touched.
Isolated margin
When you open or add to a position, margin equal to the added notional divided by your leverage moves from the order's reservation into the position, never from your free balance. You can add margin at any time. You can remove margin with a fresh price (not older than the newest on-chain price), as long as the position keeps margin of at least entry notional ÷ max leverage and equity of at least current notional ÷ max leverage.
notional = |size| × oracle price
unrealized PnL = long: notional − entry notional short: entry notional − notional
equity = margin + unrealized PnL − pending funding
initial margin = filled notional ÷ leverage
maintenance margin = notional × MM (MM = 0.5%, 1% on the 20x stocks)Leverage
BTC and ETH allow up to 100x. The five ETFs and the eight largest stocks (NVDA, AAPL, MSFT, GOOGL, AMZN, META, TSLA, TSM) allow 50x, and the other 17 stocks 20x. A new or larger position must start with equity of at least 1.5 times its maintenance margin at the oracle price, after spread and size impact. With maintenance at 0.5%, a 100x position starts with about 1% of its notional as equity, minus spread and impact, comfortably above the 0.75% it needs, so 100x opens for normal sizes. Only very large orders, whose size impact eats most of that room, need lower leverage. A market order that fails this check is cancelled and refunded (an approved keeper keeps the execution fee).
The leverage badge in Positions shows each position's real leverage, its value at the mark price divided by its margin. It drifts from your leverage setting as the price moves, margin is added or removed and funding settles.
Liquidation price
long: (entry notional + F − margin) ÷ (|size| × (1 − MM))
short: (entry notional + margin − F) ÷ (|size| × (1 + MM))A position can be liquidated once its equity at the oracle price falls below its maintenance margin. Funding you owe moves the liquidation price closer over time; adding margin moves it away.
| Leverage | Long is liquidated after a drop of | Short is liquidated after a rise of |
|---|---|---|
| 2x | 49.75% | 49.25% |
| 5x | 19.60% | 19.40% |
| 10x | 9.55% | 9.45% |
| 20x | 4.52% | 4.48% |
| 50x | 1.51% | 1.49% |
| 100x | 0.50% | 0.50% |
Liquidations
- Anyone can liquidate an eligible position with a fresh signed price. Perpsons's keeper checks every position continuously.
- The whole position closes at the oracle price, with no spread, size impact or trading fee.
- The liquidator receives a reward of 0.05% of the notional (at launch), paid only out of the remaining equity. The vault adds nothing to it, so a position with no equity left pays no reward, and liquidating your own position never pays out of the vault.
- The rest of the equity goes to the PLP vault. You get nothing back from a liquidated position.
- If the price moved past zero equity, for example when a stock gaps at the open, the shortfall is bad debt that the PLP vault absorbs. You never owe more than the position's margin.
- Your reduce-only orders on that market are cancelled and refunded.
Fees & funding
You pay a trading fee on each fill, a fill price that includes a spread and size impact, a flat execution fee per order, and funding while a position is open.
Trading fees
- Taker 1% of the filled notional for market, stop market, take-profit and stop-loss fills.
- Maker 1% for limit order fills.
- Charged when you open, add, reduce and close. Liquidations pay no trading fee.
- The fee is a share of the notional, not of your margin, so leverage multiplies it: at 10x, every fill costs ten times the fee rate as a share of the position's margin.
- The fee is 1% of notional on every market at launch, high on purpose: it is what makes prices at the edges of the Chainlink band impossible to trade for a profit.
- Traders who use a referral code pay 4% less. See Referrals.
- Where the fee goes: the referrer's rebate first (10% of the fee paid), then 30% of the rest to the PLP vault and 70% to the treasury.
Spread and size impact
impact = min(order notional ÷ impact depth, max impact)
buy fill = oracle × (1 + spread + impact)
sell fill = oracle × (1 − spread − impact)The spread is a fixed half-spread per market. Impact grows with order size relative to the market's impact depth and is capped at 1%. The order book on the trade page draws this same curve, so the depth it shows is what you can actually trade at each price. Liquidity comes from the PLP vault, not from other traders' orders.
Example with launch settings: a 100,000 USDG buy on BTC pays a 0.005% spread plus 100,000 ÷ 1,000,000,000 = 0.01% impact, so it fills 0.015% above the oracle price, before the taker fee.
| Market | Max lev. | Taker | Maker | Spread | Impact depth | Max impact | OI cap per side | Maint. margin | Liq. reward | Funding (1h) |
|---|---|---|---|---|---|---|---|---|---|---|
| 100x | 1.000% | 1.000% | 0.005% | $1B | 1% | $500K | 0.50% | 0.05% | +0.00125% | |
| 100x | 1.000% | 1.000% | 0.005% | $500M | 1% | $300K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 50x | 1.000% | 1.000% | 0.010% | $300M | 1% | $200K | 0.50% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% | |
| 20x | 1.000% | 1.000% | 0.020% | $100M | 1% | $75K | 1.00% | 0.05% | +0.00125% |
Funding
rate per hour = clamp(base + skew × (long OI − short OI) ÷ (long OI + short OI), −max, +max)
funding owed = entry notional × change in the funding index since your last settlement
(a positive rate: longs pay, shorts receive)- A positive rate means longs pay and shorts receive. A negative rate means the reverse.
- At launch the base rate is +0.00125% per hour, about 0.03% a day, so longs pay when open interest is balanced. The skew term adds up to 0.01% per hour against the side with more open interest, and the rate is capped at ±0.05% per hour.
- Funding accrues every second on the position's entry notional. It settles into the position's margin whenever the position changes; until then it shows as pending funding and counts against equity.
- Funding is paid to and from the PLP vault, not directly between traders. Because the rate follows the skew, the vault earns funding on net.
- The current rate for each market is in the table above and in the market bar.
PLP vault
The PLP vault is the counterparty to every trade. Liquidity providers deposit USDG and receive PLP shares. The vault gains when traders lose and pays when they win.
What LPs earn and lose
The vault receives
- 30% of trading fees, after referral rebates
- Trader losses
- Funding paid by positions, net of funding paid to them
- Equity left over from liquidated positions
The vault pays
- Trader profits
- Funding owed to positions
- Bad debt when a position closes below zero equity, for example when a stock gaps at the open
NAV and share price
NAV = USDG held by the vault − traders' net unrealized PnL (never below 0)
trader PnL = per market and side: max(unrealized PnL, − total margin of that side)
share price = NAV ÷ PLP supplyDeposits mint PLP and withdrawals burn it at the current share price, so open trader PnL is priced in. A position never pays more than its margin, so traders' open losses count only up to the total margin of their market side; anything beyond is bad debt, not a vault asset. The app attaches fresh signed prices for all 32 markets to every deposit and withdrawal, because both fail while a market with open interest has no recent on-chain price: 60 seconds old for BTC and ETH, 4 days for stocks and ETFs, since closed markets do not move.
Stock gaps. Stocks and ETFs gap at the open: the first price after a night, weekend or holiday can be far from the last close. Positions that the gap takes past zero equity close as bad debt, and the vault absorbs it. While the NYSE session is closed, the NAV marks those markets at their latest stored price and their positions cannot be liquidated. A move that only shows after hours or over a weekend reaches the NAV at the open, so an unlocked LP can still time an exit or entry around a known gap. Open interest caps bound it, and the owner can price it with the withdrawal fee (up to 1%).
Lock-up and withdrawals
- A deposit locks all of your PLP for 4 days. A new deposit starts the lock again.
- PLP can be transferred only while unlocked. The receiver takes on the later of the two unlock times.
- Withdrawal fee: 0%. The owner can set it up to 1%; it stays in the vault.
- A withdrawal is refused if it would leave the vault with less USDG than the open net exposure needs. It goes through once exposure falls or new liquidity arrives.
Exposure caps
- Each market caps the total cost of long positions and of short positions separately. The caps are in the parameters table above.
- Across all markets, net exposure (the sum of |long OI − short OI|) may not exceed 100% of the USDG the vault holds. Orders that would push it higher fail.
- The vault records its share price and TVL once per UTC day. The APR on the vault page comes from these snapshots.
Sub-accounts, agents & bots
Your wallet address is your main trading account. You can split funds across sub-accounts, let another key trade for you, or subscribe a sub-account to a bot.
Sub-accounts
- Create up to 10 from your main account. Each has its own balance, positions and orders, separate from the others.
- A sub-account is an address derived from your wallet address. It has no private key. Only your wallet can deposit into it, withdraw from it (always to your wallet) or move USDG between your accounts.
- Names are up to 32 bytes and can be changed. Manage them on the Portfolio page.
Agents
- An agent, or API wallet, is another address you allow to trade on all of your accounts until an expiry you choose. It can create and cancel orders, set leverage and add or remove margin.
- An agent can never withdraw or transfer funds, and it cannot collect the account's execution fees: those go only to approved keepers. You can revoke it at any time.
- A leaked agent key can still lose your money by trading. Use short expiries and revoke keys you no longer use.
Bots
- A bot creator registers a bot with an executor address, a fee per period, a max leverage and a list of allowed markets.
- Subscribing binds the bot to one of your sub-accounts and pays the fee up front in USDG: 10% to the Perpsons treasury and 90% to the creator.
- The executor can trade only that sub-account, within the bot's leverage and markets. It cannot withdraw. Deposit only what you are willing to let the bot trade.
- One bot per sub-account. Renewing extends the subscription. Unsubscribing ends it at once, with no refund.
- Bot volume and PnL are recorded on-chain. Perpsons does not review bots or their strategies; the owner can only switch a bot off. A reference bot runner is in the
botsfolder of the Perpsons repository.
Referrals
Referred traders pay lower fees, and referrers earn part of the fees their referees pay.
- Create a code on the Referrals page: 3 to 20 characters from A–Z, 0–9 and underscore. One code per address.
- Share
https://perpsons.com/?ref=CODE. Visitors who open it are asked to use the code after they connect. - Using a code is a one-time, permanent choice. You cannot use your own code or the code of someone you referred.
- A referred trader pays 4% less in trading fees, on the main account and every sub-account. The referrer earns 10% of the fees those accounts pay, claimable in USDG at any time.
- The owner can give a referrer a custom tier: a discount of up to 50% and a rebate of up to 50%, 60% combined at most.
Leaderboard
The leaderboard ranks trading accounts by PnL, from data the engine writes on-chain with every fill.
- Windows: 24 hours, 7 days, 30 days and all time. Windows follow UTC days.
- PnL is realized: it counts when a position is reduced or closed, after trading fees and funding. Open positions count once they close.
- Volume is the total filled notional. ROI is PnL relative to the account's deposits, including USDG moved in from your other accounts.
- Sub-accounts are ranked on their own. Names come from forum nicknames, otherwise a short address.
- The data comes from PerpsonsStats and refreshes about once a minute.
Forum
The forum lives on-chain. Your wallet is your account; there is nothing else to sign up for.
- Every thread, reply, like and nickname is a transaction, so each one costs a little ETH for gas.
- Categories: General, Trading, Crypto, ETFs, Stocks, Bots and Announcements. Only moderators post announcements.
- Titles up to 120 bytes, threads up to 4,000 bytes and replies up to 2,000 bytes. One post every 15 seconds per address.
- Nicknames are 3 to 24 letters, digits or underscores, unique regardless of case.
- Posts are shown as plain text. Links are clickable and marked nofollow.
- Moderators can hide, pin and lock threads, and authors can delete their own posts. Hidden and deleted posts disappear from the app but stay in the chain's history. Do not post anything you would not want public permanently.
- The owner can require that posters have traded at least once.
Keepers
Execution is permissionless: any address can execute orders and liquidations with a valid signed price. Execution fees go only to keepers the owner has approved; liquidation rewards go to any liquidator.
| Action | Contract | Reward |
|---|---|---|
executeOrder(orderId, payload) | PerpsonsEngine | The order's execution fee, 0.1 USDG, for approved keepers. Anyone else: none, the fee is refunded to the account |
cancelExpiredOrder(orderId) | PerpsonsEngine | The execution fee, for market orders older than 2 min, for approved keepers only |
liquidate(account, marketId, payload) | PerpsonsEngine | Liquidation reward, 0.05% of notional at launch |
updatePrices(payload) | PerpsonsOracle | None. Keeps on-chain prices fresh for the vault NAV |
snapshot() | PerpsonsVault | None. Records the daily share price |
- Keeper allowlist. The owner approves keepers with
setKeeper(keeper, approved); anyone can checkisKeeper(address). An address that is not approved can still execute and clean up orders, but earns nothing: the fee stays with the account. This keeps an account's own agents and bot executors, which may create orders at will, from draining it through execution fees. - Perpsons runs a keeper and a relay that executes market orders as soon as a price is available, usually 10 to 20 seconds after the order. If the relay is unavailable, or your order is still open about 25 seconds after you placed it, the trade page offers Execute now: your wallet sends the execution and pays the gas, and the execution fee is refunded to your trading account rather than paid to you.
- Keepers cannot pick old prices. Market orders accept only the window right after they were created. Trigger orders and margin removals need a price at most 30 seconds old and not older than the newest price stored on-chain. Liquidations need a price no older than the position's price time,
positionPriceTime(account, marketId)(alsoPositionView.priceTimein PerpsonsLens); use it rather thanlastUpdated, which everyaddMarginmoves. - Robinhood Chain orders transactions first come, first served, without priority gas auctions.
- The payload is
abi.encode(bytes[] signables, bytes[] signatures)built from the price signer's packages of one timestamp. The app serves it at/api/oracle/payload?symbol=BTC&minTs=<unix seconds>, or you can build it from the signer's feed at/data-packages/latest/perpsons-priceson the Perpsons keeper. - The reference keeper is in the
keeperfolder of the Perpsons repository. It simulates every transaction first and stays in dry-run mode until you give it a key.
Running a keeper is optional and at your own risk. Reverted transactions still cost gas, and other keepers may execute first.
Prices and limits are described under Prices & oracle.
Risks
Read this before you deposit. These risks can cost you some or all of your money.
Experimental software
Perpsons is new software. Leveraged trading can lose all of the margin you post within seconds. Only deposit money you can afford to lose. See also the terms of use.High leverage
Leverage multiplies losses as much as gains. At 50x, a move of about 1.5% against you liquidates the position and you lose all of its margin. Spread, size impact and funding leave even less room. Use leverage you can afford to be wrong with.
Stocks gap at the open
Stocks and ETFs trade only in the NYSE regular session. Overnight, over weekends and on holidays you cannot close the position and nothing is liquidated. At the open the first price can be far past your stop loss or liquidation price. A stop loss can fill far from its trigger, or not at all if the price gapped past its slippage limit. You can lose the whole margin of the position; a loss beyond it is bad debt that the PLP vault absorbs.
Oracle risk
Every price is signed by one price signer that the operator runs. The oracle accepts a signed price only within 1% of the market's Chainlink reference on Robinhood Chain, and with a 1% fee on each side a price at the edges of that band cannot be traded for a profit. Inside the band a wrong price still fills orders and triggers liquidations. If the signer stops, or the Chainlink reference goes stale, orders cannot execute and liquidations are late. The Mark price from Hyperliquid is for reference and can differ from the price you trade at.
Smart-contract risk
Smart contracts can contain bugs. The Perpsons contracts are not upgradeable, so a bug cannot be patched in place and could lock or lose funds. Every transaction is final once confirmed.
Admin keys and timelocks
Each contract has an owner key. The owner can change market and fee settings at once, with no delay: max leverage, maintenance margin, fees, spreads, open interest caps, funding, the execution fee, which keepers are approved to earn it, and the vault lock (up to 30 days). A higher maintenance margin applies to open positions immediately. The owner or a guardian can pause new positions and vault deposits. Only replacing the oracle and changing its signers, feeds or Chainlink bands wait for a 2-day timelock. Withdrawing free balance always works, even while paused. The current role holders are listed under Contract addresses.
Vault and liquidity risk
Trader profits are paid by the PLP vault. If it does not hold enough USDG, a profitable close fails until liquidity returns. LPs can lose part or all of their deposit to winning traders and bad debt, and withdrawals can be held by the 4 days lock or by the exposure rule. Stock gaps at the open become vault losses when positions go past zero equity. While the NYSE session is closed the NAV uses the last stored stock and ETF prices, so a gap reaches the share price only at the open, and an unlocked LP can time an exit or entry around it. See PLP vault.
Regulatory restrictions
Perpetual futures are restricted or prohibited in many countries. Perpsons is not available where it is prohibited, or to sanctioned persons. You are responsible for following the laws that apply to you. Perpsons is not affiliated with Robinhood, Paxos, Chainlink, Hyperliquid or the companies and funds whose prices it lists.
Network, bridge and token risk
Robinhood Chain runs a single sequencer. If it stalls, you cannot trade, add margin or withdraw while prices keep moving elsewhere. Bridges carry their own risk, and USDG depends on its issuer, Paxos.
Contract addresses
Check addresses on the explorer before you approve or send anything.
- Network
- Robinhood Chain mainnet, chain id 4663
- Gas token
- ETH
- Public RPC
- https://rpc.mainnet.chain.robinhood.comRate limited. Fallback:https://robinhood-rpc.publicnode.com
Not deployed yet
The Perpsons contracts are not deployed yet. Their addresses will appear here and in the app. Until then, do not send funds to any address that claims to be Perpsons.PerpsonsEngine
Accounts, balances, orders, positions, funding and liquidations. Holds traders' USDG.
Not deployed yetPerpsonsVault (PLP)
Liquidity vault and counterparty to every trade. Issues PLP shares.
Not deployed yetPerpsonsOracle
Verifies signed price and session packages and bounds them by Chainlink.
Not deployed yetPerpsonsLens
Read-only views used by the app and keepers.
Not deployed yetPerpsonsStats
Fill history, volumes and PnL for the leaderboard.
Not deployed yetPerpsonsReferrals
Referral codes, fee discounts and claimable rebates.
Not deployed yetPerpsonsBotHub
Bot registry and paid subscriptions bound to sub-accounts.
Not deployed yetPerpsonsForum
On-chain threads, replies, likes and nicknames.
Not deployed yet
USDG
Collateral token (Paxos Global Dollar, 6 decimals). Not a Perpsons contract.
Multicall3
Standard batching contract used for reads. Not a Perpsons contract.
Admin and roles
Read live from PerpsonsEngine and PerpsonsVault. Ownership transfers take two steps: the new owner has to accept.
- OwnerChanges market and global parameters, queues oracle changes, unpauses.
- —
- Pending ownerOwnership moves only after this address accepts it.
- —
- GuardianMay pause new positions and vault deposits. Cannot unpause or move funds.
- —
- TreasuryReceives trading fees (after referral rebates and any vault share) and bot protocol fees.
- —
- Oracle in useReplacing it takes a 2-day timelock.
- —
- Queued oracle changeA new oracle can only take effect after its timelock ends.
- —
- Engine logic moduleFixed at deployment. The contracts are not upgradeable.
- —
- New positionsA pause blocks opening and increasing positions only.
- —
- Vault depositsA pause blocks new deposits only. Withdrawals keep working.
- —
Role holders appear here once the contracts are deployed.
FAQ
Why did my market order take 15 seconds?
Why was my market order cancelled?
Can I open at 100x?
Why does a sell reserve more than a buy of the same size?
Why did my partial close fail?
Do I earn the execution fee when I use Execute now?
Can I trade stocks at night or on weekends?
Can I lose more than I deposit?
Who is on the other side of my trade?
What is the difference between Mark and Oracle?
Why is the trading fee 1%?
Do I need ETH?
Can I deposit USDC?
Is Perpsons custodial?
Why can't I withdraw from the vault?
What if this website goes down?
withdraw function on PerpsonsEngine. New trades need signed prices, so they stop while the price signer is down.Something else? Ask on the forum.