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
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
verifyingContractaddresses - Cross-chain: Different
chainIdvalues - Cross-version: Different
versionstrings
Best Practices
- Always include chainId - Prevents cross-chain replay
- Always include verifyingContract - Prevents cross-contract replay
- Use semantic versioning - Clear version tracking
- 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
- EIP-712: https://eips.ethereum.org/EIPS/eip-712
- Domain Separator: keccak256(encodeData(‘EIP712Domain’, domain))
See Also
- DomainSeparator - Domain separator hash
- TypedData - Complete typed data structure
- ChainId - Chain ID primitive
- Address - Address primitive

