Ethereum: Web3 Contract (React) – SafeERC20 Low Level Call Failed with ERC20 Token (USDT)
As a developer working on a smart contract or web3 application, you are probably familiar with the concept of interacting with different blockchain networks. In this article, we will investigate an issue that has been reported by several users and developers.
Issue
The issue is related to the SafeERC20 low-level call mechanism in Ethereum’s Web3 API. Specifically, when using a contract built on Ethereum (such as Etherscan), calling a function with an ERC20 token (such as USDT) triggers a failure.
Symptoms
The symptoms are as follows:
- The smart contract works fine if you try to use it with ETH (Ethereum).
- However, when you use the same contract with an ERC20 token such as USDT, you encounter issues.
- The error message usually indicates that the call failed, but does not provide any specific information.
Solution
You can resolve this issue with a few options:
- Use a different token
: Instead of trying to use an ERC20 token (USDT), try using another token supported by Ethereum, such as DAI or LINK.
- Enable a fallback mechanism: You can enable a fallback mechanism in your contract that will attempt to call a function with an ERC20 token before securing ETH if necessary.
Code example
Here is a sample code snippet in Solidity (the programming language used for Ethereum smart contracts) that shows how you can enable a fallback mechanism:
pragma solidity ^0,8,0;
contract SafeERC20Fallback {
function callFunction() public {
// First try to call the function with ETH
if (messager.balance > 10 10*18) {
// If successful, return the value of the variable
uint256 result = msg.value / 10 ** 18;
return result;
}
// If unsuccessful, try to call the function with an ERC20 token
address[] tokens = [address(0x89f8C7CE9e77fBC2a3Bc6BB5dA1bF6Cc4bfc94ce)];
for (uint256 i = 0; i < tokens.length; i++) {
// Get token contract
Token contract = Token(address(tokens[i]));
// Try to call the function with the token
uint256 result = contract.callFunction();
// If successful, return the value of the variable
if (result > 0) {
return result;
}
}
// If both methods fail, rollback
revert();
}
}
struct Token {
public tokenAddress;
}
Conclusion
In this article, we have investigated an issue reported by several users and developers regarding low-level calls to SafeERC20 failing when using ERC20 tokens on Ethereum. We have also provided a code example in Solidity that demonstrates how to implement a fallback mechanism in such cases.
By understanding the cause of the issue and implementing an appropriate solution, you should be able to resolve these issues and continue developing your smart contract or web3 application.
Leave a Reply