2
2
3
3
pragma solidity ^ 0.8.0 ;
4
4
5
- import {IERC20Permit } from "../erc/IERC20Permit.sol " ;
6
-
7
- abstract contract MockERC20Permit is IERC20Permit {
8
- // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
9
- bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 ;
5
+ import {IERC20 , IERC20Permit } from "../erc/IERC20Permit.sol " ;
10
6
7
+ abstract contract MockERC20 is IERC20 {
11
8
uint256 public override totalSupply;
12
9
mapping (address => uint256 ) public override balanceOf;
13
10
mapping (address => mapping (address => uint256 )) public override allowance;
14
- mapping (address => uint256 ) public override nonces;
15
11
16
12
function approve (address spender , uint256 amount ) external returns (bool ) {
17
13
allowance[msg .sender ][spender] = amount;
@@ -28,7 +24,11 @@ abstract contract MockERC20Permit is IERC20Permit {
28
24
return true ;
29
25
}
30
26
31
- function transferFrom (address from , address to , uint256 amount ) external override returns (bool ) {
27
+ function transferFrom (address from , address to , uint256 amount )
28
+ external
29
+ override
30
+ returns (bool )
31
+ {
32
32
uint256 allowed = allowance[from][msg .sender ];
33
33
if (allowed != type (uint256 ).max) allowance[from][msg .sender ] = allowed - amount;
34
34
balanceOf[from] -= amount;
@@ -39,16 +39,38 @@ abstract contract MockERC20Permit is IERC20Permit {
39
39
return true ;
40
40
}
41
41
42
- function permit (address owner , address spender , uint256 amount , uint256 deadline , uint8 v , bytes32 r , bytes32 s )
43
- external
44
- {
42
+ function mint (uint256 amount ) external {
43
+ balanceOf[msg .sender ] += amount;
44
+ }
45
+ }
46
+
47
+ abstract contract MockERC20Permit is MockERC20 , IERC20Permit {
48
+ // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
49
+ bytes32 public constant PERMIT_TYPEHASH =
50
+ 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 ;
51
+
52
+ mapping (address => uint256 ) public override nonces;
53
+
54
+ function permit (
55
+ address owner ,
56
+ address spender ,
57
+ uint256 amount ,
58
+ uint256 deadline ,
59
+ uint8 v ,
60
+ bytes32 r ,
61
+ bytes32 s
62
+ ) external {
45
63
require (deadline >= block .timestamp );
46
64
unchecked {
47
65
bytes32 digest = keccak256 (
48
66
abi.encodePacked (
49
67
"\x19\x01 " ,
50
68
DOMAIN_SEPARATOR (),
51
- keccak256 (abi.encode (PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++ , deadline))
69
+ keccak256 (
70
+ abi.encode (
71
+ PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++ , deadline
72
+ )
73
+ )
52
74
)
53
75
);
54
76
address recovered = ecrecover (digest, v, r, s);
@@ -59,8 +81,4 @@ abstract contract MockERC20Permit is IERC20Permit {
59
81
}
60
82
61
83
function DOMAIN_SEPARATOR () public pure virtual override returns (bytes32 );
62
-
63
- function mint (uint256 amount ) external {
64
- balanceOf[msg .sender ] += amount;
65
- }
66
84
}
0 commit comments