From 4a8f336c7ce8aeb4f4e129cf08d2248d84c82e7f Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Sun, 11 Mar 2018 18:39:57 +0700 Subject: [PATCH] burned fee locker/recycler --- contracts/democracy/BurnedFeeLocker.sol | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 contracts/democracy/BurnedFeeLocker.sol diff --git a/contracts/democracy/BurnedFeeLocker.sol b/contracts/democracy/BurnedFeeLocker.sol new file mode 100644 index 0000000..96d9db3 --- /dev/null +++ b/contracts/democracy/BurnedFeeLocker.sol @@ -0,0 +1,46 @@ +pragma solidity ^0.4.17; + +import "../token/MiniMeToken.sol"; +import "../token/ApproveAndCallFallBack.sol"; + +contract BurnedFeeLocker is ApproveAndCallFallBack { + + address public SNT; + address public recyclerManager; + mapping (address => uint256) burnedFee; + uint256 availableToRecycle; + + function BurnedFeeLocker(address _recyclerManager, address _SNT) public { + SNT = _SNT; + recyclerManager = _recyclerManager; + } + + function recycleFee(address _from, address _to, uint256 _amount) external { + require(msg.sender == recyclerManager); + require(burnedFee[_from] >= _amount); + MiniMeToken(SNT).approveAndCall(_to, _amount, new bytes(0)); + availableToRecycle -= _amount; + } + + function withdrawToken(address _token, address _to) external { + require(msg.sender == recyclerManager); + uint256 available = MiniMeToken(_token).balanceOf(address(this)); + if (_token == SNT) { + available -= availableToRecycle; + } + if (available > 0) { + MiniMeToken(_token).transfer(_to, available); + } + } + + function receiveApproval(address _from, uint256 _amount, address _token, bytes _data) public { + require(_token == SNT); + if (_amount == 0 || _data.length > 0) { + require(msg.sender == _token); + } + if (MiniMeToken(SNT).transferFrom(_from, address(this), _amount)) { + burnedFee[_from] += _amount; + availableToRecycle += _amount; + } + } +} \ No newline at end of file