آموزش Polymarket Bot · فصل 6 از 32

احراز هویت Polymarket bot و راه‌اندازی wallet: proxy wallet در برابر EOA، تولید API key از طریق SDK، sigType 2 برای Gnosis Safe، بهترین روش‌های ذخیره‌سازی key، و مهاجرت Magic به Privy.

این فصل چه چیزهایی را پوشش می‌دهد

مدل wallet در Polymarket سه بخش متحرک دارد: یک externally owned account (EOA) که orderها را sign می‌کند، یک smart-contract proxy که funds را نگه می‌دارد، و Polymarket CLOB API key که HTTP requestها را authenticate می‌کند. درست وصل کردن هر سه مورد، رایج‌ترین خطای روز اول برای builderهای جدید است، و بعد از migration مربوط به August 2025 از Magic Labs به Privy، این موضوع حتی گیج‌کننده‌تر شد. این فصل هر بخش را به ترتیب setup مرور می‌کند، همراه با environment variableهای مشخص و signature-type flagی که کد production به آن نیاز دارد.

  • Proxy wallet در برابر EOA: با کدام bot بزنیم
  • تولید یک API key (مراحل SDK)
  • sigType 2 و POLY_FUNDER_ADDRESS (Gnosis Safe)
  • ذخیره‌سازی key: .env، vault، KMS
  • مهاجرت Magic Labs به Privy
  • Approve کردن spending برای USDC/pUSD
  • Wallet recovery و backup

Proxy wallet در برابر EOA: با کدام bot بزنیم

Polymarket از الگوی smart-contract proxy wallet استفاده می‌کند. EOA شما - یعنی آدرسی که به private key شما متصل است - transactionها و orderها را sign می‌کند. یک Gnosis Safe که در یک آدرس deterministic deploy شده، pUSD و outcome shareهای واقعی را نگه می‌دارد. آدرس proxy همان چیزی است که در پنل "wallet" در UI پولی‌مارکت نمایش داده می‌شود؛ EOA همان چیزی است که sign می‌کند.

برای botها، همیشه با EOA sign می‌کنید (PRIVATE_KEY در env) و آدرس proxy را به‌عنوان POLY_FUNDER_ADDRESS در تنظیمات CLOB client ارجاع می‌دهید. فرستادن order با EOA به‌عنوان funder باعث خطای "insufficient balance" می‌شود، حتی وقتی proxy funded است.

شما نمی‌توانید فقط با EOA bot بزنید - flow وب Polymarket همیشه هنگام signup یک proxy ایجاد می‌کند. هر دو آدرس را با polymarket wallet show از CLI تأیید کنید، یا آدرس proxy را از settings در UI Polymarket بخوانید.

تولید یک API key (مراحل SDK)

CLOB API به سه credential نیاز دارد: key، secret، passphrase. این‌ها private key wallet شما نیستند - بلکه یک مجموعه credential از نوع HMAC هستند که به wallet شما bind شده‌اند و فقط برای authentication درخواست‌های HTTP استفاده می‌شوند.

یک‌بار با 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)

خروجی را در یک فایل JSON ذخیره کنید و در هر بار start شدن bot آن را load کنید؛ برای هر session دوباره تولید نکنید - server مربوط به API این credential set را cache می‌کند، و rotate کردن مکرر می‌تواند منطق rate-limit را فعال کند. این credentialها به‌طور خودکار منقضی نمی‌شوند. فقط اگر به leak مشکوک هستید آن‌ها را rotate کنید.

sigType 2 و POLY_FUNDER_ADDRESS (Gnosis Safe)

آرگومان signature_type مشخص می‌کند CLOB چگونه order signatureهای شما را validate کند. سه مقدار وجود دارد؛ دو مورد واقعی هستند:

  • 0 / EOA: EOA هم signer است و هم funder. برای setupهای غیرمعمولی استفاده می‌شود که در آن کاربران یک private key را مستقیماً import کرده‌اند.
  • 1 / POLY_PROXY: proxy contract قدیمی Magic Labs. بیشتر accountهای قبل از 2025.
  • 2 / POLY_GNOSIS_SAFE: استاندارد فعلی. funds داخل Gnosis Safe هستند، EOA sign می‌کند.

