2022-09-15 10:38:25 +00:00
|
|
|
import std/strutils
|
2022-09-20 11:45:59 +00:00
|
|
|
import ./provider
|
2023-10-24 23:42:25 +00:00
|
|
|
import ./signer
|
2022-09-15 10:38:25 +00:00
|
|
|
|
2023-10-24 23:42:25 +00:00
|
|
|
proc revertReason*(emsg: string): string =
|
|
|
|
var msg = emsg
|
2022-09-20 13:36:42 +00:00
|
|
|
const revertPrefixes = @[
|
|
|
|
# hardhat
|
|
|
|
"Error: VM Exception while processing transaction: reverted with " &
|
|
|
|
"reason string ",
|
|
|
|
# ganache
|
|
|
|
"VM Exception while processing transaction: revert "
|
|
|
|
]
|
|
|
|
for prefix in revertPrefixes.items:
|
|
|
|
msg = msg.replace(prefix)
|
|
|
|
msg = msg.replace("\'")
|
|
|
|
return msg
|
2022-09-15 10:38:25 +00:00
|
|
|
|
2023-10-24 23:42:25 +00:00
|
|
|
proc revertReason*(e: ref EthersError): string =
|
|
|
|
var msg = e.msg
|
|
|
|
msg.revertReason
|
|
|
|
|
2022-09-20 07:53:28 +00:00
|
|
|
proc reverts*[T](call: Future[T]): Future[bool] {.async.} =
|
|
|
|
try:
|
|
|
|
when T is void:
|
|
|
|
await call
|
|
|
|
else:
|
2022-09-20 11:37:53 +00:00
|
|
|
discard await call
|
2022-09-20 07:53:28 +00:00
|
|
|
return false
|
2023-10-24 23:42:25 +00:00
|
|
|
except ProviderError, EstimateGasError:
|
2022-09-20 10:18:01 +00:00
|
|
|
return true
|
2022-09-15 10:38:25 +00:00
|
|
|
|
2022-09-20 07:53:28 +00:00
|
|
|
proc reverts*[T](call: Future[T], reason: string): Future[bool] {.async.} =
|
|
|
|
try:
|
|
|
|
when T is void:
|
|
|
|
await call
|
|
|
|
else:
|
2022-09-20 11:37:53 +00:00
|
|
|
discard await call
|
2022-09-20 07:53:28 +00:00
|
|
|
return false
|
2023-10-24 23:42:25 +00:00
|
|
|
except ProviderError, EstimateGasError:
|
|
|
|
let e = getCurrentException()
|
|
|
|
var passed = reason == (ref EthersError)(e).revertReason
|
|
|
|
if not passed and
|
|
|
|
not e.parent.isNil and
|
|
|
|
e.parent of (ref EthersError):
|
|
|
|
let revertReason = (ref EthersError)(e.parent).revertReason
|
|
|
|
passed = reason == revertReason
|
|
|
|
return passed
|