Use this file to discover all available pages before exploring further.
Dome was acquired by Polymarket in February 2026 and is shutting down. polynode provides a drop-in replacement for both Dome’s WebSocket feed (same format, 3-5 seconds faster) and Dome’s trading SDK (same CLOB signing, but your credentials stay local instead of on Dome’s server).
Each on-chain settlement produces multiple fill events, one per OrderFilled log. This is identical to how Dome works.Maker fill events:user is the maker’s address, taker is the actual taker’s wallet address, order_hash is the maker’s EIP-712 order hash.Taker fill events:user is the taker’s address, taker is the exchange contract address (not a real wallet). The order_hash is the taker’s EIP-712 order hash.The exchange contract address depends on the market type:
Market type
Exchange contract
Standard (neg_risk = false)
0x4bfb41d5b3570defd03c39a9a4d8de6bd8b8982e
Neg-risk (neg_risk = true)
0xc5d563a36ae78145c45a50134d48a1215220f80a
This happens because the Polymarket CTF Exchange settles the taker’s order against itself as an intermediary. The on-chain OrderFilled event reflects this, and both Dome and polynode pass it through as-is.To find your order’s fills: Check if event.user === yourWallet. When it matches, event.order_hash is your order’s hash.If you’re using polynode’s standard trade or settlement event subscriptions instead of the Dome-format feed, the same logic applies but the field is called maker instead of user. See Tracking a specific wallet’s trades on the Trade Event reference or the equivalent section on the Settlement Event page.If you’re using polynode’s standard trade event subscription instead of the Dome-format feed, the same logic applies but the field is called maker instead of user. See Tracking a specific wallet’s trades on the Trade Event reference for the equivalent explanation.
If you’re building a copy trading system that tracks orders by hash:
const WebSocket = require("ws");const ws = new WebSocket( "wss://ws.polynode.dev/ws?key=YOUR_KEY");// Track a specific walletconst TRACKED_WALLET = "0x1234...";const orderBook = new Map(); // order_hash -> order statews.on("open", () => { ws.send(JSON.stringify({ action: "subscribe", type: "dome", filters: { wallets: [TRACKED_WALLET] } }));});ws.on("message", (raw) => { const msg = JSON.parse(raw); if (msg.type !== "event") return; const fill = msg.data; // This fill involves our tracked wallet. // Check if the tracked wallet is the order placer: if (fill.user === TRACKED_WALLET.toLowerCase()) { // This is the tracked wallet's own order being filled. // fill.order_hash is their order's hash. if (orderBook.has(fill.order_hash)) { // Update existing order console.log("Order filled:", fill.order_hash, fill.shares_normalized, "shares at", fill.price); } else { // New order detected orderBook.set(fill.order_hash, { side: fill.side, price: fill.price, totalFilled: fill.shares_normalized, market: fill.title, }); console.log("New order:", fill.order_hash, fill.side, fill.price); } }});
block_number and log_index are always null. polynode detects settlements from the Polygon mempool before they are included in a block. This is why events arrive 3-5 seconds before Dome. The tradeoff is that block-level fields aren’t available at detection time.Minor floating-point precision differences on price and shares. polynode computes fill amounts from transaction calldata, while Dome reads from on-chain OrderFilled event logs. In rare cases (~1% of fills), this produces sub-penny price differences (e.g. 0.76 vs 0.7599999821) or shares off by 1 unit in millions. All other fields are byte-identical.No subscription_id in event wrapper. Dome includes a subscription_id field in every event message. polynode does not include this field, consistent with all other polynode subscription types. If your code reads msg.subscription_id, it will be undefined but this should not affect event processing.
If you used Dome’s trading SDK to place orders on Polymarket, the polynode SDK is a drop-in replacement with two key improvements: your credentials stay on your machine (not on a third-party server), and wallet type is auto-detected so you don’t need to know if you’re EOA, Proxy, Safe, or deposit wallet.
If you already have CLOB credentials from Dome, import them directly without re-deriving:
const trader = new PolyNodeTrader({ polynodeKey: 'pn_live_...' });// Import your existing credentialstrader.linkCredentials({ wallet: '0xYOUR_EOA', apiKey: 'your-dome-api-key', apiSecret: 'your-dome-api-secret', apiPassphrase: 'your-dome-passphrase', signatureType: 2, // Safe, or whatever Dome was using funderAddress: '0xYOUR_SAFE',});// Link your signer for order signingawait trader.linkWallet('0xYOUR_PRIVATE_KEY');// Done. Same credentials, same orders, different relay.
If you exported your private key from Polymarket’s settings, you don’t need to know anything else:
const trader = new PolyNodeTrader({ polynodeKey: 'pn_live_...' });// Auto-detects your wallet type (Safe, Proxy, or deposit wallet),// derives CLOB credentials. You don't need to know your wallet type.const status = await trader.ensureReady('0xEXPORTED_KEY_FROM_POLYMARKET');console.log(`Detected: type ${status.signatureType}`);console.log(`USDC.e lives at: ${status.funderAddress}`);