برای هر accountی که بعد از August 2025 (migration به Privy) ایجاد شده، یا هر accountی که در UI Polymarket یک Gnosis Safe address برایش می‌بینید، از signature_type=2 استفاده کنید. env var مربوط به POLY_FUNDER_ADDRESS باید آدرس Safe باشد، نه EOA. mismatch بین signature_type و نوع funder به‌صورت بی‌صدا orderها را reject می‌کند و خطایی شبیه "insufficient allowance" یا "balance: 0" می‌دهد - پیام خطا گمراه‌کننده است.

ذخیره‌سازی key: .env، vault، KMS

سه سطح معقول برای ذخیره‌سازی private key مربوط به EOA وجود دارد.

  1. فایل .env (توسعه روی یک machine). فایل روی VPS قرار دارد، bot هنگام start آن را می‌خواند، و key هرگز از host خارج نمی‌شود. برای walletهای کمتر از <$1k کافی است. chmod 600 .env بزنید و مطمئن شوید .gitignore ریپو آن را exclude می‌کند.
  2. Self-hosted vault (HashiCorp Vault، فایل رمزنگاری‌شده با age، یا systemd-creds). یک مرحله unlock هنگام start شدن bot اضافه می‌کند. برای walletهای در بازه $1k-$10k ارزش دارد.
  3. Cloud KMS (AWS KMS، GCP KMS). bot از KMS برای decrypt کردن key در memory استفاده می‌کند؛ key هرگز به disk نمی‌رسد. این پیچیدگی عملیاتی فقط بالاتر از $10k یا برای fleetهای چند-bot ارزش دارد.

چیزهایی که هرگز نباید انجام دهید: commit کردن private key در git، paste کردن آن در chat، ذخیره‌سازی آن در password managerی که بدون حالت local-only با cloud serviceها sync می‌شود. blast radius on-chain برای leak شدن EOA در Polymarket، کل موجودی pUSD و inventory سهم‌های outcome شماست.

مهاجرت Magic Labs به Privy

در August 2025، Polymarket provider اصلی embedded-wallet خود را از Magic Labs به Privy منتقل کرد. اثر این تغییر برای botها کم است، اما مشخص است.

accountهای قبل از migration (ساخته‌شده از طریق Magic) معمولاً از signature_type=1 (POLY_PROXY) استفاده می‌کنند. accountهای بعد از migration از signature_type=2 (POLY_GNOSIS_SAFE) استفاده می‌کنند. بعضی کاربران account قدیمی خود را migrate کردند؛ بعضی دیگر همان اصلی را نگه داشتند. از طریق public API نمی‌توان فهمید account شما از کدام نوع استفاده می‌کند - باید با تلاش برای sign کردن یک order و مشاهده rejection آن را بررسی کنید.

migration همچنین نحوه نمایش funder address در UI را تغییر داد. flowهای قدیمی UI پولی‌مارکت آدرس proxy را در dashboard نشان می‌دادند؛ flow فعلی آن را در account settings پنهان می‌کند. دستور polymarket wallet show تمیزترین راه برای تأیید هر دو مقدار است، بدون توجه به این‌که account چه زمانی ساخته شده باشد.

Approve کردن USDC/pUSD spending

برای این‌که CLOB هنگام match شدن order، pUSD شما را جابه‌جا کند، proxy باید contractهای exchange پولی‌مارکت را به‌عنوان spender approve کرده باشد. UI پولی‌مارکت این approvals را هنگام اولین deposit تنظیم می‌کند. برای botهایی که proxy را مستقیماً fund می‌کنند، باید آن‌ها را به‌صورت دستی تنظیم کنید.

سه approval که باید یک‌بار برای هر wallet تنظیم شوند:

  1. pUSD (ERC-20) → exchange contract
  2. Conditional Tokens (ERC-1155) → exchange contract (برای فروش shareها)
  3. Conditional Tokens (ERC-1155) → NegRisk exchange contract (برای فروش NegRisk shareها)

در اولین setup، polymarket approve را از CLI اجرا کنید. transaction فقط چند سنت در gas شبکه MATIC هزینه دارد. با polymarket approve check بررسی کنید - هر سه باید "approved" برگردانند. رایج‌ترین bug بی‌صدای جدیدها، نبودن approval مربوط به NegRisk است که فقط هنگام فروش shareها از marketهای چندنتیجه‌ای fail می‌شود و شبیه خطای balance به نظر می‌رسد.

