Solidity

提取失敗,出現“事務還原”錯誤solidity 編譯器^0.8.4

  • August 1, 2021

我正在編寫我的第一個智能合約,它非常簡單,具有存款和取款兩個功能。使用 hardhat 和 etherjs 進行測試

contract test {
mapping(address => uint256) balances;

function deposit(uint256 amount) external payable {
   balances[msg.sender] += amount;
}

function withdraw() external {
   uint256 amount = balances[msg.sender];
   balances[msg.sender] = 0;
   (bool success, ) = msg.sender.call{value: amount}("");
   require(success, "Transfer failed.");
}

function balanceOf(address account) public view virtual returns (uint256) {
   return balances[account];
}
}

使用 etherjs + hardhat 對其進行測試,並恢復交易,請幫助,我在這裡缺少什麼。

下面是測試案例

 it("TEST CONTRACT", async function () {

Contract= await ethers.getContractFactory("test");
testContract= await Contract.deploy();

await expect(testContract.connect(add1).deposit(100));
expect(await testContract.connect(add1).balanceOf(player1.address)).to.equal(100);
expect(await testContract.connect(add1).withdraw()); // Basically transaction revert from here
console.log('Balance ', add1.address, (await testContract.balanceOf(add1.address)).toNumber())
});

那麼您的deposit功能並不能確保添加到使用者餘額中的金額是實際轉移的金額。例如,可以使用amount= 100 ETH 呼叫此函式,實際上只向合約發送 1 wei,其在合約中的餘額將設置為 100 eth(在這種情況下,當您呼叫提取函式時自然會導致還原) ,並想像合約存在於主網上並實際使用,會導致漏洞利用)。你想使用msg.value而不是在amount這裡 balances[msg.sender] += amount;

引用自:https://ethereum.stackexchange.com/questions/106423