diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 00000000..b2fee733 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,17 @@ +{ + "permissions": { + "allow": [ + "Bash(find:*)", + "Bash(./gradlew:*)", + "Bash(./build/install/dshackle/bin/dshackle:*)", + "Bash(ls:*)", + "Bash(node:*)", + "Bash(grep:*)", + "Bash(timeout:*)", + "Bash(gtimeout:*)", + "Bash(git add:*)", + "Bash(git commit:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/dshackle.log b/dshackle.log new file mode 100644 index 00000000..b9624080 --- /dev/null +++ b/dshackle.log @@ -0,0 +1,1626 @@ +Type-safe project accessors is an incubating feature. +Project accessors enabled, but root project name not explicitly set for 'dshackle'. Checking out the project in different folders will impact the generated code and implicitly the buildscript classpath, breaking caching. +Project accessors enabled, but root project name not explicitly set for 'buildSrc'. Checking out the project in different folders will impact the generated code and implicitly the buildscript classpath, breaking caching. +> Task :buildSrc:checkKotlinGradlePluginConfigurationErrors +> Task :buildSrc:generateExternalPluginSpecBuilders UP-TO-DATE +> Task :buildSrc:extractPrecompiledScriptPluginPlugins UP-TO-DATE +> Task :buildSrc:compilePluginsBlocks UP-TO-DATE +> Task :buildSrc:generatePrecompiledScriptPluginAccessors UP-TO-DATE +> Task :buildSrc:generateScriptPluginAdapters UP-TO-DATE +> Task :buildSrc:compileKotlin UP-TO-DATE +> Task :buildSrc:compileJava NO-SOURCE +> Task :buildSrc:compileGroovy NO-SOURCE +> Task :buildSrc:pluginDescriptors UP-TO-DATE +> Task :buildSrc:processResources UP-TO-DATE +> Task :buildSrc:classes UP-TO-DATE +> Task :buildSrc:jar UP-TO-DATE +> Task :chainscodegen +> Task :checkKotlinGradlePluginConfigurationErrors +> Task :extractIncludeProto UP-TO-DATE +> Task :extractProto UP-TO-DATE +> Task :generateProto UP-TO-DATE +> Task :generateVersion +> Task :compileKotlin UP-TO-DATE +> Task :compileJava UP-TO-DATE +> Task :compileGroovy NO-SOURCE +> Task :processResources +> Task :classes + +> Task :run +12:47:41.942 [main] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework +12:47:41.959 [main] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false +12:47:41.959 [main] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 21 +12:47:41.961 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available +12:47:41.961 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available +12:47:41.961 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.storeFence: available +12:47:41.962 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available +12:47:41.962 [main] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: unavailable: Reflective setAccessible(true) disabled +12:47:41.962 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: available, true +12:47:41.964 [main] DEBUG io.netty.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable: class io.netty.util.internal.PlatformDependent0$7 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @5419f379 +12:47:41.965 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.(long, {int,long}): unavailable +12:47:41.965 [main] DEBUG io.netty.util.internal.PlatformDependent - sun.misc.Unsafe: available +12:47:41.965 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.tmpdir: /var/folders/cl/pn7t7r5x6997b_ff39bqwgh40000gn/T (java.io.tmpdir) +12:47:41.965 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model) +12:47:41.966 [main] DEBUG io.netty.util.internal.PlatformDependent - Platform: MacOS +12:47:41.966 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: -1 bytes +12:47:41.966 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: -1 +12:47:41.968 [main] DEBUG io.netty.util.internal.CleanerJava9 - java.nio.ByteBuffer.cleaner(): available +12:47:41.968 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false +12:47:41.972 [main] DEBUG io.netty.util.internal.NativeLibraryLoader - -Dio.netty.native.workdir: /var/folders/cl/pn7t7r5x6997b_ff39bqwgh40000gn/T (io.netty.tmpdir) +12:47:41.972 [main] DEBUG io.netty.util.internal.NativeLibraryLoader - -Dio.netty.native.deleteLibAfterLoading: true +12:47:41.972 [main] DEBUG io.netty.util.internal.NativeLibraryLoader - -Dio.netty.native.tryPatchShadedId: true +12:47:41.972 [main] DEBUG io.netty.util.internal.NativeLibraryLoader - -Dio.netty.native.detectNativeLibraryDuplicates: true +12:47:42.353 [main] DEBUG io.netty.util.internal.NativeLibraryLoader - Successfully loaded the library /var/folders/cl/pn7t7r5x6997b_ff39bqwgh40000gn/T/libnetty_tcnative_osx_aarch_649276021358773954266.dylib +12:47:42.353 [main] DEBUG io.netty.util.internal.NativeLibraryLoader - Loaded library with name 'netty_tcnative_osx_aarch_64' +12:47:42.353 [main] DEBUG io.netty.handler.ssl.OpenSsl - Initialize netty-tcnative using engine: 'default' +12:47:42.353 [main] DEBUG io.netty.handler.ssl.OpenSsl - netty-tcnative using native library: BoringSSL +12:47:42.482 [main] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.level: simple +12:47:42.482 [main] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4 +12:47:42.517 [main] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkAccessible: true +12:47:42.517 [main] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkBounds: true +12:47:42.523 [main] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@6e75aa0d +12:47:42.634 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024 +12:47:42.634 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numHeapArenas: 20 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numDirectArenas: 20 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.pageSize: 8192 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxOrder: 9 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.chunkSize: 4194304 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.smallCacheSize: 256 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.normalCacheSize: 64 +12:47:42.639 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedBufferCapacity: 32768 +12:47:42.640 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimInterval: 8192 +12:47:42.640 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimIntervalMillis: 0 +12:47:42.640 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.useCacheForAllThreads: false +12:47:42.640 [main] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedByteBuffersPerChunk: 1023 +12:47:42.649 [main] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.allocator.type: pooled +12:47:42.649 [main] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.threadLocalDirectBufferSize: 0 +12:47:42.649 [main] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.maxThreadLocalCharBufferSize: 16384 +12:47:42.652 [main] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@659a969b +12:47:42.657 [main] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 4096 +12:47:42.657 [main] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8 +12:47:42.657 [main] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.chunkSize: 32 +12:47:42.657 [main] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.blocking: false +12:47:42.657 [main] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.batchFastThreadLocalOnly: true +12:47:42.660 [main] DEBUG io.netty.util.internal.PlatformDependent - org.jctools-core.MpscChunkedArrayQueue: available +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 => ECDHE-ECDSA-AES128-GCM-SHA256 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 => ECDHE-ECDSA-AES128-GCM-SHA256 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 => ECDHE-RSA-AES128-GCM-SHA256 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_RSA_WITH_AES_128_GCM_SHA256 => ECDHE-RSA-AES128-GCM-SHA256 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 => ECDHE-ECDSA-AES256-GCM-SHA384 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 => ECDHE-ECDSA-AES256-GCM-SHA384 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 => ECDHE-RSA-AES256-GCM-SHA384 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_RSA_WITH_AES_256_GCM_SHA384 => ECDHE-RSA-AES256-GCM-SHA384 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 => ECDHE-ECDSA-CHACHA20-POLY1305 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 => ECDHE-ECDSA-CHACHA20-POLY1305 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 => ECDHE-RSA-CHACHA20-POLY1305 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 => ECDHE-RSA-CHACHA20-POLY1305 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 => ECDHE-PSK-CHACHA20-POLY1305 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 => ECDHE-PSK-CHACHA20-POLY1305 +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA => ECDHE-ECDSA-AES128-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_ECDSA_WITH_AES_128_CBC_SHA => ECDHE-ECDSA-AES128-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA => ECDHE-RSA-AES128-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA => ECDHE-RSA-AES128-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA => ECDHE-PSK-AES128-CBC-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_PSK_WITH_AES_128_CBC_SHA => ECDHE-PSK-AES128-CBC-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA => ECDHE-ECDSA-AES256-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_ECDSA_WITH_AES_256_CBC_SHA => ECDHE-ECDSA-AES256-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA => ECDHE-RSA-AES256-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_RSA_WITH_AES_256_CBC_SHA => ECDHE-RSA-AES256-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA => ECDHE-PSK-AES256-CBC-SHA +12:47:42.667 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_ECDHE_PSK_WITH_AES_256_CBC_SHA => ECDHE-PSK-AES256-CBC-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_RSA_WITH_AES_128_GCM_SHA256 => AES128-GCM-SHA256 +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_RSA_WITH_AES_128_GCM_SHA256 => AES128-GCM-SHA256 +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_RSA_WITH_AES_256_GCM_SHA384 => AES256-GCM-SHA384 +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_RSA_WITH_AES_256_GCM_SHA384 => AES256-GCM-SHA384 +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_RSA_WITH_AES_128_CBC_SHA => AES128-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_RSA_WITH_AES_128_CBC_SHA => AES128-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_PSK_WITH_AES_128_CBC_SHA => PSK-AES128-CBC-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_PSK_WITH_AES_128_CBC_SHA => PSK-AES128-CBC-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_RSA_WITH_AES_256_CBC_SHA => AES256-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_RSA_WITH_AES_256_CBC_SHA => AES256-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: TLS_PSK_WITH_AES_256_CBC_SHA => PSK-AES256-CBC-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.CipherSuiteConverter - Cipher suite mapping: SSL_PSK_WITH_AES_256_CBC_SHA => PSK-AES256-CBC-SHA +12:47:42.668 [main] DEBUG io.netty.handler.ssl.OpenSsl - Supported protocols (OpenSSL): [SSLv2Hello, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3] +12:47:42.668 [main] DEBUG io.netty.handler.ssl.OpenSsl - Default cipher suites (OpenSSL): [TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256] +12:47:42.672 [main] DEBUG reactor.util.Loggers - Using Slf4j logging framework +12:47:42.684 [main] WARN io.emeraldpay.dshackle.HeapDumpCreator - /etc/dshackle/dumps does not exist +12:47:42.684 [main] WARN io.emeraldpay.dshackle.HeapDumpCreator - Heap dump creation is turned off +12:47:42.684 [main] INFO io.emeraldpay.dshackle.Starter - Max heap size: 4096 MB, number of cores: 10 + _ _ __ _ _ _ _ + | | | | / /| | | | | | | | + ___ _ __ ___ ___ _ __ __ _| | __| | / /_| |___| |__ __ _ ___| | _| | ___ + / _ \ '_ ` _ \ / _ \ '__/ _` | |/ _` | / / _` / __| '_ \ / _` |/ __| |/ / |/ _ \ + | __/ | | | | | __/ | | (_| | | (_| |/ / (_| \__ \ | | | (_| | (__| <| | __/ + \___|_| |_| |_|\___|_| \__,_|_|\__,_/_/ \__,_|___/_| |_|\__,_|\___|_|\_\_|\___| + Emerald Dshackle - Fault Tolerant Load Balancer for Blockchain API + https://github.com/emeraldpay/dshackle + v0.65.28-SNAPSHOT built from e115389c50 on 2025-07-17T09:47:41 UTC + +2025-07-17 12:47:43.211 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.StarterKt : Starting StarterKt using Java 21.0.7 on tonatoz.local with PID 54640 (/Users/tonatoz/Developments/drpc/dshackle/build/classes/kotlin/main started by tonatoz in /Users/tonatoz/Developments/drpc/dshackle) +2025-07-17 12:47:43.216 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.StarterKt : No active profile set, falling back to 1 default profile: "default" +2025-07-17 12:47:44.394 INFO [dshackle,,] 54640 --- [ main] i.e.d.config.context.SchedulersConfig : Creating schedulers with multiplier: 5... +2025-07-17 12:47:44.943 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.Config : Using config: /Users/tonatoz/Developments/drpc/dshackle/dshackle.yaml +2025-07-17 12:47:45.810 WARN [dshackle,,] 54640 --- [ main] i.e.d.config.AuthorizationConfigReader : Authorization is not using +2025-07-17 12:47:46.212 INFO [dshackle,,] 54640 --- [ Thread-2] i.e.dshackle.monitoring.MonitoringSetup : Run Prometheus metrics on 127.0.0.1:8081/metrics +2025-07-17 12:47:47.048 INFO [dshackle,,] 54640 --- [ main] i.e.d.m.accesslog.AccessLogWriter : Access Log is disabled +2025-07-17 12:47:47.103 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.GrpcServer : Starting gRPC Server... +2025-07-17 12:47:47.104 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.GrpcServer : Listening Native gRPC on 0.0.0.0:12449 +2025-07-17 12:47:47.168 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.GrpcServer : Compression enabled for gRPC server +2025-07-17 12:47:47.169 WARN [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.TlsSetup : Using insecure transport for Native gRPC +2025-07-17 12:47:47.288 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.GrpcServer : GRPC Server started +2025-07-17 12:47:47.300 INFO [dshackle,,] 54640 --- [ main] i.emeraldpay.dshackle.proxy.ProxyServer : Start HTTP JSON RPC Proxy on http://0.0.0.0:8545 +2025-07-17 12:47:47.300 INFO [dshackle,,] 54640 --- [ main] i.emeraldpay.dshackle.proxy.ProxyServer : Start Websocket JSON RPC Proxy on ws://0.0.0.0:8545 +2025-07-17 12:47:47.347 WARN [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.TlsSetup : Using insecure transport for proxy +2025-07-17 12:47:47.793 INFO [dshackle,,] 54640 --- [ main] io.emeraldpay.dshackle.StarterKt : Started StarterKt in 5.032 seconds (JVM running for 6.204) +2025-07-17 12:47:47.798 INFO [dshackle,,] 54640 --- [ main] i.e.d.s.c.GenericConnectorFactoryCreator : Using Ethereum Mainnet upstream, at wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p, https://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p +2025-07-17 12:47:47.852 INFO [dshackle,,] 54640 --- [ main] i.e.d.upstream.ethereum.GenericWsHead : WS head timeout for ethereum is PT1M +2025-07-17 12:47:47.997 INFO [dshackle,,] 54640 --- [ main] i.e.d.upstream.generic.GenericUpstream : Configured for Ethereum Mainnet +2025-07-17 12:47:47.997 INFO [dshackle,,] 54640 --- [ main] i.e.d.u.ethereum.WsConnectionImpl : Connecting to WebSocket: wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p +2025-07-17 12:47:48.508 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type unknown, skipping validation for upstream ethereum +2025-07-17 12:47:48.531 ERROR [dshackle,,] 54640 --- [ctor-http-nio-4] d.u.e.BasicEthUpstreamRpcMethodsDetector : eth_simulateV1 failed with missing value for required argument 0, detect as true +2025-07-17 12:47:48.547 INFO [dshackle,,] 54640 --- [nts-scheduler-1] i.e.d.u.generic.GenericMultistream : Upstream ethereum with chain ETHEREUM__MAINNET has been added +2025-07-17 12:47:48.571 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Upstream rpc method detector for ethereum returned {eth_accounts=true, eth_blockNumber=true, eth_call=true, eth_chainId=true, eth_coinbase=true, eth_createAccessList=true, eth_estimateGas=true, eth_feeHistory=true, eth_gasPrice=true, eth_getBalance=true, eth_getBlockByHash=true, eth_getBlockByNumber=true, eth_getBlockReceipts=true, eth_getBlockTransactionCountByHash=true, eth_getBlockTransactionCountByNumber=true, eth_getCode=true, eth_getLogs=true, eth_getProof=true, eth_getStorageAt=true, eth_getTransactionByBlockHashAndIndex=true, eth_getTransactionByBlockNumberAndIndex=true, eth_getTransactionByHash=true, eth_getTransactionCount=true, eth_getTransactionReceipt=true, eth_getUncleByBlockHashAndIndex=true, eth_getUncleByBlockNumberAndIndex=true, eth_getUncleCountByBlockHash=true, eth_getUncleCountByBlockNumber=true, eth_hashrate=true, eth_maxPriorityFeePerGas=true, eth_mining=true, eth_protocolVersion=true, eth_sendRawTransaction=true, eth_syncing=true, net_listening=true, net_peerCount=true, net_version=true, web3_clientVersion=true, eth_getFilterChanges=true, eth_getFilterLogs=true, eth_uninstallFilter=true, eth_newFilter=true, eth_newBlockFilter=true, eth_newPendingTransactionFilter=true, trace_call=true, trace_callMany=true, trace_rawTransaction=true, trace_replayBlockTransactions=true, trace_replayTransaction=true, trace_block=true, trace_filter=true, trace_get=true, trace_transaction=true, debug_storageRangeAt=true, debug_traceBlock=true, debug_traceBlockByHash=true, debug_traceBlockByNumber=true, debug_traceCall=true, debug_traceCallMany=true, debug_traceTransaction=true, debug_getRawHeader=true, eth_simulateV1=true} +2025-07-17 12:47:48.596 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 12:47:48.596 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 12:47:48.614 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 12:47:48.618 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 12:47:48.619 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 12:47:48.631 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 12:47:48.678 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 12:48:05.428 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:05.435 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:05.555 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:05.555 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:06.503 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:06.504 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:14.624 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:14.840 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:48:18.514 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:48:18.566 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938124, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=1, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:48:48.576 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:49:03.543 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938128, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=1, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:49:18.520 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:49:18.542 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938129, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=1, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:49:48.540 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:50:03.546 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938133, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=1, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:50:18.530 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:50:18.539 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938134, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=1, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:50:18.626 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 12:50:18.646 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 12:50:18.648 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 12:50:18.648 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 12:50:18.648 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 12:50:18.648 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 12:50:18.708 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 12:50:48.521 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:51:03.612 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938138, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=1, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:51:03.906 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:03.966 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:05.791 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:05.799 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:05.948 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:05.949 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:08.150 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:08.154 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:51:18.517 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:51:18.543 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938139, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:51:48.539 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:51:48.555 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938141, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:52:18.515 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:52:33.547 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938145, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:52:48.517 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:52:48.608 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 12:52:48.609 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 12:52:48.609 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 12:52:48.630 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 12:52:48.630 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 12:52:48.639 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 12:52:48.682 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 12:53:03.551 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938148, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:53:18.522 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:53:18.555 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938149, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:53:48.473 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:53:48.508 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938151, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:54:03.841 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:03.891 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:05.462 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:05.462 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:05.539 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:05.539 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:06.650 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:06.651 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:54:18.461 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:54:33.498 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938155, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:54:48.460 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:55:03.493 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938158, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:55:18.470 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:55:18.585 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 12:55:18.593 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 12:55:18.594 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 12:55:18.596 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 12:55:18.597 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 12:55:18.601 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 12:55:18.660 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 12:55:33.495 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938160, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:55:48.529 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:56:03.494 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938163, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:56:18.479 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:56:18.490 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938164, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:56:48.464 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:56:48.486 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938166, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:57:03.694 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:03.696 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:05.468 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:05.469 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:05.676 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:05.676 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:07.048 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:07.049 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 12:57:18.471 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:57:33.496 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938170, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:57:48.462 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:57:48.550 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 12:57:48.550 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 12:57:48.552 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 12:57:48.557 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 12:57:48.572 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 50000000 for upstream ethereum +2025-07-17 12:57:48.572 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 50000000 for upstream ethereum +2025-07-17 12:57:48.616 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 12:58:03.490 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938173, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:58:18.477 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:58:33.498 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938175, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:58:48.468 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:59:03.489 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938177, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:59:18.476 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:59:33.512 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938179, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 12:59:48.467 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 12:59:48.485 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938180, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:00:03.673 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:03.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:05.424 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:05.425 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:05.508 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:05.509 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:07.093 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:07.102 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:00:18.474 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:00:18.595 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:00:18.596 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:00:18.599 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:00:18.633 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:00:18.634 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 50000000 for upstream ethereum +2025-07-17 13:00:18.634 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 50000000 for upstream ethereum +2025-07-17 13:00:18.683 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:00:33.493 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938184, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:00:48.498 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:01:03.490 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938187, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:01:18.468 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:01:33.491 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938189, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:01:48.473 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:02:03.493 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938192, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:02:18.473 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:02:18.488 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938193, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:02:48.474 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:02:48.560 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:02:48.564 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:02:48.565 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:02:48.572 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:02:48.573 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:02:48.591 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:02:48.638 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:03:03.492 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938197, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:03:03.673 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:03.677 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:05.455 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:05.456 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:05.536 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:05.536 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:06.576 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:06.576 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:03:18.474 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:03:18.487 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938198, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:03:48.472 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:03:48.493 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938200, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:04:18.464 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:04:18.490 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938203, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:04:48.471 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:04:48.488 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938205, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:05:18.471 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:05:18.548 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:05:18.568 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:05:18.572 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:05:18.573 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:05:18.589 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:05:18.590 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:05:18.640 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:05:33.490 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938209, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:05:48.466 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:06:03.490 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938212, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:06:03.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:03.656 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:05.438 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:05.438 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:05.619 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:05.620 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:05.928 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:05.929 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:06:18.465 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:06:18.484 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938213, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:06:48.489 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:07:03.495 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938217, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:07:18.469 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:07:18.486 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938218, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:07:48.464 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:07:48.490 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938220, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:07:48.576 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:07:48.577 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:07:48.584 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:07:48.596 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:07:48.598 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:07:48.598 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:07:48.659 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:08:18.463 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:08:18.486 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938223, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:08:48.458 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:09:03.522 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938227, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:09:03.674 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:03.688 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:05.531 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:05.545 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:05.589 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:05.590 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:05.891 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:05.891 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:09:18.560 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:09:33.568 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938229, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:09:48.551 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:09:48.563 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938230, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:10:18.553 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:10:18.637 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:10:18.642 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:10:18.643 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:10:18.651 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:10:18.651 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:10:18.701 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:10:18.733 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:10:33.586 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938234, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:10:48.556 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:11:03.584 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938237, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:11:18.547 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:11:33.566 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938239, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:11:48.552 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:11:48.565 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938240, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:12:03.767 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:03.772 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:05.736 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:05.744 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:05.752 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:05.753 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:05.951 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:05.952 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:12:18.551 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:12:33.581 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938244, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:12:48.547 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:12:48.647 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:12:48.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:12:48.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:12:48.660 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:12:48.705 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:12:48.706 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:12:48.715 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:13:03.566 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938247, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:13:18.548 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:13:33.569 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938249, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:13:48.552 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:14:03.569 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938252, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:14:18.545 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:14:33.572 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938254, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:14:48.544 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:15:03.587 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938257, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:15:03.784 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:03.792 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:05.564 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:05.568 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:05.672 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:05.673 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:05.692 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:05.693 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:15:18.557 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:15:18.645 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:15:18.647 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:15:18.647 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:15:18.649 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:15:18.649 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:15:18.709 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:15:18.729 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:15:33.608 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938259, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:15:48.548 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:16:03.576 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938262, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:16:18.542 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:16:33.586 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938264, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:16:48.553 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:16:48.568 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938265, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:17:18.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:17:18.590 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938268, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:17:48.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:17:48.753 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:17:48.755 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:17:48.756 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:17:48.793 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:17:48.794 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:17:48.801 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:17:48.854 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:18:03.575 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938272, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:18:03.740 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:03.784 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:05.561 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:05.566 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:05.627 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:05.628 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:05.880 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:05.880 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:18:18.548 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:18:33.574 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938274, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:18:48.558 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:19:03.574 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938277, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:19:18.546 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:19:33.575 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938279, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:19:48.550 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:19:48.569 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938280, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:20:18.549 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:20:18.574 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938283, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:20:18.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:20:18.653 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:20:18.655 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:20:18.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 650000000 for upstream ethereum +2025-07-17 13:20:18.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:20:18.694 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:20:18.748 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:20:48.672 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:21:03.579 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938287, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:21:03.755 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:03.841 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:05.490 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:05.493 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:05.814 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:05.814 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:06.352 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:06.352 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:21:18.540 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:21:33.573 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938289, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:21:48.551 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:22:03.575 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938292, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:22:18.556 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:22:33.585 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938294, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:22:48.553 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:22:48.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938295, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:22:48.689 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:22:48.691 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:22:48.712 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:22:48.716 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:22:48.717 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:22:48.753 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:22:48.783 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:23:18.550 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:23:18.572 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938298, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:23:48.578 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:24:03.599 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938302, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:24:03.795 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:03.814 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:05.574 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:05.581 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:05.631 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:05.633 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:05.762 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:05.762 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:24:18.556 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:24:33.624 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938304, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:24:48.549 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:25:03.575 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938307, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:25:18.542 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:25:18.649 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:25:18.651 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:25:18.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:25:18.655 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:25:18.655 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:25:18.660 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:25:18.733 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:25:33.560 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938309, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:25:48.550 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:26:03.557 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938312, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:26:18.543 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:26:18.561 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938313, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:26:48.545 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:26:48.564 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938315, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:27:03.749 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:03.801 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:05.490 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:05.494 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:05.570 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:05.571 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:05.803 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:05.803 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:27:18.554 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:27:33.576 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938319, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:27:48.535 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:27:48.558 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938320, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:27:48.620 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:27:48.620 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:27:48.620 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:27:48.635 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 18446744073709551615 for upstream ethereum +2025-07-17 13:27:48.636 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 18446744073709551615 for upstream ethereum +2025-07-17 13:27:48.689 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:27:48.698 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:28:18.568 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:28:18.571 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938323, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:28:48.554 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:29:03.574 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938327, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:29:18.534 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:29:18.562 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938328, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:29:48.534 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:29:48.565 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938330, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:30:03.869 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:03.897 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:05.732 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:05.733 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:05.758 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:05.759 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:05.764 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:05.764 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:30:18.546 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:30:18.640 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:30:18.641 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:30:18.647 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:30:18.649 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:30:18.655 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:30:18.671 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:30:18.728 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:30:33.564 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938334, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:30:48.562 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:31:03.574 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938337, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:31:18.539 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:31:33.599 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938338, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:31:48.541 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:31:48.562 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938339, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:32:18.535 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:32:33.565 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938343, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:32:48.551 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:32:48.635 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:32:48.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:32:48.653 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:32:48.657 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:32:48.664 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:32:48.665 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:32:48.713 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:33:03.559 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938346, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:33:03.742 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:03.746 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:05.552 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:05.553 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:05.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:05.653 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:06.151 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:06.153 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:33:18.538 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:33:33.567 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938348, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:33:48.536 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:34:03.563 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938351, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:34:18.542 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:34:18.560 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938352, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:34:48.588 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:35:03.583 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938356, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:35:18.609 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:35:18.905 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:35:18.911 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:35:18.917 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:35:18.940 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:35:18.942 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:35:18.959 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:35:19.030 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:35:33.602 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938358, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:35:48.576 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:36:03.584 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938361, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:36:03.829 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:03.830 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:05.655 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:05.656 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:05.868 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:05.868 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:05.942 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:05.943 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:36:18.601 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:36:33.641 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938363, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:36:48.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:37:03.569 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938366, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:37:18.557 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:37:18.572 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938367, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:37:48.549 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:37:48.655 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:37:48.656 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:37:48.661 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:37:48.663 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:37:48.664 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:37:48.664 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:37:48.713 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:38:03.567 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938371, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:38:18.553 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:38:33.575 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938373, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:38:48.597 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:39:03.633 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938376, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:39:03.871 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:03.914 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:05.717 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:05.720 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:05.898 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:05.898 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:06.591 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:06.591 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:39:18.592 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:39:33.580 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938378, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:39:48.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:40:03.577 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938381, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:40:18.723 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:40:19.203 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:40:19.216 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:40:19.242 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:40:19.244 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:40:19.322 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:40:19.323 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:40:19.405 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:40:33.681 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938383, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:40:48.630 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:41:03.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938386, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:41:18.605 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:41:33.719 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938388, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:41:48.576 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:42:03.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938391, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:42:03.827 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:03.830 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:05.618 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:05.623 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:05.684 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:05.685 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:06.343 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:06.343 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:42:18.560 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:42:33.587 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938393, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:42:48.559 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:42:48.584 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938394, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:42:48.651 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:42:48.652 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:42:48.656 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:42:48.657 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:42:48.657 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:42:48.685 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:42:48.781 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:43:18.563 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:43:33.589 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938398, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:43:48.558 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:44:03.595 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938401, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:44:18.561 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:44:33.591 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938403, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:44:48.573 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:45:03.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938406, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:45:03.901 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:03.901 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:05.700 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:05.703 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:05.840 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:05.841 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:05.873 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:05.873 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:45:18.570 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:45:18.668 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:45:18.676 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:45:18.677 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:45:18.677 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:45:18.701 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:45:18.701 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:45:18.780 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:45:33.598 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938408, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:45:48.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:46:03.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938411, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:46:18.585 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:46:18.599 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938412, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:46:48.588 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:47:03.589 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938416, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:47:18.559 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:47:33.596 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938418, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:47:48.567 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:47:48.585 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938419, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:47:48.646 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:47:48.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:47:48.670 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:47:48.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:47:48.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:47:48.735 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:47:48.891 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:48:03.752 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:03.819 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:05.458 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:05.459 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:05.515 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:05.515 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:05.550 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:05.550 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:48:18.562 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:48:33.589 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938423, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:48:48.564 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:49:03.587 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938426, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:49:18.557 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:49:18.583 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938427, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:49:48.565 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:50:03.595 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938431, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:50:18.560 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:50:18.651 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:50:18.653 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:50:18.665 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:50:18.670 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:50:18.689 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:50:18.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:50:18.737 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:50:33.593 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938433, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:50:48.560 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:50:48.586 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938434, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:51:03.754 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:03.771 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:05.464 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:05.466 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:05.563 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:05.563 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:05.711 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:05.712 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:51:18.563 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:51:18.595 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938437, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:51:48.575 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:51:48.594 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938439, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:52:18.568 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:52:33.593 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938443, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:52:48.565 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:52:48.589 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938444, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:52:48.656 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:52:48.657 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:52:48.662 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:52:48.663 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:52:48.674 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:52:48.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:52:48.733 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:53:18.568 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:53:18.591 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938447, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:53:48.566 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:53:48.588 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938449, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:54:03.773 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:03.775 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:05.528 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:05.528 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:05.638 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:05.639 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:05.709 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:05.710 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:54:18.567 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:54:33.595 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938453, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:54:48.567 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:54:48.609 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938454, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:55:18.568 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:55:18.591 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938457, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:55:18.661 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:55:18.663 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:55:18.663 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:55:18.666 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:55:18.666 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:55:18.743 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:55:18.920 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:55:48.565 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:56:03.604 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938461, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:56:18.567 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:56:18.593 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938462, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:56:48.566 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:56:48.591 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938464, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:57:03.764 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:03.766 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:05.476 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:05.476 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:05.631 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:05.632 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:05.973 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:05.974 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 13:57:18.568 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:57:18.592 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938467, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:57:48.566 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:57:48.657 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 13:57:48.658 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 13:57:48.658 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 13:57:48.680 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 13:57:48.681 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 13:57:48.681 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 13:57:48.795 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 13:58:03.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938471, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:58:18.579 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:58:33.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938473, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:58:48.568 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:59:03.594 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938476, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:59:18.571 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:59:33.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938478, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 13:59:48.568 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 13:59:48.592 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938479, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:00:03.757 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:03.773 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:05.564 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:05.567 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:05.702 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:05.703 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:06.233 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:06.238 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:00:18.566 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:00:19.034 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:00:19.035 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:00:19.040 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:00:19.040 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:00:19.073 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:00:19.074 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:00:19.147 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:00:33.607 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938483, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:00:48.575 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:01:03.599 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938486, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:01:18.569 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:01:33.596 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938488, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:01:48.577 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:02:03.596 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938491, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:02:18.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:02:18.592 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938492, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:02:48.581 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:02:48.686 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:02:48.693 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:02:48.694 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:02:48.709 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:02:48.709 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:02:48.729 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:02:48.769 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:03:03.597 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938496, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:03:03.756 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:03.780 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:05.467 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:05.467 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:05.503 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:05.504 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:05.663 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:05.664 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:03:18.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:03:33.598 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938498, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:03:48.573 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:03:48.602 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938499, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:04:18.571 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:04:33.601 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938503, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:04:48.583 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:04:48.598 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938504, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:05:18.570 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:05:18.599 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938507, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:05:18.667 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:05:18.671 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:05:18.673 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:05:18.691 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:05:18.692 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:05:18.692 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:05:18.776 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:05:48.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:06:03.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938511, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:06:03.779 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:03.789 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:05.543 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:05.543 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:05.628 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:05.629 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:06.134 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:06.135 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:06:18.572 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:06:33.609 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938513, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:06:48.584 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:06:48.598 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938514, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:07:18.572 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:07:33.597 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938518, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:07:48.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:07:48.658 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:07:48.660 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:07:48.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:07:48.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 18446744073709551615 for upstream ethereum +2025-07-17 14:07:48.676 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 18446744073709551615 for upstream ethereum +2025-07-17 14:07:48.686 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:07:48.752 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:08:03.608 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938521, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:08:18.576 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:08:33.606 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938523, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:08:48.573 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:08:48.599 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938524, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:09:03.770 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:03.790 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:05.500 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:05.501 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:05.618 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:05.618 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:05.735 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:05.736 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:09:18.571 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:09:33.611 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938528, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:09:48.576 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:10:03.603 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938531, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:10:18.588 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:10:18.601 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938532, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:10:18.673 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:10:18.673 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:10:18.676 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:10:18.678 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:10:18.682 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:10:18.682 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:10:18.741 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:10:48.577 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:10:48.601 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938534, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:11:18.584 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:11:33.606 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938538, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:11:48.581 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:11:48.603 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938539, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:12:03.805 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:03.838 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:05.552 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:05.552 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:05.721 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:05.722 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:05.726 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:05.727 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:12:18.576 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:12:33.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938543, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:12:48.592 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:12:48.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:12:48.670 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:12:48.672 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:12:48.727 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:12:48.749 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:12:48.764 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:12:48.764 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:13:03.604 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938546, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:13:18.586 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:13:33.611 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938548, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:13:48.584 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:13:48.612 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938549, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:14:18.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:14:18.612 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938552, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:14:48.584 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:15:03.606 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938556, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:15:03.774 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:03.784 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:05.466 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:05.467 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:05.511 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:05.511 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:05.976 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:05.976 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:15:18.591 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:15:18.685 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:15:18.685 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:15:18.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:15:18.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:15:18.701 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:15:18.711 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:15:18.757 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:15:33.616 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938558, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:15:48.592 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:16:03.621 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938561, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:16:18.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:16:18.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938562, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:16:48.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:16:48.613 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938564, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:17:18.588 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:17:33.622 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938568, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:17:48.582 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:17:48.646 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938569, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:17:48.759 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:17:48.762 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:17:48.764 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:17:48.764 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:17:48.785 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:17:48.814 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:17:48.887 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:18:03.771 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:03.775 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:05.573 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:05.574 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:05.602 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:05.602 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:06.144 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:06.144 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:18:18.591 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:18:33.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938573, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:18:48.594 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:19:03.622 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938575, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:19:18.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:19:33.623 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938577, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:19:48.589 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:20:03.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938580, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:20:18.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:20:18.678 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:20:18.684 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:20:18.686 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:20:18.698 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:20:18.699 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:20:18.707 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:20:18.779 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:20:33.621 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938582, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:20:48.592 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:20:48.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938583, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:21:03.817 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:03.825 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:05.597 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:05.598 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:05.601 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:05.602 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:05.671 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:05.671 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:21:18.595 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:21:33.624 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938587, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:21:48.591 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:21:48.618 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938588, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:22:18.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:22:18.621 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938591, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:22:48.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:22:48.683 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:22:48.685 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:22:48.686 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:22:48.701 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:22:48.701 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:22:48.703 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:22:48.772 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:23:03.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938595, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:23:18.617 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:23:33.626 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938597, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:23:48.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:24:03.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938600, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:24:03.797 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:03.800 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:05.573 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:05.574 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:05.589 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:05.591 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:05.647 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:05.648 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:24:18.631 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:24:33.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938602, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:24:48.601 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:25:03.621 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938605, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:25:18.592 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:25:18.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938606, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:25:18.674 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:25:18.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:25:18.675 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:25:18.682 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:25:18.682 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:25:18.695 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:25:18.748 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:25:48.591 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:26:03.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938610, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:26:18.595 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:26:33.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938612, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:26:48.592 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:26:48.621 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938613, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:27:03.802 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:03.803 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:05.606 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:05.607 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:05.632 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:05.632 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:05.742 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:05.742 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:27:18.598 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:27:33.637 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938617, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:27:48.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:27:48.619 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938618, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:27:48.687 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:27:48.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:27:48.702 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:27:48.732 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:27:48.732 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:27:48.743 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:27:48.786 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:28:18.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:28:18.622 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938621, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:28:48.599 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:29:03.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938625, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:29:18.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:29:18.623 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938626, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:29:48.598 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:29:48.624 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938628, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:30:03.792 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:03.800 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:05.582 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:05.583 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:05.602 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:05.602 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:05.638 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:05.639 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:30:18.595 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:30:18.622 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938631, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:30:18.676 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:30:18.676 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:30:18.678 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:30:18.683 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:30:18.686 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 50000000 for upstream ethereum +2025-07-17 14:30:18.687 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 50000000 for upstream ethereum +2025-07-17 14:30:18.760 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:30:48.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:31:03.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938635, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:31:18.602 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:31:33.619 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938637, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:31:48.606 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:32:03.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938640, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:32:18.598 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:32:18.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938641, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:32:48.607 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:32:48.694 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:32:48.714 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:32:48.715 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:32:48.727 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:32:48.727 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:32:48.734 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:32:48.807 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:33:03.619 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938645, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:33:03.792 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:03.796 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:05.531 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:05.531 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:05.544 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:05.544 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:06.483 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:06.485 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:33:18.610 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:33:18.626 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938646, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:33:48.598 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:33:48.626 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938648, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:34:18.595 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:34:33.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938652, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:34:48.602 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:35:03.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938655, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:35:18.598 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:35:18.625 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938656, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:35:18.679 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:35:18.679 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:35:18.679 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:35:18.692 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:35:18.702 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:35:18.702 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:35:18.770 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:35:48.602 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:36:03.619 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938660, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:36:03.774 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:03.796 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:05.586 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:05.586 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:05.706 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:05.706 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:05.803 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:05.803 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:36:18.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:36:18.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938661, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:36:48.610 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:36:48.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938663, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:37:18.604 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:37:18.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938666, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:37:48.594 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:37:48.624 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938668, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:37:48.667 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:37:48.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:37:48.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:37:48.694 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:37:48.694 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:37:48.763 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:37:48.768 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:38:18.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:38:33.630 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938672, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:38:48.598 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:39:03.624 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938675, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:39:03.789 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:03.792 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:05.517 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:05.517 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:05.564 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:05.564 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:05.649 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:05.650 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:39:18.595 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:39:18.625 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938676, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:39:48.602 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:39:48.633 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938678, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:40:18.599 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:40:18.695 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:40:18.695 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:40:18.695 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:40:18.695 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:40:18.695 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:40:18.719 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:40:18.763 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:40:33.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938682, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:40:48.601 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:41:03.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938685, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:41:18.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:41:33.625 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938687, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:41:48.602 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:42:03.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938690, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:42:03.793 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:03.794 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:05.515 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:05.515 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:05.556 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:05.556 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:05.601 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:05.601 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:42:18.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:42:18.627 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938691, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:42:48.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:42:48.681 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:42:48.697 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:42:48.701 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:42:48.702 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:42:48.708 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:42:48.708 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:42:48.778 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:43:03.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938695, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:43:18.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:43:18.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938696, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:43:48.605 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:43:48.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938698, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:44:18.598 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:44:18.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938701, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:44:48.602 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:45:03.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938705, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:45:03.786 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:03.790 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:05.471 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:05.471 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:05.604 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:05.604 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:05.747 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:05.747 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:45:18.604 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:45:18.696 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:45:18.701 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:45:18.704 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:45:18.708 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:45:18.708 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:45:18.708 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:45:18.788 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:45:33.630 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938707, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:45:48.604 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:46:03.631 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938710, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:46:18.603 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:46:18.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938711, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:46:48.611 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:46:48.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938713, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:47:18.603 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:47:33.644 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938717, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:47:48.607 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:47:48.632 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938718, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:47:48.687 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:47:48.687 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:47:48.687 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:47:48.693 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:47:48.693 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:47:48.704 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:47:48.769 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:48:03.784 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:03.798 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:05.498 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:05.498 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:05.515 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:05.515 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:05.735 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:05.735 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:48:18.597 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:48:33.633 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938722, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:48:48.608 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:48:48.631 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938723, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:49:18.604 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:49:18.631 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938726, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:49:48.614 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:50:03.640 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938730, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:50:18.602 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:50:18.710 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:50:18.722 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:50:18.727 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:50:18.729 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:50:18.737 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:50:18.737 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:50:18.785 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:50:33.635 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938732, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:50:48.621 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:51:03.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938735, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:51:03.826 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:03.833 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:05.684 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:05.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:05.705 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:05.706 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:05.778 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:05.778 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:51:18.611 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:51:18.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938736, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:51:48.604 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:51:48.638 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938738, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:52:18.612 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:52:33.630 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938742, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:52:48.612 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:52:48.699 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:52:48.707 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:52:48.708 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:52:48.711 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:52:48.712 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:52:48.712 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:52:48.871 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:53:03.638 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938745, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:53:18.599 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:53:18.630 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938746, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:53:48.604 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:53:48.649 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938748, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:54:03.773 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:03.897 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:05.726 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:05.728 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:05.838 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:05.838 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:06.801 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:06.803 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:54:18.587 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:54:19.345 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.ethereum.WsConnectionImpl : Disconnected from wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p +2025-07-17 14:54:19.364 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.ethereum.WsConnectionImpl : Reconnect to wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p in 100ms... +2025-07-17 14:54:19.466 INFO [dshackle,,] 54640 --- [pool-2-thread-1] i.e.d.u.ethereum.WsConnectionImpl : Connecting to WebSocket: wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p +2025-07-17 14:54:19.612 WARN [dshackle,,] 54640 --- [ibe-scheduler-1] i.e.d.upstream.ethereum.GenericWsHead : Restart ws head, upstreamId: ethereum +2025-07-17 14:54:19.618 WARN [dshackle,,] 54640 --- [ibe-scheduler-1] i.e.d.upstream.ethereum.GenericWsHead : Received signal ethereum cancel unexpectedly - restart head +2025-07-17 14:54:33.619 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938752, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:54:48.582 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:54:48.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938753, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:55:18.577 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:55:18.680 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:55:18.680 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:55:18.681 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 14:55:18.681 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 14:55:18.692 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:55:18.722 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:55:18.757 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:55:33.609 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938757, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:55:48.576 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:55:48.603 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938759, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:56:18.574 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:56:33.608 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938762, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:56:48.585 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:57:03.610 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938765, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:57:03.778 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:03.788 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:05.602 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:05.602 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:05.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:05.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:08.100 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:08.112 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 14:57:18.580 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:57:18.607 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938766, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:57:35.717 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.ethereum.WsConnectionImpl : Disconnected from wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p +2025-07-17 14:57:35.747 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.ethereum.WsConnectionImpl : Reconnect to wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p in 100ms... +2025-07-17 14:57:35.850 INFO [dshackle,,] 54640 --- [pool-2-thread-1] i.e.d.u.ethereum.WsConnectionImpl : Connecting to WebSocket: wss://lb.drpc.org/ethereum/AiKs6WI4AE91uo2W6BDKWZBC3bCD-yYR7pVAngOF84-p +2025-07-17 14:57:36.069 WARN [dshackle,,] 54640 --- [ibe-scheduler-1] i.e.d.upstream.ethereum.GenericWsHead : Restart ws head, upstreamId: ethereum +2025-07-17 14:57:36.070 WARN [dshackle,,] 54640 --- [ibe-scheduler-1] i.e.d.upstream.ethereum.GenericWsHead : Received signal ethereum cancel unexpectedly - restart head +2025-07-17 14:57:48.580 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:57:48.603 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938768, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:57:48.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 14:57:48.669 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 14:57:48.680 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 14:57:48.693 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 18446744073709551615 for upstream ethereum +2025-07-17 14:57:48.694 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 18446744073709551615 for upstream ethereum +2025-07-17 14:57:48.734 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 14:57:48.752 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 14:58:18.597 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:58:18.618 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938771, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:58:48.580 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:58:48.612 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938773, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:59:18.579 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 14:59:18.604 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938776, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 14:59:48.588 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:00:03.610 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938780, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:00:03.815 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:03.848 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:05.539 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:05.540 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:05.707 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:05.707 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:06.549 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:06.550 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:00:18.586 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:00:18.682 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:00:18.683 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:00:18.683 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:00:18.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 15:00:18.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 15:00:18.721 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:00:18.765 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:00:33.614 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938782, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:00:48.585 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:00:48.606 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938783, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:01:18.586 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:01:18.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938786, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:01:48.580 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:01:48.607 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938788, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:02:18.579 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:02:18.605 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938791, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:02:48.581 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:02:48.604 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938793, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:02:48.678 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:02:48.678 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:02:48.691 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 50000000 for upstream ethereum +2025-07-17 15:02:48.691 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 50000000 for upstream ethereum +2025-07-17 15:02:48.691 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:02:48.692 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:02:48.775 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:03:03.779 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:03.809 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:05.512 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:05.515 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:05.780 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:05.781 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:06.103 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:06.104 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:03:18.579 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:03:18.604 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938796, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:03:48.587 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:04:03.609 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938800, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:04:18.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:04:33.619 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938802, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:04:48.583 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:05:03.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938805, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:05:18.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:05:18.688 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:05:18.688 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:05:18.690 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:05:18.696 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 15:05:18.697 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 15:05:18.721 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:05:18.767 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:05:33.617 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938807, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:05:48.582 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:06:03.632 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938810, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:06:03.814 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:03.823 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:05.589 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:05.593 INFO [dshackle,,] 54640 --- [tor-http-nio-10] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:05.676 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:05.677 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:06.160 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:06.161 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:06:18.581 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:06:33.621 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938812, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:06:48.590 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:07:03.623 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938815, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:07:18.594 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:07:33.679 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938817, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:07:48.619 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:07:48.825 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:07:48.831 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:07:48.834 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 15:07:48.834 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 15:07:48.861 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:07:48.928 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:07:49.015 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:08:03.730 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938820, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:08:18.634 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:08:33.755 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938822, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:08:48.608 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:08:48.634 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938823, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:09:04.249 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:04.305 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:06.329 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:06.332 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:06.333 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:06.337 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:06.695 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:06.695 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:09:18.596 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:09:33.620 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938827, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:09:48.640 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:10:03.658 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938830, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:10:18.614 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:10:18.892 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:10:18.899 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:10:18.917 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:10:18.934 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:10:18.992 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 15:10:18.996 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 15:10:19.029 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:10:33.629 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938832, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:10:48.597 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:11:03.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938835, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:11:18.594 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:11:18.614 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938836, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:11:48.616 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:12:03.711 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938840, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:12:04.009 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:04.024 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:05.911 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:05.924 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:06.086 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:06.089 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:06.386 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:06.395 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:12:18.585 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:12:18.613 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938841, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:12:48.618 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938843, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:12:48.595 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:12:48.807 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:12:48.810 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:12:48.830 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:12:48.832 INFO [dshackle,,] 54640 --- [ctor-http-nio-8] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:12:48.900 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:12:49.209 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 18446744073709551615 for upstream ethereum +2025-07-17 15:12:49.211 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 18446744073709551615 for upstream ethereum +2025-07-17 15:13:18.601 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:13:18.692 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938846, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:13:48.637 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:14:03.645 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938850, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:14:18.645 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938851, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:14:18.642 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:14:48.645 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:15:03.753 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938855, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:15:04.086 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:04.102 INFO [dshackle,,] 54640 --- [ctor-http-nio-5] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:05.852 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:05.863 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:06.028 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:06.030 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:06.945 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:06.964 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:15:18.623 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:15:18.828 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:15:18.837 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:15:18.840 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:15:18.840 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:15:18.886 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 15:15:18.888 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 15:15:18.982 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:15:33.632 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938857, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:15:48.601 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:16:03.699 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938860, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:16:18.626 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:16:18.659 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938861, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:16:48.626 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938863, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:16:48.610 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:17:18.620 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:17:33.644 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938867, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:17:48.573 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:17:48.602 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938868, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:17:48.781 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:17:48.785 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:17:48.785 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:17:48.829 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 600000000 for upstream ethereum +2025-07-17 15:17:48.831 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 600000000 for upstream ethereum +2025-07-17 15:17:48.841 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:17:48.864 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:18:04.016 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TX is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:04.068 INFO [dshackle,,] 54640 --- [ctor-http-nio-4] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type RECEIPTS is 46194 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:05.861 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type STATE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:05.879 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type TRACE is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:06.094 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type BLOCK is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:06.098 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type LOGS is 1 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:06.238 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:06.240 INFO [dshackle,,] 54640 --- [ctor-http-nio-7] i.e.d.u.e.EthereumLowerBoundService : Lower bound of type PROOF is 11469070 for upstream ethereum of chain ETHEREUM__MAINNET +2025-07-17 15:18:18.595 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:18:33.675 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938872, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:18:48.600 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:19:03.716 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938875, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:19:18.643 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:19:33.655 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938877, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:19:48.628 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938878, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:19:48.607 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:20:18.583 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum +2025-07-17 15:20:18.879 INFO [dshackle,,] 54640 --- [ctor-http-nio-9] i.e.d.upstream.generic.GenericUpstream : Detected node version Geth/v10.0.0/drpc for upstream ethereum +2025-07-17 15:20:18.961 INFO [dshackle,,] 54640 --- [ctor-http-nio-1] i.e.d.upstream.generic.GenericUpstream : Detected label flashblocks with value false for upstream ethereum +2025-07-17 15:20:18.966 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_type with value geth for upstream ethereum +2025-07-17 15:20:18.966 INFO [dshackle,,] 54640 --- [ctor-http-nio-6] i.e.d.upstream.generic.GenericUpstream : Detected label client_version with value v10.0.0 for upstream ethereum +2025-07-17 15:20:18.978 INFO [dshackle,,] 54640 --- [ctor-http-nio-2] i.e.d.upstream.generic.GenericUpstream : Detected label archive with value true for upstream ethereum +2025-07-17 15:20:19.580 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label gas-limit with value 550000000 for upstream ethereum +2025-07-17 15:20:19.583 INFO [dshackle,,] 54640 --- [ctor-http-nio-3] i.e.d.upstream.generic.GenericUpstream : Detected label extra_gas_limit with value 550000000 for upstream ethereum +2025-07-17 15:20:33.618 INFO [dshackle,,] 54640 --- [ parallel-4] i.e.d.u.generic.GenericMultistream : State of ETH: height=22938882, status=[OK/1], lag=[0], lower bounds=[TRACE=1, TX=46194, BLOCK=1, PROOF=11469070, RECEIPTS=46194, STATE=1, LOGS=1], weak=[] (3b0ee79d) +2025-07-17 15:20:48.594 INFO [dshackle,,] 54640 --- [ parallel-7] i.e.dshackle.upstream.VersionValidator : No rules for client type geth, skipping validation for upstream ethereum diff --git a/foundation/src/main/kotlin/io/emeraldpay/dshackle/foundation/ChainOptions.kt b/foundation/src/main/kotlin/io/emeraldpay/dshackle/foundation/ChainOptions.kt index 645d04a0..63db452d 100644 --- a/foundation/src/main/kotlin/io/emeraldpay/dshackle/foundation/ChainOptions.kt +++ b/foundation/src/main/kotlin/io/emeraldpay/dshackle/foundation/ChainOptions.kt @@ -18,7 +18,7 @@ class ChainOptions { val callLimitSize: Int, val disableLivenessSubscriptionValidation: Boolean, val disableBoundValidation: Boolean = false, - val valdateErigonBug: Boolean, + val validateErigonBug: Boolean, ) data class DefaultOptions( diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 00000000..6cf0cdaf --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,28 @@ +{ + "name": "dshackle", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/node_modules/ws/LICENSE b/node_modules/ws/LICENSE new file mode 100644 index 00000000..1da5b96a --- /dev/null +++ b/node_modules/ws/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2011 Einar Otto Stangvik +Copyright (c) 2013 Arnout Kazemier and contributors +Copyright (c) 2016 Luigi Pinca and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/ws/README.md b/node_modules/ws/README.md new file mode 100644 index 00000000..21f10df1 --- /dev/null +++ b/node_modules/ws/README.md @@ -0,0 +1,548 @@ +# ws: a Node.js WebSocket library + +[![Version npm](https://img.shields.io/npm/v/ws.svg?logo=npm)](https://www.npmjs.com/package/ws) +[![CI](https://img.shields.io/github/actions/workflow/status/websockets/ws/ci.yml?branch=master&label=CI&logo=github)](https://github.com/websockets/ws/actions?query=workflow%3ACI+branch%3Amaster) +[![Coverage Status](https://img.shields.io/coveralls/websockets/ws/master.svg?logo=coveralls)](https://coveralls.io/github/websockets/ws) + +ws is a simple to use, blazing fast, and thoroughly tested WebSocket client and +server implementation. + +Passes the quite extensive Autobahn test suite: [server][server-report], +[client][client-report]. + +**Note**: This module does not work in the browser. The client in the docs is a +reference to a backend with the role of a client in the WebSocket communication. +Browser clients must use the native +[`WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) +object. To make the same code work seamlessly on Node.js and the browser, you +can use one of the many wrappers available on npm, like +[isomorphic-ws](https://github.com/heineiuo/isomorphic-ws). + +## Table of Contents + +- [Protocol support](#protocol-support) +- [Installing](#installing) + - [Opt-in for performance](#opt-in-for-performance) + - [Legacy opt-in for performance](#legacy-opt-in-for-performance) +- [API docs](#api-docs) +- [WebSocket compression](#websocket-compression) +- [Usage examples](#usage-examples) + - [Sending and receiving text data](#sending-and-receiving-text-data) + - [Sending binary data](#sending-binary-data) + - [Simple server](#simple-server) + - [External HTTP/S server](#external-https-server) + - [Multiple servers sharing a single HTTP/S server](#multiple-servers-sharing-a-single-https-server) + - [Client authentication](#client-authentication) + - [Server broadcast](#server-broadcast) + - [Round-trip time](#round-trip-time) + - [Use the Node.js streams API](#use-the-nodejs-streams-api) + - [Other examples](#other-examples) +- [FAQ](#faq) + - [How to get the IP address of the client?](#how-to-get-the-ip-address-of-the-client) + - [How to detect and close broken connections?](#how-to-detect-and-close-broken-connections) + - [How to connect via a proxy?](#how-to-connect-via-a-proxy) +- [Changelog](#changelog) +- [License](#license) + +## Protocol support + +- **HyBi drafts 07-12** (Use the option `protocolVersion: 8`) +- **HyBi drafts 13-17** (Current default, alternatively option + `protocolVersion: 13`) + +## Installing + +``` +npm install ws +``` + +### Opt-in for performance + +[bufferutil][] is an optional module that can be installed alongside the ws +module: + +``` +npm install --save-optional bufferutil +``` + +This is a binary addon that improves the performance of certain operations such +as masking and unmasking the data payload of the WebSocket frames. Prebuilt +binaries are available for the most popular platforms, so you don't necessarily +need to have a C++ compiler installed on your machine. + +To force ws to not use bufferutil, use the +[`WS_NO_BUFFER_UTIL`](./doc/ws.md#ws_no_buffer_util) environment variable. This +can be useful to enhance security in systems where a user can put a package in +the package search path of an application of another user, due to how the +Node.js resolver algorithm works. + +#### Legacy opt-in for performance + +If you are running on an old version of Node.js (prior to v18.14.0), ws also +supports the [utf-8-validate][] module: + +``` +npm install --save-optional utf-8-validate +``` + +This contains a binary polyfill for [`buffer.isUtf8()`][]. + +To force ws not to use utf-8-validate, use the +[`WS_NO_UTF_8_VALIDATE`](./doc/ws.md#ws_no_utf_8_validate) environment variable. + +## API docs + +See [`/doc/ws.md`](./doc/ws.md) for Node.js-like documentation of ws classes and +utility functions. + +## WebSocket compression + +ws supports the [permessage-deflate extension][permessage-deflate] which enables +the client and server to negotiate a compression algorithm and its parameters, +and then selectively apply it to the data payloads of each WebSocket message. + +The extension is disabled by default on the server and enabled by default on the +client. It adds a significant overhead in terms of performance and memory +consumption so we suggest to enable it only if it is really needed. + +Note that Node.js has a variety of issues with high-performance compression, +where increased concurrency, especially on Linux, can lead to [catastrophic +memory fragmentation][node-zlib-bug] and slow performance. If you intend to use +permessage-deflate in production, it is worthwhile to set up a test +representative of your workload and ensure Node.js/zlib will handle it with +acceptable performance and memory usage. + +Tuning of permessage-deflate can be done via the options defined below. You can +also use `zlibDeflateOptions` and `zlibInflateOptions`, which is passed directly +into the creation of [raw deflate/inflate streams][node-zlib-deflaterawdocs]. + +See [the docs][ws-server-options] for more options. + +```js +import WebSocket, { WebSocketServer } from 'ws'; + +const wss = new WebSocketServer({ + port: 8080, + perMessageDeflate: { + zlibDeflateOptions: { + // See zlib defaults. + chunkSize: 1024, + memLevel: 7, + level: 3 + }, + zlibInflateOptions: { + chunkSize: 10 * 1024 + }, + // Other options settable: + clientNoContextTakeover: true, // Defaults to negotiated value. + serverNoContextTakeover: true, // Defaults to negotiated value. + serverMaxWindowBits: 10, // Defaults to negotiated value. + // Below options specified as default values. + concurrencyLimit: 10, // Limits zlib concurrency for perf. + threshold: 1024 // Size (in bytes) below which messages + // should not be compressed if context takeover is disabled. + } +}); +``` + +The client will only use the extension if it is supported and enabled on the +server. To always disable the extension on the client, set the +`perMessageDeflate` option to `false`. + +```js +import WebSocket from 'ws'; + +const ws = new WebSocket('ws://www.host.com/path', { + perMessageDeflate: false +}); +``` + +## Usage examples + +### Sending and receiving text data + +```js +import WebSocket from 'ws'; + +const ws = new WebSocket('ws://www.host.com/path'); + +ws.on('error', console.error); + +ws.on('open', function open() { + ws.send('something'); +}); + +ws.on('message', function message(data) { + console.log('received: %s', data); +}); +``` + +### Sending binary data + +```js +import WebSocket from 'ws'; + +const ws = new WebSocket('ws://www.host.com/path'); + +ws.on('error', console.error); + +ws.on('open', function open() { + const array = new Float32Array(5); + + for (var i = 0; i < array.length; ++i) { + array[i] = i / 2; + } + + ws.send(array); +}); +``` + +### Simple server + +```js +import { WebSocketServer } from 'ws'; + +const wss = new WebSocketServer({ port: 8080 }); + +wss.on('connection', function connection(ws) { + ws.on('error', console.error); + + ws.on('message', function message(data) { + console.log('received: %s', data); + }); + + ws.send('something'); +}); +``` + +### External HTTP/S server + +```js +import { createServer } from 'https'; +import { readFileSync } from 'fs'; +import { WebSocketServer } from 'ws'; + +const server = createServer({ + cert: readFileSync('/path/to/cert.pem'), + key: readFileSync('/path/to/key.pem') +}); +const wss = new WebSocketServer({ server }); + +wss.on('connection', function connection(ws) { + ws.on('error', console.error); + + ws.on('message', function message(data) { + console.log('received: %s', data); + }); + + ws.send('something'); +}); + +server.listen(8080); +``` + +### Multiple servers sharing a single HTTP/S server + +```js +import { createServer } from 'http'; +import { WebSocketServer } from 'ws'; + +const server = createServer(); +const wss1 = new WebSocketServer({ noServer: true }); +const wss2 = new WebSocketServer({ noServer: true }); + +wss1.on('connection', function connection(ws) { + ws.on('error', console.error); + + // ... +}); + +wss2.on('connection', function connection(ws) { + ws.on('error', console.error); + + // ... +}); + +server.on('upgrade', function upgrade(request, socket, head) { + const { pathname } = new URL(request.url, 'wss://base.url'); + + if (pathname === '/foo') { + wss1.handleUpgrade(request, socket, head, function done(ws) { + wss1.emit('connection', ws, request); + }); + } else if (pathname === '/bar') { + wss2.handleUpgrade(request, socket, head, function done(ws) { + wss2.emit('connection', ws, request); + }); + } else { + socket.destroy(); + } +}); + +server.listen(8080); +``` + +### Client authentication + +```js +import { createServer } from 'http'; +import { WebSocketServer } from 'ws'; + +function onSocketError(err) { + console.error(err); +} + +const server = createServer(); +const wss = new WebSocketServer({ noServer: true }); + +wss.on('connection', function connection(ws, request, client) { + ws.on('error', console.error); + + ws.on('message', function message(data) { + console.log(`Received message ${data} from user ${client}`); + }); +}); + +server.on('upgrade', function upgrade(request, socket, head) { + socket.on('error', onSocketError); + + // This function is not defined on purpose. Implement it with your own logic. + authenticate(request, function next(err, client) { + if (err || !client) { + socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); + socket.destroy(); + return; + } + + socket.removeListener('error', onSocketError); + + wss.handleUpgrade(request, socket, head, function done(ws) { + wss.emit('connection', ws, request, client); + }); + }); +}); + +server.listen(8080); +``` + +Also see the provided [example][session-parse-example] using `express-session`. + +### Server broadcast + +A client WebSocket broadcasting to all connected WebSocket clients, including +itself. + +```js +import WebSocket, { WebSocketServer } from 'ws'; + +const wss = new WebSocketServer({ port: 8080 }); + +wss.on('connection', function connection(ws) { + ws.on('error', console.error); + + ws.on('message', function message(data, isBinary) { + wss.clients.forEach(function each(client) { + if (client.readyState === WebSocket.OPEN) { + client.send(data, { binary: isBinary }); + } + }); + }); +}); +``` + +A client WebSocket broadcasting to every other connected WebSocket clients, +excluding itself. + +```js +import WebSocket, { WebSocketServer } from 'ws'; + +const wss = new WebSocketServer({ port: 8080 }); + +wss.on('connection', function connection(ws) { + ws.on('error', console.error); + + ws.on('message', function message(data, isBinary) { + wss.clients.forEach(function each(client) { + if (client !== ws && client.readyState === WebSocket.OPEN) { + client.send(data, { binary: isBinary }); + } + }); + }); +}); +``` + +### Round-trip time + +```js +import WebSocket from 'ws'; + +const ws = new WebSocket('wss://websocket-echo.com/'); + +ws.on('error', console.error); + +ws.on('open', function open() { + console.log('connected'); + ws.send(Date.now()); +}); + +ws.on('close', function close() { + console.log('disconnected'); +}); + +ws.on('message', function message(data) { + console.log(`Round-trip time: ${Date.now() - data} ms`); + + setTimeout(function timeout() { + ws.send(Date.now()); + }, 500); +}); +``` + +### Use the Node.js streams API + +```js +import WebSocket, { createWebSocketStream } from 'ws'; + +const ws = new WebSocket('wss://websocket-echo.com/'); + +const duplex = createWebSocketStream(ws, { encoding: 'utf8' }); + +duplex.on('error', console.error); + +duplex.pipe(process.stdout); +process.stdin.pipe(duplex); +``` + +### Other examples + +For a full example with a browser client communicating with a ws server, see the +examples folder. + +Otherwise, see the test cases. + +## FAQ + +### How to get the IP address of the client? + +The remote IP address can be obtained from the raw socket. + +```js +import { WebSocketServer } from 'ws'; + +const wss = new WebSocketServer({ port: 8080 }); + +wss.on('connection', function connection(ws, req) { + const ip = req.socket.remoteAddress; + + ws.on('error', console.error); +}); +``` + +When the server runs behind a proxy like NGINX, the de-facto standard is to use +the `X-Forwarded-For` header. + +```js +wss.on('connection', function connection(ws, req) { + const ip = req.headers['x-forwarded-for'].split(',')[0].trim(); + + ws.on('error', console.error); +}); +``` + +### How to detect and close broken connections? + +Sometimes, the link between the server and the client can be interrupted in a +way that keeps both the server and the client unaware of the broken state of the +connection (e.g. when pulling the cord). + +In these cases, ping messages can be used as a means to verify that the remote +endpoint is still responsive. + +```js +import { WebSocketServer } from 'ws'; + +function heartbeat() { + this.isAlive = true; +} + +const wss = new WebSocketServer({ port: 8080 }); + +wss.on('connection', function connection(ws) { + ws.isAlive = true; + ws.on('error', console.error); + ws.on('pong', heartbeat); +}); + +const interval = setInterval(function ping() { + wss.clients.forEach(function each(ws) { + if (ws.isAlive === false) return ws.terminate(); + + ws.isAlive = false; + ws.ping(); + }); +}, 30000); + +wss.on('close', function close() { + clearInterval(interval); +}); +``` + +Pong messages are automatically sent in response to ping messages as required by +the spec. + +Just like the server example above, your clients might as well lose connection +without knowing it. You might want to add a ping listener on your clients to +prevent that. A simple implementation would be: + +```js +import WebSocket from 'ws'; + +function heartbeat() { + clearTimeout(this.pingTimeout); + + // Use `WebSocket#terminate()`, which immediately destroys the connection, + // instead of `WebSocket#close()`, which waits for the close timer. + // Delay should be equal to the interval at which your server + // sends out pings plus a conservative assumption of the latency. + this.pingTimeout = setTimeout(() => { + this.terminate(); + }, 30000 + 1000); +} + +const client = new WebSocket('wss://websocket-echo.com/'); + +client.on('error', console.error); +client.on('open', heartbeat); +client.on('ping', heartbeat); +client.on('close', function clear() { + clearTimeout(this.pingTimeout); +}); +``` + +### How to connect via a proxy? + +Use a custom `http.Agent` implementation like [https-proxy-agent][] or +[socks-proxy-agent][]. + +## Changelog + +We're using the GitHub [releases][changelog] for changelog entries. + +## License + +[MIT](LICENSE) + +[`buffer.isutf8()`]: https://nodejs.org/api/buffer.html#bufferisutf8input +[bufferutil]: https://github.com/websockets/bufferutil +[changelog]: https://github.com/websockets/ws/releases +[client-report]: http://websockets.github.io/ws/autobahn/clients/ +[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent +[node-zlib-bug]: https://github.com/nodejs/node/issues/8871 +[node-zlib-deflaterawdocs]: + https://nodejs.org/api/zlib.html#zlib_zlib_createdeflateraw_options +[permessage-deflate]: https://tools.ietf.org/html/rfc7692 +[server-report]: http://websockets.github.io/ws/autobahn/servers/ +[session-parse-example]: ./examples/express-session-parse +[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent +[utf-8-validate]: https://github.com/websockets/utf-8-validate +[ws-server-options]: ./doc/ws.md#new-websocketserveroptions-callback diff --git a/node_modules/ws/browser.js b/node_modules/ws/browser.js new file mode 100644 index 00000000..ca4f628a --- /dev/null +++ b/node_modules/ws/browser.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = function () { + throw new Error( + 'ws does not work in the browser. Browser clients must use the native ' + + 'WebSocket object' + ); +}; diff --git a/node_modules/ws/index.js b/node_modules/ws/index.js new file mode 100644 index 00000000..41edb3b8 --- /dev/null +++ b/node_modules/ws/index.js @@ -0,0 +1,13 @@ +'use strict'; + +const WebSocket = require('./lib/websocket'); + +WebSocket.createWebSocketStream = require('./lib/stream'); +WebSocket.Server = require('./lib/websocket-server'); +WebSocket.Receiver = require('./lib/receiver'); +WebSocket.Sender = require('./lib/sender'); + +WebSocket.WebSocket = WebSocket; +WebSocket.WebSocketServer = WebSocket.Server; + +module.exports = WebSocket; diff --git a/node_modules/ws/lib/buffer-util.js b/node_modules/ws/lib/buffer-util.js new file mode 100644 index 00000000..f7536e28 --- /dev/null +++ b/node_modules/ws/lib/buffer-util.js @@ -0,0 +1,131 @@ +'use strict'; + +const { EMPTY_BUFFER } = require('./constants'); + +const FastBuffer = Buffer[Symbol.species]; + +/** + * Merges an array of buffers into a new buffer. + * + * @param {Buffer[]} list The array of buffers to concat + * @param {Number} totalLength The total length of buffers in the list + * @return {Buffer} The resulting buffer + * @public + */ +function concat(list, totalLength) { + if (list.length === 0) return EMPTY_BUFFER; + if (list.length === 1) return list[0]; + + const target = Buffer.allocUnsafe(totalLength); + let offset = 0; + + for (let i = 0; i < list.length; i++) { + const buf = list[i]; + target.set(buf, offset); + offset += buf.length; + } + + if (offset < totalLength) { + return new FastBuffer(target.buffer, target.byteOffset, offset); + } + + return target; +} + +/** + * Masks a buffer using the given mask. + * + * @param {Buffer} source The buffer to mask + * @param {Buffer} mask The mask to use + * @param {Buffer} output The buffer where to store the result + * @param {Number} offset The offset at which to start writing + * @param {Number} length The number of bytes to mask. + * @public + */ +function _mask(source, mask, output, offset, length) { + for (let i = 0; i < length; i++) { + output[offset + i] = source[i] ^ mask[i & 3]; + } +} + +/** + * Unmasks a buffer using the given mask. + * + * @param {Buffer} buffer The buffer to unmask + * @param {Buffer} mask The mask to use + * @public + */ +function _unmask(buffer, mask) { + for (let i = 0; i < buffer.length; i++) { + buffer[i] ^= mask[i & 3]; + } +} + +/** + * Converts a buffer to an `ArrayBuffer`. + * + * @param {Buffer} buf The buffer to convert + * @return {ArrayBuffer} Converted buffer + * @public + */ +function toArrayBuffer(buf) { + if (buf.length === buf.buffer.byteLength) { + return buf.buffer; + } + + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length); +} + +/** + * Converts `data` to a `Buffer`. + * + * @param {*} data The data to convert + * @return {Buffer} The buffer + * @throws {TypeError} + * @public + */ +function toBuffer(data) { + toBuffer.readOnly = true; + + if (Buffer.isBuffer(data)) return data; + + let buf; + + if (data instanceof ArrayBuffer) { + buf = new FastBuffer(data); + } else if (ArrayBuffer.isView(data)) { + buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength); + } else { + buf = Buffer.from(data); + toBuffer.readOnly = false; + } + + return buf; +} + +module.exports = { + concat, + mask: _mask, + toArrayBuffer, + toBuffer, + unmask: _unmask +}; + +/* istanbul ignore else */ +if (!process.env.WS_NO_BUFFER_UTIL) { + try { + const bufferUtil = require('bufferutil'); + + module.exports.mask = function (source, mask, output, offset, length) { + if (length < 48) _mask(source, mask, output, offset, length); + else bufferUtil.mask(source, mask, output, offset, length); + }; + + module.exports.unmask = function (buffer, mask) { + if (buffer.length < 32) _unmask(buffer, mask); + else bufferUtil.unmask(buffer, mask); + }; + } catch (e) { + // Continue regardless of the error. + } +} diff --git a/node_modules/ws/lib/constants.js b/node_modules/ws/lib/constants.js new file mode 100644 index 00000000..74214d46 --- /dev/null +++ b/node_modules/ws/lib/constants.js @@ -0,0 +1,18 @@ +'use strict'; + +const BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments']; +const hasBlob = typeof Blob !== 'undefined'; + +if (hasBlob) BINARY_TYPES.push('blob'); + +module.exports = { + BINARY_TYPES, + EMPTY_BUFFER: Buffer.alloc(0), + GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', + hasBlob, + kForOnEventAttribute: Symbol('kIsForOnEventAttribute'), + kListener: Symbol('kListener'), + kStatusCode: Symbol('status-code'), + kWebSocket: Symbol('websocket'), + NOOP: () => {} +}; diff --git a/node_modules/ws/lib/event-target.js b/node_modules/ws/lib/event-target.js new file mode 100644 index 00000000..fea4cbc5 --- /dev/null +++ b/node_modules/ws/lib/event-target.js @@ -0,0 +1,292 @@ +'use strict'; + +const { kForOnEventAttribute, kListener } = require('./constants'); + +const kCode = Symbol('kCode'); +const kData = Symbol('kData'); +const kError = Symbol('kError'); +const kMessage = Symbol('kMessage'); +const kReason = Symbol('kReason'); +const kTarget = Symbol('kTarget'); +const kType = Symbol('kType'); +const kWasClean = Symbol('kWasClean'); + +/** + * Class representing an event. + */ +class Event { + /** + * Create a new `Event`. + * + * @param {String} type The name of the event + * @throws {TypeError} If the `type` argument is not specified + */ + constructor(type) { + this[kTarget] = null; + this[kType] = type; + } + + /** + * @type {*} + */ + get target() { + return this[kTarget]; + } + + /** + * @type {String} + */ + get type() { + return this[kType]; + } +} + +Object.defineProperty(Event.prototype, 'target', { enumerable: true }); +Object.defineProperty(Event.prototype, 'type', { enumerable: true }); + +/** + * Class representing a close event. + * + * @extends Event + */ +class CloseEvent extends Event { + /** + * Create a new `CloseEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {Number} [options.code=0] The status code explaining why the + * connection was closed + * @param {String} [options.reason=''] A human-readable string explaining why + * the connection was closed + * @param {Boolean} [options.wasClean=false] Indicates whether or not the + * connection was cleanly closed + */ + constructor(type, options = {}) { + super(type); + + this[kCode] = options.code === undefined ? 0 : options.code; + this[kReason] = options.reason === undefined ? '' : options.reason; + this[kWasClean] = options.wasClean === undefined ? false : options.wasClean; + } + + /** + * @type {Number} + */ + get code() { + return this[kCode]; + } + + /** + * @type {String} + */ + get reason() { + return this[kReason]; + } + + /** + * @type {Boolean} + */ + get wasClean() { + return this[kWasClean]; + } +} + +Object.defineProperty(CloseEvent.prototype, 'code', { enumerable: true }); +Object.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true }); +Object.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true }); + +/** + * Class representing an error event. + * + * @extends Event + */ +class ErrorEvent extends Event { + /** + * Create a new `ErrorEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.error=null] The error that generated this event + * @param {String} [options.message=''] The error message + */ + constructor(type, options = {}) { + super(type); + + this[kError] = options.error === undefined ? null : options.error; + this[kMessage] = options.message === undefined ? '' : options.message; + } + + /** + * @type {*} + */ + get error() { + return this[kError]; + } + + /** + * @type {String} + */ + get message() { + return this[kMessage]; + } +} + +Object.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true }); +Object.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true }); + +/** + * Class representing a message event. + * + * @extends Event + */ +class MessageEvent extends Event { + /** + * Create a new `MessageEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.data=null] The message content + */ + constructor(type, options = {}) { + super(type); + + this[kData] = options.data === undefined ? null : options.data; + } + + /** + * @type {*} + */ + get data() { + return this[kData]; + } +} + +Object.defineProperty(MessageEvent.prototype, 'data', { enumerable: true }); + +/** + * This provides methods for emulating the `EventTarget` interface. It's not + * meant to be used directly. + * + * @mixin + */ +const EventTarget = { + /** + * Register an event listener. + * + * @param {String} type A string representing the event type to listen for + * @param {(Function|Object)} handler The listener to add + * @param {Object} [options] An options object specifies characteristics about + * the event listener + * @param {Boolean} [options.once=false] A `Boolean` indicating that the + * listener should be invoked at most once after being added. If `true`, + * the listener would be automatically removed when invoked. + * @public + */ + addEventListener(type, handler, options = {}) { + for (const listener of this.listeners(type)) { + if ( + !options[kForOnEventAttribute] && + listener[kListener] === handler && + !listener[kForOnEventAttribute] + ) { + return; + } + } + + let wrapper; + + if (type === 'message') { + wrapper = function onMessage(data, isBinary) { + const event = new MessageEvent('message', { + data: isBinary ? data : data.toString() + }); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === 'close') { + wrapper = function onClose(code, message) { + const event = new CloseEvent('close', { + code, + reason: message.toString(), + wasClean: this._closeFrameReceived && this._closeFrameSent + }); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === 'error') { + wrapper = function onError(error) { + const event = new ErrorEvent('error', { + error, + message: error.message + }); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === 'open') { + wrapper = function onOpen() { + const event = new Event('open'); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else { + return; + } + + wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute]; + wrapper[kListener] = handler; + + if (options.once) { + this.once(type, wrapper); + } else { + this.on(type, wrapper); + } + }, + + /** + * Remove an event listener. + * + * @param {String} type A string representing the event type to remove + * @param {(Function|Object)} handler The listener to remove + * @public + */ + removeEventListener(type, handler) { + for (const listener of this.listeners(type)) { + if (listener[kListener] === handler && !listener[kForOnEventAttribute]) { + this.removeListener(type, listener); + break; + } + } + } +}; + +module.exports = { + CloseEvent, + ErrorEvent, + Event, + EventTarget, + MessageEvent +}; + +/** + * Call an event listener + * + * @param {(Function|Object)} listener The listener to call + * @param {*} thisArg The value to use as `this`` when calling the listener + * @param {Event} event The event to pass to the listener + * @private + */ +function callListener(listener, thisArg, event) { + if (typeof listener === 'object' && listener.handleEvent) { + listener.handleEvent.call(listener, event); + } else { + listener.call(thisArg, event); + } +} diff --git a/node_modules/ws/lib/extension.js b/node_modules/ws/lib/extension.js new file mode 100644 index 00000000..3d7895c1 --- /dev/null +++ b/node_modules/ws/lib/extension.js @@ -0,0 +1,203 @@ +'use strict'; + +const { tokenChars } = require('./validation'); + +/** + * Adds an offer to the map of extension offers or a parameter to the map of + * parameters. + * + * @param {Object} dest The map of extension offers or parameters + * @param {String} name The extension or parameter name + * @param {(Object|Boolean|String)} elem The extension parameters or the + * parameter value + * @private + */ +function push(dest, name, elem) { + if (dest[name] === undefined) dest[name] = [elem]; + else dest[name].push(elem); +} + +/** + * Parses the `Sec-WebSocket-Extensions` header into an object. + * + * @param {String} header The field value of the header + * @return {Object} The parsed object + * @public + */ +function parse(header) { + const offers = Object.create(null); + let params = Object.create(null); + let mustUnescape = false; + let isEscaping = false; + let inQuotes = false; + let extensionName; + let paramName; + let start = -1; + let code = -1; + let end = -1; + let i = 0; + + for (; i < header.length; i++) { + code = header.charCodeAt(i); + + if (extensionName === undefined) { + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if ( + i !== 0 && + (code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */ + ) { + if (end === -1 && start !== -1) end = i; + } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + const name = header.slice(start, end); + if (code === 0x2c) { + push(offers, name, params); + params = Object.create(null); + } else { + extensionName = name; + } + + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (paramName === undefined) { + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (code === 0x20 || code === 0x09) { + if (end === -1 && start !== -1) end = i; + } else if (code === 0x3b || code === 0x2c) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + push(params, header.slice(start, end), true); + if (code === 0x2c) { + push(offers, extensionName, params); + params = Object.create(null); + extensionName = undefined; + } + + start = end = -1; + } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) { + paramName = header.slice(start, i); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else { + // + // The value of a quoted-string after unescaping must conform to the + // token ABNF, so only token characters are valid. + // Ref: https://tools.ietf.org/html/rfc6455#section-9.1 + // + if (isEscaping) { + if (tokenChars[code] !== 1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (start === -1) start = i; + else if (!mustUnescape) mustUnescape = true; + isEscaping = false; + } else if (inQuotes) { + if (tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (code === 0x22 /* '"' */ && start !== -1) { + inQuotes = false; + end = i; + } else if (code === 0x5c /* '\' */) { + isEscaping = true; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) { + inQuotes = true; + } else if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (start !== -1 && (code === 0x20 || code === 0x09)) { + if (end === -1) end = i; + } else if (code === 0x3b || code === 0x2c) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + let value = header.slice(start, end); + if (mustUnescape) { + value = value.replace(/\\/g, ''); + mustUnescape = false; + } + push(params, paramName, value); + if (code === 0x2c) { + push(offers, extensionName, params); + params = Object.create(null); + extensionName = undefined; + } + + paramName = undefined; + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } + } + + if (start === -1 || inQuotes || code === 0x20 || code === 0x09) { + throw new SyntaxError('Unexpected end of input'); + } + + if (end === -1) end = i; + const token = header.slice(start, end); + if (extensionName === undefined) { + push(offers, token, params); + } else { + if (paramName === undefined) { + push(params, token, true); + } else if (mustUnescape) { + push(params, paramName, token.replace(/\\/g, '')); + } else { + push(params, paramName, token); + } + push(offers, extensionName, params); + } + + return offers; +} + +/** + * Builds the `Sec-WebSocket-Extensions` header field value. + * + * @param {Object} extensions The map of extensions and parameters to format + * @return {String} A string representing the given object + * @public + */ +function format(extensions) { + return Object.keys(extensions) + .map((extension) => { + let configurations = extensions[extension]; + if (!Array.isArray(configurations)) configurations = [configurations]; + return configurations + .map((params) => { + return [extension] + .concat( + Object.keys(params).map((k) => { + let values = params[k]; + if (!Array.isArray(values)) values = [values]; + return values + .map((v) => (v === true ? k : `${k}=${v}`)) + .join('; '); + }) + ) + .join('; '); + }) + .join(', '); + }) + .join(', '); +} + +module.exports = { format, parse }; diff --git a/node_modules/ws/lib/limiter.js b/node_modules/ws/lib/limiter.js new file mode 100644 index 00000000..3fd35784 --- /dev/null +++ b/node_modules/ws/lib/limiter.js @@ -0,0 +1,55 @@ +'use strict'; + +const kDone = Symbol('kDone'); +const kRun = Symbol('kRun'); + +/** + * A very simple job queue with adjustable concurrency. Adapted from + * https://github.com/STRML/async-limiter + */ +class Limiter { + /** + * Creates a new `Limiter`. + * + * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed + * to run concurrently + */ + constructor(concurrency) { + this[kDone] = () => { + this.pending--; + this[kRun](); + }; + this.concurrency = concurrency || Infinity; + this.jobs = []; + this.pending = 0; + } + + /** + * Adds a job to the queue. + * + * @param {Function} job The job to run + * @public + */ + add(job) { + this.jobs.push(job); + this[kRun](); + } + + /** + * Removes a job from the queue and runs it if possible. + * + * @private + */ + [kRun]() { + if (this.pending === this.concurrency) return; + + if (this.jobs.length) { + const job = this.jobs.shift(); + + this.pending++; + job(this[kDone]); + } + } +} + +module.exports = Limiter; diff --git a/node_modules/ws/lib/permessage-deflate.js b/node_modules/ws/lib/permessage-deflate.js new file mode 100644 index 00000000..41ff70e2 --- /dev/null +++ b/node_modules/ws/lib/permessage-deflate.js @@ -0,0 +1,528 @@ +'use strict'; + +const zlib = require('zlib'); + +const bufferUtil = require('./buffer-util'); +const Limiter = require('./limiter'); +const { kStatusCode } = require('./constants'); + +const FastBuffer = Buffer[Symbol.species]; +const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]); +const kPerMessageDeflate = Symbol('permessage-deflate'); +const kTotalLength = Symbol('total-length'); +const kCallback = Symbol('callback'); +const kBuffers = Symbol('buffers'); +const kError = Symbol('error'); + +// +// We limit zlib concurrency, which prevents severe memory fragmentation +// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913 +// and https://github.com/websockets/ws/issues/1202 +// +// Intentionally global; it's the global thread pool that's an issue. +// +let zlibLimiter; + +/** + * permessage-deflate implementation. + */ +class PerMessageDeflate { + /** + * Creates a PerMessageDeflate instance. + * + * @param {Object} [options] Configuration options + * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support + * for, or request, a custom client window size + * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ + * acknowledge disabling of client context takeover + * @param {Number} [options.concurrencyLimit=10] The number of concurrent + * calls to zlib + * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the + * use of a custom server window size + * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept + * disabling of server context takeover + * @param {Number} [options.threshold=1024] Size (in bytes) below which + * messages should not be compressed if context takeover is disabled + * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on + * deflate + * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on + * inflate + * @param {Boolean} [isServer=false] Create the instance in either server or + * client mode + * @param {Number} [maxPayload=0] The maximum allowed message length + */ + constructor(options, isServer, maxPayload) { + this._maxPayload = maxPayload | 0; + this._options = options || {}; + this._threshold = + this._options.threshold !== undefined ? this._options.threshold : 1024; + this._isServer = !!isServer; + this._deflate = null; + this._inflate = null; + + this.params = null; + + if (!zlibLimiter) { + const concurrency = + this._options.concurrencyLimit !== undefined + ? this._options.concurrencyLimit + : 10; + zlibLimiter = new Limiter(concurrency); + } + } + + /** + * @type {String} + */ + static get extensionName() { + return 'permessage-deflate'; + } + + /** + * Create an extension negotiation offer. + * + * @return {Object} Extension parameters + * @public + */ + offer() { + const params = {}; + + if (this._options.serverNoContextTakeover) { + params.server_no_context_takeover = true; + } + if (this._options.clientNoContextTakeover) { + params.client_no_context_takeover = true; + } + if (this._options.serverMaxWindowBits) { + params.server_max_window_bits = this._options.serverMaxWindowBits; + } + if (this._options.clientMaxWindowBits) { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } else if (this._options.clientMaxWindowBits == null) { + params.client_max_window_bits = true; + } + + return params; + } + + /** + * Accept an extension negotiation offer/response. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Object} Accepted configuration + * @public + */ + accept(configurations) { + configurations = this.normalizeParams(configurations); + + this.params = this._isServer + ? this.acceptAsServer(configurations) + : this.acceptAsClient(configurations); + + return this.params; + } + + /** + * Releases all resources used by the extension. + * + * @public + */ + cleanup() { + if (this._inflate) { + this._inflate.close(); + this._inflate = null; + } + + if (this._deflate) { + const callback = this._deflate[kCallback]; + + this._deflate.close(); + this._deflate = null; + + if (callback) { + callback( + new Error( + 'The deflate stream was closed while data was being processed' + ) + ); + } + } + } + + /** + * Accept an extension negotiation offer. + * + * @param {Array} offers The extension negotiation offers + * @return {Object} Accepted configuration + * @private + */ + acceptAsServer(offers) { + const opts = this._options; + const accepted = offers.find((params) => { + if ( + (opts.serverNoContextTakeover === false && + params.server_no_context_takeover) || + (params.server_max_window_bits && + (opts.serverMaxWindowBits === false || + (typeof opts.serverMaxWindowBits === 'number' && + opts.serverMaxWindowBits > params.server_max_window_bits))) || + (typeof opts.clientMaxWindowBits === 'number' && + !params.client_max_window_bits) + ) { + return false; + } + + return true; + }); + + if (!accepted) { + throw new Error('None of the extension offers can be accepted'); + } + + if (opts.serverNoContextTakeover) { + accepted.server_no_context_takeover = true; + } + if (opts.clientNoContextTakeover) { + accepted.client_no_context_takeover = true; + } + if (typeof opts.serverMaxWindowBits === 'number') { + accepted.server_max_window_bits = opts.serverMaxWindowBits; + } + if (typeof opts.clientMaxWindowBits === 'number') { + accepted.client_max_window_bits = opts.clientMaxWindowBits; + } else if ( + accepted.client_max_window_bits === true || + opts.clientMaxWindowBits === false + ) { + delete accepted.client_max_window_bits; + } + + return accepted; + } + + /** + * Accept the extension negotiation response. + * + * @param {Array} response The extension negotiation response + * @return {Object} Accepted configuration + * @private + */ + acceptAsClient(response) { + const params = response[0]; + + if ( + this._options.clientNoContextTakeover === false && + params.client_no_context_takeover + ) { + throw new Error('Unexpected parameter "client_no_context_takeover"'); + } + + if (!params.client_max_window_bits) { + if (typeof this._options.clientMaxWindowBits === 'number') { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } + } else if ( + this._options.clientMaxWindowBits === false || + (typeof this._options.clientMaxWindowBits === 'number' && + params.client_max_window_bits > this._options.clientMaxWindowBits) + ) { + throw new Error( + 'Unexpected or invalid parameter "client_max_window_bits"' + ); + } + + return params; + } + + /** + * Normalize parameters. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Array} The offers/response with normalized parameters + * @private + */ + normalizeParams(configurations) { + configurations.forEach((params) => { + Object.keys(params).forEach((key) => { + let value = params[key]; + + if (value.length > 1) { + throw new Error(`Parameter "${key}" must have only a single value`); + } + + value = value[0]; + + if (key === 'client_max_window_bits') { + if (value !== true) { + const num = +value; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num; + } else if (!this._isServer) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + } else if (key === 'server_max_window_bits') { + const num = +value; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num; + } else if ( + key === 'client_no_context_takeover' || + key === 'server_no_context_takeover' + ) { + if (value !== true) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + } else { + throw new Error(`Unknown parameter "${key}"`); + } + + params[key] = value; + }); + }); + + return configurations; + } + + /** + * Decompress data. Concurrency limited. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + decompress(data, fin, callback) { + zlibLimiter.add((done) => { + this._decompress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + + /** + * Compress data. Concurrency limited. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + compress(data, fin, callback) { + zlibLimiter.add((done) => { + this._compress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + + /** + * Decompress data. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _decompress(data, fin, callback) { + const endpoint = this._isServer ? 'client' : 'server'; + + if (!this._inflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = + typeof this.params[key] !== 'number' + ? zlib.Z_DEFAULT_WINDOWBITS + : this.params[key]; + + this._inflate = zlib.createInflateRaw({ + ...this._options.zlibInflateOptions, + windowBits + }); + this._inflate[kPerMessageDeflate] = this; + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + this._inflate.on('error', inflateOnError); + this._inflate.on('data', inflateOnData); + } + + this._inflate[kCallback] = callback; + + this._inflate.write(data); + if (fin) this._inflate.write(TRAILER); + + this._inflate.flush(() => { + const err = this._inflate[kError]; + + if (err) { + this._inflate.close(); + this._inflate = null; + callback(err); + return; + } + + const data = bufferUtil.concat( + this._inflate[kBuffers], + this._inflate[kTotalLength] + ); + + if (this._inflate._readableState.endEmitted) { + this._inflate.close(); + this._inflate = null; + } else { + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._inflate.reset(); + } + } + + callback(null, data); + }); + } + + /** + * Compress data. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _compress(data, fin, callback) { + const endpoint = this._isServer ? 'server' : 'client'; + + if (!this._deflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = + typeof this.params[key] !== 'number' + ? zlib.Z_DEFAULT_WINDOWBITS + : this.params[key]; + + this._deflate = zlib.createDeflateRaw({ + ...this._options.zlibDeflateOptions, + windowBits + }); + + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + + this._deflate.on('data', deflateOnData); + } + + this._deflate[kCallback] = callback; + + this._deflate.write(data); + this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { + if (!this._deflate) { + // + // The deflate stream was closed while data was being processed. + // + return; + } + + let data = bufferUtil.concat( + this._deflate[kBuffers], + this._deflate[kTotalLength] + ); + + if (fin) { + data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4); + } + + // + // Ensure that the callback will not be called again in + // `PerMessageDeflate#cleanup()`. + // + this._deflate[kCallback] = null; + + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._deflate.reset(); + } + + callback(null, data); + }); + } +} + +module.exports = PerMessageDeflate; + +/** + * The listener of the `zlib.DeflateRaw` stream `'data'` event. + * + * @param {Buffer} chunk A chunk of data + * @private + */ +function deflateOnData(chunk) { + this[kBuffers].push(chunk); + this[kTotalLength] += chunk.length; +} + +/** + * The listener of the `zlib.InflateRaw` stream `'data'` event. + * + * @param {Buffer} chunk A chunk of data + * @private + */ +function inflateOnData(chunk) { + this[kTotalLength] += chunk.length; + + if ( + this[kPerMessageDeflate]._maxPayload < 1 || + this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload + ) { + this[kBuffers].push(chunk); + return; + } + + this[kError] = new RangeError('Max payload size exceeded'); + this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'; + this[kError][kStatusCode] = 1009; + this.removeListener('data', inflateOnData); + + // + // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the + // fact that in Node.js versions prior to 13.10.0, the callback for + // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing + // `zlib.reset()` ensures that either the callback is invoked or an error is + // emitted. + // + this.reset(); +} + +/** + * The listener of the `zlib.InflateRaw` stream `'error'` event. + * + * @param {Error} err The emitted error + * @private + */ +function inflateOnError(err) { + // + // There is no need to call `Zlib#close()` as the handle is automatically + // closed when an error is emitted. + // + this[kPerMessageDeflate]._inflate = null; + + if (this[kError]) { + this[kCallback](this[kError]); + return; + } + + err[kStatusCode] = 1007; + this[kCallback](err); +} diff --git a/node_modules/ws/lib/receiver.js b/node_modules/ws/lib/receiver.js new file mode 100644 index 00000000..54d9b4fa --- /dev/null +++ b/node_modules/ws/lib/receiver.js @@ -0,0 +1,706 @@ +'use strict'; + +const { Writable } = require('stream'); + +const PerMessageDeflate = require('./permessage-deflate'); +const { + BINARY_TYPES, + EMPTY_BUFFER, + kStatusCode, + kWebSocket +} = require('./constants'); +const { concat, toArrayBuffer, unmask } = require('./buffer-util'); +const { isValidStatusCode, isValidUTF8 } = require('./validation'); + +const FastBuffer = Buffer[Symbol.species]; + +const GET_INFO = 0; +const GET_PAYLOAD_LENGTH_16 = 1; +const GET_PAYLOAD_LENGTH_64 = 2; +const GET_MASK = 3; +const GET_DATA = 4; +const INFLATING = 5; +const DEFER_EVENT = 6; + +/** + * HyBi Receiver implementation. + * + * @extends Writable + */ +class Receiver extends Writable { + /** + * Creates a Receiver instance. + * + * @param {Object} [options] Options object + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {String} [options.binaryType=nodebuffer] The type for binary data + * @param {Object} [options.extensions] An object containing the negotiated + * extensions + * @param {Boolean} [options.isServer=false] Specifies whether to operate in + * client or server mode + * @param {Number} [options.maxPayload=0] The maximum allowed message length + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + */ + constructor(options = {}) { + super(); + + this._allowSynchronousEvents = + options.allowSynchronousEvents !== undefined + ? options.allowSynchronousEvents + : true; + this._binaryType = options.binaryType || BINARY_TYPES[0]; + this._extensions = options.extensions || {}; + this._isServer = !!options.isServer; + this._maxPayload = options.maxPayload | 0; + this._skipUTF8Validation = !!options.skipUTF8Validation; + this[kWebSocket] = undefined; + + this._bufferedBytes = 0; + this._buffers = []; + + this._compressed = false; + this._payloadLength = 0; + this._mask = undefined; + this._fragmented = 0; + this._masked = false; + this._fin = false; + this._opcode = 0; + + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragments = []; + + this._errored = false; + this._loop = false; + this._state = GET_INFO; + } + + /** + * Implements `Writable.prototype._write()`. + * + * @param {Buffer} chunk The chunk of data to write + * @param {String} encoding The character encoding of `chunk` + * @param {Function} cb Callback + * @private + */ + _write(chunk, encoding, cb) { + if (this._opcode === 0x08 && this._state == GET_INFO) return cb(); + + this._bufferedBytes += chunk.length; + this._buffers.push(chunk); + this.startLoop(cb); + } + + /** + * Consumes `n` bytes from the buffered data. + * + * @param {Number} n The number of bytes to consume + * @return {Buffer} The consumed bytes + * @private + */ + consume(n) { + this._bufferedBytes -= n; + + if (n === this._buffers[0].length) return this._buffers.shift(); + + if (n < this._buffers[0].length) { + const buf = this._buffers[0]; + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + + return new FastBuffer(buf.buffer, buf.byteOffset, n); + } + + const dst = Buffer.allocUnsafe(n); + + do { + const buf = this._buffers[0]; + const offset = dst.length - n; + + if (n >= buf.length) { + dst.set(this._buffers.shift(), offset); + } else { + dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + } + + n -= buf.length; + } while (n > 0); + + return dst; + } + + /** + * Starts the parsing loop. + * + * @param {Function} cb Callback + * @private + */ + startLoop(cb) { + this._loop = true; + + do { + switch (this._state) { + case GET_INFO: + this.getInfo(cb); + break; + case GET_PAYLOAD_LENGTH_16: + this.getPayloadLength16(cb); + break; + case GET_PAYLOAD_LENGTH_64: + this.getPayloadLength64(cb); + break; + case GET_MASK: + this.getMask(); + break; + case GET_DATA: + this.getData(cb); + break; + case INFLATING: + case DEFER_EVENT: + this._loop = false; + return; + } + } while (this._loop); + + if (!this._errored) cb(); + } + + /** + * Reads the first two bytes of a frame. + * + * @param {Function} cb Callback + * @private + */ + getInfo(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + + const buf = this.consume(2); + + if ((buf[0] & 0x30) !== 0x00) { + const error = this.createError( + RangeError, + 'RSV2 and RSV3 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_2_3' + ); + + cb(error); + return; + } + + const compressed = (buf[0] & 0x40) === 0x40; + + if (compressed && !this._extensions[PerMessageDeflate.extensionName]) { + const error = this.createError( + RangeError, + 'RSV1 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_1' + ); + + cb(error); + return; + } + + this._fin = (buf[0] & 0x80) === 0x80; + this._opcode = buf[0] & 0x0f; + this._payloadLength = buf[1] & 0x7f; + + if (this._opcode === 0x00) { + if (compressed) { + const error = this.createError( + RangeError, + 'RSV1 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_1' + ); + + cb(error); + return; + } + + if (!this._fragmented) { + const error = this.createError( + RangeError, + 'invalid opcode 0', + true, + 1002, + 'WS_ERR_INVALID_OPCODE' + ); + + cb(error); + return; + } + + this._opcode = this._fragmented; + } else if (this._opcode === 0x01 || this._opcode === 0x02) { + if (this._fragmented) { + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + 'WS_ERR_INVALID_OPCODE' + ); + + cb(error); + return; + } + + this._compressed = compressed; + } else if (this._opcode > 0x07 && this._opcode < 0x0b) { + if (!this._fin) { + const error = this.createError( + RangeError, + 'FIN must be set', + true, + 1002, + 'WS_ERR_EXPECTED_FIN' + ); + + cb(error); + return; + } + + if (compressed) { + const error = this.createError( + RangeError, + 'RSV1 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_1' + ); + + cb(error); + return; + } + + if ( + this._payloadLength > 0x7d || + (this._opcode === 0x08 && this._payloadLength === 1) + ) { + const error = this.createError( + RangeError, + `invalid payload length ${this._payloadLength}`, + true, + 1002, + 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH' + ); + + cb(error); + return; + } + } else { + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + 'WS_ERR_INVALID_OPCODE' + ); + + cb(error); + return; + } + + if (!this._fin && !this._fragmented) this._fragmented = this._opcode; + this._masked = (buf[1] & 0x80) === 0x80; + + if (this._isServer) { + if (!this._masked) { + const error = this.createError( + RangeError, + 'MASK must be set', + true, + 1002, + 'WS_ERR_EXPECTED_MASK' + ); + + cb(error); + return; + } + } else if (this._masked) { + const error = this.createError( + RangeError, + 'MASK must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_MASK' + ); + + cb(error); + return; + } + + if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; + else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; + else this.haveLength(cb); + } + + /** + * Gets extended payload length (7+16). + * + * @param {Function} cb Callback + * @private + */ + getPayloadLength16(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + + this._payloadLength = this.consume(2).readUInt16BE(0); + this.haveLength(cb); + } + + /** + * Gets extended payload length (7+64). + * + * @param {Function} cb Callback + * @private + */ + getPayloadLength64(cb) { + if (this._bufferedBytes < 8) { + this._loop = false; + return; + } + + const buf = this.consume(8); + const num = buf.readUInt32BE(0); + + // + // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned + // if payload length is greater than this number. + // + if (num > Math.pow(2, 53 - 32) - 1) { + const error = this.createError( + RangeError, + 'Unsupported WebSocket frame: payload length > 2^53 - 1', + false, + 1009, + 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH' + ); + + cb(error); + return; + } + + this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4); + this.haveLength(cb); + } + + /** + * Payload length has been read. + * + * @param {Function} cb Callback + * @private + */ + haveLength(cb) { + if (this._payloadLength && this._opcode < 0x08) { + this._totalPayloadLength += this._payloadLength; + if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + 'Max payload size exceeded', + false, + 1009, + 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' + ); + + cb(error); + return; + } + } + + if (this._masked) this._state = GET_MASK; + else this._state = GET_DATA; + } + + /** + * Reads mask bytes. + * + * @private + */ + getMask() { + if (this._bufferedBytes < 4) { + this._loop = false; + return; + } + + this._mask = this.consume(4); + this._state = GET_DATA; + } + + /** + * Reads data bytes. + * + * @param {Function} cb Callback + * @private + */ + getData(cb) { + let data = EMPTY_BUFFER; + + if (this._payloadLength) { + if (this._bufferedBytes < this._payloadLength) { + this._loop = false; + return; + } + + data = this.consume(this._payloadLength); + + if ( + this._masked && + (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0 + ) { + unmask(data, this._mask); + } + } + + if (this._opcode > 0x07) { + this.controlMessage(data, cb); + return; + } + + if (this._compressed) { + this._state = INFLATING; + this.decompress(data, cb); + return; + } + + if (data.length) { + // + // This message is not compressed so its length is the sum of the payload + // length of all fragments. + // + this._messageLength = this._totalPayloadLength; + this._fragments.push(data); + } + + this.dataMessage(cb); + } + + /** + * Decompresses data. + * + * @param {Buffer} data Compressed data + * @param {Function} cb Callback + * @private + */ + decompress(data, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; + + perMessageDeflate.decompress(data, this._fin, (err, buf) => { + if (err) return cb(err); + + if (buf.length) { + this._messageLength += buf.length; + if (this._messageLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + 'Max payload size exceeded', + false, + 1009, + 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' + ); + + cb(error); + return; + } + + this._fragments.push(buf); + } + + this.dataMessage(cb); + if (this._state === GET_INFO) this.startLoop(cb); + }); + } + + /** + * Handles a data message. + * + * @param {Function} cb Callback + * @private + */ + dataMessage(cb) { + if (!this._fin) { + this._state = GET_INFO; + return; + } + + const messageLength = this._messageLength; + const fragments = this._fragments; + + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragmented = 0; + this._fragments = []; + + if (this._opcode === 2) { + let data; + + if (this._binaryType === 'nodebuffer') { + data = concat(fragments, messageLength); + } else if (this._binaryType === 'arraybuffer') { + data = toArrayBuffer(concat(fragments, messageLength)); + } else if (this._binaryType === 'blob') { + data = new Blob(fragments); + } else { + data = fragments; + } + + if (this._allowSynchronousEvents) { + this.emit('message', data, true); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit('message', data, true); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } else { + const buf = concat(fragments, messageLength); + + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + 'invalid UTF-8 sequence', + true, + 1007, + 'WS_ERR_INVALID_UTF8' + ); + + cb(error); + return; + } + + if (this._state === INFLATING || this._allowSynchronousEvents) { + this.emit('message', buf, false); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit('message', buf, false); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } + } + + /** + * Handles a control message. + * + * @param {Buffer} data Data to handle + * @return {(Error|RangeError|undefined)} A possible error + * @private + */ + controlMessage(data, cb) { + if (this._opcode === 0x08) { + if (data.length === 0) { + this._loop = false; + this.emit('conclude', 1005, EMPTY_BUFFER); + this.end(); + } else { + const code = data.readUInt16BE(0); + + if (!isValidStatusCode(code)) { + const error = this.createError( + RangeError, + `invalid status code ${code}`, + true, + 1002, + 'WS_ERR_INVALID_CLOSE_CODE' + ); + + cb(error); + return; + } + + const buf = new FastBuffer( + data.buffer, + data.byteOffset + 2, + data.length - 2 + ); + + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + 'invalid UTF-8 sequence', + true, + 1007, + 'WS_ERR_INVALID_UTF8' + ); + + cb(error); + return; + } + + this._loop = false; + this.emit('conclude', code, buf); + this.end(); + } + + this._state = GET_INFO; + return; + } + + if (this._allowSynchronousEvents) { + this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } + + /** + * Builds an error object. + * + * @param {function(new:Error|RangeError)} ErrorCtor The error constructor + * @param {String} message The error message + * @param {Boolean} prefix Specifies whether or not to add a default prefix to + * `message` + * @param {Number} statusCode The status code + * @param {String} errorCode The exposed error code + * @return {(Error|RangeError)} The error + * @private + */ + createError(ErrorCtor, message, prefix, statusCode, errorCode) { + this._loop = false; + this._errored = true; + + const err = new ErrorCtor( + prefix ? `Invalid WebSocket frame: ${message}` : message + ); + + Error.captureStackTrace(err, this.createError); + err.code = errorCode; + err[kStatusCode] = statusCode; + return err; + } +} + +module.exports = Receiver; diff --git a/node_modules/ws/lib/sender.js b/node_modules/ws/lib/sender.js new file mode 100644 index 00000000..a8b1da3a --- /dev/null +++ b/node_modules/ws/lib/sender.js @@ -0,0 +1,602 @@ +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex" }] */ + +'use strict'; + +const { Duplex } = require('stream'); +const { randomFillSync } = require('crypto'); + +const PerMessageDeflate = require('./permessage-deflate'); +const { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants'); +const { isBlob, isValidStatusCode } = require('./validation'); +const { mask: applyMask, toBuffer } = require('./buffer-util'); + +const kByteLength = Symbol('kByteLength'); +const maskBuffer = Buffer.alloc(4); +const RANDOM_POOL_SIZE = 8 * 1024; +let randomPool; +let randomPoolPointer = RANDOM_POOL_SIZE; + +const DEFAULT = 0; +const DEFLATING = 1; +const GET_BLOB_DATA = 2; + +/** + * HyBi Sender implementation. + */ +class Sender { + /** + * Creates a Sender instance. + * + * @param {Duplex} socket The connection socket + * @param {Object} [extensions] An object containing the negotiated extensions + * @param {Function} [generateMask] The function used to generate the masking + * key + */ + constructor(socket, extensions, generateMask) { + this._extensions = extensions || {}; + + if (generateMask) { + this._generateMask = generateMask; + this._maskBuffer = Buffer.alloc(4); + } + + this._socket = socket; + + this._firstFragment = true; + this._compress = false; + + this._bufferedBytes = 0; + this._queue = []; + this._state = DEFAULT; + this.onerror = NOOP; + this[kWebSocket] = undefined; + } + + /** + * Frames a piece of data according to the HyBi WebSocket protocol. + * + * @param {(Buffer|String)} data The data to frame + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @return {(Buffer|String)[]} The framed data + * @public + */ + static frame(data, options) { + let mask; + let merge = false; + let offset = 2; + let skipMasking = false; + + if (options.mask) { + mask = options.maskBuffer || maskBuffer; + + if (options.generateMask) { + options.generateMask(mask); + } else { + if (randomPoolPointer === RANDOM_POOL_SIZE) { + /* istanbul ignore else */ + if (randomPool === undefined) { + // + // This is lazily initialized because server-sent frames must not + // be masked so it may never be used. + // + randomPool = Buffer.alloc(RANDOM_POOL_SIZE); + } + + randomFillSync(randomPool, 0, RANDOM_POOL_SIZE); + randomPoolPointer = 0; + } + + mask[0] = randomPool[randomPoolPointer++]; + mask[1] = randomPool[randomPoolPointer++]; + mask[2] = randomPool[randomPoolPointer++]; + mask[3] = randomPool[randomPoolPointer++]; + } + + skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0; + offset = 6; + } + + let dataLength; + + if (typeof data === 'string') { + if ( + (!options.mask || skipMasking) && + options[kByteLength] !== undefined + ) { + dataLength = options[kByteLength]; + } else { + data = Buffer.from(data); + dataLength = data.length; + } + } else { + dataLength = data.length; + merge = options.mask && options.readOnly && !skipMasking; + } + + let payloadLength = dataLength; + + if (dataLength >= 65536) { + offset += 8; + payloadLength = 127; + } else if (dataLength > 125) { + offset += 2; + payloadLength = 126; + } + + const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset); + + target[0] = options.fin ? options.opcode | 0x80 : options.opcode; + if (options.rsv1) target[0] |= 0x40; + + target[1] = payloadLength; + + if (payloadLength === 126) { + target.writeUInt16BE(dataLength, 2); + } else if (payloadLength === 127) { + target[2] = target[3] = 0; + target.writeUIntBE(dataLength, 4, 6); + } + + if (!options.mask) return [target, data]; + + target[1] |= 0x80; + target[offset - 4] = mask[0]; + target[offset - 3] = mask[1]; + target[offset - 2] = mask[2]; + target[offset - 1] = mask[3]; + + if (skipMasking) return [target, data]; + + if (merge) { + applyMask(data, mask, target, offset, dataLength); + return [target]; + } + + applyMask(data, mask, data, 0, dataLength); + return [target, data]; + } + + /** + * Sends a close message to the other peer. + * + * @param {Number} [code] The status code component of the body + * @param {(String|Buffer)} [data] The message component of the body + * @param {Boolean} [mask=false] Specifies whether or not to mask the message + * @param {Function} [cb] Callback + * @public + */ + close(code, data, mask, cb) { + let buf; + + if (code === undefined) { + buf = EMPTY_BUFFER; + } else if (typeof code !== 'number' || !isValidStatusCode(code)) { + throw new TypeError('First argument must be a valid error code number'); + } else if (data === undefined || !data.length) { + buf = Buffer.allocUnsafe(2); + buf.writeUInt16BE(code, 0); + } else { + const length = Buffer.byteLength(data); + + if (length > 123) { + throw new RangeError('The message must not be greater than 123 bytes'); + } + + buf = Buffer.allocUnsafe(2 + length); + buf.writeUInt16BE(code, 0); + + if (typeof data === 'string') { + buf.write(data, 2); + } else { + buf.set(data, 2); + } + } + + const options = { + [kByteLength]: buf.length, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 0x08, + readOnly: false, + rsv1: false + }; + + if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, buf, false, options, cb]); + } else { + this.sendFrame(Sender.frame(buf, options), cb); + } + } + + /** + * Sends a ping message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + ping(data, mask, cb) { + let byteLength; + let readOnly; + + if (typeof data === 'string') { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; + } + + if (byteLength > 125) { + throw new RangeError('The data size must not be greater than 125 bytes'); + } + + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 0x09, + readOnly, + rsv1: false + }; + + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); + } else { + this.sendFrame(Sender.frame(data, options), cb); + } + } + + /** + * Sends a pong message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + pong(data, mask, cb) { + let byteLength; + let readOnly; + + if (typeof data === 'string') { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; + } + + if (byteLength > 125) { + throw new RangeError('The data size must not be greater than 125 bytes'); + } + + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 0x0a, + readOnly, + rsv1: false + }; + + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); + } else { + this.sendFrame(Sender.frame(data, options), cb); + } + } + + /** + * Sends a data message to the other peer. + * + * @param {*} data The message to send + * @param {Object} options Options object + * @param {Boolean} [options.binary=false] Specifies whether `data` is binary + * or text + * @param {Boolean} [options.compress=false] Specifies whether or not to + * compress `data` + * @param {Boolean} [options.fin=false] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Function} [cb] Callback + * @public + */ + send(data, options, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; + let opcode = options.binary ? 2 : 1; + let rsv1 = options.compress; + + let byteLength; + let readOnly; + + if (typeof data === 'string') { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; + } + + if (this._firstFragment) { + this._firstFragment = false; + if ( + rsv1 && + perMessageDeflate && + perMessageDeflate.params[ + perMessageDeflate._isServer + ? 'server_no_context_takeover' + : 'client_no_context_takeover' + ] + ) { + rsv1 = byteLength >= perMessageDeflate._threshold; + } + this._compress = rsv1; + } else { + rsv1 = false; + opcode = 0; + } + + if (options.fin) this._firstFragment = true; + + const opts = { + [kByteLength]: byteLength, + fin: options.fin, + generateMask: this._generateMask, + mask: options.mask, + maskBuffer: this._maskBuffer, + opcode, + readOnly, + rsv1 + }; + + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, this._compress, opts, cb]); + } else { + this.getBlobData(data, this._compress, opts, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, this._compress, opts, cb]); + } else { + this.dispatch(data, this._compress, opts, cb); + } + } + + /** + * Gets the contents of a blob as binary data. + * + * @param {Blob} blob The blob + * @param {Boolean} [compress=false] Specifies whether or not to compress + * the data + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + getBlobData(blob, compress, options, cb) { + this._bufferedBytes += options[kByteLength]; + this._state = GET_BLOB_DATA; + + blob + .arrayBuffer() + .then((arrayBuffer) => { + if (this._socket.destroyed) { + const err = new Error( + 'The socket was closed while the blob was being read' + ); + + // + // `callCallbacks` is called in the next tick to ensure that errors + // that might be thrown in the callbacks behave like errors thrown + // outside the promise chain. + // + process.nextTick(callCallbacks, this, err, cb); + return; + } + + this._bufferedBytes -= options[kByteLength]; + const data = toBuffer(arrayBuffer); + + if (!compress) { + this._state = DEFAULT; + this.sendFrame(Sender.frame(data, options), cb); + this.dequeue(); + } else { + this.dispatch(data, compress, options, cb); + } + }) + .catch((err) => { + // + // `onError` is called in the next tick for the same reason that + // `callCallbacks` above is. + // + process.nextTick(onError, this, err, cb); + }); + } + + /** + * Dispatches a message. + * + * @param {(Buffer|String)} data The message to send + * @param {Boolean} [compress=false] Specifies whether or not to compress + * `data` + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + dispatch(data, compress, options, cb) { + if (!compress) { + this.sendFrame(Sender.frame(data, options), cb); + return; + } + + const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; + + this._bufferedBytes += options[kByteLength]; + this._state = DEFLATING; + perMessageDeflate.compress(data, options.fin, (_, buf) => { + if (this._socket.destroyed) { + const err = new Error( + 'The socket was closed while data was being compressed' + ); + + callCallbacks(this, err, cb); + return; + } + + this._bufferedBytes -= options[kByteLength]; + this._state = DEFAULT; + options.readOnly = false; + this.sendFrame(Sender.frame(buf, options), cb); + this.dequeue(); + }); + } + + /** + * Executes queued send operations. + * + * @private + */ + dequeue() { + while (this._state === DEFAULT && this._queue.length) { + const params = this._queue.shift(); + + this._bufferedBytes -= params[3][kByteLength]; + Reflect.apply(params[0], this, params.slice(1)); + } + } + + /** + * Enqueues a send operation. + * + * @param {Array} params Send operation parameters. + * @private + */ + enqueue(params) { + this._bufferedBytes += params[3][kByteLength]; + this._queue.push(params); + } + + /** + * Sends a frame. + * + * @param {(Buffer | String)[]} list The frame to send + * @param {Function} [cb] Callback + * @private + */ + sendFrame(list, cb) { + if (list.length === 2) { + this._socket.cork(); + this._socket.write(list[0]); + this._socket.write(list[1], cb); + this._socket.uncork(); + } else { + this._socket.write(list[0], cb); + } + } +} + +module.exports = Sender; + +/** + * Calls queued callbacks with an error. + * + * @param {Sender} sender The `Sender` instance + * @param {Error} err The error to call the callbacks with + * @param {Function} [cb] The first callback + * @private + */ +function callCallbacks(sender, err, cb) { + if (typeof cb === 'function') cb(err); + + for (let i = 0; i < sender._queue.length; i++) { + const params = sender._queue[i]; + const callback = params[params.length - 1]; + + if (typeof callback === 'function') callback(err); + } +} + +/** + * Handles a `Sender` error. + * + * @param {Sender} sender The `Sender` instance + * @param {Error} err The error + * @param {Function} [cb] The first pending callback + * @private + */ +function onError(sender, err, cb) { + callCallbacks(sender, err, cb); + sender.onerror(err); +} diff --git a/node_modules/ws/lib/stream.js b/node_modules/ws/lib/stream.js new file mode 100644 index 00000000..4c58c911 --- /dev/null +++ b/node_modules/ws/lib/stream.js @@ -0,0 +1,161 @@ +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^WebSocket$" }] */ +'use strict'; + +const WebSocket = require('./websocket'); +const { Duplex } = require('stream'); + +/** + * Emits the `'close'` event on a stream. + * + * @param {Duplex} stream The stream. + * @private + */ +function emitClose(stream) { + stream.emit('close'); +} + +/** + * The listener of the `'end'` event. + * + * @private + */ +function duplexOnEnd() { + if (!this.destroyed && this._writableState.finished) { + this.destroy(); + } +} + +/** + * The listener of the `'error'` event. + * + * @param {Error} err The error + * @private + */ +function duplexOnError(err) { + this.removeListener('error', duplexOnError); + this.destroy(); + if (this.listenerCount('error') === 0) { + // Do not suppress the throwing behavior. + this.emit('error', err); + } +} + +/** + * Wraps a `WebSocket` in a duplex stream. + * + * @param {WebSocket} ws The `WebSocket` to wrap + * @param {Object} [options] The options for the `Duplex` constructor + * @return {Duplex} The duplex stream + * @public + */ +function createWebSocketStream(ws, options) { + let terminateOnDestroy = true; + + const duplex = new Duplex({ + ...options, + autoDestroy: false, + emitClose: false, + objectMode: false, + writableObjectMode: false + }); + + ws.on('message', function message(msg, isBinary) { + const data = + !isBinary && duplex._readableState.objectMode ? msg.toString() : msg; + + if (!duplex.push(data)) ws.pause(); + }); + + ws.once('error', function error(err) { + if (duplex.destroyed) return; + + // Prevent `ws.terminate()` from being called by `duplex._destroy()`. + // + // - If the `'error'` event is emitted before the `'open'` event, then + // `ws.terminate()` is a noop as no socket is assigned. + // - Otherwise, the error is re-emitted by the listener of the `'error'` + // event of the `Receiver` object. The listener already closes the + // connection by calling `ws.close()`. This allows a close frame to be + // sent to the other peer. If `ws.terminate()` is called right after this, + // then the close frame might not be sent. + terminateOnDestroy = false; + duplex.destroy(err); + }); + + ws.once('close', function close() { + if (duplex.destroyed) return; + + duplex.push(null); + }); + + duplex._destroy = function (err, callback) { + if (ws.readyState === ws.CLOSED) { + callback(err); + process.nextTick(emitClose, duplex); + return; + } + + let called = false; + + ws.once('error', function error(err) { + called = true; + callback(err); + }); + + ws.once('close', function close() { + if (!called) callback(err); + process.nextTick(emitClose, duplex); + }); + + if (terminateOnDestroy) ws.terminate(); + }; + + duplex._final = function (callback) { + if (ws.readyState === ws.CONNECTING) { + ws.once('open', function open() { + duplex._final(callback); + }); + return; + } + + // If the value of the `_socket` property is `null` it means that `ws` is a + // client websocket and the handshake failed. In fact, when this happens, a + // socket is never assigned to the websocket. Wait for the `'error'` event + // that will be emitted by the websocket. + if (ws._socket === null) return; + + if (ws._socket._writableState.finished) { + callback(); + if (duplex._readableState.endEmitted) duplex.destroy(); + } else { + ws._socket.once('finish', function finish() { + // `duplex` is not destroyed here because the `'end'` event will be + // emitted on `duplex` after this `'finish'` event. The EOF signaling + // `null` chunk is, in fact, pushed when the websocket emits `'close'`. + callback(); + }); + ws.close(); + } + }; + + duplex._read = function () { + if (ws.isPaused) ws.resume(); + }; + + duplex._write = function (chunk, encoding, callback) { + if (ws.readyState === ws.CONNECTING) { + ws.once('open', function open() { + duplex._write(chunk, encoding, callback); + }); + return; + } + + ws.send(chunk, callback); + }; + + duplex.on('end', duplexOnEnd); + duplex.on('error', duplexOnError); + return duplex; +} + +module.exports = createWebSocketStream; diff --git a/node_modules/ws/lib/subprotocol.js b/node_modules/ws/lib/subprotocol.js new file mode 100644 index 00000000..d4381e88 --- /dev/null +++ b/node_modules/ws/lib/subprotocol.js @@ -0,0 +1,62 @@ +'use strict'; + +const { tokenChars } = require('./validation'); + +/** + * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names. + * + * @param {String} header The field value of the header + * @return {Set} The subprotocol names + * @public + */ +function parse(header) { + const protocols = new Set(); + let start = -1; + let end = -1; + let i = 0; + + for (i; i < header.length; i++) { + const code = header.charCodeAt(i); + + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if ( + i !== 0 && + (code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */ + ) { + if (end === -1 && start !== -1) end = i; + } else if (code === 0x2c /* ',' */) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + + const protocol = header.slice(start, end); + + if (protocols.has(protocol)) { + throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`); + } + + protocols.add(protocol); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } + + if (start === -1 || end !== -1) { + throw new SyntaxError('Unexpected end of input'); + } + + const protocol = header.slice(start, i); + + if (protocols.has(protocol)) { + throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`); + } + + protocols.add(protocol); + return protocols; +} + +module.exports = { parse }; diff --git a/node_modules/ws/lib/validation.js b/node_modules/ws/lib/validation.js new file mode 100644 index 00000000..4a2e68d5 --- /dev/null +++ b/node_modules/ws/lib/validation.js @@ -0,0 +1,152 @@ +'use strict'; + +const { isUtf8 } = require('buffer'); + +const { hasBlob } = require('./constants'); + +// +// Allowed token characters: +// +// '!', '#', '$', '%', '&', ''', '*', '+', '-', +// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~' +// +// tokenChars[32] === 0 // ' ' +// tokenChars[33] === 1 // '!' +// tokenChars[34] === 0 // '"' +// ... +// +// prettier-ignore +const tokenChars = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31 + 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63 + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127 +]; + +/** + * Checks if a status code is allowed in a close frame. + * + * @param {Number} code The status code + * @return {Boolean} `true` if the status code is valid, else `false` + * @public + */ +function isValidStatusCode(code) { + return ( + (code >= 1000 && + code <= 1014 && + code !== 1004 && + code !== 1005 && + code !== 1006) || + (code >= 3000 && code <= 4999) + ); +} + +/** + * Checks if a given buffer contains only correct UTF-8. + * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by + * Markus Kuhn. + * + * @param {Buffer} buf The buffer to check + * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false` + * @public + */ +function _isValidUTF8(buf) { + const len = buf.length; + let i = 0; + + while (i < len) { + if ((buf[i] & 0x80) === 0) { + // 0xxxxxxx + i++; + } else if ((buf[i] & 0xe0) === 0xc0) { + // 110xxxxx 10xxxxxx + if ( + i + 1 === len || + (buf[i + 1] & 0xc0) !== 0x80 || + (buf[i] & 0xfe) === 0xc0 // Overlong + ) { + return false; + } + + i += 2; + } else if ((buf[i] & 0xf0) === 0xe0) { + // 1110xxxx 10xxxxxx 10xxxxxx + if ( + i + 2 >= len || + (buf[i + 1] & 0xc0) !== 0x80 || + (buf[i + 2] & 0xc0) !== 0x80 || + (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong + (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF) + ) { + return false; + } + + i += 3; + } else if ((buf[i] & 0xf8) === 0xf0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + if ( + i + 3 >= len || + (buf[i + 1] & 0xc0) !== 0x80 || + (buf[i + 2] & 0xc0) !== 0x80 || + (buf[i + 3] & 0xc0) !== 0x80 || + (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong + (buf[i] === 0xf4 && buf[i + 1] > 0x8f) || + buf[i] > 0xf4 // > U+10FFFF + ) { + return false; + } + + i += 4; + } else { + return false; + } + } + + return true; +} + +/** + * Determines whether a value is a `Blob`. + * + * @param {*} value The value to be tested + * @return {Boolean} `true` if `value` is a `Blob`, else `false` + * @private + */ +function isBlob(value) { + return ( + hasBlob && + typeof value === 'object' && + typeof value.arrayBuffer === 'function' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + (value[Symbol.toStringTag] === 'Blob' || + value[Symbol.toStringTag] === 'File') + ); +} + +module.exports = { + isBlob, + isValidStatusCode, + isValidUTF8: _isValidUTF8, + tokenChars +}; + +if (isUtf8) { + module.exports.isValidUTF8 = function (buf) { + return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf); + }; +} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) { + try { + const isValidUTF8 = require('utf-8-validate'); + + module.exports.isValidUTF8 = function (buf) { + return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf); + }; + } catch (e) { + // Continue regardless of the error. + } +} diff --git a/node_modules/ws/lib/websocket-server.js b/node_modules/ws/lib/websocket-server.js new file mode 100644 index 00000000..33e09858 --- /dev/null +++ b/node_modules/ws/lib/websocket-server.js @@ -0,0 +1,550 @@ +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex$", "caughtErrors": "none" }] */ + +'use strict'; + +const EventEmitter = require('events'); +const http = require('http'); +const { Duplex } = require('stream'); +const { createHash } = require('crypto'); + +const extension = require('./extension'); +const PerMessageDeflate = require('./permessage-deflate'); +const subprotocol = require('./subprotocol'); +const WebSocket = require('./websocket'); +const { GUID, kWebSocket } = require('./constants'); + +const keyRegex = /^[+/0-9A-Za-z]{22}==$/; + +const RUNNING = 0; +const CLOSING = 1; +const CLOSED = 2; + +/** + * Class representing a WebSocket server. + * + * @extends EventEmitter + */ +class WebSocketServer extends EventEmitter { + /** + * Create a `WebSocketServer` instance. + * + * @param {Object} options Configuration options + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Boolean} [options.autoPong=true] Specifies whether or not to + * automatically send a pong in response to a ping + * @param {Number} [options.backlog=511] The maximum length of the queue of + * pending connections + * @param {Boolean} [options.clientTracking=true] Specifies whether or not to + * track clients + * @param {Function} [options.handleProtocols] A hook to handle protocols + * @param {String} [options.host] The hostname where to bind the server + * @param {Number} [options.maxPayload=104857600] The maximum allowed message + * size + * @param {Boolean} [options.noServer=false] Enable no server mode + * @param {String} [options.path] Accept only connections matching this path + * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable + * permessage-deflate + * @param {Number} [options.port] The port where to bind the server + * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S + * server to use + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @param {Function} [options.verifyClient] A hook to reject connections + * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket` + * class to use. It must be the `WebSocket` class or class that extends it + * @param {Function} [callback] A listener for the `listening` event + */ + constructor(options, callback) { + super(); + + options = { + allowSynchronousEvents: true, + autoPong: true, + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: false, + handleProtocols: null, + clientTracking: true, + verifyClient: null, + noServer: false, + backlog: null, // use default (511 as implemented in net.js) + server: null, + host: null, + path: null, + port: null, + WebSocket, + ...options + }; + + if ( + (options.port == null && !options.server && !options.noServer) || + (options.port != null && (options.server || options.noServer)) || + (options.server && options.noServer) + ) { + throw new TypeError( + 'One and only one of the "port", "server", or "noServer" options ' + + 'must be specified' + ); + } + + if (options.port != null) { + this._server = http.createServer((req, res) => { + const body = http.STATUS_CODES[426]; + + res.writeHead(426, { + 'Content-Length': body.length, + 'Content-Type': 'text/plain' + }); + res.end(body); + }); + this._server.listen( + options.port, + options.host, + options.backlog, + callback + ); + } else if (options.server) { + this._server = options.server; + } + + if (this._server) { + const emitConnection = this.emit.bind(this, 'connection'); + + this._removeListeners = addListeners(this._server, { + listening: this.emit.bind(this, 'listening'), + error: this.emit.bind(this, 'error'), + upgrade: (req, socket, head) => { + this.handleUpgrade(req, socket, head, emitConnection); + } + }); + } + + if (options.perMessageDeflate === true) options.perMessageDeflate = {}; + if (options.clientTracking) { + this.clients = new Set(); + this._shouldEmitClose = false; + } + + this.options = options; + this._state = RUNNING; + } + + /** + * Returns the bound address, the address family name, and port of the server + * as reported by the operating system if listening on an IP socket. + * If the server is listening on a pipe or UNIX domain socket, the name is + * returned as a string. + * + * @return {(Object|String|null)} The address of the server + * @public + */ + address() { + if (this.options.noServer) { + throw new Error('The server is operating in "noServer" mode'); + } + + if (!this._server) return null; + return this._server.address(); + } + + /** + * Stop the server from accepting new connections and emit the `'close'` event + * when all existing connections are closed. + * + * @param {Function} [cb] A one-time listener for the `'close'` event + * @public + */ + close(cb) { + if (this._state === CLOSED) { + if (cb) { + this.once('close', () => { + cb(new Error('The server is not running')); + }); + } + + process.nextTick(emitClose, this); + return; + } + + if (cb) this.once('close', cb); + + if (this._state === CLOSING) return; + this._state = CLOSING; + + if (this.options.noServer || this.options.server) { + if (this._server) { + this._removeListeners(); + this._removeListeners = this._server = null; + } + + if (this.clients) { + if (!this.clients.size) { + process.nextTick(emitClose, this); + } else { + this._shouldEmitClose = true; + } + } else { + process.nextTick(emitClose, this); + } + } else { + const server = this._server; + + this._removeListeners(); + this._removeListeners = this._server = null; + + // + // The HTTP/S server was created internally. Close it, and rely on its + // `'close'` event. + // + server.close(() => { + emitClose(this); + }); + } + } + + /** + * See if a given request should be handled by this server instance. + * + * @param {http.IncomingMessage} req Request object to inspect + * @return {Boolean} `true` if the request is valid, else `false` + * @public + */ + shouldHandle(req) { + if (this.options.path) { + const index = req.url.indexOf('?'); + const pathname = index !== -1 ? req.url.slice(0, index) : req.url; + + if (pathname !== this.options.path) return false; + } + + return true; + } + + /** + * Handle a HTTP Upgrade request. + * + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @public + */ + handleUpgrade(req, socket, head, cb) { + socket.on('error', socketOnError); + + const key = req.headers['sec-websocket-key']; + const upgrade = req.headers.upgrade; + const version = +req.headers['sec-websocket-version']; + + if (req.method !== 'GET') { + const message = 'Invalid HTTP method'; + abortHandshakeOrEmitwsClientError(this, req, socket, 405, message); + return; + } + + if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') { + const message = 'Invalid Upgrade header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + + if (key === undefined || !keyRegex.test(key)) { + const message = 'Missing or invalid Sec-WebSocket-Key header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + + if (version !== 13 && version !== 8) { + const message = 'Missing or invalid Sec-WebSocket-Version header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, { + 'Sec-WebSocket-Version': '13, 8' + }); + return; + } + + if (!this.shouldHandle(req)) { + abortHandshake(socket, 400); + return; + } + + const secWebSocketProtocol = req.headers['sec-websocket-protocol']; + let protocols = new Set(); + + if (secWebSocketProtocol !== undefined) { + try { + protocols = subprotocol.parse(secWebSocketProtocol); + } catch (err) { + const message = 'Invalid Sec-WebSocket-Protocol header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + } + + const secWebSocketExtensions = req.headers['sec-websocket-extensions']; + const extensions = {}; + + if ( + this.options.perMessageDeflate && + secWebSocketExtensions !== undefined + ) { + const perMessageDeflate = new PerMessageDeflate( + this.options.perMessageDeflate, + true, + this.options.maxPayload + ); + + try { + const offers = extension.parse(secWebSocketExtensions); + + if (offers[PerMessageDeflate.extensionName]) { + perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]); + extensions[PerMessageDeflate.extensionName] = perMessageDeflate; + } + } catch (err) { + const message = + 'Invalid or unacceptable Sec-WebSocket-Extensions header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + } + + // + // Optionally call external client verification handler. + // + if (this.options.verifyClient) { + const info = { + origin: + req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`], + secure: !!(req.socket.authorized || req.socket.encrypted), + req + }; + + if (this.options.verifyClient.length === 2) { + this.options.verifyClient(info, (verified, code, message, headers) => { + if (!verified) { + return abortHandshake(socket, code || 401, message, headers); + } + + this.completeUpgrade( + extensions, + key, + protocols, + req, + socket, + head, + cb + ); + }); + return; + } + + if (!this.options.verifyClient(info)) return abortHandshake(socket, 401); + } + + this.completeUpgrade(extensions, key, protocols, req, socket, head, cb); + } + + /** + * Upgrade the connection to WebSocket. + * + * @param {Object} extensions The accepted extensions + * @param {String} key The value of the `Sec-WebSocket-Key` header + * @param {Set} protocols The subprotocols + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @throws {Error} If called more than once with the same socket + * @private + */ + completeUpgrade(extensions, key, protocols, req, socket, head, cb) { + // + // Destroy the socket if the client has already sent a FIN packet. + // + if (!socket.readable || !socket.writable) return socket.destroy(); + + if (socket[kWebSocket]) { + throw new Error( + 'server.handleUpgrade() was called more than once with the same ' + + 'socket, possibly due to a misconfiguration' + ); + } + + if (this._state > RUNNING) return abortHandshake(socket, 503); + + const digest = createHash('sha1') + .update(key + GUID) + .digest('base64'); + + const headers = [ + 'HTTP/1.1 101 Switching Protocols', + 'Upgrade: websocket', + 'Connection: Upgrade', + `Sec-WebSocket-Accept: ${digest}` + ]; + + const ws = new this.options.WebSocket(null, undefined, this.options); + + if (protocols.size) { + // + // Optionally call external protocol selection handler. + // + const protocol = this.options.handleProtocols + ? this.options.handleProtocols(protocols, req) + : protocols.values().next().value; + + if (protocol) { + headers.push(`Sec-WebSocket-Protocol: ${protocol}`); + ws._protocol = protocol; + } + } + + if (extensions[PerMessageDeflate.extensionName]) { + const params = extensions[PerMessageDeflate.extensionName].params; + const value = extension.format({ + [PerMessageDeflate.extensionName]: [params] + }); + headers.push(`Sec-WebSocket-Extensions: ${value}`); + ws._extensions = extensions; + } + + // + // Allow external modification/inspection of handshake headers. + // + this.emit('headers', headers, req); + + socket.write(headers.concat('\r\n').join('\r\n')); + socket.removeListener('error', socketOnError); + + ws.setSocket(socket, head, { + allowSynchronousEvents: this.options.allowSynchronousEvents, + maxPayload: this.options.maxPayload, + skipUTF8Validation: this.options.skipUTF8Validation + }); + + if (this.clients) { + this.clients.add(ws); + ws.on('close', () => { + this.clients.delete(ws); + + if (this._shouldEmitClose && !this.clients.size) { + process.nextTick(emitClose, this); + } + }); + } + + cb(ws, req); + } +} + +module.exports = WebSocketServer; + +/** + * Add event listeners on an `EventEmitter` using a map of + * pairs. + * + * @param {EventEmitter} server The event emitter + * @param {Object.} map The listeners to add + * @return {Function} A function that will remove the added listeners when + * called + * @private + */ +function addListeners(server, map) { + for (const event of Object.keys(map)) server.on(event, map[event]); + + return function removeListeners() { + for (const event of Object.keys(map)) { + server.removeListener(event, map[event]); + } + }; +} + +/** + * Emit a `'close'` event on an `EventEmitter`. + * + * @param {EventEmitter} server The event emitter + * @private + */ +function emitClose(server) { + server._state = CLOSED; + server.emit('close'); +} + +/** + * Handle socket errors. + * + * @private + */ +function socketOnError() { + this.destroy(); +} + +/** + * Close the connection when preconditions are not fulfilled. + * + * @param {Duplex} socket The socket of the upgrade request + * @param {Number} code The HTTP response status code + * @param {String} [message] The HTTP response body + * @param {Object} [headers] Additional HTTP response headers + * @private + */ +function abortHandshake(socket, code, message, headers) { + // + // The socket is writable unless the user destroyed or ended it before calling + // `server.handleUpgrade()` or in the `verifyClient` function, which is a user + // error. Handling this does not make much sense as the worst that can happen + // is that some of the data written by the user might be discarded due to the + // call to `socket.end()` below, which triggers an `'error'` event that in + // turn causes the socket to be destroyed. + // + message = message || http.STATUS_CODES[code]; + headers = { + Connection: 'close', + 'Content-Type': 'text/html', + 'Content-Length': Buffer.byteLength(message), + ...headers + }; + + socket.once('finish', socket.destroy); + + socket.end( + `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r\n` + + Object.keys(headers) + .map((h) => `${h}: ${headers[h]}`) + .join('\r\n') + + '\r\n\r\n' + + message + ); +} + +/** + * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least + * one listener for it, otherwise call `abortHandshake()`. + * + * @param {WebSocketServer} server The WebSocket server + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The socket of the upgrade request + * @param {Number} code The HTTP response status code + * @param {String} message The HTTP response body + * @param {Object} [headers] The HTTP response headers + * @private + */ +function abortHandshakeOrEmitwsClientError( + server, + req, + socket, + code, + message, + headers +) { + if (server.listenerCount('wsClientError')) { + const err = new Error(message); + Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError); + + server.emit('wsClientError', err, socket, req); + } else { + abortHandshake(socket, code, message, headers); + } +} diff --git a/node_modules/ws/lib/websocket.js b/node_modules/ws/lib/websocket.js new file mode 100644 index 00000000..ad8764a0 --- /dev/null +++ b/node_modules/ws/lib/websocket.js @@ -0,0 +1,1388 @@ +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex|Readable$", "caughtErrors": "none" }] */ + +'use strict'; + +const EventEmitter = require('events'); +const https = require('https'); +const http = require('http'); +const net = require('net'); +const tls = require('tls'); +const { randomBytes, createHash } = require('crypto'); +const { Duplex, Readable } = require('stream'); +const { URL } = require('url'); + +const PerMessageDeflate = require('./permessage-deflate'); +const Receiver = require('./receiver'); +const Sender = require('./sender'); +const { isBlob } = require('./validation'); + +const { + BINARY_TYPES, + EMPTY_BUFFER, + GUID, + kForOnEventAttribute, + kListener, + kStatusCode, + kWebSocket, + NOOP +} = require('./constants'); +const { + EventTarget: { addEventListener, removeEventListener } +} = require('./event-target'); +const { format, parse } = require('./extension'); +const { toBuffer } = require('./buffer-util'); + +const closeTimeout = 30 * 1000; +const kAborted = Symbol('kAborted'); +const protocolVersions = [8, 13]; +const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED']; +const subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/; + +/** + * Class representing a WebSocket. + * + * @extends EventEmitter + */ +class WebSocket extends EventEmitter { + /** + * Create a new `WebSocket`. + * + * @param {(String|URL)} address The URL to which to connect + * @param {(String|String[])} [protocols] The subprotocols + * @param {Object} [options] Connection options + */ + constructor(address, protocols, options) { + super(); + + this._binaryType = BINARY_TYPES[0]; + this._closeCode = 1006; + this._closeFrameReceived = false; + this._closeFrameSent = false; + this._closeMessage = EMPTY_BUFFER; + this._closeTimer = null; + this._errorEmitted = false; + this._extensions = {}; + this._paused = false; + this._protocol = ''; + this._readyState = WebSocket.CONNECTING; + this._receiver = null; + this._sender = null; + this._socket = null; + + if (address !== null) { + this._bufferedAmount = 0; + this._isServer = false; + this._redirects = 0; + + if (protocols === undefined) { + protocols = []; + } else if (!Array.isArray(protocols)) { + if (typeof protocols === 'object' && protocols !== null) { + options = protocols; + protocols = []; + } else { + protocols = [protocols]; + } + } + + initAsClient(this, address, protocols, options); + } else { + this._autoPong = options.autoPong; + this._isServer = true; + } + } + + /** + * For historical reasons, the custom "nodebuffer" type is used by the default + * instead of "blob". + * + * @type {String} + */ + get binaryType() { + return this._binaryType; + } + + set binaryType(type) { + if (!BINARY_TYPES.includes(type)) return; + + this._binaryType = type; + + // + // Allow to change `binaryType` on the fly. + // + if (this._receiver) this._receiver._binaryType = type; + } + + /** + * @type {Number} + */ + get bufferedAmount() { + if (!this._socket) return this._bufferedAmount; + + return this._socket._writableState.length + this._sender._bufferedBytes; + } + + /** + * @type {String} + */ + get extensions() { + return Object.keys(this._extensions).join(); + } + + /** + * @type {Boolean} + */ + get isPaused() { + return this._paused; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onclose() { + return null; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onerror() { + return null; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onopen() { + return null; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onmessage() { + return null; + } + + /** + * @type {String} + */ + get protocol() { + return this._protocol; + } + + /** + * @type {Number} + */ + get readyState() { + return this._readyState; + } + + /** + * @type {String} + */ + get url() { + return this._url; + } + + /** + * Set up the socket and the internal resources. + * + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Object} options Options object + * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Number} [options.maxPayload=0] The maximum allowed message size + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @private + */ + setSocket(socket, head, options) { + const receiver = new Receiver({ + allowSynchronousEvents: options.allowSynchronousEvents, + binaryType: this.binaryType, + extensions: this._extensions, + isServer: this._isServer, + maxPayload: options.maxPayload, + skipUTF8Validation: options.skipUTF8Validation + }); + + const sender = new Sender(socket, this._extensions, options.generateMask); + + this._receiver = receiver; + this._sender = sender; + this._socket = socket; + + receiver[kWebSocket] = this; + sender[kWebSocket] = this; + socket[kWebSocket] = this; + + receiver.on('conclude', receiverOnConclude); + receiver.on('drain', receiverOnDrain); + receiver.on('error', receiverOnError); + receiver.on('message', receiverOnMessage); + receiver.on('ping', receiverOnPing); + receiver.on('pong', receiverOnPong); + + sender.onerror = senderOnError; + + // + // These methods may not be available if `socket` is just a `Duplex`. + // + if (socket.setTimeout) socket.setTimeout(0); + if (socket.setNoDelay) socket.setNoDelay(); + + if (head.length > 0) socket.unshift(head); + + socket.on('close', socketOnClose); + socket.on('data', socketOnData); + socket.on('end', socketOnEnd); + socket.on('error', socketOnError); + + this._readyState = WebSocket.OPEN; + this.emit('open'); + } + + /** + * Emit the `'close'` event. + * + * @private + */ + emitClose() { + if (!this._socket) { + this._readyState = WebSocket.CLOSED; + this.emit('close', this._closeCode, this._closeMessage); + return; + } + + if (this._extensions[PerMessageDeflate.extensionName]) { + this._extensions[PerMessageDeflate.extensionName].cleanup(); + } + + this._receiver.removeAllListeners(); + this._readyState = WebSocket.CLOSED; + this.emit('close', this._closeCode, this._closeMessage); + } + + /** + * Start a closing handshake. + * + * +----------+ +-----------+ +----------+ + * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - + * | +----------+ +-----------+ +----------+ | + * +----------+ +-----------+ | + * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING + * +----------+ +-----------+ | + * | | | +---+ | + * +------------------------+-->|fin| - - - - + * | +---+ | +---+ + * - - - - -|fin|<---------------------+ + * +---+ + * + * @param {Number} [code] Status code explaining why the connection is closing + * @param {(String|Buffer)} [data] The reason why the connection is + * closing + * @public + */ + close(code, data) { + if (this.readyState === WebSocket.CLOSED) return; + if (this.readyState === WebSocket.CONNECTING) { + const msg = 'WebSocket was closed before the connection was established'; + abortHandshake(this, this._req, msg); + return; + } + + if (this.readyState === WebSocket.CLOSING) { + if ( + this._closeFrameSent && + (this._closeFrameReceived || this._receiver._writableState.errorEmitted) + ) { + this._socket.end(); + } + + return; + } + + this._readyState = WebSocket.CLOSING; + this._sender.close(code, data, !this._isServer, (err) => { + // + // This error is handled by the `'error'` listener on the socket. We only + // want to know if the close frame has been sent here. + // + if (err) return; + + this._closeFrameSent = true; + + if ( + this._closeFrameReceived || + this._receiver._writableState.errorEmitted + ) { + this._socket.end(); + } + }); + + setCloseTimer(this); + } + + /** + * Pause the socket. + * + * @public + */ + pause() { + if ( + this.readyState === WebSocket.CONNECTING || + this.readyState === WebSocket.CLOSED + ) { + return; + } + + this._paused = true; + this._socket.pause(); + } + + /** + * Send a ping. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the ping is sent + * @public + */ + ping(data, mask, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); + } + + if (typeof data === 'function') { + cb = data; + data = mask = undefined; + } else if (typeof mask === 'function') { + cb = mask; + mask = undefined; + } + + if (typeof data === 'number') data = data.toString(); + + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + + if (mask === undefined) mask = !this._isServer; + this._sender.ping(data || EMPTY_BUFFER, mask, cb); + } + + /** + * Send a pong. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the pong is sent + * @public + */ + pong(data, mask, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); + } + + if (typeof data === 'function') { + cb = data; + data = mask = undefined; + } else if (typeof mask === 'function') { + cb = mask; + mask = undefined; + } + + if (typeof data === 'number') data = data.toString(); + + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + + if (mask === undefined) mask = !this._isServer; + this._sender.pong(data || EMPTY_BUFFER, mask, cb); + } + + /** + * Resume the socket. + * + * @public + */ + resume() { + if ( + this.readyState === WebSocket.CONNECTING || + this.readyState === WebSocket.CLOSED + ) { + return; + } + + this._paused = false; + if (!this._receiver._writableState.needDrain) this._socket.resume(); + } + + /** + * Send a data message. + * + * @param {*} data The message to send + * @param {Object} [options] Options object + * @param {Boolean} [options.binary] Specifies whether `data` is binary or + * text + * @param {Boolean} [options.compress] Specifies whether or not to compress + * `data` + * @param {Boolean} [options.fin=true] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when data is written out + * @public + */ + send(data, options, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); + } + + if (typeof options === 'function') { + cb = options; + options = {}; + } + + if (typeof data === 'number') data = data.toString(); + + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + + const opts = { + binary: typeof data !== 'string', + mask: !this._isServer, + compress: true, + fin: true, + ...options + }; + + if (!this._extensions[PerMessageDeflate.extensionName]) { + opts.compress = false; + } + + this._sender.send(data || EMPTY_BUFFER, opts, cb); + } + + /** + * Forcibly close the connection. + * + * @public + */ + terminate() { + if (this.readyState === WebSocket.CLOSED) return; + if (this.readyState === WebSocket.CONNECTING) { + const msg = 'WebSocket was closed before the connection was established'; + abortHandshake(this, this._req, msg); + return; + } + + if (this._socket) { + this._readyState = WebSocket.CLOSING; + this._socket.destroy(); + } + } +} + +/** + * @constant {Number} CONNECTING + * @memberof WebSocket + */ +Object.defineProperty(WebSocket, 'CONNECTING', { + enumerable: true, + value: readyStates.indexOf('CONNECTING') +}); + +/** + * @constant {Number} CONNECTING + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket.prototype, 'CONNECTING', { + enumerable: true, + value: readyStates.indexOf('CONNECTING') +}); + +/** + * @constant {Number} OPEN + * @memberof WebSocket + */ +Object.defineProperty(WebSocket, 'OPEN', { + enumerable: true, + value: readyStates.indexOf('OPEN') +}); + +/** + * @constant {Number} OPEN + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket.prototype, 'OPEN', { + enumerable: true, + value: readyStates.indexOf('OPEN') +}); + +/** + * @constant {Number} CLOSING + * @memberof WebSocket + */ +Object.defineProperty(WebSocket, 'CLOSING', { + enumerable: true, + value: readyStates.indexOf('CLOSING') +}); + +/** + * @constant {Number} CLOSING + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket.prototype, 'CLOSING', { + enumerable: true, + value: readyStates.indexOf('CLOSING') +}); + +/** + * @constant {Number} CLOSED + * @memberof WebSocket + */ +Object.defineProperty(WebSocket, 'CLOSED', { + enumerable: true, + value: readyStates.indexOf('CLOSED') +}); + +/** + * @constant {Number} CLOSED + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket.prototype, 'CLOSED', { + enumerable: true, + value: readyStates.indexOf('CLOSED') +}); + +[ + 'binaryType', + 'bufferedAmount', + 'extensions', + 'isPaused', + 'protocol', + 'readyState', + 'url' +].forEach((property) => { + Object.defineProperty(WebSocket.prototype, property, { enumerable: true }); +}); + +// +// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes. +// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface +// +['open', 'error', 'close', 'message'].forEach((method) => { + Object.defineProperty(WebSocket.prototype, `on${method}`, { + enumerable: true, + get() { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) return listener[kListener]; + } + + return null; + }, + set(handler) { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) { + this.removeListener(method, listener); + break; + } + } + + if (typeof handler !== 'function') return; + + this.addEventListener(method, handler, { + [kForOnEventAttribute]: true + }); + } + }); +}); + +WebSocket.prototype.addEventListener = addEventListener; +WebSocket.prototype.removeEventListener = removeEventListener; + +module.exports = WebSocket; + +/** + * Initialize a WebSocket client. + * + * @param {WebSocket} websocket The client to initialize + * @param {(String|URL)} address The URL to which to connect + * @param {Array} protocols The subprotocols + * @param {Object} [options] Connection options + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any + * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple + * times in the same tick + * @param {Boolean} [options.autoPong=true] Specifies whether or not to + * automatically send a pong in response to a ping + * @param {Function} [options.finishRequest] A function which can be used to + * customize the headers of each http request before it is sent + * @param {Boolean} [options.followRedirects=false] Whether or not to follow + * redirects + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the + * handshake request + * @param {Number} [options.maxPayload=104857600] The maximum allowed message + * size + * @param {Number} [options.maxRedirects=10] The maximum number of redirects + * allowed + * @param {String} [options.origin] Value of the `Origin` or + * `Sec-WebSocket-Origin` header + * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable + * permessage-deflate + * @param {Number} [options.protocolVersion=13] Value of the + * `Sec-WebSocket-Version` header + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @private + */ +function initAsClient(websocket, address, protocols, options) { + const opts = { + allowSynchronousEvents: true, + autoPong: true, + protocolVersion: protocolVersions[1], + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: true, + followRedirects: false, + maxRedirects: 10, + ...options, + socketPath: undefined, + hostname: undefined, + protocol: undefined, + timeout: undefined, + method: 'GET', + host: undefined, + path: undefined, + port: undefined + }; + + websocket._autoPong = opts.autoPong; + + if (!protocolVersions.includes(opts.protocolVersion)) { + throw new RangeError( + `Unsupported protocol version: ${opts.protocolVersion} ` + + `(supported versions: ${protocolVersions.join(', ')})` + ); + } + + let parsedUrl; + + if (address instanceof URL) { + parsedUrl = address; + } else { + try { + parsedUrl = new URL(address); + } catch (e) { + throw new SyntaxError(`Invalid URL: ${address}`); + } + } + + if (parsedUrl.protocol === 'http:') { + parsedUrl.protocol = 'ws:'; + } else if (parsedUrl.protocol === 'https:') { + parsedUrl.protocol = 'wss:'; + } + + websocket._url = parsedUrl.href; + + const isSecure = parsedUrl.protocol === 'wss:'; + const isIpcUrl = parsedUrl.protocol === 'ws+unix:'; + let invalidUrlMessage; + + if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) { + invalidUrlMessage = + 'The URL\'s protocol must be one of "ws:", "wss:", ' + + '"http:", "https:", or "ws+unix:"'; + } else if (isIpcUrl && !parsedUrl.pathname) { + invalidUrlMessage = "The URL's pathname is empty"; + } else if (parsedUrl.hash) { + invalidUrlMessage = 'The URL contains a fragment identifier'; + } + + if (invalidUrlMessage) { + const err = new SyntaxError(invalidUrlMessage); + + if (websocket._redirects === 0) { + throw err; + } else { + emitErrorAndClose(websocket, err); + return; + } + } + + const defaultPort = isSecure ? 443 : 80; + const key = randomBytes(16).toString('base64'); + const request = isSecure ? https.request : http.request; + const protocolSet = new Set(); + let perMessageDeflate; + + opts.createConnection = + opts.createConnection || (isSecure ? tlsConnect : netConnect); + opts.defaultPort = opts.defaultPort || defaultPort; + opts.port = parsedUrl.port || defaultPort; + opts.host = parsedUrl.hostname.startsWith('[') + ? parsedUrl.hostname.slice(1, -1) + : parsedUrl.hostname; + opts.headers = { + ...opts.headers, + 'Sec-WebSocket-Version': opts.protocolVersion, + 'Sec-WebSocket-Key': key, + Connection: 'Upgrade', + Upgrade: 'websocket' + }; + opts.path = parsedUrl.pathname + parsedUrl.search; + opts.timeout = opts.handshakeTimeout; + + if (opts.perMessageDeflate) { + perMessageDeflate = new PerMessageDeflate( + opts.perMessageDeflate !== true ? opts.perMessageDeflate : {}, + false, + opts.maxPayload + ); + opts.headers['Sec-WebSocket-Extensions'] = format({ + [PerMessageDeflate.extensionName]: perMessageDeflate.offer() + }); + } + if (protocols.length) { + for (const protocol of protocols) { + if ( + typeof protocol !== 'string' || + !subprotocolRegex.test(protocol) || + protocolSet.has(protocol) + ) { + throw new SyntaxError( + 'An invalid or duplicated subprotocol was specified' + ); + } + + protocolSet.add(protocol); + } + + opts.headers['Sec-WebSocket-Protocol'] = protocols.join(','); + } + if (opts.origin) { + if (opts.protocolVersion < 13) { + opts.headers['Sec-WebSocket-Origin'] = opts.origin; + } else { + opts.headers.Origin = opts.origin; + } + } + if (parsedUrl.username || parsedUrl.password) { + opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; + } + + if (isIpcUrl) { + const parts = opts.path.split(':'); + + opts.socketPath = parts[0]; + opts.path = parts[1]; + } + + let req; + + if (opts.followRedirects) { + if (websocket._redirects === 0) { + websocket._originalIpc = isIpcUrl; + websocket._originalSecure = isSecure; + websocket._originalHostOrSocketPath = isIpcUrl + ? opts.socketPath + : parsedUrl.host; + + const headers = options && options.headers; + + // + // Shallow copy the user provided options so that headers can be changed + // without mutating the original object. + // + options = { ...options, headers: {} }; + + if (headers) { + for (const [key, value] of Object.entries(headers)) { + options.headers[key.toLowerCase()] = value; + } + } + } else if (websocket.listenerCount('redirect') === 0) { + const isSameHost = isIpcUrl + ? websocket._originalIpc + ? opts.socketPath === websocket._originalHostOrSocketPath + : false + : websocket._originalIpc + ? false + : parsedUrl.host === websocket._originalHostOrSocketPath; + + if (!isSameHost || (websocket._originalSecure && !isSecure)) { + // + // Match curl 7.77.0 behavior and drop the following headers. These + // headers are also dropped when following a redirect to a subdomain. + // + delete opts.headers.authorization; + delete opts.headers.cookie; + + if (!isSameHost) delete opts.headers.host; + + opts.auth = undefined; + } + } + + // + // Match curl 7.77.0 behavior and make the first `Authorization` header win. + // If the `Authorization` header is set, then there is nothing to do as it + // will take precedence. + // + if (opts.auth && !options.headers.authorization) { + options.headers.authorization = + 'Basic ' + Buffer.from(opts.auth).toString('base64'); + } + + req = websocket._req = request(opts); + + if (websocket._redirects) { + // + // Unlike what is done for the `'upgrade'` event, no early exit is + // triggered here if the user calls `websocket.close()` or + // `websocket.terminate()` from a listener of the `'redirect'` event. This + // is because the user can also call `request.destroy()` with an error + // before calling `websocket.close()` or `websocket.terminate()` and this + // would result in an error being emitted on the `request` object with no + // `'error'` event listeners attached. + // + websocket.emit('redirect', websocket.url, req); + } + } else { + req = websocket._req = request(opts); + } + + if (opts.timeout) { + req.on('timeout', () => { + abortHandshake(websocket, req, 'Opening handshake has timed out'); + }); + } + + req.on('error', (err) => { + if (req === null || req[kAborted]) return; + + req = websocket._req = null; + emitErrorAndClose(websocket, err); + }); + + req.on('response', (res) => { + const location = res.headers.location; + const statusCode = res.statusCode; + + if ( + location && + opts.followRedirects && + statusCode >= 300 && + statusCode < 400 + ) { + if (++websocket._redirects > opts.maxRedirects) { + abortHandshake(websocket, req, 'Maximum redirects exceeded'); + return; + } + + req.abort(); + + let addr; + + try { + addr = new URL(location, address); + } catch (e) { + const err = new SyntaxError(`Invalid URL: ${location}`); + emitErrorAndClose(websocket, err); + return; + } + + initAsClient(websocket, addr, protocols, options); + } else if (!websocket.emit('unexpected-response', req, res)) { + abortHandshake( + websocket, + req, + `Unexpected server response: ${res.statusCode}` + ); + } + }); + + req.on('upgrade', (res, socket, head) => { + websocket.emit('upgrade', res); + + // + // The user may have closed the connection from a listener of the + // `'upgrade'` event. + // + if (websocket.readyState !== WebSocket.CONNECTING) return; + + req = websocket._req = null; + + const upgrade = res.headers.upgrade; + + if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') { + abortHandshake(websocket, socket, 'Invalid Upgrade header'); + return; + } + + const digest = createHash('sha1') + .update(key + GUID) + .digest('base64'); + + if (res.headers['sec-websocket-accept'] !== digest) { + abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header'); + return; + } + + const serverProt = res.headers['sec-websocket-protocol']; + let protError; + + if (serverProt !== undefined) { + if (!protocolSet.size) { + protError = 'Server sent a subprotocol but none was requested'; + } else if (!protocolSet.has(serverProt)) { + protError = 'Server sent an invalid subprotocol'; + } + } else if (protocolSet.size) { + protError = 'Server sent no subprotocol'; + } + + if (protError) { + abortHandshake(websocket, socket, protError); + return; + } + + if (serverProt) websocket._protocol = serverProt; + + const secWebSocketExtensions = res.headers['sec-websocket-extensions']; + + if (secWebSocketExtensions !== undefined) { + if (!perMessageDeflate) { + const message = + 'Server sent a Sec-WebSocket-Extensions header but no extension ' + + 'was requested'; + abortHandshake(websocket, socket, message); + return; + } + + let extensions; + + try { + extensions = parse(secWebSocketExtensions); + } catch (err) { + const message = 'Invalid Sec-WebSocket-Extensions header'; + abortHandshake(websocket, socket, message); + return; + } + + const extensionNames = Object.keys(extensions); + + if ( + extensionNames.length !== 1 || + extensionNames[0] !== PerMessageDeflate.extensionName + ) { + const message = 'Server indicated an extension that was not requested'; + abortHandshake(websocket, socket, message); + return; + } + + try { + perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]); + } catch (err) { + const message = 'Invalid Sec-WebSocket-Extensions header'; + abortHandshake(websocket, socket, message); + return; + } + + websocket._extensions[PerMessageDeflate.extensionName] = + perMessageDeflate; + } + + websocket.setSocket(socket, head, { + allowSynchronousEvents: opts.allowSynchronousEvents, + generateMask: opts.generateMask, + maxPayload: opts.maxPayload, + skipUTF8Validation: opts.skipUTF8Validation + }); + }); + + if (opts.finishRequest) { + opts.finishRequest(req, websocket); + } else { + req.end(); + } +} + +/** + * Emit the `'error'` and `'close'` events. + * + * @param {WebSocket} websocket The WebSocket instance + * @param {Error} The error to emit + * @private + */ +function emitErrorAndClose(websocket, err) { + websocket._readyState = WebSocket.CLOSING; + // + // The following assignment is practically useless and is done only for + // consistency. + // + websocket._errorEmitted = true; + websocket.emit('error', err); + websocket.emitClose(); +} + +/** + * Create a `net.Socket` and initiate a connection. + * + * @param {Object} options Connection options + * @return {net.Socket} The newly created socket used to start the connection + * @private + */ +function netConnect(options) { + options.path = options.socketPath; + return net.connect(options); +} + +/** + * Create a `tls.TLSSocket` and initiate a connection. + * + * @param {Object} options Connection options + * @return {tls.TLSSocket} The newly created socket used to start the connection + * @private + */ +function tlsConnect(options) { + options.path = undefined; + + if (!options.servername && options.servername !== '') { + options.servername = net.isIP(options.host) ? '' : options.host; + } + + return tls.connect(options); +} + +/** + * Abort the handshake and emit an error. + * + * @param {WebSocket} websocket The WebSocket instance + * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to + * abort or the socket to destroy + * @param {String} message The error message + * @private + */ +function abortHandshake(websocket, stream, message) { + websocket._readyState = WebSocket.CLOSING; + + const err = new Error(message); + Error.captureStackTrace(err, abortHandshake); + + if (stream.setHeader) { + stream[kAborted] = true; + stream.abort(); + + if (stream.socket && !stream.socket.destroyed) { + // + // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if + // called after the request completed. See + // https://github.com/websockets/ws/issues/1869. + // + stream.socket.destroy(); + } + + process.nextTick(emitErrorAndClose, websocket, err); + } else { + stream.destroy(err); + stream.once('error', websocket.emit.bind(websocket, 'error')); + stream.once('close', websocket.emitClose.bind(websocket)); + } +} + +/** + * Handle cases where the `ping()`, `pong()`, or `send()` methods are called + * when the `readyState` attribute is `CLOSING` or `CLOSED`. + * + * @param {WebSocket} websocket The WebSocket instance + * @param {*} [data] The data to send + * @param {Function} [cb] Callback + * @private + */ +function sendAfterClose(websocket, data, cb) { + if (data) { + const length = isBlob(data) ? data.size : toBuffer(data).length; + + // + // The `_bufferedAmount` property is used only when the peer is a client and + // the opening handshake fails. Under these circumstances, in fact, the + // `setSocket()` method is not called, so the `_socket` and `_sender` + // properties are set to `null`. + // + if (websocket._socket) websocket._sender._bufferedBytes += length; + else websocket._bufferedAmount += length; + } + + if (cb) { + const err = new Error( + `WebSocket is not open: readyState ${websocket.readyState} ` + + `(${readyStates[websocket.readyState]})` + ); + process.nextTick(cb, err); + } +} + +/** + * The listener of the `Receiver` `'conclude'` event. + * + * @param {Number} code The status code + * @param {Buffer} reason The reason for closing + * @private + */ +function receiverOnConclude(code, reason) { + const websocket = this[kWebSocket]; + + websocket._closeFrameReceived = true; + websocket._closeMessage = reason; + websocket._closeCode = code; + + if (websocket._socket[kWebSocket] === undefined) return; + + websocket._socket.removeListener('data', socketOnData); + process.nextTick(resume, websocket._socket); + + if (code === 1005) websocket.close(); + else websocket.close(code, reason); +} + +/** + * The listener of the `Receiver` `'drain'` event. + * + * @private + */ +function receiverOnDrain() { + const websocket = this[kWebSocket]; + + if (!websocket.isPaused) websocket._socket.resume(); +} + +/** + * The listener of the `Receiver` `'error'` event. + * + * @param {(RangeError|Error)} err The emitted error + * @private + */ +function receiverOnError(err) { + const websocket = this[kWebSocket]; + + if (websocket._socket[kWebSocket] !== undefined) { + websocket._socket.removeListener('data', socketOnData); + + // + // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See + // https://github.com/websockets/ws/issues/1940. + // + process.nextTick(resume, websocket._socket); + + websocket.close(err[kStatusCode]); + } + + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit('error', err); + } +} + +/** + * The listener of the `Receiver` `'finish'` event. + * + * @private + */ +function receiverOnFinish() { + this[kWebSocket].emitClose(); +} + +/** + * The listener of the `Receiver` `'message'` event. + * + * @param {Buffer|ArrayBuffer|Buffer[])} data The message + * @param {Boolean} isBinary Specifies whether the message is binary or not + * @private + */ +function receiverOnMessage(data, isBinary) { + this[kWebSocket].emit('message', data, isBinary); +} + +/** + * The listener of the `Receiver` `'ping'` event. + * + * @param {Buffer} data The data included in the ping frame + * @private + */ +function receiverOnPing(data) { + const websocket = this[kWebSocket]; + + if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP); + websocket.emit('ping', data); +} + +/** + * The listener of the `Receiver` `'pong'` event. + * + * @param {Buffer} data The data included in the pong frame + * @private + */ +function receiverOnPong(data) { + this[kWebSocket].emit('pong', data); +} + +/** + * Resume a readable stream + * + * @param {Readable} stream The readable stream + * @private + */ +function resume(stream) { + stream.resume(); +} + +/** + * The `Sender` error event handler. + * + * @param {Error} The error + * @private + */ +function senderOnError(err) { + const websocket = this[kWebSocket]; + + if (websocket.readyState === WebSocket.CLOSED) return; + if (websocket.readyState === WebSocket.OPEN) { + websocket._readyState = WebSocket.CLOSING; + setCloseTimer(websocket); + } + + // + // `socket.end()` is used instead of `socket.destroy()` to allow the other + // peer to finish sending queued data. There is no need to set a timer here + // because `CLOSING` means that it is already set or not needed. + // + this._socket.end(); + + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit('error', err); + } +} + +/** + * Set a timer to destroy the underlying raw socket of a WebSocket. + * + * @param {WebSocket} websocket The WebSocket instance + * @private + */ +function setCloseTimer(websocket) { + websocket._closeTimer = setTimeout( + websocket._socket.destroy.bind(websocket._socket), + closeTimeout + ); +} + +/** + * The listener of the socket `'close'` event. + * + * @private + */ +function socketOnClose() { + const websocket = this[kWebSocket]; + + this.removeListener('close', socketOnClose); + this.removeListener('data', socketOnData); + this.removeListener('end', socketOnEnd); + + websocket._readyState = WebSocket.CLOSING; + + let chunk; + + // + // The close frame might not have been received or the `'end'` event emitted, + // for example, if the socket was destroyed due to an error. Ensure that the + // `receiver` stream is closed after writing any remaining buffered data to + // it. If the readable side of the socket is in flowing mode then there is no + // buffered data as everything has been already written and `readable.read()` + // will return `null`. If instead, the socket is paused, any possible buffered + // data will be read as a single chunk. + // + if ( + !this._readableState.endEmitted && + !websocket._closeFrameReceived && + !websocket._receiver._writableState.errorEmitted && + (chunk = websocket._socket.read()) !== null + ) { + websocket._receiver.write(chunk); + } + + websocket._receiver.end(); + + this[kWebSocket] = undefined; + + clearTimeout(websocket._closeTimer); + + if ( + websocket._receiver._writableState.finished || + websocket._receiver._writableState.errorEmitted + ) { + websocket.emitClose(); + } else { + websocket._receiver.on('error', receiverOnFinish); + websocket._receiver.on('finish', receiverOnFinish); + } +} + +/** + * The listener of the socket `'data'` event. + * + * @param {Buffer} chunk A chunk of data + * @private + */ +function socketOnData(chunk) { + if (!this[kWebSocket]._receiver.write(chunk)) { + this.pause(); + } +} + +/** + * The listener of the socket `'end'` event. + * + * @private + */ +function socketOnEnd() { + const websocket = this[kWebSocket]; + + websocket._readyState = WebSocket.CLOSING; + websocket._receiver.end(); + this.end(); +} + +/** + * The listener of the socket `'error'` event. + * + * @private + */ +function socketOnError() { + const websocket = this[kWebSocket]; + + this.removeListener('error', socketOnError); + this.on('error', NOOP); + + if (websocket) { + websocket._readyState = WebSocket.CLOSING; + this.destroy(); + } +} diff --git a/node_modules/ws/package.json b/node_modules/ws/package.json new file mode 100644 index 00000000..2004b1c2 --- /dev/null +++ b/node_modules/ws/package.json @@ -0,0 +1,69 @@ +{ + "name": "ws", + "version": "8.18.3", + "description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js", + "keywords": [ + "HyBi", + "Push", + "RFC-6455", + "WebSocket", + "WebSockets", + "real-time" + ], + "homepage": "https://github.com/websockets/ws", + "bugs": "https://github.com/websockets/ws/issues", + "repository": { + "type": "git", + "url": "git+https://github.com/websockets/ws.git" + }, + "author": "Einar Otto Stangvik (http://2x.io)", + "license": "MIT", + "main": "index.js", + "exports": { + ".": { + "browser": "./browser.js", + "import": "./wrapper.mjs", + "require": "./index.js" + }, + "./package.json": "./package.json" + }, + "browser": "browser.js", + "engines": { + "node": ">=10.0.0" + }, + "files": [ + "browser.js", + "index.js", + "lib/*.js", + "wrapper.mjs" + ], + "scripts": { + "test": "nyc --reporter=lcov --reporter=text mocha --throw-deprecation test/*.test.js", + "integration": "mocha --throw-deprecation test/*.integration.js", + "lint": "eslint . && prettier --check --ignore-path .gitignore \"**/*.{json,md,yaml,yml}\"" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + }, + "devDependencies": { + "benchmark": "^2.1.4", + "bufferutil": "^4.0.1", + "eslint": "^9.0.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.0.0", + "globals": "^16.0.0", + "mocha": "^8.4.0", + "nyc": "^15.0.0", + "prettier": "^3.0.0", + "utf-8-validate": "^6.0.0" + } +} diff --git a/node_modules/ws/wrapper.mjs b/node_modules/ws/wrapper.mjs new file mode 100644 index 00000000..7245ad15 --- /dev/null +++ b/node_modules/ws/wrapper.mjs @@ -0,0 +1,8 @@ +import createWebSocketStream from './lib/stream.js'; +import Receiver from './lib/receiver.js'; +import Sender from './lib/sender.js'; +import WebSocket from './lib/websocket.js'; +import WebSocketServer from './lib/websocket-server.js'; + +export { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer }; +export default WebSocket; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..cb9e22d3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "dshackle", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "ws": "^8.18.3" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..31fef034 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "ws": "^8.18.3" + } +} diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumChainSpecific.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumChainSpecific.kt index ca906214..1effef8e 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumChainSpecific.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumChainSpecific.kt @@ -70,10 +70,12 @@ object EthereumChainSpecific : AbstractPollChainSpecific() { override fun subscriptionBuilder(headScheduler: Scheduler): (Multistream) -> EgressSubscription { return { ms -> - val pendingTxes: PendingTxesSource = (ms.getAll()) + val ethereumUpstreams = (ms.getAll()) .filter { it is GenericUpstream } .map { it as GenericUpstream } .filter { it.getIngressSubscription() is EthereumIngressSubscription } + + val pendingTxes: PendingTxesSource = ethereumUpstreams .mapNotNull { (it.getIngressSubscription() as EthereumIngressSubscription).getPendingTxes() }.let { @@ -85,7 +87,19 @@ object EthereumChainSpecific : AbstractPollChainSpecific() { AggregatedPendingTxes(it) } } - EthereumEgressSubscription(ms, headScheduler, pendingTxes) + + // Get the first available EthereumWsIngressSubscription for client tracking + val ingressSubscription = ethereumUpstreams + .mapNotNull { it.getIngressSubscription() as? EthereumWsIngressSubscription } + .firstOrNull() + + if (ingressSubscription != null) { + log.debug("[AUTO-UNSUBSCRIBE] EthereumEgressSubscription created with client tracking support") + } else { + log.debug("EthereumEgressSubscription created without client tracking (legacy mode)") + } + + EthereumEgressSubscription(ms, headScheduler, pendingTxes, ingressSubscription) } } @@ -157,7 +171,7 @@ object EthereumChainSpecific : AbstractPollChainSpecific() { val validators = mutableListOf>( ChainIdValidator(upstream, chain), ) - if (options.valdateErigonBug) { + if (options.validateErigonBug) { validators.add(ErigonBuggedValidator(upstream)) } val limitValidator = EthCallLimitValidator(upstream, options, config) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumEgressSubscription.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumEgressSubscription.kt index 775e342c..647b448a 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumEgressSubscription.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/EthereumEgressSubscription.kt @@ -5,6 +5,7 @@ import io.emeraldpay.dshackle.Global import io.emeraldpay.dshackle.upstream.Capability import io.emeraldpay.dshackle.upstream.ChainRequest import io.emeraldpay.dshackle.upstream.EgressSubscription +import io.emeraldpay.dshackle.upstream.IngressSubscription import io.emeraldpay.dshackle.upstream.Multistream import io.emeraldpay.dshackle.upstream.Selector import io.emeraldpay.dshackle.upstream.ethereum.domain.Address @@ -48,8 +49,16 @@ open class EthereumEgressSubscription( val upstream: Multistream, val scheduler: Scheduler, val pendingTxesSource: PendingTxesSource?, + val ingressSubscription: IngressSubscription? = null, ) : EgressSubscription { + // Secondary constructor for backward compatibility with existing tests + constructor( + upstream: Multistream, + scheduler: Scheduler, + pendingTxesSource: PendingTxesSource?, + ) : this(upstream, scheduler, pendingTxesSource, null) + companion object { private val log = LoggerFactory.getLogger(EthereumEgressSubscription::class.java) @@ -81,6 +90,14 @@ open class EthereumEgressSubscription( @Suppress("UNCHECKED_CAST") override fun subscribe(topic: String, params: Any?, matcher: Selector.Matcher): Flux { + // Try to use client-tracked IngressSubscription first (for auto-cleanup support) + if (ingressSubscription != null && topic in ingressSubscription.getAvailableTopics()) { + log.debug("[AUTO-UNSUBSCRIBE] Using client-tracked subscription for topic: {}", topic) + return ingressSubscription.get(topic, params)?.connect(matcher) ?: Flux.empty() + } + + // Fall back to direct connections (legacy mode without auto-cleanup) + log.debug("Using direct connection (no auto-cleanup) for topic: {}", topic) if (topic == METHOD_NEW_HEADS) { return newHeads.connect(matcher) } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumSubscriptionConnect.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumSubscriptionConnect.kt new file mode 100644 index 00000000..bf87bff4 --- /dev/null +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumSubscriptionConnect.kt @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2024 EmeraldPay, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.emeraldpay.dshackle.upstream.ethereum.subscribe + +import io.emeraldpay.dshackle.upstream.ChainRequest +import io.emeraldpay.dshackle.upstream.ethereum.WsSubscriptions +import io.emeraldpay.dshackle.upstream.generic.SubscriptionCleanup +import io.emeraldpay.dshackle.upstream.generic.subscribe.GenericPersistentConnect +import io.emeraldpay.dshackle.upstream.rpcclient.ListParams +import org.slf4j.LoggerFactory +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono +import java.time.Duration + +/** + * Ethereum-specific subscription connection that integrates with client tracking and cleanup + */ +class EthereumSubscriptionConnect( + private val conn: WsSubscriptions, + private val topic: String, + private val params: Any?, + private val cleanup: SubscriptionCleanup, +) : GenericPersistentConnect() { + + companion object { + private val log = LoggerFactory.getLogger(EthereumSubscriptionConnect::class.java) + } + + private var subscriptionId: String? = null + + @Suppress("UNCHECKED_CAST") + override fun createConnection(): Flux { + val ethParams = getParams(params) + val subscribeData = if (ethParams != null) { + conn.subscribe(ChainRequest("eth_subscribe", ListParams(topic, ethParams))) + } else { + conn.subscribe(ChainRequest("eth_subscribe", ListParams(topic))) + } + + return subscribeData.data + .doOnNext { _ -> + // Store subscription ID when first message arrives (ID should be available by then) + if (subscriptionId == null) { + subscriptionId = subscribeData.subId.get() + log.debug("[AUTO-UNSUBSCRIBE] Ethereum subscription ID set for {}:{} -> {}", topic, params, subscriptionId) + } + } + .timeout( + Duration.ofSeconds(85), + Mono.empty().doOnEach { + log.warn("[AUTO-UNSUBSCRIBE] Timeout during Ethereum subscription to $topic after 85 seconds") + }, + ) + .onErrorResume { + log.error("[AUTO-UNSUBSCRIBE] Error during Ethereum subscription to $topic", it) + Mono.empty() + } + .doFinally { + // Trigger cleanup when connection ends + log.debug("[AUTO-UNSUBSCRIBE] Ethereum connection ended for subscription {}:{}", topic, params) + cleanup.cleanupSubscription(topic, params, subscriptionId) + } as Flux + } + + private fun getParams(params: Any?): Any? { + return when (topic) { + "newHeads" -> null // newHeads doesn't require parameters + "logs" -> params // logs uses the filter parameters + "newPendingTransactions" -> null // pending txs doesn't require parameters + else -> params + } + } +} diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumWsIngressSubscription.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumWsIngressSubscription.kt index 9f2a6f5c..ede37439 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumWsIngressSubscription.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumWsIngressSubscription.kt @@ -15,31 +15,153 @@ */ package io.emeraldpay.dshackle.upstream.ethereum.subscribe +import io.emeraldpay.dshackle.upstream.ChainRequest import io.emeraldpay.dshackle.upstream.IngressSubscription import io.emeraldpay.dshackle.upstream.SubscriptionConnect import io.emeraldpay.dshackle.upstream.ethereum.EthereumEgressSubscription import io.emeraldpay.dshackle.upstream.ethereum.EthereumIngressSubscription import io.emeraldpay.dshackle.upstream.ethereum.WsSubscriptions +import io.emeraldpay.dshackle.upstream.generic.DefaultSubscriptionClient +import io.emeraldpay.dshackle.upstream.generic.SubscriptionCleanup +import io.emeraldpay.dshackle.upstream.generic.SubscriptionHolder +import io.emeraldpay.dshackle.upstream.rpcclient.ListParams +import org.slf4j.LoggerFactory +import java.util.concurrent.ConcurrentHashMap class EthereumWsIngressSubscription( - conn: WsSubscriptions, -) : IngressSubscription, EthereumIngressSubscription { + private val conn: WsSubscriptions, +) : IngressSubscription, EthereumIngressSubscription, SubscriptionCleanup { + + companion object { + private val log = LoggerFactory.getLogger(EthereumWsIngressSubscription::class.java) + } private val pendingTxes = WebsocketPendingTxes(conn) + private val holders = ConcurrentHashMap, SubscriptionHolder<*>>() override fun getAvailableTopics(): List { - return listOf(EthereumEgressSubscription.METHOD_PENDING_TXES) + return listOf( + EthereumEgressSubscription.METHOD_PENDING_TXES, + EthereumEgressSubscription.METHOD_NEW_HEADS, + EthereumEgressSubscription.METHOD_LOGS, + ) } @Suppress("UNCHECKED_CAST") override fun get(topic: String, params: Any?): SubscriptionConnect? { - if (topic == EthereumEgressSubscription.METHOD_PENDING_TXES) { - return pendingTxes as SubscriptionConnect + if (topic in getAvailableTopics()) { + val clientId = generateClientId() + return getForClient(topic, params, clientId) } return null } + /** + * Get a subscription for a specific client with tracking + */ + fun getForClient(topic: String, params: Any?, clientId: String): SubscriptionConnect? { + if (topic !in getAvailableTopics()) { + return null + } + + val key = topic to params + + @Suppress("UNCHECKED_CAST") + val holder = holders.computeIfAbsent(key) { + log.debug("Creating new subscription holder for {}:{}", topic, params) + val connection = when (topic) { + EthereumEgressSubscription.METHOD_PENDING_TXES -> pendingTxes + EthereumEgressSubscription.METHOD_NEW_HEADS -> EthereumSubscriptionConnect(conn, "newHeads", params, this) + EthereumEgressSubscription.METHOD_LOGS -> EthereumSubscriptionConnect(conn, "logs", params, this) + else -> throw IllegalArgumentException("Unsupported topic: $topic") + } + SubscriptionHolder( + connection, + topic, + params, + ) + } as SubscriptionHolder + + log.info("[AUTO-UNSUBSCRIBE] Creating new client {} for Ethereum subscription {}:{}", clientId, topic, params) + val client = DefaultSubscriptionClient(clientId) { + releaseSubscription(topic, params, clientId) + } + + return holder.addClient(client) + } + + /** + * Release a client's subscription. Called when a client disconnects. + */ + fun releaseSubscription(topic: String, params: Any?, clientId: String) { + log.info("[AUTO-UNSUBSCRIBE] Releasing Ethereum subscription for client {} on topic {}:{}", clientId, topic, params) + val key = topic to params + holders.computeIfPresent(key) { _, holder -> + if (holder.removeClient(clientId)) { + log.info("[AUTO-UNSUBSCRIBE] Last client removed for Ethereum subscription {}:{}, triggering cleanup", topic, params) + null + } else { + log.info("[AUTO-UNSUBSCRIBE] Client {} removed, but {} clients remain for {}:{}", clientId, holder.getClientCount(), topic, params) + holder + } + } + } + + /** + * Generate a unique client ID + */ + private fun generateClientId(): String { + return "eth-client-${System.currentTimeMillis()}-${Thread.currentThread().id}-${(Math.random() * 10000).toInt()}" + } + + override fun cleanupSubscription(topic: String, params: Any?, subscriptionId: String?) { + log.info("[AUTO-UNSUBSCRIBE] Cleaning up Ethereum subscription {}:{} with ID: {}", topic, params, subscriptionId) + + if (subscriptionId.isNullOrEmpty()) { + log.warn("Cannot cleanup Ethereum subscription {}:{} - no subscription ID", topic, params) + return + } + + val unsubscribeRequest = ChainRequest("eth_unsubscribe", ListParams(subscriptionId)) + log.info("[AUTO-UNSUBSCRIBE] Sending eth_unsubscribe request to upstream for {}:{}", topic, params) + conn.unsubscribe(unsubscribeRequest) + .doOnSuccess { + log.info("[AUTO-UNSUBSCRIBE] Successfully unsubscribed from upstream {}:{}", topic, params) + } + .doOnError { error -> + log.warn("[AUTO-UNSUBSCRIBE] Failed to unsubscribe from upstream {}:{}: {}", topic, params, error.message) + } + .subscribe() + } + override fun getPendingTxes(): PendingTxesSource { return pendingTxes } + + /** + * Get subscription statistics for monitoring + */ + fun getSubscriptionStats(): Map { + val stats = mutableMapOf() + stats["totalSubscriptions"] = holders.size + stats["subscriptions"] = holders.map { (key, holder) -> + mapOf( + "topic" to key.first, + "params" to (key.second?.toString() ?: "null"), + "clientCount" to holder.getClientCount(), + "clients" to holder.getClientIds(), + ) + } + return stats + } + + /** + * Force cleanup of a specific subscription (for testing/admin purposes) + */ + fun forceCleanupSubscription(topic: String, params: Any?) { + val key = topic to params + holders.remove(key)?.let { holder -> + log.info("Force cleaned up Ethereum subscription {}:{} with {} clients", topic, params, holder.getClientCount()) + } + } } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/ClientAwareSubscriptionConnect.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/ClientAwareSubscriptionConnect.kt new file mode 100644 index 00000000..d3c73f8f --- /dev/null +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/ClientAwareSubscriptionConnect.kt @@ -0,0 +1,60 @@ +package io.emeraldpay.dshackle.upstream.generic + +import io.emeraldpay.dshackle.upstream.Selector +import io.emeraldpay.dshackle.upstream.SubscriptionConnect +import org.slf4j.LoggerFactory +import reactor.core.publisher.Flux +import java.util.concurrent.atomic.AtomicBoolean + +/** + * Wrapper around SubscriptionConnect that tracks client lifecycle + */ +class ClientAwareSubscriptionConnect( + private val delegate: SubscriptionConnect, + private val client: SubscriptionClient, +) : SubscriptionConnect { + + companion object { + private val log = LoggerFactory.getLogger(ClientAwareSubscriptionConnect::class.java) + } + + private val disconnected = AtomicBoolean(false) + + override fun connect(matcher: Selector.Matcher): Flux { + return delegate.connect(matcher) + .doOnSubscribe { + log.debug("Client {} connected to subscription", client.clientId) + } + .doOnCancel { + handleDisconnect("cancelled") + } + .doOnComplete { + handleDisconnect("completed") + } + .doOnError { error -> + log.debug("Client {} subscription error: {}", client.clientId, error.message) + handleDisconnect("error") + } + .doFinally { + handleDisconnect("finally") + } + } + + private fun handleDisconnect(reason: String) { + if (disconnected.compareAndSet(false, true)) { + log.info("[AUTO-UNSUBSCRIBE] Client {} disconnected ({}), triggering cleanup", client.clientId, reason) + try { + client.onDisconnect() + } catch (e: Exception) { + log.warn("[AUTO-UNSUBSCRIBE] Error during client {} disconnect callback: {}", client.clientId, e.message) + } + } + } + + /** + * Manually disconnect the client + */ + fun disconnect() { + handleDisconnect("manual") + } +} diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericIngressSubscription.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericIngressSubscription.kt index 40568cfa..c92c4451 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericIngressSubscription.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericIngressSubscription.kt @@ -13,22 +13,141 @@ import java.time.Duration import java.util.concurrent.ConcurrentHashMap import kotlin.math.log -class GenericIngressSubscription(val conn: WsSubscriptions, val methods: List) : IngressSubscription { +class GenericIngressSubscription( + val conn: WsSubscriptions, + val methods: List, +) : IngressSubscription, SubscriptionCleanup { + + companion object { + private val log = LoggerFactory.getLogger(GenericIngressSubscription::class.java) + } + override fun getAvailableTopics(): List { return methods } - private val holders = ConcurrentHashMap, SubscriptionConnect>() + private val holders = ConcurrentHashMap, SubscriptionHolder>() @Suppress("UNCHECKED_CAST") override fun get(topic: String, params: Any?): SubscriptionConnect { - return holders.computeIfAbsent(topic to params) { key -> - GenericSubscriptionConnect( - conn, - key.first, - key.second, + // Generate a unique client ID for this subscription request + val clientId = generateClientId() + return getForClient(topic, params, clientId) + } + + /** + * Get a subscription for a specific client + */ + fun getForClient(topic: String, params: Any?, clientId: String): SubscriptionConnect { + val key = topic to params + val holder = holders.computeIfAbsent(key) { + log.debug("Creating new subscription holder for {}:{}", topic, params) + SubscriptionHolder( + GenericSubscriptionConnect(conn, topic, params, this), + topic, + params, ) - } as SubscriptionConnect + } as SubscriptionHolder + + // Create client with disconnect callback + log.info("[AUTO-UNSUBSCRIBE] Creating new client {} for subscription {}:{}", clientId, topic, params) + val client = DefaultSubscriptionClient(clientId) { + releaseSubscription(topic, params, clientId) + } + + return holder.addClient(client) + } + + /** + * Release a client's subscription. Called when a client disconnects. + */ + fun releaseSubscription(topic: String, params: Any?, clientId: String) { + log.info("[AUTO-UNSUBSCRIBE] Releasing subscription for client {} on topic {}:{}", clientId, topic, params) + val key = topic to params + holders.computeIfPresent(key) { _, holder -> + if (holder.removeClient(clientId)) { + log.info("[AUTO-UNSUBSCRIBE] Last client removed for subscription {}:{}, triggering cleanup", topic, params) + // Cleanup will be handled by the connection itself + null // Remove from map + } else { + log.info("[AUTO-UNSUBSCRIBE] Client {} removed, but {} clients remain for {}:{}", clientId, holder.getClientCount(), topic, params) + holder // Keep if still has clients + } + } + } + + /** + * Generate a unique client ID + */ + private fun generateClientId(): String { + return "client-${System.currentTimeMillis()}-${Thread.currentThread().id}-${(Math.random() * 10000).toInt()}" + } + + /** + * Get subscription statistics for monitoring + */ + fun getSubscriptionStats(): Map { + val stats = mutableMapOf() + stats["totalSubscriptions"] = holders.size + stats["subscriptions"] = holders.map { (key, holder) -> + mapOf( + "topic" to key.first, + "params" to (key.second?.toString() ?: "null"), + "clientCount" to holder.getClientCount(), + "clients" to holder.getClientIds(), + ) + } + return stats + } + + /** + * Force cleanup of a specific subscription (for testing/admin purposes) + */ + fun forceCleanupSubscription(topic: String, params: Any?) { + val key = topic to params + holders.remove(key)?.let { holder -> + log.info("Force cleaned up subscription {}:{} with {} clients", topic, params, holder.getClientCount()) + } + } + + override fun cleanupSubscription(topic: String, params: Any?, subscriptionId: String?) { + log.info("[AUTO-UNSUBSCRIBE] Cleaning up subscription {}:{} with ID: {}", topic, params, subscriptionId) + + if (subscriptionId.isNullOrEmpty()) { + log.warn("Cannot cleanup subscription {}:{} - no subscription ID", topic, params) + return + } + + // Determine unsubscribe method based on topic + val unsubscribeMethod = getUnsubscribeMethod(topic) + if (unsubscribeMethod != null) { + val unsubscribeRequest = ChainRequest(unsubscribeMethod, ListParams(subscriptionId)) + log.info("[AUTO-UNSUBSCRIBE] Sending unsubscribe request {} to upstream for {}:{}", unsubscribeMethod, topic, params) + conn.unsubscribe(unsubscribeRequest) + .doOnSuccess { + log.info("[AUTO-UNSUBSCRIBE] Successfully unsubscribed from upstream {}:{}", topic, params) + } + .doOnError { error -> + log.warn("[AUTO-UNSUBSCRIBE] Failed to unsubscribe from upstream {}:{}: {}", topic, params, error.message) + } + .subscribe() + } else { + log.warn("No unsubscribe method found for topic: {}", topic) + } + } + + private fun getUnsubscribeMethod(subscribeMethod: String): String? { + return when (subscribeMethod) { + "accountSubscribe" -> "accountUnsubscribe" + "blockSubscribe" -> "blockUnsubscribe" + "logsSubscribe" -> "logsUnsubscribe" + "programSubscribe" -> "programUnsubscribe" + "signatureSubscribe" -> "signatureUnsubscribe" + "slotSubscribe" -> "slotUnsubscribe" + // Ethereum methods + "eth_subscribe" -> "eth_unsubscribe" + else -> null + } } } @@ -36,16 +155,27 @@ class GenericSubscriptionConnect( val conn: WsSubscriptions, val topic: String, val params: Any?, + val cleanup: SubscriptionCleanup, ) : GenericPersistentConnect() { companion object { private val log = LoggerFactory.getLogger(GenericSubscriptionConnect::class.java) } + private var subscriptionId: String? = null + @Suppress("UNCHECKED_CAST") override fun createConnection(): Flux { - return conn.subscribe(ChainRequest(topic, ListParams(getParams(params) as List))) - .data + val subscribeData = conn.subscribe(ChainRequest(topic, ListParams(getParams(params) as List))) + + return subscribeData.data + .doOnNext { _ -> + // Store subscription ID when first message arrives (ID should be available by then) + if (subscriptionId == null) { + subscriptionId = subscribeData.subId.get() + log.debug("Subscription ID set for {}:{} -> {}", topic, params, subscriptionId) + } + } .timeout( Duration.ofSeconds(85), Mono.empty().doOnEach { @@ -55,6 +185,11 @@ class GenericSubscriptionConnect( .onErrorResume { log.error("Error during subscription to $topic", it) Mono.empty() + } + .doFinally { + // Trigger cleanup when connection ends + log.debug("Connection ended for subscription {}:{}", topic, params) + cleanup.cleanupSubscription(topic, params, subscriptionId) } as Flux } diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionCleanup.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionCleanup.kt new file mode 100644 index 00000000..d96a6940 --- /dev/null +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionCleanup.kt @@ -0,0 +1,15 @@ +package io.emeraldpay.dshackle.upstream.generic + +/** + * Interface for handling subscription cleanup operations + */ +interface SubscriptionCleanup { + + /** + * Called when a subscription should be cleaned up (no more clients) + * @param topic the subscription topic (e.g., "blockSubscribe") + * @param params the subscription parameters + * @param subscriptionId the upstream subscription ID to unsubscribe + */ + fun cleanupSubscription(topic: String, params: Any?, subscriptionId: String?) +} diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionClient.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionClient.kt new file mode 100644 index 00000000..aa4142f9 --- /dev/null +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionClient.kt @@ -0,0 +1,43 @@ +package io.emeraldpay.dshackle.upstream.generic + +/** + * Represents a client that has subscribed to a topic + */ +interface SubscriptionClient { + /** + * Unique identifier for this client + */ + val clientId: String + + /** + * Called when the client disconnects + */ + fun onDisconnect() +} + +/** + * Default implementation of SubscriptionClient + */ +class DefaultSubscriptionClient( + override val clientId: String, + private val onDisconnectCallback: () -> Unit, +) : SubscriptionClient { + + override fun onDisconnect() { + onDisconnectCallback() + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is SubscriptionClient) return false + return clientId == other.clientId + } + + override fun hashCode(): Int { + return clientId.hashCode() + } + + override fun toString(): String { + return "SubscriptionClient(clientId='$clientId')" + } +} diff --git a/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionHolder.kt b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionHolder.kt new file mode 100644 index 00000000..dcb68afe --- /dev/null +++ b/src/main/kotlin/io/emeraldpay/dshackle/upstream/generic/SubscriptionHolder.kt @@ -0,0 +1,62 @@ +package io.emeraldpay.dshackle.upstream.generic + +import io.emeraldpay.dshackle.upstream.SubscriptionConnect +import org.slf4j.LoggerFactory +import java.util.concurrent.ConcurrentHashMap + +/** + * Holds a subscription connection with client tracking for proper cleanup + */ +class SubscriptionHolder( + val connection: SubscriptionConnect, + val topic: String, + val params: Any?, +) { + companion object { + private val log = LoggerFactory.getLogger(SubscriptionHolder::class.java) + } + + private val clients = ConcurrentHashMap() + + /** + * Add a client to this subscription + * @param client the client to add + * @return the subscription connection wrapped with client tracking + */ + fun addClient(client: SubscriptionClient): SubscriptionConnect { + clients[client.clientId] = client + log.info("[AUTO-UNSUBSCRIBE] Added client {} to subscription {}:{}, total clients: {}", client.clientId, topic, params, clients.size) + return ClientAwareSubscriptionConnect(connection, client) + } + + /** + * Remove a client from this subscription + * @param clientId the client ID to remove + * @return true if this was the last client and cleanup should occur + */ + fun removeClient(clientId: String): Boolean { + val removed = clients.remove(clientId) + if (removed != null) { + log.info("[AUTO-UNSUBSCRIBE] Removed client {} from subscription {}:{}, remaining clients: {}", clientId, topic, params, clients.size) + } else { + log.warn("[AUTO-UNSUBSCRIBE] Attempted to remove non-existent client {} from subscription {}:{}", clientId, topic, params) + } + + return clients.isEmpty() + } + + /** + * Get current client count (for monitoring/debugging) + */ + fun getClientCount(): Int = clients.size + + /** + * Get all client IDs (for monitoring/debugging) + */ + fun getClientIds(): Set = clients.keys.toSet() + + /** + * Check if a specific client is subscribed + */ + fun hasClient(clientId: String): Boolean = clients.containsKey(clientId) +} diff --git a/src/test/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumWsIngressSubscriptionUnitTest.kt b/src/test/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumWsIngressSubscriptionUnitTest.kt new file mode 100644 index 00000000..2ea01680 --- /dev/null +++ b/src/test/kotlin/io/emeraldpay/dshackle/upstream/ethereum/subscribe/EthereumWsIngressSubscriptionUnitTest.kt @@ -0,0 +1,257 @@ +package io.emeraldpay.dshackle.upstream.ethereum.subscribe + +import io.emeraldpay.dshackle.upstream.ChainResponse +import io.emeraldpay.dshackle.upstream.ethereum.EthereumEgressSubscription +import io.emeraldpay.dshackle.upstream.ethereum.WsSubscriptions +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.argThat +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono +import java.util.concurrent.atomic.AtomicReference + +class EthereumWsIngressSubscriptionUnitTest { + + @Test + fun `should support all ethereum subscription topics`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + val availableTopics = subscription.getAvailableTopics() + + // Then + assertTrue(availableTopics.contains(EthereumEgressSubscription.METHOD_PENDING_TXES)) + assertTrue(availableTopics.contains(EthereumEgressSubscription.METHOD_NEW_HEADS)) + assertTrue(availableTopics.contains(EthereumEgressSubscription.METHOD_LOGS)) + assertEquals(3, availableTopics.size) + } + + @Test + fun `should return null for unsupported topics`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + val connection = subscription.get("unsupportedTopic", null) + + // Then + assertNull(connection) + } + + @Test + fun `should track multiple clients for same ethereum subscription`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + val client1 = subscription.getForClient( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-1", + ) + val client2 = subscription.getForClient( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-2", + ) + + // Then + assertNotNull(client1) + assertNotNull(client2) + + val stats = subscription.getSubscriptionStats() + assertEquals(1, stats["totalSubscriptions"]) + + @Suppress("UNCHECKED_CAST") + val subscriptions = stats["subscriptions"] as List> + assertEquals(1, subscriptions.size) + assertEquals(EthereumEgressSubscription.METHOD_NEW_HEADS, subscriptions[0]["topic"]) + assertEquals(2, subscriptions[0]["clientCount"]) + + @Suppress("UNCHECKED_CAST") + val clients = subscriptions[0]["clients"] as Set + assertTrue(clients.contains("eth-client-1")) + assertTrue(clients.contains("eth-client-2")) + } + + @Test + fun `should cleanup ethereum subscription when last client disconnects`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + subscription.getForClient( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-1", + ) + subscription.releaseSubscription( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-1", + ) + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(0, stats["totalSubscriptions"]) + } + + @Test + fun `should keep ethereum subscription when some clients remain`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + subscription.getForClient( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-1", + ) + subscription.getForClient( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-2", + ) + subscription.releaseSubscription( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-1", + ) + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(1, stats["totalSubscriptions"]) + + @Suppress("UNCHECKED_CAST") + val subscriptions = stats["subscriptions"] as List> + assertEquals(1, subscriptions[0]["clientCount"]) + + @Suppress("UNCHECKED_CAST") + val clients = subscriptions[0]["clients"] as Set + assertFalse(clients.contains("eth-client-1")) + assertTrue(clients.contains("eth-client-2")) + } + + @Test + fun `should handle different ethereum subscription topics separately`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + subscription.getForClient( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-client-1", + ) + subscription.getForClient( + EthereumEgressSubscription.METHOD_PENDING_TXES, + null, + "eth-client-2", + ) + val logsParams = mapOf("address" to "0x123") + subscription.getForClient( + EthereumEgressSubscription.METHOD_LOGS, + logsParams, + "eth-client-3", + ) + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(3, stats["totalSubscriptions"]) + + @Suppress("UNCHECKED_CAST") + val subscriptions = stats["subscriptions"] as List> + assertEquals(3, subscriptions.size) + + val topics = subscriptions.map { it["topic"] }.toSet() + assertTrue(topics.contains(EthereumEgressSubscription.METHOD_NEW_HEADS)) + assertTrue(topics.contains(EthereumEgressSubscription.METHOD_PENDING_TXES)) + assertTrue(topics.contains(EthereumEgressSubscription.METHOD_LOGS)) + } + + @Test + fun `should send eth_unsubscribe on cleanup`() { + // Given + val mockWsSubscriptions = mock { + on { unsubscribe(any()) } doReturn Mono.just(ChainResponse.ok("true")) + } + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + subscription.cleanupSubscription( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "eth-sub-123", + ) + + // Then + verify(mockWsSubscriptions).unsubscribe( + argThat { request -> + request.method == "eth_unsubscribe" && + request.params.toString().contains("eth-sub-123") + }, + ) + } + + @Test + fun `should not cleanup when subscription ID is null or empty`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + subscription.cleanupSubscription( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + null, + ) + subscription.cleanupSubscription( + EthereumEgressSubscription.METHOD_NEW_HEADS, + null, + "", + ) + + // Then + verify(mockWsSubscriptions, times(0)).unsubscribe(any()) + } + + @Test + fun `should generate unique ethereum client IDs`() { + // Given + val mockWsSubscriptions = mock() + val subscription = EthereumWsIngressSubscription(mockWsSubscriptions) + + // When + val connection1 = subscription.get(EthereumEgressSubscription.METHOD_NEW_HEADS, null) + val connection2 = subscription.get(EthereumEgressSubscription.METHOD_NEW_HEADS, null) + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(1, stats["totalSubscriptions"]) // Same subscription + + @Suppress("UNCHECKED_CAST") + val subscriptions = stats["subscriptions"] as List> + assertEquals(2, subscriptions[0]["clientCount"]) // But 2 different clients + + @Suppress("UNCHECKED_CAST") + val clients = subscriptions[0]["clients"] as Set + assertEquals(2, clients.size) + assertTrue(clients.all { it.startsWith("eth-client-") }) + } +} \ No newline at end of file diff --git a/src/test/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericIngressSubscriptionTest.kt b/src/test/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericIngressSubscriptionTest.kt new file mode 100644 index 00000000..1032f895 --- /dev/null +++ b/src/test/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericIngressSubscriptionTest.kt @@ -0,0 +1,186 @@ +package io.emeraldpay.dshackle.upstream.generic + +import io.emeraldpay.dshackle.upstream.ChainResponse +import io.emeraldpay.dshackle.upstream.ethereum.WsSubscriptions +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.argThat +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono +import java.util.concurrent.atomic.AtomicReference + +class GenericIngressSubscriptionTest { + + @Test + fun `should create subscription holder for new topic`() { + // Given + val mockWsSubscriptions = mock() + val subscription = GenericIngressSubscription(mockWsSubscriptions, listOf("blockSubscribe")) + + // When + val stats = subscription.getSubscriptionStats() + + // Then + assertEquals(0, stats["totalSubscriptions"]) + assertTrue((stats["subscriptions"] as List<*>).isEmpty()) + } + + @Test + fun `should track multiple clients for same subscription`() { + // Given + val mockWsSubscriptions = mock { + on { subscribe(any()) } doReturn WsSubscriptions.SubscribeData( + Flux.empty(), + "conn-1", + AtomicReference("sub-1"), + ) + } + val subscription = GenericIngressSubscription(mockWsSubscriptions, listOf("blockSubscribe")) + + // When + val client1 = subscription.getForClient("blockSubscribe", listOf("all"), "client-1") + val client2 = subscription.getForClient("blockSubscribe", listOf("all"), "client-2") + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(1, stats["totalSubscriptions"]) + + val subscriptions = stats["subscriptions"] as List> + assertEquals(1, subscriptions.size) + assertEquals("blockSubscribe", subscriptions[0]["topic"]) + assertEquals(2, subscriptions[0]["clientCount"]) + + val clients = subscriptions[0]["clients"] as Set + assertTrue(clients.contains("client-1")) + assertTrue(clients.contains("client-2")) + } + + @Test + fun `should cleanup subscription when last client disconnects`() { + // Given + val mockWsSubscriptions = mock { + on { subscribe(any()) } doReturn WsSubscriptions.SubscribeData( + Flux.empty(), + "conn-1", + AtomicReference("sub-1"), + ) + on { unsubscribe(any()) } doReturn Mono.just(ChainResponse.ok("true")) + } + val subscription = GenericIngressSubscription(mockWsSubscriptions, listOf("blockSubscribe")) + + // When + subscription.getForClient("blockSubscribe", listOf("all"), "client-1") + subscription.releaseSubscription("blockSubscribe", listOf("all"), "client-1") + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(0, stats["totalSubscriptions"]) + } + + @Test + fun `should keep subscription when some clients remain`() { + // Given + val mockWsSubscriptions = mock { + on { subscribe(any()) } doReturn WsSubscriptions.SubscribeData( + Flux.empty(), + "conn-1", + AtomicReference("sub-1"), + ) + } + val subscription = GenericIngressSubscription(mockWsSubscriptions, listOf("blockSubscribe")) + + // When + subscription.getForClient("blockSubscribe", listOf("all"), "client-1") + subscription.getForClient("blockSubscribe", listOf("all"), "client-2") + subscription.releaseSubscription("blockSubscribe", listOf("all"), "client-1") + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(1, stats["totalSubscriptions"]) + + val subscriptions = stats["subscriptions"] as List> + assertEquals(1, subscriptions[0]["clientCount"]) + + val clients = subscriptions[0]["clients"] as Set + assertFalse(clients.contains("client-1")) + assertTrue(clients.contains("client-2")) + } + + @Test + fun `should handle different subscription topics separately`() { + // Given + val mockWsSubscriptions = mock { + on { subscribe(any()) } doReturn WsSubscriptions.SubscribeData( + Flux.empty(), + "conn-1", + AtomicReference("sub-1"), + ) + } + val subscription = GenericIngressSubscription( + mockWsSubscriptions, + listOf("blockSubscribe", "accountSubscribe"), + ) + + // When + subscription.getForClient("blockSubscribe", listOf("all"), "client-1") + subscription.getForClient("accountSubscribe", listOf("account1"), "client-2") + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(2, stats["totalSubscriptions"]) + + val subscriptions = stats["subscriptions"] as List> + assertEquals(2, subscriptions.size) + + val topics = subscriptions.map { it["topic"] }.toSet() + assertTrue(topics.contains("blockSubscribe")) + assertTrue(topics.contains("accountSubscribe")) + } + + @Test + fun `should generate correct unsubscribe method for Solana topics`() { + // Given + val mockWsSubscriptions = mock { + on { unsubscribe(any()) } doReturn Mono.just(ChainResponse.ok("true")) + } + val subscription = GenericIngressSubscription(mockWsSubscriptions, listOf("blockSubscribe")) + + // When + subscription.cleanupSubscription("blockSubscribe", listOf("all"), "sub-123") + + // Then + verify(mockWsSubscriptions).unsubscribe( + argThat { request -> + request.method == "blockUnsubscribe" && + request.params.toString().contains("sub-123") + }, + ) + } + + @Test + fun `should force cleanup subscription`() { + // Given + val mockWsSubscriptions = mock { + on { subscribe(any()) } doReturn WsSubscriptions.SubscribeData( + Flux.empty(), + "conn-1", + AtomicReference("sub-1"), + ) + } + val subscription = GenericIngressSubscription(mockWsSubscriptions, listOf("blockSubscribe")) + + // When + subscription.getForClient("blockSubscribe", listOf("all"), "client-1") + subscription.forceCleanupSubscription("blockSubscribe", listOf("all")) + + // Then + val stats = subscription.getSubscriptionStats() + assertEquals(0, stats["totalSubscriptions"]) + } +} diff --git a/src/test/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericSubscriptionConnectTest.kt b/src/test/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericSubscriptionConnectTest.kt index db8e36f2..856e3f69 100644 --- a/src/test/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericSubscriptionConnectTest.kt +++ b/src/test/kotlin/io/emeraldpay/dshackle/upstream/generic/GenericSubscriptionConnectTest.kt @@ -24,7 +24,8 @@ class GenericSubscriptionConnectTest { WsSubscriptions.SubscribeData(Flux.just(response), "", AtomicReference("")) } - val genericSubscriptionConnect = GenericSubscriptionConnect(ws, topic, param) + val cleanup = mock() + val genericSubscriptionConnect = GenericSubscriptionConnect(ws, topic, param, cleanup) StepVerifier.create(genericSubscriptionConnect.createConnection()) .expectNext(response)