从TransferHelper.sol获取TransferHelper:Transfer_From_失败。为什么? [英] Getting TransferHelper: TRANSFER_FROM_FAILED from TransferHelper.sol. Why?
本文介绍了从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 Failed
或approved fail
的消息,并检查我们的ERC20令牌码以及提交的数据是否有效。
第一个问题:
当您的ERC20令牌无法传输时,通常会出现此问题。 原因有几个:未审核、余额不足...第二个问题:
abi.encodeWithSelector(0x23b872dd, from, to, value)
该函数向ERC20令牌的transfer(...)
返回一个选择器(可以认为是一个函数ref)。而这被token.call(
称为一种反射。
这篇关于从TransferHelper.sol获取TransferHelper:Transfer_From_失败。为什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文