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(default1000) - see breaking changes above. (#5536)CORS_ALLOWED_ORIGINS(default[]) - opt-in allowlist of browser origins for HTTP and WebSocket. Empty keeps the existingAccess-Control-Allow-Origin: *; when set, only listed origins are echoed back and unlisted WebSocket handshakes are refused with403. (#5805)REAL_IP_ADDRESS_MODE(defaultX_FORWARDED_FOR) andTRUSTED_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_PROXIEShonours forwarding headers only from listed proxies;DIRECT_PEERalways uses the TCP peer. (#5832)CONTRACT_CALL_BLACKLIST(default[]) -toaddresses whoseeth_call/eth_estimateGasare rejected without hitting the Mirror Node. (#5875)ETH_GET_LOGS_SUB_TOPICS_LIMIT(default100) - max sub-topics per topic position; must not exceed the Mirror Node'smaxRepeatedQueryParameters. (#5767)MIRROR_NODE_TIMESTAMP_SLICING_ENUMERATION_MAX_BLOCKS(default1000) andMIRROR_NODE_TIMESTAMP_SLICING_MAX_SLICES(default200) - bound parallel timestamp slicing foreth_getLogsblock ranges. (#5655)SEND_RAW_TRANSACTION_WAIT_TIME(default500ms) - initial wait before receipt polling when nonce ordering is enabled. Defaults ofSEND_RAW_TRANSACTION_POLLING_INTERVAL_MS(2000→100) andSEND_RAW_TRANSACTION_POLLING_MAX_ATTEMPTS(10→200) changed alongside it. (#5869)TX_STATUS_TRACING(defaultfalse),TX_STATUS_TRACING_MAX_ENTRIES(default10000),TX_STATUS_TRACING_TTL_MS(default900000) - opt-in transaction status tracing, see highlights. (#5579)TX_TIMESTAMP_INDEX_ENABLED(defaultfalse),TX_TIMESTAMP_INDEX_MAX_ENTRIES(default10000),TX_TIMESTAMP_INDEX_TTL_MS(default300000) - opt-in hash → consensus-timestamp index for synthetic transaction receipts. (#5712, #5716)
Highlights
- State overrides -
eth_callandeth_estimateGasaccept the optional state-override parameter and forward it to the Mirror Nodecontracts/callAPI (HIP-1485). Requires Mirror Nodev0.158.0+withhiero.mirror.web3.enableStateOverrides. (#5817) - EIP-1898 -
eth_getBalance,eth_getCode,eth_getTransactionCount,eth_getStorageAtandeth_callaccept{"blockNumber"},{"blockHash"}and{"blockHash", "requireCanonical"}block identifier objects; validation errors no longer print[object Object]. (#5845) - Transaction status tracing - when
TX_STATUS_TRACINGis enabled, a rejected or timed-out transaction surfaces a-32003error frometh_getTransactionReceiptinstead of an indistinguishablenull; raw records are available viaadmin_getTransactionTraceByHash. (#5579) eth_getLogsblock 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.parseunless they contain a value that needsjson-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/cumulativeGasUsedon 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_getBalancereturned wrong (sometimes negative) balances for blocks in the last ~15 minutes when allowance spends were involved. (#5831)authorizationListentries always returnedyParity: "0x0"and leaked the rawy_parityfield. (#5864)WS_SUBSCRIPTION_LIMITwas bypassable forlogssubscriptions 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/Forwardedcan be prevented withREAL_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-limitalert; unlisted rejections log thetoaddress. (#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-anyand explicit return types enforced forsrcand tests, with typecheck in CI. (#5645, #5659, #5669, #5739) - Notable dependency bumps:
redis5 → 6 (#5794),dotenv17 → 18 (#5797).
Testing & CI
- Network versions bumped to consensus node
v0.77.2, Mirror Nodev0.164.1and Solo0.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.7and extended to synthetic transactions. (#5872, #5783) transactionIndexacceptance coverage foreth_*methods. (#5654)- Round of flaky CI test fixes. (#5857)
/toolsanddapp-exampleexcluded 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
- build(deps): combine dependabot PRs by @natanasow in #5648
- feat:
eth_getTransactionReceiptfor reverted child transaction should returnnullby @natanasow in #5661 - build(deps): combine dependabot PRs by @natanasow in #5681
- feat: validate configuration properties at start-up via per-entry rules by @ValentinVPK in #5618
- test: add transactionIndex acceptance coverage for eth_* methods by @ValentinVPK in #5654
- feat: edit docker compose for ws server by @natanasow in #5690
- feat: improve synthetic transactions/logs related endpoints by @natanasow in #5604
- fix: resolve synthetic transaction receipts by recorded consensus timestamp by @ValentinVPK in #5712
- fix: disable the transaction timestamp index by default by @ValentinVPK in #5716
- fix: reorder JSON-RPC response fields to match spec by @Ferparishuertas in #5728
- fix: correct JSON-RPC response field order to match spec by @Ferparishuertas in #5735
- feat: use
JSONBigInt.parseonly when it's needed by @natanasow in #5726
- 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
/toolsanddapp-examplefrom 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
AccountBalanceQueryby @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_TIMEconfig 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_callandeth_estimateGasby @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
- feat: block Mirror Node blacklisted contracts in
- 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