This is a PolyNode-run, point-in-time smoke test. The Alchemy endpoint was used only by the benchmark verifier to enumerate confirmed events and recheck boundary blocks. It is not part of PolyNode’s production ingestion,
status_update generation, or WebSocket delivery path, and it supplied no arrival timestamps used in the latency comparisons. All claims below are limited to the recorded configuration, window, and network vantage point.100% confirmed coverage
PolyNode and Struct each represented all 48,281 confirmed fills after exact record reconciliation.
3.96-second confirmation lead
PolyNode
status_update beat Struct confirmed for every matched transaction.1.98 seconds before RTDS
PolyNode pending arrived first for every RTDS overlap in the headline window.
No Struct pending events
Struct returned confirmed data but no pending events under its documented
status: "all" request.What the test establishes
In this window, PolyNode’s confirmation signal beat Struct’s confirmed signal for all 18,041 matched transactions by 3.963 seconds median. At exact fill granularity, PolyNode beat Struct on 47,796 of 48,281 fills, or 98.995%, by 3.862 seconds median. PolyNode pending also arrived before RTDS activity for every one of their 17,777 shared transactions, by 1.984 seconds median. RTDS was not a complete denominator: even with a five-second silence watchdog and automatic resubscription, it represented 17,777 of 18,041 eligible transactions. We did not find evidence that Struct was missing confirmed transactions or fills. Struct’s documented pending path, however, produced no events in the headline run or any retained test window. That result supports the narrow statement that we could not reproduce Struct pending delivery with the documented request on a fresh, credited account. It does not establish why the events were absent.No higher-tier requirement found. Struct’s own benchmark says that pending mode is included starting on the free plan, while its trades-room reference presents
pending and all as ordinary optional status filters. Our status: "all" subscription was acknowledged with subscribe_all: true, an empty rejected array, and continued confirmed delivery. We recorded no authentication, connection-limit, or out-of-credits close; Struct documents exhausted credits as close code 4004. We therefore found no evidence that a paid plan or enhanced key was required. An undisclosed entitlement cannot be ruled out from outside Struct, but it would contradict the published access claim and was not surfaced to the client.Signal mapping
The word “trade” does not identify the same lifecycle stage in every feed. We fixed the mapping before collecting data.
PolyNode
status_update means that a previously pending transaction was confirmed in a Polygon block. It is therefore the transaction-level equivalent used against Struct confirmed. It does not identify every individual fill inside that transaction; PolyNode trade is the stricter fill-level comparison. PolyNode settlement with status=pending is the pre-confirmation path.
RTDS activity is useful as a public timing baseline, but we do not label it as either pending or confirmed. Its official schema is not an exact semantic equivalent of both stages.
Headline run
The benchmark verifier re-read both boundary blocks after analysis. Their hashes still matched the recorded manifest.
Coverage results
Coverage is measured only inside the fully observed block window. Transaction coverage asks whether a feed surfaced a transaction at least once. Fill coverage requires every individual on-chain execution.
The PolyNode pending row means that every transaction later present in the chain denominator had an earlier PolyNode pending sighting. Confirmed logs cannot prove completeness for pending transactions that never reach the chain.
Why Struct’s strict OrderFilled count initially looked low
Struct emitted 30,240 OrderFilled records and 18,041 OrdersMatched records for the 48,281 chain fills. Counting only its OrderFilled type would incorrectly report 62.63% coverage.
For each transaction, Struct’s OrdersMatched record carried the taker order hash corresponding to one on-chain OrderFilled. We fetched every receipt, translated Struct’s receipt-local log indexes to Polygon’s block-global indexes, and mapped OrdersMatched by unique transaction and order hash. All 48,281 records reconciled with:
- zero unmatched records;
- zero index/order-hash mismatches;
- 30,240 direct receipt-index mappings;
- 18,041 unique
OrdersMatchedmappings.
Latency results
Every callback was stamped immediately withprocess.hrtime.bigint() in the same process. A positive lead means the left-hand path arrived first. Missing events never become artificial zero-latency samples.
★ The two primary comparisons: PolyNode’s confirmed-transaction signal against Struct confirmed, and PolyNode’s pre-confirmation signal against RTDS activity.
The RTDS comparison is an important check against overclaiming. RTDS activity arrived 171 ms before PolyNode
status_update at the median and won 65.52% of their overlaps. It is therefore wrong to describe PolyNode confirmation as several seconds ahead of RTDS. The several-second confirmed advantage is against Struct; the PolyNode advantage against RTDS belongs to the pending signal.
Adverse fill windows
Struct arrived first for 485 fills across 203 transactions. Those losses were concentrated in six blocks: 91,254,964–91,254,965, 91,255,009–91,255,010, and 91,255,121–91,255,122. The worst observed PolyNode loss was 2.187 seconds. Outside those blocks, PolyNode won every exact fill pair. We include the clusters because a median alone would hide them.RTDS continuity
The RTDS socket silently stopped delivering global activity three times without first producing an error or close event. The watchdog terminated the open socket and resubscribed each time.
The final RTDS coverage was therefore 98.537%, not 100%. The 264 missing transaction hashes are published as a machine-readable audit file.
Exact collection method
Requests sent
The final run used these literal harness excerpts.args.structStatus was all, and args.tradeTypes was unset.
- Struct
- PolyNode
- Polymarket RTDS
subscribe_all: true, returned an empty rejected array, and streamed confirmed records. Its acknowledgment did not echo the requested status field.
Run the PolyNode side
Run the PolyNode side
This minimal Node.js client uses the same
trades subscription and keeps the three lifecycle signals separate. See WebSocket subscriptions for server-side filters.Immediate, same-clock stamping
Lifecycle classification
Independent denominator and block boundaries
After all three sockets were active and the 12-second warm-up finished, the harness read the Polygon tip and armed the first eligible block attip + 2. At core completion, it ended the denominator at tip - 2, then kept sockets open for 30 seconds.
The harness queried every known current and legacy Polymarket CLOB exchange for OrderFilled logs. It then fetched every eligible receipt. The headline window happened to contain only V2 fills: 39,150 from the standard exchange and 9,131 from the neg-risk exchange.
Each confirmed fill was keyed as:
OrderFilled logs.
Reproduction command
Control runs and prior windows
We retained ten non-overlapping windows totaling 1,995 seconds, 39,992 confirmed transactions, and 107,210 chain fills. Struct emitted zero pending events in every retained window.
The five-window exact-methodology suite produced these pooled results:
- PolyNode and Struct each covered 100% of 13,595 confirmed transactions and 36,466 reconciled fills.
- PolyNode
status_updatebeat Struct confirmed by 4.017 seconds median and arrived first for every transaction. - PolyNode fills beat Struct records by 3.955 seconds median and arrived first for 95.55% of fills.
- PolyNode pending beat every RTDS overlap by 1.995 seconds median.
- RTDS transaction coverage was 83.96% because two later sockets stayed open but stopped delivering activity.
status: "pending"-only probe on the fresh credited Struct account also produced no pending events while RTDS remained active. Because that exploratory probe did not use the final artifact schema, it is recorded as diagnostic context and excluded from every scored table.
Artifacts and integrity
The compact result bundle contains the exact configuration, coverage, latency, lifecycle gaps, adverse blocks, run inventory, source hashes, block anchors, and SHA-256 checksums for the full local archive. The credential-free source bundle contains the complete harness, analyzer, tests, dependency lock, README, and license at the measured commit. The full headline archive is 481 MB and contains:- 220,584 normalized events;
- 220,601 parsed raw frames;
- 167,935 latency CSV lines, including the header;
- every Polygon
OrderFilledlog, with receipt-local indexes derived from fetched receipts; - exact missing identifiers and connection lifecycle events;
- readable and machine-readable summaries.
git diff --check, a credential-pattern scan, and a separate block-anchor recheck through the benchmark-only verifier. No credentials, RPC errors, unmatched Struct records, or block-hash changes were found.
Limitations
- This is one date and one network vantage point. It does not guarantee the same latency from every region or in future provider versions.
- The traffic was live, not a controlled synthetic workload. Market activity and block density varied.
- On-chain logs prove confirmed completeness. They cannot enumerate pending transactions that never confirm.
- RTDS is a public activity baseline, not a semantic clone of either pending or confirmed streams.
- A five-second watchdog trades faster recovery for more reconnects. Different thresholds change the size of unrecoverable gaps.
- Provider-supplied timestamps were retained but never used for cross-provider latency because their clock origins are not comparable.
References
- Struct’s published benchmark methodology
- Struct’s published benchmark source
- Struct trade room documentation
- Struct pending and confirmed copy-trading guide
- Polymarket official real-time data client
- PolyNode WebSocket overview

