पॉलीमार्केट बॉट ट्यूटोरियल · अध्याय 9 / 32
पॉलीमार्केट का ऑन-चेन डेटा सीधे पढ़ें: USDC/pUSD बैलेंस, आउटकम सप्लाई के लिए CTF कॉन्ट्रैक्ट रीड, UMA Optimistic Oracle के प्रस्तावित/विवादित इवेंट, और Polygon ट्रांज़ैक्शन लॉग - कोड के साथ।
यह अध्याय क्या कवर करता है
पॉलीमार्केट के API सुविधाजनक हैं, लेकिन ये अंततः सुसंगत (eventually consistent) होते हैं। चेन ही अंतिम प्रमाण है। यह अध्याय उन ऑन-चेन रीड को समझाता है जिन्हें एक प्रोडक्शन बॉट अपनी बहीखाता (bookkeeping) सत्यापित करने के लिए उपयोग करता है: pUSD बैलेंस, आउटकम-टोकन इन्वेंट्री, UMA विवाद इवेंट, और CTF कॉन्ट्रैक्ट स्टेट। ज़्यादातर प्रोडक्शन बॉट जिस तरीके पर एकमत होते हैं, वह है गति के लिए API-पहले और शुद्धता के लिए समय-समय पर ऑन-चेन मिलान।
- ऑन-चेन में क्या रहता है (और CLOB में क्या)
- pUSD कॉन्ट्रैक्ट पता और ABI
- Conditional Tokens Framework (CTF)
- UMA Optimistic Oracle: प्रस्तावित और विवादित इवेंट
- Polygon इवेंट लॉग पढ़ना (web3.py / ethers)
- ऑन-चेन कब पढ़ें बनाम API पर भरोसा करें
- कोड: इवेंट सब्सक्रिप्शन के ज़रिए UMA विवाद पहचानें
ऑन-चेन में क्या रहता है (और CLOB में क्या)
दो स्टेट मशीनें, दो सच्चाइयाँ।
ऑन-चेन (Polygon): pUSD बैलेंस, आउटकम-टोकन इन्वेंट्री (प्रति टोकन ERC-1155 सप्लाई), अलाउंस स्वीकृतियाँ, UMA Optimistic Oracle के प्रस्ताव और विवाद, जमा और निकासी इवेंट। यह अंततः सही होता है; इसमें एक Polygon ब्लॉक (~2 सेकंड) की देरी रहती है।
CLOB (पॉलीमार्केट API): ऑर्डर बुक, हाल के ट्रेड, लंबित लिमिट ऑर्डर, मैच पुष्टियाँ। रियल-टाइम लेकिन अंततः सुसंगत - ERC-1155 के सेटल होने से पहले ही मैच को स्वीकार कर लिया जाता है, जिससे फैंटम-फ़िल की समस्या पैदा होती है, जिसे अध्याय 12 में कवर किया गया है।
दोनों को हमेशा एक ही जगह आ मिलना चाहिए। जब वे अलग हों, तो चेन ही अंतिम प्रमाण है। सिर्फ़ CLOB पर भरोसा करने वाला बॉट भटक जाएगा; सिर्फ़ चेन पर भरोसा करने वाला बॉट धीरे ट्रेड करेगा। प्रोडक्शन कोड दोनों का उपयोग करता है: गति-निर्भर निर्णयों के लिए CLOB, और समय-समय पर मिलान के लिए चेन।
pUSD कॉन्ट्रैक्ट पता और ABI
pUSD पॉलीमार्केट का स्टेबलकॉइन रैपर है, जो 2026 V2 माइग्रेशन के बाद से उपयोग में है। Polygon mainnet पर 0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB वाला कॉन्ट्रैक्ट एक मानक ERC-20 है।
बॉट के लिए तीन रीड महत्वपूर्ण हैं:
balanceOf(proxy)- आपका ख़र्च करने योग्य pUSD। हर बार दोबारा शुरू (restart) करने पर इसे CLOB के बैलेंस व्यू से मिलाएँ।allowance(proxy, exchange_contract)- क्या CTF/NegRisk एक्सचेंज कॉन्ट्रैक्ट आपका pUSD ख़र्च कर सकते हैं। ऑर्डर मैचिंग के लिए आवश्यक।Transferइवेंट सब्सक्रिप्शन - बार-बार पूछे (polling) बिना जमा और निकासी का पता लगाता है।
USDC (0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) अब भी ऑफ-रैंप जोड़ी बना हुआ है। ज़्यादातर बॉट को सिर्फ़ pUSD रीड की ज़रूरत होती है; USDC का महत्व केवल जमा/निकासी चक्रों के दौरान होता है।
Conditional Tokens Framework (CTF)
आउटकम शेयर Gnosis के Conditional Tokens Framework (CTF) द्वारा जारी किए गए ERC-1155 टोकन हैं। Polygon पर 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 वाला CTF कॉन्ट्रैक्ट प्रति position-id सप्लाई पर नज़र रखता है।
तीन रीड:
balanceOf(proxy, position_id)- उस मार्केट+आउटकम के लिए आपके पास वास्तव में कितने आउटकम टोकन हैं।getOutcomeSlotCount(condition_id)- परिणामों की संख्या (द्विआधारी के लिए 2, बहु-परिणाम के लिए N)।payoutNumerators,payoutDenominator- जब UMA मार्केट का रिज़ॉल्यूशन करता है तब सेट होते हैं। इन्हें पढ़कर आप CLOB UI अपडेट होने से पहले ही जान सकते हैं कि कौन-सा पक्ष जीता।
position_id, (condition_id, outcome_index) का हैश होता है। इसे क्लाइंट-साइड पर CTF के getPositionId हेल्पर से गणना करें या अपनी स्टैक में keccak गणित को दोहराएँ।
UMA Optimistic Oracle: प्रस्तावित और विवादित इवेंट
UMA का Optimistic Oracle (OO) पॉलीमार्केट के सभी विवाद रिज़ॉल्यूशन को संभालता है। दो इवेंट जिन पर आपका बॉट सब्सक्राइब करना चाह सकता है।
ProposePrice(requester, identifier, timestamp, ancillaryData, proposer, proposedPrice)- जब पॉलीमार्केट बॉट कोई परिणाम प्रस्तावित करता है तब सक्रिय होता है।DisputePrice(requester, identifier, timestamp, ancillaryData, disputer)- जब कोई किसी प्रस्तावित परिणाम को चुनौती देता है तब सक्रिय होता है।
OO कॉन्ट्रैक्ट पता: 0xeE3Afe347D5C74317041E2618C49534dAf887c24. पॉलीमार्केट के requester पते से फ़िल्टर करें।
सब्सक्राइब क्यों करें: विवाद का मतलब है कि रिज़ॉल्यूशन अब विवादित है और उसके लिए 24-72 घंटे के UMA वोट की आवश्यकता होगी। उस अवधि के दौरान मार्केट ट्रेडिंग के लिए रुक सकता है। जो बॉट किसी विवादित मार्केट पर पोज़ीशन रखे हुए है, उसे तुरंत यह पता होना चाहिए।
Polygon इवेंट लॉग पढ़ना (web3.py / ethers)
दो संदर्भ कार्यान्वयन।
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 });
});
लगातार निगरानी के लिए HTTP पोलिंग के बजाय WebSocket ट्रांसपोर्ट (wss://...) का उपयोग करें - कम रिक्वेस्ट और तेज़ डिलीवरी। ज़्यादातर पेड RPC प्रोवाइडर अपने शुरुआती टियर में WebSocket शामिल करते हैं।
ऑन-चेन कब पढ़ें बनाम API पर भरोसा करें
प्रोडक्शन से व्यावहारिक नियम।
- API पर भरोसा करें इनके लिए: रियल-टाइम ऑर्डर बुक, हाल के ट्रेड, आपके अपने लंबित ऑर्डर, मार्केट मेटाडेटा (slug, प्रश्न, अंतिम तिथि), इवेंट/मार्केट खोज।
- चेन पर भरोसा करें इनके लिए: आपका अपना pUSD बैलेंस, आपकी अपनी आउटकम-टोकन इन्वेंट्री, जमा और निकासी की पुष्टि, रिज़ॉल्यूशन परिणाम, विवाद स्थिति।
- दोनों की जाँच करें इनके लिए: कोई भी वित्तीय चीज़ जिसे बॉट ने फ़िल के रूप में दर्ज किया हो - API के "matched" इवेंट को चेन के CTF ट्रांसफ़र से मिलाकर सेटलमेंट की पुष्टि करें।
ख़रीद के बाद 5-सेकंड-प्रतीक्षा नियम (अध्याय 12) API समय में ऑन-चेन वास्तविकता का प्रवेश है। मार्केट ख़रीद के तुरंत बाद जमा किया गया GTC बेच ऑर्डर, चेन जाँच में balance: 0 दिखा सकता है, भले ही CLOB ने कुछ ही क्षण पहले मैच कर लिया हो।
कोड: इवेंट सब्सक्रिप्शन के ज़रिए UMA विवाद पहचानें
संदर्भ: पॉलीमार्केट से जुड़े UMA विवादों की रियल टाइम में निगरानी करें।
from web3 import Web3
w3 = Web3(Web3.WebsocketProvider(POLYGON_WSS))
oo = w3.eth.contract(address=UMA_OO_ADDR, abi=UMA_ABI)
POLY_REQUESTER = "0x..." # पॉलीमार्केट's UMA requester address
def on_dispute(event):
args = event["args"]
if args["requester"].lower() != POLY_REQUESTER.lower(): return
print(f"DISPUTE on पॉलीमार्केट 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 फ़ील्ड hex-एन्कोडेड JSON-जैसा टेक्स्ट है जिसमें मार्केट का प्रश्न होता है। इसे डिकोड करने पर आपको slug के समकक्ष एक पहचानकर्ता मिलता है, जिसे आप अपनी खुली पोज़ीशनों के साथ मिलाकर देख सकते हैं।


