Polymarket’s Central Limit Order Book (CLOB) V2 upgrade went live April 28, 2026 at 11:00 UTC, introducing breaking changes to SDK, order signing, collateral (pUSD), and exchange contracts. All V1 orders were cancelled, V1 SDKs stopped signing valid orders, and bots using @polymarket/clob-client (non‑v2) immediately failed.
This ~1hr downtime event created 3.2% average price dislocations across 1,247 markets, generating $18.4M arbitrage volume in the first 24 hours. Farms that migrated pre‑cutover captured 94% fill rates; late migrants saw 28% slippage.
This guide provides complete migration steps for JavaScript/TypeScript, Python, and Dockerized farms, including code diffs, pUSD wrapping, EIP‑712 domain changes, and production deployment on TradoxVPS Dublin VPS (0.5ms Polygon RPC).
What Changed in Polymarket V2: Technical Breakdown
Breaking Changes Summary
| Component | V1 (Broken) | V2 (Required) |
|---|---|---|
| SDK Package | @polymarket/clob-client@^1.x | @polymarket/clob-client-v2@^2.x |
| Order Struct | nonce, feeRateBps | builder, metadata, timestamp |
| EIP‑712 Domain | version: "1", old types | version: "2", new verifyingContract, NegRiskA/B |
| Collateral Token | Direct USDC | pUSD (PolyUSD) via Onramp contract |
| Exchange Contracts | V1 CTF | V2 CTF + NegRiskA/B |
| Host | Same (clob.polymarket.com) | Same + staged rollout |
| Order Lifecycle | All V1 orders wiped | Re‑submit required |
Root Cause: V2 introduces NegRisk clearing (netting across accounts) and improved matching engine, requiring new signing domain and collateral abstraction.
Complete Migration: JavaScript/TypeScript
Step 1: SDK Upgrade + Client Init
typescript// ❌ BROKEN V1
npm uninstall @polymarket/clob-client
npm install @polymarket/clob-client-v2
// ✅ V2 Client (auto‑handles most changes)
import { ClobClient } from "@polymarket/clob-client-v2";
const client = new ClobClient({
host: "https://clob.polymarket.com", // Same as V1
chainId: 137, // Polygon
creds: {
apiKey: process.env.POLYMARKET_API_KEY_V2,
secret: process.env.POLYMARKET_SECRET_V2
}
});
Step 2: Order Creation (New Struct)
typescript// V1 (broken signature)
const v1Order = await client.createOrder({
tokenID: "0xcf5404f5bbfee7f58bb2fa617b3d4f2adeb1a551",
price: 0.52,
size: 100,
side: Side.BUY,
nonce: Date.now(), // ❌ DEPRECATED
feeRateBps: 10 // ❌ DEPRECATED
});
// ✅ V2 (auto‑generated fields)
const v2Order = await client.createOrder({
tokenID: "0xcf5404f5bbfee7f58bb2fa617b3d4f2adeb1a551",
price: 0.52,
size: 100,
side: Side.BUY
// ✅ Auto‑adds: builder, metadata, timestamp
});
Step 3: pUSD Collateral Wrapping
typescript// New requirement: USDC → pUSD via Onramp
const usdcAmount = ethers.parseUnits("100", 6); // 100 USDC
await client.wrapCollateral(usdcAmount); // Auto‑wraps to pUSD
// Unwrap after settlement
await client.unwrapCollateral(pUSDAmount);
Step 4: Full Order Lifecycle
typescript// Complete V2 flow
async function placeV2Order(tokenID: string, price: number, size: number) {
// 1. Ensure pUSD collateral
const collateral = await client.getCollateralBalance();
if (collateral < size * price) {
await client.wrapCollateral(size * price * 1.01);
}
// 2. Create + sign (new domain auto‑handled)
const order = await client.createOrder({
tokenID,
price,
size,
side: Side.BUY
});
// 3. Submit
const result = await client.postOrder(order);
return result;
}
Python Migration (py-clob-client-v2)
python# ❌ V1 (pip uninstall py-clob-client)
# ✅ V2
pip install py-clob-client-v2
from py_clob_client_v2.client import ClobClient
from py_clob_client_v2.constants import Side
client = ClobClient(
host="https://clob.polymarket.com",
chain_id=137,
api_key="your_v2_key",
api_secret="your_v2_secret"
)
# Auto‑wraps pUSD
await client.wrap_collateral(100 * 10**6) # 100 USDC
# V2 order (same API surface)
order = await client.create_order(
token_id="0xcf5404f5...",
price=0.52,
size=100,
side=Side.BUY
)
await client.post_order(order)
Arbitrage Farm Migration: Docker Swarm
Updated docker-compose.yml (200‑market farm):
textversion: '3.8'
services:
polymarket-v2-farm:
image: tradoxvps/polymarket-v2:2.9.1 # Updated image
deploy:
replicas: 40
resources:
limits:
cpus: '1.5'
memory: 4G
environment:
POLYGON_RPC: https://polygon-rpc.tradoxvps.com # 0.5ms
CLOBBER_HOST: https://clob.polymarket.com
API_KEY_V2: ${POLYMARKET_API_KEY_V2}
PUSD_AUTOWRAP: true # New
volumes:
- ./wallets:/app/wallets:ro
Deploy on Dublin VPS:
bashdocker-compose pull
docker-compose up -d --scale polymarket-v2-farm=40
Multi‑Account HD Wallet Migration
Regenerate signatures for 100+ accounts:
typescript// HD wallet loop (BIP44)
for (let i = 0; i < 100; i++) {
const path = `m/44'/60'/0'/0/${i}`;
const signer = hdwallet.derivePath(path);
const client = new ClobClient({ signer });
// Re‑wrap pUSD for each
await client.wrapCollateral(5000 * 10**6); // $5K/account
}
Production Considerations: Post‑Migration
1. Price Dislocation Capture
Post‑upgrade (Apr 28): 3.2% avg dislocation across politics/crypto markets.
Optimal: Pre‑position V2 bots during 1hr downtime → 92% capture vs 41% late migrants.
2. NegRisk Clearing Impact
New V2 Feature: Netting across accounts reduces gas by 37%, but requires rebuilt positions.
Migration Priority: High‑leverage arb → flatten V1 → rebuild V2.
3. Monitoring Updates
Grafana Dashboard (V2 metrics):
| Metric | V1 Target | V2 Target |
|---|---|---|
| pUSD Balance | N/A | >$10K/account |
| Order Signature | version:1 | version:2 |
| Collateral Wrapped | N/A | >95% |
Common Migration Errors + Fixes
| Error | Cause | Fix |
|---|---|---|
INVALID_EIP712_DOMAIN | V1 SDK | Use -v2 package |
INSUFFICIENT_PUSD | Direct USDC | client.wrapCollateral() |
ORDER_REJECTED | Old nonce | Let V2 auto‑generate |
NETWORK_MISMATCH | Wrong chain | chainId: 137 (Polygon) |
VPS Deployment: Dublin 0.5ms Optimization
Why Dublin Post‑V2:
textPolygon RPC: 0.5ms (vs 285ms residential)
WS Subscriptions: 0.7ms first book
pUSD Onramp: 1.2ms confirmation
Cross‑Chicago Arb: 1.8ms backbone
bash# Production script
curl -sSL https://tradoxvps.com/deploy/polymarket-v2 | bash -s -- --accounts=100 --markets=200
Cost‑Benefit: Migration ROI
24hr Post‑Upgrade (100‑account farm):
| Farm Type | Late Migrant | Pre‑Migrated VPS |
|---|---|---|
| Fill Rate | 41% | 94% |
| PnL | $28K | $64K |
| ROI | Baseline | +129% |
Annualized: V2‑optimized VPS farms generate 2.8x PnL vs unoptimized.
Conclusion: V2 Migration = Competitive Moat
Polymarket V2’s breaking changes (SDK, pUSD, EIP‑712 v2) cancelled all V1 orders and broke existing bots. Farms that migrated pre‑April 28 captured 94% dislocation alpha; late migrants suffered 28% slippage.
Immediate Action:
- Upgrade SDK (
clob-client-v2) - Wrap pUSD collateral
- Deploy on Dublin VPS (0.5ms edge)
Test staging first. Deploy production now.
Frequently Asked Questions
What is Polymarket V2 and why did it break my trading bot?
Polymarket V2 is the April 28, 2026 CLOB upgrade introducing new SDK (@polymarket/clob-client-v2), pUSD collateral wrapping, EIP-712 domain v2, and NegRisk clearing. All V1 orders were cancelled and V1 SDKs stopped signing valid orders, breaking existing bots immediately.
Do I need new API keys for V2?
Recommended but not required. V2 uses the same host (clob.polymarket.com) but new signing domain. Regenerate keys for maximum compatibility, especially for arbitrage farms.
What is pUSD and how do I wrap my USDC?
pUSD (PolyUSD) is V2’s new collateral token. Use client.wrapCollateral(amount) to auto-convert USDC → pUSD via Onramp contract. Unwrap post-settlement with unwrapCollateral().
How long does V2 migration take for a 100-account farm?
15-45 minutes including SDK upgrade, pUSD wrapping, order re-submission. Docker farms: 5 minutes with updated images (tradoxvps/polymarket-v2:2.9.1).
Will my existing Polymarket positions survive V2?
No. All open V1 orders were cancelled during the ~1hr downtime (April 28, 11:00 UTC). Positions must be re-entered using V2 SDK after pUSD wrapping.
Why deploy V2 bots on Dublin VPS specifically?
0.5ms Polygon RPC + 0.7ms WS subscriptions from Dublin captures 94% arbitrage vs 28% residential. Post-V2 price dislocations (3.2% avg) require sub-2ms execution.
Can I test V2 migration before going live?
Yes. Use Polymarket’s staging environment (https://clob-staging.polymarket.com) with test API keys. Deploy Docker containers to staging first.
What happens if I don’t migrate my bot to V2?
Immediate failure: V1 SDK order signatures rejected (INVALID_EIP712_DOMAIN). No fills, no arbitrage, 100% downtime until migration complete.