intentguard attester spec

Version: 0.1 draft Status: design scaffold

1. Problem

Intentguard verifies that the transaction matches a typed intent, but the signer’s laptop may still lie about the rendered intent.

The attester addresses this by moving rendering and approval to a separate device with:

2. Threat model

Defends against

Does not defend against

3. Core objects

4. Attestation payload

Canonical payload:

AttesterApproval {
  domain: "intentguard.attester.v1",
  chain_id_or_genesis_hash,
  vault,
  proposal_id,
  nonce,
  action_kind,
  target,
  data_hash,
  intent_hash,
  schema_id,
  schema_version,
  renderer_hash,
  firmware_hash,
  display_digest,
  signed_at,
  expires_at
}

EVM encoding: typed ABI encoding plus keccak256.

Solana encoding: deterministic Borsh or another fixed canonical encoding plus SHA-256.

5. Rendering rules

The attester must display:

The attester must refuse:

6. Display digest

The device computes:

display_digest = H(canonical_pages)

where canonical_pages are the exact text pages shown to the human, including line breaks and pagination.

The display digest lets external reviewers reproduce what the device claims it showed.

7. On-chain verification

Intentguard should optionally require:

M signer approvals
AND
M_attester attester approvals

The guard checks:

8. Registration

Each vault maintains:

Adding or removing any of these should itself be a guarded action with a longer cool-off.

9. MVP implementation

Recommended first build:

  1. TypeScript or Rust schema renderer.
  2. Offline host client.
  3. QR-code transport.
  4. Mobile secure-enclave key where available.
  5. EVM verifier support in IntentGuardModule.
  6. Solana verifier support in the Anchor program.
  7. Test vectors for each schema.

Only after that should a dedicated hardware device be attempted.

10. Open questions