Polymarket Bot Tutorial · 32 bölümün 9. bölümü
Polymarket on-chain verilerini doğrudan okuyun: USDC/pUSD balances, outcome supply için CTF contract okumaları, UMA Optimistic Oracle proposed/disputed events ve Polygon transaction logs - kod ile birlikte.
Bu bölüm neleri kapsıyor
Polymarket'in APIs'leri kullanışlıdır ancak sonunda consistent olurlar. Chain otoritedir. Bu bölüm, production bot'un kendi muhasebesini doğrulamak için kullandığı on-chain okumaları anlatır: pUSD balances, outcome-token inventory, UMA dispute events ve CTF contract state. Çoğu production botun ulaştığı desen, hız için API-first ve doğruluk için periyodik on-chain reconciliation kullanmaktır.
- On-chain'de ne var (CLOB'da ne var)
- pUSD contract address ve ABI
- Conditional Tokens Framework (CTF)
- UMA Optimistic Oracle: proposed ve disputed events
- Polygon event logs okuma (web3.py / ethers)
- Ne zaman on-chain okunmalı, ne zaman API'ye güvenilmeli
- Kod: event subscription ile UMA dispute tespiti
On-chain'de ne var (CLOB'da ne var)
İki state machine, iki gerçek.
On-chain (Polygon): pUSD balances, outcome-token inventory (token başına ERC-1155 supply), allowance approvals, UMA Optimistic Oracle proposals ve disputes, deposit ve withdrawal events. Sonunda doğru olur; latency bir Polygon block kadar, yani yaklaşık 2 saniyedir.
CLOB (Polymarket API): order book, recent trades, pending limit orders, match acknowledgments. Gerçek zamanlıdır ancak sonunda consistent olur - bir match ERC-1155 settle olmadan önce acknowledged edilir; bu da 12. bölümde ele alınan phantom-fill problemine yol açar.
İkisi de her zaman sonunda birbirine yaklaşmalıdır. Ayrıştıklarında chain otoritedir. Yalnızca CLOB'a güvenen bir bot zamanla sapar; yalnızca chain'e güvenen bir bot yavaş trade eder. Production code her ikisini kullanır: hız kritik kararlar için CLOB, periyodik reconciliation için chain.
pUSD contract address ve ABI
pUSD, Polymarket'in 2025 V2 migration'ından beri kullanılan stablecoin wrapper'ıdır. Polygon mainnet üzerindeki 0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB adresindeki contract standart bir ERC-20'dir.
Bir bot için önemli olan üç okuma:
balanceOf(proxy)- harcanabilir pUSD'niz. Her restart'ta bunu CLOB'un balance görünümüyle karşılaştırın.allowance(proxy, exchange_contract)- CTF/NegRisk exchange contract'lerinin pUSD'nizi harcayıp harcayamayacağı. Order matching için gereklidir.Transferevent subscription - polling yapmadan deposit ve withdrawal'ları tespit eder.
USDC (0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) hâlâ off-ramp pair olarak kalır. Çoğu botun yalnızca pUSD okumalarına ihtiyacı vardır; USDC yalnızca deposit/withdrawal döngülerinde önemlidir.
Conditional Tokens Framework (CTF)
Outcome shares, Gnosis'in Conditional Tokens Framework (CTF) tarafından mint edilen ERC-1155 token'larıdır. Polygon üzerindeki 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 adresindeki CTF contract'ı her position-id için supply'ı takip eder.
Üç okuma:
balanceOf(proxy, position_id)- o market+outcome için gerçekten kaç outcome token tuttuğunuz.getOutcomeSlotCount(condition_id)- outcome sayısı (binary için 2, multi-outcome için N).payoutNumerators,payoutDenominator- UMA market'i resolve ettiğinde set edilir. Bunları okumak, CLOB UI güncellenmeden önce hangi tarafın kazandığını söyler.
position_id, (condition_id, outcome_index) değerlerinin bir hash'idir. Bunu client-side olarak CTF'nin getPositionId helper'ı ile hesaplayın veya stack'inizde keccak math'i yeniden uygulayın.
UMA Optimistic Oracle: proposed ve disputed events
UMA'nın Optimistic Oracle (OO) sistemi Polymarket dispute resolution'larının tamamını yönetir. Botunuzun subscribe etmek isteyebileceği iki event vardır.
ProposePrice(requester, identifier, timestamp, ancillaryData, proposer, proposedPrice)- bir Polymarket botu outcome önerdiğinde tetiklenir.DisputePrice(requester, identifier, timestamp, ancillaryData, disputer)- biri önerilen outcome'a itiraz ettiğinde tetiklenir.
OO contract address: 0xeE3Afe347D5C74317041E2618C49534dAf887c24. Polymarket'in requester address'ine göre filtreleyin.
Neden subscribe edilmeli: bir dispute, resolution'ın artık contested olduğu ve 24-72 saatlik bir UMA vote gerektireceği anlamına gelir. Bu pencere sırasında market trading için pause edilmiş olabilir. Disputed bir markette position tutan bir bot bunu hemen bilmelidir.
Polygon event logs okuma (web3.py / ethers)
İki referans implementasyon.
Python (web3.py):
from web3 import Web3
w3 = Web3(Web3.HTTPProvider(POLYGON_RPC))
ctf = w3.eth.contract(address=CTF_ADDR, abi=CTF_ABI)
filter = ctf.events.PayoutRedemption.create_filter(fromBlock="latest")
for event in filter.get_new_entries():
print(event["args"])
Node (ethers v6):
import { ethers } from "ethers";
const p = new ethers.JsonRpcProvider(POLYGON_RPC);
const ctf = new ethers.Contract(CTF_ADDR, CTF_ABI, p);
ctf.on("PayoutRedemption", (redeemer, collateral, parentId, conditionId) => {
console.log("redemption", { redeemer, conditionId });
});
Sürekli monitoring için HTTP polling yerine WebSocket transport (wss://...) kullanın - daha az request ve daha hızlı teslimat sağlar. Çoğu ücretli RPC provider giriş planlarında WebSocket içerir.
Ne zaman on-chain okunmalı, ne zaman API'ye güvenilmeli
Production'dan pratik kurallar.
- API'ye güvenin: real-time order book, recent trades, kendi pending orders'larınız, market metadata (slug, question, end date), event/market discovery.
- Chain'e güvenin: kendi pUSD balance'ınız, kendi outcome-token inventory'niz, deposit ve withdrawal doğrulaması, resolution outcomes, dispute state.
- İkisini çapraz kontrol edin: bot'un fill olarak kaydettiği herhangi bir finansal kayıt için - settlement'ı doğrulamak üzere API'nin "matched" event'ini chain'in CTF transfer'i ile eşleştirin.
Bir buy sonrası 5 saniye bekleme kuralı (12. bölüm) API zamanına sızan on-chain gerçekliktir. Bir market buy'dan hemen sonra gönderilen GTC sell, CLOB birkaç an önce match etmiş olsa bile chain check'ten balance: 0 görecektir.
Kod: event subscription ile UMA dispute tespiti
Referans: Polymarket ile ilişkili UMA disputes'ları gerçek zamanlı izleyin.
from web3 import Web3
w3 = Web3(Web3.WebsocketProvider(POLYGON_WSS))
oo = w3.eth.contract(address=UMA_OO_ADDR, abi=UMA_ABI)
POLY_REQUESTER = "0x..." # Polymarket's UMA requester address
def on_dispute(event):
args = event["args"]
if args["requester"].lower() != POLY_REQUESTER.lower(): return
print(f"DISPUTE on Polymarket market: ancillary={args['ancillaryData'][:40]}...")
# decode ancillaryData to recover the market question
event_filter = oo.events.DisputePrice.create_filter(fromBlock="latest")
while True:
for ev in event_filter.get_new_entries():
on_dispute(ev)
time.sleep(2)
ancillaryData alanı, market question'ı içeren hex-encoded JSON-benzeri metindir. Bunu decode etmek, açık position'larınızla cross-reference etmek için slug'e eşdeğer identifier'ı verir.
Sıkça sorulan sorular
0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB adresinde bulunur. 28 Nisan 2026'da USDC.e'nin yerini alarak Polymarkets'in canonical collateral'ı oldu. Polygonscan bağlantısı: https://polygonscan.com/token/0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB.











