# Contributions can be smaller than minContribution and may receive no voting power

In PartyDAO ETHCrowdfundBase, the last contributor's amount is reduced after the minContribution check, so a valid contribution can fall below minContribution and yield zero voting power.

- Payout: Contest reward
- Severity: medium
- Program: PartyDAO
- Credited: 0x52
- Disclosed: 2023-06-23
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2023-04-party-findings/issues/37
- Library page: https://bugbountylibrary.com/r/c4%3A2023-04-party%3AM-03
- Tags: domain:web3 impact:integrity kind:contest platform:code4rena sev:medium tech:solidity technique:source-review vuln:accounting-error vuln:business-logic

**Target:** ETHCrowdfundBase.sol contribution handling in Party crowdfund contracts
**Root cause:** The minContribution check runs before the excess-refund reduction; when a contribution pushes total over maxTotalContributions, amount is reduced afterward, so the final accepted amount can be below minContribution.
**Steps:**
1. Call contribute with amount >= minContribution such that totalContributions + amount >= maxTotalContributions.
2. Contract finalizes, computes refundAmount = newTotalContributions - maxTotalContributions, subtracts it from amount.
3. Resulting amount can be < minContribution and, if amount < exchangeRateBps, mints zero voting power.
**How found:** Code review of the contribution path: noticed the minContribution check precedes the maxTotalContributions refund logic that mutates amount, then reasoned about the edge case where the reduced amount falls below exchangeRateBps.
**Exploitation:** Last contributor to a crowdfund that reaches maxTotalContributions gets their contribution truncated by the refund; if the truncated amount is below exchangeRateBps they receive no voting power (and may be unable to claim a party card in ReraiseETHCrowdfund).
**Insight:** When auditing contribution/deposit flows, check ordering between validation checks and later amount mutations (refund/cap truncation); a value validated before truncation can end up below the intended minimum and mint zero shares.
