During the sell phase, any seller can list an asset for transferring royalties so that the buyer can purchase that asset. In the buy phase, the operators or the owner of the BuyerAgent
call the LLMOracleCoordinator
and pay the oracle fees to make a purchase request. After the oracle validation, the operators can buy assets from the output
. A malicious owner of one of these assets may revert the purchase.
Let's consider the following situation:
Five sellers list their assets and pay royalties to a specific buyer. [Sell phase]
The operator of Swan calls oraclePurchaseRequest
and pays for the oracle fees. [Buy phase]
One of the sellers is malicious and sees that his asset is in the oracle output (the oracleResult
function). The malicious seller revokes approval from the Swan contract by calling setApprovalForAll(swan, false)
or transfers a single NFT to another address. [Buy phase]
The operator of Swan calls the purchase
function, and the call reverts at the step transfer asset from seller to Swan. [Buy phase]
In this attack, the malicious seller pays royalties to the buyer, but the buyer incurs a loss in tokens due to oracle fees, while the other sellers lose their royalties for this round (they may also relist in the next round and pay royalties again).
Manual review
Consider overriding the internal _setApprovalForAll
function to disallow setApprovalForAll(swan, false)
call and allow NFT transfers only to
or from
Swan.sol
.
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.