Дайджест — keccak256(0x19 ‖ 0x01 ‖ domainSeparator ‖ hashStruct(message)). hashStruct хеширует хеш типа (Keccak-256 от канонической строки типа, например Mail(address from,address to,string contents)) вместе с закодированными полями; строки, байтовые значения и массивы хешируются, вложенные структуры хешируются рекурсивно. Разделитель домена — это hashStruct(EIP712Domain) с полями name, version, chainId, verifyingContract и необязательным salt; хеш типа для обычного домена из 4 полей — 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f.
Кошельки вызывают его через eth_signTypedData_v4. На нём построены permit из EIP-2612, Permit2 от Uniswap, хеши транзакций Safe, книги заявок, ретрансляторы транзакций без оплаты газа и многие системы управления (governance). Подпись типизированных данных безопасна ровно настолько, насколько пользователь понял, что подписывает: один из самых распространённых приёмов фишинга — подписи permit вне блокчейна, дающие неограниченный allowance.
Типичные ошибки: строка типа, которая не в точности соответствует структуре, отсутствующий или неверный chainId или verifyingContract, а также подписи, принятые дважды, потому что контракт не хранит nonce. Инспектор EIP-712 пересчитывает все хеши локально.