Skip to content

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.

User typeAction required
EOA-only, never tradedOnboard once via the steps below.
Existing Polymarket MagicNone — your proxy wallet keeps working.
Existing Polymarket browserNone — your Gnosis Safe keeps working.
Smart account (4337) walletNot supported yet (see Limitations).

The “Set up Polymarket trading” card on the Settings tab walks through:

  1. 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.
  2. Deploy. The app submits WALLET-CREATE to 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 reaches STATE_MINED or STATE_CONFIRMED.
  3. 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.
  4. Approve. The user signs one EIP-712 typed-data payload that batches six approvals — pUSD approve and CTF setApprovalForAll for each of the three V2 exchange spenders (CTF Exchange, NegRisk Exchange, NegRisk Adapter). The app submits the signed batch to the relayer and polls for STATE_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)”
PurposeAddress
Deposit wallet factory0x00000000000Fb5C9ADea0298D729A0CB3823Cc07
Deposit wallet impl0x58CA52ebe0DadfdF531Cde7062e76746de4Db1eB
pUSD0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB
CTF (ConditionalTokens)0x4D97DCd97eC945f40cF65F87097ACe5EA0476045
CTF Exchange V20xE111180000d2663C0091e4f400237545B87B996B
NegRisk Exchange V20xe2222d279d744050d28e00520010520000310F59
NegRisk Adapter V20xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296

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:]

The single user signature in step 4 covers this typed data:

Domain:
name = "DepositWallet"
version = "1"
chainId = 137
verifyingContract = <depositWallet>
PrimaryType: Batch
Types:
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.

  • 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.

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.

  • 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.