solidity ERC20 transferFrom 没有报错但不执行
solidity ERC20 transferFrom gives no error but does not execute
我有一个 Solidity 代码,旨在用 myToken(都是 ERC20)交换 BUSD,它调用 BUSD.transferFrom() 和 myToken.transfer(),但尽管核心执行没有错误myToken 已转移。
账户已获批,余额充足。
能指出错误吗?
bytes4 private constant SELECTOR_TRANSFER = bytes4(keccak256(bytes('transfer(address,uint256)')));
bytes4 private constant SELECTOR_TRANSFERFROM = bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
function _myTokenTransfer(uint256 amount) private {
_safeTransfer(myToken_addr, _msgSender(), amount);
}
function _busdTransfer(uint256 amount) private {
_safeTransferFrom(busd_addr, _msgSender(), address(this), amount);
}
function _safeTransferFrom(address token, address from, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR_TRANSFERFROM, from , to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'myTokenPrivateSale: TRANSFERFROM_FAILED');
}
function _safeTransfer(address token, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR_TRANSFER, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'myTokenPrivateSale: TRANSFER_FAILED');
}
}
您的 busd_addr
未设置(即 0x0
)。
当_safeTransferFrom()
函数执行时,它会向0x0
地址发送一个内部交易。交易不会恢复(没有合约会在 0x0
地址上抛出异常)并且不会 return 任何数据(同样,没有合约会 return 任何数据) .
(bool success, bytes memory data)
// `success` is true because it didn't revert
// `data` is 0x00, the default value
然后验证就成功了。
require(success && (data.length == 0 || ...));
// `success` is true
// `data.length` is 0, so the rest of the OR condition is ignored
我看到你 executed setBUSD()
功能。但是这个函数没有设置 busd_addr
值,它在 _safeTransferFrom()
函数中使用。 (只设置busd
和busd_set
。)
目前无法在您的代码中设置 busd_addr
值。因此,您需要对代码进行适当的更改 - 在 setBUSD()
函数中设置 busd_addr
值,然后重新部署您的合约。
我有一个 Solidity 代码,旨在用 myToken(都是 ERC20)交换 BUSD,它调用 BUSD.transferFrom() 和 myToken.transfer(),但尽管核心执行没有错误myToken 已转移。 账户已获批,余额充足。
能指出错误吗?
bytes4 private constant SELECTOR_TRANSFER = bytes4(keccak256(bytes('transfer(address,uint256)')));
bytes4 private constant SELECTOR_TRANSFERFROM = bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
function _myTokenTransfer(uint256 amount) private {
_safeTransfer(myToken_addr, _msgSender(), amount);
}
function _busdTransfer(uint256 amount) private {
_safeTransferFrom(busd_addr, _msgSender(), address(this), amount);
}
function _safeTransferFrom(address token, address from, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR_TRANSFERFROM, from , to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'myTokenPrivateSale: TRANSFERFROM_FAILED');
}
function _safeTransfer(address token, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR_TRANSFER, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'myTokenPrivateSale: TRANSFER_FAILED');
}
}
您的 busd_addr
未设置(即 0x0
)。
当_safeTransferFrom()
函数执行时,它会向0x0
地址发送一个内部交易。交易不会恢复(没有合约会在 0x0
地址上抛出异常)并且不会 return 任何数据(同样,没有合约会 return 任何数据) .
(bool success, bytes memory data)
// `success` is true because it didn't revert
// `data` is 0x00, the default value
然后验证就成功了。
require(success && (data.length == 0 || ...));
// `success` is true
// `data.length` is 0, so the rest of the OR condition is ignored
我看到你 executed setBUSD()
功能。但是这个函数没有设置 busd_addr
值,它在 _safeTransferFrom()
函数中使用。 (只设置busd
和busd_set
。)
目前无法在您的代码中设置 busd_addr
值。因此,您需要对代码进行适当的更改 - 在 setBUSD()
函数中设置 busd_addr
值,然后重新部署您的合约。