diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d255da6..0000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -dist: trusty -language: node_js -node_js: - - '11' -install: - - npm ci - - cp .env.example .env - - travis_wait 30 npm run build - - npx ganache-cli > /dev/null & - - npm run migrate:dev -script: - - npm run test - - npm run eslint - - node cli.js test diff --git a/contracts/ERC20Tornado.sol b/contracts/ERC20Tornado.sol index 763f038..2a03e5f 100644 --- a/contracts/ERC20Tornado.sol +++ b/contracts/ERC20Tornado.sol @@ -13,23 +13,26 @@ pragma solidity ^0.6.0; import "./Tornado.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; contract ERC20Tornado is Tornado { - address public token; + using SafeERC20 for IERC20; + IERC20 public immutable token; constructor( IVerifier _verifier, IHasher _hasher, uint256 _denomination, uint32 _merkleTreeHeight, - address _token + IERC20 _token ) public Tornado(_verifier, _hasher, _denomination, _merkleTreeHeight) { token = _token; } function _processDeposit() internal override { require(msg.value == 0, "ETH value is supposed to be 0 for ERC20 instance"); - _safeErc20TransferFrom(msg.sender, address(this), denomination); + token.safeTransferFrom(msg.sender, address(this), denomination); } function _processWithdraw( @@ -40,9 +43,9 @@ contract ERC20Tornado is Tornado { ) internal override { require(msg.value == _refund, "Incorrect refund amount received by the contract"); - _safeErc20Transfer(_recipient, denomination - _fee); + token.safeTransfer(_recipient, denomination - _fee); if (_fee > 0) { - _safeErc20Transfer(_relayer, _fee); + token.safeTransfer(_relayer, _fee); } if (_refund > 0) { @@ -53,47 +56,4 @@ contract ERC20Tornado is Tornado { } } } - - function _safeErc20TransferFrom( - address _from, - address _to, - uint256 _amount - ) internal { - (bool success, bytes memory data) = - token.call( - abi.encodeWithSelector( - 0x23b872dd, /* transferFrom */ - _from, - _to, - _amount - ) - ); - require(success, "not enough allowed tokens"); - - // if contract returns some data lets make sure that is `true` according to standard - if (data.length > 0) { - require(data.length == 32, "data length should be either 0 or 32 bytes"); - success = abi.decode(data, (bool)); - require(success, "not enough allowed tokens. Token returns false."); - } - } - - function _safeErc20Transfer(address _to, uint256 _amount) internal { - (bool success, bytes memory data) = - token.call( - abi.encodeWithSelector( - 0xa9059cbb, /* transfer */ - _to, - _amount - ) - ); - require(success, "not enough tokens"); - - // if contract returns some data lets make sure that is `true` according to standard - if (data.length > 0) { - require(data.length == 32, "data length should be either 0 or 32 bytes"); - success = abi.decode(data, (bool)); - require(success, "not enough tokens. Token returns false."); - } - } } diff --git a/contracts/cPool.sol b/contracts/cPool.sol index e7a2ab0..62d3376 100644 --- a/contracts/cPool.sol +++ b/contracts/cPool.sol @@ -12,28 +12,27 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; -interface IComptroller { - function claimComp(address holder) external; -} +import "./ERC20Tornado.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -interface IComptroller { - function transfer(address dst, uint rawAmount) external returns (bool); - function balanceOf(address owner) external; -} - -contract ERC20Tornado is Tornado { - IComptroller public comptroller; +contract cPool is ERC20Tornado { address public immutable governance = 0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce; - ICOMP public immutable COMP = 0xc00e94Cb662C3520282E6f5717214004A7f26888; + IERC20 public immutable comp; - constructor(IComptroller _comptroller, ICOMP _comp) public { - comptroller = _comptroller; - COMP = _comp; + constructor( + IERC20 _comp, + IVerifier _verifier, + IHasher _hasher, + uint256 _denomination, + uint32 _merkleTreeHeight, + IERC20 _token + ) ERC20Tornado(_verifier, _hasher, _denomination, _merkleTreeHeight, _token) public { + comp = _comp; } - function moveYeild() { - comp.claimComp(address(this)); - uint balance = COMP.balanceOf(address(this)); - COMP.transfer(governance, balance); + /// @dev Moves earned yield of the COMP token to the tornado governance contract + /// To make it work you may need to call `comptroller.claimComp(cPoolAddress)` before + function claimComp() external { + comp.transfer(governance, comp.balanceOf(address(this))); } }