Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.71 KB | None | 0 0
  1. pragma solidity ^0.5.6;
  2. library SafeMath {
  3. function mul(uint256 a, uint256 b) internal pure returns (uint256) {
  4. if (a == 0 || b == 0) return 0;
  5. uint256 c = a * b;
  6. require(c / a == b);
  7. return c;
  8. }
  9. function div(uint256 a, uint256 b) internal pure returns (uint256) {
  10. require(b > 0);
  11. uint256 c = a / b;
  12. return c;
  13. }
  14. function sub(uint256 a, uint256 b) internal pure returns (uint256) {
  15. require(b <= a);
  16. uint256 c = a - b;
  17. return c;
  18. }
  19. function add(uint256 a, uint256 b) internal pure returns (uint256) {
  20. uint256 c = a + b;
  21. require(c >= a);
  22. return c;
  23. }
  24. function mod(uint256 a, uint256 b) internal pure returns (uint256) {
  25. require(b != 0);
  26. return a % b;
  27. }
  28. }
  29. contract ReserveWallet {
  30. using SafeMath for uint256;
  31. event Donation(address indexed _from, address indexed _token, uint256 _amount);
  32. event Deposit(address indexed _user, address indexed _token, uint256 _amount);
  33. event Withdraw(address indexed _user, address indexed _token, uint256 _amount, uint256 _fee);
  34. event Sent(address indexed _userSender, address indexed _userReceiver, address indexed _token, uint256 _amount, uint256 _fee);
  35. event AdminChanged(address indexed _admin, address indexed _oldAdmin);
  36. event Recovered(address indexed _admin, address indexed _user, address indexed _token, uint256 _amount);
  37. event FeeUpdated(address indexed _admin, uint256 _currentFee, uint256 _oldFee);
  38. mapping(address => mapping(address => uint256)) balances;
  39. mapping(address => uint256) covered;
  40. address public admin;
  41. address public feeAddress;
  42. uint256 public fixedFee;
  43. constructor (address _admin, address _feeAddress, uint256 _fee) public {
  44. if (_admin == address(0)) _admin = msg.sender;
  45. if (_feeAddress == address(0)) _feeAddress = _admin;
  46. if (_fee > 75e7 || _fee < 125) _fee = 125e6;
  47. fixedFee = _fee;
  48. feeAddress = _feeAddress;
  49. admin = _admin;
  50. emit AdminChanged(_admin, address(0));
  51. }
  52. modifier onlyAdmin() {
  53. require(msg.sender == admin);
  54. _;
  55. }
  56. modifier onlyUsers() {
  57. require(msg.sender != feeAddress);
  58. _;
  59. }
  60. function deposit() public payable onlyUsers {
  61. require(msg.value > 0);
  62. balances[msg.sender][address(0)] = balances[msg.sender][address(0)].add(msg.value);
  63. covered[address(0)] = covered[address(0)].add(msg.value);
  64. emit Deposit(msg.sender, address(0), msg.value);
  65. }
  66. function depositERC20(address _token, uint256 _value) public onlyUsers {
  67. require(_value > 0);
  68. ERC20(_token).transferFrom(msg.sender, address(this), _value);
  69. balances[msg.sender][_token] = balances[msg.sender][_token].add(_value);
  70. covered[_token] = covered[_token].add(_value);
  71. emit Deposit(msg.sender, _token, _value);
  72. }
  73. function send(address _token, address _recipient, uint256 _value) public onlyUsers {
  74. require(_recipient != address(0));
  75. require(_value >= 1e9);
  76. (uint256 amount, uint256 fee) = exactValue(msg.sender, _recipient, _value);
  77. if (_recipient == address(this)) _recipient = admin;
  78. balances[msg.sender][_token] = balances[msg.sender][_token].sub(_value);
  79. balances[_recipient][_token] = balances[_recipient][_token].add(amount);
  80. if (fee > 0) balances[feeAddress][_token] = balances[feeAddress][_token].add(fee);
  81. emit Sent(msg.sender, _recipient, _token, amount, fee);
  82. }
  83. function withdraw(address _token, uint256 _value) public onlyUsers {
  84. require(_value >= 1e9);
  85. (uint256 _amount, uint256 _fee) = exactValue(msg.sender, msg.sender, _value);
  86. balances[msg.sender][_token] = balances[msg.sender][_token].sub(_value);
  87. if (_fee > 0) balances[feeAddress][_token] = balances[feeAddress][_token].add(_fee);
  88. covered[_token] = covered[_token].sub(_amount);
  89. if (_token == address(0)) _transfer(msg.sender, _amount);
  90. else ERC20(_token).transfer(msg.sender, _amount);
  91. emit Withdraw(msg.sender, _token, _amount, _fee);
  92. }
  93. function donation() public payable {
  94. require(msg.value > 0);
  95. balances[admin][address(0)] = balances[admin][address(0)].add(msg.value);
  96. covered[address(0)] = covered[address(0)].add(msg.value);
  97. emit Donation(msg.sender, address(0), msg.value);
  98. }
  99. function () external payable {
  100. if (msg.value > 0) donation();
  101. }
  102. function setFee(uint256 _fee) public onlyAdmin {
  103. require(_fee >= 125 && _fee <= 75e7);
  104. uint256 b = _fee;
  105. fixedFee = _fee;
  106. emit FeeUpdated(msg.sender, _fee, b);
  107. }
  108. function recovery(address _token, address _user, uint256 _value) public onlyAdmin {
  109. uint256 _uncovered = _getUncovered(_token);
  110. require(_user != address(0) && address(this) != _user);
  111. require(_value > 0);
  112. _uncovered = _uncovered.sub(_value);
  113. balances[_user][_token] = balances[_user][_token].add(_value);
  114. covered[_token] = covered[_token].add(_value);
  115. emit Recovered(msg.sender, _user, _token, _value);
  116. }
  117. function changeAdmin(address _account) public onlyAdmin {
  118. require(_account != address(0) && address(this) != _account);
  119. admin = _account;
  120. emit AdminChanged(_account, msg.sender);
  121. }
  122. function exactValue(address _account, address _dest, uint256 _value) public view returns(uint256 _exact, uint256 _fee) {
  123. if (_value >= 1e9) {
  124. _fee = fixedFee.mul(_value);
  125. _fee = _fee.div(1e9);
  126. _exact = _value.sub(_fee);
  127. } else {
  128. _exact = 0;
  129. _fee = _value;
  130. }
  131. if (_account == admin || _account == feeAddress || _dest == admin || feeAddress == _dest) {
  132. _exact = _value;
  133. _fee = 0;
  134. }
  135. return (_exact, _fee);
  136. }
  137. function _transfer(address _dest, uint256 _value) internal {
  138. uint i;
  139. assembly { i := extcodesize(_dest) }
  140. if (i == 0) {
  141. address(uint160(_dest)).transfer(_value);
  142. } else {
  143. (bool success,) = _dest.call.gas(250000).value(_value)("");
  144. require(success);
  145. }
  146. }
  147. function _getUncovered(address _token) internal view returns(uint256) {
  148. uint256 result;
  149. if (_token == address(0)) result = address(this).balance;
  150. else result = ERC20(_token).balanceOf(address(this));
  151. result = result.sub(covered[_token]);
  152. return result;
  153. }
  154. }
  155. contract ERC20 {
  156. function balanceOf(address _who) public view returns(uint256);
  157. function transfer(address _to, uint256 _value) public returns(bool);
  158. function transferFrom(address _from, address _to, uint256 _value) public returns(bool);
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement