从TransferHelper.sol获取TransferHelper:Transfer_From_失败。为什么? [英] Getting TransferHelper: TRANSFER_FROM_FAILED from TransferHelper.sol. Why?

查看:10
本文介绍了从TransferHelper.sol获取TransferHelper:Transfer_From_失败。为什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对坚固是个新手。我当前从safeTransferFrom函数收到以下错误TransferHelper: TRANSFER_FROM_FAILED。谁能告诉我为什么?

此行在做什么?

 (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );

这是整个合同:

// SPDX-License-Identifier: MIT

pragma solidity 0.8.7;

/**
 * @dev A helper methods for interacting with ERC20 tokens and
    sending ETH that do not consistently return true/false.
 */
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x095ea7b3, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: APPROVE_FAILED"
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FAILED"
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FROM_FAILED"
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, "TransferHelper: ETH_TRANSFER_FAILED");
    }
}

推荐答案

只是备注,TransferHelper是预写的库,我们不应该触及它。您应该做的是看到类似Transfer From Failedapproved fail的消息,并检查我们的ERC20令牌码以及提交的数据是否有效。


第一个问题:

当您的ERC20令牌无法传输时,通常会出现此问题。 原因有几个:未审核、余额不足...


第二个问题:

abi.encodeWithSelector(0x23b872dd, from, to, value)

该函数向ERC20令牌的transfer(...)返回一个选择器(可以认为是一个函数ref)。而这被token.call( 称为一种反射。

这篇关于从TransferHelper.sol获取TransferHelper:Transfer_From_失败。为什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