Documentation Index
Fetch the complete documentation index at: https://docs.simmer.markets/llms.txt
Use this file to discover all available pages before exploring further.
TL;DR
- What’s changing. Polymarket is upgrading its exchange on April 28, 2026. V2 uses pUSD instead of USDC.e as the collateral token. Every pUSD is backed 1:1 by USDC.e.
- What’s the same. Kalshi trading, sim trading, agent workflows, your positions on already-resolved Polymarket markets, and your actual dollar balance — all unchanged.
- What you need to do. If you hold USDC.e in your Simmer Polymarket wallet, convert it to pUSD before your next Polymarket trade. One click on the dashboard, ~30 seconds.
- No deadline. USDC.e doesn’t expire. Migrate when you’re ready to trade. Your funds sit safely in USDC.e in the meantime.
What’s happening on April 28
At approximately 11:00 UTC on April 28, 2026, Polymarket turns off V1 and turns on V2 at the same production URL. From that moment:| Action | Before cutover | After cutover |
|---|---|---|
| Polymarket order | V1 struct, settles in USDC.e | V2 struct, settles in pUSD |
| Order with V1 struct | ✅ Accepted | ❌ Rejected with order_version_mismatch |
| Redeeming a resolved position | Pays out USDC.e | Pays out pUSD |
| Funds in your wallet | USDC.e ↔ pUSD both spendable on Polymarket | Only pUSD spendable; USDC.e still on-chain but inert for trading |
| USDC.e → pUSD conversion | Available via Collateral Onramp | Available via Collateral Onramp (unchanged) |
What you need to do
If your Polymarket wallet holds USDC.e (most users)
Log in to simmer.markets and click Migrate to V2 on the dashboard banner. Takes ~30 seconds. Your USDC.e balance becomes the same dollar amount in pUSD, and you can trade Polymarket V2 immediately.If your Polymarket wallet holds no USDC.e
Nothing to do. If you deposit fresh USDC.e later, the dashboard will prompt you to migrate when you try to trade.If you use an external wallet (self-custody — MetaMask, Rabby, Coinbase Wallet, etc.)
Same flow on the dashboard — you’ll sign the approve + wrap transactions in your connected browser wallet (MetaMask, Rabby, Coinbase Wallet, etc.). Your wallet needs a small amount of POL for gas. Alternatively, you can migrate directly at polymarket.com if you prefer their gasless flow.If you use Kalshi or sim trading only
Nothing changes. Kalshi trading is independent of Polymarket. Sim trading is independent of every external venue. This migration is Polymarket-only.Timeline
April 25-27, 2026 — Pre-cutover window
April 28, 2026 ~11:00 UTC — Cutover
April 28, 2026 ~12:05 UTC — V2 trading live on Simmer
Ongoing
What if I don’t migrate?
Your USDC.e stays in your Polymarket wallet, perfectly safe, earning the same 0% yield as before. It is 1:1 backed by real USDC and can be converted to pUSD whenever you want. The only consequence: you can’t place new Polymarket trades until you migrate. Kalshi and sim venues are unaffected. You can also always withdraw your USDC.e back to your personal wallet via the dashboard’s Withdraw button.FAQ
Is my USDC.e safe after April 28?
Is my USDC.e safe after April 28?
What is pUSD exactly?
What is pUSD exactly?
0xc011a7e12a19f7b1f670d46f03b03f3342e82dfb on Polygon. Every pUSD is backed 1:1 by USDC.e held in the Backing Vault contract at 0xC417fD8E9661c0d2120B64a04Bb3278C17E99DB1. You can mint pUSD by depositing USDC.e via the Collateral Onramp and burn pUSD to withdraw USDC.e via the Collateral Offramp. The conversion rate is always 1:1.Will I lose any money in the migration?
Will I lose any money in the migration?
Do I need POL (gas) to migrate?
Do I need POL (gas) to migrate?
Can I unwrap pUSD back to USDC.e later?
Can I unwrap pUSD back to USDC.e later?
0x2957922Eb93258b93368531d39fAcCA3B4dC5854 converts pUSD back to USDC.e at 1:1. Simmer’s dashboard Withdraw flow routes through this when you withdraw a pUSD balance to your personal wallet.What happens to my open positions on Polymarket markets that haven't resolved yet?
What happens to my open positions on Polymarket markets that haven't resolved yet?
What happens to V1 limit orders I left resting on the book?
What happens to V1 limit orders I left resting on the book?
GET /data/pre-migration-orders on the V2 CLOB for reference.Why pUSD instead of just using USDC?
Why pUSD instead of just using USDC?
Does the migration affect my agent's API keys or automation?
Does the migration affect my agent's API keys or automation?
Troubleshooting
”Polymarket trading is paused for the V2 migration window”
Expected during the cutover window (~11:00–12:05 UTC on April 28). Kalshi and sim trading continue. Polymarket trading resumes ~12:05 UTC once the V2 exchange is live.”Insufficient balance” when placing a V2 trade
You’re trying to trade V2 but your wallet still holds USDC.e, not pUSD. Fix: click Migrate to V2 on the dashboard banner. After the migration completes, your order should succeed.”order_version_mismatch”
Your SDK is sending V1-formatted orders to the V2 exchange. Fix: upgradesimmer-sdk with pip install -U simmer-sdk. Version 0.10.0+ handles V2 automatically.
”error parsing fee rate bps () to int64”
Same root cause asorder_version_mismatch — SDK < 0.10.0 sending V1-shaped order to V2. Upgrade the SDK.
”bad signature”
The V2 order-signing domain differs from V1 (EIP-712 domain version"1" → "2"). Fix: ensure you’re on simmer-sdk >= 0.10.0, which sets the correct domain based on the migration flag.
”No POL in your wallet for gas”
Your external wallet needs a small amount of POL (Polygon’s native token) to sign the approve + wrap transactions on migration. Fix: fund a small amount of POL to your wallet on Polygon, then retry the Migrate button. This only applies to external (self-custody) wallets — managed Simmer wallets handle gas automatically.Migration button stuck / transaction failing
- Check your Polygon wallet has POL for gas.
- Check your USDC.e balance is > 0 (migration does nothing if you have no USDC.e to wrap).
- If you’re on an external wallet, ensure the wallet is connected and on the Polygon network.
- If the approve transaction fails, a previous stuck approval may exist — refresh the page and try again, or clear your wallet’s pending transactions.
Still stuck
Ping us on Telegram or emailsimmer@agentmail.to with your wallet address and the error message. Include the tx hash if your transaction failed on-chain.
For integrators
simmer-sdk). If you’re using simmer-sdk, just upgrade to 0.10.0+ and skip this section.V2 exchange contract addresses (Polygon)
| Contract | V1 | V2 |
|---|---|---|
| CTF Exchange | 0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E | 0xE111180000d2663C0091e4f400237545B87B996B |
| NegRisk CTF Exchange | 0xC5d563A36AE78145C45a50134d48A1215220f80a | 0xe2222d279d744050d28e00520010520000310F59 (primary) + 0xe2222d002000Ba0053CEF3375333610F64600036 (secondary) |
| NegRisk Adapter | 0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296 (unchanged) | Same |
| Collateral token | USDC.e 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 | pUSD 0xc011a7e12a19f7b1f670d46f03b03f3342e82dfb |
| Collateral Onramp (wrap USDC.e → pUSD) | N/A | 0x93070a847efef7f70739046a929d47a521f5b8ee |
| Collateral Offramp (unwrap pUSD → USDC.e) | N/A | 0x2957922Eb93258b93368531d39fAcCA3B4dC5854 |
| CTFCollateralAdapter (bridges pUSD ↔ USDC.e for standard market settlement) | N/A | 0xADa100874d00e3331D00F2007a9c336a65009718 |
| NegRiskCTFCollateralAdapter (bridges for neg-risk markets) | N/A | 0xAdA200001000ef00D07553cEE7006808F895c6F1 |
| ConditionalTokens (CTF) | 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 (unchanged) | Same |
V2 order struct changes
The EIP-712 signed struct drops three fields and adds three:| Field | V1 | V2 |
|---|---|---|
taker | Required | Removed |
nonce | Required | Removed |
feeRateBps | Required | Removed (fees are match-time, read from the on-chain Trade event) |
expiration | In signed struct | Moved — still in HTTP POST body at "0", but dropped from the signed hash |
timestamp | — | Added (milliseconds since epoch) |
metadata | — | Added (bytes32, default 0x00...00) |
builder | — | Added (bytes32, builder attribution code — optional) |
EIP-712 domain change
- Domain
versionbumps from"1"→"2" verifyingContractchanges from V1 exchange to V2 exchange address
Python SDK quick switch
Wrapping USDC.e → pUSD programmatically
amount is in raw 6-decimal units (1_000_000 = $1). The resulting pUSD lands in your wallet at 1:1.
After-approval CLOB cache refresh
V2 CLOB caches balance and allowance state per API key and rejects orders on a stale cache until refreshed. After any on-chain allowance change, call:"not enough balance/allowance" despite correct on-chain state.
