Skip to main content
Winnings are claimed, not delivered. Because your funds and outcome tokens live in your own Safe, resolving a market only makes your winning token redeemable — the USDC stays in the ConditionalTokens contract until it is redeemed into your Safe. There are two ways to redeem:
  • Yourself — sign a redeemPositions call and relay it (gasless). See the steps below.
  • Automatically — opt in to auto-redeem once, and winnings are redeemed into your Safe shortly after each market resolves.
Until a win is redeemed it is reported as redeemable_safe, not as spendable balance_safe.

Finding what you can redeem

GET /api/v2/atlas/account/wallet/redeemable Lists every settled market whose payout you have not redeemed yet — one row per market, with the amount summed across everything you held in it — together with the wallet config you need to sign the redeem. Only positive amounts are listed: a market where you hold only losing tokens pays nothing and does not appear.
A market is listed once its outcome has been reported on-chain, and drops off once the redemption confirms. The sum of redeemable matches your redeemable_safe.

Full 1.00 per share — no settlement fee

A winning share redeems for the full 1.00 USDC — there is no fee at settlement or redemption. The platform (taker) fee was already charged once, at trade time. Disregard any older wording that says winners redeem “1.00 minus a settlement fee”.

Redemption, step by step

The operator does not pull funds into your Safe for you — the redemption is authorised by you and relayed on your behalf.
1

Market resolves on-chain

The operator reports the outcome. Your winning outcome token becomes redeemable for 1.00 USDC/share; the losing token is worth 0.
2

Build the redeemPositions call

Encode redeemPositions(address collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint256[] indexSets) with:
  • collateralToken = usdc_address
  • parentCollectionId = 0x0000…0000 (32 zero bytes)
  • conditionId = condition_id (from GET /account/wallet/markets/)
  • indexSets = [1, 2] — sweeps both outcome positions in one transaction (the winning side pays out, the losing side is 0)
3

Sign it as a Safe SafeTx

Wrap the calldata in a Safe SafeTx EIP-712 (the same structure as setup approvals) with to = conditional_tokens_address, and sign with your EOA.
4

Relay it (gasless)

POST it to the relay endpoint. The operator executes Safe.execTransaction and pays gas.
5

USDC lands in your Safe

The redeemed USDC is transferred into your Safe. Once the transaction confirms, the amount moves from redeemable_safe to your spendable balance_safe.
6

Withdraw

Move the USDC from your Safe to an external wallet (see below).

Relay the redemption

POST /api/v2/atlas/account/wallet/relay Submits a signed Safe transaction; the operator executes it and pays gas.
Calibri rejects with 400 safe does not belong to this member unless safe is your own derived Safe. Response:

Auto-redeem

Turn on auto-redeem and you never have to redeem by hand: after a market resolves, Calibri redeems your winnings into your own Safe and they are credited to balance_safe like a manual redeem.

How it works

You approve Calibri’s AutoRedeemer contract as an operator for your outcome tokens on the ConditionalTokens contract — one setApprovalForAll signature, relayed gaslessly like any Safe transaction. After each market resolves, the operator calls the AutoRedeemer, which redeems your positions and sends the whole payout straight back to your Safe in the same transaction.
The AutoRedeemer has no owner and no upgrade path. The only thing it can do with your approval is redeem your resolved positions and return the full payout to the Safe they came from — it cannot send funds anywhere else, touch unresolved markets, or move your USDC. Losing tokens are burned in the same call. Revoke the approval at any time to opt out.
On Polygon a winning position is typically redeemed within a minute or so of the market resolving. If you press Redeem yourself first, whichever redemption lands first is paid and the other pays nothing — you cannot be paid twice.

Check whether it is on

GET /api/v2/atlas/account/wallet/auto-redeem
available is false when auto-redeem is not offered on your account (for example, before your Safe exists). The response also carries the usual wallet config for signing.

Turn it on or off

1

Relay the approval

Encode setApprovalForAll(auto_redeemer_address, true) (or false to opt out), wrap it in a Safe SafeTx with to = conditional_tokens_address, sign it, and relay it through POST /api/v2/atlas/account/wallet/relay.
2

Record your choice

PUT /api/v2/atlas/account/wallet/auto-redeem with { "enabled": true } (or false). Calibri reads the approval back from the chain before storing it, and answers 409 if the chain does not show it yet — relay first, then call this.

Withdrawing from the Safe

Because funds live in your own Safe, a withdrawal is a member-controlled on-chain USDC transfer out of the Safe — a Safe SafeTx executing USDC.transfer(to, amount), relayed gaslessly through the same POST /api/v2/atlas/account/wallet/relay endpoint used for redemption. When funds leave the Safe on-chain, Calibri reconciles the off-chain mirror: it debits balance_safe and cancels any resting orders those funds collateralised. A withdrawal on Polygon has no fee. To withdraw to an address on Ethereum, Base, Arbitrum or Optimism instead, see Withdrawals to other networks.
Withdrawals go through the same relay endpoint as a USDC transfer, as described above.

Void

If the market is voided, the condition resolves on-chain to the payout vector [1,1]: every YES and every NO share redeems for 0.50 USDC, whatever you paid for it. Redeem exactly as you would a win. The taker fee is refunded to your Safe mirror. See Voids and postponements.