Skip to main content

Slither triage

Why every Slither finding in contracts/src is left as it is. Read before silencing a new one, and add it here when you do. CI runs Slither with fail-on: medium; make lint does the same.

Triaged 15 Sep 2026, Slither 0.11.4: 44 findings, no High. The 14 Mediums are disabled at their lines.

FindingWhereVerdict
incorrect-equalityBondingCurve.graduate, FeeVault.distributeIntended: exact zero checks, one of them the "migrator took everything" assertion
reentrancy-no-ethPoolMigrator.collectFeesFalse positive: collectFees and both flushes share one nonReentrant; the only callee is our vault
uninitialized-localLaunchFactory.launch noneIntended: the zero CreatorFees is "no creator fee"
unused-return ×10settle, initialize, getSlot0, modifyLiquidity, unlock, sync, launchOfIntended: each return is either already known or deliberately not needed
missing-zero-check ×3 (Low)payout asset, token observer, sellForEth.toZero is meaningful for the first two; the third is checked in _checkTrade
calls-loop ×5 (Low)BasketWrapper.preview*Bounded at ten assets; a paused constituent reverting a preview is correct
reentrancy-benign/events ×10 (Low)curve, factory, migrator, vault, tokenSame reasoning as the forge-lint exclusion: guarded paths or contracts we deployed in the same call
timestamp ×2, low-level-calls, naming, unused __gap, OZ eventDeadlines, ETH payout, and the upgrade-safety gap convention