Any user can create a buyerAgent by calling createBuyer in swan contract. The issue is _amountPerRound can be set 0 or very low amount by a malicious user to collect fees from asset creators but not buying any asset in exchange. This will lead to repeated loss of fees for asset creators.
A user can create a BuyerAgent by the following function:
As it can be seen _amountPerRound can be set 0 or any trivial amount. On the other hand, an asset can be created by calling list:
There is a call made to transferRoyalties() method, which is defined as follow:
We can see that Swan collects the royalty fee from the seller initially, then distributes a portion of it to the buyer, with the platform retaining the remainder. When there is a buy phase, no purchases will be made due to the immediate BuyLimitExceeded revert within purchase.
The seller will pay the fee but gets nothing in return.If the seller lists assets repeatedly while the buyer’s amountPerRound remains zero or any trivial amount, they might incur royalty fees each time without actually closing any sales. This could lead to cumulative losses over time without any compensatory revenue.
It is also important to note that if the seller is not aware of the royaltyFee set by the buyer before listing, this may lead to a huge loss for sellers. Because the royaltyFee can be set 100 by the buyer, which means the listing price of asset will be equal to buyerFee(see transferRoyalties() above).
Financiall loss for asset creators
Manual Review
I suggest sending buyerFee only after a confirmed purchase.This will prevent the seller from paying fees on assets that remain unsold due to amountPerRound constraints.
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.