@@ -6,7 +6,7 @@ pragma solidity ^0.8.0;
66import "./IERC20Permit.sol " ;
77import "../ERC20.sol " ;
88import "../../../utils/cryptography/ECDSA.sol " ;
9- import "../../../utils/cryptography/EIP712 .sol " ;
9+ import "../../../utils/cryptography/SequentialOperations .sol " ;
1010import "../../../utils/Nonces.sol " ;
1111
1212/**
@@ -19,9 +19,7 @@ import "../../../utils/Nonces.sol";
1919 *
2020 * _Available since v3.4._
2121 */
22- abstract contract ERC20Permit is ERC20 , IERC20Permit , EIP712 {
23- using Nonces for Nonces.Data;
24-
22+ abstract contract ERC20Permit is ERC20 , IERC20Permit , SequentialOperations {
2523 // solhint-disable-next-line var-name-mixedcase
2624 bytes32 private constant _PERMIT_TYPEHASH =
2725 keccak256 ("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline) " );
@@ -33,7 +31,6 @@ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
3331 */
3432 // solhint-disable-next-line var-name-mixedcase
3533 bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;
36- Nonces.Data private _nonces;
3734
3835 /**
3936 * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
@@ -55,22 +52,24 @@ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
5552 bytes32 s
5653 ) public virtual override {
5754 require (block .timestamp <= deadline, "ERC20Permit: expired deadline " );
58-
59- bytes32 structHash = keccak256 (abi.encode (_PERMIT_TYPEHASH, owner, spender, value, _nonces.useNonce (owner), deadline));
60-
61- bytes32 hash = _hashTypedDataV4 (structHash);
62-
63- address signer = ECDSA.recover (hash, v, r, s);
64- require (signer == owner, "ERC20Permit: invalid signature " );
65-
55+ uint256 nonce = operationNonces (_PERMIT_TYPEHASH, owner);
56+ address signer = _validateSequentialOperation (
57+ _PERMIT_TYPEHASH,
58+ keccak256 (abi.encode (_PERMIT_TYPEHASH, owner, spender, value, nonce, deadline)),
59+ nonce,
60+ v,
61+ r,
62+ s
63+ );
64+ require (owner == signer, "ERC20Permit: invalid signature " );
6665 _approve (owner, spender, value);
6766 }
6867
6968 /**
7069 * @dev See {IERC20Permit-nonces}.
7170 */
7271 function nonces (address owner ) public view virtual override returns (uint256 ) {
73- return _nonces. nonces ( owner);
72+ return operationNonces (_PERMIT_TYPEHASH, owner);
7473 }
7574
7675 /**
0 commit comments