Skip to content

Commit f7bf88f

Browse files
committed
refactor: added missing 2 parameters maxWithdraw/maxRedeem
1 parent f18d637 commit f7bf88f

File tree

5 files changed

+116
-70
lines changed

5 files changed

+116
-70
lines changed

src/core/MultistrategyLockedVault.sol

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,10 +609,33 @@ contract MultistrategyLockedVault is MultistrategyVault, IMultistrategyLockedVau
609609
return Math.min(parentMax, custodyAssets);
610610
}
611611

612+
/**
613+
* @notice Returns maximum assets that owner can withdraw with custom loss tolerance
614+
* @dev Uses default queue for withdrawal strategies
615+
* @param owner_ Address that owns the shares
616+
* @param maxLoss_ Maximum acceptable loss in basis points (0-10000)
617+
* @return max Maximum withdrawable assets (constrained by custody)
618+
*/
619+
620+
function maxWithdraw(
621+
address owner_,
622+
uint256 maxLoss_
623+
) public view override(MultistrategyVault, IMultistrategyVault) returns (uint256) {
624+
return maxWithdraw(owner_, maxLoss_, new address[](0));
625+
}
626+
627+
/**
628+
* @notice Returns maximum assets that owner can withdraw with default parameters
629+
* @dev Overload to match Vyper's default parameters behavior (maxLoss = 0, default queue)
630+
* Enforces custody constraints - returns 0 if cooldown period not passed
631+
* @param owner_ Address that owns the shares
632+
* @return max Maximum withdrawable assets (constrained by custody)
633+
*/
634+
612635
function maxWithdraw(
613636
address owner_
614637
) external view override(MultistrategyVault, IMultistrategyVault) returns (uint256) {
615-
return maxWithdraw(owner_, MAX_BPS, new address[](0));
638+
return maxWithdraw(owner_, 0, new address[](0));
616639
}
617640

