On-chain reconciliation for prediction-market bots

Your bot's logs lie.
FillProof doesn't.

FillProof reconciles what your bot claims against what the chain settled — fills, fees, resolutions, PnL. Every number is an on-chain fact or explicitly marked unknown. Nothing in between.

Read-only. No signing keys, no custody, no order routing. Just truth.

Three answers. One is true.
Exhibit Aone wallet · three answers
The bot's dashboardexpected profit, 6,904 signals
+$22,159.14Fiction
Its own shadow resolversame bot, different subsystem
88.3% winsFiction
The chain, 23 fills settledfees included, nothing estimated
−$76.34Fact
Two subsystems of the same bot disagreed with each other — and both disagreed with the chain. Verify it yourself: 0xb4eaaa… $5.285148 · 0xe71571… $5.570289 · 0x5dd3a6… $5.431999
2.51%
of traded volume paid in fees — invisible in every dashboard
$0.00
what the public API reported those fees as. 0 of 23 rows.
6,904 → 6
claimed signals vs fills that ever touched the chain
The fee you can't see is still a fee.

The fee you can't see

Polymarket's public trades API exposes no fee field — at all. Any tool built on it that shows a fee column is showing a fabricated zero. Your net PnL is overstated by every fee you've ever paid, and nothing on screen tells you.

What the API told us

$0.00
fees, across a wallet's complete trade history

What the chain recorded

$9.82
2.51% of $390.80 traded — enough to invert a strategy's profitability

Recovered three independent ways — and they must agree

The OrderFilled event's own fee field, on the wallet's row
The dedicated fee event, keyed to the fee-collector address
Settled pUSD transfer − price × size — the gap is the fee

FillProof computes all three on every fill. If they ever disagree, it flags the fill and keeps the fee unknown — a disagreement means the model of the contract is wrong, and you want to know, not average over it. On every fill audited so far: agreement to the micro-dollar.

A blank is honest. A zero is a lie.
The rule the whole product is built on

Absent means unknown.
Never zero.

A missing measurement is never presented as a measured value. It's enforced in the schema, the engine, and every response: an unknown fee is null, an unmarked position is unknown, and net PnL stays unknown until every component is a fact. We'd rather show you a blank than a number we can't stand behind.

Five ways your log lies. One report that catches all of them.

POST what your bot thinks it did. FillProof returns the diff against venue truth — and tells you how each match was made, because match confidence is disclosed, not implied.

okprice_slippartialunfilledphantom
Your claimVenue recordDrift
buy 25 @ 0.47
BTC-up-1455
buy 25 @ 0.49
slipped 2¢ · cost $0.50
price slip
sell 40 @ 0.55
ETH-up-1500
sell 40 @ 0.55
exact
ok
buy 50 @ 0.31
SOL-up-1505
no venue record
unfilled
buy 100 @ 0.40
XRP-up-1510
buy 62 @ 0.40
38 shares short
partial
18 matched by order id (certain) 5 matched heuristically (probable) method disclosed on every row
"If you've never reconciled against venue records, you don't know your PnL — you know your bot's opinion of it."
A profitable backtest, a profitable log, and a profitable bot are three different things. Only one of them pays.

Sixty seconds to find out if your bot has been lying to you.

Paste your wallet. Get a drift report on your last 50 fills — real fees, real drift, real net. Free, read-only, no email gate.

We report the gap. We never execute it. No signing keys — ever.

Design-partner beta · limited seats
$49/mo
Beta pricing — locked for early partners
  • Continuous reconciliation on your wallets
  • Drift API — POST claims, get the diff
  • Fees verified on-chain, three ways, every fill
  • Honest PnL: facts, settlements, and nulls — never blended
  • Direct Telegram support
Request a beta seat