diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/LogsOracle.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/LogsOracle.kt index 26623baa..77e51a09 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/LogsOracle.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/LogsOracle.kt @@ -33,12 +33,24 @@ class LogsOracle( } fun estimate( + limit: Long?, fromBlock: Long, toBlock: Long, address: List, topics: List>, - ): Mono { - return Mono.fromCallable { db.Query(fromBlock, toBlock, address, topics) } + ): Mono { + return Mono.fromCallable { + try { + val estimate = db.Query(limit, fromBlock, toBlock, address, topics) + "{\"total\":$estimate,\"overflow\":false}" + } catch (e: org.drpc.logsoracle.LogsOracle.LogsOracleException) { + if (e.isQueryOverflow()) { + "{\"total\":-1,\"overflow\":true}" + } else { + throw e + } + } + } .subscribeOn(scheduler) } } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumLocalReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumLocalReader.kt index 8fc1b0d2..1612611c 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumLocalReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumLocalReader.kt @@ -183,6 +183,10 @@ class EthereumLocalReader( val req = params[0] as LinkedHashMap + val limit = try { req.get("limit") as Integer? } catch (_: IllegalArgumentException) { + throw RpcException(RpcResponseError.CODE_INVALID_METHOD_PARAMS, "Invalid 'limit' parameter") + } + val fromBlock = try { parseBlockRef(req.get("fromBlock") as String?) } catch (_: IllegalArgumentException) { throw RpcException(RpcResponseError.CODE_INVALID_METHOD_PARAMS, "Invalid 'fromBlock' parameter") } @@ -217,8 +221,8 @@ class EthereumLocalReader( throw RpcException(RpcResponseError.CODE_INVALID_METHOD_PARAMS, "Invalid 'topics' parameter") } - return logsOracle.estimate(fromBlock, toBlock, address, topics) - .map { "{\"result\":$it}".toByteArray() to null } + return logsOracle.estimate(limit?.toLong() ?: null, fromBlock, toBlock, address, topics) + .map { it.toByteArray() to null } } private fun parseBlockRef(blockRef: String?): Long { diff --git a/src/main/resources/LogsOracle.jar b/src/main/resources/LogsOracle.jar index b2a7d2d1..55dd95f1 100644 Binary files a/src/main/resources/LogsOracle.jar and b/src/main/resources/LogsOracle.jar differ