Skip to content

Commit b0bd455

Browse files
committed
feat: add unpauseAll for MultiPause contract
1 parent 64d4573 commit b0bd455

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

contracts/emergency/MultiPause.sol

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import {ICreditManagerV3} from "@gearbox-protocol/core-v3/contracts/interfaces/I
99
import {ACLNonReentrantTrait} from "@gearbox-protocol/core-v3/contracts/traits/ACLNonReentrantTrait.sol";
1010
import {ContractsRegisterTrait} from "@gearbox-protocol/core-v3/contracts/traits/ContractsRegisterTrait.sol";
1111

12+
enum PausableAction {
13+
Pause,
14+
Unpause
15+
}
16+
1217
/// @title MultiPause
1318
/// @author Gearbox Foundation
1419
/// @notice Allows pausable admins to pause multiple contracts in a single transaction
@@ -23,39 +28,47 @@ contract MultiPause is ACLNonReentrantTrait, ContractsRegisterTrait {
2328
/// @dev Ignores contracts that are already paused
2429
/// @dev Reverts if caller is not a pausable admin
2530
function pauseContracts(address[] memory contracts) external pausableAdminsOnly {
26-
_pauseContracts(contracts);
31+
_pauseContracts(contracts, PausableAction.Pause);
2732
}
2833

2934
/// @notice Pauses all registered pools
3035
/// @dev Ignores contracts that are already paused
3136
/// @dev Reverts if caller is not a pausable admin
3237
function pauseAllPools() external pausableAdminsOnly {
33-
_pauseAllPools();
38+
_pauseAllPools(PausableAction.Pause);
3439
}
3540

3641
/// @notice Pauses all registered credit managers
3742
/// @dev For V3, credit facades are paused instead
3843
/// @dev Ignores contracts that are already paused
3944
/// @dev Reverts if caller is not a pausable admin
4045
function pauseAllCreditManagers() external pausableAdminsOnly {
41-
_pauseAllCreditManagers();
46+
_pauseAllCreditManagers(PausableAction.Pause);
4247
}
4348

4449
/// @notice Pauses all registered credit managers and pools
4550
/// @dev Ignores contracts that are already paused
4651
/// @dev Reverts if caller is not a pausable admin
4752
function pauseAllContracts() external pausableAdminsOnly {
48-
_pauseAllPools();
49-
_pauseAllCreditManagers();
53+
_pauseAllPools(PausableAction.Pause);
54+
_pauseAllCreditManagers(PausableAction.Pause);
55+
}
56+
57+
/// @notice Unpauses all registered credit managers and pools
58+
/// @dev Ignores contracts that aren't paused
59+
/// @dev Reverts if caller is not a unpausable admin
60+
function unpauseAllContracts() external unpausableAdminsOnly {
61+
_pauseAllPools(PausableAction.Unpause);
62+
_pauseAllCreditManagers(PausableAction.Unpause);
5063
}
5164

5265
/// @dev Internal function to pause all pools
53-
function _pauseAllPools() internal {
54-
_pauseContracts(IContractsRegister(contractsRegister).getPools());
66+
function _pauseAllPools(PausableAction action) internal {
67+
_pauseContracts(IContractsRegister(contractsRegister).getPools(), action);
5568
}
5669

5770
/// @dev Internal function to pause all credit managers
58-
function _pauseAllCreditManagers() internal {
71+
function _pauseAllCreditManagers(PausableAction action) internal {
5972
address[] memory contracts = IContractsRegister(contractsRegister).getCreditManagers();
6073
uint256 len = contracts.length;
6174
unchecked {
@@ -64,16 +77,21 @@ contract MultiPause is ACLNonReentrantTrait, ContractsRegisterTrait {
6477
contracts[i] = ICreditManagerV3(contracts[i]).creditFacade();
6578
}
6679
}
67-
_pauseContracts(contracts);
80+
_pauseContracts(contracts, action);
6881
}
6982

70-
/// @dev Internal function to pause contracts from the given list
71-
function _pauseContracts(address[] memory contracts) internal {
83+
/// @dev Internal function to pause/unpause contracts from the given list
84+
function _pauseContracts(address[] memory contracts, PausableAction action) internal {
7285
uint256 len = contracts.length;
7386
unchecked {
7487
for (uint256 i; i < len; ++i) {
75-
if (ACLNonReentrantTrait(contracts[i]).paused()) continue;
76-
ACLNonReentrantTrait(contracts[i]).pause();
88+
if (action == PausableAction.Pause) {
89+
if (ACLNonReentrantTrait(contracts[i]).paused()) continue;
90+
ACLNonReentrantTrait(contracts[i]).pause();
91+
} else {
92+
if (!ACLNonReentrantTrait(contracts[i]).paused()) continue;
93+
ACLNonReentrantTrait(contracts[i]).unpause();
94+
}
7795
}
7896
}
7997
}

0 commit comments

Comments
 (0)