Solidity
提取失敗,出現“事務還原”錯誤solidity 編譯器^0.8.4
我正在編寫我的第一個智能合約,它非常簡單,具有存款和取款兩個功能。使用 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;