在智能合约中实现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函数
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函数