Skip to content

Core concepts

Positions & payouts

A position is your claim on a market outcome, recorded in the SatoriEx ledger. This page covers what a position is, how it's opened and closed, what gets paid out at resolution, and where to look in the API. Outcome shares are tracked in our custodial ledger โ€” no on-chain tokens are issued today.

Coming from Polymarket?

On Polymarket, your positions are ERC-1155 outcome tokens you hold in a smart-wallet, redeemable on-chain via the CTF contract. On SatoriEx, positions live in our ledger as `shares` + `cost_basis` rows โ€” there are no on-chain tokens today. The Conditional Token Framework contracts exist in our repo but are not deployed for live settlement. Practical impact: you cannot call `redeem()` yourself, you cannot transfer shares outside SatoriEx, and you cannot verify your individual position on a block explorer. The balance-transparency page at /proof-of-reserves is the current substitute; cryptographic proof-of-reserves with third-party attestation is on the roadmap.

What a position is

When you buy Yes or No shares on a market, the matched fill creates (or grows) a position record on your account. Each position is scoped to one (market, outcome) pair โ€” buying Yes and No on the same market gives you two separate positions.

  • Shares โ€” the count of outcome shares you hold. Always a non-negative integer.
  • Cost basis โ€” the total USDC you paid (net of fees) to accumulate the current share count.
  • Average buy price โ€” your weighted average entry price, useful for unrealised P&L computation against the live mid.

How positions are opened

Place a limit order (or a marketable limit) on the side you want exposure to. Each fill the matcher posts against your order grows the corresponding position in atomic ledger steps โ€” you never end up with a partial-fill orphan. If you submit a buy on the Yes side and later a buy on the No side of the same market, the two positions are tracked independently.

Reading your position

GET /api/v1/me/positions returns one entry per (market, outcome) pair you currently hold. The fields you'll use most:

  • shares โ€” non-negative integer count of outcome shares.
  • avg_buy_price โ€” weighted average entry price in BPS (10000 = $1.00). Use for unrealised P&L vs. the current mid.
  • cost_basis โ€” total USDC paid to accumulate the current share count, expressed in dollars at the API boundary.

Payouts at resolution

Every share resolves to either 1.00 USDC (if the outcome wins) or 0.00 USDC (if it loses). The payout is mechanical โ€” your profit per share is `outcome_value โˆ’ price_paid` if you win, and `โˆ’price_paid` if you lose. Examples for a single share:

Fill priceImplied probabilityPaid per shareIf TRUE (+)If FALSE (โˆ’)
0.9595%0.95+0.05-0.95
0.6262%0.62+0.38-0.62
0.5050%0.50+0.50-0.50
0.1515%0.15+0.85-0.15

Payouts are credited atomically once the 2-hour dispute window closes with no upheld disputes. If a dispute is upheld, the market returns to active (trading) status โ€” a fresh propose-and-confirm cycle is required before a new dispute window opens.

Closing a position before resolution

You don't have to hold to resolution. Place a sell order at any time; matched fills reduce your share count and post the proceeds to your USDC balance in the same atomic step. Partial sells leave the remaining position intact at the unchanged cost basis.

Where positions live

Positions are recorded in SatoriEx's double-entry ledger โ€” every share movement has matching debit and credit entries. Today, this is the only representation of your holdings. The Conditional Token Framework (CTF) contracts that would represent each share as an on-chain ERC-1155 token exist and will enable optional self-custody in a future release; they are not active for settlement today.

Read: Contracts & on-chain roadmap โ†’

Mind the dispute window

Even after a resolution is approved, settlement is paused while disputes are open. Your position will show as pending during the 2-hour window; trust the post-window credit. An upheld dispute resets the window.