Key concepts
- Condition — an
(oracle, questionId, outcomeSlotCount)tuple. - Position — an ERC-1155 balance of a specific outcome slot within a condition.
- Redemption — once the oracle reports payouts, holders call
redeemPositionsto exchange winning tokens for USDC.
Prepare a condition
Redeem winning positions
Redeeming your positions
Your outcome tokens sit in your vault, not in your EOA.ConditionalTokens.redeemPositions pays out only the
caller’s own balance, so calling it from your EOA burns nothing and
pays nothing. Redeem in one of these ways instead:
- Automatic — auto-redeem is on by default. Within a few minutes of
a market’s final status the platform redeems for you, and pays the gas
for, the refund on a voided market and your winnings on a
resolved market when they pay at least 1 USDC on that market.
Smaller winnings are left for you to claim, so check
redeemableonGET /api/me/positions?status=redeemableand use one of the paths below for anything still redeemable. Read or change the setting withGET/PUT /api/me/auto-redeem(body{ "enabled": true | false }); details in Auto-redeem. - Gasless API —
POST /api/me/positions/redeem(vault:writescope) with the position’s{ "marketId", "outcomeIndex" }as returned byGET /api/me/positions(0= YES,1= NO). API-key callers must also sendauth: { deadline, v, r, s }: an EIP-712RedeemAuthorization(address owner, string marketId, uint8 outcomeIndex, uint256 deadline)signed by the wallet owner under the domain{ name: "PredictStreetRedeem", version: "1", chainId }(noverifyingContract). The response is{ jobId, status }; pollGET /api/me/positions/redeem/{jobId}untilstatusisconfirmed(orfailed_permanent/expired). - On-chain, from the vault-owner EOA —
vault.redeemPositions(conditionId, indexSets)for binary markets, orvault.redeemPositionsNegRisk(marketId, questionIndex, amount)for neg-risk markets. No backend co-signature is needed; only the vault owner (or the platform) may call them, anyone else getsNotOwner(). See Positions → Redeeming a resolved position for which fields to pass.
GET /api/me/balances. There is no separate “claim”
step.
Events
seq is a counter that increases by one with each of these five
events, across the whole contract, so a gap means you missed a log.
Source
0x66Ed938E9Dec9A1df6033d66560d5fe6117EE744 on
Blockscout
(testnet).
Based on Gnosis ConditionalTokens via Polymarket’s fork. Differences
from upstream: every event above starts with uint64 seq,
PayoutRedemption indexes conditionId instead of
parentCollectionId, and redeemPositions returns the total payout.