Polymarket Bot Tutorial · Chapter 6 of 32

Аутентификация Polymarket bot и настройка wallet: proxy wallets vs EOA, генерация API key через SDK, sigType 2 для Gnosis Safe, best practices хранения ключей и миграция с Magic на Privy.

Что охватывает эта глава

У wallet-модели Polymarket есть три подвижные части: externally owned account (EOA), который подписывает orders, smart-contract proxy, который хранит funds, и Polymarket CLOB API key, который аутентифицирует HTTP requests. Правильно связать все три - самая частая проблема первого дня для новых builders, и после миграции Magic Labs на Privy в августе 2025 года это стало еще более запутанным. В этой главе мы разберем каждый элемент в порядке настройки, включая конкретные environment variables и flag типа подписи, которые нужны production code.

  • Proxy wallet vs EOA: with which to bot
  • Generating an API key (SDK steps)
  • sigType 2 и POLY_FUNDER_ADDRESS (Gnosis Safe)
  • Key storage: .env, vault, KMS
  • Миграция Magic Labs на Privy
  • Approving USDC/pUSD spending
  • Wallet recovery and backup

Proxy wallet vs EOA: with which to bot

Polymarket использует pattern smart-contract proxy wallet. Ваш EOA - адрес, связанный с вашим private key, - подписывает transactions и orders. Gnosis Safe, развернутый по deterministic address, хранит фактические pUSD и outcome shares. Proxy address - это то, что отображается в панели "wallet" в Polymarket UI; EOA - это то, что подписывает.

Для bots вы всегда подписываете с EOA (PRIVATE_KEY в env) и указываете proxy address как POLY_FUNDER_ADDRESS в CLOB client config. Отправка orders с EOA в качестве funder приводит к ошибкам "insufficient balance", даже если proxy funded.

Использовать только EOA для botting нельзя - web flow Polymarket всегда создает proxy при signup. Подтвердите оба address с помощью polymarket wallet show из CLI или прочитайте proxy address в настройках Polymarket UI.

Generating an API key (SDK steps)

CLOB API требует три credential: key, secret, passphrase. Это не private key вашего wallet - это набор credentials в стиле HMAC, привязанный к вашему wallet и используемый только для authentication HTTP requests.

Сгенерируйте их один раз с помощью SDK:

# Python
from py_clob_client.client import ClobClient
c = ClobClient(host="https://clob.polymarket.com", chain_id=137,
               key="<PRIVATE_KEY>", signature_type=2,
               funder="<PROXY_ADDRESS>")
creds = c.create_or_derive_api_creds()
print(creds.api_key, creds.api_secret, creds.api_passphrase)

Сохраните output в JSON file и загружайте его при каждом запуске bot; не генерируйте заново для каждой session - API server кэширует credential set, и частая ротация может задеть logic rate limit. Эти credentials не истекают автоматически. Меняйте их только если подозреваете leak.

sigType 2 and POLY_FUNDER_ADDRESS (Gnosis Safe)

Аргумент signature_type управляет тем, как CLOB validates signatures ваших orders. Существует три значения; два из них реальные:

  • 0 / EOA: EOA является и signer, и funder. Используется для необычных setups, где users напрямую импортировали private key.
  • 1 / POLY_PROXY: legacy Magic Labs proxy contract. Большинство аккаунтов до 2025 года.
  • 2 / POLY_GNOSIS_SAFE: current standard. Funds in a Gnosis Safe, EOA signs.

Используйте signature_type=2 для любого account, созданного после августа 2025 года (Privy migration), или для любого account, где в Polymarket UI вы видите Gnosis Safe address. Переменная env POLY_FUNDER_ADDRESS должна содержать address Safe, а не EOA. Несовпадение signature_type с типом funder silently приводит к отклонению orders, которое выглядит как "insufficient allowance" или "balance: 0" - message об ошибке вводит в заблуждение.

Key storage: .env, vault, KMS

Три разумных уровня хранения private key для EOA.

  1. .env file (development на одной машине). Файл находится на VPS, bot читает его при запуске, key никогда не покидает host. Достаточно для wallets меньше <$1k. chmod 600 .env и убедитесь, что .gitignore в вашем repo исключает его.
  2. Self-hosted vault (HashiCorp Vault, age-encrypted file или systemd-creds). Добавляет шаг unlock при запуске bot. Стоит того для wallets в диапазоне $1k-$10k.
  3. Cloud KMS (AWS KMS, GCP KMS). Bot вызывает KMS для decrypt key в memory; key никогда не попадает на disk. Сложность операций оправдана только выше $10k или для fleets из нескольких bots.

