Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

EIP712Upgradeable

Inherits: Initializable, IERC5267

https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data. The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to produce the hash of their typed data using a combination of abi.encode and keccak256. This contract implements the EIP-712 domain separator (_domainSeparatorV4) that is used as part of the encoding scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA ({_hashTypedDataV4}). The implementation of the domain separator was designed to be as efficient as possible while still properly updating the chain id to protect against replay attacks on an eventual fork of the chain. NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method https://docs.metamask.io/guide/signing-data.html[eth_signTypedDataV4 in MetaMask]. NOTE: The upgradeable version of this contract does not use an immutable cache and recomputes the domain separator each time {_domainSeparatorV4} is called. That is cheaper than accessing a cached version in cold storage.

State Variables

TYPE_HASH

bytes32 private constant TYPE_HASH =
    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");

EIP712StorageLocation

bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;

Functions

_getEIP712Storage

function _getEIP712Storage() private pure returns (EIP712Storage storage $);

__EIP712_init

*Initializes the domain separator and parameter caches. The meaning of name and version is specified in https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:

  • name: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
  • version: the current major version of the signing domain. NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart contract upgrade].*
function __EIP712_init(string memory name, string memory version) internal onlyInitializing;

__EIP712_init_unchained

function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing;

_domainSeparatorV4

Returns the domain separator for the current chain.

function _domainSeparatorV4() internal view returns (bytes32);

_buildDomainSeparator

function _buildDomainSeparator() private view returns (bytes32);

_hashTypedDataV4

*Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this function returns the hash of the fully encoded EIP712 message for this domain. This hash can be used together with ECDSA-recover to obtain the signer of a message. For example:

bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
keccak256("Mail(address to,string contents)"),
mailTo,
keccak256(bytes(mailContents))
)));
address signer = ECDSA.recover(digest, signature);
```*


```solidity
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32);

eip712Domain

returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.

function eip712Domain()
    public
    view
    virtual
    returns (
        bytes1 fields,
        string memory name,
        string memory version,
        uint256 chainId,
        address verifyingContract,
        bytes32 salt,
        uint256[] memory extensions
    );

_EIP712Name

The name parameter for the EIP712 domain. NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs are a concern.

function _EIP712Name() internal view virtual returns (string memory);

_EIP712Version

The version parameter for the EIP712 domain. NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs are a concern.

function _EIP712Version() internal view virtual returns (string memory);

_EIP712NameHash

The hash of the name parameter for the EIP712 domain. NOTE: In previous versions this function was virtual. In this version you should override _EIP712Name instead.

function _EIP712NameHash() internal view returns (bytes32);

_EIP712VersionHash

The hash of the version parameter for the EIP712 domain. NOTE: In previous versions this function was virtual. In this version you should override _EIP712Version instead.

function _EIP712VersionHash() internal view returns (bytes32);

Structs

EIP712Storage

Note: storage-location: erc7201:openzeppelin.storage.EIP712

struct EIP712Storage {
    bytes32 _hashedName;
    bytes32 _hashedVersion;
    string _name;
    string _version;
}