Releases: graphprotocol/graph-node
v0.42.0-rc.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_eip2718provider 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.mdfor 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
featuresin the config file. (#6084) - Query the current (partially filled) aggregation bucket with
current: includein GraphQL requests. (#6293) - Extended
firstandlastaggregation support toString,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, andGRAPH_STORE_ACCOUNT_LIKE_MAX_UNIQUE_RATIO. (#6209) - Subgraph table sizes and row counts are now exposed in
SubgraphIndexingStatusvia 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-debugimage with frame pointers andlinux-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::RwLockwithparking_lot::RwLockacross 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
nocasefilter generation for non-String types (e.g.,Bytes), which caused SQL errors likeoperator does not exist: bytea ~~* bytea. (#6351) - Fixed
can_copy_fromfailures 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_boundsstatistics. (#6275) - Fixed panic when converting a negative number to
U256in the runtime — now returns an error instead. (#6219) - Fixed
graphman copycopying prunedearliest_block_numberfrom source, which could leave the destination deployment in an invalid state. (#6384) - Fixed calls returning
0xbeing incorrectly cached in the call cache, preventing stale empty results from persisting. (#6187)
Graphman
graphman dumpandgraphman 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. Seedocs/dump.mdfor details. (#6397)graphman chain call-cache removenow supports--ttl-daysto 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
gndas a drop-in replacement forgraph-cli:init,add,codegen,build,publish,deploy,create,remove,auth,clean, andtestcommands. (#6282)
Contributors
Thanks to all contributors for this release: @DaMandal0rian, @dimitrovmaksim, @fubhy, @hudsonhrh, @incrypto32, @isum, @lutter, @shiyasmohd
v0.41.2
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
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
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
AscHeapCtxfor 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_THREADSconfiguration setting (#6161)
Full changelog: v0.40.0...v0.41.0
v0.41.0-rc.0
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
AscHeapCtxfor 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_THREADSconfiguration setting (#6161)
Full changelog: v0.40.0...v0.41.0-rc.0
v0.40.1
$ 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
$ 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_LOCATIONenvironment 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 deploycommand (#6077) graphman reassignnow 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.
v0.40.0-rc.0
$ docker pull graphprotocol/graph-node:v0.40.0-rc.0
New Features
IPFS File System Caching
- IPFS files can now be cached to disk using the
GRAPH_IPFS_CACHE_LOCATIONenvironment 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 deploycommand (#6077) graphman reassignnow 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-rc.0
Contributors
Thanks to @lutter, @mangas, @fubhy, @shiyasmohd, and all other contributors for their work on this release.
v0.39.1
v0.39.1
Critical Fix
Event Transaction Log Index
-
Reverted transaction log index behavior: Fixed a regression introduced in v0.38.0 where
event.transactionLogIndexwas inadvertently changed to return the actual transaction log index instead of the log index (#6042)Impact: This change in v0.38.0 caused subgraph failures with duplicate ID errors for subgraphs using
event.transactionLogIndexfor entity ID generation. It could also lead to POI divergence between indexers running different versions.Note: While this restores the previous behavior,
event.transactionLogIndexcontinues to return the same value asevent.logIndex(not the actual transaction log index). Subgraph developers should useevent.logIndexfor unique log identification.
Upgrade Notes
Indexers running v0.38.0 who have synced subgraphs that use event.transactionLogIndex should:
- Upgrade to v0.39.1
- Rewind affected subgraphs to before they were synced with v0.38.0
- Resync to ensure POI convergence with the network
Contributors
Thanks to @lutter for the quick fix and the indexer community for identifying and helping diagnose this issue.
Full changelog: v0.39.0...v0.39.1
v0.39.0
v0.39.0
Breaking Changes
Database Schema Changes
-
Major schema migration: The
subgraphs.subgraph_deploymenttable has been split into two tables: (#6003)subgraphs.head- stores frequently changing metadata (block hash, block number, entity count, firehose cursor)subgraphs.deployment- stores less frequently changing data
Note: This migration will run automatically but may take time on large databases; anything beyond a minute or two will most likely be due to long-running queries blocking the migration. While it is possible to apply this migration with rolling updates to all graph-node processes, it is recommended to shut down all graph-node processes first and them start them up again.
Note: External processes accessing the
subgraph_deploymenttable, such as dashboards, will not work after the migration. Queries that these tools run will need to be updated. Joining theheadanddeploymenttable onidwill yield the same data that used to live in thesubgraph_deploymenttable, though a few columns were also renamed. See the documentation for details.
Removed Features
- Arweave blockchain support removed - Arweave subgraphs are no longer supported (Arweave file data sources remain unaffected) (#5951)
graphman dropcommand removed - To remove a deployment, rungraphman remove <name>for each name the deployment has (seegraphman info), then rungraphman unused record && graphman unused remove(#5974)
Behavior Changes
- Failed subgraphs are now paused instead of unassigned - This prevents unwanted side effects like canceling active copy operations (#5971)
- Various store errors are now classified as deterministic - May affect error handling in your monitoring (#5943)
New Features
Enhanced Pruning Management
- Pruning status tracking: New database tables track pruning progress per deployment (#5949)
- Pruning timeout protection: Long-running prune operations can be killed and retried if they exceed
GRAPH_STORE_BATCH_TIMEOUT(#6002) - Better pruning estimates: Uses PostgreSQL statistics for more accurate predictions (requires PostgreSQL 17+ for full functionality) (#6012)
- New graphman commands: (#5949)
graphman prune status- View status of prune operationsgraphman prune run- Manually trigger pruninggraphman prune set- Configure pruning parameters
Block Ingestion Tools
graphman chain ingest <chain_name> <block_number>- Manually ingest specific blocks into the block cache (#5945)
IPFS Improvements
- Configurable retry limits: Set max retry attempts with
GRAPH_IPFS_MAX_ATTEMPTS(default: 100,000) (#5998) - Configurable timeouts: (e1d9876)
GRAPH_IPFS_REQUEST_TIMEOUT- Request timeout (default: 60s release, 1s debug)- Max retry delay increased to 60 seconds (#5995)
Improvements
Error Handling
- Store errors now properly classified as deterministic vs non-deterministic (#5943)
- Pruning errors no longer cause subgraph failure - they're logged and retried later (#5972)
- Better error messages for:
Performance
Operational
- Pruning status history limited to last 5 runs per deployment (configurable via
GRAPH_STORE_HISTORY_KEEP_STATUS) (#5949) - Deployments being pruned are properly handled during concurrent operations
- Subgraph reassignment now shows the current node assignment (be6c9402)
- CLI accepts bare numeric deployment IDs in all
graphmancommands (#5954) - Removed Ganache-specific chain handling - cleans up obsolete code (#5975)
Bug Fixes
- Fixed VID sequence naming to comply with PostgreSQL 63-character limit (a322a634)
- Fixed pruning of tables with VID sequences using CASCADE drops (#5968)
- PostgreSQL unique constraint violations now lead to deterministic subgraph failures (#5943)
- Fixed various edge cases in error classification (#5943)
- Fixed numerical precision issues with large VID values (#5970)
Configuration Changes
New Environment Variables
GRAPH_IPFS_MAX_ATTEMPTS- Maximum IPFS retry attempts (default: 100,000)GRAPH_IPFS_REQUEST_TIMEOUT- IPFS request timeout in secondsGRAPH_STORE_BATCH_TIMEOUT- Timeout for batch operations like pruningGRAPH_STORE_HISTORY_KEEP_STATUS- Number of pruning status records to keep (default: 5)GRAPH_STORE_PRUNE_DISABLE_RANGE_BOUND_ESTIMATION- Disable new pruning estimation method (temporary compatibility flag)GRAPH_STORE_ERRORS_ARE_NON_DETERMINISTIC- Revert to treating all errors as non-deterministic (temporary compatibility flag)
Contributors
Thanks to @lutter, @incrypto32, @zorancv, @shiyasmohd, @encalypto, @dwerner, @rotarur, and all other contributors for their work on this release.
Full changelog: v0.38.0...v0.39.0