从代币合约里面转出额度提示不足,实际是有这么多的

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";

pragma solidity >=0.6.0;

contract uu is Ownable, ERC20 {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

   constructor() public ERC20("uu", "uu") {

        _mint(address(this), 10000000e18);
    }

    function stake(uint _amount) external {

        transfer(msg.sender, _amount);
    }

}

合约就是上面这样的,出现合约里mint了币,但是调用stake(1),转出1个就提示额度不够

请先 登录 后评论

最佳答案 2022-05-10 11:12

uu 本身就是ERC20 合约, 当调用自己的transfer时, 不会切换上下文。

根据transfer对应的实现: _transfer(_msgSender(), recipient, amount);

因此 transfer 的调用者_msgSender() 就是你自己,而不是合约。

你这里可以直接使用 _transfer(address(this), msg.sender, amount);

请先 登录 后评论

其它 1 个回答

wess
请先 登录 后评论
  • 2 关注
  • 0 收藏,2849 浏览
  • 孙三胖 提出于 2022-05-09 19:07