SafeERC20HelperUpgradeable.sol 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.0;
  3. import "../utils/ContextUpgradeable.sol";
  4. import "../token/ERC20/IERC20Upgradeable.sol";
  5. import "../token/ERC20/utils/SafeERC20Upgradeable.sol";
  6. import "../proxy/utils/Initializable.sol";
  7. contract ERC20ReturnFalseMockUpgradeable is Initializable, ContextUpgradeable {
  8. function __ERC20ReturnFalseMock_init() internal onlyInitializing {
  9. __Context_init_unchained();
  10. __ERC20ReturnFalseMock_init_unchained();
  11. }
  12. function __ERC20ReturnFalseMock_init_unchained() internal onlyInitializing {
  13. }
  14. uint256 private _allowance;
  15. // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings,
  16. // we write to a dummy state variable.
  17. uint256 private _dummy;
  18. function transfer(address, uint256) public returns (bool) {
  19. _dummy = 0;
  20. return false;
  21. }
  22. function transferFrom(
  23. address,
  24. address,
  25. uint256
  26. ) public returns (bool) {
  27. _dummy = 0;
  28. return false;
  29. }
  30. function approve(address, uint256) public returns (bool) {
  31. _dummy = 0;
  32. return false;
  33. }
  34. function allowance(address, address) public view returns (uint256) {
  35. require(_dummy == 0); // Dummy read from a state variable so that the function is view
  36. return 0;
  37. }
  38. uint256[48] private __gap;
  39. }
  40. contract ERC20ReturnTrueMockUpgradeable is Initializable, ContextUpgradeable {
  41. function __ERC20ReturnTrueMock_init() internal onlyInitializing {
  42. __Context_init_unchained();
  43. __ERC20ReturnTrueMock_init_unchained();
  44. }
  45. function __ERC20ReturnTrueMock_init_unchained() internal onlyInitializing {
  46. }
  47. mapping(address => uint256) private _allowances;
  48. // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings,
  49. // we write to a dummy state variable.
  50. uint256 private _dummy;
  51. function transfer(address, uint256) public returns (bool) {
  52. _dummy = 0;
  53. return true;
  54. }
  55. function transferFrom(
  56. address,
  57. address,
  58. uint256
  59. ) public returns (bool) {
  60. _dummy = 0;
  61. return true;
  62. }
  63. function approve(address, uint256) public returns (bool) {
  64. _dummy = 0;
  65. return true;
  66. }
  67. function setAllowance(uint256 allowance_) public {
  68. _allowances[_msgSender()] = allowance_;
  69. }
  70. function allowance(address owner, address) public view returns (uint256) {
  71. return _allowances[owner];
  72. }
  73. uint256[48] private __gap;
  74. }
  75. contract ERC20NoReturnMockUpgradeable is Initializable, ContextUpgradeable {
  76. function __ERC20NoReturnMock_init() internal onlyInitializing {
  77. __Context_init_unchained();
  78. __ERC20NoReturnMock_init_unchained();
  79. }
  80. function __ERC20NoReturnMock_init_unchained() internal onlyInitializing {
  81. }
  82. mapping(address => uint256) private _allowances;
  83. // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings,
  84. // we write to a dummy state variable.
  85. uint256 private _dummy;
  86. function transfer(address, uint256) public {
  87. _dummy = 0;
  88. }
  89. function transferFrom(
  90. address,
  91. address,
  92. uint256
  93. ) public {
  94. _dummy = 0;
  95. }
  96. function approve(address, uint256) public {
  97. _dummy = 0;
  98. }
  99. function setAllowance(uint256 allowance_) public {
  100. _allowances[_msgSender()] = allowance_;
  101. }
  102. function allowance(address owner, address) public view returns (uint256) {
  103. return _allowances[owner];
  104. }
  105. uint256[48] private __gap;
  106. }
  107. contract SafeERC20WrapperUpgradeable is Initializable, ContextUpgradeable {
  108. using SafeERC20Upgradeable for IERC20Upgradeable;
  109. IERC20Upgradeable private _token;
  110. function __SafeERC20Wrapper_init(IERC20Upgradeable token) internal onlyInitializing {
  111. __Context_init_unchained();
  112. __SafeERC20Wrapper_init_unchained(token);
  113. }
  114. function __SafeERC20Wrapper_init_unchained(IERC20Upgradeable token) internal onlyInitializing {
  115. _token = token;
  116. }
  117. function transfer() public {
  118. _token.safeTransfer(address(0), 0);
  119. }
  120. function transferFrom() public {
  121. _token.safeTransferFrom(address(0), address(0), 0);
  122. }
  123. function approve(uint256 amount) public {
  124. _token.safeApprove(address(0), amount);
  125. }
  126. function increaseAllowance(uint256 amount) public {
  127. _token.safeIncreaseAllowance(address(0), amount);
  128. }
  129. function decreaseAllowance(uint256 amount) public {
  130. _token.safeDecreaseAllowance(address(0), amount);
  131. }
  132. function setAllowance(uint256 allowance_) public {
  133. ERC20ReturnTrueMockUpgradeable(address(_token)).setAllowance(allowance_);
  134. }
  135. function allowance() public view returns (uint256) {
  136. return _token.allowance(address(0), address(0));
  137. }
  138. uint256[49] private __gap;
  139. }