What are deposit wallets?
Deposit wallets are Polymarket’s new smart contract wallet type for new accounts. They replace the Gnosis Safe proxy that existing accounts use. From your perspective as a builder, the key differences are:| Safe proxy (existing) | Deposit wallet (new) | |
|---|---|---|
| Signature type | 2 (POLY_GNOSIS_SAFE) | 3 (POLY_1271) |
| How addresses are derived | CREATE2 from Safe factory | CREATE2 from deposit wallet factory |
| Order signing | Standard EIP-712 | EIP-712 with ERC-7739 TypedDataSign wrapper |
| Approvals | Gasless via Safe multisend | Gasless via WALLET batch |
| V1 support | Yes | No (V2 only) |
ensureReady() detects the wallet type, order() signs correctly, and the /resolve endpoint resolves both wallet types.
Do I need to change anything?
If you use the polynode SDK for trading: update to the latest version. Everything else is automatic./resolve still returns safe, eoa, username, and type, but safe now means the preferred Polymarket trading wallet. If an EOA has a deployed deposit wallet, safe returns the deposit wallet.
If you call the Polymarket CLOB directly (without our SDK): you need to implement ERC-7739 TypedDataSign wrapping for signatureType: 3 orders. See the signing details below.
How to detect wallet type
For trading, the SDK auto-detects wallet type when you callensureReady() or detectWalletType(). Detection checks on-chain in this order:
- Safe deployed? ->
POLY_GNOSIS_SAFE(type 2) - Proxy deployed? ->
POLY_PROXY(type 1) - Deposit wallet deployed? ->
POLY_1271(type 3) - Nothing deployed -> defaults to
POLY_GNOSIS_SAFE(new Safe will be created)
/resolve identity endpoint uses a different rule for compatibility with Polymarket’s deposit-wallet migration: if a resolved EOA has a deployed deposit wallet, /resolve returns that deposit wallet in safe.
How to handle mixed user bases
If your platform has existing Safe users and new deposit wallet users, no special handling is needed. The SDK stores each user’s wallet type in the local database and uses the correct signing method automatically.Wallet address derivation
You can derive any user’s deposit wallet address from their EOA without any network calls:The /resolve endpoint
The Resolve Wallet endpoint keeps the same fields and prioritizes deposit wallets in the existingsafe field. The field name remains safe for backward compatibility.
safe field contains the preferred trading wallet address. If the controlling EOA has a deployed deposit wallet, safe is the deposit wallet. Otherwise it is the existing Safe/proxy wallet. The type field tells you which kind of wallet was returned.
type value | Description |
|---|---|
"safe" | Gnosis Safe proxy (most existing accounts) |
"deposit_wallet" | Deposit wallet (newer accounts) |
"proxy" | Legacy proxy wallet |
How POLY_1271 signing works
You only need this section if you’re implementing signing without the polynode SDK. If you use
signV2Order() or trader.order(), this is handled automatically.signatureType: 3 (POLY_1271). The signing process wraps the standard Order EIP-712 hash in a Solady TypedDataSign struct:
- Build the standard V2 Order struct (same fields as type 0/1/2)
- Set
makerandsignerto the deposit wallet address (not the EOA) - Sign using
TypedDataSignas the EIP-712 primary type under the exchange domain, with the deposit wallet parameters as struct fields - Wrap the resulting signature:
innerSig (65 bytes) + appDomainSeparator (32 bytes) + contentsHash (32 bytes) + orderTypeString (186 bytes) + typeStringLength (2 bytes)
TypedDataSign struct includes the deposit wallet’s identity:
name:"DepositWallet"version:"1"verifyingContract: the deposit wallet addresssalt:bytes32(0)
FAQ
Do existing Safe wallet users need to change anything?
Do existing Safe wallet users need to change anything?
No. Safe wallets continue to work exactly as before. The SDK detects your wallet type automatically. All existing integrations are backward compatible.
Will my /resolve API responses break?
Will my /resolve API responses break?
No field names changed. The endpoint still returns
safe, eoa, username, and type. The important behavior change is that safe now returns the deposit wallet when the resolved EOA has one deployed.Can I still create new Safe wallets?
Can I still create new Safe wallets?
Yes. The SDK defaults to creating Safe wallets for new users when no wallet is detected on-chain. Deposit wallets are created through Polymarket’s frontend or relayer, not through the polynode SDK’s default flow.
What SDK version do I need?
What SDK version do I need?
Deposit wallet address derivation and detection:
>= 0.10.0. POLY_1271 order signing: >= 0.10.5. Full onboarding flow (deploy + approve): >= 0.10.6. Latest recommended: Rust 0.13.3, TypeScript 0.10.6, Python 0.10.3.What if a user has both a Safe and a deposit wallet?
What if a user has both a Safe and a deposit wallet?
For
/resolve, the deposit wallet is returned in safe when it is deployed. The field name stays safe so existing clients do not need to parse a new field.Do deposit wallets work with V1 orders?
Do deposit wallets work with V1 orders?
No. POLY_1271 (signature type 3) is V2 only. V1 orders only support types 0 (EOA), 1 (POLY_PROXY), and 2 (POLY_GNOSIS_SAFE). Since Polymarket’s V2 exchange is now live, all new activity uses V2.
How do I know which wallet type to use for copy trading?
How do I know which wallet type to use for copy trading?
Register followers with their actual
sig_type (2 for Safe, 3 for deposit wallet). The copy trading engine automatically generates the correct typed data for each follower’s wallet type. Your signing code should use signV2Order() from the SDK, which handles both types transparently.Is there a performance difference?
Is there a performance difference?
Deposit wallet signatures are larger (317 bytes vs 65 bytes) due to the ERC-7739 wrapping, but this has no meaningful impact on order submission speed or gas costs. The CLOB processes both types identically.

