Skip to main content

Domain

EIP-712 domain separator structure - creates domain-specific signature contexts for dApps.

Overview

Domain defines the context for EIP-712 signatures. It prevents replay attacks by ensuring signatures are valid only within a specific domain (contract, chain, or dApp). All EIP-712 signatures include a domain separator.

Type Definition

At least one field must be defined.

Usage

Create Domain

Compute Domain Separator Hash

Minimal Domain

Domain Fields

name

dApp or protocol name. Used to distinguish different applications.

version

Domain version. Increment when contract logic changes.

chainId

EIP-155 chain ID. Prevents cross-chain replay attacks.

verifyingContract

Contract address that will verify signatures. Prevents cross-contract replay.

salt

Additional entropy for disambiguation. Rarely used.

Encoding

Type Encoding

Data Encoding

Examples

ERC-20 Permit

Uniswap Permit2

Custom dApp

Security

Prevent Replay Attacks

Domain separators prevent signatures from being replayed:
  • Cross-contract: Different verifyingContract addresses
  • Cross-chain: Different chainId values
  • Cross-version: Different version strings

Best Practices

  1. Always include chainId - Prevents cross-chain replay
  2. Always include verifyingContract - Prevents cross-contract replay
  3. Use semantic versioning - Clear version tracking
  4. Don’t change domain - Breaks existing signatures

Error Handling

Domain operations throw typed errors for precise error handling:

InvalidDomainError

Thrown when a domain is invalid (e.g., has no fields defined).

InvalidDomainTypeError

Thrown when a type is not found in the types object during encoding.

InvalidEIP712ValueError

Thrown when EIP-712 value encoding fails (e.g., wrong type, invalid size).

Specification

See Also