【发布时间】: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