@@ -136,9 +136,9 @@ contract Ladle is LadleStorage, AccessControl() {
136136 (cachedId, vault) = (vaultId, _build (vaultId, seriesId, ilkId)); // Cache the vault that was just built
137137
138138 } else if (operation == Operation.FORWARD_PERMIT) {
139- (bytes6 id , bool asset , address spender , uint256 amount , uint256 deadline , uint8 v , bytes32 r , bytes32 s ) =
139+ (bytes6 id , bool isAsset , address spender , uint256 amount , uint256 deadline , uint8 v , bytes32 r , bytes32 s ) =
140140 abi.decode (data[i], (bytes6 , bool , address , uint256 , uint256 , uint8 , bytes32 , bytes32 ));
141- _forwardPermit (id, asset , spender, amount, deadline, v, r, s);
141+ _forwardPermit (id, isAsset , spender, amount, deadline, v, r, s);
142142
143143 } else if (operation == Operation.JOIN_ETHER) {
144144 (bytes6 etherId ) = abi.decode (data[i], (bytes6 ));
@@ -160,9 +160,9 @@ contract Ladle is LadleStorage, AccessControl() {
160160 (vault,) = _roll (vaultId, vault, newSeriesId, loan, max);
161161
162162 } else if (operation == Operation.FORWARD_DAI_PERMIT) {
163- (bytes6 id , bool asset , address spender , uint256 nonce , uint256 deadline , bool allowed , uint8 v , bytes32 r , bytes32 s ) =
163+ (bytes6 id , bool isAsset , address spender , uint256 nonce , uint256 deadline , bool allowed , uint8 v , bytes32 r , bytes32 s ) =
164164 abi.decode (data[i], (bytes6 , bool , address , uint256 , uint256 , bool , uint8 , bytes32 , bytes32 ));
165- _forwardDaiPermit (id, asset , spender, nonce, deadline, allowed, v, r, s);
165+ _forwardDaiPermit (id, isAsset , spender, nonce, deadline, allowed, v, r, s);
166166
167167 } else if (operation == Operation.TRANSFER_TO_POOL) {
168168 (bytes6 seriesId , bool base , uint128 wad ) =
@@ -195,10 +195,14 @@ contract Ladle is LadleStorage, AccessControl() {
195195 if (cachedId != vaultId) (cachedId, vault) = (vaultId, getOwnedVault (vaultId));
196196 _repayVault (vaultId, vault, to, ink, max);
197197
198- } else if (operation == Operation.REMOVE_REPAY ) {
199- (bytes12 vaultId , address to , uint128 minBaseOut , uint128 minFYTokenOut ) = abi.decode (data[i], (bytes12 , address , uint128 , uint128 ));
198+ } else if (operation == Operation.REPAY_LADLE ) {
199+ (bytes12 vaultId ) = abi.decode (data[i], (bytes12 ));
200200 if (cachedId != vaultId) (cachedId, vault) = (vaultId, getOwnedVault (vaultId));
201- _removeAndRepay (vaultId, vault, to, minBaseOut, minFYTokenOut);
201+ _repayLadle (vaultId, vault);
202+
203+ } else if (operation == Operation.RETRIEVE) {
204+ (bytes6 assetId , bool isAsset , address to ) = abi.decode (data[i], (bytes6 , bool , address ));
205+ _retrieve (assetId, isAsset, to);
202206
203207 } else if (operation == Operation.TRANSFER_TO_FYTOKEN) {
204208 (bytes6 seriesId , uint256 amount ) = abi.decode (data[i], (bytes6 , uint256 ));
@@ -289,6 +293,7 @@ contract Ladle is LadleStorage, AccessControl() {
289293
290294 /// @dev Add collateral and borrow from vault, pull assets from and push borrowed asset to user
291295 /// Or, repay to vault and remove collateral, pull borrowed asset from and push assets to user
296+ /// Borrow only before maturity.
292297 function _pour (bytes12 vaultId , DataTypes.Vault memory vault , address to , int128 ink , int128 art )
293298 private
294299 returns (DataTypes.Balances memory balances )
@@ -318,6 +323,7 @@ contract Ladle is LadleStorage, AccessControl() {
318323
319324 /// @dev Add collateral and borrow from vault, so that a precise amount of base is obtained by the user.
320325 /// The base is obtained by borrowing fyToken and buying base with it in a pool.
326+ /// Only before maturity.
321327 function _serve (bytes12 vaultId , DataTypes.Vault memory vault , address to , uint128 ink , uint128 base , uint128 max )
322328 private
323329 returns (DataTypes.Balances memory balances , uint128 art )
@@ -373,6 +379,7 @@ contract Ladle is LadleStorage, AccessControl() {
373379
374380 /// @dev Repay debt by selling base in a pool and using the resulting fyToken
375381 /// The base tokens need to be already in the pool, unaccounted for.
382+ /// Only before maturity. After maturity use close.
376383 function _repay (bytes12 vaultId , DataTypes.Vault memory vault , address to , int128 ink , uint128 min )
377384 private
378385 returns (DataTypes.Balances memory balances , uint128 art )
@@ -386,6 +393,7 @@ contract Ladle is LadleStorage, AccessControl() {
386393
387394 /// @dev Repay all debt in a vault by buying fyToken from a pool with base.
388395 /// The base tokens need to be already in the pool, unaccounted for. The surplus base will be returned to msg.sender.
396+ /// Only before maturity. After maturity use close.
389397 function _repayVault (bytes12 vaultId , DataTypes.Vault memory vault , address to , int128 ink , uint128 max )
390398 private
391399 returns (DataTypes.Balances memory balances , uint128 base )
@@ -435,7 +443,8 @@ contract Ladle is LadleStorage, AccessControl() {
435443
436444 /// @dev Remove liquidity in a pool and use proceedings to repay debt
437445 /// The liquidity tokens need to be already in the pool, unaccounted for.
438- function _removeAndRepay (bytes12 vaultId , DataTypes.Vault memory vault , address to , uint128 minBaseOut , uint128 minFYTokenOut )
446+ /// Only before maturity. TODO: After maturity
447+ /* function _removeAndRepay(bytes12 vaultId, DataTypes.Vault memory vault, address to, uint128 minBaseOut, uint128 minFYTokenOut)
439448 private
440449 returns (DataTypes.Balances memory balances)
441450 {
@@ -462,6 +471,34 @@ contract Ladle is LadleStorage, AccessControl() {
462471 IERC20 fyToken = IERC20(address(series.fyToken));
463472 fyToken.safeTransfer(to, art - repayment);
464473 }
474+ } */
475+
476+ // ---- Ladle as a token holder ----
477+
478+ /// @dev Use fyToken in the Ladle to repay debt.
479+ function _repayLadle (bytes12 vaultId , DataTypes.Vault memory vault )
480+ private
481+ returns (DataTypes.Balances memory balances )
482+ {
483+ DataTypes.Series memory series = getSeries (vault.seriesId);
484+ balances = cauldron.balances (vaultId);
485+
486+ uint256 amount = series.fyToken.balanceOf (address (this ));
487+ amount = amount <= balances.art ? amount : balances.art;
488+
489+ // Update accounting
490+ balances = cauldron.pour (vaultId, 0 , - (amount.u128 ().i128 ()));
491+ series.fyToken.burn (address (this ), amount);
492+ }
493+
494+ /// @dev Retrieve any asset or fyToken in the Ladle
495+ function _retrieve (bytes6 id , bool isAsset , address to )
496+ private
497+ returns (uint256 amount )
498+ {
499+ IERC20 token = IERC20 (findToken (id, isAsset));
500+ amount = token.balanceOf (address (this ));
501+ token.safeTransfer (to, amount);
465502 }
466503
467504 // ---- Liquidations ----
@@ -489,26 +526,26 @@ contract Ladle is LadleStorage, AccessControl() {
489526 // ---- Permit management ----
490527
491528 /// @dev From an id, which can be an assetId or a seriesId, find the resulting asset or fyToken
492- function findToken (bytes6 id , bool asset )
529+ function findToken (bytes6 id , bool isAsset )
493530 private view returns (address token )
494531 {
495- token = asset ? cauldron.assets (id) : address (getSeries (id).fyToken);
532+ token = isAsset ? cauldron.assets (id) : address (getSeries (id).fyToken);
496533 require (token != address (0 ), "Token not found " );
497534 }
498535
499536 /// @dev Execute an ERC2612 permit for the selected asset or fyToken
500- function _forwardPermit (bytes6 id , bool asset , address spender , uint256 amount , uint256 deadline , uint8 v , bytes32 r , bytes32 s )
537+ function _forwardPermit (bytes6 id , bool isAsset , address spender , uint256 amount , uint256 deadline , uint8 v , bytes32 r , bytes32 s )
501538 private
502539 {
503- IERC2612 token = IERC2612 (findToken (id, asset ));
540+ IERC2612 token = IERC2612 (findToken (id, isAsset ));
504541 token.permit (msg .sender , spender, amount, deadline, v, r, s);
505542 }
506543
507544 /// @dev Execute a Dai-style permit for the selected asset or fyToken
508- function _forwardDaiPermit (bytes6 id , bool asset , address spender , uint256 nonce , uint256 deadline , bool allowed , uint8 v , bytes32 r , bytes32 s )
545+ function _forwardDaiPermit (bytes6 id , bool isAsset , address spender , uint256 nonce , uint256 deadline , bool allowed , uint8 v , bytes32 r , bytes32 s )
509546 private
510547 {
511- DaiAbstract token = DaiAbstract (findToken (id, asset ));
548+ DaiAbstract token = DaiAbstract (findToken (id, isAsset ));
512549 token.permit (msg .sender , spender, nonce, deadline, allowed, v, r, s);
513550 }
514551
@@ -569,12 +606,13 @@ contract Ladle is LadleStorage, AccessControl() {
569606 IERC20 (fyToken).safeTransferFrom (msg .sender , address (fyToken), wad);
570607 }
571608
572- /// @dev Allow users to redeem fyToken, to be used with batch
609+ /// @dev Allow users to redeem fyToken, to be used with batch.
610+ /// If 0 is passed as the amount to redeem, it redeems the fyToken balance of the Ladle instead.
573611 function _redeem (IFYToken fyToken , address to , uint256 wad )
574612 private
575613 returns (uint256 )
576614 {
577- return fyToken.redeem (to, wad);
615+ return fyToken.redeem (to, wad != 0 ? wad : fyToken. balanceOf ( address ( this )) );
578616 }
579617
580618 // ---- Module router ----
0 commit comments