/
SafeERC20Helper.sol
129 lines (98 loc) · 3.31 KB
/
SafeERC20Helper.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
pragma solidity ^0.5.2;
import "../token/ERC20/IERC20.sol";
import "../token/ERC20/SafeERC20.sol";
contract ERC20ReturnFalseMock {
uint256 private _allowance;
// IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings,
// we write to a dummy state variable.
uint256 private _dummy;
function transfer(address, uint256) public returns (bool) {
_dummy = 0;
return false;
}
function transferFrom(address, address, uint256) public returns (bool) {
_dummy = 0;
return false;
}
function approve(address, uint256) public returns (bool) {
_dummy = 0;
return false;
}
function allowance(address, address) public view returns (uint256) {
require(_dummy == 0);
return 0;
}
}
contract ERC20ReturnTrueMock {
mapping (address => uint256) private _allowances;
// IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings,
// we write to a dummy state variable.
uint256 private _dummy;
function transfer(address, uint256) public returns (bool) {
_dummy = 0;
return true;
}
function transferFrom(address, address, uint256) public returns (bool) {
_dummy = 0;
return true;
}
function approve(address, uint256) public returns (bool) {
_dummy = 0;
return true;
}
function setAllowance(uint256 allowance_) public {
_allowances[msg.sender] = allowance_;
}
function allowance(address owner, address) public view returns (uint256) {
return _allowances[owner];
}
}
contract ERC20NoReturnMock {
mapping (address => uint256) private _allowances;
// IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings,
// we write to a dummy state variable.
uint256 private _dummy;
function transfer(address, uint256) public {
_dummy = 0;
}
function transferFrom(address, address, uint256) public {
_dummy = 0;
}
function approve(address, uint256) public {
_dummy = 0;
}
function setAllowance(uint256 allowance_) public {
_allowances[msg.sender] = allowance_;
}
function allowance(address owner, address) public view returns (uint256) {
return _allowances[owner];
}
}
contract SafeERC20Wrapper {
using SafeERC20 for IERC20;
IERC20 private _token;
constructor (IERC20 token) public {
_token = token;
}
function transfer() public {
_token.safeTransfer(address(0), 0);
}
function transferFrom() public {
_token.safeTransferFrom(address(0), address(0), 0);
}
function approve(uint256 amount) public {
_token.safeApprove(address(0), amount);
}
function increaseAllowance(uint256 amount) public {
_token.safeIncreaseAllowance(address(0), amount);
}
function decreaseAllowance(uint256 amount) public {
_token.safeDecreaseAllowance(address(0), amount);
}
function setAllowance(uint256 allowance_) public {
ERC20ReturnTrueMock(address(_token)).setAllowance(allowance_);
}
function allowance() public view returns (uint256) {
return _token.allowance(address(0), address(0));
}
}