Polymarket Bot Tutorial · บทที่ 6 จาก 32

การยืนยันตัวตนของ Polymarket bot และการตั้งค่า wallet: proxy wallets เทียบกับ EOA, การสร้าง API key ผ่าน SDK, sigType 2 สำหรับ Gnosis Safe, แนวปฏิบัติที่ดีที่สุดในการเก็บ key, และการย้ายจาก Magic ไป Privy

บทนี้ครอบคลุมอะไรบ้าง

โมเดล wallet ของ Polymarket มี 3 ส่วนที่ต้องทำงานร่วมกัน: externally owned account (EOA) ที่ใช้เซ็นคำสั่ง, smart-contract proxy ที่เก็บเงิน, และ Polymarket CLOB API key ที่ใช้ยืนยัน HTTP requests การตั้งค่าให้ทั้งสามส่วนเชื่อมกันถูกต้องคือสาเหตุล้มเหลวอันดับหนึ่งในวันแรกสำหรับผู้สร้างบอทมือใหม่ และยิ่งสับสนมากขึ้นหลังการย้ายจาก Magic Labs ไป Privy ในเดือนสิงหาคม 2025 บทนี้จะพาไล่ทีละส่วนตามลำดับการตั้งค่า พร้อม environment variables และ signature-type flag ที่โค้ด production ต้องใช้

  • Proxy wallet vs EOA: จะใช้ตัวไหนบอท
  • การสร้าง API key (ขั้นตอน SDK)
  • sigType 2 และ POLY_FUNDER_ADDRESS (Gnosis Safe)
  • การเก็บ key: .env, vault, KMS
  • การย้ายจาก Magic Labs ไป Privy
  • การอนุมัติการใช้ USDC/pUSD
  • การกู้คืนและสำรอง wallet

Proxy wallet vs EOA: จะใช้ตัวไหนบอท

Polymarket ใช้รูปแบบ smart-contract proxy wallet โดย EOA ของคุณ-ที่อยู่ที่ผูกกับ private key ของคุณ-จะใช้เซ็นธุรกรรมและคำสั่งซื้อ ส่วน Gnosis Safe ที่ deploy ไว้ที่ address แบบ deterministic จะเก็บ pUSD และ outcome shares จริง ๆ ที่อยู่ proxy คือสิ่งที่แสดงในแผง "wallet" ของ UI Polymarket; ส่วน EOA คือสิ่งที่ใช้เซ็น

สำหรับบอท คุณต้องเซ็นด้วย EOA เสมอ (PRIVATE_KEY ใน env) และอ้างอิงที่อยู่ proxy เป็น POLY_FUNDER_ADDRESS ใน config ของ CLOB client การส่งคำสั่งซื้อโดยใช้ EOA เป็น funder จะทำให้เกิดข้อผิดพลาด "insufficient balance" แม้ว่า proxy จะมีเงินอยู่ก็ตาม

คุณไม่สามารถใช้บอทด้วย EOA อย่างเดียวได้-flow บนเว็บของ Polymarket จะสร้าง proxy ให้เสมอเมื่อสมัครใช้งาน ยืนยันทั้งสองที่อยู่ด้วย polymarket wallet show จาก CLI หรืออ่านที่อยู่ proxy จาก settings ใน UI ของ Polymarket

การสร้าง API key (ขั้นตอน SDK)

CLOB API ต้องใช้ credentials 3 ค่า: key, secret, passphrase ค่าเหล่านี้ไม่ใช่ private key ของ wallet คุณ-แต่เป็นชุด credential แบบ HMAC ที่ผูกกับ wallet ของคุณ ใช้สำหรับยืนยัน HTTP request เท่านั้น

สร้างครั้งเดียวด้วย 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 และโหลดทุกครั้งที่บอทเริ่มทำงาน; อย่าสร้างใหม่ทุก session-API server แคชชุด credential ไว้ และการ rotate บ่อย ๆ อาจไปกระตุ้น logic ของ rate limit ได้ credential เหล่านี้จะไม่หมดอายุโดยอัตโนมัติ ให้ rotate เฉพาะเมื่อสงสัยว่ามีการรั่วไหลเท่านั้น

sigType 2 และ POLY_FUNDER_ADDRESS (Gnosis Safe)

อาร์กิวเมนต์ signature_type ควบคุมว่า CLOB จะตรวจสอบลายเซ็นคำสั่งของคุณอย่างไร มี 3 ค่า; แต่มี 2 ค่าที่ใช้งานจริง:

  • 0 / EOA: EOA เป็นทั้งผู้เซ็นและ funder ใช้กับการตั้งค่าที่ไม่ปกติ ซึ่งผู้ใช้ import private key โดยตรง
  • 1 / POLY_PROXY: legacy Magic Labs proxy contract สำหรับบัญชีส่วนใหญ่ก่อนปี 2025
  • 2 / POLY_GNOSIS_SAFE: มาตรฐานปัจจุบัน เก็บเงินใน Gnosis Safe และให้ EOA เซ็น

