hashTypedData
Hashes typed data in EIP-712 format
Loading...
Hashes typed data in EIP-712 format
Signs typed data and calculates an Ethereum-specific hash in EIP-712 format: keccak256("\x19\x01" || domainSeparator || hashStruct(message)).
import "github.com/ChefBingbong/viem-go/utils/signature"import "math/big"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..."(string, error)The hashed typed data as a hex string with 0x prefix.
signature.TypedDataDefinitionThe 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)signature.TypedDataDomainThe EIP-712 domain parameters. All fields are optional.
domain := signature.TypedDataDomain{ Name: "Ether Mail", Version: "1", ChainId: big.NewInt(1), VerifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC",}map[string][]signature.TypedDataFieldThe 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"}, },}stringThe primary type to extract from types and use in message.
primaryType := "Mail"map[string]anyThe 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!",}The typed data hash is computed as:
keccak256("\x19\x01" || domainSeparator || hashStruct(message))
Where:
domainSeparator is the hash of the EIP712Domain structhashStruct(message) is the hash of the message struct according to its type definition