# The ContinuousGDA implementation is incorrect leading to liquidation auctions running at the wrong price

ContinuousGDA library used emission rate where decay constant belongs, mispricing PoolTogether liquidation auctions and over-incentivizing liquidators.

- Payout: Contest reward
- Severity: medium
- Program: PoolTogether
- Credited: dirk\_y
- Disclosed: 2023-09-07
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2023-08-pooltogether-findings/issues/24
- Library page: https://bugbountylibrary.com/r/c4%3A2023-08-pooltogether%3AM-10
- Tags: domain:web3 impact:funds-loss kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:source-review vuln:accounting-error

**Target:** ContinuousGDA.sol pricing library (LiquidationPair auctions)
**Root cause:** purchasePrice divides _k by _emissionRate instead of _decayConstant; purchaseAmount adds _k instead of ONE to lnParam and multiplies price by _emissionRate instead of _decayConstant; computeK multiplies by _emissionRate instead of _decayConstant.
**Steps:**
1. Read ContinuousGDA.purchasePrice: `result = _k.div(_emissionRate).mul(topE).div(bottomE)` — should divide by `_decayConstant`.
2. Read purchaseAmount: `lnParam = _k.add(_price.mul(_emissionRate).mul(exp)).div(_k)` — should be `ONE.add(_price.mul(_decayConstant).mul(exp)).div(_k)`.
3. Read computeK: `multiplier = _emissionRate.mul(_price)` — should be `_decayConstant.mul(_price)`.
4. Compare against Paradigm GDA formula; since decayConstant < emissionRate, purchasePrice is understated, over-incentivizing liquidations.
5. Apply diff swapping emissionRate→decayConstant in the three spots.
**How found:** Code-reading against the Paradigm GDA reference formula; noticed emission rate substituted where decay constant belongs in three functions.
**Insight:** When a protocol implements a published math formula (e.g. Paradigm GDA), diff each variable against the reference derivation — swapped rate/constant terms are easy to miss and silently skew pricing.
