Pieces Protocol

First Flight #32
Beginner FriendlyFoundrySolidityNFT
100 EXP
View results
Submission Details
Severity: medium
Invalid

ERC-20 Transfer Success Check

Summary

The buyOrder function performs an ERC-20 token transfer to the buyer at the end of the transaction. However, the current implementation assumes that the transfer function from the ERC-20 token returns true for successful transfers, which is not guaranteed across all ERC-20 token implementations.
​
Non-Standard ERC-20 Implementations: Some older or non-compliant ERC-20 tokens might not return a boolean for the transfer function, or they might revert the transaction without returning false in case of failure. This can lead to a situation where the function proceeds as if the transfer was successful when it wasn't.
​

Vulnerability Details

Impact

1. Funds Mismanagement: If the `transfer` fails silently, tokens could remain in the contract, leading to an imbalance in token distribution where users think they've received tokens they haven't.
2. User Experience: Users might think they've completed a transaction when they haven't received the tokens, leading to confusion or loss of trust.
3. Contract Integrity: The contract's state might not match the actual token distribution, potentially leading to discrepancies or exploits if not caught.
​
By implementing these checks, you enhance the robustness of the contract against non-standard or faulty ERC-20 token implementations, ensuring that the contract behaves consistently regardless of how the token's transfer function is coded.

Tools Used

Manual Review

Recommendations

To handle this variability in ERC-20 token behavior:
​
1. Use require for ERC-20 Transfers:
Wrap the token transfer in a require statement to ensure the function reverts if the transfer does not succeed, enhancing reliability across different token implementations.
​
```solidity
bool transferSuccess = IERC20(order.erc20Address).transfer(msg.sender, order.amount);
require(transferSuccess, "Token transfer failed");
```
​
2. Consider Using `safeTransferFrom`:
I recommend using OpenZeppelin's SafeERC20 versions with the safeTransfer and safeTransferFrom functions that handle the return value check as well as non-standard-compliant tokens.
If the token contract supports it, using `transferFrom` can provide more control since it checks `allowances`.
However, for simplicity in this context, transfer is used, but be aware of its limitations.
​
3. Error Handling and Logging:
Log or emit an event in case of `transfer` failure to aid in debugging and user experience.
Updates

Lead Judging Commences

fishy Lead Judge over 1 year ago
Submission Judgement Published
Invalidated
Reason: Incorrect statement

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!