Releases: enviodev/hyperindex
v3.2.1
What's Changed
- Improve
envio initUX for agents and non-interactive mode by @DZakh in #1323 - Validate ClickHouse nullable array fields during schema parsing by @DZakh in #1325
- Handle non-entity table loads in TestIndexer by @DZakh in #1324
- Remove deprecated subgraph migration feature by @DZakh in #1326
- Improve indexing performance with topic filtering by addresses by @DZakh in #1329
Full Changelog: v3.2.0...v3.2.1
v3.2.0
What's Changed
Filter by multiple fields with getWhere 🔭
await context.Account.getWhere({
id: {
_eq: "0x123...",
},
balance: {
_gte: 1_000_000n,
_lte: 10_000_000n,
},
});Additionally, we noticeably improved the performance of getWhere with a single _eq or _in filter by optimizing the number of round trips to the database.
By @DZakh in #1303, #1306, #1310, #1313, #1316, #1315, #1318, #1317, #1320
Multi-storage improvements 🫙
Now it's possible to mark storages as default to automatically assign an entity to the storage. It allows you not to set @storage attribute for every entity in schema.graphql and only use it as a default overwrite.
storage:
postgres:
default: true
clickhouse:
default: trueColumn Name Format 💄
Configure automatic conversion for column names in your database to snake_case. It only affects the underlying database, so GraphQL and handler types will preserve the original names derived from schema.graphql.
storage:
postgres:
column_name_format: snake_caseMore Experimental Solana Features 🤐
We added support for HyperSync-powered instruction handlers. Reach out to us if you're interested in becoming an early tester.
By @JasoonS and @DZakh in #1287, #1301, #1307, #1309, #1314
Critical Bug Fixes 🚨
- Fix critical bugs causing an indexer crash introduced by v3.1
- Handle missing transaction data as retryable RPC errors - previously it would incorrectly disable the source by @DZakh in #1304
- Make config path root-relative in start command by @DZakh in #1296
- Validate duplicate addresses in config at parse time by @DZakh in #1311
Internal Work 🧹
- Chore, refactoring and other fun things by @DZakh #1290,
#1295, #1291, #1293, #1294, #1299, #1302, #1308, #1319
Full Changelog: v3.1.2...v3.2.0
v3.1.2
v3.1.1
v3.1.0
What's Changed
2x Cheaper And 2.5x Faster 📈
We are yet to reach our full potential. And the new HyperIndex release comes with a nice improvement: it requires up to 2x fewer HyperSync queries for backfill and is 2.5x faster in many indexing cases.
By @DZakh in #1212, #1235, #1244, #1247, #1246, #1243, #1248, #1250, #1256, #1258, #1263, #1264, #1265, #1266, #1267, #1269
Descriptions On Entities, Fields, And Relationships 📝
Describe your entities, fields, and relationships in the schema.graphql file, so that they are exposed in the GraphQL API.
# Hash comments are ignored by the GraphQL parser and should NOT appear
# in introspection. Only string descriptions ("""...""" or "...") are exposed.
"An on-chain account participating in transfers"
type Account {
"The account's Ethereum address"
id: ID!
"All transfers sent from this account"
outgoing: [Transfer!]! @derivedFrom(field: "from")
}Improve Agentic Indexer Development Experience 🤖
- Add
envio tools search-docs <query>subcommand by @DZakh in #1237 - Add
envio tools fetch-docs <url>subcommand by @DZakh in #1237 - Add
envio metrics runtimesubcommand by @DZakh in #1281 - Clean up skills provided by
envio initandenvio skills updateby @DZakh in #1234
Rate-Limit Info In TUI And Logs ℹ️
Improve HyperSync rate-limit handling by showing rate-limit information in TUI and logs.
Skip Chains From Indexing ⏭️
Excludes the chain from indexing and migrations by adding the skip field to the chain in the config.yaml file.
🚧 This is an advanced feature. For testing, prefer a test framework instead.
chains:
- id: 1
skip: trueFix Indexer Startup With 4.5M+ Contracts ⛰️
Other Fixes And Improvements 🔧
- Remove unnecessary height polling when buffer reached the head, but events are still unprocessed by @DZakh in #1230
- Remove cargo-cache action from publishing workflow to avoid potential exploitation by @DZakh in #1231
- Remove ordered multichain internal implementation by @DZakh in #1233
- Remove HyperSync chain tier tracking by @DZakh in #1236
- Improve HyperIndex contributing experience by @DZakh in #1251, #1253
- Simplify ERC20 template by removing unnecessary toString() calls by @DZakh in #1252
- Persist all entity history changes to ClickHouse (note: this is internal implementation details and will change in the future) by @DZakh in #1257
- Fix DDOS from height polling triggered by stale SSE connections by @JonoPrest in #1271, #1272
Full Changelog: v3.0.2...v3.1.0
v3.1.0-rc.2
What's Changed
Full Changelog: v3.1.0-rc.1...v3.1.0-rc.2
v3.1.0-rc.1
What's Changed
- Handle memory limit exceeded by dropping batch writes by @DZakh in #1267
- Handle HyperSync rate limits in SourceManager with no internal sleep by @DZakh in #1268
- Fix stale SSE heights spawning concurrent /height polls by @JonoPrest in #1271
- Move HyperSync getHeight to the Rust hypersync client by @DZakh in #1272
Full Changelog: v3.1.0-rc.0...v3.1.0-rc.1
v3.1.0-rc.0
What's Changed
- Embed HyperSync client into envio NAPI addon by @DZakh in #1212
- Fix polling stall when buffer is at head but events unprocessed by @DZakh in #1230
- Remove cargo-cache action from build-platforms workflow by @DZakh in #1231
- Add support for descriptions on entities, fields, and relationships by @DZakh in #1181
- Add skip field to exclude chains from indexing by @DZakh in #1232
- Remove ordered multichain mode support by @DZakh in #1233
- Remove migrate-from-subgraph skill; add indexer-troubleshooting by @DZakh in #1234
- Remove chain tier tracking from network validation by @DZakh in #1236
- Add tools command for searching and fetching Envio docs by @DZakh in #1237
- Refactor event decoding to use native Rust decoder with param metadata by @DZakh in #1235
- Make InMemoryStore a per-indexer singleton by @DZakh in #1244
- Move writeBatch/prepareRollbackDiff onto InMemoryStore by @DZakh in #1247
- Move event decoding into HyperSync client initialization by @DZakh in #1246
- Refactor reorg detection to accept block hashes dict instead of structured guard by @DZakh in #1243
- Remove generic type parameters from Entity and related types by @DZakh in #1248
- Refactor InMemoryTable to use dict instead of custom table type by @DZakh in #1250
- Remove helpers package and inline ChainMocking into test_codegen by @DZakh in #1251
- Relax ReScript compiler warnings and remove unused variable by @DZakh in #1253
- Simplify ERC20 template by removing unnecessary toString() calls by @DZakh in #1252
- Refactor rollback handling to track both target and diff checkpoints by @DZakh in #1256
- Persist all entity history changes to ClickHouse by @DZakh in #1257
- Fix indexer startup failure with large dynamic contract sets by @DZakh in #1259
- Refactor InMemoryTable entity storage to track changes by @DZakh in #1258
- Preserve committed entities across batches without rewriting history by @DZakh in #1263
- Move committedCheckpointId from ChainManager to InMemoryStore by @DZakh in #1264
- Simplify InMemoryTable by removing generic wrapper by @DZakh in #1265
- Track entity changes count to size in-memory store without scanning by @DZakh in #1266
Full Changelog: v3.0.2...v3.1.0-rc.0
v3.0.2
What's Changed
Agentic mode in envio init with AI-readable prompts
We fixed envio init to better work for agents. Now it'll produce a guiding output instead of a TTY error and a need to perform a web search for Envio docs.
Now running envio init by your agent will greet you with:
Welcome to Envio Indexer! Let's set up an indexer that will become a reliable blockchain backend you trust, love, and own.
Leave the rest to your favorite agent:
1. Prompt the user for the project intent if it is missing from context (what should the indexer track and surface?).
2. Determine the chain, contract, and addresses needed to produce that result. Use web search or block-explorer tool calls when the user hasn't supplied them.
3. To continue, call:
pnpx envio init contract-import explorer \
-n ${indexer-name} \
-c ${address} \
-b ${chainId} \
--single-contract \
--all-events \
-d ${directory}
Then `cd ${directory}` and run `pnpm test`. Don't hand the project off yet — keep iterating on the indexer with a TDD loop (extend tests, run them, fix handlers) until the user's goal is met.
Other Fixes
- Fix
raw_eventswrite for indexers with a tuple param in an event signature by @DZakh in #1220 - Add Etherlink, Katana, and Tempo chains to the supported chains list by @nikbhintade in #1219
- Fix health check when HyperSync API has chains missing from the supported chains list by @nikbhintade in #1223
Full Changelog: v3.0.1...v3.0.2
v3.0.1
What's Changed
- Fix crash when setting entity with omitted nullable FK after getWhere by @DZakh in #1208
- Fix named tuple components support in config.yaml event signatures by @DZakh in #1211
- Improve config incompatibility messaging with tiered diffs and recommendation options by @DZakh in #1210
Full Changelog: v3.0.0...v3.0.1