Polymarket Deposit Wallet
Polymarket announced (May 2026) that new API users must trade through a deterministic deposit wallet (a CREATE2-deployed clone contract) instead of a raw EOA. Existing Magic / proxy / Gnosis Safe users are unaffected. Reference: docs.polymarket.com/trading/deposit-wallet-migration.
The Arenaton Flutter app implements steps 1–4 of the migration directly against relayer-v2.polymarket.com. No Arenaton server endpoint is involved; Polymarket sees the user’s request as if it came from any other Polymarket-aware client.
Who this affects
Section titled “Who this affects”| User type | Action required |
|---|---|
| EOA-only, never traded | Onboard once via the steps below. |
| Existing Polymarket Magic | None — your proxy wallet keeps working. |
| Existing Polymarket browser | None — your Gnosis Safe keeps working. |
| Smart account (4337) wallet | Not supported yet (see Limitations). |
The four steps
Section titled “The four steps”The “Set up Polymarket trading” card on the Settings tab walks through:
- Derive. The app computes the user’s deterministic deposit-wallet address locally via CREATE2. No on-chain call. The address is shown in the card immediately.
- Deploy. The app submits
WALLET-CREATEto Polymarket’s relayer. The relayer signs and submits the on-chain deployment as a meta-transaction. The user does not sign anything for this step. The app polls the relayer until the transaction reachesSTATE_MINEDorSTATE_CONFIRMED. - Fund (external). The user is shown the deposit-wallet address with a Copy button. They send pUSD on Polygon to that address from their existing wallet UI. Arenaton has no signal to verify funding completion; the on-chain balance only matters when an order is placed later.
- Approve. The user signs one EIP-712 typed-data payload that batches six approvals — pUSD
approveand CTFsetApprovalForAllfor each of the three V2 exchange spenders (CTF Exchange, NegRisk Exchange, NegRisk Adapter). The app submits the signed batch to the relayer and polls forSTATE_MINED.
After step 4 the deposit wallet is ready for trading.
Reference addresses (Polygon mainnet, chainId 137)
Section titled “Reference addresses (Polygon mainnet, chainId 137)”| Purpose | Address |
|---|---|
| Deposit wallet factory | 0x00000000000Fb5C9ADea0298D729A0CB3823Cc07 |
| Deposit wallet impl | 0x58CA52ebe0DadfdF531Cde7062e76746de4Db1eB |
| pUSD | 0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB |
| CTF (ConditionalTokens) | 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 |
| CTF Exchange V2 | 0xE111180000d2663C0091e4f400237545B87B996B |
| NegRisk Exchange V2 | 0xe2222d279d744050d28e00520010520000310F59 |
| NegRisk Adapter V2 | 0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296 |
The deposit-wallet address is derived by CREATE2:
walletId = leftPad(owner, 32)args = abi.encode(["address","bytes32"], [factory, walletId])salt = keccak256(args)initCode = prefix(10) ‖ impl(20) ‖ 0x6009 ‖ c2(31) ‖ c1(31) ‖ args(64)address = keccak256(0xff ‖ factory ‖ salt ‖ keccak256(initCode))[12:]EIP-712 batch signature
Section titled “EIP-712 batch signature”The single user signature in step 4 covers this typed data:
Domain: name = "DepositWallet" version = "1" chainId = 137 verifyingContract = <depositWallet>
PrimaryType: BatchTypes: Call = (address target, uint256 value, bytes data) Batch = (address wallet, uint256 nonce, uint256 deadline, Call[] calls)The deadline is now + 240s by default; the relayer rejects expired batches.
What Arenaton never does
Section titled “What Arenaton never does”- Hold private keys or seed phrases.
- Sign transactions on the user’s behalf.
- Take custody of pUSD, CTF tokens, or any other Polymarket asset.
- Move funds between the user’s EOA and deposit wallet — the user funds externally.
- Submit anything other than the user’s own signed batch.
Source
Section titled “Source”The Dart implementation mirrors polygolem — the public Polymarket Go SDK — byte-for-byte. The deposit-wallet derivation uses the same constants and CREATE2 inputs; the EIP-712 typed data uses the same domain and types. Cross-language parity is locked down by golden tests.
Limitations
Section titled “Limitations”- EOA-only in this version. Smart-account (EIP-1271 / 4337) onboarding is a future slice.
- Trading itself (CLOB orders with
signature_type=3/ POLY_1271 / ERC-7739) is not yet implemented; this slice covers onboarding only. - Polygon mainnet only (chainId 137).
- No in-app pUSD funding — funding must be done externally through the user’s existing wallet UI.
- The “Set up Polymarket trading” card does not deploy a deposit wallet for users whose Polymarket account already exists as a Magic proxy or Gnosis Safe — those flows continue unchanged on Polymarket’s side.