function purchase(address _asset) external {
AssetListing storage listing = listings[_asset];
// asset must be listed to be purchased
if (listing.status != AssetStatus.Listed) {
revert InvalidStatus(listing.status, AssetStatus.Listed);
}
// can only the buyer can purchase the asset
if (listing.buyer != msg.sender) {
revert Unauthorized(msg.sender);
}
// update asset status to be sold
listing.status = AssetStatus.Sold;
// transfer asset from seller to Swan, and then from Swan to buyer
// this ensure that only approval to Swan is enough for the sellers
@> SwanAsset(_asset).transferFrom(listing.seller, address(this), 1);
@> SwanAsset(_asset).transferFrom(address(this), listing.buyer, 1);
// transfer money
@> token.transferFrom(listing.buyer, address(this), listing.price);
@> token.transfer(listing.seller, listing.price);
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.