|
| 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. |
0 commit comments