Context
contracts/MeridianVaultERC4626.sol is an ERC-4626 vault wrapper used by on-chain strategies. ERC-4626 share-price monotonicity + rounding direction are the top sources of vault exploits (e.g. Cream, Euler inflation attack). We have no Foundry invariants.
Scope
Files to touch:
test/invariants/VaultInvariants.t.sol (new).
- Handler + invariants:
sharePrice is non-decreasing under deposits/withdraws (no donate-inflation).
previewDeposit(x) <= deposit(x) (rounding in favor of vault).
totalAssets() >= sum(convertToAssets(balanceOf(user))) for tracked users.
- Include an inflation-attack scenario as a separate unit test asserting it's mitigated.
Acceptance criteria
- Invariants pass on current implementation.
- Temporarily breaking rounding direction causes the invariant to fail (documented in PR).
- Runs in CI.
Estimated effort
L — ERC-4626 invariants are a known hard problem; ~2 days.
— kcolbchain / Abhishek Krishna
Context
contracts/MeridianVaultERC4626.solis an ERC-4626 vault wrapper used by on-chain strategies. ERC-4626 share-price monotonicity + rounding direction are the top sources of vault exploits (e.g. Cream, Euler inflation attack). We have no Foundry invariants.Scope
Files to touch:
test/invariants/VaultInvariants.t.sol(new).sharePriceis non-decreasing under deposits/withdraws (no donate-inflation).previewDeposit(x) <= deposit(x)(rounding in favor of vault).totalAssets() >= sum(convertToAssets(balanceOf(user))) for tracked users.Acceptance criteria
Estimated effort
L — ERC-4626 invariants are a known hard problem; ~2 days.
— kcolbchain / Abhishek Krishna