ใช้ signature_type=2 สำหรับบัญชีใด ๆ ที่สร้างหลังเดือนสิงหาคม 2025 (การย้ายไป Privy) หรือบัญชีใดก็ตามที่คุณเห็น Gnosis Safe address ใน UI ของ Polymarket ตัวแปร env POLY_FUNDER_ADDRESS ต้องเป็นที่อยู่ของ Safe ไม่ใช่ EOA การตั้งค่า signature_type ไม่ตรงกับชนิดของ funder จะทำให้คำสั่งถูกปฏิเสธแบบเงียบ ๆ และดูเหมือนข้อผิดพลาด "insufficient allowance" หรือ "balance: 0"-ข้อความ error ทำให้เข้าใจผิด

การเก็บ key: .env, vault, KMS

มี 3 ระดับที่เหมาะสมสำหรับการเก็บ private key ของ EOA

  1. ไฟล์ .env (พัฒนาแบบเครื่องเดียว) ไฟล์อยู่บน VPS บอทอ่านตอนเริ่มทำงาน key จะไม่ออกจาก host เหมาะสำหรับ wallet ที่มีมูลค่าน้อยกว่า <$1k ใช้ chmod 600 .env และตรวจสอบให้แน่ใจว่า .gitignore ของ repo ตัดไฟล์นี้ออก
  2. self-hosted vault (HashiCorp Vault, ไฟล์เข้ารหัสด้วย age, หรือ systemd-creds) เพิ่มขั้นตอนปลดล็อกตอนบอทเริ่มทำงาน คุ้มค่าสำหรับ wallet มูลค่า $1k-$10k
  3. Cloud KMS (AWS KMS, GCP KMS) บอทเรียก KMS เพื่อถอดรหัส key ในหน่วยความจำ; key จะไม่แตะ disk เลย คุ้มค่ากับความซับซ้อนด้านปฏิบัติการเฉพาะเมื่อเกิน $10k หรือสำหรับ multi-bot fleets

สิ่งที่ห้ามทำเด็ดขาด: commit private key ลง git, วางลงในแชต, เก็บไว้ใน password manager ที่ซิงก์ขึ้น cloud services โดยไม่มี local-only mode ความเสียหายบนเชนจากการรั่วของ Polymarket EOA คือยอด pUSD ทั้งหมดและ inventory ของ outcome share ทั้งหมดของคุณ

การย้ายจาก Magic Labs ไป Privy

ในเดือนสิงหาคม 2025 Polymarket ได้ย้ายผู้ให้บริการ embedded-wallet หลักจาก Magic Labs ไป Privy ผลกระทบต่อฝั่งบอทมีน้อย แต่เฉพาะเจาะจง

บัญชีที่สร้างก่อนย้าย (ผ่าน Magic) โดยทั่วไปจะใช้ signature_type=1 (POLY_PROXY) บัญชีหลังการย้ายใช้ signature_type=2 (POLY_GNOSIS_SAFE) ผู้ใช้บางคนย้ายบัญชีเก่า บางคนเก็บของเดิมไว้ ไม่มีทางดูจาก public API ได้ว่าบัญชีของคุณใช้ชนิดไหน-คุณต้องลองเซ็นคำสั่งแล้วดูว่าถูกปฏิเสธอย่างไร

การย้ายยังเปลี่ยนวิธีที่ UI แสดงที่อยู่ funder ด้วย flow ของ UI Polymarket แบบเก่าจะแสดงที่อยู่ proxy ใน dashboard; flow ปัจจุบันซ่อนไว้ใน account settings คำสั่ง CLI polymarket wallet show เป็นวิธีที่สะอาดที่สุดในการยืนยันทั้งสองค่า ไม่ว่าบัญชีนั้นจะถูกสร้างเมื่อใดก็ตาม

การอนุมัติการใช้ USDC/pUSD

เพื่อให้ CLOB สามารถย้าย pUSD ของคุณเมื่อคำสั่งจับคู่สำเร็จ proxy ต้องอนุมัติสัญญา exchange ของ Polymarket ให้เป็น spender เสียก่อน UI ของ Polymarket จะตั้งค่า approval เหล่านี้ระหว่างการฝากครั้งแรก สำหรับบอทที่เติมเงินเข้า proxy โดยตรง คุณต้องตั้งเอง

มี 3 approvals ที่ต้องตั้ง หนึ่งครั้งต่อ 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 ในการตั้งค่าครั้งแรก ธุรกรรมนี้มีค่า gas เป็น MATIC เพียงไม่กี่เซนต์ ตรวจสอบด้วย polymarket approve check-ทั้งสามรายการควรตอบว่า "approved." บั๊กที่เงียบและพบบ่อยที่สุดสำหรับผู้สร้างใหม่คือการลืม NegRisk approval ซึ่งจะล้มเหลวเฉพาะตอนขาย shares จากตลาดหลายผลลัพธ์ และดูเหมือนข้อผิดพลาดเรื่อง balance

การกู้คืนและสำรอง wallet

