繁体   English   中英

Solidity 转移问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM