Le condensat est keccak256(0x19 ‖ 0x01 ‖ domainSeparator ‖ hashStruct(message)). hashStruct hache un condensat de type (le Keccak-256 d’une chaîne de type canonique telle que Mail(address from,address to,string contents)) avec les champs encodés ; les chaînes, les tableaux d’octets et les tableaux sont hachés, les structures imbriquées sont hachées récursivement. Le séparateur de domaine est hashStruct(EIP712Domain) avec name, version, chainId, verifyingContract et, en option, salt ; le condensat de type du domaine usuel à quatre champs est 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f.
Les portefeuilles l’invoquent via eth_signTypedData_v4. Il sous-tend permit d’EIP-2612, Permit2 d’Uniswap, les hash de transaction Safe, les carnets d’ordres, les relais sans frais de gaz et de nombreux systèmes de gouvernance. Une signature de données typées ne vaut que ce que l’utilisateur a compris : les signatures permit hors chaîne qui accordent des montants autorisés illimités sont l’une des principales techniques d’hameçonnage.
Bugs courants : une chaîne de type qui ne correspond pas exactement à la structure, un chainId ou un verifyingContract manquant ou erroné, et des signatures acceptées deux fois parce que le contrat ne stocke aucun nonce. L’inspecteur EIP-712 recalcule localement chaque condensat.