Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/contracts/AbstractARM.sol
Original file line number Diff line number Diff line change
Expand Up @@ -786,7 +786,7 @@ abstract contract AbstractARM is OwnableOperable, ERC20Upgradeable, ReentrancyGu
// Treat accrued fees as a senior liability. If gross assets no longer cover
// accrued fees plus the minimum native-liquidity floor, new deposits would be
// minted against the floor and backfill the shortfall, so block deposits.
bool atAssetFloor = feesAccruedMem + MIN_LIQUIDITY >= grossAssets;
bool atAssetFloor = feesAccruedMem + MIN_LIQUIDITY > grossAssets;
if (atAssetFloor && (feesAccruedMem != 0 || reservedWithdrawLiquidity != 0)) revert Insolvent();

uint256 netAssets = atAssetFloor ? MIN_LIQUIDITY : grossAssets - feesAccruedMem;
Expand Down
22 changes: 20 additions & 2 deletions test/unit/MultiAssetARM/concrete/Deposit.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,32 @@ abstract contract Deposit_Test is Unit_MultiAssetARM_Shared_Test {
uint256 fees = _generateFees();
assertEq(arm.reservedWithdrawLiquidity(), 0, "no reserved withdrawals");

// Simulate a loss that leaves accrued fees undercollateralized at the asset floor.
_setArmBalances(fees + MIN_LIQUIDITY(), 0);
// Simulate a loss that leaves accrued fees undercollateralized below the asset floor.
_setArmBalances(fees + MIN_LIQUIDITY() - 1, 0);

vm.expectRevert(AbstractARM.Insolvent.selector);
vm.prank(alice);
arm.deposit(LIQUIDITY_UNIT());
}

function test_Deposit_WhenAccruedFeesExactlyBacked() public {
uint256 fees = _generateFees();
assertEq(arm.reservedWithdrawLiquidity(), 0, "no reserved withdrawals");

_setArmBalances(fees + MIN_LIQUIDITY(), 0);

uint256 amount = LIQUIDITY_UNIT();
uint256 expectedShares = amount * arm.totalSupply() / MIN_LIQUIDITY();
_mint(liquidity, bobby, amount);

vm.prank(bobby);
uint256 shares = arm.deposit(amount);

assertEq(shares, expectedShares, "shares returned");
assertEq(arm.balanceOf(bobby), expectedShares, "bobby shares");
assertEq(arm.totalAssets(), MIN_LIQUIDITY() + amount, "net assets increase by deposit");
}

function _generateFees() internal returns (uint256 fees) {
firstDeposit(alice, DEFAULT_AMOUNT());

Expand Down
Loading