wallet ของบอทมีสองส่วนที่กู้คืนได้: private key ของ EOA และรหัสผ่านบัญชี Polymarket (ซึ่งใช้ควบคุมการเข้าถึงผ่านเว็บ UI แต่ไม่ผ่าน SDK)

private key ของ EOA คือสิ่งเดียวที่สำคัญสำหรับบอท หากหาย = ทุกอย่างใน proxy หายไปด้วย สำรองแบบเย็น: เขียนลงกระดาษ ใส่ซอง ปิดผนึก และเก็บนอกสถานที่ สำรองแบบร้อน: USB stick ที่เข้ารหัส ห้ามส่งอีเมลหาตัวเอง; ห้ามเก็บแบบไม่เข้ารหัสใน cloud storage

รหัสผ่านบัญชี Polymarket กู้คืนได้ผ่าน Magic Labs / Privy email recovery ตราบใดที่คุณยังควบคุมอีเมลที่ใช้สมัครแรกเริ่มอยู่ มันไม่ได้เป็นด่านเข้าถึงของบอท-บอทใช้ private key ของ EOA โดยตรง

หากคุณสงสัยว่ามี key รั่ว: ทันที ให้ถอน pUSD และ outcome tokens ไปยัง wallet ใหม่ สร้าง EOA ใหม่ และ deploy บอทใหม่ด้วย key ใหม่ key ที่รั่วไม่สามารถ revoke ได้; ทำได้เพียงปล่อยให้ถูกดูดออกไปเท่านั้น

คำถามที่พบบ่อย

ฉันต้องมี wallet แยกสำหรับบอทไหม?
แนะนำอย่างยิ่งว่าใช่ ให้ใช้ EOA ใหม่เอี่ยมหรือ proxy wallet ที่สร้างใหม่จากอีเมล/บัญชีใหม่ซึ่งถือเฉพาะเงินทุนที่คุณจัดสรรให้บอทเท่านั้น หาก key ของบอทรั่ว เงินที่เสี่ยงจะมีแค่เงินของบอท-เงินหลักของคุณยังปลอดภัย
sigType 2 ใน Polymarkets API คืออะไร?
sigType 2 หมายถึงลายเซ็นแบบ Gnosis Safe (proxy wallet) ใช้เมื่อคุณล็อกอินด้วย email/Google และ Polymarket สร้าง proxy ให้ สำหรับ sigType 2 ตัวแปรสภาพแวดล้อม POLY_FUNDER_ADDRESS ต้องเป็นที่อยู่ PROXY (ตัวที่แสดงใน UI ของ Polymarket) ไม่ใช่ EOA ด้านล่าง นี่เป็นบั๊กการตั้งค่าที่พบบ่อย
ฉันจะสร้าง Polymarket API key ได้อย่างไร?
ใช้ SDK ใน Python: ApiCreds ที่ส่งกลับมาจาก client.create_api_key() หลังจากคุณยืนยันตัวตนด้วย wallet ของคุณแล้ว ใน Node.js: คล้ายกันผ่าน @polymarket/clob-client-v2 client.createApiKey() บันทึก key/secret/passphrase ที่ได้ลง .env ของคุณ (ห้าม commit ลง git)
Polymarket API keys ยกเลิกได้ไหม?
ได้ คุณสร้าง key ใหม่ได้ทุกเมื่อผ่าน SDK; key เก่าจะยังใช้ได้จนกว่าจะ revoke อย่างชัดเจนผ่าน client.deleteApiKey(creds) แนวปฏิบัติที่ดีที่สุดคือ rotate keys เป็นระยะ และ revoke key ใดก็ตามที่เคยใช้งานบนเครื่องที่อาจถูกเจาะ
เกิดอะไรขึ้นเมื่อ Polymarket ย้ายจาก Magic Labs ไป Privy?
รหัส OTP สำหรับ login จากเดิม 3 หลัก (มีช่องโหว่ brute force และถูกใช้โจมตีในแฮ็กเดือนธันวาคม 2025) กลายเป็นรหัสที่ยาวขึ้นพร้อม device binding ผ่าน Privy สำหรับบอท การเปลี่ยนแปลงที่ใช้งานจริงคือขั้นตอนการยืนยันตัวตน-SDK ช่วยซ่อนรายละเอียดส่วนใหญ่ไว้ หากบอทของคุณ hard-code ไปยัง Magic Labs API endpoints (ซึ่งพบไม่บ่อย) ให้เปลี่ยนไปใช้ flow ของ Privy
ฉันควรเก็บ key ในไฟล์ .env ไหม?
สำหรับบอทเครื่องเดียวบน VPS-ใช่ โดยตั้งสิทธิ์ไฟล์ให้ถูกต้อง (chmod 600 .env, ให้ user ของบอทเป็นเจ้าของ) สำหรับระบบที่มีหลายเครื่องหรือการทำงานระดับ production-ย้ายไปใช้ secrets manager (AWS Secrets Manager, Vault, doppler.com) อย่า commit .env ลง git เด็ดขาด