Quantstamp reviewed Strata (Strata Markets Update - Isolated and Saturn Strate) on 11 Aug 2026: 22 findings, 0 critical; 17 marked fixed, 4 acknowledged, 1 open.
Report hosted on certificate.quantstamp.com.
Trustblock does not review code.
Statuses are the security firm’s own, from its report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 0 | 0 |
| Medium | 1 | 0 | 6 |
| Low | 0 | 4 | 11 |
The `cancelRebalance()` function checks the aggregate share-token balance held by the `Rebalancer` rather than proving that the cooldown request associated with the selected pending rebalance has completed. Share tokens recovered from another request can therefore satisfy `minShares`, allowing the selected pending entry to be removed while its own proxy remains active. If that proxy returns its shares later, the shares arrive at the `Rebalancer` after the corresponding accounting entry has already been deleted. There is no dedicated recovery path for those late tokens, so they can remain stranded or be incorrectly consumed by a future cancellation.
The Senior loss floor is Junior-funded insurance: it caps Senior's loss to `floorRate` per day of a baseline `windowStartSrtNav + windowNetFlows`, and Junior pays any shortfall. `updateBalanceFlow()` adds every Senior deposit to `windowNetFlows`, and `_computeSrtNavFloor()` applies no age weighting, so a Senior deposit made moments before a loss raises the baseline and is protected exactly like capital that has been exposed for the whole window. The floor is presumably intended to insure Senior's long-term exposure rather than capital that just arrived, so granting fresh deposits the same instant, unpriced protection quietly transfers value from Junior to whoever deposited last. This does not require a deliberate attacker: any Senior deposit that happens to land shortly before a loss is over-protected, so Junior systematically overpays for the floor. It is only worse when abused: someone expecting a loss can deposit at the last moment and push most of it onto Junior, the depositor still loses money, just far less than their fresh capital's real share, and Junior absorbs the difference.
On loss entry, `setValuationPrice()` disables `actionsJrt.isWithdrawEnabled` and `actionsSrt.isDepositEnabled` but never disables `actionsJrt.isDepositEnabled`, so Junior deposits stay open during a de-peg. While `valuationPrice < 1e18`, `calcEffectiveNav()` marks Junior down by `extraTaken` (returning `jrtFact - extraTaken`), and `Tranche.totalAssets()` feeds this lowered NAV into the ERC-4626 `convertToShares()` pricing, so a new Junior depositor mints shares at the marked-down price. The deposit is gated only by the grace period, so the discounted buy-in becomes available as soon as any configured grace period ends. `extraTaken` is a temporary markdown taken from the existing Junior holders at loss entry to keep Senior buffered, and it is not tied to any single share. When the peg recovers (`extraTaken` returns to zero) the markdown is given back evenly across every Junior share that exists at that moment, including shares minted after the loss. A depositor who joined after the markdown therefore takes a share of a recovery it never carried the loss for, so it dilutes the holders who actually took the loss. The depositor is not risk-free, since a deeper de-peg also falls on its shares and Junior withdrawals are frozen so it cannot exit in the same block, but the loss to existing holders is locked in once the peg recovers, no matter when the depositor exits.
`SaturnCooldownRequestImpl` always passes zero as `minUsdatReceived` when requesting redemption from `sUSDat`. The withdrawal queue therefore applies no request-specific minimum and relies only on Saturn's global execution tolerance, which is initially wide and can be configured up to one hundred percent. A redemption may consequently settle for materially less USDat than the value recorded when the request was created, with the shortfall borne by the withdrawing user. A simple fixed minimum also risks leaving an asynchronous request unprocessable if market conditions change, so recovery behavior must be considered.
The report names a repository or files. Open the report to see its scope.
236 projects reviewed · 332 reports · latest Oct 2026
See Quantstamp’s auditsSomething wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.
Tell us