Calling approve() without first calling approve(0) if the current approval is non-zero will revert with some tokens, such as Tether (USDT). While Tether is known to do this, it applies to other tokens as well, which are trying to protect against this attack vector.
Only the first listing will start with the conduitβs approval at zero and will be able to change it to the maximum. Thereafter, every attempt to approve that same token will revert, causing any order using this lister to revert, including a re-listing at a lower price, which the protocol allows for.
The seaport conduit address is set in the constructor as an immutable variable, so itβs not possible to change it once the issue is hit:
// File: src/seaport/targets/SeaportLister.sol : SeaportLister.constructor() #1
19 constructor(address _conduit) {
20 @> conduit = _conduit;
21: }
The approval is set to the maximum without check whether itβs already the maximum:
// File: src/seaport/targets/SeaportLister.sol : SeaportLister.validateListing() #2
29 for (uint256 i; i < ordersLength; ++i) {
30 uint256 offerLength = _orders[i].parameters.offer.length;
31 for (uint256 j; j < offerLength; ++j) {
32 OfferItem memory offer = _orders[i].parameters.offer[j];
33 address token = offer.token;
34 ItemType itemType = offer.itemType;
35 if (itemType == ItemType.ERC721)
36 IERC721(token).setApprovalForAll(conduit, true);
37 if (itemType == ItemType.ERC1155)
38 IERC1155(token).setApprovalForAll(conduit, true);
39 if (itemType == ItemType.ERC20)
40 @> IERC20(token).approve(conduit, type(uint256).max);
41 }
42 }
43 }
44 // Validates the order on-chain so no signature is required to fill it
45 assert(ConsiderationInterface(_consideration).validate(_orders));
46: }
The README states: The Tessera Protocol is designed around the concept of Hyperstructures, which are crypto protocols that can run for free and forever, without maintenance, interruption or intermediaries, and having to deploy a new SeaportLister in order to have a fresh conduit that also needs to be deployed, is not without maintenance or interruption.
Code inspection
Always reset the approval to zero before changing it to the maximum
The text was updated successfully, but these errors were encountered:
All reactions