Any attacker can grief the contest reward tokens.
The flow of the contest creation by Sparkin protocol:
first the contract owner adds a contest by setContest function.
then when the contest ends (saltToCloseTime[salt] <= block.timestamp); the contest organizer can deploy the contest proxy and distribute rewards to the winners.
but before step#2: the contest sponsor transfers reward tokens to the to-be-deployed proxy address; and this address is predicted by the getProxyAddress, where the function arguments are salt (which is generated by encoding the organizer address,proxyFactory address & contestId ) & the implementation (Distributor.sol) address.
But as can be noticed; any malicious actor can deploy the contest proxy on the same address before the contest organizer deploys it.
This will result in contest reward tokens being stuck/blocked in the proxy contract that has been deployed by the malicious actor (attacker) since deployProxyAndDistribute function will always revert as it tries to deploy contest proxy on the previously deployed proxy address by the attacker.
deployProxyAndDistribute function:
Manual Testing.
Add a mechanism that enables sponsors from funding contests by transferring rewards tokens to the ProxyFactory contract (will act as an escrow); then each rewards tokens are transferred to its intended contest when the contest organizer calls deployProxyAndDistribute.
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.