docs_
Everything about Social Trading V1: the rules, the money, and the oracle.
Overview
Social Trading is a ten minute, two player directional duel on the SOL/USD price. Each player puts in 0.05 SOL. One picks Up, the other Down. After a verified opening price and a verified closing price, the winner gets 0.09 SOL and the protocol vault gets 0.01 SOL.
It is a fixed outcome, two player competition. There is no leverage, no liquidation, no funding payment, no spread and no orderbook slippage. The pot of the two players pays the winner in full, so nobody owes anybody unfunded profit.
Quick start
- Open the exchange and connect a wallet (Phantom, or a guest wallet).
- Add funds to your balance.
- Pick Up or Down and deposit the 0.05 SOL ticket. You join the matchmaking queue.
- When an opposite ticket is paired, the opening price is taken at the next boundary, then the 10 minute countdown starts.
- The result, both prices, oracle timestamps and the vault transfer are shown on the match.
Rules & parameters
| Network | Solana |
| Reference market | SOL/USD · price feed: Pyth Pro |
| Stake per player | 0.05 SOL = 50,000,000 lamports |
| Matched pot | 0.10 SOL |
| Duration | 600 seconds from the recorded opening observation |
| Winner payout | 0.09 SOL |
| Protocol fee | 10% of the pot = 0.01 SOL, to the SOL vault |
| Before a match | Each player can cancel and recover exactly 0.05 SOL |
| Tie or invalid result | Both players refunded 0.05 SOL, no fee |
| Tie band | ±1 bp of the opening price (provisional) |
Payouts & fees
For every normal match the pot is conserved:
100,000,000 = 90,000,000 + 10,000,000 lamports
For a refund both stakes go back (100,000,000 = 50,000,000 + 50,000,000). No fee is collected for an unmatched cancellation, a tie or an invalid oracle observation.
The vault only holds SOL. V1 has no buyback, burn, staking yield or token. Naming the product PAPER does not mean a token exists.
Matching
- One ticket in play per wallet.
- A match needs two different wallets, opposite sides and identical stakes, both still queued.
- Oldest ticket on each side is paired first (FIFO). The matcher cannot choose the winner or move funds.
- Once matched, the pair is fixed. The opening price is taken at a time after both sides were committed, so nobody sees the price first.
- Cancelling while queued refunds in full. A matched ticket cannot be cancelled.
Duel lifecycle
Every ticket follows one path. Each transition happens exactly once and is guarded against replays, double matching, double refunds and double settlement.
Oracle & timing
Prices come from Pyth Pro. The opening boundary t0 is set when the match is created, a few seconds in the future, and the closing boundary is t1 = t0 + 600s. Both are stored once.
- The price is requested for a fixed timestamp, not “latest when someone clicks settle”.
- An observation only counts if its publish time is inside
[boundary, boundary + 15s]. - Observations with confidence wider than 25 bp are rejected, and a duel with no valid observation is refunded.
- If no valid observation arrives within 180s of a boundary, both players are refunded. The operator cannot invent a price.
The chart on the exchange is presentation only. It never decides settlement.
Refunds
| Cancel while queued | Full 0.05 SOL back, instantly |
| Tie / inside tie band | Both get 0.05 SOL, no fee |
| Opening price unavailable | Both get 0.05 SOL after 180s, no fee |
| Closing price unavailable | Both get 0.05 SOL after 180s, no fee |
Each match can be settled or refunded exactly once. A second attempt is rejected by the state guard.
Verify a result
- Every finished duel has a public page at
/duel/<id>with the open and close price, their publish times and confidence, and the winner. - The page shows a record hash: the SHA-256 of that record. Your browser recomputes it, so you can see the hash matches the data shown. It is a fingerprint of the settlement data, not a blockchain transaction signature.
- Anyone can ask a due match to settle or refund (
POST /api/matches/<id>/settle). The request carries no price. The price is read for the stored boundary, so the caller cannot choose one. - The price path on every card comes from the same public data, so a result can be re-checked independently.
Vault policy
What goes in. Only the 10% fee of a duel that has a winner. Cancellations, ties and refunds put nothing in the vault.
What comes out. Nothing, today. This build has no way to withdraw from the vault: it only accumulates, and the balance is reconciled publicly on the Vault page. There is no automatic buyback, burn, staking payout or token.
Architecture
| Web + API | One Next.js app: landing, exchange and docs are pages of the same site |
| Database | Postgres (Neon). Users, tickets, matches, ledger, vault |
| Matchmaker | Pairs opposite queued tickets. Cannot alter stake, side, result or payout address |
| Oracle keeper | Fetches the observation for a stored boundary. Cannot pick a timestamp or an unsigned price |
| Planned | Solana program for escrow and settlement, with the same state machine: QUEUED → MATCHED → ACTIVE → SETTLED, or CANCELLED / REFUNDED |
Risks & limits
- At ten minutes a small price change decides the result, so timestamp precision and the tie band matter. Values are provisional.
- Queue imbalance means you may wait for an opponent. You can cancel for a full refund while waiting.
- A paid, real asset competition may be regulated in some places. Independent review is required before any real money launch.
FAQ
Is this trading? No position is opened and no SOL is swapped. The SOL/USD feed only decides who wins.
Why is the fee 10%? It is the fixed protocol fee on the pot. It is shown before every ticket purchase.
Can I lose more than 0.05 SOL? No. There is no leverage or liquidation. The stake is the maximum loss.
What if the opponent never shows up? You stay queued and can cancel for a full refund.