PolyUSD (pUSD) is the collateral token for Polymarket’s V2 exchange system. It is backed 1:1 by USDC and replaces USDC.e as the exchange collateral. To trade on V2, you need PolyUSD. Token info: Name: Polymarket USD | Symbol: pUSD | Decimals: 6 | View on PolygonscanDocumentation Index
Fetch the complete documentation index at: https://docs.polynode.dev/llms.txt
Use this file to discover all available pages before exploring further.
How PolyUSD Works
According to Polymarket’s announcement, PolyUSD is backed 1:1 by USDC. Power users and API traders can wrap either USDC or USDC.e into PolyUSD. For most frontend users, the transition is seamless — the Polymarket UI handles wrapping automatically with a one-time approval. There are two wrapping paths:| Path | Contract | Input Token | Status |
|---|---|---|---|
| Collateral Onramp | 0x93070a847efef7f70739046a929d47a521f5b8ee | USDC.e (bridged) | Active — working today |
| PermissionedRamp | 0xebc2459ec962869ca4c0bd1e06368272732bcb08 | Native USDC (Circle) | Not active yet — deployed but zero transactions |
The USDC.e → Onramp path is what’s working right now. We’ve tested it on mainnet and verified the full flow. The native USDC path via the PermissionedRamp exists on-chain but has not processed any transactions yet. When Polymarket activates it, wrapping native USDC will also be supported.
Quick Reference
| Address | |
|---|---|
| PolyUSD Token | 0xc011a7e12a19f7b1f670d46f03b03f3342e82dfb |
| Collateral Onramp (USDC.e → PolyUSD) | 0x93070a847efef7f70739046a929d47a521f5b8ee |
| Collateral Offramp (PolyUSD → USDC.e) | 0x2957922eb93258b93368531d39facca3b4dc5854 |
| PermissionedRamp (native USDC, not yet active) | 0xebc2459ec962869ca4c0bd1e06368272732bcb08 |
| USDC.e (bridged USDC) | 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 |
| Backing Vault | 0xC417fD8E9661c0d2120B64a04Bb3278C17E99DB1 |
Wrapping: USDC.e → PolyUSD (Active Path)
To get PolyUSD today, wrap your USDC.e through the Collateral Onramp contract.Steps
- Approve the Onramp to spend your USDC.e
- Call
wrap(underlyingToken, recipient, amount)on the Onramp
Using the polynode SDK
The SDK handles wrapping automatically:Wrap Function Signature
underlyingToken— the USDC.e contract address (0x2791Bca1...)recipient— who receives the PolyUSD (usually yourself)amount— raw amount in 6-decimal units (1 USDC = 1,000,000)
Unwrapping: PolyUSD → USDC.e
Unwrapping is designed to be permissionless — any EOA can callCollateralOfframp.unwrap(asset, to, amount) and burn their pUSD in exchange for USDC.e. The function signature mirrors wrap:
Unwrap is live today. The Collateral Offramp holds
WRAPPER_ROLE on the pUSD token and processes user unwraps directly. Verified 2026-04-21 via tx 0x154a906c5790e272cb209146e6716ff255d92791519f642f5c43a4997a47e030 (0.1 pUSD → 0.1 USDC.e from a Safe wallet via the Polymarket relayer).Alternative paths that also still work:- Polymarket’s withdraw UI at
bridge.polymarket.com/withdraw— routes through a Uniswap v3 pool or off-chain witness flow. - Settlement through the V2 exchange —
CTFCollateralAdapterunwraps internally duringmatchOrders. - Redeeming resolved positions — ConditionalTokens pays out USDC.e directly.
Steps
- Approve the Offramp to spend your pUSD
- Call
unwrap(USDC.e, recipient, amount)on the Offramp
Via the polynode SDK (recommended for Safe wallets)
The SDK’swrapToPolyUsd() / unwrapFromPolyUsd() automatically detect your wallet type. If you onboarded with ensureReady(privateKey) (Safe wallet, the default), both calls route through the Polymarket relayer and execute as gasless Safe transactions signed by your EOA. Amounts are raw 6-decimal integers (1_000_000 = $1).
ensureReady(privateKey) defaults to POLY_GNOSIS_SAFE — your EOA controls a Safe at the derived funder address, and SDK methods route through the Polymarket relayer (gasless). If you pass { type: SignatureType.EOA } explicitly, the SDK signs directly from the EOA and you pay MATIC for gas. For Safe mode, builderCredentials is required because the SDK uses your Polymarket builder HMAC to authenticate relayer requests — mint one at polymarket.com/settings?tab=builder.
Related contracts
| Contract | Address | Role on pUSD (today) |
|---|---|---|
| Collateral Onramp (wrap) | 0x93070a847efef7f70739046a929d47a521f5b8ee | WRAPPER_ROLE ✓ |
| Collateral Offramp (unwrap) | 0x2957922eb93258b93368531d39facca3b4dc5854 | WRAPPER_ROLE ✓ |
| PermissionedRamp (witness-signed) | 0xebc2459ec962869ca4c0bd1e06368272732bcb08 | WRAPPER_ROLE ✓ |
| CtfCollateralAdapter (internal) | 0xAdA100Db00Ca00073811820692005400218FcE1f | WRAPPER_ROLE ✓ |
| NegRiskCtfCollateralAdapter (internal) | 0xadA2005600Dec949baf300f4C6120000bDB6eAab | WRAPPER_ROLE ✓ |
How It Works Under the Hood
PolyUSD is backed 1:1 by collateral held in a vault contract (0xC417fD8E...). When you wrap:
- Your USDC.e transfers to the vault
- PolyUSD is minted to your wallet
- Your PolyUSD is burned
- USDC.e is released from the vault to your wallet
The vault currently holds USDC.e as the backing collateral. Polymarket has stated that PolyUSD is backed 1:1 by USDC. A PermissionedRamp contract exists for native USDC wrapping but is not yet active. When it activates, the vault may hold a mix of USDC.e and native USDC, but PolyUSD remains 1:1 redeemable regardless of the backing composition.
Tracking PolyUSD Events
polynode detects PolyUSD wrapping and unwrapping through the settlement stream. These appear asdeposit events:
- Wrap (deposit):
direction: "deposit",fromis the Onramp contract - Unwrap (withdrawal):
direction: "withdrawal",tois the user wallet
deposits on the WebSocket to receive these events. Internal settlement wraps/unwraps (between exchange and adapter contracts) are filtered out automatically.
Key Facts
- Decimals: 6 (same as USDC)
- Backing: 1:1 by USDC (currently held as USDC.e in the vault)
- Wrapping: USDC.e via Onramp (active) or native USDC via PermissionedRamp (not yet active)
- Proxy: ERC-1967 upgradeable proxy
- Chain: Polygon mainnet (chain ID 137)
- Minimum wrap: No minimum (tested with amounts as low as $0.007)

