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, winning tokens are exchanged for USDC. On PredictStreet the tokens sit in your vault, so you redeem through the vault — see Redeeming your positions.
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
0xD28B8295Cd57F205e4d080Ff4c6d23C06a9EEe3a on
Blockscout.
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.