hashTypedData
Hashes typed data in EIP-712 format
hashTypedData
Signs typed data and calculates an Ethereum-specific hash in EIP-712 format: keccak256("\x19\x01" || domainSeparator || hashStruct(message)).
Import
import "github.com/ChefBingbong/viem-go/utils/signature"import "math/big"Usage
import "github.com/ChefBingbong/viem-go/utils/signature"import "math/big"
typedData := signature.TypedDataDefinition{ Domain: signature.TypedDataDomain{ Name: "Ether Mail", Version: "1", ChainId: big.NewInt(1), VerifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", }, Types: map[string][]signature.TypedDataField{ "Person": { {Name: "name", Type: "string"}, {Name: "wallet", Type: "address"}, }, "Mail": { {Name: "from", Type: "Person"}, {Name: "to", Type: "Person"}, {Name: "contents", Type: "string"}, }, }, PrimaryType: "Mail", Message: map[string]any{ "from": map[string]any{ "name": "Cow", "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", }, "to": map[string]any{ "name": "Bob", "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB", }, "contents": "Hello, Bob!", },}
hash, err := signature.HashTypedData(typedData)// "0x..."Returns
- Type:
(string, error)
The hashed typed data as a hex string with 0x prefix.
Parameters
typedData (required)
- Type:
signature.TypedDataDefinition
The typed data definition containing domain, types, primary type, and message.
typedData := signature.TypedDataDefinition{ Domain: signature.TypedDataDomain{ Name: "My App", Version: "1", ChainId: big.NewInt(1), }, Types: map[string][]signature.TypedDataField{ "Message": { {Name: "content", Type: "string"}, }, }, PrimaryType: "Message", Message: map[string]any{ "content": "Hello!", },}
hash, err := signature.HashTypedData(typedData)domain (required)
- Type:
signature.TypedDataDomain
The EIP-712 domain parameters. All fields are optional.
domain := signature.TypedDataDomain{ Name: "Ether Mail", Version: "1", ChainId: big.NewInt(1), VerifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC",}types (required)
- Type:
map[string][]signature.TypedDataField
The type definitions for the typed data.
types := map[string][]signature.TypedDataField{ "Person": { {Name: "name", Type: "string"}, {Name: "wallet", Type: "address"}, }, "Mail": { {Name: "from", Type: "Person"}, {Name: "to", Type: "Person"}, {Name: "contents", Type: "string"}, },}primaryType (required)
- Type:
string
The primary type to extract from types and use in message.
primaryType := "Mail"message (required)
- Type:
map[string]any
The structured message to hash. Must match the structure defined in types for primaryType.
message := map[string]any{ "from": map[string]any{ "name": "Cow", "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", }, "to": map[string]any{ "name": "Bob", "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB", }, "contents": "Hello, Bob!",}Hash Format
The typed data hash is computed as:
keccak256("\x19\x01" || domainSeparator || hashStruct(message))
Where:
domainSeparatoris the hash of the EIP712Domain structhashStruct(message)is the hash of the message struct according to its type definition