rankCandidatesBySig() can be replayed. This allows a user to cast multiple votes (rankings) repeatedly on behalf of someone else.
A user can vote repeatedly, thereby inflating the votes cast for their preferred candidates. The user may not even know that they cast illegitimate votes since someone else paid for the transaction on their behalf.:brThe result would be an unfair election that does not represent the population's will.
Manual Review
Implement a "isExecuted" mapping in RankedChoice.sol that keeps track of the signatures already executed. Then, implement a check in rankCandidatesBySig() before the call to _rankCandidates that ensures the signature has not already been executed. This prevents signed un-sent transactions from being replayed in rankCandidatesBySig().
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.