@@ -38,11 +38,10 @@ interface IFlashLoan {
3838 ) external ;
3939}
4040
41-
4241contract RescueStrategy {
43- address immutable public rescueAccount;
44- address immutable public earnVault;
45- IERC20 immutable internal _asset;
42+ address public immutable rescueAccount;
43+ address public immutable earnVault;
44+ IERC20 internal immutable _asset;
4645
4746 bool internal rescueActive;
4847
@@ -51,13 +50,13 @@ contract RescueStrategy {
5150 _;
5251 }
5352
54- modifier rescueLock () {
53+ modifier rescueLock () {
5554 require (! rescueActive, "rescue ongoing " );
5655 _assertRescueMode ();
5756 rescueActive = true ;
58- _;
57+ _;
5958 rescueActive = false ;
60- }
59+ }
6160
6261 modifier onlyWhenRescueActive () {
6362 require (rescueActive, "vault operations are paused " );
@@ -71,59 +70,63 @@ contract RescueStrategy {
7170
7271 event Rescued (address indexed vault , uint256 assets );
7372
74- constructor (address _rescueAccount , address _earnVault ) {
75- rescueAccount = _rescueAccount;
76- earnVault = _earnVault;
77- _asset = IERC20 (IEulerEarn (earnVault).asset ());
78- }
73+ constructor (address _rescueAccount , address _earnVault ) {
74+ rescueAccount = _rescueAccount;
75+ earnVault = _earnVault;
76+ _asset = IERC20 (IEulerEarn (earnVault).asset ());
77+ }
7978
8079 // ---------------- VAULT INTERFACE --------------------
8180
82- function asset () external view returns (address ) {
81+ function asset () external view returns (address ) {
8382 return address (_asset);
8483 }
8584
8685 // will revert user deposits
87- function maxDeposit (address ) onlyAllowedEarnVault onlyWhenRescueActive external view returns (uint256 ) {
88- return type (uint256 ).max;
89- }
86+ function maxDeposit (address ) external view onlyAllowedEarnVault onlyWhenRescueActive returns (uint256 ) {
87+ return type (uint256 ).max;
88+ }
9089
9190 // will revert user withdrawals
92- function maxWithdraw (address ) onlyAllowedEarnVault onlyWhenRescueActive external view returns (uint256 ) {
93- return 0 ;
94- }
91+ function maxWithdraw (address ) external view onlyAllowedEarnVault onlyWhenRescueActive returns (uint256 ) {
92+ return 0 ;
93+ }
9594
96- function previewRedeem (uint256 ) external pure returns (uint256 ) {
97- return 0 ;
98- }
95+ function previewRedeem (uint256 ) external pure returns (uint256 ) {
96+ return 0 ;
97+ }
9998
10099 // this reverts acceptCaps to prevent reusing the whitelisted strategy on other vaults
101- function balanceOf (address ) onlyAllowedEarnVault external view returns (uint256 ) {
102- return 0 ;
103- }
104-
105- function deposit (uint256 amount , address ) onlyAllowedEarnVault onlyWhenRescueActive external returns (uint256 ) {
106- SafeERC20Permit2Lib.safeTransferFromWithPermit2 (
107- _asset,
108- msg .sender ,
109- address (this ),
110- amount,
111- IEulerEarn (earnVault).permit2Address ()
112- );
100+ function balanceOf (address ) external view onlyAllowedEarnVault returns (uint256 ) {
101+ return 0 ;
102+ }
103+
104+ function deposit (uint256 amount , address ) external onlyAllowedEarnVault onlyWhenRescueActive returns (uint256 ) {
105+ SafeERC20Permit2Lib.safeTransferFromWithPermit2 (
106+ _asset, msg .sender , address (this ), amount, IEulerEarn (earnVault).permit2Address ()
107+ );
113108
114109 return amount;
115- }
110+ }
116111
117112 // ---------------- RESCUE FUNCTIONS --------------------
118113
119114 // alternative sources of flashloan
120- function rescueEuler (uint256 loanAmount , uint256 loops , address flashLoanVault ) onlyRescueAccount rescueLock external {
115+ function rescueEuler (uint256 loanAmount , uint256 loops , address flashLoanVault )
116+ external
117+ onlyRescueAccount
118+ rescueLock
119+ {
121120 bytes memory data = abi.encode (loanAmount, loops, flashLoanVault);
122- IFlashLoan (flashLoanVault).flashLoan (loanAmount, data);
123- }
121+ IFlashLoan (flashLoanVault).flashLoan (loanAmount, data);
122+ }
124123
125124 // alternative sources of flashloan
126- function rescueEulerBatch (uint256 loanAmount , uint256 loops , address flashLoanVault ) onlyRescueAccount rescueLock external {
125+ function rescueEulerBatch (uint256 loanAmount , uint256 loops , address flashLoanVault )
126+ external
127+ onlyRescueAccount
128+ rescueLock
129+ {
127130 address evc = EVCUtil (earnVault).EVC ();
128131
129132 SafeERC20.forceApprove (_asset, flashLoanVault, loanAmount);
@@ -161,53 +164,51 @@ contract RescueStrategy {
161164 });
162165
163166 IEVC (evc).batch (batchItems);
164- }
167+ }
165168
166- function rescueAave (uint256 loanAmount , uint256 loops , address pool , address feeProvider ) onlyRescueAccount rescueLock external {
169+ function rescueAave (uint256 loanAmount , uint256 loops , address pool , address feeProvider )
170+ external
171+ onlyRescueAccount
172+ rescueLock
173+ {
167174 bytes memory data = abi.encode (loops, feeProvider);
168- IFlashLoan (pool).flashLoanSimple (address (this ), address (_asset), loanAmount, data, 0 );
169- }
175+ IFlashLoan (pool).flashLoanSimple (address (this ), address (_asset), loanAmount, data, 0 );
176+ }
170177
171178 // alternative sources of flashloan
172- function rescueMorpho (uint256 loanAmount , uint256 loops , address morpho ) onlyRescueAccount rescueLock external {
179+ function rescueMorpho (uint256 loanAmount , uint256 loops , address morpho ) external onlyRescueAccount rescueLock {
173180 IFlashLoan (morpho).flashLoan (address (_asset), loanAmount, abi.encode (loops));
174- }
181+ }
175182
176183 // ---------------- FLASHLOAN CALLBACKS --------------------
177184
178- function onBatchLoan (uint256 loanAmount , uint256 loops ) onlyWhenRescueActive external {
179- _processFlashLoan (loanAmount, loops);
180- }
185+ function onBatchLoan (uint256 loanAmount , uint256 loops ) external onlyWhenRescueActive {
186+ _processFlashLoan (loanAmount, loops);
187+ }
181188
182- function onFlashLoan (bytes memory data ) onlyWhenRescueActive external {
189+ function onFlashLoan (bytes memory data ) external onlyWhenRescueActive {
183190 (uint256 loanAmount , uint256 loops , address flashLoanSource ) = abi.decode (data, (uint256 , uint256 , address ));
184191
185- _processFlashLoan (loanAmount, loops);
192+ _processFlashLoan (loanAmount, loops);
186193
187194 // repay the flashloan
188- SafeERC20.safeTransfer (
189- _asset,
190- flashLoanSource,
191- loanAmount
192- );
193- }
194-
195- function onMorphoFlashLoan (uint256 amount , bytes memory data ) onlyWhenRescueActive external {
195+ SafeERC20.safeTransfer (_asset, flashLoanSource, loanAmount);
196+ }
197+
198+ function onMorphoFlashLoan (uint256 amount , bytes memory data ) external onlyWhenRescueActive {
196199 uint256 loops = abi.decode (data, (uint256 ));
197200
198- _processFlashLoan (amount, loops);
201+ _processFlashLoan (amount, loops);
199202
200203 SafeERC20.forceApprove (_asset, msg .sender , amount);
201- }
204+ }
202205
203206 // aave callback
204- function executeOperation (
205- address ,
206- uint256 amount ,
207- uint256 premium ,
208- address ,
209- bytes calldata data
210- ) onlyWhenRescueActive external returns (bool ) {
207+ function executeOperation (address , uint256 amount , uint256 premium , address , bytes calldata data )
208+ external
209+ onlyWhenRescueActive
210+ returns (bool )
211+ {
211212 (uint256 loops , address feeProvider ) = abi.decode (data, (uint256 , address ));
212213 SafeERC20.safeTransferFrom (_asset, feeProvider, address (this ), premium);
213214
@@ -220,29 +221,25 @@ contract RescueStrategy {
220221 // ---------------- HELPERS AND INTERNAL --------------------
221222
222223 // The contract is not supposed to hold any value, but in case of any issues rescue account can exec arbitrary call
223- function call (address target , bytes memory payload ) onlyRescueAccount external {
224- (bool success ,) = target.call (payload);
225- require (success, "call failed " );
226- }
224+ function call (address target , bytes memory payload ) external onlyRescueAccount {
225+ (bool success ,) = target.call (payload);
226+ require (success, "call failed " );
227+ }
227228
228- fallback () external {
229- revert ("vault operations are paused " );
230- }
229+ fallback () external {
230+ revert ("vault operations are paused " );
231+ }
231232
232233 function _processFlashLoan (uint256 loanAmount , uint256 loops ) internal {
233- SafeERC20Permit2Lib.forceApproveMaxWithPermit2 (
234- _asset,
235- earnVault,
236- address (0 )
237- );
238-
239- // deposit to earn, create shares. Assets will come back here if the strategy is first in supply queue
240- for (uint256 i = 0 ; i < loops; i++ ) {
234+ SafeERC20Permit2Lib.forceApproveMaxWithPermit2 (_asset, earnVault, address (0 ));
235+
236+ // deposit to earn, create shares. Assets will come back here if the strategy is first in supply queue
237+ for (uint256 i = 0 ; i < loops; i++ ) {
241238 IERC4626 (earnVault).deposit (loanAmount, address (this ));
242239 }
243240
244241 // withdraw as much as possible to the receiver
245- uint256 rescuedAmount = IERC4626 (earnVault).maxWithdraw (address (this ));
242+ uint256 rescuedAmount = IERC4626 (earnVault).maxWithdraw (address (this ));
246243 IERC4626 (earnVault).withdraw (rescuedAmount, rescueAccount, address (this ));
247244
248245 // send the remaining shares to the receiver
0 commit comments