判断一个合约是否是erc20合约

function checkERC20(address[] memory _tokens) public view returns(bool[] memory){

        bool[] memory _args = new bool[](_tokens.length);

        for(uint i;i< _tokens.length;i++){
            address _token = _tokens[i];
            _args[i] = true;

            try  IERC20Metadata(_token).name()  returns (string memory ) {

            } catch  {
              _args[i] = false;
              continue;
            }

            try IERC20Metadata(_token).decimals() returns (uint8 ) {

            } catch  {
                _args[i] = false;
                continue;
            }
    }
        return _args;
    }

写了一个合约判断合约里面是否有erc20里面的那些成员,用try catch捕获了,但是试了一下,判断某些合约0x2D18f2d27D50C9b4013DEBA3D54f60996bD8847E比如这个bsc主网的,仍然会执行报错,为什么catch没捕获到这个的错误呢?有些地址是可以的

请先 登录 后评论

最佳答案 2024-10-05 18:37

因为 erc20合约 不支持 ERC165

因此链上没有很好的方法来判断是不是 ERC20 合约。

使用 .name().decimals() 可靠性不高。 也不如使用 transfer 和 transferFrom

请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 0 收藏,957 浏览
  • 孙三胖 提出于 2024-03-02 18:11