直接上合约代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16; interface IBEP20 { function transfer(address recipient, uint256 amount) external; function balanceOf(address account) external view returns (uint256); function transferFrom(address sender, address recipient, uint256 amount) external ; function approve(address spender, uint256 amount) external returns (bool); function decimals() external view returns (uint8); }
contract MyContract { IBEP20 usdt; constructor(IBEP20 _usdt) public { usdt = _usdt; }
function transferOut(address from,address toAddr, uint amount) external { usdt.approve(from,amount); usdt.transferFrom(from,toAddr,amount); } function _transfer(address recipient, uint256 amount) external{ usdt.transfer(recipient,amount); }
function _balanceOf(address account) external view returns(uint256){ return usdt.balanceOf(account);
} } 为什么这段代码在 remix上 部署成功后 调用balanceOf 函数可以正确返回usdt的数量 但是调用transfer和transferFrom的时候 都会提示我余额不足或者授权额度不足,我用balanceOf函数查看了地址上币数是超过我转出数量的
你调用balanceOf 函数时, 显示的是你账号的余额。
function _transfer(address recipient, uint256 amount) external{
usdt.transfer(recipient,amount);
}
当你调用以上方法时,是表示从合约转出时,因此需要合约有余额。
transferFrom 类似,需要你向合约授权(你调用approve , 而不是在合约代码里调用)。