[英]Solidity Transfer Issue
我创建了一个 ERC20 代币和第二个名为 Vendor 的合约,它只应该接收 ETH,然后调用 ERC20 合约的转账 function 将代币发送给买方。
通过 ether.js,我在供应商合同上调用 Buy function,发送的 eth 数量如下
async function buy() {
const request = await vendorContract.buyTokens(
{
from: accounts[0],
value: ethers.utils.parseUnits("0.1")
}
);
}
一旦 Vendor 合约收到交易,它会检查金额是否高于 0,并检查 Vendor 合约余额以确保它能够支付,如下所示
function buyTokens() public payable returns (uint256 tokenAmount) {
require(msg.value > 0, "Send ETH to buy some tokens");
uint256 amountToBuy = msg.value * tokensPerEth;
// check if the Vendor Contract has enough amount of tokens for the transaction
uint256 contractBalance = ercToken.balanceOf(address(this));
require(contractBalance >= amountToBuy, "Vendor contract has not enough tokens in its
balance");
// Transfer token to the msg.sender
(bool sent) = ercToken.transfer(msg.sender, amountToBuy);
require(sent, "Failed to transfer token to user");
// emit the event
emit BuyTokens(msg.sender, msg.value, amountToBuy);
return amountToBuy;
}
到目前为止,一切正常,然后,ERC20 智能合约应该将用户购买的代币数量转移到用户的地址,如下所示
function transfer(address to, uint256 amount) public virtual override returns (bool) {
_transfer(msg.sender, to, amount * 1e18);
return true;
ERC20 智能合约转账 function 将调用者设置为 msg.sender,在这种情况下,我们的 Vendor 智能合约,传递“to”地址并乘以金额 * 分位数 (18),然后调用 _transfer ZC1C425268E68385D1AB5074C17A94F14
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
这就是我的问题开始的地方,即使 ERC20 合约和供应商合约的余额中都有 1.000.000.000 个代币,_transfer function 未能说明金额超过余额。 知道为什么吗?
从transfer
function,您将msg.sender
作为from
传递给_transfer
function。 这意味着您正在尝试从 msg.sender 向 msg.sender 发送令牌。
所以这就是为什么合约在这条线上给你“ERC20:转账金额超过余额”错误require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
fromBalance 为零,因为它还没有收到任何令牌。
你想在这里做的是这个;
在transfer
function 时,您应该像这样通过vendorContract
;
`function transfer(address to, uint256 amount) public virtual override returns (bool) {
_transfer(vendorContract, to, amount * 1e18);
return true;`
这样, _transfer
function 上的from
参数将成为供应商合同,一切都应按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.