Что никогда не делать: commit private key в git, вставлять его в chat, хранить его в password manager, который синхронизируется с cloud services без local-only mode. On-chain blast radius утечки Polymarket EOA - это весь ваш pUSD balance и inventory outcome shares.

The Magic Labs to Privy migration

В августе 2025 года Polymarket перевел основного embedded-wallet provider с Magic Labs на Privy. Для bot это небольшое, но конкретное изменение.

Accounts до миграции (созданные через Magic) обычно используют signature_type=1 (POLY_PROXY). Accounts после миграции используют signature_type=2 (POLY_GNOSIS_SAFE). Некоторые users мигрировали старый account; некоторые сохранили исходный. Из public API нельзя определить, какой type использует ваш account - это проверяется попыткой подписать order и анализом rejection.

Миграция также изменила то, как UI показывает funder address. В старых flows Polymarket UI адрес proxy отображался в dashboard; в текущем flow он спрятан в account settings. Команда CLI polymarket wallet show - самый удобный способ подтвердить оба value, независимо от того, когда был создан account.

Approving USDC/pUSD spending

Чтобы CLOB мог перемещать ваш pUSD при match order, proxy должен был approve contracts Polymarket exchange как spenders. Polymarket UI задает эти approvals во время первого deposit. Для bots, которые fund proxy напрямую, вам нужно выставить их вручную.

Три approval, которые нужно установить один раз на wallet:

  1. pUSD (ERC-20) → exchange contract
  2. Conditional Tokens (ERC-1155) → exchange contract (для продажи shares)
  3. Conditional Tokens (ERC-1155) → NegRisk exchange contract (для продажи NegRisk shares)

Запустите polymarket approve из CLI при первой настройке. Transaction стоит несколько центов в MATIC gas. Проверьте с помощью polymarket approve check - все три должны вернуть "approved." Самый частый silent bug у новых builders - отсутствие NegRisk approval, который проявляется только при продаже shares на multi-outcome markets и выглядит как ошибка balance.

Wallet recovery and backup

У wallet bot есть два восстанавливаемых элемента: private key EOA и пароль учетной записи Polymarket (который ограничивает доступ через web UI, но не через SDK).

Private key EOA - это единственное, что имеет значение для bot. Потеря = потеря всего, что находится в proxy. Cold backup: запишите на бумаге, запечатайте в конверт, храните вне офиса. Hot backup: зашифрованная USB-флешка. Никогда не отправляйте его себе по email; никогда не храните незашифрованным в cloud storage.

Пароль учетной записи Polymarket можно восстановить через email recovery Magic Labs / Privy, пока вы все еще контролируете исходный signup email. Он не ограничивает доступ bot - bot использует private key EOA напрямую.

Если вы подозреваете leak key: немедленно выведите pUSD и outcome tokens в новый wallet, сгенерируйте новый EOA, разверните bot заново с новым key. Отозвать leaked key нельзя; его можно только drain.

Часто задаваемые вопросы

Do I need a separate wallet for my bot?
Strongly recommended yes. Use a fresh EOA or a fresh email-account-derived proxy wallet that holds only the capital you have allocated to the bot. If the bot key leaks, only the bot funds are at risk - your main holdings stay safe.
What is sigType 2 in Polymarkets API?
sigType 2 indicates a Gnosis Safe (proxy wallet) signature, used when you log in with email/Google and Polymarket creates the proxy for you. For sigType 2, the POLY_FUNDER_ADDRESS environment variable must be the PROXY address (the one shown in the Polymarket UI), not the underlying EOA. This is a common configuration bug.
How do I generate a Polymarket API key?
Use the SDK. In Python: ApiCreds returned by client.create_api_key() once you have authenticated with your wallet. In Node.js: similar via @polymarket/clob-client-v2 client.createApiKey(). Save the returned key/secret/passphrase to your .env (never commit to git).
Are Polymarket API keys revocable?
Yes. You can derive new keys at any time via the SDK; old keys remain valid until explicitly revoked via client.deleteApiKey(creds). Best practice is to rotate keys periodically and revoke any key that touched a compromised machine.
What changed when Polymarket migrated from Magic Labs to Privy?
Login OTP codes went from 3 digits (vulnerable to brute force, exploited in the December 2025 hack) to longer codes plus device binding via Privy. For bots, the practical change is the auth ceremony - the SDK abstracts most of it. If your bot was hard-coded to Magic Labs API endpoints (rare), update to the Privy flow.
Should I store keys in a .env file?
For a single-VPS bot - yes, with proper file permissions (chmod 600 .env, owned by the bot user). For multi-machine setups or production-grade ops - move to a secrets manager (AWS Secrets Manager, Vault, doppler.com). Never commit .env to git, ever.