The Comission fee and remaining tokens can get stucked in the contract if stadium address gets blacklisted. Additonally, since the function _commisionTransfer is included inside the _distribute function, this will end with a revert because transfering this fee/remaining assets is the last step of the distribution process.
The issue arises when the stadium address is unaware of being included in a blocklist, before receiving the fee and/or remainings. Neither the Distributor.sol contract nor the ProxyFactory.sol currently incorporate proper verifications to mitigate this specific blocklist scenario. The consequence of this is that the primary task of _comissionTransfer (avoid dust remaining) will fail, and moreover since this function is also called inside the _distribute function, it will also produce a failure.
The following PoC can illustrate the issue. For simulating the block, we will use the the HelperContract.t.sol by simply putting the stadium address to 0 declared in the test contract, (for simplifying the scenario). In this way using the testIfAllConditionsMetThenUsdcSendingCallShouldSuceed, we will see that while most of the contest process is correctly parsed, the last part corresponding to the distribution of the comission fee will fail as the stadium address is invalid.
*** The comission fee is stucked inside the contract as we can verify using the getConstants() method.
The comission fee and all remaining tokens can get stuck in the contract. Additionally the _distribute function will fail as the last step where comissions are transfered will not work.
Manual Review
Implement the necessary checks for the possible blocklist of the stadium address that can prevent this failure.
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.