Branch data Line data Source code
1 : : // SPDX-License-Identifier: MIT
2 : : pragma solidity ^0.8.10;
3 : :
4 : : /**
5 : : * @title EIP712Base
6 : : * @author Aave
7 : : * @notice Base contract implementation of EIP712.
8 : : */
9 : : abstract contract EIP712Base {
10 : : bytes public constant EIP712_REVISION = bytes('1');
11 : : bytes32 internal constant EIP712_DOMAIN =
12 : : keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)');
13 : :
14 : : // Map of address nonces (address => nonce)
15 : : mapping(address => uint256) internal _nonces;
16 : :
17 : : bytes32 internal _domainSeparator;
18 : : uint256 internal immutable _chainId;
19 : :
20 : : /**
21 : : * @dev Constructor.
22 : : */
23 : : constructor() {
24 : 15145 : _chainId = block.chainid;
25 : : }
26 : :
27 : : /**
28 : : * @notice Get the domain separator for the token
29 : : * @dev Return cached value if chainId matches cache, otherwise recomputes separator
30 : : * @return The domain separator of the token at current chain
31 : : */
32 : : function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
33 : 4021 : if (block.chainid == _chainId) {
34 : 4020 : return _domainSeparator;
35 : : }
36 : 1 : return _calculateDomainSeparator();
37 : : }
38 : :
39 : : /**
40 : : * @notice Returns the nonce value for address specified as parameter
41 : : * @param owner The address for which the nonce is being returned
42 : : * @return The nonce value for the input address`
43 : : */
44 : : function nonces(address owner) public view virtual returns (uint256) {
45 : 1009 : return _nonces[owner];
46 : : }
47 : :
48 : : /**
49 : : * @notice Compute the current domain separator
50 : : * @return The domain separator for the token
51 : : */
52 : : function _calculateDomainSeparator() internal view returns (bytes32) {
53 : 339395 : return
54 : 339395 : keccak256(
55 : : abi.encode(
56 : : EIP712_DOMAIN,
57 : : keccak256(bytes(_EIP712BaseId())),
58 : : keccak256(EIP712_REVISION),
59 : : block.chainid,
60 : : address(this)
61 : : )
62 : : );
63 : : }
64 : :
65 : : /**
66 : : * @notice Returns the user readable name of signing domain (e.g. token name)
67 : : * @return The name of the signing domain
68 : : */
69 : : function _EIP712BaseId() internal view virtual returns (string memory);
70 : : }
|