在智能合约中实现IBEP20接口

Implement IBEP20 interface in smart contract

contract Main  {
  string public name_ = "Test";

  mapping (address=>bool) addressIsApproved; 

  IBEP20 public immutable busd;
  constructor (IBEP20 _busdContract){
    busd = _busdContract;
  }


  function approve (uint256 _amount) public {
     bool isApproved =  IBEP20(busd).approve(msg.sender,_amount);
     addressIsApproved[msg.sender] = isApproved;
  }

  function buy(uint256 _amount) public returns (uint) {
      //
      bool isApproved = addressIsApproved[msg.sender];
      if (!isApproved) return 0;

      bool isPay =  IBEP20(busd).transferFrom(msg.sender,address(this), _amount);  
      if (!isPay) return 0;

      //do something...;
      
      return 1;
  }
}

我尝试在合约中充值BUSD,调用Buy方法时报错:“余额不足”。

在 approve 函数中,当你调用 IBEP20(busd).approve(msg.sender,amount) 你的合约是将交易发送到 busd 合约的合约,所以这里你不是在批准你的合约来移动用户令牌,你在做相反的事情,你是在批准用户移动合约拥有的代币,如果你想让用户批准合约,用户应该先直接调用busd合约的approve函数,然后再调用buy函数