viem-goviem-go

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:

  • domainSeparator is the hash of the EIP712Domain struct
  • hashStruct(message) is the hash of the message struct according to its type definition