【问题标题】:Solidity Transaction IssueSolidity 交易问题
【发布时间】:2022-08-12 04:34:05
【问题描述】:

我正面临一些奇怪的问题,或者是我不理解的事情。我还是很新的solidity,无论如何,我正在尝试基于我创建的ERC20代币创建一个质押合约。我用 ethers.js 调用质押函数并传递金额。质押合约保存一些信息并将接收方地址和金额转发到 ERC20 转账功能。

async function stake () {
  await stakeContract.stake(1);
}


function stake (uint256 _amount) public {
     require(_amount > 0, \"You must stake more than 0\");
     require(_amount < ercToken.balanceOf(msg.sender), \"The amount exceeds your balance\");
     addressToStaked[msg.sender].push(Stakes(block.timestamp, _amount));
     totalStakes[msg.sender] += 1;
     ercToken.transfer(address(ercToken), _amount);
}

然后,传递函数将数据转发到如下所示的内部 _transfer 函数。问题是,即使我的钱包里确实有足够的代币,_transfer 函数仍然会失败并出现错误:金额超过余额。

我已经仔细检查了保存余额的映射并且它有效。

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);
}

    标签: blockchain ethereum solidity ethers.js


    【解决方案1】:

    看来你在质押合同的这条线上犯了一个错误。

    function stake (uint256 _amount) public {
         ...
         ercToken.transfer(address(ercToken), _amount);
    }
    

    上述行的意思是,将“_amount”代币从质押合约转移到“ercToken”地址。因此,在质押合约上应该有一定数量( >_amount )的代币。但正如你所提到的,你的钱包里只有足够的代币,而不是 Staking 合约。

    请使用“SafeERC20”库的“transferFrom”函数或“safeTransferFrom”函数来解决这个问题。

    【讨论】:

      猜你喜欢
      • 2022-08-13
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2012-01-23
      • 2023-03-29
      相关资源
      最近更新 更多