# Inefficiency in the Dutch Auction due to lower duration

Cally's Dutch auction strike formula reaches reserveStrike early, so price stays flat for the remaining auction time, letting options fill at bad prices.

- Payout: Contest reward
- Severity: high
- Program: Cally
- Credited: hubble
- Disclosed: 2022-07-01
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2022-05-cally-findings/issues/138
- Library page: https://bugbountylibrary.com/r/c4%3A2022-05-cally%3AH-02
- Tags: domain:web3 impact:funds-loss kind:contest platform:code4rena sev:high tech:solidity technique:source-review vuln:accounting-error vuln:business-logic

**Target:** Cally.sol getDutchAuctionStrike() Dutch auction pricing
**Root cause:** getDutchAuctionStrike computes progress from elapsed time and squares it against (startingStrike - reserveStrike), so the price reaches reserveStrike well before AUCTION_DURATION ends instead of at 24 hours.
**Steps:**
1. Create a vault with startingStrike=55 and reserveStrike=13.5.
2. Start the Dutch auction (AUCTION_DURATION=24h).
3. Observe getDutchAuctionStrike() returns reserveStrike (~13.5) after ~12 hours.
4. Price remains constant at reserveStrike for the remaining ~12 hours of the auction.
**How found:** Reading getDutchAuctionStrike() and noticing the quadratic progress term causes the strike to reach reserveStrike before the auction ends; verified with sample startingStrike/reserveStrike pairs.
**Exploitation:** A buyer can wait until the strike collapses to reserveStrike early in the auction and fill options at the floor price, while the vault creator assumed a gradual 24-hour decline.
**Insight:** In time-based Dutch auction pricing, check that the interpolation curve actually spans the full auction duration for all start/reserve ratios; quadratic or squared progress terms reach the floor early when reserve is a small fraction of start.
