Invariant
U1
Category
Universal
Priority
Must-have
Violation class
Free Shopping, Asset Theft
What it proves
/verify and /settle are supposed to agree on the terms of a payment. If a client can get
/verify to approve one set of terms and then get /settle to actually execute a different
set, /verify’s approval was meaningless — a client could show a resource server one thing and
have the facilitator honor another.
Source: x402 protocol spec (verify/settle contract); USENIX Security ‘26 facilitator study —
Free Shopping & Asset Theft violation classes.
How it works
For each of four fields, Ward:- Builds one valid, correctly-signed payload.
- Calls
/verifyon the unmutated payload — this should be approved. - Mutates a single field of the already-verified payload.
- Calls
/settleon the mutated version.
Sub-cases
If the baseline
/verify call rejects before a mutation is even applied, that sub-case is recorded
as inconclusive (ok: false with a distinguishing detail) rather than silently skipped — it means
the environment couldn’t exercise the intended condition, which is itself worth surfacing.
Pass condition
All four sub-cases must reject at/settle. Ward’s assertion, roughly:
Reading a failure
AVIOLATION on any sub-case means /settle accepted terms that were never the ones /verify
approved — check the evidence field of the result for the exact original (verified) and
tampered (settled) payloads, plus the facilitator’s raw /settle response, including the
resulting transaction id if one was minted.

