This page runs the same canonical renderer the firmware and host bridge use. The decode and hash logic is identical, so the byte-level output you see here is the byte-level output a real attester device would produce. The only thing missing is the device screen and the human pressing CONFIRM.
Pick a scenario below, or edit the form fields directly to construct your own.
Inputs
What the device shows
Canonical bytes
Intent hash
Digest the attester signs
What just happened
Four things, all client-side, all matching the firmware byte-for-byte:
- Decoded the raw
action_argshex into a structured intent using the registered adapter for thataction_kind. Unknown kinds fail closed. - Canonicalised the structured intent into a deterministic byte sequence (sorted-key, length-prefixed, type-tagged). The firmware does the same on its own CPU.
- Computed the intent hash as
H(domain_sep || vault || u64_le(nonce) || u32_le(action_kind) || canonical). SHA-256 for Solana, Keccak-256 for EVM. This is the value the on-chain guard recomputes from the actual call and compares against what the signers approved. - Computed the attest digest as
H(domain_sep || vault || u64_le(nonce) || u32_le(action_kind) || intent_hash || u64_le(signed_at)). This is what the attester device’s signing key actually signs. The on-chain guard verifies the same digest against the device’s enrolled pubkey.
If a malicious laptop swapped the action_args between rendering and signing, the recomputed intent hash would not match the bound hash and the action would not execute. That is the entire point of the primitive.
Try the Drift scenario
Click “Replay the Drift attack” above. The screen shows what a Drift Council member would have seen on their attester device the day of the attack: a WHITELIST_COLLATERAL action whitelisting a token they had no reason to trust, at a fair value of $1.00, with a $500M deposit cap. Compare that screen to the routine USDC listing scenario right next to it. Same action kind, same shape of payload. The difference is in the fields. The point of putting the rendered intent on a separate trust domain is that a human gets a chance to see that difference.