github hiero-ledger/hiero-json-rpc-relay v0.80.0-rc1

4 hours ago

Overview

v0.80.0 focuses on Ethereum JSON-RPC compatibility and hardening the public endpoint. It adds state overrides for eth_call / eth_estimateGas (HIP-1485), EIP-1898 block identifier objects across the state-reading methods, and opt-in transaction status tracing for eth_getTransactionReceipt. On the security side it introduces a CORS origin allowlist, a configurable client-IP source to stop forwarding-header spoofing, a shared per-request address cap, and fail-fast configuration validation at start-up. It also lands a large batch of spec-compliance fixes for requests, receipts and eth_getLogs, faster Mirror Node response parsing, and a move to Node.js 24 LTS.

Before upgrading, review the breaking changes below - one configuration variable has been replaced, the minimum Mirror Node version has been raised, invalid configuration now stops the relay at start-up, and several error responses have changed.


⚠️ Breaking Changes

Review all items below and update your configuration and error handling before upgrading.

Item Before After Notes
WS_MULTIPLE_ADDRESSES_LIMIT WS-only cap on addresses in an eth_subscribe logs filter Removed - replaced by MAX_ADDRESSES_PER_REQUEST (default 1000) The new cap applies to eth_getLogs, eth_newFilter and eth_subscribe("logs"), and to the total across a JSON-RPC batch. Duplicates are collapsed before the cap is applied. (#5536)
Minimum Mirror Node version v0.156.0 v0.158.0 Required for state overrides; the relay logs a compatibility warning at start-up. (#5817)
Configuration validation Only mandatory fields type-checked; bad numeric/list values silently became NaN or failed later Every set property is type-checked at start-up A non-numeric value for a numeric property or invalid JSON for a list property now stops the relay with Configuration error: <PROPERTY> .... Range checks added for INPUT_SIZE_LIMIT (> 0), WS_INPUT_SIZE_LIMIT (-1 or > 0), MIRROR_NODE_TIMESTAMP_SLICING_MAX_LOGS_PER_SLICE (>= 1) and MIRROR_NODE_HTTP_MAX_SOCKETS (integer >= 1). (#5618)
eth_getLogs ranges beyond head Empty or partial result; reversed range returned -39013 -32602 toBlock past head → block range extends beyond current head block; fromBlock past head or fromBlock > toBlock → invalid block range params. Filters (eth_getFilterChanges) are unchanged. (#5878)
Log filter topics Positions past the 4th silently dropped (query ran unfiltered); sub-topic limit only enforced on read -32602 at validation time Max 4 positions and ETH_GET_LOGS_SUB_TOPICS_LIMIT (default 100) sub-topics per position, for eth_getLogs, eth_newFilter and eth_subscribe("logs"). (#5767)
Non-array params over HTTP (incl. null) HTTP 500 / -32603 HTTP 400 / -32600 WebSocket still coerces falsy params to []. (#5782)
Non-primitive JSON-RPC id (boolean/array/object) HTTP 500 (HTTP) / no response (WS) -32600 with "id": null A bad entry no longer fails the rest of its batch. (#5766)
eth_getTransactionReceipt contractAddress Callee address for plain message calls null unless the transaction deployed a contract HTS token creation via 0x167 still returns the token address. (#5785)
eth_getTransactionReceipt for reverted child transactions Error null (#5661)
Docker image Node.js runtime Node.js 22 Node.js 24 LTS (#5841)

New configuration

  • MAX_ADDRESSES_PER_REQUEST (default 1000) - see breaking changes above. (#5536)
  • CORS_ALLOWED_ORIGINS (default []) - opt-in allowlist of browser origins for HTTP and WebSocket. Empty keeps the existing Access-Control-Allow-Origin: *; when set, only listed origins are echoed back and unlisted WebSocket handshakes are refused with 403. (#5805)
  • REAL_IP_ADDRESS_MODE (default X_FORWARDED_FOR) and TRUSTED_PROXY_IPS (default []) - source of the client IP used by HTTP/WS rate limits, the WS per-IP connection limit and HBAR spending plans. TRUSTED_PROXIES honours forwarding headers only from listed proxies; DIRECT_PEER always uses the TCP peer. (#5832)
  • CONTRACT_CALL_BLACKLIST (default []) - to addresses whose eth_call / eth_estimateGas are rejected without hitting the Mirror Node. (#5875)
  • ETH_GET_LOGS_SUB_TOPICS_LIMIT (default 100) - max sub-topics per topic position; must not exceed the Mirror Node's maxRepeatedQueryParameters. (#5767)
  • MIRROR_NODE_TIMESTAMP_SLICING_ENUMERATION_MAX_BLOCKS (default 1000) and MIRROR_NODE_TIMESTAMP_SLICING_MAX_SLICES (default 200) - bound parallel timestamp slicing for eth_getLogs block ranges. (#5655)
  • SEND_RAW_TRANSACTION_WAIT_TIME (default 500 ms) - initial wait before receipt polling when nonce ordering is enabled. Defaults of SEND_RAW_TRANSACTION_POLLING_INTERVAL_MS (2000 → 100) and SEND_RAW_TRANSACTION_POLLING_MAX_ATTEMPTS (10 → 200) changed alongside it. (#5869)
  • TX_STATUS_TRACING (default false), TX_STATUS_TRACING_MAX_ENTRIES (default 10000), TX_STATUS_TRACING_TTL_MS (default 900000) - opt-in transaction status tracing, see highlights. (#5579)
  • TX_TIMESTAMP_INDEX_ENABLED (default false), TX_TIMESTAMP_INDEX_MAX_ENTRIES (default 10000), TX_TIMESTAMP_INDEX_TTL_MS (default 300000) - opt-in hash → consensus-timestamp index for synthetic transaction receipts. (#5712, #5716)

Highlights

  • State overrides - eth_call and eth_estimateGas accept the optional state-override parameter and forward it to the Mirror Node contracts/call API (HIP-1485). Requires Mirror Node v0.158.0+ with hiero.mirror.web3.enableStateOverrides. (#5817)
  • EIP-1898 - eth_getBalance, eth_getCode, eth_getTransactionCount, eth_getStorageAt and eth_call accept {"blockNumber"}, {"blockHash"} and {"blockHash", "requireCanonical"} block identifier objects; validation errors no longer print [object Object]. (#5845)
  • Transaction status tracing - when TX_STATUS_TRACING is enabled, a rejected or timed-out transaction surfaces a -32003 error from eth_getTransactionReceipt instead of an indistinguishable null; raw records are available via admin_getTransactionTraceByHash. (#5579)
  • eth_getLogs block ranges are now split into timestamp slices and fetched in parallel. (#5655)
  • Aborted HTTP requests now cancel their in-flight Mirror Node work instead of running to completion. (#5781)
  • Mirror Node responses are parsed with native JSON.parse unless they contain a value that needs json-bigint, roughly 2–3× faster on most routes. (#5726)
  • Synthetic transactions: endpoints rely on contract results only (#5604), receipts can be resolved by recorded consensus timestamp so Blockscout no longer drops blocks (#5712), and wrong from / cumulativeGasUsed on those receipts is fixed (#5843).
  • Balance lookups use the Mirror Node instead of the soon-to-be-deprecated SDK AccountBalanceQuery. (#5807)
  • Metrics are now defined centrally in the metrics service. (#5682)

Bug fixes

  • eth_getBalance returned wrong (sometimes negative) balances for blocks in the last ~15 minutes when allowance spends were involved. (#5831)
  • authorizationList entries always returned yParity: "0x0" and leaked the raw y_parity field. (#5864)
  • WS_SUBSCRIPTION_LIMIT was bypassable for logs subscriptions by concurrent or batched requests. (#5768)
  • Concurrent HBAR spend updates could be lost in addToAmountSpent. (#5857)
  • JSON-RPC responses now follow the spec field order {jsonrpc, result|error, id}. (#5728, #5735)

Security & operations

  • Client-IP spoofing via X-Forwarded-For / Forwarded can be prevented with REAL_IP_ADDRESS_MODE. (#5832)
  • CORS origin allowlist for HTTP and WebSocket; the value is masked in the start-up log and /config. (#5805)
  • Mirror Node-blacklisted contracts no longer trip the mirrornode-rate-limit alert; unlisted rejections log the to address. (#5875)
  • Docker image and CI moved to Node.js 24 LTS. (#5841)
  • Docker Compose updated for the WebSocket server. (#5690)
  • Stricter TypeScript: noImplicitAny, no-explicit-any and explicit return types enforced for src and tests, with typecheck in CI. (#5645, #5659, #5669, #5739)
  • Notable dependency bumps: redis 5 → 6 (#5794), dotenv 17 → 18 (#5797).

Testing & CI

  • Network versions bumped to consensus node v0.77.2, Mirror Node v0.164.1 and Solo 0.92.0; the bump is now automated by a weekly workflow. (#5811, #5862, #5551)
  • Redis version compatibility testing added. (#5751)
  • Conformity suite bumped to execution-apis v1.0.0-beta.7 and extended to synthetic transactions. (#5872, #5783)
  • transactionIndex acceptance coverage for eth_* methods. (#5654)
  • Round of flaky CI test fixes. (#5857)
  • /tools and dapp-example excluded from dependabot. (#5741)

What's Changed

99 None

  • chore(release): Bump versions for v0.80.0-SNAPSHOT by @swirlds-automation in #5652
  • feat: opt-in transaction status tracing for eth_getTransactionReceipt by @tgntr in #5579
  • feat: refactor metrics server by @natanasow in #5682
    • feat: add configurable MAX_ADDRESSES_PER_REQUEST cap by @tgntr in #5536
    • feat: slice eth_getLogs block ranges for parallel log retrieval by @ValentinVPK in #5655
    • feat: exclude /tools and dapp-example from dependabot by @natanasow in #5741
    • build(deps): bump the minor-and-patch-npm-daily group across 1 directory with 12 updates by @dependabot[bot] in #5752
  • chore: enable noImplicitAny for src by @tgntr in #5645
    • chore: enable no-explicit-any for src by @tgntr in #5659
    • chore: fix pre-existing test type errors and enforce typecheck in CI by @tgntr in #5669
    • chore: enforce noImplicitAny, no-explicit-any and explicit return types for tests by @tgntr in #5739
    • build(deps): batch dependabot bumps by @natanasow in #5753
    • build(deps-dev): bump @types/sinon from 21.0.1 to 22.0.0 by @dependabot[bot] in #5775
  • build(deps-dev): bump eslint-plugin-n from 17.24.0 to 18.3.0 by @dependabot[bot] in #5774
  • build(deps-dev): bump @types/k6 from 1.4.0 to 2.2.1 in /k6 by @dependabot[bot] in #5770
  • build(deps): bump the minor-and-patch-actions-weekly group across 1 directory with 4 updates by @dependabot[bot] in #5780
  • build(deps): bump actions/setup-python from 6.2.0 to 7.0.0 by @dependabot[bot] in #5710
  • build(deps): bump actions/setup-node from 6.4.0 to 7.0.0 by @dependabot[bot] in #5706
  • build(deps): bump actions/checkout from 6.0.2 to 7.0.1 by @dependabot[bot] in #5705
  • build(deps): bump dcarbone/install-jq-action from 3.2.0 to 4.0.1 by @dependabot[bot] in #5708
  • build(deps-dev): bump @types/node from 25.6.2 to 26.6.1 by @dependabot[bot] in #5772
  • build(deps): bump actions/setup-go from 6.4.0 to 7.0.0 by @dependabot[bot] in #5709
  • build(deps-dev): bump eslint-plugin-simple-import-sort from 12.1.1 to 14.0.0 by @dependabot[bot] in #5773
  • build(deps): bump adm-zip, hardhat and @nomicfoundation/hardhat-chai-matchers in /tools/hardhat-viem-example by @dependabot[bot] in #5786
  • build(deps): bump the minor-and-patch-npm-daily group across 1 directory with 6 updates by @dependabot[bot] in #5787
  • chore(ci): automate Solo, consensus node, and mirror node version updates by @ValentinVPK in #5551
    • feat: bump network versions to 0.77.2 CN and 0.163.1 MN by @natanasow in #5811
    • feat: use MN call instead of SDK AccountBalanceQuery by @natanasow in #5807
    • fix: enforce WS_SUBSCRIPTION_LIMIT for logs by @tgntr in #5768
    • chore: remove transitional read-guard for latest-state ACCOUNT entries in resolveEntityType by @tgntr in #5816
    • fix: reject non-primitive JSON-RPC id by @tgntr in #5766
    • feat: add redis version compatibility testing by @ValentinVPK in #5751
    • fix: bound log filter topic positions and sub-topics at validation time by @tgntr in #5767
    • fix: null contractAddress on receipts for calls that deploy no contract by @tgntr in #5785
    • fix: reject non-array JSON-RPC params with -32600 instead of crashing on null by @tgntr in #5782
    • feat: aborted HTTP requests should not continue downstream by @natanasow in #5781
    • feat: add configurable CORS origin allowlist for HTTP and WebSocket by @tgntr in #5805
    • build(deps): bump dotenv from 17.4.2 to 18.0.4 in /docs/examples by @dependabot[bot] in #5827
  • build(deps-dev): bump c8 from 10.1.3 to 12.0.0 by @dependabot[bot] in #5788
  • build(deps): bump actions/checkout from 6.0.2 to 7.0.1 by @dependabot[bot] in #5801
  • build(deps-dev): bump fast-uri from 3.1.5 to 3.1.8 in /tools/hardhat-example by @dependabot[bot] in #5822
  • build(deps): bump step-security/harden-runner from 2.19.4 to 2.21.1 in the minor-and-patch-actions-weekly group across 1 directory by @dependabot[bot] in #5799
  • build(deps): bump actions/setup-node from 6.4.0 to 7.0.0 by @dependabot[bot] in #5800
  • fix: eth_getBalance returns wrong balances for recent blocks with allowance spends by @ValentinVPK in #5831
    • build(deps-dev): bump axios from 1.16.0 to 1.20.0 in /tools/whbar-hardhat-example by @dependabot[bot] in #5836
  • build(deps-dev): bump lint-staged from 16.4.0 to 17.6.0 by @dependabot[bot] in #5789
  • build(deps): bump image-size and metro in /tools/whbar-hardhat-example by @dependabot[bot] in #5814
  • feat: support state overrides in eth_call and eth_estimateGas by @ValentinVPK in #5817
    • build(deps): bump brace-expansion in /tools/whbar-hardhat-example by @dependabot[bot] in #5842
  • build(deps-dev): bump brace-expansion from 2.0.1 to 2.1.7 in /tools/web3js-example by @dependabot[bot] in #5838
  • build(deps): bump the minor-and-patch-npm-daily group across 1 directory with 10 updates by @dependabot[bot] in #5837
  • build(deps): bump adm-zip and hardhat in /tools/layer-zero-example by @dependabot[bot] in #5834
  • build(deps): bump dotenv from 17.4.2 to 18.0.5 by @dependabot[bot] in #5797
  • build(deps): bump redis from 5.12.1 to 6.3.0 by @dependabot[bot] in #5794
  • feat: add REAL_IP_ADDRESS_MODE to stop forwarding-header IP spoofing by @tgntr in #5832
    • chore: bump Node.js to 24 LTS in Docker image and CI by @ValentinVPK in #5841
    • test: cover synthetic transactions in the conformity suite by @ValentinVPK in #5783
    • build(deps): bump shell-quote from 1.10.0 to 1.12.0 in /tools/whbar-hardhat-example by @dependabot[bot] in #5861
  • build(deps): bump the minor-and-patch-actions-weekly group with 3 updates by @dependabot[bot] in #5855
  • build(deps): bump the minor-and-patch-npm-daily group across 1 directory with 8 updates by @dependabot[bot] in #5853
  • build(deps-dev): bump @types/k6 from 2.2.1 to 2.3.0 in /k6 by @dependabot[bot] in #5852
  • build(deps): bump @hiero-ledger/sdk from 2.88.0 to 2.89.1 in /docs/examples by @dependabot[bot] in #5851
  • build(deps): bump brace-expansion in /tools/waffle-example by @dependabot[bot] in #5844
  • build(deps): bump source-map-js from 1.2.1 to 1.2.2 in /tools/wagmi-example by @dependabot[bot] in #5860
  • build(deps): bump fast-copy from 3.0.2 to 3.1.0 in /tools/whbar-hardhat-example by @dependabot[bot] in #5859
  • fix: map mirror node y_parity to yParity in authorization list entries by @ValentinVPK in #5864
    • feat: add EIP-1898 support by @natanasow in #5845
    • build(deps): bump dotenv from 18.0.5 to 18.0.6 in the minor-and-patch-npm-daily group across 1 directory by @dependabot[bot] in #5870
  • build(deps): bump shell-quote from 1.10.0 to 1.12.0 in /k6 by @dependabot[bot] in #5866
  • build(deps): bump fast-copy by @dependabot[bot] in #5865
  • build(deps): bump dotenv from 18.0.4 to 18.0.5 in /docs/examples in the minor-and-patch-npm-weekly group across 1 directory by @dependabot[bot] in #5850
  • build(deps): bump image-size and metro in /k6 by @dependabot[bot] in #5809
  • feat: add SEND_RAW_TRANSACTION_WAIT_TIME config var by @natanasow in #5869
    • build(deps): bump handlebars from 4.7.9 to 4.7.10 in /tools/solidity-coverage-example by @dependabot[bot] in #5874
  • build(deps-dev): bump viem from 2.57.3 to 2.57.4 in the minor-and-patch-npm-daily group across 1 directory by @dependabot[bot] in #5873
  • build(deps-dev): bump handlebars from 4.7.8 to 4.7.10 in /tools/subgraph-example by @dependabot[bot] in #5871
  • fix: wrong from and cumulativeGasUsed on synthetic receipts resolved by timestamp by @ValentinVPK in #5843
    • build(deps-dev): bump shell-quote from 1.10.0 to 1.12.0 in /tools/hedera-crosschain-bridge by @dependabot[bot] in #5877
  • build(deps-dev): bump handlebars from 4.7.9 to 4.7.10 in /tools/hardhat-example by @dependabot[bot] in #5879
  • test: bump conformity suite to execution-apis v1.0.0-beta.7 by @ValentinVPK in #5872
    • feat: block Mirror Node blacklisted contracts in eth_call and eth_estimateGas by @ValentinVPK in #5875
    • feat: return -32602 from eth_getLogs for block ranges beyond head by @tgntr in #5878
    • fix: flaky CI tests and lost concurrent HBAR spend updates by @tgntr in #5857
    • chore: bump Solo, consensus node, and mirror node versions by @swirlds-automation in #5862
  • build(deps): bump fast-copy from 3.0.2 to 3.1.0 in /k6 by @dependabot[bot] in #5881
  • build(deps): bump undici, @nomicfoundation/hardhat-toolbox and hardhat in /tools/whbar-hardhat-example by @dependabot[bot] in #5839
  • build(deps): bump source-map-js from 1.2.1 to 1.2.2 in /dapp-example by @dependabot[bot] in #5884

Full Changelog: v0.79.0...v0.80.0

Don't miss a new hiero-json-rpc-relay release

NewReleases is sending notifications on new releases.