diff --git a/contracts/protocol/tokenization/AToken.sol b/contracts/protocol/tokenization/AToken.sol index fe2e6a561..819b7569b 100644 --- a/contracts/protocol/tokenization/AToken.sol +++ b/contracts/protocol/tokenization/AToken.sol @@ -23,9 +23,6 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { using WadRayMath for uint256; using SafeERC20 for IERC20; - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); bytes32 public constant PERMIT_TYPEHASH = keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); @@ -34,9 +31,6 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { /// @dev owner => next valid nonce to submit with permit() mapping(address => uint256) public _nonces; - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; - IPool internal immutable _pool; address internal _treasury; address internal _underlyingAsset; @@ -55,7 +49,6 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { IncentivizedERC20(pool.getAddressesProvider(), 'ATOKEN_IMPL', 'ATOKEN_IMPL', 0) { _pool = pool; - _chainId = block.chainid; } /// @inheritdoc IInitializableAToken @@ -76,15 +69,7 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { _underlyingAsset = underlyingAsset; _incentivesController = incentivesController; - _domainSeparator = keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(name())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); + _domainSeparator = _calculateDomainSeparator(); emit Initialized( underlyingAsset, @@ -98,22 +83,6 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { ); } - function DOMAIN_SEPARATOR() public view returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(name())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); - } - /// @inheritdoc IAToken function burn( address user, diff --git a/contracts/protocol/tokenization/IncentivizedERC20.sol b/contracts/protocol/tokenization/IncentivizedERC20.sol index f110f0608..5c9036634 100644 --- a/contracts/protocol/tokenization/IncentivizedERC20.sol +++ b/contracts/protocol/tokenization/IncentivizedERC20.sol @@ -45,6 +45,13 @@ abstract contract IncentivizedERC20 is Context, IERC20, IERC20Detailed { IAaveIncentivesController internal _incentivesController; IPoolAddressesProvider internal _addressesProvider; + bytes public constant EIP712_REVISION = bytes('1'); + bytes32 internal constant EIP712_DOMAIN = + keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); + + bytes32 internal _domainSeparator; + uint256 internal immutable _chainId; + constructor( IPoolAddressesProvider addressesProvider, string memory name, @@ -55,6 +62,7 @@ abstract contract IncentivizedERC20 is Context, IERC20, IERC20Detailed { _name = name; _symbol = symbol; _decimals = decimals; + _chainId = block.chainid; } /// @inheritdoc IERC20Detailed @@ -228,4 +236,24 @@ abstract contract IncentivizedERC20 is Context, IERC20, IERC20Detailed { function _setDecimals(uint8 newDecimals) internal { _decimals = newDecimals; } + + function DOMAIN_SEPARATOR() public view returns (bytes32) { + if (block.chainid == _chainId) { + return _domainSeparator; + } + return _calculateDomainSeparator(); + } + + function _calculateDomainSeparator() internal view returns (bytes32) { + return + keccak256( + abi.encode( + EIP712_DOMAIN, + keccak256(bytes(name())), + keccak256(EIP712_REVISION), + block.chainid, + address(this) + ) + ); + } } diff --git a/contracts/protocol/tokenization/StableDebtToken.sol b/contracts/protocol/tokenization/StableDebtToken.sol index 09d956ac3..b0231ae33 100644 --- a/contracts/protocol/tokenization/StableDebtToken.sol +++ b/contracts/protocol/tokenization/StableDebtToken.sol @@ -49,15 +49,7 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { _underlyingAsset = underlyingAsset; _incentivesController = incentivesController; - _domainSeparator = keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(name())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); + _domainSeparator = _calculateDomainSeparator(); emit Initialized( underlyingAsset, diff --git a/contracts/protocol/tokenization/VariableDebtToken.sol b/contracts/protocol/tokenization/VariableDebtToken.sol index f7cd66096..24553fcbe 100644 --- a/contracts/protocol/tokenization/VariableDebtToken.sol +++ b/contracts/protocol/tokenization/VariableDebtToken.sol @@ -44,15 +44,7 @@ contract VariableDebtToken is DebtTokenBase, IVariableDebtToken { _underlyingAsset = underlyingAsset; _incentivesController = incentivesController; - _domainSeparator = keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(name())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); + _domainSeparator = _calculateDomainSeparator(); emit Initialized( underlyingAsset, diff --git a/contracts/protocol/tokenization/base/DebtTokenBase.sol b/contracts/protocol/tokenization/base/DebtTokenBase.sol index abb11fe86..43cb6c2a6 100644 --- a/contracts/protocol/tokenization/base/DebtTokenBase.sol +++ b/contracts/protocol/tokenization/base/DebtTokenBase.sol @@ -19,16 +19,11 @@ abstract contract DebtTokenBase is ICreditDelegationToken { mapping(address => mapping(address => uint256)) internal _borrowAllowances; - bytes public constant EIP712_REVISION = bytes('1'); - bytes32 internal constant EIP712_DOMAIN = - keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH = keccak256( 'DelegationWithSig(address delegator,address delegatee,uint256 value,uint256 nonce,uint256 deadline)' ); mapping(address => uint256) public _nonces; - bytes32 internal _domainSeparator; - uint256 internal immutable _chainId; IPool internal immutable _pool; /** @@ -43,23 +38,6 @@ abstract contract DebtTokenBase is IncentivizedERC20(pool.getAddressesProvider(), 'DEBT_TOKEN_IMPL', 'DEBT_TOKEN_IMPL', 0) { _pool = pool; - _chainId = block.chainid; - } - - function DOMAIN_SEPARATOR() public view returns (bytes32) { - if (block.chainid == _chainId) { - return _domainSeparator; - } - return - keccak256( - abi.encode( - EIP712_DOMAIN, - keccak256(bytes(name())), - keccak256(EIP712_REVISION), - block.chainid, - address(this) - ) - ); } /// @inheritdoc ICreditDelegationToken