Gas

msg.sender.call{value: 0.1 ether, gas: 1}(’’): 為什麼它沒有失敗?不應該嗎?

  • August 16, 2022

我正在做一個簡單的測試來強制恢復交易,但它並沒有發生。

我有這個功能,我打算將其限制gas為 1。

contract MyContract {
   constructor() payable {}
   
   function pleaseFail(uint256 _guess) public {
       (bool sent, ) = msg.sender.call{value: 0.1 ether, gas: 1}("");
       require(sent, "Failed do send ether");
   }
}

我有一個盡可能簡單的測試:

describe("Test fail", function () {
 it("Should fail", async function () {
   const FF = await ethers.getContractFactory("MyContract");
   const _f = await ff.deploy({ value: utils.parseEther("0.1") });
   await _f.deployed();

   _f.pleaseFail(7);
  }
}

但是,當我執行命令行時,它並沒有失敗。我錯過了什麼?這是安全帽的某種預期行為嗎?

npx hardhat test test/myFailure.ts

請發送比乙太稍大的值0.1,並且您也有ff.deploy它應該在的位置FF.deploy,請使用斷言語句以確保它的行為符合您的意願。

   it("Should fail", async function () {
       const FF = await ethers.getContractFactory("MyContract");
       const _f = await FF.deploy({ value: utils.parseEther("0.1") });
       await _f.deployed();
   
       await _f.pleaseFail(7);
       /*await expect(_f.pleaseFail(7)).revertWith('Failed do send ether')*/
}

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