From affaa2e621ac91c5a7b28f0f8e14244d45598a3e Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Fri, 22 Sep 2023 12:05:47 +1000 Subject: [PATCH] Add test to see if hardhat returns reason string (it doesn't) --- ethers/contract.nim | 2 +- ethers/provider.nim | 32 ++++++++++++++++++++++++++------ testmodule/testContracts.nim | 1 + 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/ethers/contract.nim b/ethers/contract.nim index 885b7b3..e4fb046 100644 --- a/ethers/contract.nim +++ b/ethers/contract.nim @@ -261,7 +261,7 @@ proc confirm*(tx: Future[?TransactionResponse], # TODO: handle TransactionStatus.Invalid? if receipt.status == TransactionStatus.Failure: logScope: - transactionHash = receipt.transactionHash + transactionHash = receipt.transactionHash.to0xHex trace "transaction failed, replaying transaction to get revert reason" diff --git a/ethers/provider.nim b/ethers/provider.nim index 198bd8c..f306224 100644 --- a/ethers/provider.nim +++ b/ethers/provider.nim @@ -156,14 +156,11 @@ proc replay*(provider: Provider, tx: PastTransaction, blockNumber: UInt256) {.as method getRevertReason*( provider: Provider, - receipt: TransactionReceipt + hash: TransactionHash, + blockNumber: UInt256 ): Future[?string] {.base, async.} = - if receipt.status != TransactionStatus.Failure: - raiseProviderError "cannot get revert reason, transaction not failed" - - without blockNumber =? receipt.blockNumber or - transaction =? await provider.getTransaction(receipt.transactionHash): + without transaction =? await provider.getTransaction(hash): return none string try: @@ -173,6 +170,29 @@ method getRevertReason*( # should contain the revert reason return some e.msg +method getRevertReason*( + provider: Provider, + receipt: TransactionReceipt +): Future[?string] {.base, async.} = + + if receipt.status != TransactionStatus.Failure: + raiseProviderError "cannot get revert reason, transaction not failed" + + without blockNumber =? receipt.blockNumber: + return none string + + return await provider.getRevertReason(receipt.transactionHash, blockNumber) + # without blockNumber =? receipt.blockNumber or + # transaction =? await provider.getTransaction(receipt.transactionHash): + # return none string + + # try: + # await provider.replay(transaction, blockNumber) + # return none string + # except ProviderError as e: + # # should contain the revert reason + # return some e.msg + proc confirm*(tx: TransactionResponse, confirmations = EthersDefaultConfirmations, timeout = EthersReceiptTimeoutBlks): diff --git a/testmodule/testContracts.nim b/testmodule/testContracts.nim index c17709a..cf8a140 100644 --- a/testmodule/testContracts.nim +++ b/testmodule/testContracts.nim @@ -2,6 +2,7 @@ import std/json import std/options import pkg/asynctest import pkg/questionable +import pkg/stew/byteutils import pkg/stint import pkg/ethers import pkg/ethers/erc20