Signature Types and Proxy Wallets
signature_type=0 means EOA is the funder — simple. signature_type=1 means proxy wallet for magic/email logins. signature_type=2 is a different proxy flavor. When to use each, and the funder address trap that bites every new Polymarket integration.
Polymarket supports three signature types. Two of them are for proxy wallets used by email-login users. One of them is for programmatic bots with direct private keys. Getting the wrong one produces signature errors that do not name the problem.
The Three Types
| Type | Signer | Funder | When to use |
|---|---|---|---|
| 0 | EOA (your private key) | Same EOA | Programmatic bots with direct keys |
| 1 | Signer EOA | Magic/email proxy wallet | Email/social login users |
| 2 | Signer EOA | Polymarket proxy wallet | Older proxy flow |
The signer is whose private key signs the order payload. The funder is whose balance gets debited when the order fills. For type 0 they are the same address. For types 1 and 2 they are different — the signer controls a separate proxy smart contract that holds the actual USDC.e.
Inline Diagram — Signature Type Matrix
The Funder Address Trap
The classic mistake is to sign an order with signature_type=1 (proxy) but set the funder field to the signer EOA instead of the proxy wallet. Polymarket validates the signature against the signer, then checks the balance at the funder. If the funder is the signer EOA and the signer EOA has no USDC.e (because the funds are in the proxy), the order gets rejected as insufficient balance even though the account is technically "funded."
The reverse mistake is equally common: using signature_type=0 but providing a proxy address as the funder. Polymarket expects funder == signer for type 0; providing anything else produces an "invalid signature" error that does not identify the actual problem.
How to Know Which You Have
If you generated your key with Account.create() or imported a hex private key into Metamask and funded it directly — you have an EOA with type 0 semantics.
If you signed up to Polymarket via the website using email/magic link and never saw a private key — you have a proxy wallet with type 1 semantics. Your funds live in a smart contract proxy, not the signer EOA.
If you are a programmatic bot being integrated from scratch — always use type 0. It is the simplest path and avoids proxy-wallet footguns entirely. Hermes uses type 0.
The Rule
Type 0 for bots. Types 1 and 2 for web users. Funder matches signer for type 0. Any mismatch produces opaque errors that will eat hours. Know which type you are using before your first order ships.