EIP712 :
Note, this implementation: - Uses `address(this)` for the `verifyingContract` field. - Does NOT use the optional EIP-712 salt. - Does NOT use any EIP-712 extensions. This is for simplicity and to save gas. If you need to customize, please fork / modify accordingly.
constructor :
Cache the hashes for cheaper runtime gas costs. In the case of upgradeable contracts (i.e. proxies), or if the chain id changes due to a hard fork, the domain separator will be seamlessly calculated on-the-fly.
eip712Domain() :
See: https://eips.ethereum.org/EIPS/eip-5267