SafeERC20Helper.sol 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. pragma solidity ^0.4.24;
  2. import "../token/ERC20/IERC20.sol";
  3. import "../token/ERC20/SafeERC20.sol";
  4. contract ERC20FailingMock {
  5. uint256 private _allowance;
  6. function transfer(address, uint256) public returns (bool) {
  7. return false;
  8. }
  9. function transferFrom(address, address, uint256) public returns (bool) {
  10. return false;
  11. }
  12. function approve(address, uint256) public returns (bool) {
  13. return false;
  14. }
  15. function allowance(address, address) public view returns (uint256) {
  16. return 0;
  17. }
  18. }
  19. contract ERC20SucceedingMock {
  20. uint256 private _allowance;
  21. function transfer(address, uint256) public returns (bool) {
  22. return true;
  23. }
  24. function transferFrom(address, address, uint256) public returns (bool) {
  25. return true;
  26. }
  27. function approve(address, uint256) public returns (bool) {
  28. return true;
  29. }
  30. function setAllowance(uint256 allowance_) public {
  31. _allowance = allowance_;
  32. }
  33. function allowance(address, address) public view returns (uint256) {
  34. return _allowance;
  35. }
  36. }
  37. contract SafeERC20Helper {
  38. using SafeERC20 for IERC20;
  39. IERC20 private _failing;
  40. IERC20 private _succeeding;
  41. constructor () public {
  42. _failing = IERC20(new ERC20FailingMock());
  43. _succeeding = IERC20(new ERC20SucceedingMock());
  44. }
  45. // Using _failing
  46. function doFailingTransfer() public {
  47. _failing.safeTransfer(address(0), 0);
  48. }
  49. function doFailingTransferFrom() public {
  50. _failing.safeTransferFrom(address(0), address(0), 0);
  51. }
  52. function doFailingApprove() public {
  53. _failing.safeApprove(address(0), 0);
  54. }
  55. function doFailingIncreaseAllowance() public {
  56. _failing.safeIncreaseAllowance(address(0), 0);
  57. }
  58. function doFailingDecreaseAllowance() public {
  59. _failing.safeDecreaseAllowance(address(0), 0);
  60. }
  61. // Using _succeeding
  62. function doSucceedingTransfer() public {
  63. _succeeding.safeTransfer(address(0), 0);
  64. }
  65. function doSucceedingTransferFrom() public {
  66. _succeeding.safeTransferFrom(address(0), address(0), 0);
  67. }
  68. function doSucceedingApprove(uint256 amount) public {
  69. _succeeding.safeApprove(address(0), amount);
  70. }
  71. function doSucceedingIncreaseAllowance(uint256 amount) public {
  72. _succeeding.safeIncreaseAllowance(address(0), amount);
  73. }
  74. function doSucceedingDecreaseAllowance(uint256 amount) public {
  75. _succeeding.safeDecreaseAllowance(address(0), amount);
  76. }
  77. function setAllowance(uint256 allowance_) public {
  78. ERC20SucceedingMock(_succeeding).setAllowance(allowance_);
  79. }
  80. function allowance() public view returns (uint256) {
  81. return _succeeding.allowance(address(0), address(0));
  82. }
  83. }