Skip to main content

TypedData

EIP-712 typed structured data - enables human-readable, type-safe signatures in Ethereum.

Overview

TypedData implements EIP-712 for typed structured data signing. Instead of signing opaque hex strings, users sign structured data with clear field names and types. This improves UX and security by making signatures human-readable in wallets like MetaMask.

Type Definition

Usage

Define Typed Data

Hash for Signing

Encode Message

Validate Structure

Type System

Atomic Types

Struct Types

Define custom types with named fields:

Array Types

Use [] suffix for arrays:

Common Use Cases

ERC-20 Permit (Gasless Approval)

DAI Permit

Meta-Transactions

Voting/Governance

Hash Calculation

EIP-712 hash is computed as:
Where:
  • \x19\x01 - EIP-191 structured data prefix
  • domainSeparator - keccak256(encodeData(‘EIP712Domain’, domain))
  • encodeData() - Recursive encoding of message fields

Type Encoding

Simple Type

Nested Types

Dependencies are sorted alphabetically after the primary type.

Security

Benefits

  1. Human-readable - Users see structured data, not hex
  2. Type-safe - Field types are validated
  3. Domain-specific - Signatures bound to contract/chain
  4. Replay-protected - Domain separator prevents replay

Validation

Always validate typed data:

MetaMask Display

MetaMask shows structured data clearly:

Error Handling

TypedData operations throw typed errors for precise error handling:

InvalidTypedDataError

Thrown when typed data structure is invalid.

Validation Errors

The validate() function throws InvalidTypedDataError for various issues:

Specification

See Also