Solidity
有沒有辦法在安全帽測試案例中重置 ETH 餘額?
我一直在嘗試創建一個測試案例文件,其中我有多個 it 語句,其中一些包含本質上應支付的函式。當我執行測試案例時,每個案例都通過,使用者的 ETH 餘額減少(由於氣體)。所以,我想知道是否有辦法將 ETH 餘額重置為其原始值。這個問題有什麼解決辦法嗎?
hardhat_setBalance
是的,您可以在測試期間使用安全帽方法。或者,您可以通過拍攝/恢復到快照來恢復所有狀態更改。
根據ikijong的回答進行更正,答案是肯定的。
根據您需要做什麼,您會想到其他幾個選項
- 如果你的測試不依賴於之前交易的狀態,你可以在下一次測試之前重新部署合約,一切都會和以前一樣。最好的方法是在 BeforeEach 塊中部署合約
- 安全帽使我認為有 20 個帳戶可用。如果它不影響您的測試,您可以使用具有新余額的其他帳戶。
- 在受影響的測試之前,可以獲得餘額並將其考慮到您的結果中。您還可以計算出氣體並將其考慮到您的結果中。
過去我已經完成了上述所有操作,其中選項 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)) ...