LiveWhat stops an approval being replayed against a different transfer?

Action binding

The session nonce commits to a hash of the action context, and the server re-computes that hash at decision time.

The digest is recomputed, not trusted

The action digest is a SHA-256 over the canonical JSON of the whole action context, so adding a field extends the binding automatically and an absent optional field drops out of the canonical form.

At decision time the API recomputes the digest from the request and compares it to the digest the session committed to. A mismatch fails Gate 1 with an explicit reason.

Clients do not populate this block. An absent session binding means the check never ran, and Gate 1 fails closed.

The artifacts behind this page

One next step

What gets sealed