Skip to content

Releases: graphprotocol/graph-node

v0.43.0

23 Apr 17:41
ec5e629

Choose a tag to compare

$ docker pull graphprotocol/graph-node:v0.43.0

What's New

  • skipDuplicates for immutable entities. A new skipDuplicates parameter on the @entity directive (@entity(immutable: true, skipDuplicates: true)) silently skips duplicate inserts instead of failing the subgraph. This unblocks subgraph composition on Amp-powered subgraphs where SQL queries can produce the same entities across block ranges. (#6458)
  • Per-chain RPC settings via TOML config. Chain-specific tuning parameters (json_rpc_timeout, request_retries, max_block_range_size, polling_interval, block_batch_size, etc.) can now be set per chain in config.toml instead of relying on global environment variables. Fully backwards compatible — env vars remain the fallback. (#6459)
  • RPC provider failover for block ingestor. When the current RPC provider becomes unreachable during block ingestion polling, graph-node now automatically switches to a healthy alternative provider. (#6430)
  • Warn on startup when running a debug build, with [DEBUG-BUILD] prefix on all log lines. (#6488)

Improvements

  • Call cache eviction rewrite. Replaced the old per-contract iteration approach with ctid-based join deletes against the call_meta table, significantly faster on large call_cache tables. The old --ttl-max-contracts flag has been replaced by --max-contracts, which computes an effective TTL cutoff instead of limiting per-invocation iteration. Eviction now also returns stats on the number of contracts and entries removed. (#6476) (#6477)
  • Reduced unnecessary eth_getBlockByHash and eth_getBlockByNumber RPC calls by checking the block cache first in block_pointer_from_number and fetch_full_block_with_rpc. (#6491, partially reverted by #6537)
  • Header-only ChainStore query methods (ancestor_block_ptr, block_parent_ptr) skip deserializing the full block data JSONB column when only hash/number/parent are needed. (#6456)
  • Batch checking for update attempts on immutable entities, reducing per-entity overhead.
  • Node name is now used as the PostgreSQL application_name when PGAPPNAME is not set, making it easier to identify graph-node connections in pg_stat_activity.

Bug Fixes

  • Fixed dropped block trigger when once and polling filters match the same block — only one trigger type was firing. (#6530)
  • Fixed block stream ignoring configured endBlock in two cases: the block-skip optimization bypassing the max_end_block check, and max_end_block being set to None when multiple data sources share the same endBlock. (#6474)
  • Fixed GraphQL introspection not returning isDeprecated: false for __InputValue, which caused some client libraries to fail. (#6475)
  • Fixed IPC provider connections failing when configured with ipc:// or file:// URLs — the URL was passed directly to the transport instead of extracting the file path. (#6443)
  • Fixed graphman config pools not working due to hardcoded pool size override. (#6444)
  • Fixed unfail retry mechanism stopping after the first attempt when the deployment head was still behind the error block. (#6529)

gnd (Graph Node Dev)

  • gnd indexer command that delegates to graph-indexer, allowing indexer management (allocations, rules, cost models, status) directly through gnd. (#6492)
  • gnd deploy now prompts for --version-label in interactive mode and requires it in non-interactive mode. (#6532)
  • Test framework improvements: partial receipt.logs support, mock IPFS/Arweave clients for file data source testing. (#6442)

Contributors

Thanks to all contributors for this release: @aayushbaluni, @dimitrovmaksim, @incrypto32, @isum, @lutter, @SunTzu

Full Changelog: v0.42.1...v0.43.0

v0.42.1

25 Mar 06:56
0a7f791

Choose a tag to compare

Bug Fixes

  • Fixed multi-shard deployments becoming unresponsive due to mirror_primary_tables holding locks indefinitely, exhausting the connection pool. Added statement_timeout and lock_timeout to prevent stuck queries from cascading into a full lockup. (#6446)
  • Fixed the ingestor setting in [chains.*] config sections having no effect — block ingestion ran regardless of its value. (#6447)

v0.42.0

19 Mar 16:20
65d8bee

Choose a tag to compare

$ docker pull graphprotocol/graph-node:v0.42.0

Breaking Changes

  • Substreams support removed. Substreams have been unsupported on the network for some time. All substreams-related code has been removed, simplifying the codebase significantly. Substreams-based subgraphs will no longer work. (#6261)
  • Migrated from rust-web3 to alloy. The Ethereum RPC layer now uses the alloy crate instead of rust-web3. This should be transparent to most users, but chains that do not return EIP-2718 typed transaction fields may need the no_eip2718 provider feature flag. (#6063) (#6317)
  • Note: This release includes two database migrations that run automatically on startup. If you need to roll back to v0.41.2, you will need to run the down migrations manually

What's New

  • Amp-powered subgraphs (experimental). A new kind of subgraph powered by Amp, the blockchain native database. Amp-powered subgraphs index data directly from Amp servers instead of processing blocks individually, reducing indexing time from days/weeks to minutes/hours. See docs/amp-powered-subgraphs.md for details. (#6218) (#6293) (#6369)
  • SQL query interface (experimental). A new experimental SQL query interface allows querying subgraph data using SQL syntax via GraphQL. Documentation in docs/implementation/sql-interface.md. (#6172)
  • Async store. All store and database interactions are now fully async using diesel_async, eliminating blocking database calls from tokio tasks. This improves throughput and reduces the risk of thread starvation under heavy load. (#6194) (#6185)
  • RPC request compression. Configurable compression for outgoing JSON-RPC requests to upstream providers, supporting gzip, brotli, and deflate. Configured via provider features in the config file. (#6084)
  • Query the current (partially filled) aggregation bucket with current: include in GraphQL requests. (#6293)
  • Extended first and last aggregation support to String, Bytes, and entity reference types. (#6225)
  • Automated account-like table optimization — an optional background job that detects and marks tables with high entity update ratios as account-like. Enabled via GRAPH_STORE_ACCOUNT_LIKE_SCAN_INTERVAL_HOURS, GRAPH_STORE_ACCOUNT_LIKE_MIN_VERSIONS_COUNT, and GRAPH_STORE_ACCOUNT_LIKE_MAX_UNIQUE_RATIO. (#6209)
  • Subgraph table sizes and row counts are now exposed in SubgraphIndexingStatus via the index-node API. (#6201)
  • Configurable database setup timeout via GRAPH_STORE_SETUP_TIMEOUT.
  • Option to disable the store call cache via GRAPH_STORE_DISABLE_CALL_CACHE, useful for indexers with locally hosted RPC nodes. (#6214)
  • Docker: added profiling support to the graph-node-debug image with frame pointers and linux-perf. (#6418)

Improvements

  • Optimized WASM trigger instantiation by caching linker and compilation artifacts, reducing per-trigger overhead. (#6364)
  • Optimized log filter matching and trigger allocation, reducing CPU usage during block processing. (#6419)
  • Reduced unnecessary entity clones during block processing. (#6362)
  • Replaced std::sync::RwLock with parking_lot::RwLock across multiple components for better performance under contention.
  • Deadlock prevention under heavy load, especially during index node startup — connection pool and store semaphore improvements. (#6224)
  • Raw subgraph manifests are now loaded from the store cache during startup, reducing IPFS dependency. (#6223)
  • Deployment hashes are now logged when removing a subgraph. (#6405)

Bug Fixes

  • Fixed duplicate VID when multiple offchain triggers (file/IPFS data sources) fire in the same block, causing unique constraint violations. Also fixed in ipfs.map() callbacks. (#6336) (#6416)
  • Fixed incorrect nocase filter generation for non-String types (e.g., Bytes), which caused SQL errors like operator does not exist: bytea ~~* bytea. (#6351)
  • Fixed can_copy_from failures not fully rolling back deployment creation, leaving orphaned records. (#6228)
  • Fixed multi-column index validation bug where column order mismatch caused valid indexes to be silently dropped during subgraph copy/graft. (#6341)
  • Fixed grafting failure ("Unexpected null for non-null column") when source tables have too few rows for PostgreSQL to generate histogram_bounds statistics. (#6275)
  • Fixed panic when converting a negative number to U256 in the runtime — now returns an error instead. (#6219)
  • Fixed graphman copy copying pruned earliest_block_number from source, which could leave the destination deployment in an invalid state. (#6384)
  • Fixed calls returning 0x being incorrectly cached in the call cache, preventing stale empty results from persisting. (#6187)

Graphman

  • graphman dump and graphman restore (experimental). New commands for exporting and importing subgraph data in Parquet format, enabling backup and migration of deployment data across shards. Supports incremental dumps and progress reporting. See docs/dump.md for details. (#6397)
  • graphman chain call-cache remove now supports --ttl-days to remove stale call cache entries that haven't been accessed within a specified number of days. (#6186)

gnd (Graph Node Dev)

  • [experimental] Major expansion of gnd as a drop-in replacement for graph-cli: init, add, codegen, build, publish, deploy, create, remove, auth, clean, and test commands. (#6282)

Contributors

Thanks to all contributors for this release: @DaMandal0rian, @dimitrovmaksim, @fubhy, @hudsonhrh, @incrypto32, @isum, @lutter, @shiyasmohd

Full Changelog: v0.41.2...v0.42.0

v0.42.0-rc.0

16 Mar 11:30
2383899

Choose a tag to compare

v0.42.0-rc.0 Pre-release
Pre-release

Breaking Changes

  • Substreams support removed. Substreams have been unsupported on the network for some time. All substreams-related code has been removed, simplifying the codebase significantly. Substreams-based subgraphs will no longer work. (#6261)
  • Migrated from rust-web3 to alloy. The Ethereum RPC layer now uses the alloy crate instead of rust-web3. This should be transparent to most users, but chains that do not return EIP-2718 typed transaction fields may need the no_eip2718 provider feature flag. (#6063) (#6317)

What's New

  • Amp-powered subgraphs (experimental). A new kind of subgraph powered by Amp, the blockchain native database. Amp-powered subgraphs index data directly from Amp servers instead of processing blocks individually, reducing indexing time from days/weeks to minutes/hours. See docs/amp-powered-subgraphs.md for details. (#6218) (#6293) (#6369)
  • SQL query interface (experimental). A new experimental SQL query interface allows querying subgraph data using SQL syntax via GraphQL. Documentation in docs/implementation/sql-interface.md. (#6172)
  • Async store. All store and database interactions are now fully async using diesel_async, eliminating blocking database calls from tokio tasks. This improves throughput and reduces the risk of thread starvation under heavy load. (#6194) (#6185)
  • RPC request compression. Configurable compression for outgoing JSON-RPC requests to upstream providers, supporting gzip, brotli, and deflate. Configured via provider features in the config file. (#6084)
  • Query the current (partially filled) aggregation bucket with current: include in GraphQL requests. (#6293)
  • Extended first and last aggregation support to String, Bytes, and entity reference types. (#6225)
  • Automated account-like table optimization — an optional background job that detects and marks tables with high entity update ratios as account-like. Enabled via GRAPH_STORE_ACCOUNT_LIKE_SCAN_INTERVAL_HOURS, GRAPH_STORE_ACCOUNT_LIKE_MIN_VERSIONS_COUNT, and GRAPH_STORE_ACCOUNT_LIKE_MAX_UNIQUE_RATIO. (#6209)
  • Subgraph table sizes and row counts are now exposed in SubgraphIndexingStatus via the index-node API. (#6201)
  • Configurable database setup timeout via GRAPH_STORE_SETUP_TIMEOUT.
  • Option to disable the store call cache via GRAPH_STORE_DISABLE_CALL_CACHE, useful for indexers with locally hosted RPC nodes. (#6214)
  • Docker: added profiling support to the graph-node-debug image with frame pointers and linux-perf. (#6418)

Improvements

  • Optimized WASM trigger instantiation by caching linker and compilation artifacts, reducing per-trigger overhead. (#6364)
  • Optimized log filter matching and trigger allocation, reducing CPU usage during block processing. (#6419)
  • Reduced unnecessary entity clones during block processing. (#6362)
  • Replaced std::sync::RwLock with parking_lot::RwLock across multiple components for better performance under contention.
  • Deadlock prevention under heavy load, especially during index node startup — connection pool and store semaphore improvements. (#6224)
  • Raw subgraph manifests are now loaded from the store cache during startup, reducing IPFS dependency. (#6223)
  • Deployment hashes are now logged when removing a subgraph. (#6405)

Bug Fixes

  • Fixed duplicate VID when multiple offchain triggers (file/IPFS data sources) fire in the same block, causing unique constraint violations. Also fixed in ipfs.map() callbacks. (#6336) (#6416)
  • Fixed incorrect nocase filter generation for non-String types (e.g., Bytes), which caused SQL errors like operator does not exist: bytea ~~* bytea. (#6351)
  • Fixed can_copy_from failures not fully rolling back deployment creation, leaving orphaned records. (#6228)
  • Fixed multi-column index validation bug where column order mismatch caused valid indexes to be silently dropped during subgraph copy/graft. (#6341)
  • Fixed grafting failure ("Unexpected null for non-null column") when source tables have too few rows for PostgreSQL to generate histogram_bounds statistics. (#6275)
  • Fixed panic when converting a negative number to U256 in the runtime — now returns an error instead. (#6219)
  • Fixed graphman copy copying pruned earliest_block_number from source, which could leave the destination deployment in an invalid state. (#6384)
  • Fixed calls returning 0x being incorrectly cached in the call cache, preventing stale empty results from persisting. (#6187)

Graphman

  • graphman dump and graphman restore (experimental). New commands for exporting and importing subgraph data in Parquet format, enabling backup and migration of deployment data across shards. Supports incremental dumps and progress reporting. See docs/dump.md for details. (#6397)
  • graphman chain call-cache remove now supports --ttl-days to remove stale call cache entries that haven't been accessed within a specified number of days. (#6186)

gnd (Graph Node Dev)

  • [experimental] Major expansion of gnd as a drop-in replacement for graph-cli: init, add, codegen, build, publish, deploy, create, remove, auth, clean, and test commands. (#6282)

Contributors

Thanks to all contributors for this release: @DaMandal0rian, @dimitrovmaksim, @fubhy, @hudsonhrh, @incrypto32, @isum, @lutter, @shiyasmohd

v0.41.2

13 Feb 17:09
2f3c8e1

Choose a tag to compare

v0.41.2

$ docker pull graphprotocol/graph-node:v0.41.2

Bug Fixes

Fix entity corruption after rewinding pruned subgraphs

Rewinding a subgraph with history_blocks (pruning) enabled could corrupt entity state, leaving frequently-updated entities with no open (current) version. This caused deterministic unexpected null errors making the subgraph unrecoverable without a full re-index. (#6340)

Fix rewind/truncate targeting the wrong deployment

When multiple instances of the same subgraph existed, graphman rewind or graphman truncate could incorrectly target the active deployment instead of the specified one. (#6299)

Fix batch write memoization bug

Fixed a bug where entity lookups could incorrectly return None when batch memoization was enabled, causing missed entity updates during indexing. (#6314)

Expand deterministic RPC error handling for Reth and Erigon

Added additional RPC error messages (vm execution error, invalidjump, notactivated, invalidfeopcode) to the list of recognized deterministic errors. This fixes subgraphs incorrectly failing on Reth and Erigon nodes when encountering these EVM errors during eth_call. Previously, indexers using these clients needed to set GRAPH_GETH_ETH_CALL_ERRORS manually as a workaround. (#6355)

Full changelog: v0.41.1...v0.41.2

v0.41.1

07 Nov 13:38
872e708

Choose a tag to compare

v0.41.1

$ docker pull graphprotocol/graph-node:v0.41.1

Bug Fix

Indexing Status Endpoint

Fixed a regression in v0.41.0 where the indexing status endpoint would return an empty list when querying all subgraphs without specific deployment filters. Reverted an unnecessary optimization that broke this common use case. (#6210)

v0.41.0

20 Oct 17:24
9b61e60

Choose a tag to compare

v0.41.0

$ docker pull graphprotocol/graph-node:v0.41.0

Bug Fixes

  • Fix non-deterministic handling of transaction receipts in event handlers; receipts are only processed when explicitly declared (PR #6200)

New Features

  • Added support for struct field access in declarative calls - enables accessing nested struct fields by field name using dot notation in manifest call declarations(#6099)
  • New standalone gnd (Graph Node Dev) crate - a graph-node binary optimized for local development with minimal setup required (#6167)
  • Extended IPFS usage metrics and logging capabilities (#6058)
  • Extended support for additional IPFS content path formats (#6058)

Improvements

  • Deferred IPFS manifest fetching when starting subgraphs - fixes issue where slow IPFS responses could block assignment event processing, preventing new subgraphs from being assigned (#6170)
  • Added Content Identifier (CID) to IPFS retry logs for better debugging and tracking of IPFS operations (#6144)
  • Runtime now uses interior mutability in AscHeapCtx for improved performance (#6053)
  • Fixed handling of empty arrays in indexing status queries - prevents errors when querying deployments with empty array filters (#6143)
  • Fixed case-insensitive array inputs in queries - array filter values are now properly case-normalized (#6075)
  • Fixed panic when handling empty lists in list_values - resolves crashes with empty array filters (#6100)
  • Enhanced logging for subgraph assignment processing with more detailed information (#6169)
  • Added logging for MAX_BLOCKING_THREADS configuration setting (#6161)

Full changelog: v0.40.0...v0.41.0

v0.41.0-rc.0

02 Oct 14:12
b8bd318

Choose a tag to compare

v0.41.0-rc.0 Pre-release
Pre-release

v0.41.0-rc.0

$ docker pull graphprotocol/graph-node:v0.41.0-rc.0

New Features

  • Added support for struct field access in declarative calls - enables accessing nested struct fields by field name using dot notation in manifest call declarations(#6099)
  • New standalone gnd (Graph Node Dev) crate - a graph-node binary optimized for local development with minimal setup required (#6167)
  • Extended IPFS usage metrics and logging capabilities (#6058)
  • Extended support for additional IPFS content path formats (#6058)

Improvements

  • Deferred IPFS manifest fetching when starting subgraphs - fixes issue where slow IPFS responses could block assignment event processing, preventing new subgraphs from being assigned (#6170)
  • Added Content Identifier (CID) to IPFS retry logs for better debugging and tracking of IPFS operations (#6144)
  • Runtime now uses interior mutability in AscHeapCtx for improved performance (#6053)
  • Fixed handling of empty arrays in indexing status queries - prevents errors when querying deployments with empty array filters (#6143)
  • Fixed case-insensitive array inputs in queries - array filter values are now properly case-normalized (#6075)
  • Fixed panic when handling empty lists in list_values - resolves crashes with empty array filters (#6100)
  • Enhanced logging for subgraph assignment processing with more detailed information (#6169)
  • Added logging for MAX_BLOCKING_THREADS configuration setting (#6161)

Full changelog: v0.40.0...v0.41.0-rc.0

v0.40.1

09 Sep 11:44
3448994

Choose a tag to compare

$ docker pull graphprotocol/graph-node:v0.40.1

v0.40.1

Improvements

  • Enhanced IPFS logging to include Content Identifiers (CIDs) in operation names for better debugging

Full changelog: v0.40.0...v0.40.1

Contributors

Thanks to @fubhy and all other contributors for their work on this release.

v0.40.0

14 Aug 13:45
56a4cbc

Choose a tag to compare

$ docker pull graphprotocol/graph-node:v0.40.0

Critical Bugfix

GraphQL Empty Array Panic Fix
Fixed GraphQL query panic with empty arrays: Resolved a critical bug where GraphQL queries using _in filters (like id_in, name_in, etc.) with empty arrays would cause the graph-node to panic with index out of bounds: the len is 0 but the index is 0(#6100)

New Features

IPFS File System Caching

  • IPFS files can now be cached to disk using the GRAPH_IPFS_CACHE_LOCATION environment variable - reduces IPFS requests after restarts and improves performance. Cache directory must be writable by graph-node and in a trusted location (#6031)

Improvements

Performance

  • Speed up appending changes to batch operations (#6025)
  • Improved backoff strategy for offchain data sources - files not found are subject to exponential backoff, with configurable maximum backoff via GRAPH_FDS_MAX_BACKOFF (default: 600 seconds) (#6043)

GraphQL

  • Better error messages for OR operator usage with column filters (#6078)

graphman

  • Remove create flag from graphman deploy command (#6077)
  • graphman reassign now shows clearer success messages (#6074)

Runtime

  • Update Wasmtime version for improved WebAssembly performance (#6050)

Bug Fixes

  • Fixed subgraph composition sync failures when entities have different ID types - resolves "UNION types bytea and text cannot be matched" error (#6080)
  • Fixed database down migration issue (#6065)
  • Fixed pruning status reporting accuracy - completion percentage now correctly reflects progress when copying non-final entities (#6062)

Full changelog: v0.39.1...v0.40.0

Contributors

Thanks to @lutter, @mangas, @fubhy, @shiyasmohd, and all other contributors for their work on this release.