Two data layers, one subscription
When you subscribe tosettlements, you get two events per trade:
settlement(pending) — arrives 3–5 seconds before the block. Decoded from the transaction’s calldata while it’s still in the mempool.status_update(confirmed) — arrives when the block confirms. Includesconfirmed_fillswith exact execution data from on-chainOrderFilledreceipt logs.
How they differ
The pending settlement and confirmed fills come from different data sources inside the same transaction:
Why the difference exists: When a taker order sweeps multiple makers in one transaction, the calldata contains each maker’s order and the total amounts being exchanged. But the total USDC is an aggregate across all makers. polynode estimates each maker’s share proportionally. The contract computes and emits the exact per-maker amounts in the
OrderFilled logs. For most fills, the estimate and the result are identical. For multi-maker sweeps, the contract’s integer rounding can produce slightly different per-maker splits.
Size vs Polymarket: Polymarket’s activity API reports sizes net of fees. polynode’s confirmed fills report the gross size from the OrderFilled event plus the fee as a separate field. To get the Polymarket-equivalent size: net_size = size - (fee / price).
Use case 1: Copy trading
For copy trading, use the pending settlement. Speed matters more than the 0.01 price difference on the occasional multi-maker fill. To find the wallet’s actual trade in a settlement event, iteratedata.trades[] and match by maker:
Use case 2: Analytics and bookkeeping
For trade logs, P&L tracking, portfolio analytics, or any scenario where you need exact prices, useconfirmed_fills from the status_update.
Use case 3: Full lifecycle tracking
Track both layers to get the complete picture — early detection plus exact execution. Match bymaker in both the pending trades[] array and the confirmed confirmed_fills[] array:
Confirmed fills field reference
Each object in theconfirmed_fills array:
Ghost fills and the nonce exploit
A small percentage of Polymarket settlements (~0.15–0.35%) fail on-chain. These are “ghost fills” — trades that appear to match off-chain but revert during on-chain settlement. The most common cause is theincrementNonce() exploit on Polymarket’s V1 CTF Exchange, which allows users to invalidate their own orders after matching but before settlement.
This is another reason to use confirmed_fills for any application where trade accuracy matters. A pending settlement event tells you a trade was matched. Only a status_update with confirmed_fills tells you it actually settled on-chain.
To detect ghost fills, track pending settlements that never receive a status_update:

