Fix nethermind reverted error (#345)
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
package io.emeraldpay.dshackle.rpc
|
||||
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
interface ErrorProcessor {
|
||||
|
||||
fun matches(result: NativeCall.CallResult): Boolean
|
||||
|
||||
fun errorProcess(error: NativeCall.CallError): NativeCall.CallError
|
||||
}
|
||||
|
||||
@Component
|
||||
open class ErrorCorrector(
|
||||
private val processors: List<ErrorProcessor>,
|
||||
) {
|
||||
|
||||
fun correctError(result: NativeCall.CallResult): NativeCall.CallError {
|
||||
if (!result.isError()) {
|
||||
throw IllegalStateException("No error to correct")
|
||||
}
|
||||
return processors
|
||||
.firstOrNull { it.matches(result) }
|
||||
?.errorProcess(result.error!!)
|
||||
?: result.error!!
|
||||
}
|
||||
}
|
||||
|
||||
@Component
|
||||
class NethermindEthCallRevertedErrorProcessor : ErrorProcessor {
|
||||
override fun matches(result: NativeCall.CallResult): Boolean {
|
||||
return result.ctx?.payload?.method == "eth_call" && (result.error?.data?.startsWith("Reverted") ?: false)
|
||||
}
|
||||
|
||||
override fun errorProcess(error: NativeCall.CallError): NativeCall.CallError {
|
||||
return NativeCall.CallError(
|
||||
3,
|
||||
error.message,
|
||||
error.upstreamError,
|
||||
error.data?.removePrefix("Reverted "),
|
||||
error.upstreamId,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -65,6 +65,7 @@ open class NativeCall(
|
||||
private val signer: ResponseSigner,
|
||||
config: MainConfig,
|
||||
private val tracer: Tracer,
|
||||
private val errorCorrector: ErrorCorrector,
|
||||
) {
|
||||
|
||||
private val log = LoggerFactory.getLogger(NativeCall::class.java)
|
||||
@@ -173,11 +174,12 @@ open class NativeCall(
|
||||
.setSucceed(!it.isError())
|
||||
.setId(it.id)
|
||||
if (it.isError()) {
|
||||
it.error?.let { error ->
|
||||
result.setErrorMessage(error.message)
|
||||
.setErrorCode(error.id)
|
||||
it.error?.let { _ ->
|
||||
val fixedError = errorCorrector.correctError(it)
|
||||
result.setErrorMessage(fixedError.message)
|
||||
.setErrorCode(fixedError.id)
|
||||
|
||||
error.data?.let { data ->
|
||||
fixedError.data?.let { data ->
|
||||
result.setErrorData(data)
|
||||
}
|
||||
}
|
||||
@@ -566,7 +568,7 @@ open class NativeCall(
|
||||
|
||||
open class CallFailure(val id: Int, val reason: Throwable) : Exception("Failed to call $id: ${reason.message}")
|
||||
|
||||
open class CallError(
|
||||
data class CallError(
|
||||
val id: Int,
|
||||
val message: String,
|
||||
val upstreamError: JsonRpcError?,
|
||||
|
||||
Reference in New Issue
Block a user