Merge pull request #2 from InstaDApp/fix-pausable

fixed ERC20Pausable and added ReentrancyGuard
This commit is contained in:
Lecky Lao 2020-08-26 02:11:09 +10:00 committed by GitHub
commit 8bde5a5d0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 168 additions and 175 deletions

View File

@ -1,3 +1,4 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.8; pragma solidity ^0.6.8;
interface IProxy { interface IProxy {

View File

@ -2,13 +2,12 @@
pragma solidity ^0.6.8; pragma solidity ^0.6.8;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Pausable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import { DSMath } from "./libs/safeMath.sol"; import { DSMath } from "./libs/safeMath.sol";
// TODO - Add ReentrancyGuard lib
interface AccountInterface { interface AccountInterface {
function enable(address authority) external; function enable(address authority) external;
function cast(address[] calldata _targets, bytes[] calldata _datas, address _origin) external payable; function cast(address[] calldata _targets, bytes[] calldata _datas, address _origin) external payable;
@ -30,7 +29,7 @@ interface RateInterface {
function getTotalToken() external returns (uint totalUnderlyingTkn); function getTotalToken() external returns (uint totalUnderlyingTkn);
} }
contract PoolToken is ERC20, DSMath { contract PoolToken is ReentrancyGuard, ERC20Pausable, DSMath {
event LogDeploy(uint amount); event LogDeploy(uint amount);
event LogExchangeRate(uint exchangeRate, uint tokenBalance, uint insuranceAmt); event LogExchangeRate(uint exchangeRate, uint tokenBalance, uint insuranceAmt);
event LogSettle(uint settleTime); event LogSettle(uint settleTime);
@ -39,16 +38,14 @@ contract PoolToken is ERC20, DSMath {
event LogAddInsurance(uint amount); event LogAddInsurance(uint amount);
event LogPausePool(bool); event LogPausePool(bool);
// IERC20 public immutable baseToken;
RegistryInterface public immutable registry; // Pool Registry RegistryInterface public immutable registry; // Pool Registry
IndexInterface public constant instaIndex = IndexInterface(0x2971AdFa57b20E5a416aE5a708A8655A9c74f723); IndexInterface public constant instaIndex = IndexInterface(0x2971AdFa57b20E5a416aE5a708A8655A9c74f723);
AccountInterface public immutable dsa; // Pool's DSA account AccountInterface public immutable dsa; // Pool's DSA account
IERC20 public immutable baseToken; // Base token. Eg:- DAI, USDC, etc. IERC20 public immutable baseToken; // Base token.
uint private tokenBalance; // total token balance since last rebalancing uint private tokenBalance; // total token balance since last rebalancing
uint public exchangeRate = 10 ** 18; // initial 1 token = 1 uint public exchangeRate = 10 ** 18; // initial 1 token = 1
uint public insuranceAmt; // insurance amount to keep pool safe uint public insuranceAmt; // insurance amount to keep pool safe
bool public pausePool; // shutdown deposits and withdrawals
constructor( constructor(
address _registry, address _registry,
@ -103,8 +100,7 @@ contract PoolToken is ERC20, DSMath {
emit LogSettle(block.timestamp); emit LogSettle(block.timestamp);
} }
function deposit(uint tknAmt) public payable returns(uint) { function deposit(uint tknAmt) public whenNotPaused payable returns(uint) {
require(!pausePool, "pool-shut");
require(tknAmt == msg.value, "unmatched-amount"); require(tknAmt == msg.value, "unmatched-amount");
uint _newTokenBal = add(tokenBalance, msg.value); uint _newTokenBal = add(tokenBalance, msg.value);
require(_newTokenBal <= registry.poolCap(address(this)), "deposit-cap-reached"); require(_newTokenBal <= registry.poolCap(address(this)), "deposit-cap-reached");
@ -115,8 +111,7 @@ contract PoolToken is ERC20, DSMath {
emit LogDeposit(tknAmt, _mintAmt); emit LogDeposit(tknAmt, _mintAmt);
} }
function withdraw(uint tknAmt, address to) external returns (uint _tknAmt) { function withdraw(uint tknAmt, address to) external nonReentrant whenNotPaused returns (uint _tknAmt) {
require(!pausePool, "pool-shut");
uint poolBal = address(this).balance; uint poolBal = address(this).balance;
require(tknAmt <= poolBal, "not-enough-liquidity-available"); require(tknAmt <= poolBal, "not-enough-liquidity-available");
uint _bal = balanceOf(msg.sender); uint _bal = balanceOf(msg.sender);
@ -133,7 +128,7 @@ contract PoolToken is ERC20, DSMath {
_burn(msg.sender, _burnAmt); _burn(msg.sender, _burnAmt);
payable(to).transfer(_tknAmt); // TODO - if this is also Reentrancy prone attack or not. payable(to).transfer(_tknAmt);
emit LogWithdraw(tknAmt, _burnAmt); emit LogWithdraw(tknAmt, _burnAmt);
} }
@ -146,8 +141,7 @@ contract PoolToken is ERC20, DSMath {
function shutdown() external { function shutdown() external {
require(msg.sender == instaIndex.master(), "not-master"); require(msg.sender == instaIndex.master(), "not-master");
pausePool = !pausePool; paused() ? _unpause() : _pause();
emit LogPausePool(pausePool);
} }
receive() external payable {} receive() external payable {}

View File

@ -1,3 +1,4 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.8; pragma solidity ^0.6.8;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;

View File

@ -2,9 +2,9 @@
pragma solidity ^0.6.8; pragma solidity ^0.6.8;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Pausable.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20Pausable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import { DSMath } from "./libs/safeMath.sol"; import { DSMath } from "./libs/safeMath.sol";
@ -29,7 +29,7 @@ interface RateInterface {
function getTotalToken() external returns (uint totalUnderlyingTkn); function getTotalToken() external returns (uint totalUnderlyingTkn);
} }
contract PoolToken is DSMath, ERC20, ERC20Pausable { contract PoolToken is ReentrancyGuard, DSMath, ERC20Pausable {
using SafeERC20 for IERC20; using SafeERC20 for IERC20;
event LogDeploy(uint amount); event LogDeploy(uint amount);
@ -48,7 +48,6 @@ contract PoolToken is DSMath, ERC20, ERC20Pausable {
uint private tokenBalance; // total token balance since last rebalancing uint private tokenBalance; // total token balance since last rebalancing
uint public exchangeRate = 10 ** 18; // initial 1 token = 1 uint public exchangeRate = 10 ** 18; // initial 1 token = 1
uint public insuranceAmt; // insurance amount to keep pool safe uint public insuranceAmt; // insurance amount to keep pool safe
bool public pausePool; // shutdown deposits and withdrawals
constructor( constructor(
address _registry, address _registry,
@ -102,8 +101,7 @@ contract PoolToken is DSMath, ERC20, ERC20Pausable {
emit LogSettle(block.timestamp); emit LogSettle(block.timestamp);
} }
function deposit(uint tknAmt) external payable returns(uint) { function deposit(uint tknAmt) external whenNotPaused payable returns(uint) {
require(!pausePool, "pool-shut");
uint _newTokenBal = add(tokenBalance, tknAmt); uint _newTokenBal = add(tokenBalance, tknAmt);
require(_newTokenBal <= registry.poolCap(address(this)), "deposit-cap-reached"); require(_newTokenBal <= registry.poolCap(address(this)), "deposit-cap-reached");
@ -114,8 +112,7 @@ contract PoolToken is DSMath, ERC20, ERC20Pausable {
emit LogDeposit(tknAmt, _mintAmt); emit LogDeposit(tknAmt, _mintAmt);
} }
function withdraw(uint tknAmt, address to) external returns (uint _tknAmt) { function withdraw(uint tknAmt, address to) external nonReentrant whenNotPaused returns (uint _tknAmt) {
require(!pausePool, "pool-shut");
uint poolBal = baseToken.balanceOf(address(this)); uint poolBal = baseToken.balanceOf(address(this));
require(tknAmt <= poolBal, "not-enough-liquidity-available"); require(tknAmt <= poolBal, "not-enough-liquidity-available");
uint _bal = balanceOf(msg.sender); uint _bal = balanceOf(msg.sender);