Wallet recovery و backup

wallet bot دو جزء قابل‌بازیابی دارد: private key مربوط به EOA، و password حساب Polymarket (که دسترسی از طریق web UI را کنترل می‌کند اما از طریق SDK نه).

private key مربوط به EOA تنها چیزی است که برای bot اهمیت دارد. از دست رفتن آن = از دست رفتن همه چیز داخل proxy. backup سرد: آن را روی کاغذ بنویسید، در پاکت مهر و موم کنید، و خارج از محل نگه دارید. backup گرم: USB stick رمزنگاری‌شده. هرگز آن را برای خودتان ایمیل نکنید؛ هرگز به‌صورت unencrypted در cloud storage ذخیره نکنید.

password حساب Polymarket از طریق email recovery مربوط به Magic Labs / Privy قابل بازیابی است، تا زمانی که هنوز کنترل email اصلی ثبت‌نام را داشته باشید. این password دسترسی bot را کنترل نمی‌کند - bot مستقیماً از private key مربوط به EOA استفاده می‌کند.

اگر به leak شدن key شک دارید: فوراً pUSD و outcome tokenها را به یک wallet جدید withdraw کنید، یک EOA جدید تولید کنید، و bot را با key جدید redeploy کنید. key لو رفته را نمی‌توان revoke کرد؛ فقط می‌توان آن را خالی کرد.

سوالات متداول

آیا برای bot خود به یک wallet جدا نیاز دارم؟
بله، به‌شدت توصیه می‌شود. از یک EOA تازه یا یک proxy wallet تازه که از email-account مشتق شده و فقط سرمایه‌ای را نگه می‌دارد که برای bot تخصیص داده‌اید استفاده کنید. اگر key bot لو برود، فقط funds مربوط به bot در خطر هستند - holdings اصلی شما امن می‌مانند.
sigType 2 در Polymarkets API چیست؟
sigType 2 نشان‌دهنده یک signature از نوع Gnosis Safe (proxy wallet) است که وقتی با email/Google login می‌کنید و Polymarket proxy را برای شما ایجاد می‌کند استفاده می‌شود. برای sigType 2، environment variable مربوط به POLY_FUNDER_ADDRESS باید آدرس PROXY باشد (همان که در UI پولی‌مارکت نمایش داده می‌شود)، نه EOA زیربنایی. این یک bug رایج در configuration است.
چطور یک Polymarket API key تولید کنم؟
از SDK استفاده کنید. در Python: ApiCreds پس از این‌که با wallet خود authenticate شدید، از client.create_api_key() برمی‌گردد. در Node.js: مشابه آن از طریق @polymarket/clob-client-v2 و client.createApiKey(). key/secret/passphrase برگشتی را در .env خود ذخیره کنید (هرگز در git commit نکنید).
آیا Polymarket API keyها قابل revoke هستند؟
بله. هر زمان می‌توانید از طریق SDK key جدید derivation کنید؛ keyهای قدیمی تا زمانی که صراحتاً با client.deleteApiKey(creds) revoke نشوند معتبر باقی می‌مانند. بهترین روش این است که keyها را به‌صورت دوره‌ای rotate کنید و هر keyی را که روی یک machine compromise‌شده استفاده شده revoke کنید.
وقتی Polymarket از Magic Labs به Privy مهاجرت کرد چه چیزی تغییر کرد؟
کدهای OTP ورود از 3 رقم به کدهای طولانی‌تر همراه با device binding از طریق Privy تغییر کردند؛ این تغییر در هک December 2025 مورد سوءاستفاده قرار گرفت. برای botها، تغییر عملی مربوط به auth ceremony است - SDK بیشتر آن را abstract می‌کند. اگر bot شما hard-code شده به endpointهای API مربوط به Magic Labs بود (نادر)، به flow مربوط به Privy به‌روزرسانی کنید.
آیا باید keyها را در فایل .env ذخیره کنم؟
برای یک bot روی single-VPS - بله، با permission مناسب فایل (chmod 600 .env، متعلق به user مربوط به bot). برای setupهای چندmachine یا عملیات production-grade - به یک secrets manager منتقل شوید (AWS Secrets Manager، Vault، doppler.com). هرگز .env را در git commit نکنید، هیچ‌وقت.