Solidity

有沒有辦法在安全帽測試案例中重置 ETH 餘額?

  • August 25, 2022

我一直在嘗試創建一個測試案例文件,其中我有多個 it 語句,其中一些包含本質上應支付的函式。當我執行測試案例時,每個案例都通過,使用者的 ETH 餘額減少(由於氣體)。所以,我想知道是否有辦法將 ETH 餘額重置為其原始值。這個問題有什麼解決辦法嗎?

hardhat_setBalance是的,您可以在測試期間使用安全帽方法。

或者,您可以通過拍攝/恢復到快照來恢復所有狀態更改。

根據ikijong的回答進行更正,答案是肯定的。

根據您需要做什麼,您會想到其他幾個選項

  1. 如果你的測試不依賴於之前交易的狀態,你可以在下一次測試之前重新部署合約,一切都會和以前一樣。最好的方法是在 BeforeEach 塊中部署合約
  2. 安全帽使我認為有 20 個帳戶可用。如果它不影響您的測試,您可以使用具有新余額的其他帳戶。
  3. 在受影響的測試之前,可以獲得餘額並將其考慮到您的結果中。您還可以計算出氣體並將其考慮到您的結果中。

過去我已經完成了上述所有操作,其中選項 3 是最棘手的,但有時根據您想要實現的目標是必要的。這是我用 chai 完成的部分程式碼。希望能幫助到你

 it("executes valid executions", async function () {

   /// @dev where the executor is also the receiver need to account for txn gas when check to address balance
   txn = txn0
   executor = srs[0]
   
   toBalBefore = await(provider.getBalance(txn.to))
   fromBalBefore = await(provider.getBalance(multiSigWallet.address))
   
   await expect(tx = await multiSigWallet.connect(executor).execute(txn.txId))
     .to.emit(multiSigWallet, 'Executed')
     .withArgs(executor.address, txn.txId)
   
   receipt = await tx.wait()
   gasCost = receipt.cumulativeGasUsed.mul(receipt.effectiveGasPrice)
   toBalAfter = await(provider.getBalance(txn.to))
   expect(toBalAfter).to.equal(toBalBefore.add(txn.amt).sub(gasCost))
   
   fromBalAfter = await(provider.getBalance(multiSigWallet.address))
   expect(fromBalAfter).to.equal(fromBalBefore.sub(txn.amt))
 

   txn = txn1
   executor = srs[1]
   
   toBalBefore = await(provider.getBalance(txn.to))
   fromBalBefore = await(provider.getBalance(multiSigWallet.address))
   
   await expect(tx = await multiSigWallet.connect(executor).execute(txn.txId))
     .to.emit(multiSigWallet, 'Executed')
     .withArgs(executor.address, txn.txId)
   
   receipt = await tx.wait()
   gasCost = receipt.cumulativeGasUsed.mul(receipt.effectiveGasPrice)
   toBalAfter = await(provider.getBalance(txn.to))
   expect(toBalAfter).to.equal(toBalBefore.add(txn.amt).sub(gasCost))
   
   fromBalAfter = await(provider.getBalance(multiSigWallet.address))
   expect(fromBalAfter).to.equal(fromBalBefore.sub(txn.amt))

...

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