618641
/**
@@ -649,6 +672,22 @@ contract MultistrategyLockedVault is MultistrategyVault, IMultistrategyLockedVau
649672
return Math.min(parentMax, lockedShares);
650673
}
651674

675+
/**
676+
* @notice Returns maximum shares that owner can redeem with default parameters
677+
* @dev Overload to match Vyper's default parameters behavior (maxLoss = MAX_BPS, default queue)
678+
* Enforces custody constraints - returns 0 if cooldown period not passed
679+
* @param owner_ Address that owns the shares
680+
* @param maxLoss_ Maximum acceptable loss in basis points (0-10000)
681+
* @return max Maximum redeemable shares (constrained by custody)
682+
*/
683+
684+
function maxRedeem(
685+
address owner_,
686+
uint256 maxLoss_
687+
) public view override(MultistrategyVault, IMultistrategyVault) returns (uint256) {
688+
return maxRedeem(owner_, maxLoss_, new address[](0));
689+
}
690+
652691
/**
653692
* @notice Returns maximum shares that owner can redeem with default parameters
654693
* @dev Overload to match Vyper's default parameters behavior (maxLoss = MAX_BPS, default queue)

src/core/MultistrategyVault.sol

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ contract MultistrategyVault is IMultistrategyVault {
346346
* @param name_ New name for the vault token
347347
* @custom:security Only callable by roleManager
348348
*/
349-
function set_name(string memory name_) external override {
349+
function setName(string memory name_) external override {
350350
require(msg.sender == roleManager, NotAllowed());
351351
name = name_;
352352
}
@@ -357,7 +357,7 @@ contract MultistrategyVault is IMultistrategyVault {
357357
* @param symbol_ New symbol ticker for the vault token
358358
* @custom:security Only callable by roleManager
359359
*/
360-
function set_symbol(string memory symbol_) external override {
360+
function setSymbol(string memory symbol_) external override {
361361
require(msg.sender == roleManager, NotAllowed());
362362
symbol = symbol_;
363363
}
@@ -470,6 +470,18 @@ contract MultistrategyVault is IMultistrategyVault {
470470
emit UpdateDepositLimit(depositLimit_);
471471
}
472472

473+
/**
474+
* @notice Sets a module contract to dynamically control deposit limits with default override behavior
475+
* @dev Overload to match Vyper's default parameter behavior (shouldOverride = false by default)
476+
* See set_deposit_limit_module(address, bool) for full documentation
477+
* @param depositLimitModule_ Address of IDepositLimitModule contract (or address(0) to disable)
478+
* @custom:security Only callable by DEPOSIT_LIMIT_MANAGER role
479+
* @custom:security Reverts if vault is shutdown
480+
*/
481+
function set_deposit_limit_module(address depositLimitModule_) public {
482+
set_deposit_limit_module(depositLimitModule_, false);
483+
}
484+
473485
/**
474486
* @notice Sets a module contract to dynamically control deposit limits
475487
* @dev Module overrides static depositLimit. Requires depositLimit = type(uint256).max
@@ -479,7 +491,7 @@ contract MultistrategyVault is IMultistrategyVault {
479491
* @custom:security Only callable by DEPOSIT_LIMIT_MANAGER role
480492
* @custom:security Reverts if vault is shutdown
481493
*/
482-
function set_deposit_limit_module(address depositLimitModule_, bool shouldOverride_) external override {
494+
function set_deposit_limit_module(address depositLimitModule_, bool shouldOverride_) public override {
483495
require(_shutdown == false, VaultShutdown());
484496
_enforceRole(msg.sender, Roles.DEPOSIT_LIMIT_MANAGER);
485497

@@ -1679,15 +1691,6 @@ contract MultistrategyVault is IMultistrategyVault {
16791691
return _convertToAssets(shares_, Rounding.ROUND_DOWN);
16801692
}
16811693

1682-
/**
1683-
* @notice Returns the default withdrawal queue
1684-
* @dev Same as getDefaultQueue()
1685-
* @return queue Array of strategy addresses in withdrawal priority order
1686-
*/
1687-
function defaultQueue() external view override returns (address[] memory) {
1688-
return _defaultQueue;
1689-
}
1690-
16911694
/**
16921695
* @notice Returns maximum assets that can be deposited for a receiver
16931696
* @dev Checks against depositLimit or depositLimitModule (if set)
@@ -1764,6 +1767,18 @@ contract MultistrategyVault is IMultistrategyVault {
17641767
);
17651768
}
17661769

1770+
/**
1771+
* @notice Returns maximum assets that owner can withdraw with custom loss tolerance
1772+
* @dev Uses default queue for withdrawal strategies
1773+
* @param owner_ Address that owns the shares
1774+
* @param maxLoss_ Maximum acceptable loss in basis points (0-10000)
1775+
* @return max Maximum withdrawable assets
1776+
*/
1777+
function maxWithdraw(address owner_, uint256 maxLoss_) external view virtual returns (uint256) {
1778+
address[] memory emptyArray = new address[](0);
1779+
return _max_withdraw(owner_, maxLoss_, emptyArray);
1780+
}
1781+
17671782
/**
17681783
* @notice Returns maximum assets that owner can withdraw with default parameters
17691784
* @dev Overload to match Vyper's default parameters behavior (maxLoss = 0, default queue)
@@ -1775,6 +1790,22 @@ contract MultistrategyVault is IMultistrategyVault {
17751790
return _max_withdraw(owner_, 0, emptyArray);
17761791
}
17771792

1793+
/**
1794+
* @notice Returns maximum shares that owner can redeem with custom loss tolerance
1795+
* @dev Uses default queue for withdrawal strategies
1796+
* @param owner_ Address that owns the shares
1797+
* @param maxLoss_ Maximum acceptable loss in basis points (0-10000)
1798+
* @return max Maximum redeemable shares
1799+
*/
1800+
function maxRedeem(address owner_, uint256 maxLoss_) external view virtual returns (uint256) {
1801+
address[] memory emptyArray = new address[](0);
1802+
return
1803+
Math.min(
1804+
_convertToShares(_max_withdraw(owner_, maxLoss_, emptyArray), Rounding.ROUND_DOWN),
1805+
_balanceOf[owner_]
1806+
);
1807+
}
1808+
17781809
/**
17791810
* @notice Returns maximum shares that owner can redeem with default parameters
17801811
* @dev Overload to match Vyper's default parameters behavior (maxLoss = MAX_BPS, default queue)
@@ -1833,31 +1864,6 @@ contract MultistrategyVault is IMultistrategyVault {
18331864
return API_VERSION;
18341865
}
18351866

1836-
// ============================================
1837-
// VIEW FUNCTIONS - STRATEGY QUERIES
1838-
// ============================================
1839-
1840-
/**
1841-
* @notice Calculates the unrealized losses for a withdrawal from strategy
1842-
* @dev Compares strategy's actual asset value vs recorded debt
1843-
* If strategy is underwater, user takes proportional share of loss
1844-
*
1845-
* Formula: loss = assetsNeeded - (assetsNeeded * strategyAssets / currentDebt)
1846-
*
1847-
* @param strategy_ Address of the strategy
1848-
* @param assetsNeeded_ Amount of assets to withdraw from strategy
1849-
* @return loss User's share of unrealized losses
1850-
*/
1851-
function assess_share_of_unrealised_losses(
1852-
address strategy_,
1853-
uint256 assetsNeeded_
1854-
) external view returns (uint256) {
1855-
uint256 currentDebt = _strategies[strategy_].currentDebt;
1856-
require(currentDebt >= assetsNeeded_, NotEnoughDebt());
1857-
1858-
return _assess_share_of_unrealised_losses(strategy_, currentDebt, assetsNeeded_);
1859-
}
1860-
18611867
// ============================================
18621868
// VIEW FUNCTIONS - PROFIT LOCKING
18631869
// ============================================

src/core/interfaces/IMultistrategyVault.sol

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,6 @@ interface IMultistrategyVault {
360360
// NOTE: The following functions are declared for interface completeness where
361361
// some implementations may expose equivalent public state variables.
362362
function strategies(address strategy) external view returns (StrategyParams memory);
363-
function defaultQueue() external view returns (address[] memory);
364363
function useDefaultQueue() external view returns (bool);
365364
function autoAllocate() external view returns (bool);
366365
function minimumTotalIdle() external view returns (uint256);
@@ -397,10 +396,12 @@ interface IMultistrategyVault {
397396

398397
// MaxWithdraw functions with different parameter combinations to match Vyper
399398
function maxWithdraw(address owner) external view returns (uint256);
399+
function maxWithdraw(address owner, uint256 maxLoss) external view returns (uint256);
400400
function maxWithdraw(address owner, uint256 maxLoss, address[] memory strategies) external view returns (uint256);
401401

402402
// MaxRedeem functions with different parameter combinations to match Vyper
403403
function maxRedeem(address owner) external view returns (uint256);
404+
function maxRedeem(address owner, uint256 maxLoss) external view returns (uint256);
404405
function maxRedeem(address owner, uint256 maxLoss, address[] memory strategies) external view returns (uint256);
405406

406407
function FACTORY() external view returns (address);
@@ -467,8 +468,8 @@ interface IMultistrategyVault {
467468
) external returns (bool);
468469

469470
// Management Functions
470-
function set_name(string memory name) external;
471-
function set_symbol(string memory symbol) external;
471+
function setName(string memory name) external;
472+
function setSymbol(string memory symbol) external;
472473
function set_accountant(address newAccountant) external;
473474
function set_default_queue(address[] memory newDefaultQueue) external;
474475
function set_use_default_queue(bool useDefaultQueue) external;

0 commit comments

Comments
 (0)