In Swan::transferRoyalties buyerFee and driaFee will experience precision loss due to the base being 100. On top of that, the value can be 0 and with certain ERC20 tokens a transfer of 0 will revert DoS-ing the listing and relisting functions for such assets.
As we know due to Solidity's nature when a division happens precision loss can occur, rounding down the result. For the transferRoyalties function this will mean that buyerFee and driaFee will be rounded down in most cases. In the case in which:
asset.price * asset.royaltyFee < 100
buyerFee * platformFee < 100
The fee(s) will be equal to 0. However, some ERC20 tokens will revert on transfer of 0 which will mean that the transferRoyalties function will revert.
Such a vulnerability will cause certain combinations of price, royaltyFee and platformFee to not be possible without a clear explanation.
Manual Review
To fix this issue perform these tasks:
When buyerFee is 0 don't perform any transfers to not cause a random revert.
Consider changing the base of the fee to a 1e4 or 1e5 base giving more freedom for fee choice and less possibility for precision loss.
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.