diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamRpcMethodsDetector.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamRpcMethodsDetector.kt index fbde8ad2..5b6c3981 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamRpcMethodsDetector.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/UpstreamRpcMethodsDetector.kt @@ -34,13 +34,17 @@ abstract class UpstreamRpcMethodsDetector( .getIngressReader() .read(ChainRequest(method, param)) .flatMap(ChainResponse::requireResult) - .map { method to true } + .map { + method to true + } .onErrorResume { err -> val notAvailableError = notAvailableRegexps.any { s -> s.containsMatchIn(err.message ?: "") } if (notAvailableError) { + log.error("$method failed with ${err.message}, detect as false") Mono.just(method to false) } else { + log.error("$method failed with ${err.message}, do not detect") Mono.empty() } } @@ -50,7 +54,7 @@ abstract class UpstreamRpcMethodsDetector( it .map { p -> p as Pair } .associate { (method, enabled) -> method to enabled } - } + }.switchIfEmpty(Mono.just(emptyMap())) protected abstract fun detectByMagicMethod(): Mono> diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetector.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetector.kt index a2b03e4a..acc3a525 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetector.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetector.kt @@ -33,6 +33,7 @@ class BasicEthUpstreamRpcMethodsDetector( override fun rpcMethods(): Set> = setOf( "eth_getBlockReceipts" to ListParams("latest"), + "trace_callMany" to ListParams(listOf(listOf())), ) private fun parseRpcModules(data: ByteArray): Map { diff --git a/src/test/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetectorTest.kt b/src/test/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetectorTest.kt index d760e8b4..3951ceca 100644 --- a/src/test/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetectorTest.kt +++ b/src/test/kotlin/io/emeraldpay/dshackle/upstream/ethereum/BasicEthUpstreamRpcMethodsDetectorTest.kt @@ -39,6 +39,15 @@ class BasicEthUpstreamRpcMethodsDetectorTest { null, ), ) + on { + read(ChainRequest("trace_callMany", ListParams(listOf(listOf())))) + } doReturn + Mono.just( + ChainResponse( + "[]".toByteArray(), + null, + ), + ) } val upstream = @@ -79,6 +88,15 @@ class BasicEthUpstreamRpcMethodsDetectorTest { null, ), ) + on { + read(ChainRequest("trace_callMany", ListParams(listOf(listOf())))) + } doReturn + Mono.just( + ChainResponse( + "[]".toByteArray(), + null, + ), + ) } val upstream = @@ -90,8 +108,9 @@ class BasicEthUpstreamRpcMethodsDetectorTest { val detector = BasicEthUpstreamRpcMethodsDetector(upstream, config) Assertions.assertThat(detector.detectRpcMethods().block()).apply { isNotNull() - hasSize(1) + hasSize(2) containsEntry("eth_getBlockReceipts", true) + containsEntry("trace_callMany", true) } } @@ -119,6 +138,15 @@ class BasicEthUpstreamRpcMethodsDetectorTest { null, ), ) + on { + read(ChainRequest("trace_callMany", ListParams(listOf(listOf())))) + } doReturn + Mono.just( + ChainResponse( + "[]".toByteArray(), + null, + ), + ) } val upstream = diff --git a/src/test/kotlin/io/emeraldpay/dshackle/upstream/polkadot/BasicPolkadotUpstreamRpcMethodsDetectorTest.kt b/src/test/kotlin/io/emeraldpay/dshackle/upstream/polkadot/BasicPolkadotUpstreamRpcMethodsDetectorTest.kt index 187990dd..8f2e715a 100644 --- a/src/test/kotlin/io/emeraldpay/dshackle/upstream/polkadot/BasicPolkadotUpstreamRpcMethodsDetectorTest.kt +++ b/src/test/kotlin/io/emeraldpay/dshackle/upstream/polkadot/BasicPolkadotUpstreamRpcMethodsDetectorTest.kt @@ -64,6 +64,6 @@ class BasicPolkadotUpstreamRpcMethodsDetectorTest { on { getChain() } doReturn Chain.POLKADOT__MAINNET } val detector = BasicPolkadotUpstreamRpcMethodsDetector(upstream) - Assertions.assertThat(detector.detectRpcMethods().block()).isNull() + Assertions.assertThat(detector.detectRpcMethods().block()).isEqualTo(emptyMap()) } }