Polymarket bot eğitimi · Bölüm 9 / 32

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, para yatırma ve para çekme 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 2026 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.
  • Transfer event subscription - polling yapmadan para yatırma ve para çekme'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 para yatırma/para çekme döngülerinde önemlidir.

Conditional Tokens Framework (CTF)

Outcome paylar, Gnosis'in Conditional Tokens Framework (CTF) tarafından mint edilen ERC-1155 token'larıdır. Polygon üzerindeki 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 adresindeki CTF contract'ı her pozisyon-id için supply'ı takip eder.

Üç okuma:

  • balanceOf(proxy, position_id) - o piyasa+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 piyasayı 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 sonuçlanma'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, sonuçlanma'ın artık contested olduğu ve 24-72 saatlik bir UMA vote gerektireceği anlamına gelir. Bu pencere sırasında piyasa trading için pause edilmiş olabilir. Disputed bir piyasada pozisyon 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, piyasa metadata (slug, question, end date), event/piyasa discovery.
  • Chain'e güvenin: kendi pUSD balance'ınız, kendi outcome-token inventory'niz, para yatırma ve para çekme doğrulaması, sonuçlanma 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 piyasa 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ı, piyasa question'ı içeren hex-encoded JSON-benzeri metindir. Bunu decode etmek, açık pozisyonlarınızla cross-reference etmek için slug'e eşdeğer identifier'ı verir.

Sıkça sorulan sorular

Polymarket pUSD contract'ını nerede bulabilirim?
pUSD, Polygon üzerinde 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.
Polymarket'teki CTF contract nedir?
CTF, Conditional Tokens Framework anlamına gelir - trade ettiğiniz outcome token'larını (YES ve NO paylar) çıkaran Gnosis-türevi ERC-1155 contract'ı. Her Polymarket piyasayı, sonuçlanma mantığı UMA'nın sonuçlanmasına bağlı olan bir CTF pozisyondur. Botların CTF ile doğrudan etkileşmesi nadiren gerekir; SDK bunu halleder.
Polygon üzerinde UMA dispute events'e nasıl subscribe olurum?
Polygon RPC provider'ınızın WebSocket'i üzerinden UMA Optimistic Oracle V2 contract'ının "ProposePrice" ve "DisputePrice" events'lerine subscribe olun. Yalnızca Polymarket ile ilgili disputes'ları almak için requesterAddress alanına (Polymarket oracle adapter) göre filtreleyin. Kod örnekleri bölümde yer alıyor.
Polymarket API'ye güveniyorsam on-chain data okumam gerekir mi?
Çoğu strategy için hayır. CLOB API order book ve trade data için canonical'dır, gamma API ise metadata için canonical'dır. On-chain'i; (a) API'nin gösterdiğinden daha hızlı UMA dispute alert'lerine ihtiyacınız olduğunda, (b) bir para yatırmanın gerçekten ulaştığını doğrulamak istediğinizde veya (c) outcome/pozisyonlar üzerinde özel analytics yaptığınızda okursunuz.
On-chain Polygon data ile Polymarket API arasındaki latency nedir?
Polygon block time yaklaşık 2 saniyedir. Polymarket API genellikle on-chain match'ten sonraki yüzlerce milisaniye içinde order book değişikliklerini gösterir. Çoğu signal için API, kendi on-chain okumalarınızdan daha hızlıdır. UMA disputes bir istisnadır - on-chain event, UI dispute'u yansıtmadan önce tetiklenir.
CLOB API olmadan Polymarket pozisyonlar okuyabilir miyim?
Teknik olarak evet - her pozisyon için CTF balanceOf(walletAddress, positionId) okuyun. Pratikte CLOB API /trade/pozisyonlar endpoint'i daha hızlıdır, pricing içerir ve tüm pozisyonlar'larınızı toplar. Yalnızca doğrulama gerektiğinde veya API kapalıysa on-chain okumaya dönün.