polynode is ready for the Polymarket V2 exchange upgrade. Here’s what you need to know.
V2 is not yet live. Polymarket has announced a 2-3 week rollout. The contracts below are deployed on Polygon mainnet but have zero on-chain trading activity. Contract addresses, exchange behavior, and CLOB endpoints could all change before the full migration. Everything on this page is based on what we’ve tested and verified so far. We’ll update it as things develop.
Polymarket is deploying a V2 exchange system on Polygon mainnet. polynode has identified, decoded, and tested against the V2 contracts deployed today. Our settlement stream and trading SDK are built to handle V2 alongside V1.No action is required from existing settlement stream users. When V2 settlements begin on-chain, they will flow through the same WebSocket feed automatically.
Tested against live V2 contracts on Polygon mainnet:
V2 settlement decoding verified against real on-chain transactions
V2 trade events (OrderFilled, OrdersMatched) decoded from block receipts
PolyUSD wrapping and unwrapping tested and detected in real time
V2 order placement tested live on the V2 CLOB
Full order lifecycle verified: place, check status, cancel, re-place
All existing market data, token IDs, and enrichment confirmed identical between V1 and V2
Order hash verification: our EIP-712 order hash computation produces byte-for-byte identical results to the live V2 exchange contract’s hashOrder() function on Polygon mainnet — cryptographic proof that our implementation is correct
All V2 contracts listed above are deployed and live on Polygon mainnet. V2 trading volume is currently minimal as Polymarket has not yet migrated users to V2. Addresses may change if Polymarket redeploys before the full migration.
The key architectural insight: V2 only changes the exchange layer (how orders are matched and settled). The token layer (ConditionalTokens) is completely unchanged and cannot be replaced.
All prediction market positions live inside the ConditionalTokens contract. This is a Gnosis protocol contract that has been on Polygon since Polymarket launched. Every token ID is derived from a condition ID and outcome index inside this contract.V2 does not replace ConditionalTokens. It can’t. Doing so would invalidate every open position on the platform. Instead, V2 introduces an adapter layer between the new exchange contracts and the existing ConditionalTokens contract:
The CollateralAdapter translates between PolyUSD (V2’s collateral) and USDC.e (what ConditionalTokens expects). ConditionalTokens never sees PolyUSD. From its perspective, nothing changed.This means:
Same token IDs across V1 and V2
Same condition IDs
Same market metadata (Gamma API, enrichment)
Positions opened on V1 are fully compatible with V2 and vice versa
PolyUSD Collateral — V2 uses PolyUSD instead of USDC.e as the exchange collateral. PolyUSD is a 1:1 wrapper around USDC.e with 6 decimals. See the PolyUSD Guide for details on wrapping and unwrapping.Updated Order Struct — Four fields removed (taker, expiration, nonce, feeRateBps), three added (timestamp, metadata, builder). The polynode SDK handles this automatically.EIP-712 Domain — The signing domain version changed from "1" to "2". The SDK handles this based on your exchange version config.No More Settlement Routers — V1 used FeeModule router contracts between operators and the exchange. V2 eliminates routers. Operators call the exchange contracts directly.exchange_version Field — V2 trades include "exchange_version": "v2" on each trade object in settlement and trade events. V1 trades omit this field. Use it to distinguish which exchange system processed a settlement.
The polynode SDK supports V2 with a single config change:
use polynode::trading::{PolyNodeTrader, TraderConfig, OrderParams, OrderSide, ExchangeVersion};let mut config = TraderConfig { polynode_key: "pn_live_...".into(), exchange_version: ExchangeVersion::V2, // ← only change needed ..Default::default()};let mut trader = PolyNodeTrader::new(config)?;let signer = PrivateKeySigner::from_hex("0x...")?;let status = trader.ensure_ready(Box::new(signer), None).await?;// Order placement is identical to V1let result = trader.order(OrderParams { token_id: "10293...".into(), side: OrderSide::Buy, price: 0.05, size: 10.0, ..Default::default()}).await?;
The SDK handles all V2 differences internally: order struct, EIP-712 signing, CLOB endpoint routing, and PolyUSD collateral. You don’t need to change how you construct orders or manage positions.
V2 contracts are deployed on Polygon mainnet. Polymarket will announce the full migration date with advance notice. polynode will support both V1 and V2 simultaneously throughout the transition — no downtime, no disruption.We’ll keep this page updated as the migration progresses.