Skip to content

Commit e2d1943

Browse files
skimaharveyclaude
andcommitted
refactor: add missing maxWithdraw/maxRedeem 2-param overloads
- Add maxWithdraw(address, uint256) overload to match Vyper interface - Add maxRedeem(address, uint256) overload to match Vyper interface - Add set_deposit_limit_module(address) single-param overload - Fix maxWithdraw(address) default maxLoss from MAX_BPS to 0 in LockedVault 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent bec39bd commit e2d1943

File tree

3 files changed

+82
-2
lines changed

3 files changed

+82
-2
lines changed

src/core/MultistrategyLockedVault.sol

Lines changed: 39 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,21 @@ contract MultistrategyLockedVault is MultistrategyVault, IMultistrategyLockedVau
649672
return Math.min(parentMax, lockedShares);
650673
}
651674

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

src/core/MultistrategyVault.sol

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

@@ -1755,6 +1767,34 @@ contract MultistrategyVault is IMultistrategyVault {
17551767
);
17561768
}
17571769

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+
1782+
/**
1783+
* @notice Returns maximum shares that owner can redeem with custom loss tolerance
1784+
* @dev Uses default queue for withdrawal strategies
1785+
* @param owner_ Address that owns the shares
1786+
* @param maxLoss_ Maximum acceptable loss in basis points (0-10000)
1787+
* @return max Maximum redeemable shares
1788+
*/
1789+
function maxRedeem(address owner_, uint256 maxLoss_) external view virtual returns (uint256) {
1790+
address[] memory emptyArray = new address[](0);
1791+
return
1792+
Math.min(
1793+
_convertToShares(_max_withdraw(owner_, maxLoss_, emptyArray), Rounding.ROUND_DOWN),
1794+
_balanceOf[owner_]
1795+
);
1796+
}
1797+
17581798
/**
17591799
* @notice Returns maximum assets that owner can withdraw with default parameters
17601800
* @dev Overload to match Vyper's default parameters behavior (maxLoss = 0, default queue)

src/core/interfaces/IMultistrategyVault.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,12 @@ interface IMultistrategyVault {
396396

397397
// MaxWithdraw functions with different parameter combinations to match Vyper
398398
function maxWithdraw(address owner) external view returns (uint256);
399+
function maxWithdraw(address owner, uint256 maxLoss) external view returns (uint256);
399400
function maxWithdraw(address owner, uint256 maxLoss, address[] memory strategies) external view returns (uint256);
400401

401402
// MaxRedeem functions with different parameter combinations to match Vyper
402403
function maxRedeem(address owner) external view returns (uint256);
404+
function maxRedeem(address owner, uint256 maxLoss) external view returns (uint256);
403405
function maxRedeem(address owner, uint256 maxLoss, address[] memory strategies) external view returns (uint256);
404406

405407
function FACTORY() external view returns (address);

0 commit comments

Comments
 (0)