- Notifications
You must be signed in to change notification settings - Fork12
Tiny library with utility functions that can help with signing and verifying EIP-712 based messages
License
Mrtenz/eip-712
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This is a library for Node.js and web browsers with some utility functions that can help with signing and verifyingEIP-712 based messages. It is fully written in TypeScript, and is currently only compatible with the latest specification of EIP-712 (eth_signTypedData_v4).
https://eips.ethereum.org/EIPS/eip-712
Note that this library currently does not handle the signing itself. For this, you can use something like Ethers.js or ethereumjs-util. For examples, please see theexamples
folder.
You can install this library with Yarn or NPM:
$ yarn add eip-712
$ npm install eip-712
There is a CommonJS version as well as an ES6 version available. Most tools should automatically pick the right version (e.g. Node.js, Webpack).
First, define your typed data as a JSON object, according to the JSON schema specified by EIP-712. For example:
{"types": {"EIP712Domain": [ {"name":"name","type":"string" }, {"name":"version","type":"string" }, {"name":"chainId","type":"uint256" }, {"name":"verifyingContract","type":"address" } ],"Person": [ {"name":"name","type":"string" }, {"name":"wallet","type":"address" } ],"Mail": [ {"name":"from","type":"Person" }, {"name":"to","type":"Person" }, {"name":"contents","type":"string" } ] },"primaryType":"Mail","domain": {"name":"Ether Mail","version":"1","chainId":1,"verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" },"message": {"from": {"name":"Cow","wallet":"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" },"to": {"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" },"contents":"Hello, Bob!" }}
Here is a brief description of the functions available in this library. For more detailed examples, you can refer tosrc/eip-712.test.ts
, or to the examples in theexamples
folder.
This function will return the full EIP-191 encoded message to be signed as Buffer, for the typed data specified. Ifhash
is enabled, the message will be hashed using Keccak256.
import{getMessage}from'eip-712';consttypedData={/*...*/};console.log(getMessage(typedData).toString('hex'));// 1901f2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090fc52c0ee5d84264471806290a3f2c4cecfc5490626bf912d01f240d7a274b371econsole.log(getMessage(typedData,true).toString('hex'));// be609aee343fb3c4b28e1df9e632fca64fcfaede20f02e86244efddf30957bd2
This function returns the typed data as an array. This can be useful for encoding typed data as ABI.
import{asArray}from'eip-712';consttypedData={/*...*/};console.log(asArray(typedData));// [ ['Cow', '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'], ['Bob', '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'], 'Hello, Bob!' ]
This function returns a Keccak-256 hash for a single struct type (e.g. EIP712Domain, Person or Mail).
import{getStructHash}from'eip-712';consttypedData={/*...*/};console.log(getStructHash(typedData,'EIP712Domain',typedData.domain).toString('hex'));// f2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090f
This function returns the raw ABI encoded data for the struct type.
import{encodeData}from'eip-712';consttypedData={/*...*/};console.log(encodeData(typedData,'EIP712Domain',typedData.domain).toString('hex'));// 8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fc70ef06638535b4881fafcac8287e210e3769ff1a8e91f1b95d6246e61e4d3c6c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc60000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cccccccccccccccccccccccccccccccccccccccc
This function returns the type hash for a struct type. This is the same asKeccak256(EIP712Domain(string name,string version,uint256 chainId,address verifyingContract))
, with optional sub-types automatically included too.
import{getTypeHash}from'eip-712';consttypedData={/*...*/};console.log(getTypeHash(typedData,'EIP712Domain').toString('hex'));// 8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f
This function returns the type before hashing it, e.g.EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)
, with optional sub-types automatically included too.
import{encodeType}from'eip-712';consttypedData={/*...*/};console.log(encodeType(typedData,'EIP712Domain'));// EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)
This function returns all sub-types used by a struct as a string array. If the struct has no sub-types (likeEIP712Domain
), an array with only the type itself is returned.
import{getDependencies}from'eip-712';consttypedData={/*...*/};console.log(getDependencies(typedData,'EIP712Domain'));// ['EIP712Domain']console.log(getDependencies(typedData,'Mail'));// ['Mail', 'Person']
It's possible to use a custom domain format, like from the CIP-23 specification, or to disable verifying the domain format completely, if you want to use a custom implementation of EIP-712.
To do this, you can pass options to each function, as last parameter. For example, in order to get the message hash for a message, you can do the following:
import{getMessage}from'eip-712';importtype{Options}from'eip-712';consttypedData={/*...*/};constoptions:Options={// A custom domain identifier. Defaults to 'EIP712Domain'.domain:'CIP23Domain',// Whether to verify the structure of the domain. Defaults to 'true'.verifyDomain:false};console.log(getMessage(typedData,true,options).toString('hex'));
About
Tiny library with utility functions that can help with signing and verifying EIP-712 based messages