@@ -9,6 +9,11 @@ import {ICreditManagerV3} from "@gearbox-protocol/core-v3/contracts/interfaces/I
99import {ACLNonReentrantTrait} from "@gearbox-protocol/core-v3/contracts/traits/ACLNonReentrantTrait.sol " ;
1010import {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