@@ -52,6 +52,10 @@ contract SuperToken is
5252 // EIP-712 permit typehash
5353 bytes32 constant private _PERMIT_TYPEHASH =
5454 keccak256 ("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline) " );
55+ bytes32 constant private _EIP712_DOMAIN_TYPEHASH =
56+ keccak256 ("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract) " );
57+
58+ string constant private _EIP712_VERSION = "1 " ;
5559
5660 // solhint-disable-next-line var-name-mixedcase
5761 IConstantOutflowNFT immutable public CONSTANT_OUTFLOW_NFT;
@@ -188,14 +192,14 @@ contract SuperToken is
188192 UUPSProxiable._updateCodeAddress (newAddress);
189193 }
190194
191- function changeAdmin (address newAdmin ) external override onlyAdmin {
195+ function changeAdmin (address newAdmin ) external virtual override onlyAdmin {
192196 address oldAdmin = _getAdmin ();
193197 _setAdmin (newAdmin);
194198
195199 emit AdminChanged (oldAdmin, newAdmin);
196200 }
197201
198- function getAdmin () external view override returns (address ) {
202+ function getAdmin () external view virtual override returns (address ) {
199203 return _getAdmin ();
200204 }
201205
@@ -243,7 +247,7 @@ contract SuperToken is
243247 uint8 v ,
244248 bytes32 r ,
245249 bytes32 s
246- ) public override {
250+ ) public virtual override {
247251 if (block .timestamp > deadline) revert SUPER_TOKEN_PERMIT_EXPIRED_SIGNATURE (deadline);
248252
249253 bytes32 structHash = keccak256 (
@@ -278,25 +282,53 @@ contract SuperToken is
278282
279283 /// @dev EIP-712 Domain Separator
280284 // solhint-disable func-name-mixedcase
281- function DOMAIN_SEPARATOR () public view virtual returns (bytes32 ) {
285+ function DOMAIN_SEPARATOR () public view virtual override returns (bytes32 ) {
282286 // TODO: can be optimized: provide immutable parts from constants
283287 return keccak256 (
284288 abi.encode (
285- // TYPE_HASH
286- keccak256 ("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract) " ),
287- keccak256 ("SuperToken " ), // name
288- keccak256 ("1 " ), // version
289+ _EIP712_DOMAIN_TYPEHASH,
290+ keccak256 (bytes (_name)),
291+ keccak256 (bytes (_EIP712_VERSION)),
289292 block .chainid ,
290293 address (this )
291294 )
292295 );
293296 }
294297
295298 /// @dev EIP-2612 Nonces
296- function nonces (address owner ) public view virtual returns (uint256 ) {
299+ function nonces (address owner ) public view virtual override returns (uint256 ) {
297300 return _nonces[owner];
298301 }
299302
303+ /// @dev EIP-5267: Retrieval of EIP-712 domain
304+ function eip712Domain ()
305+ public
306+ view
307+ virtual
308+ override
309+ returns
310+ (
311+ bytes1 fields ,
312+ /* commented out to avoid warning of name clash with name() */
313+ string memory /*name*/ ,
314+ string memory version ,
315+ uint256 chainId ,
316+ address verifyingContract ,
317+ bytes32 salt ,
318+ uint256 [] memory extensions
319+ )
320+ {
321+ return (
322+ hex "0f " , // 01111 - field "salt" not present
323+ _name,
324+ _EIP712_VERSION,
325+ block .chainid ,
326+ address (this ), // verifyingContract
327+ bytes32 (0 ), // salt
328+ new uint256 [](0 ) // extensions
329+ );
330+ }
331+
300332 /**************************************************************************
301333 * (private) Token Logics
302334 *************************************************************************/
0 commit comments