Skip to content

Commit 9f24b01

Browse files
committed
Publish the registration behind the intent-settlement measurement
demo/intent_gap.py was built to test a prediction written down beforehand. That prediction is now here, body reproduced verbatim, so the confirmation and falsification thresholds it was judged against can be read rather than taken on trust. The header is honest about what the dates prove. This copy went public two days after the measurement ran, so the commit history establishes priority and not ordering. Registrations in this line of work go up before the run from now on, which is the only version of the claim a reader can check. P2 was mis-specified and is left standing: CoW orders carry short validTo deadlines, so no interaction target can postdate a signature and the strong form of that test could never have fired. Editing it out afterwards would defeat the point of writing it down.
1 parent b7d07d7 commit 9f24b01

2 files changed

Lines changed: 124 additions & 0 deletions

File tree

agent-calldata-demo/PREDICTION.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# Registration record
2+
3+
## Provenance, and what this record does and does not establish
4+
5+
This prediction was written and committed on 2026-08-01, before `demo/intent_gap.py`
6+
was run against any settlement. The measurement followed the same day. Its results
7+
are summarised in the README, under [Intent settlement: does the signed order govern
8+
what executes?](README.md#intent-settlement-does-the-signed-order-govern-what-executes).
9+
10+
This public copy was added on 2026-08-03, which is **after** the measurement. The
11+
public commit history therefore establishes priority but not ordering: on its own it
12+
does not show that the prediction preceded the result. The ordering is recorded in a
13+
private repository (registration committed 2026-08-01 16:29 UTC+1, first results
14+
16:34, longitudinal extension 16:42) and that history can be shown to reviewers or
15+
artifact evaluators on request. Registrations in this line of work will be published
16+
here before the measurement runs from now on, since that is the only version of the
17+
claim a reader can check without taking the author's word for it.
18+
19+
The text below is reproduced verbatim from the file committed on 2026-08-01. It has
20+
not been edited to fit what was found, including the part that turned out to be
21+
mis-specified: the strong form of P2 could never have fired, because CoW orders carry
22+
short `validTo` deadlines and every interaction target necessarily predates any
23+
signature. That error is left standing here and reported as an error.
24+
25+
Only this header is new.
26+
27+
---
28+
29+
# Registered prediction: the wrong-object gap in intent and solver systems
30+
31+
Written 2026-08-01, **before any measurement**. Committed as the registration.
32+
If the measurement contradicts this, the paper reports the contradiction and the
33+
framing is weakened accordingly. Do not edit this file after measuring; record
34+
results in RESULTS.md alongside it.
35+
36+
## Why this site
37+
38+
The three measured layers all concern a transaction the user signs directly. An
39+
intent system inverts that: the user signs an *order* and never authors the
40+
transaction that settles it. If the wrong-object pattern is real rather than a
41+
label applied after the fact, it should recur here, and it should recur in its
42+
most extreme form.
43+
44+
Target: CoW Protocol settlement (`GPv2Settlement.settle`), because orders and the
45+
executed interactions are both recoverable from public on-chain calldata. Its
46+
architecture is representative of UniswapX and 1inch Fusion.
47+
48+
## The prediction
49+
50+
**P1 (main).** In intent settlement, the set of contracts that govern what
51+
happens to the user's approved balance is not determined by the artifact the
52+
user signed. Concretely: decoding a settlement transaction will show interaction
53+
targets that appear nowhere in the signed order, and they will be the majority
54+
of the contracts touched.
55+
56+
**P2 (the sharp form).** The gap here is not merely that the governing object is
57+
elsewhere, as in the three measured layers, but that **it does not exist when
58+
the user signs**. Solver-supplied interaction calldata is authored after the
59+
signature, by a party the user never chose. A code-reading defense cannot read
60+
it even in principle, because there is nothing yet to read. This is the temporal
61+
limit of the same failure, and it connects to the time-of-check residual that
62+
survived the capability ladder in the earlier work.
63+
64+
**P3 (what still binds).** The signed order does bind the *value* outcome
65+
through its limit price and receiver, enforced at settlement. So the prediction
66+
is explicitly NOT that intents are broken or that users are exposed to
67+
unbounded loss. It is that the value bound is the only thing the signed artifact
68+
governs, while the contract set is governed elsewhere. A defense that reasons
69+
about the signed order is reasoning about a genuinely smaller object than the
70+
one that decides execution.
71+
72+
## Quantities to measure
73+
74+
For a sample of recent mainnet settlements:
75+
76+
1. `|T|` = distinct contract addresses appearing as interaction targets in the
77+
settlement calldata.
78+
2. `|S|` = distinct contract addresses derivable from the signed orders in that
79+
settlement (sell token, buy token, receiver, and the settlement contract
80+
itself).
81+
3. `|T \ S|` = targets that govern execution and appear nowhere in any signed
82+
order. **This is the analogue of the 61 of 101.**
83+
4. Whether any interaction target was deployed after the earliest order in the
84+
settlement was signed. Any non-zero count is direct evidence for P2.
85+
86+
## Confirmation and falsification, stated in advance
87+
88+
- **P1 confirmed** if, across the sample, the median `|T \ S| / |T|` is above
89+
0.5, i.e. most contracts governing execution are absent from what was signed.
90+
- **P1 falsified** if that ratio is at or near zero, i.e. settlements touch only
91+
contracts the order names. That would mean intents route through a fixed,
92+
signed-over set and the pattern does not generalise here.
93+
- **P2 confirmed** by any settlement whose interaction targets include a
94+
contract deployed after the order's signing time, or, more weakly, by showing
95+
the interaction calldata is solver-authored and unconstrained by the order
96+
schema.
97+
- **P2 falsified** if the protocol constrains interaction targets to a fixed
98+
allowlist fixed at signing time.
99+
- **Ambiguous outcome to report honestly:** if `|T \ S|` is large but every
100+
target is a well-known router or pool, the gap exists but its exploitability
101+
is bounded by the value constraint in P3. Report this as a bounded instance,
102+
not a vulnerability. That is the likely result and it is still evidence for
103+
the pattern.
104+
105+
## What this is not
106+
107+
Not a claim of a vulnerability in CoW Protocol or any intent system. The value
108+
bound in P3 is real and is the point of the design. The claim is about what a
109+
*defense* can see at signing time, which is the subject of the whole paper.
110+
111+
## Bounds known in advance
112+
113+
- Sample will be recent settlements, so it measures current solver behaviour and
114+
not a historical distribution.
115+
- Contracts touched via nested internal calls are not visible in settlement
116+
calldata alone; `|T|` from calldata is therefore a **lower bound** on the true
117+
governing set, which makes the prediction harder to confirm, not easier.
118+
- No claim about how often a malicious solver has actually exploited this.

agent-calldata-demo/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,12 @@ user's approved balance.
236236
`demo/intent_gap.py` decodes CoW Protocol settlements and asks how many of the
237237
contracts that actually execute appear anywhere in the signed order.
238238

239+
What this run was expected to show, including the confirmation and falsification
240+
thresholds, was written down before it ran: see [PREDICTION.md](PREDICTION.md).
241+
That file also says plainly what its dates do and do not establish, since it was
242+
published here after the measurement rather than before it. One of its three
243+
claims was mis-specified and is left in place rather than quietly fixed.
244+
239245
```bash
240246
python3 -m demo.intent_gap --windows 7 --per-window 25 --spacing-days 45
241247
```

0 commit comments

Comments
 (0)