Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pause contracts #311

Merged
merged 11 commits into from
Jul 26, 2021
2 changes: 2 additions & 0 deletions contracts/core/State.sol
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,8 @@ contract State is Objects, ReentrancyGuard, Ownable {
mapping(address => EnumerableAddressSet.AddressSet) internal affiliatesReferrerTokensList; // addresses of tokens in which commissions were paid to referrers
mapping(address => mapping(address => uint256)) public affiliatesReferrerBalances; // [referrerAddress][tokenAddress] is a referrer's token balance of accrued fees

bool public pause; //Flag to pause all protocol modules

/**
* @notice Add signature and target to storage.
* */
Expand Down
2 changes: 2 additions & 0 deletions contracts/events/ProtocolSettingsEvents.sol
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,6 @@ contract ProtocolSettingsEvents {
event SetSOVTokenAddress(address indexed sender, address indexed oldTokenAddress, address indexed newTokenAddress);

event SetLockedSOVAddress(address indexed sender, address indexed oldAddress, address indexed newAddress);

event TogglePaused(address indexed sender, bool indexed oldFlag, bool indexed newFlag);
}
2 changes: 2 additions & 0 deletions contracts/interfaces/ISovryn.sol
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ contract ISovryn is

function setRebatePercent(uint256 rebatePercent) external;

function togglePaused(bool paused) external;

////// Loan Settings //////

function setupLoanParams(LoanParams[] calldata loanParamsList) external returns (bytes32[] memory loanParamsIdList);
Expand Down
11 changes: 6 additions & 5 deletions contracts/modules/Affiliates.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ import "../openzeppelin/SafeERC20.sol";
import "../events/AffiliatesEvents.sol";
import "../feeds/IPriceFeeds.sol";
import "../locked/ILockedSOV.sol";
import "./ModuleCommonFunctionalities.sol";

contract Affiliates is State, AffiliatesEvents {
contract Affiliates is State, AffiliatesEvents, ModuleCommonFunctionalities {
/*
Module: Affiliates upgradable
Storage: from State, functions called from Protocol by delegatecall
Expand Down Expand Up @@ -61,7 +62,7 @@ contract Affiliates is State, AffiliatesEvents {
bool userNotFirstTradeFlag;
}

function setAffiliatesReferrer(address user, address referrer) external onlyCallableByLoanPools {
function setAffiliatesReferrer(address user, address referrer) external onlyCallableByLoanPools whenNotPaused {
SetAffiliatesReferrerResult memory result;

result.userNotFirstTradeFlag = getUserNotFirstTradeFlag(user);
Expand Down Expand Up @@ -146,7 +147,7 @@ contract Affiliates is State, AffiliatesEvents {
address trader,
address token,
uint256 tradingFeeTokenBaseAmount
) external onlyCallableInternal returns (uint256 referrerBonusSovAmount, uint256 referrerBonusTokenAmount) {
) external onlyCallableInternal whenNotPaused returns (uint256 referrerBonusSovAmount, uint256 referrerBonusTokenAmount) {
bool isHeld = referralsList[referrer].length() < getMinReferralsToPayout();
bool bonusPaymentIsSuccess = true;
uint256 paidReferrerBonusSovAmount;
Expand Down Expand Up @@ -209,7 +210,7 @@ contract Affiliates is State, AffiliatesEvents {
address token,
address receiver,
uint256 amount
) public {
) public whenNotPaused {
require(receiver != address(0), "Affiliates: cannot withdraw to zero address");
address referrer = msg.sender;
uint256 referrerTokenBalance = affiliatesReferrerBalances[referrer][token];
Expand All @@ -232,7 +233,7 @@ contract Affiliates is State, AffiliatesEvents {
emit WithdrawAffiliatesReferrerTokenFees(referrer, receiver, token, withdrawAmount);
}

function withdrawAllAffiliatesReferrerTokenFees(address receiver) external {
function withdrawAllAffiliatesReferrerTokenFees(address receiver) external whenNotPaused {
require(receiver != address(0), "Affiliates: cannot withdraw to zero address");
address referrer = msg.sender;

Expand Down
14 changes: 12 additions & 2 deletions contracts/modules/LoanClosingsBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import "../mixins/LiquidationHelper.sol";
import "../swaps/SwapsUser.sol";
import "../interfaces/ILoanPool.sol";
import "../mixins/RewardHelper.sol";
import "./ModuleCommonFunctionalities.sol";

/**
* @title LoanClosingsBase contract.
Expand All @@ -22,7 +23,15 @@ import "../mixins/RewardHelper.sol";
*
* Loans are liquidated if the position goes below margin maintenance.
* */
contract LoanClosingsBase is LoanClosingsEvents, VaultController, InterestUser, SwapsUser, LiquidationHelper, RewardHelper {
contract LoanClosingsBase is
LoanClosingsEvents,
VaultController,
InterestUser,
SwapsUser,
LiquidationHelper,
RewardHelper,
ModuleCommonFunctionalities
{
uint256 internal constant MONTH = 365 days / 12;
//0.00001 BTC, would be nicer in State.sol, but would require a redeploy of the complete protocol, so adding it here instead
//because it's not shared state anyway and only used by this contract
Expand Down Expand Up @@ -73,6 +82,7 @@ contract LoanClosingsBase is LoanClosingsEvents, VaultController, InterestUser,
external
payable
nonReentrant
whenNotPaused
returns (
uint256 loanCloseAmount,
uint256 seizedAmount,
Expand Down Expand Up @@ -107,7 +117,7 @@ contract LoanClosingsBase is LoanClosingsEvents, VaultController, InterestUser,
function rollover(
bytes32 loanId,
bytes calldata // for future use /*loanDataBytes*/
) external nonReentrant {
) external nonReentrant whenNotPaused {
// restrict to EOAs to prevent griefing attacks, during interest rate recalculation
require(msg.sender == tx.origin, "only EOAs can call");

Expand Down
6 changes: 5 additions & 1 deletion contracts/modules/LoanClosingsWith.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import "../mixins/LiquidationHelper.sol";
import "../swaps/SwapsUser.sol";
import "../interfaces/ILoanPool.sol";
import "../mixins/RewardHelper.sol";
import "./ModuleCommonFunctionalities.sol";

/**
* @title LoanClosingsWith contract.
Expand All @@ -28,7 +29,8 @@ contract LoanClosingsWith is
VaultController,
InterestUser,
SwapsUser, /*LiquidationHelper,*/
RewardHelper
RewardHelper,
ModuleCommonFunctionalities
{
//0.00001 BTC, would be nicer in State.sol, but would require a redeploy of the complete protocol, so adding it here instead
//because it's not shared state anyway and only used by this contract
Expand Down Expand Up @@ -71,6 +73,7 @@ contract LoanClosingsWith is
public
payable
nonReentrant
whenNotPaused
returns (
uint256 loanCloseAmount,
uint256 withdrawAmount,
Expand Down Expand Up @@ -109,6 +112,7 @@ contract LoanClosingsWith is
)
public
nonReentrant
whenNotPaused
returns (
uint256 loanCloseAmount,
uint256 withdrawAmount,
Expand Down
21 changes: 15 additions & 6 deletions contracts/modules/LoanMaintenance.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import "../mixins/VaultController.sol";
import "../mixins/InterestUser.sol";
import "../mixins/LiquidationHelper.sol";
import "../swaps/SwapsUser.sol";
import "./ModuleCommonFunctionalities.sol";

/**
* @title Loan Maintenance contract.
Expand All @@ -23,7 +24,15 @@ import "../swaps/SwapsUser.sol";
* This contract contains functions to query loan data and to modify its status
* by withdrawing or depositing collateral.
* */
contract LoanMaintenance is LoanOpeningsEvents, LoanMaintenanceEvents, VaultController, InterestUser, SwapsUser, LiquidationHelper {
contract LoanMaintenance is
LoanOpeningsEvents,
LoanMaintenanceEvents,
VaultController,
InterestUser,
SwapsUser,
LiquidationHelper,
ModuleCommonFunctionalities
{
struct LoanReturnData {
bytes32 loanId;
address loanToken;
Expand Down Expand Up @@ -83,7 +92,7 @@ contract LoanMaintenance is LoanOpeningsEvents, LoanMaintenanceEvents, VaultCont
function depositCollateral(
bytes32 loanId,
uint256 depositAmount /// must match msg.value if ether is sent
) external payable nonReentrant {
) external payable nonReentrant whenNotPaused {
require(depositAmount != 0, "depositAmount is 0");
Loan storage loanLocal = loans[loanId];
LoanParams storage loanParamsLocal = loanParams[loanLocal.loanParamsId];
Expand Down Expand Up @@ -118,7 +127,7 @@ contract LoanMaintenance is LoanOpeningsEvents, LoanMaintenanceEvents, VaultCont
bytes32 loanId,
address receiver,
uint256 withdrawAmount
) external nonReentrant returns (uint256 actualWithdrawAmount) {
) external nonReentrant whenNotPaused returns (uint256 actualWithdrawAmount) {
require(withdrawAmount != 0, "withdrawAmount is 0");
Loan storage loanLocal = loans[loanId];
LoanParams storage loanParamsLocal = loanParams[loanLocal.loanParamsId];
Expand Down Expand Up @@ -157,7 +166,7 @@ contract LoanMaintenance is LoanOpeningsEvents, LoanMaintenanceEvents, VaultCont
*
* @param loanToken The loan token address.
* */
function withdrawAccruedInterest(address loanToken) external {
function withdrawAccruedInterest(address loanToken) external whenNotPaused {
/// Pay outstanding interest to lender.
_payInterest(
msg.sender, /// Lender.
Expand All @@ -181,7 +190,7 @@ contract LoanMaintenance is LoanOpeningsEvents, LoanMaintenanceEvents, VaultCont
uint256 depositAmount,
bool useCollateral,
bytes calldata /// loanDataBytes, for future use.
) external payable nonReentrant returns (uint256 secondsExtended) {
) external payable nonReentrant whenNotPaused returns (uint256 secondsExtended) {
require(depositAmount != 0, "depositAmount is 0");
Loan storage loanLocal = loans[loanId];
LoanParams storage loanParamsLocal = loanParams[loanLocal.loanParamsId];
Expand Down Expand Up @@ -259,7 +268,7 @@ contract LoanMaintenance is LoanOpeningsEvents, LoanMaintenanceEvents, VaultCont
bytes32 loanId,
address receiver,
uint256 withdrawAmount
) external nonReentrant returns (uint256 secondsReduced) {
) external nonReentrant whenNotPaused returns (uint256 secondsReduced) {
require(withdrawAmount != 0, "withdrawAmount is 0");
Loan storage loanLocal = loans[loanId];
LoanParams storage loanParamsLocal = loanParams[loanLocal.loanParamsId];
Expand Down
7 changes: 4 additions & 3 deletions contracts/modules/LoanOpenings.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import "../events/LoanOpeningsEvents.sol";
import "../mixins/VaultController.sol";
import "../mixins/InterestUser.sol";
import "../swaps/SwapsUser.sol";
import "./ModuleCommonFunctionalities.sol";

/**
* @title Loan Openings contract.
Expand All @@ -20,7 +21,7 @@ import "../swaps/SwapsUser.sol";
*
* This contract contains functions to borrow and trade.
* */
contract LoanOpenings is LoanOpeningsEvents, VaultController, InterestUser, SwapsUser {
contract LoanOpenings is LoanOpeningsEvents, VaultController, InterestUser, SwapsUser, ModuleCommonFunctionalities {
constructor() public {}

/**
Expand Down Expand Up @@ -79,7 +80,7 @@ contract LoanOpenings is LoanOpeningsEvents, VaultController, InterestUser, Swap
address[4] calldata sentAddresses,
uint256[5] calldata sentValues,
bytes calldata loanDataBytes
) external payable nonReentrant returns (uint256 newPrincipal, uint256 newCollateral) {
) external payable nonReentrant whenNotPaused returns (uint256 newPrincipal, uint256 newCollateral) {
require(msg.value == 0 || loanDataBytes.length != 0, "loanDataBytes required with ether");

/// Only callable by loan pools.
Expand Down Expand Up @@ -119,7 +120,7 @@ contract LoanOpenings is LoanOpeningsEvents, VaultController, InterestUser, Swap
bytes32 loanId,
address delegated,
bool toggle
) external {
) external whenNotPaused {
require(loans[loanId].borrower == msg.sender, "unauthorized");

_setDelegatedManager(loanId, msg.sender, delegated, toggle);
Expand Down
7 changes: 4 additions & 3 deletions contracts/modules/LoanSettings.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pragma experimental ABIEncoderV2;

import "../core/State.sol";
import "../events/LoanSettingsEvents.sol";
import "./ModuleCommonFunctionalities.sol";

/**
* @title Loan Settings contract.
Expand All @@ -17,7 +18,7 @@ import "../events/LoanSettingsEvents.sol";
*
* This contract contains functions to get and set loan parameters.
* */
contract LoanSettings is State, LoanSettingsEvents {
contract LoanSettings is State, LoanSettingsEvents, ModuleCommonFunctionalities {
/**
* @notice Empty public constructor.
* */
Expand Down Expand Up @@ -53,7 +54,7 @@ contract LoanSettings is State, LoanSettingsEvents {
*
* @return loanParamsIdList The array of loan parameters IDs.
* */
function setupLoanParams(LoanParams[] calldata loanParamsList) external returns (bytes32[] memory loanParamsIdList) {
function setupLoanParams(LoanParams[] calldata loanParamsList) external whenNotPaused returns (bytes32[] memory loanParamsIdList) {
loanParamsIdList = new bytes32[](loanParamsList.length);
for (uint256 i = 0; i < loanParamsList.length; i++) {
loanParamsIdList[i] = _setupLoanParams(loanParamsList[i]);
Expand All @@ -66,7 +67,7 @@ contract LoanSettings is State, LoanSettingsEvents {
*
* @param loanParamsIdList The array of loan parameters IDs to deactivate.
* */
function disableLoanParams(bytes32[] calldata loanParamsIdList) external {
function disableLoanParams(bytes32[] calldata loanParamsIdList) external whenNotPaused {
for (uint256 i = 0; i < loanParamsIdList.length; i++) {
require(msg.sender == loanParams[loanParamsIdList[i]].owner, "unauthorized owner");
loanParams[loanParamsIdList[i]].active = false;
Expand Down
10 changes: 10 additions & 0 deletions contracts/modules/ModuleCommonFunctionalities.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
pragma solidity 0.5.17;

import "../core/State.sol";

contract ModuleCommonFunctionalities is State {
modifier whenNotPaused() {
require(!pause, "Paused");
_;
}
}
Loading