<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by ENVIO on Medium]]></title>
        <description><![CDATA[Stories by ENVIO on Medium]]></description>
        <link>https://medium.com/@envio_indexer?source=rss-a7ecef0aa960------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*VIXAUI73BxVnKKTGlvGLnA.png</url>
            <title>Stories by ENVIO on Medium</title>
            <link>https://medium.com/@envio_indexer?source=rss-a7ecef0aa960------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 01:43:03 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@envio_indexer/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Envio vs The Graph]]></title>
            <link>https://medium.com/@envio_indexer/envio-vs-the-graph-3ae91f3f03c7?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/3ae91f3f03c7</guid>
            <category><![CDATA[the-graph-protocol]]></category>
            <category><![CDATA[blockchain-development]]></category>
            <category><![CDATA[subgraph]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <category><![CDATA[data-indexing]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Fri, 10 Jul 2026 00:00:32 GMT</pubDate>
            <atom:updated>2026-07-13T13:19:45.178Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Ci7fx3xTlifHsspA.png" /></figure><p>TL;DR</p><ul><li>Envio HyperIndex and The Graph take different approaches to indexing EVM data. This is a sourced, head-to-head comparison of the two.</li><li>Sync speed is the clearest gap. In the independent <a href="https://docs.envio.dev/docs/HyperIndex/benchmarks">Sentio benchmark</a>, HyperIndex finished the Uniswap V2 Factory workload in 8 seconds against 19 minutes for The Graph, 142x faster.</li><li>HyperIndex handlers are standard TypeScript in Node with any npm package. The Graph uses AssemblyScript compiled to WebAssembly.</li><li>HyperIndex indexes every chain from one config.yaml. The Graph deploys one subgraph per chain.</li><li>If you do decide to switch, migration is a <a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">documented flow</a>, your existing subgraph queries keep working through Envio’s query converter, and teams like Katana, Revert Finance, and Sablier have already moved. For the wider field, see <a href="https://docs.envio.dev/blog/best-blockchain-indexers-2026">Best Blockchain Indexers in 2026</a>.</li></ul><p>Most teams reach for The Graph first, because subgraphs are the incumbent way to index EVM data, the approach most developers already know. The questions tend to start later, when syncs drag, a schema change means a long backfill, or you need the same data across several chains. That is usually when Envio HyperIndex comes up.</p><p>This is a direct comparison of the two. We put them head to head on what actually separates them, sync speed, the language you write handlers in, multichain support, and reorg handling, then cover what switching involves. For the wider field of indexers, our <a href="https://docs.envio.dev/blog/best-blockchain-indexers-2026">2026 indexer comparison</a> ranks Envio, The Graph, Goldsky, SubQuery, Subsquid, Ormi, and Ponder side by side.</p><h3>Sync Speed</h3><p>Speed is the clearest difference, and it is well documented. HyperIndex pulls data through <a href="https://docs.envio.dev/docs/HyperSync/overview">HyperSync</a>, Envio’s Rust data engine, which delivers up to 2000x faster data access than standard RPC. HyperIndex can also index over a standard RPC endpoint, either for chains HyperSync does not yet support or if you would rather not use it. The Graph reads through standard RPC only.</p><p>In the independent Sentio Uniswap V2 Factory benchmark, HyperIndex finished in 8 seconds against 19 minutes for The Graph, 142x faster. On the Sentio LBTC workload, it finished in 3 minutes against 3 hours 9 minutes. Full methodology is on the <a href="https://docs.envio.dev/docs/HyperIndex/benchmarks">benchmarks page</a>, with the raw runs in the <a href="https://github.com/enviodev/open-indexer-benchmark">open-indexer-benchmark repo</a>. Fast sync matters beyond backfills, because a schema change means re-syncing in hours rather than days.</p><h3>Handler Language, TypeScript vs AssemblyScript</h3><p>The Graph’s mappings are written in AssemblyScript, a strict subset of TypeScript that compiles to WebAssembly. The syntax looks familiar, but the runtime is not. Standard npm packages do not run, common idioms like optional chaining and class inheritance are restricted, and numbers use AssemblyScript BigInt rather than native JS BigInt.</p><p>HyperIndex handlers are standard TypeScript executed in Node. Any npm package works, generated types come from both your GraphQL schema and your contract ABIs, and there is no WebAssembly step. For teams already writing TypeScript across their stack, this is the difference felt every day.</p><h3>Multichain Indexing</h3><p>A subgraph is deployed per chain. Indexing the same protocol on Ethereum and Base means two subgraphs, and cross-chain reads happen in your application layer.</p><p>HyperIndex declares every chain under a single chains array in one config.yaml. Adding a chain is one more entry with a chain ID and address, reusing the same contract definition and event signatures, and cross-chain queries run at the database layer behind one GraphQL endpoint. Sablier runs a single indexer across 27 chains this way.</p><p>Read more about <a href="https://docs.envio.dev/docs/HyperIndex/multichain-indexing">multichain indexing</a> in our docs.</p><h3>Reorg Handling</h3><p>Reorgs are the most common chain-level event a production indexer has to survive. On The Graph, graph-node reverts affected entities automatically when a reorg is detected, bounded by its reorg threshold and prune settings, and because each chain is its own subgraph, multichain coverage means handling that across several deployments.</p><p>HyperIndex tracks per-entity state history for every unfinalised block at the framework level, with rollback on by default. When a reorg happens, the framework rolls each entity back to its pre-reorg state and reprocesses forward against the canonical chain, then prunes history once a block finalises. No handler code is required. The details are in <a href="https://docs.envio.dev/docs/HyperIndex/reorgs-support">Reorgs Support</a>.</p><h3>Head-to-Head at a Glance</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XSeAm-rmXGGBrxTpKptkGA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/930/1*oZial837s_dhFARLJCJ8Lg.png" /></figure><p>Comparison PointEnvio HyperIndexThe GraphHandler languageTypeScript in Node, any npm packageAssemblyScript compiled to WebAssemblyMultichainEvery chain in one config.yamlOne subgraph per chainData sourceHyperSync, up to 2000x faster than RPC, or standard RPC for chains it does not coverStandard RPCReorg handlingFramework-level, rollback on by defaultAutomatic via graph-node, bounded by prune settingsQuery languageStandard GraphQL, plus a converter for subgraph queriesCustom GraphQL dialectHosted runtimeEnvio Cloud, GitHub-native deploy, or self-host via DockerSubgraph Studio and the decentralised network</p><h3>Switching From The Graph</h3><p>If the comparison points you toward Envio, moving is a <a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">documented flow</a> rather than a rewrite. It comes down to three steps, convert subgraph.yaml to config.yaml, bring your schema across (close to copy and paste, with the @entity directive removed), and port your handlers from AssemblyScript to TypeScript. Running pnpx envio init scaffolds the config and schema, your existing subgraph queries keep working through Envio&#39;s <a href="https://docs.envio.dev/docs/HyperIndex/query-conversion">query converter</a> tool, and the <a href="https://github.com/enviodev/indexer-migration-validator">Indexer Migration Validator</a> checks both endpoints field-by-field before you cut over.</p><p>Because AssemblyScript is a subset of TypeScript, most of the handler work is mechanical, which is why many teams now let an AI assistant do the rewrite. Our <a href="https://docs.envio.dev/docs/HyperIndex/migrate-with-ai">AI migration guide</a> walks Cursor or Claude Code through the port, and <a href="https://docs.envio.dev/blog/ai-subgraph-migration-hyperindex-claude">AI-Assisted Subgraph Migration with Claude</a> shows it end to end.</p><p><a href="https://docs.envio.dev/blog/case-study-katana-sushiswap">Katana</a> moved two production SushiSwap subgraphs off The Graph entity-for-entity. <a href="https://docs.envio.dev/blog/revert-finance-pancakeswap-bnb-hyperindex">Revert Finance</a> had a PancakeSwap V3 subgraph stuck at 70 percent sync on BNB Smart Chain for over two years, and HyperIndex synced it to 100 percent in 10 days across 1.7 billion events. The <a href="https://docs.envio.dev/blog/polymarket-hyperindex-case-study">Polymarket reference indexer</a> consolidated 8 subgraph domains into one indexer that synced 4 billion Polygon events in 6 days. Envio also offers full white-glove migration help.</p><h3>The Bottom Line</h3><p>For most EVM teams, HyperIndex is the stronger choice with faster syncs, TypeScript handlers, multichain from a single config, and a documented path off a subgraph. The one case where The Graph still fits is if you need to consume its existing network of public subgraphs, which is its own ecosystem. For building and running your own indexer, Envio is the better tool.</p><h3>Get Started</h3><ul><li><a href="https://docs.envio.dev/docs/HyperIndex/quickstart">HyperIndex Quickstart</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">Migrate from The Graph</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/migrate-with-ai">Migrate using AI</a></li><li><a href="https://docs.envio.dev/blog/polymarket-hyperindex-case-study">Polymarket production reference</a></li><li><a href="https://docs.envio.dev/blog/best-blockchain-indexers-2026">Best Blockchain Indexers in 2026</a></li></ul><h3>Frequently Asked Questions</h3><h3>Do My Existing Subgraph GraphQL Queries Work After Switching to Envio?</h3><p>You do not have to rewrite them by hand. HyperIndex serves standard GraphQL rather than The Graph’s dialect, and Envio provides a <a href="https://docs.envio.dev/docs/HyperIndex/query-conversion">query converter tool and conversion guide</a> to translate existing subgraph queries. After switching, the <a href="https://github.com/enviodev/indexer-migration-validator">Indexer Migration Validator</a> compares your new endpoint against the original subgraph field-by-field so you can confirm the data matches before cutting over.</p><h3>Can I Keep My Subgraph Schema When Moving to HyperIndex?</h3><p>Largely yes. Schema migration is close to copy and paste. You remove the @entity directive, and there are small nuances around enums and BigDecimals documented in the <a href="https://docs.envio.dev/docs/HyperIndex/schema">schema docs</a>. HyperIndex generates its types from the same GraphQL schema and your contract ABIs, so entity definitions and relationships carry across with minimal rework.</p><h3>How Long Does a The Graph to Envio Migration Take?</h3><p>It depends on handler complexity, but the shape is fixed at three steps, config, schema, and handlers. Pure handler logic often copies straight across because AssemblyScript is a subset of TypeScript, and pnpx envio init scaffolds the config and schema for you. Teams also use <a href="https://docs.envio.dev/docs/HyperIndex/migrate-with-ai">AI-assisted migration</a> for the rewrite, and Envio offers white-glove help via <a href="https://discord.gg/envio">Discord</a>.</p><h3>Can One Envio Indexer Replace Several Per-Chain Subgraphs?</h3><p>Yes, and it is a common outcome. Because every chain lives in one config.yaml, teams routinely consolidate multiple subgraph deployments into a single indexer. Sablier replaced 12 deployments with one indexer across 27 chains, and the <a href="https://docs.envio.dev/blog/polymarket-hyperindex-case-study">Polymarket reference</a> unified 8 subgraph domains into one indexer syncing 4 billion events in 6 days.</p><h3>Does Moving to Envio Mean I Lose Access to The Graph’s Public Subgraphs?</h3><p>Yes, and that is the main reason to stay on The Graph. Its decentralised network hosts the largest set of community-maintained subgraphs for major protocols. Envio indexes your own contracts into your own schema, so if your dependency is on consuming those public subgraphs rather than running your own indexer, The Graph is still the right home for that.</p><h3>Is HyperIndex Faster Than The Graph in Independent Benchmarks?</h3><p>Yes. In the independent Sentio Uniswap V2 Factory benchmark, HyperIndex finished in 8 seconds against 19 minutes for The Graph, 142x faster, and on the Sentio LBTC workload it finished in 3 minutes against 3 hours 9 minutes. The gap comes from HyperSync, Envio’s Rust data engine, which delivers up to 2000x faster data access than the standard RPC that The Graph reads through. Full methodology is on the <a href="https://docs.envio.dev/docs/HyperIndex/benchmarks">benchmarks page</a> and the raw runs are in the <a href="https://github.com/enviodev/open-indexer-benchmark">open-indexer-benchmark repo</a>.</p><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use Envio Cloud or self-host. If you’re building onchain, come talk to us about your data needs.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a> 💌</p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/envio-vs-the-graph"><em>https://docs.envio.dev</em></a><em> on July 10, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3ae91f3f03c7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Build an Open Source RWA Stablecoin Dashboard | Envio]]></title>
            <link>https://medium.com/@envio_indexer/how-to-build-an-open-source-rwa-stablecoin-dashboard-envio-90a594dde226?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/90a594dde226</guid>
            <category><![CDATA[rwa-real-world-assets]]></category>
            <category><![CDATA[stable-coin]]></category>
            <category><![CDATA[blockchain-indexer]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <category><![CDATA[rwa]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Fri, 10 Jul 2026 00:00:01 GMT</pubDate>
            <atom:updated>2026-07-13T13:15:18.993Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GWCvFYCgDHIjSlUG.png" /></figure><p>TL;DR</p><ul><li>The RWA dashboard is open source and backed by an indexer you can run yourself, starting with stablecoins, with the live dashboard at rwaradar.io.</li><li>On the stablecoin side it surfaces total supply, transfer count, transfer amount and volume, mint and burn amounts, and daily snapshots of each.</li><li>Every metric falls out of Transfer events, since mints and burns show up as transfers to and from the zero address.</li><li>USDT is the exception, so the indexer reads its Issue and Redeem events directly for clean mint and burn numbers.</li><li>The transfer and mint/burn logic lives in shared handlers, so every token reuses the same paths.</li></ul><p>Real-world assets have gone from a niche thing a few companies were poking at to one of the biggest sectors in crypto over the last few years. This post isn’t a market take, though. At Envio, my job is to build technical demos that actually use our products, so I decided to build something real, an open-source RWA dashboard backed by a HyperIndex metrics indexer you can run yourself. If you want to check whether the data lines up, or you want to build something similar, the whole thing is there to fork.</p><h3>Why stablecoins first</h3><p>RWA is a huge bucket, so I had to pick a starting point. Stablecoins were the obvious one.</p><p>The goal for the stablecoin side of the dashboard is to surface the metrics that actually tell you something. Total supply, transfer count, transfer amount and volume, mint and burn amounts, and daily snapshots of all of it. Nothing exotic, just the numbers you’d want if you were tracking how a stablecoin is actually being used onchain.</p><p>Now that we’ve covered what the dashboard is supposed to do, let’s get into the indexer and the logic behind it. That’s the part that matters.</p><h3>The indexer</h3><h3>Wiring up the handlers</h3><p>I’m tracking a set of major stablecoins across a dozen chains to start. The full list lives in the <a href="https://github.com/enviodev/rwa/blob/main/indexers/rwa-tokens/config.yaml">config.yaml</a> if you want to see exactly which ones.</p><p>For most of them, tracking Transfer events is enough. Every metric we care about falls out of transfers, including mints and burns, since those show up as transfers from or to the zero address. USDT is the exception. Its issue and redeem don&#39;t emit Transfers, so the indexer tracks its Issue and Redeem events directly. Bridged USDT on other chains does emit zero-address Transfers, so the Transfer handler covers it.</p><pre>indexer.onEvent(<br>  { contract: &quot;Stablecoins&quot;, event: &quot;Transfer&quot; },<br>  async ({ event, context }) =&gt; {<br>    await handleTransfer(event, context);<br>  },<br>);</pre><pre>indexer.onEvent(<br>  { contract: &quot;USDT&quot;, event: &quot;Transfer&quot; },<br>  async ({ event, context }) =&gt; {<br>    await handleTransfer(event, context);<br>  },<br>);</pre><pre>indexer.onEvent(<br>  { contract: &quot;USDT&quot;, event: &quot;Issue&quot; },<br>  async ({ event, context }) =&gt; {<br>    await handleSupplyChange(event, context, &quot;mint&quot;);<br>  },<br>);</pre><pre>indexer.onEvent(<br>  { contract: &quot;USDT&quot;, event: &quot;Redeem&quot; },<br>  async ({ event, context }) =&gt; {<br>    await handleSupplyChange(event, context, &quot;burn&quot;);<br>  },<br>);</pre><p>The point of pulling the logic out into handleTransfer and handleSupplyChange is reuse. Every token shares the same transfer logic, and the mint/burn path is shared too. The handlers themselves stay thin and just call into the abstracted functions.</p><h3>handleTransfer</h3><p>This is the workhorse. It updates everything tied to a transfer.</p><p>First it does the fetching and parsing. It pulls the event params to derive the IDs, and grab the current state of the entities it’s about to touch.</p><pre>async function handleTransfer(<br>  event: {<br>    chainId: number;<br>    srcAddress: string;<br>    block: { timestamp: number };<br>    params: { from: string; to: string; value: bigint };<br>  },<br>  context: EvmOnEventContext,<br>) {<br>  const { from, to, value } = event.params;<br>  const chainId = event.chainId;<br>  const tokenAddress = event.srcAddress;<br>  const timestamp = event.block.timestamp;<br>  const currentDayId = Math.floor(timestamp / 86400);<br>  const midnightTimestamp = currentDayId * 86400;</pre><pre>  const isMint = from === ZERO_ADDRESS;<br>  const isBurn = to === ZERO_ADDRESS;</pre><pre>  const tokenId = `${chainId}_${tokenAddress}`;<br>  const dayDataId = `${tokenId}_${currentDayId}`;<br>  const fromBalanceId = `${tokenId}_${from}`;<br>  const toBalanceId = `${tokenId}_${to}`;<br>  const activeAddrId = `${tokenId}_${currentDayId}_${from}`;</pre><pre>  const [<br>    existingToken,<br>    existingDayData,<br>    fromBalance,<br>    toBalance,<br>    existingActiveAddr,<br>  ] = await Promise.all([<br>    context.Token.get(tokenId),<br>    context.TokenDayData.get(dayDataId),<br>    !isMint<br>      ? context.HolderBalance.get(fromBalanceId)<br>      : Promise.resolve(undefined),<br>    !isBurn<br>      ? context.HolderBalance.get(toBalanceId)<br>      : Promise.resolve(undefined),<br>    !isMint<br>      ? context.DailyActiveAddress.get(activeAddrId)<br>      : Promise.resolve(undefined),<br>  ]);</pre><pre>  // continue the snapshot logic<br>}</pre><p>The snapshot logic is where the only real trick is. Blocks give us a UTC timestamp, so to know whether a transfer belongs to a new day we just check whether its timestamp crossed midnight relative to the last day I recorded. If it’s a new day, I start tracking a fresh TokenDayData entity. Everything else is the same shape as before: if it&#39;s a mint, bump supply up; if it&#39;s a burn, bump it down.</p><pre>const lastDayId = existingToken?.lastDayId ?? currentDayId;<br>const isNewDay = currentDayId &gt; lastDayId;</pre><pre>if (isNewDay) {<br>  const stale = await context.DailyActiveAddress.getWhere({<br>    token_id: { _eq: tokenId },<br>  });<br>  for (const entry of stale) {<br>    context.DailyActiveAddress.deleteUnsafe(entry.id);<br>  }<br>}</pre><pre>const isNewActiveAddr = !isMint &amp;&amp; (isNewDay || !existingActiveAddr);</pre><pre>let newTotalSupply = existingToken?.totalSupply ?? 0n;<br>if (isMint) newTotalSupply += value;<br>if (isBurn) newTotalSupply -= value;</pre><pre>context.Token.set({<br>  id: tokenId,<br>  chainId,<br>  address: tokenAddress,<br>  totalSupply: newTotalSupply,<br>  lastDayId: currentDayId,<br>});</pre><pre>context.TokenDayData.set({<br>  id: dayDataId,<br>  token_id: tokenId,<br>  chainId,<br>  date: midnightTimestamp,<br>  dailyTotalSupply: newTotalSupply,<br>  dailyMintAmount:<br>    (existingDayData?.dailyMintAmount ?? 0n) + (isMint ? value : 0n),<br>  dailyBurnAmount:<br>    (existingDayData?.dailyBurnAmount ?? 0n) + (isBurn ? value : 0n),<br>  dailyTransferAmount: (existingDayData?.dailyTransferAmount ?? 0n) + value,<br>  dailyTransferCount: (existingDayData?.dailyTransferCount ?? 0) + 1,<br>  dailyActiveAddresses:<br>    (existingDayData?.dailyActiveAddresses ?? 0) + (isNewActiveAddr ? 1 : 0),<br>});</pre><pre>if (!isMint) {<br>  context.HolderBalance.set({<br>    id: fromBalanceId,<br>    token_id: tokenId,<br>    chainId,<br>    holder: from,<br>    balance: (fromBalance?.balance ?? 0n) - value,<br>    firstTransferTimestamp:<br>      fromBalance?.firstTransferTimestamp ?? BigInt(timestamp),<br>    lastTransferTimestamp: BigInt(timestamp),<br>  });<br>}</pre><pre>if (!isBurn) {<br>  context.HolderBalance.set({<br>    id: toBalanceId,<br>    token_id: tokenId,<br>    chainId,<br>    holder: to,<br>    balance: (toBalance?.balance ?? 0n) + value,<br>    firstTransferTimestamp:<br>      toBalance?.firstTransferTimestamp ?? BigInt(timestamp),<br>    lastTransferTimestamp: BigInt(timestamp),<br>  });<br>}</pre><pre>if (isNewActiveAddr) {<br>  context.DailyActiveAddress.set({<br>    id: activeAddrId,<br>    token_id: tokenId,<br>    chainId,<br>    date: currentDayId,<br>    address: from,<br>  });<br>}</pre><p>One thing worth calling out: on a new day I clear out the stale DailyActiveAddress entries for the token. Active addresses are a per-day count, so they don&#39;t carry over. Skipping mint senders from the active-address count is deliberate too, since the zero address isn&#39;t a real participant.</p><h3>handleSupplyChange</h3><p>This one only exists for USDT’s Issue and Redeem. The logic is mostly a slimmer version of handleTransfer, with one extra input, direction. The events themselves just hand you an amount, so the handler is the thing that decides whether it&#39;s a mint or a burn and passes that down.</p><pre>async function handleSupplyChange(<br>  event: {<br>    chainId: number;<br>    srcAddress: string;<br>    block: { timestamp: number };<br>    params: { amount: bigint };<br>  },<br>  context: EvmOnEventContext,<br>  direction: &quot;mint&quot; | &quot;burn&quot;,<br>) {<br>  const { amount } = event.params;<br>  const chainId = event.chainId;<br>  const tokenAddress = event.srcAddress;<br>  const timestamp = event.block.timestamp;<br>  const currentDayId = Math.floor(timestamp / 86400);<br>  const midnightTimestamp = currentDayId * 86400;</pre><pre>  const tokenId = `${chainId}_${tokenAddress}`;<br>  const dayDataId = `${tokenId}_${currentDayId}`;</pre><pre>  const [existingToken, existingDayData] = await Promise.all([<br>    context.Token.get(tokenId),<br>    context.TokenDayData.get(dayDataId),<br>  ]);</pre><pre>  const lastDayId = existingToken?.lastDayId ?? currentDayId;<br>  const isNewDay = currentDayId &gt; lastDayId;</pre><pre>  if (isNewDay) {<br>    const stale = await context.DailyActiveAddress.getWhere({<br>      token_id: { _eq: tokenId },<br>    });<br>    for (const entry of stale) {<br>      context.DailyActiveAddress.deleteUnsafe(entry.id);<br>    }<br>  }</pre><pre>  let newTotalSupply = existingToken?.totalSupply ?? 0n;<br>  if (direction === &quot;mint&quot;) newTotalSupply += amount;<br>  else newTotalSupply -= amount;</pre><pre>  context.Token.set({<br>    id: tokenId,<br>    chainId,<br>    address: tokenAddress,<br>    totalSupply: newTotalSupply,<br>    lastDayId: currentDayId,<br>  });</pre><pre>  context.TokenDayData.set({<br>    id: dayDataId,<br>    token_id: tokenId,<br>    chainId,<br>    date: midnightTimestamp,<br>    dailyTotalSupply: newTotalSupply,<br>    dailyMintAmount:<br>      (existingDayData?.dailyMintAmount ?? 0n) +<br>      (direction === &quot;mint&quot; ? amount : 0n),<br>    dailyBurnAmount:<br>      (existingDayData?.dailyBurnAmount ?? 0n) +<br>      (direction === &quot;burn&quot; ? amount : 0n),<br>    dailyTransferAmount: existingDayData?.dailyTransferAmount ?? 0n,<br>    dailyTransferCount: existingDayData?.dailyTransferCount ?? 0,<br>    dailyActiveAddresses: existingDayData?.dailyActiveAddresses ?? 0,<br>  });<br>}</pre><p>Notice it leaves the transfer fields untouched and only moves supply, mint, and burn. Issue and Redeem aren’t transfers, so they shouldn’t inflate transfer counts.</p><h3>What’s next</h3><p>That’s the first step of the RWA dashboard, one indexer, with the logic and setup laid out. Tokenised US Treasuries, with NAV and yield tracking, are already in the same indexer, and I’ll walk through those next.</p><p>If you want to dig into the code, the <a href="https://github.com/enviodev/rwa/tree/main/indexers/rwa-tokens">stablecoins indexer is here</a>, and the live dashboard is at <a href="https://rwaradar.io/">rwaradar.io</a>. If you’re building in the RWA space and want to compare notes, reach out.</p><h3>Frequently Asked Questions</h3><h3>How does the indexer track stablecoin mints and burns?</h3><p>For most of the stablecoins, tracking Transfer events is enough. Mints and burns fall out of transfers, since they show up as transfers from or to the zero address, so total supply moves up on a mint and down on a burn without needing dedicated events.</p><h3>Why is USDT handled differently from the other stablecoins?</h3><p>USDT is the exception. To get clean mint and burn numbers for it, the indexer tracks its Issue and Redeem events directly through handleSupplyChange, which reads the amount and decides whether it’s a mint or a burn. It leaves the transfer fields untouched and only moves supply, mint, and burn, since Issue and Redeem aren’t transfers and shouldn’t inflate transfer counts.</p><h3>How does the indexer decide when a new day begins for the snapshots?</h3><p>Blocks give a UTC timestamp, so the handler checks whether a transfer’s timestamp crossed midnight relative to the last day it recorded, deriving the current day as Math.floor(timestamp / 86400). When it’s a new day, it starts tracking a fresh TokenDayData entity.</p><h3>Why are mint senders skipped in the daily active address count?</h3><p>Active addresses are a per-day count, so they don’t carry over, and on a new day the stale entries for the token are cleared. Mint senders are skipped deliberately, since a mint comes from the zero address, which isn’t a real participant and would otherwise misrepresent daily activity.</p><h3>Why are handleTransfer and handleSupplyChange pulled into shared functions?</h3><p>The point is reuse. Every token shares the same transfer logic, and the mint and burn path is shared too, so the event handlers stay thin and just call into the abstracted functions.</p><h3>What metrics does the stablecoin dashboard surface?</h3><p>It surfaces total supply, transfer count, transfer amount and volume, mint and burn amounts, and daily snapshots of all of it, which are the numbers that show how a stablecoin is actually being used onchain.</p><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use Envio Cloud or self-host. If you’re building onchain, come talk to us about your data needs.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a></p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/how-to-build-rwa-dashboard"><em>https://docs.envio.dev</em></a><em> on July 10, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=90a594dde226" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Stream Onchain Events to an AI Trading Agent]]></title>
            <link>https://medium.com/@envio_indexer/how-to-stream-onchain-events-to-an-ai-trading-agent-ed60828f72b8?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/ed60828f72b8</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[envios]]></category>
            <category><![CDATA[indexing]]></category>
            <category><![CDATA[ai-agent-development]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Wed, 01 Jul 2026 00:00:43 GMT</pubDate>
            <atom:updated>2026-07-03T11:47:41.532Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*1lMfSruEV7ZbSheh.png" /></figure><p><strong>TL;DR</strong></p><ul><li>A trading agent is only as good as its feed. It needs a data source that is as fast and as accurate as possible, including staying correct through reorgs. Raw RPC gives you none of that out of the box.</li><li>One layer does the work. HyperIndex indexes onchain events into GraphQL entities, and it ingests through HyperSync internally with reorg detection built in, so you get speed and rollback safety from a single layer.</li><li>HyperIndex exposes a single GraphQL endpoint. The agent polls it for new events as they land, and queries the same endpoint for historical state: an address’s track record, a market’s running volume, open positions. No rebuilding history inside the context window.</li><li>Reorgs are a normal part of consensus. HyperIndex rolls entity state back automatically when a chain reorgs, but state at the very head is provisional, so for anything that moves money, the conservative path is to act on events from finalized blocks.</li><li>The schema and queries below come from the published Polymarket reference indexer.</li></ul><p>The interesting question about AI trading agents is not the model, it is the feed. An agent reasoning over markets needs to see events with as little latency as possible after they land onchain, in a shape it can reason about, from a source it can trust after a reorg. This guide builds that feed with one layer, then shows where the agent plugs in.</p><h3>The Architecture in One Paragraph</h3><p>One layer, accessed two ways. HyperIndex turns a contract’s events into structured entities served over GraphQL. Under the hood, it streams from HyperSync for fast ingestion, while HyperIndex detects reorgs and rolls entity state back when one happens. The agent talks to a single GraphQL endpoint: it polls for new trades as they land, and queries the same endpoint for state, market totals, an address’s history, and open positions. There is no separate ingestion pipeline to run and no in-memory state to rebuild.</p><h3>Step 1: Index the events once</h3><p>This is the indexing setup from our <a href="https://github.com/enviodev/polymarket-indexer">Polymarket reference indexer</a>, which watches OrderFilled events from the Polymarket Exchange contracts on Polygon. You define the contract and event once in config.yaml:</p><pre># yaml-language-server: $schema=./node_modules/envio/evm.schema.json<br>name: polymarket-indexer<br>field_selection:<br>  transaction_fields:<br>    - hash<br>contracts:<br>  - name: Exchange<br>    abi_file_path: ./abis/Exchange.json<br>    events:<br>      - event: &quot;OrderFilled(bytes32 indexed orderHash, address indexed maker, address indexed taker, uint256 makerAssetId, uint256 takerAssetId, uint256 makerAmountFilled, uint256 takerAmountFilled, uint256 fee)&quot;<br>chains:<br>  - id: 137 # Polygon<br>    start_block: 33605403<br>    contracts:<br>      - name: Exchange<br>        address:<br>          - &quot;0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E&quot;<br>          - &quot;0xC5d563A36AE78145C45a50134d48A1215220f80a&quot;</pre><p>You define the entities once in schema.graphql. One entity for the raw trade the agent reacts to, one aggregate the agent reads for context:</p><pre>type OrderFilledEvent<br>  @index(fields: [&quot;maker&quot;, [&quot;timestamp&quot;, &quot;DESC&quot;]])<br>  @index(fields: [&quot;makerAssetId&quot;, [&quot;timestamp&quot;, &quot;DESC&quot;]]) {<br>  id: ID!<br>  transactionHash: String!<br>  timestamp: BigInt! @index<br>  orderHash: String! @index<br>  maker: String! @index<br>  taker: String! @index<br>  makerAssetId: String! @index<br>  takerAssetId: String! @index<br>  makerAmountFilled: BigInt!<br>  takerAmountFilled: BigInt!<br>  fee: BigInt!<br>}</pre><pre>type Orderbook {<br>  id: ID!<br>  tradesQuantity: BigInt!<br>  buysQuantity: BigInt!<br>  sellsQuantity: BigInt!<br>  collateralVolume: BigInt!<br>  scaledCollateralVolume: BigDecimal!<br>}</pre><p>And you map the event to those entities once in the handler. Every field comes straight off the OrderFilled event, and the running totals are computed at indexing time so the agent never has to aggregate at query time:</p><pre>import { indexer } from &quot;envio&quot;;</pre><pre>indexer.onEvent({ contract: &quot;Exchange&quot;, event: &quot;OrderFilled&quot; }, async ({ event, context }) =&gt; {<br>  context.OrderFilledEvent.set({<br>    id: `${event.chainId}_${event.block.number}_${event.logIndex}`,<br>    transactionHash: event.transaction.hash,<br>    timestamp: BigInt(event.block.timestamp),<br>    orderHash: event.params.orderHash,<br>    maker: event.params.maker,<br>    taker: event.params.taker,<br>    makerAssetId: event.params.makerAssetId.toString(),<br>    takerAssetId: event.params.takerAssetId.toString(),<br>    makerAmountFilled: event.params.makerAmountFilled,<br>    takerAmountFilled: event.params.takerAmountFilled,<br>    fee: event.params.fee,<br>  });<br>});</pre><p>The same pattern works for DEX swaps, liquidations, or any event family on any HyperSync-supported chain by changing the contract, the event signature, and the chain ID.</p><h3>Wake the agent on new trades</h3><p>A GraphQL subscription is the agent’s trigger. The agent holds an open subscription to the endpoint and gets pushed each new OrderFilledEvent as it lands, within a block of it happening, already decoded into the fields you defined:</p><pre>subscription LatestTrades {<br>  OrderFilledEvent(order_by: { timestamp: desc }, limit: 1) {<br>    maker<br>    taker<br>    makerAssetId<br>    makerAmountFilled<br>    takerAmountFilled<br>    timestamp<br>  }<br>}</pre><p>If a long-lived subscription does not fit your runtime, the same query polled on a short interval gives you the same trigger with simpler plumbing. Either way the agent reacts to structured trades, not raw logs.</p><h3>Step 2: Give the Agent State, Not Just Ticks</h3><p>A trigger tells the agent what just happened. Trading decisions usually need what has been happening, and rebuilding that from raw events inside a context window wastes tokens and invites errors. Because the handler already wrote the history and the running totals, the agent’s pre-decision check is a query, not a computation. Pull a maker’s recent track record:</p><pre>query MakerHistory($maker: String!) {<br>  OrderFilledEvent(<br>    where: { maker: { _eq: $maker } }<br>    order_by: { timestamp: desc }<br>    limit: 100<br>  ) {<br>    makerAmountFilled<br>    takerAmountFilled<br>    timestamp<br>  }<br>}</pre><p>Or read the market’s running volume straight off the aggregate, with no runtime aggregation:</p><pre>query MarketVolume {<br>  Orderbook {<br>    tradesQuantity<br>    scaledCollateralVolume<br>  }<br>}</pre><p>Computing aggregates at indexing time rather than query time is the recommended pattern, and it is what keeps these reads fast at scale. The <a href="https://docs.envio.dev/docs/HyperIndex/navigating-hasura">Navigating Hasura</a> guide covers the full query reference.</p><h3>Step 3: Take Reorgs Seriousl</h3><p>Reorgs are a normal part of consensus, not an Envio thing and not an edge case you can design away. A chain can fork at the head and resolve to a different set of blocks, and any event read from those orphaned blocks describes something that, as far as the canonical chain is concerned, never happened. This is true of every data source, raw RPC included.</p><p>HyperIndex handles the database side for you. Reorg support is on by default, and as long as HyperIndex ingests through HyperSync, reorg detection is guaranteed. When a reorg is detected, entity state is rolled back automatically to the canonical chain, with no rollback logic in your handlers. The full mechanics are in <a href="https://docs.envio.dev/docs/HyperIndex/reorgs-support">Understanding and Handling Chain Reorganizations</a>.</p><p>The caveat that matters for a trading agent is this. Rollback corrects the database, it cannot recall a trade. There is a short window at the head where the indexed state can reflect a block that later gets orphaned. An agent that reads in that window and acts on it has already sent the order by the time the rollback fires. The data corrects, the trade does not. A dashboard showing a stale number is harmless; an agent trading on one is not.</p><p>So treat the head-of-chain state as provisional. HyperIndex considers a block safe from reorganization once it sits below the confirmation threshold, which defaults to 200 blocks below the head and is configurable per chain via max_reorg_depth. For anything that moves money, the conservative path is to act on events from finalized blocks and let the freshest head data inform analysis rather than execution. None of this is specific to Envio. Any trading agent on any stack faces the same finality question, regardless of where its data comes from.</p><h3>A Note on the Trading Part</h3><p>Everything above is the data layer, and it is the part worth automating first. Order execution is where agent autonomy should stop being the default. Keep execution behind explicit limits, position caps, and human-controlled keys, and let the agent’s edge be that it sees and understands the market faster, not that it can spend unsupervised.</p><p>This blog is an example of what you can build on HyperIndex, not a trading strategy and not financial advice. Whatever you ship on top of it is your own research and your own decision.</p><h3>Get Started</h3><ul><li><a href="https://docs.envio.dev/docs/HyperIndex/quickstart">HyperIndex Quickstart</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/quickstart-with-ai">HyperIndex Quickstart with AI</a></li><li><a href="https://github.com/enviodev/polymarket-indexer">Polymarket reference indexer</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/reorgs-support">Understanding and Handling Chain Reorganizations</a></li><li><a href="https://docs.envio.dev/blog/indexing-and-reorgs">Indexing &amp; Reorgs</a></li></ul><h3>Frequently Asked Questions</h3><h3>Should my agent subscribe to the indexer or query it?</h3><p>Both, for different questions. A GraphQL subscription is the trigger that wakes the agent within a block of an event landing. A GraphQL query is the memory that answers aggregate questions like an address’s trade history or a market’s running volume without rebuilding state in the agent’s context. The stream wakes the agent, the query informs the decision, and both hit the same endpoint.</p><h3>What happens if my agent acts on an event that later gets reorged?</h3><p>That is the failure mode to design against, because the rollback fixes data but cannot recall a trade. HyperIndex rolls indexed entity state back to the canonical chain automatically when a reorg is detected, but an agent that read head-of-chain state and traded on it in the window before detection has already acted. HyperIndex considers a block safe from reorganization at a confirmation threshold that defaults to 200 blocks below the head and is configurable per chain via max_reorg_depth. For stateful actions that move money, prefer events from finalized blocks.</p><h3>What chains can I stream trading events from?</h3><p>Any HyperSync-supported network works with the same indexer and a one-line chain change in config.yaml. Chains without native HyperSync coverage are reachable through HyperIndex over standard RPC. The same schema and handler carry across chains unchanged.</p><h3>How do I handle high-frequency events without overwhelming the agent?</h3><p>Compute and store aggregates in your handlers at indexing time, then have the agent read those precomputed entities rather than fetching raw rows and summarising inside the context window. Field selection keeps each response small, and the running totals on an aggregate entity like Orderbook give the agent market context in a single cheap read.</p><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use <a href="https://docs.envio.dev/docs/HyperIndex/hosted-service">Envio Cloud</a> or self-host. If you’re building onchain, come talk to us about your data needs.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a> 💌</p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/stream-onchain-events-ai-trading-agent"><em>https://docs.envio.dev</em></a><em> on July 1, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ed60828f72b8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Envio Developer Update June 2026]]></title>
            <link>https://medium.com/@envio_indexer/envio-developer-update-june-2026-8f2e7fb45252?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/8f2e7fb45252</guid>
            <category><![CDATA[sei-network]]></category>
            <category><![CDATA[x402-protocol]]></category>
            <category><![CDATA[rwa]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <category><![CDATA[curve-finance]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Tue, 30 Jun 2026 00:00:52 GMT</pubDate>
            <atom:updated>2026-07-02T09:04:09.659Z</atom:updated>
            <content:encoded><![CDATA[<p>Author: <a href="https://docs.envio.dev/blog/author/j_o_r_d_y_s">Jordyn Laurier</a> — June 30, 20267 min read</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yhqtMxvZ625ugU5d.png" /></figure><p>June was one of our biggest months yet. HyperIndex advanced, delivering up to 2.5x faster and 2x cheaper indexing alongside multi-field getWhere filtering, multi-storage defaults, snake_case column naming, and expanded experimental Solana support. We also sponsored and attended ETHConf New York, continued migrating performance-critical paths to Rust, and saw teams ship a range of production-grade, real-time applications on Envio, spanning real-world asset tracking and x402 payment analytics.</p><p>Alongside the releases, we published new technical guides on agentic indexing, scaling subgraph-style workloads to millions of requests, choosing between HyperIndex and HyperSync, and much more.</p><p>Let’s dive in!</p><h3>HyperIndex v3.1 &amp; v3.2: Faster, Cheaper, and More Flexible</h3><p>Building on May’s V3 launch, June delivered two substantial releases focused on speed, cost, and flexibility, followed by a patch release and the start of work on v3.3.</p><h3>v3.1</h3><p>v3.1 cut HyperSync queries during backfill by up to 2x and made many indexing cases up to 2.5x faster. It also added string descriptions for entities, fields, and relationships that surface directly in the GraphQL API, rate-limit information in the TUI and logs, a skip option to exclude chains from indexing and migrations, and support for startups with 4.5M+ contracts. We also improved the agentic development experience with new envio tools search-docs and envio tools fetch-docs commands, plus an envio metrics runtime subcommand.</p><p><strong>Up to 2.5x faster indexing, with up to 2x fewer HyperSync queries during backfill.</strong></p><h3>v3.2</h3><p>v3.2 followed with multi-field filtering in getWhere, so you can match on several entity fields at once, plus a performance boost for single _eq and _in lookups. Multi-storage got easier with default storages, so you no longer need a @storage directive on every entity, and you can now auto-convert database column names to snake_case while keeping the original names in GraphQL and handler types. We also expanded experimental Solana support with HyperSync-powered instruction handlers. Reach out to us if you are interested in becoming an early tester.</p><h4>Multi-field filtering with getWhere</h4><p>Match on several entity fields at once:</p><pre>await context.Account.getWhere({<br>  id: { _eq: &quot;0x123...&quot; },<br>  balance: { _gte: 1_000_000n, _lte: 10_000_000n },<br>});</pre><h4>Multi-storage defaults</h4><p>Mark a storage as default, so you no longer need a @storage attribute on every entity in schema.graphql:</p><pre>storage:<br>  postgres:<br>    default: true<br>  clickhouse:<br>    default: true</pre><h4>snake_case column names</h4><p>Auto-convert database column names to snake_case, while GraphQL and handler types keep the original names from schema.graphql:</p><pre>storage:<br>  postgres:<br>    column_name_format: snake_case</pre><h3>v3.2.1</h3><p>v3.2.1 rounded out the month with a smoother envio init experience for agents and non-interactive runs, ClickHouse nullable array validation, and faster indexing through topic filtering by address. We have also started work on v3.3.0 in alpha, focused on faster backfills for large multichain indexers.</p><p>See the full <a href="https://github.com/enviodev/hyperindex/releases">release notes</a></p><p>Star us on <a href="https://github.com/enviodev/hyperindex">GitHub</a> ⭐</p><h3>Just-in-Time Indexing: Using Agents to Answer Onchain Questions</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Qojx-mxBLxE7il5w.png" /></figure><p>Just-in-Time Indexing shows how an AI agent can use Envio to answer one-off onchain questions without maintaining permanent infrastructure. The agent builds the indexer on demand, queries it once, and deletes it.</p><p>See how Curve Finance has been using Envio to answer one-off onchain questions with just-in-time indexing.</p><p>Read it here: <a href="https://docs.envio.dev/blog/just-in-time-indexing-agents-onchain">https://docs.envio.dev/blog/just-in-time-indexing-agents-onchain</a></p><h3>RWA Radar: Real-World Assets Onchain in Real Time</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*zLqqnTn-pu47WmRM.gif" /></figure><p>RWA Radar tracks real-world assets onchain in real time, covering stablecoins, credit, stocks, securities, and more, with sector breakdowns, volume, and history across chains in a single view, and exports to CSV, PDF, or XLSX. Ingestion is powered by HyperIndex.</p><p>Explore it here: <a href="https://rwaradar.io/">https://rwaradar.io</a></p><h3>When to Use HyperIndex vs HyperSync</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PxqdcKrPjQy-hAG4.png" /></figure><p>This guide breaks down the two layers of the Envio stack, HyperSync as the data engine and HyperIndex as the framework built on top of it, with working v3 code and production examples to help teams choose the right tool for the job.</p><p>Read the full breakdown: <a href="https://docs.envio.dev/blog/hyperindex-vs-hypersync">https://docs.envio.dev/blog/hyperindex-vs-hypersync</a></p><h3>x402stats Analytics Explorer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*I48Z5tql5xgV7Qhx.gif" /></figure><p>x402stats surfaces real-time stats for the x402 payment protocol on Base, including USDC volume, payment counts, active services, and buyers across 24h, 7d, 30d, and all-time, plus leaderboards for top services and facilitators.</p><p>Check it out here: <a href="https://x402stats.ai/">https://x402stats.ai</a></p><h3>Why Blockchain Indexers Hit Rate Limits at Scale</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oHtDC555l1E31K06.png" /></figure><p>Why Blockchain Indexers Hit Rate Limits at Scale explains why RPC-based indexers throttle, and how HyperSync’s bulk-read architecture handles high traffic, with production-scale numbers.</p><p>More here: <a href="https://docs.envio.dev/blog/hypersync-under-load-no-throttling">https://docs.envio.dev/blog/hypersync-under-load-no-throttling</a></p><h3>How to Scale Subgraphs to Millions of Requests</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ImgslK4UEXNNM6j-.png" /></figure><p>This one tackles the two halves of the problem, sync speed and query latency, and how HyperIndex handles both while keeping your data model intact.</p><p>Read the full guide: <a href="https://docs.envio.dev/blog/scale-subgraphs-millions-of-requests">https://docs.envio.dev/blog/scale-subgraphs-millions-of-requests</a></p><h3>How to Index Sei Smart Contract Data in Minutes</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*N2bnmk90VofK6kuC.png" /></figure><p>This step-by-step guide walks through indexing a Sei ERC20 contract, streaming USDC Transfer and Approval events into Postgres and serving them through a GraphQL API.</p><p>Read the tutorial: <a href="https://docs.envio.dev/blog/index-sei-smart-contracts-envio">https://docs.envio.dev/blog/index-sei-smart-contracts-envio</a></p><h3>ETHConf New York</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*400f2IgEZeG9PvWs.png" /></figure><p>We sponsored ETHConf in New York from June 8th to 10th. The team set up a booth, handed out the (back by popular demand) “low maintenance” caps and fresh stickers, and spent the week talking fast indexing, HyperSync, and pulling onchain data without the wait.</p><p>Thank you to the ETHGlobal and ETHConf teams for having us, and to everyone who stopped by to talk data.</p><h3>Featured Developer: Bazhar</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ivODB1J3fDVcWttG.png" /></figure><p>This month’s featured developer is Bazhar, a developer and analyst focused on blockchain data, indexing, and building tools that make onchain activity easier to understand and query. Lately they have been working on approval discovery across chains, finding which wallets have approved a given contract, like a router, bridge, or Permit2-style spender, and turning that into a fast API and query layer, with most of the work centred on ERC20 approvals, spender contracts, and multichain data fast enough for production.</p><p><strong>What Bazhar had to say about Envio:</strong></p><blockquote><strong>“My experience with Envio has been really good. I came in with a fairly specific use case around discovering ERC20 approvals by spender contract across chains, and the team helped me think through the right architecture instead of just giving a generic answer. What stood out to me was how practical the support was. They explained where an indexer makes sense, where HyperSync can be used directly, and also clarified the important limitation around “live” allowances that Approval events alone don’t always reflect the remaining allowance after transferFrom calls. That helped me understand the trade-offs between preindexing everything, querying HyperSync on demand, and using RPC checks only where needed. Overall, Envio feels very developer-friendly. The team was responsive, honest about the technical and cost trade-offs, and helped turn a rough idea into a much clearer implementation path.”</strong></blockquote><p>Well done, Bazhar. Be sure to check out their <a href="https://github.com/bazhar1337">GitHub</a> to stay up to date with their latest developments.</p><h3>Playlist of the Month</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*I66rMNWlgdN3PAQE.png" /></figure><p>▶ <a href="https://open.spotify.com/playlist/4262PvQguBC6M84amVTxDr">Open Spotify</a></p><h3>Build With Envio</h3><p>Envio is a multichain EVM blockchain indexer for querying real-time and historical data. If you’re working on a Web3 project and want a smoother development process, Envio’s got your back(end). Check out our docs, join the community, and let’s talk about your data needs.</p><p>Stay tuned for more monthly updates by subscribing to our newsletter, following us on X, or hopping into our Discord for more up-to-date information.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a> 💌</p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8f2e7fb45252" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Scale Subgraphs to Millions of Requests]]></title>
            <link>https://medium.com/@envio_indexer/how-to-scale-subgraphs-to-millions-of-requests-30037a524c06?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/30037a524c06</guid>
            <category><![CDATA[blockchain-indexing]]></category>
            <category><![CDATA[blockchain-indexer]]></category>
            <category><![CDATA[web3-development]]></category>
            <category><![CDATA[blockchain-development]]></category>
            <category><![CDATA[subgraph]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Fri, 26 Jun 2026 00:00:59 GMT</pubDate>
            <atom:updated>2026-06-29T09:10:26.831Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZT1BwWD2arSU93v6.png" /></figure><p>TL;DR</p><ul><li>“Scale my subgraphs” is two separate problems. Sync speed is how fast events become rows. Query latency is how fast reads return once they are rows. Fixing one does not fix the other.</li><li>On sync speed, HyperIndex is the best indexer in independent testing. See the <a href="https://docs.envio.dev/docs/HyperIndex/benchmarks">Sentio benchmarks</a> for the numbers.</li><li>On query latency, HyperIndex serves reads from a dedicated Postgres database through your own GraphQL endpoint, not through a shared gateway, so read performance is predictable under load.</li><li>You keep the data model. Katana moved two production SushiSwap subgraphs entity-for-entity: 23 entity types, carried across without schema redesign. Polymarket replaced 8 subgraphs with one indexer that has processed over 6.5 billion events.</li><li>For high-throughput production workloads, Envio Cloud’s production plans add higher resource and query rate limits plus zero-downtime deployments, and Dedicated plans carry custom SLAs and SQL access alongside GraphQL.</li></ul><p>Subgraphs are usually adopted when an app is small and queries are light. The pain starts later, when the frontend is making millions of requests, and the dashboard needs fresh data under load. At that point, teams search for how to scale their subgraphs, and most of the advice they find addresses the wrong half of the problem.</p><h3>Scaling Is Two Problems, Not One</h3><p>Sync speed and query latency are different bottlenecks with different fixes.</p><p>Sync speed determines how quickly onchain events land in your database, which sets data freshness and how painful a re-deploy or backfill is. Query latency determines how fast your API answers once the data is already indexed, which is what your users actually feel.</p><p>A subgraph at scale typically hurts on both ends. Backfills take hours or days, and reads route through shared serving infrastructure you do not control and cannot provision for your traffic.</p><h3>Sync Speed</h3><p>HyperIndex pulls data through HyperSync, Envio’s Rust data engine, rather than paginated RPC reads. Independent benchmarks put it at 8 seconds for the Uniswap V2 Factory workload, 142x faster than The Graph on the same test. See the <a href="https://docs.envio.dev/docs/HyperIndex/benchmarks">full benchmark methodology</a>. Fast sync at this layer is what makes everything downstream cheap, because a schema change means re-syncing in hours rather than weeks.</p><h3>Query Latency: The Half Nobody Benchmarks</h3><p>HyperIndex processes events into Postgres and serves them through an auto-generated GraphQL API on your own endpoint. Your reads hit a relational database provisioned for your indexer, not a shared gateway. That is what keeps read latency predictable as request volume grows.</p><p>The Hasura-powered endpoint supports the full filter and ordering syntax your users need. A dashboard showing a specific address’s trade history looks like this:</p><pre>query AddressActivity($address: String!) {<br>  Trade(<br>    where: { maker: { _eq: $address } }<br>    order_by: { blockNumber: desc }<br>    limit: 100<br>  ) {<br>    id<br>    maker<br>    amountIn<br>    amountOut<br>    blockNumber<br>  }<br>}</pre><p>Full query reference at <a href="https://docs.envio.dev/docs/HyperIndex/navigating-hasura">docs.envio.dev/docs/HyperIndex/navigating-hasura</a>.</p><p>For traffic in the millions of requests, Envio Cloud production plans are sized for high-throughput indexers, with zero-downtime deployments so a new indexer version promotes to the production endpoint without consumers seeing a change. Dedicated plans add custom SLAs and SQL access alongside GraphQL when an ORM or direct queries fit your backend better.</p><h3>You Keep the Data Model</h3><p>The reason teams hesitate to leave subgraphs is the rebuild. With HyperIndex, the schema migration is close to copy-paste, the <a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">migration guide</a> covers the differences, and handlers move from AssemblyScript to plain TypeScript.</p><p>Katana migrated two production SushiSwap subgraphs from The Graph with the data model carried over entity-for-entity, all 23 entity types, tracking the Uniswap V3 factory, position manager, and every pool it deploys. Same entities, same shape. Their SushiSwap V3 indexer synced in about two hours. The Sushi staker was done in under 20 seconds. Read the <a href="https://docs.envio.dev/blog/case-study-katana-sushiswap">full case study</a> on our blog.</p><p>The <a href="https://github.com/enviodev/indexer-migration-validator">Indexer Migration Validator</a> compares both endpoints field by field, so you can prove parity before switching traffic.</p><h3>Where to Start</h3><p>If your subgraph is hitting its ceiling, the path is short. Scaffold an indexer, port the schema, migrate your handlers and config across, following the <a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">migration guide</a>, then point the migration validator at both endpoints:</p><pre>pnpx envio init</pre><p>Envio also offers white-glove migration support for production teams. Reach out on <a href="https://discord.gg/envio">Discord</a>.</p><h3>Frequently Asked Questions</h3><h3>Why Is My Subgraph Slow at High Request Volume?</h3><p>Usually for two unrelated reasons. Historical sync is slow because data arrives over paginated RPC-style reads. Query latency is variable because reads route through shared serving infrastructure sized for the network rather than your traffic. Diagnose which one you are hitting before paying to fix the wrong one.</p><h3>Can a HyperIndex Endpoint Handle Millions of GraphQL Requests?</h3><p>HyperIndex serves queries from a dedicated Postgres database behind your own GraphQL endpoint, and Envio Cloud production plans are sized for high-throughput workloads, with Dedicated plans adding custom SLAs. The endpoint is yours, not a shared gateway, so read performance does not degrade when your app gets busy.</p><h3>Do I Lose My Subgraph Schema When Moving to HyperIndex?</h3><p>No. The schema migration is close to copy-paste, with small differences like dropping the @entity directive. Katana&#39;s SushiSwap V3 migration carried 23 entity types across without schema redesign, and the open-source Indexer Migration Validator verifies that both endpoints return matching data before you cut over.</p><h3>Does Fast Indexing Actually Improve My API Response Times?</h3><p>Not directly. Anyone who tells you otherwise is skipping a step. Indexing speed sets data freshness and backfill cost. Response times depend on the serving layer, which for HyperIndex is your own Postgres-backed GraphQL endpoint rather than a shared gateway. You need both halves to scale.</p><h3>What Envio Cloud Plan Do I Need for High-Traffic Production Workloads?</h3><p>For production workloads, use one of the paid plans rather than the dev tier. Paid production plans include zero-downtime deployments, higher limits, and higher query rate limits. Dedicated plans additionally include custom SLAs, isolated infrastructure, and SQL access alongside the GraphQL endpoint. Current <a href="https://docs.envio.dev/docs/HyperIndex/hosted-service-billing">pricing and plan details</a> can be found in our docs.</p><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use Envio Cloud or self-host. If you’re building onchain, come talk to us about your data needs.</p><p>Stay tuned for more updates by subscribing to our newsletter, following us on X, or hopping into our Discord.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a> 💌</p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/scale-subgraphs-millions-of-requests"><em>https://docs.envio.dev</em></a><em> on June 26, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=30037a524c06" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why Blockchain Indexers Hit Rate Limits at Scale]]></title>
            <link>https://medium.com/@envio_indexer/why-blockchain-indexers-hit-rate-limits-at-scale-937033889842?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/937033889842</guid>
            <category><![CDATA[blockchain-indexer]]></category>
            <category><![CDATA[rpc]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <category><![CDATA[indexer]]></category>
            <category><![CDATA[blockchain-development]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Fri, 26 Jun 2026 00:00:47 GMT</pubDate>
            <atom:updated>2026-06-29T09:13:05.345Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YoeJGbihWApRPx6Q.png" /></figure><p>TL;DR</p><ul><li>Throttling is a symptom of the per-request RPC model. Providers meter calls because every eth_getLogs request costs them node time, so traffic spikes get rate-limited.</li><li>HyperSync replaces thousands of RPC calls with one filtered bulk query. High traffic produces fewer, larger reads instead of a flood of small ones, so the rate-limit problem does not arise in the same form.</li><li>For chains with native HyperSync coverage, HyperIndex developers do not need to manage RPCs or rate limiting at all.</li><li>If a configured data source degrades, HyperIndex fails over to a fallback within seconds and recovers to the primary automatically.</li></ul><p>Ask developers why they are shopping for a new blockchain data provider, and a recurring answer is throttling. The dashboard spikes, the app gets popular for an afternoon, and the data layer starts returning 429s exactly when the data matters most.</p><p>This blog explains why that happens, why HyperSync’s architecture sidesteps it, and what the behaviour looks like at production scale.</p><h3>Why Providers Throttle in the First Place</h3><p>The standard data path is JSON-RPC. Every read is a request, every request hits a node, and nodes are expensive to run. Providers meter usage per request and enforce rate limits to protect shared infrastructure. That is a reasonable response to the economics of RPC. It is also why high traffic and throttling arrive together, the busier your app gets, the more requests you issue, and the closer you run to the ceiling.</p><p>The deeper problem is that RPC makes you ask for data in tiny pieces. Reading a year of events for one contract means paginating eth_getLogs over block ranges, thousands of calls for one logical question. Your &quot;high traffic&quot; is mostly overhead imposed by the interface.</p><h3>What HyperSync Does Differently</h3><p><a href="https://docs.envio.dev/docs/HyperSync/overview">HyperSync</a> is Envio’s high-performance data retrieval layer, built in Rust as an alternative to JSON-RPC. You describe what you want once, a block range, a filter across logs, transactions, traces, or blocks, and a field selection that returns only the columns you need. The engine streams the result back.</p><p>The shape of the load changes completely. One HyperSync query does the work of the thousands of RPC calls it replaces, and field selection keeps each response small. Under high traffic, you issue fewer, larger reads, which is the access pattern the engine is built for. Scanning Arbitrum for sparse log data takes 2 seconds over HyperSync, a task that can take hours to days over RPC.</p><p>This is also why we can make a claim that no RPC-based indexer makes, for chains with native HyperSync coverage, <a href="https://docs.envio.dev/docs/HyperIndex/overview">HyperIndex</a> uses it as the default data source, and developers do not additionally need to worry about RPCs or rate limiting. The problem is removed at the data layer rather than managed in application code.</p><h3>What It Looks Like at Production Scale</h3><p>The <a href="https://github.com/enviodev/polymarket-indexer">Polymarket reference indexer</a> processes over 6 billion events on Polygon. <a href="https://chaindensity.xyz/">ChainDensity</a> runs chain-wide scans, the heaviest read pattern there is, and returns density maps in seconds. Every one of those workloads would be a sustained rate-limit fight on a per-request provider.</p><p>For repeatable numbers, the Sentio independent benchmarks measured HyperIndex processing 100,000 Ethereum blocks with metadata extraction in 7.9 seconds, against 10 minutes for The Graph on the same workload. The full case suite is in the sentio-benchmark repo, and the <a href="https://github.com/enviodev/open-indexer-benchmark">open-indexer-benchmark repo</a> gives you templates to run the same tests yourself.</p><h3>And When Something Upstream Does Fail</h3><p>No data source has perfect uptime, so the honest version of “does not throttle” includes what happens when a source degrades. HyperIndex ships multi-data-source recovery. Indexers configured with a fallback fail over automatically when a primary stops returning new blocks, and the indexer attempts to recover to the primary 60 seconds later without a restart. The source selection logic is built for resilience, and data-source activity surfaces in the Prometheus metrics before downstream consumers notice.</p><p>Throttling resilience is an architecture property. Failure resilience is a framework property. You want both.</p><h3>Test It on Your Heaviest Query</h3><p>The fastest way to test the claim is to throw your worst read at it. Build a filtered query visually at <a href="https://builder.hypersync.xyz/">builder.hypersync.xyz</a>, or scan a chain from your terminal with zero setup:</p><pre>pnpx logtui aave arbitrum</pre><p>If you would rather have the full framework, schema, handlers, and a GraphQL API on top of the same engine, scaffold an indexer, and deploy it to Envio Cloud:</p><pre>pnpx envio init</pre><h3>Frequently Asked Questions</h3><h3>Does HyperSync Rate-Limit Queries During High Traffic?</h3><p>HyperSync is built for bulk retrieval, so the request-flood pattern that triggers rate limiting on RPC providers does not occur in the same form. One filtered query replaces the thousands of paginated RPC calls it would otherwise take, and for chains with native HyperSync coverage, developers do not need to manage RPCs or rate limiting.</p><h3>Why Do RPC Providers Throttle During Traffic Spikes?</h3><p>Because the JSON-RPC model prices and provisions per request. Every read hits node infrastructure, so providers enforce rate limits to protect shared capacity, and those limits bind exactly when your application is busiest. The interface also forces large reads to be split into thousands of small paginated calls, which further inflates request volume.</p><h3>What Is the Largest Workload HyperSync Has Handled in Production?</h3><p>At the time of writing this, the public reference is the Polymarket indexer, which processes over 6 billion events on Polygon.</p><h3>What Happens to My Indexer if a Data Source Goes Down Mid-Spike?</h3><p>HyperIndex fails over to a configured fallback source when a primary stops returning new blocks and attempts to recover to the primary 60 seconds after the primary returns, with no restart required. The source selection logic is built for resilience, and degradation surfaces in the standard Prometheus metrics endpoint.</p><h3>How Do I Benchmark HyperSync Against My Current Provider?</h3><p>Reproduce your heaviest production query in the visual query builder at <a href="https://builder.hypersync.xyz/">builder.hypersync.xyz</a>, or run the open benchmark suite at the <a href="https://github.com/enviodev/open-indexer-benchmark">open-indexer-benchmark repo</a>. Both are public.</p><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use Envio Cloud or self-host. If you’re building onchain, come talk to us about your data needs.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a></p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/hypersync-under-load-no-throttling"><em>https://docs.envio.dev</em></a><em> on June 26, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=937033889842" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Migrating From The Graph Without a Rewrite]]></title>
            <link>https://medium.com/@envio_indexer/migrating-from-the-graph-without-a-rewrite-a687b597bc1d?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/a687b597bc1d</guid>
            <category><![CDATA[subgraph]]></category>
            <category><![CDATA[migrating-from-the-graph]]></category>
            <category><![CDATA[the-graph-protocol]]></category>
            <category><![CDATA[blockchain-indexer]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Fri, 26 Jun 2026 00:00:26 GMT</pubDate>
            <atom:updated>2026-07-03T11:44:42.101Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YGH381MdpO0uU_Xi.png" /></figure><p><strong>TL;DR</strong></p><ul><li>Migrating from The Graph to HyperIndex is not an AssemblyScript rewrite. AssemblyScript is a subset of TypeScript, so your event parsing and business logic copy across verbatim.</li><li>Three things change in a well-defined way. subgraph.yaml becomes config.yaml, your schema sheds the @entity decorator, and handlers swap Entity.save() for context.Entity.set() with async/await.</li><li>HyperIndex supports multichain in a single config, full TypeScript with any npm package, and framework-level reorg handling with no handler code required.</li><li>In the Sentio Uniswap V2 Factory benchmark (April 2025), HyperIndex completed in 8 seconds. The Graph took 19 minutes, 142x slower on the same workload.</li><li>The Indexer Migration Validator CLI diffs entity state between your subgraph endpoint and your HyperIndex endpoint before you cut over.</li></ul><p>Most teams stay on The Graph longer than they want to because of one belief, that moving means rewriting every handler in a new language. It does not.</p><p>AssemblyScript is a subset of TypeScript. The event parsing, the conditional logic, the arithmetic, and the helper functions are all valid TypeScript, and they carry across directly. What changes when you migrate to HyperIndex is a small, well-defined set of API calls. Not the logic. The wiring.</p><p>This is not theoretical. Katana migrated two production SushiSwap subgraphs exactly this way, entity-for-entity, and now serves its app from Envio. The walkthrough below uses before-and-after code from the canonical <a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">migration guide</a>, and ends with what that migration looked like in production.</p><p>Prefer an assistant-led migration?</p><p>HyperIndex ships <a href="https://docs.envio.dev/docs/HyperIndex-LLM/hyperindex-complete">AI-friendly docs</a> and a <a href="https://docs.envio.dev/docs/HyperIndex/migrate-with-ai">guided AI migration workflow</a> that works in both Cursor and Claude Code. The steps below are the same either way, this is what the assistant is doing under the hood.</p><h3>What actually changes (and what does not)</h3><p>It helps to be specific about the surface area before touching any code.</p><p><strong>Carries across without change:</strong></p><ul><li>Your event parsing logic</li><li>All conditional logic and arithmetic</li><li>Helper functions that do not use @graphprotocol/graph-ts types directly</li><li>Your entity model, the fields, the relationships, and the ID conventions</li></ul><p><strong>Changes during migration:</strong></p><p>ConcernThe GraphHyperIndexConfig formatsubgraph.yamlconfig.yamlSchema@entity on every typedecorator removedHandler registrationContractName.EventName.handler(...)indexer.onEvent(...)Entity writesEntity.save()context.Entity.set(...)Entity readssynchronous Entity.load(id)await context.Entity.get(id)Imports@graphprotocol/graph-ts&quot;envio&quot; generated typesTransaction fieldsavailable by defaultopt-in via field_selection</p><p>Every row is a mechanical swap. The handler body, the part that is the most work to write and the hardest to get right, is the part that does not change.</p><h3>Step 0: bootstrap the project</h3><p>Start by generating a fresh HyperIndex project shell using your existing contract addresses, ABIs, and events as the source of truth:</p><pre>pnpx envio init</pre><p>Follow the prompts. The init generates config.yaml, schema.graphql, and handler stubs. At any point during the migration, validate your changes with:</p><pre>pnpm envio codegen   # validate config + schema, regenerate types<br>pnpm dev             # run the indexer locally</pre><h3>Step 1: subgraph.yaml to config.yaml</h3><p>The config conversion is a restructure. HyperIndex consolidates contracts and chains into two top-level sections.</p><p>The Graph, subgraph.yaml:</p><pre>specVersion: 0.0.4<br>schema:<br>  file: ./schema.graphql<br>dataSources:<br>  - kind: ethereum/contract<br>    name: PositionManager<br>    network: mainnet<br>    source:<br>      abi: PositionManager<br>      address: &quot;0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e&quot;<br>      startBlock: 21689089<br>    mapping:<br>      kind: ethereum/events<br>      apiVersion: 0.0.7<br>      language: wasm/assemblyscript<br>      entities:<br>        - Position<br>      abis:<br>        - name: PositionManager<br>          file: ./abis/PositionManager.json<br>      eventHandlers:<br>        - event: Transfer(indexed address,indexed address,indexed uint256)<br>          handler: handleTransfer<br>        - event: Subscription(indexed uint256,indexed address)<br>          handler: handleSubscription</pre><p>HyperIndex, config.yaml:</p><pre>name: uni-v4-indexer<br>contracts:<br>  - name: PositionManager<br>    abi_file_path: ./abis/PositionManager.json<br>    events:<br>      - event: Transfer(address indexed from, address indexed to, uint256 indexed id)<br>      - event: Subscription(uint256 indexed tokenId, address indexed subscriber)<br>chains:<br>  - id: 1<br>    start_block: 21689089<br>    contracts:<br>      - name: PositionManager<br>        address: &quot;0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e&quot;</pre><p>One thing that trips teams up consistently, HyperIndex uses chains: (not networks:).</p><h3>Transaction and receipt fields</h3><p>In a subgraph, you opt into receipt data with receipt: true in subgraph.yaml. In HyperIndex, receipt-level fields like status and gasUsed are accessed via field_selection in config.yaml:</p><pre>field_selection:<br>  transaction_fields:<br>    - hash<br>    - status<br>    - gasUsed</pre><p>Note that event.transaction.hash is not available by default, add it to transaction_fields before referencing it in a handler.</p><h3>Step 2: schema, near copy-paste</h3><p>Your existing schema.graphql carries across almost unchanged. The only required edit is removing the @entity decorator from every type.</p><p>The Graph:</p><pre>type Transfer @entity {<br>  id: ID!<br>  from: String!<br>  to: String!<br>  amount: BigInt!<br>  timestamp: Int!<br>}</pre><p>HyperIndex:</p><pre>type Transfer {<br>  id: ID!<br>  from: String! @index<br>  to: String!<br>  amount: BigInt!<br>  timestamp: Int!<br>}</pre><p>Field types, ID! primary keys, @derivedFrom relations, nullable vs non-nullable, and enums all carry across unchanged. After any schema edit, run pnpm envio codegen to regenerate the typed bindings before touching handler code.</p><h3>Step 3: handlers, four API changes</h3><p>This is the step teams worry about most, and it is the smallest. Here is the same handler in both frameworks, using the Uniswap V4 Subscription event:</p><p>The Graph (AssemblyScript):</p><pre>export function handleSubscription(event: SubscriptionEvent): void {<br>  const subscription = new Subscribe(<br>    event.transaction.hash.toHex() + &quot;-&quot; + event.logIndex.toString()<br>  );<br>  subscription.tokenId = event.params.tokenId;<br>  subscription.subscriber = event.params.subscriber.toHexString();<br>  subscription.logIndex = event.logIndex;<br>  subscription.blockNumber = event.block.number;<br>  subscription.save();<br>}</pre><p>HyperIndex (TypeScript v3):</p><pre>import { indexer } from &quot;envio&quot;;</pre><pre>indexer.onEvent(<br>  { contract: &quot;PositionManager&quot;, event: &quot;Subscription&quot; },<br>  async ({ event, context }) =&gt; {<br>    context.Subscribe.set({<br>      id: `${event.transaction.hash}_${event.logIndex}`,<br>      tokenId: event.params.tokenId,<br>      subscriber: event.params.subscriber,<br>      logIndex: event.logIndex,<br>      blockNumber: event.block.number,<br>    });<br>  },<br>);</pre><p>The token ID parsing, the field assignments, and the ID construction are all identical. What changed is the import, the handler registration, entity.save() becoming context.Subscribe.set(), the async function signature, and .toHexString() becoming unnecessary because addresses arrive as strings.</p><h3>The one rule that catches every team</h3><p>Entities returned by context.Entity.get() are read-only. When updating an existing entity, always spread the existing object and override fields:</p><pre>const token = await context.Token.get(event.params.to);<br>if (token) {<br>  context.Token.set({<br>    ...token,<br>    balance: token.balance + event.params.value,<br>  });<br>}</pre><h3>Factory contracts (dynamic data sources)</h3><p>Where The Graph uses templates: in subgraph.yaml, HyperIndex uses indexer.contractRegister:</p><pre>indexer.contractRegister(<br>  { contract: &quot;Factory&quot;, event: &quot;PairCreated&quot; },<br>  ({ event, context }) =&gt; {<br>    context.chain.Pair.add(event.params.pair);<br>  },<br>);</pre><h3>Validating the migration</h3><p>After running locally against a block range, use the <a href="https://github.com/enviodev/indexer-migration-validator">Indexer Migration Validator</a> CLI to diff entity state between your subgraph endpoint and your HyperIndex endpoint. It generates entity configs automatically from your GraphQL schema and gives field-level analysis of any discrepancies. Running both in parallel over the same block range is the fastest way to confirm correctness before cutting over production traffic.</p><h3>GraphQL queries</h3><p>HyperIndex uses standard GraphQL. The Graph uses a custom dialect with some non-standard filter and ordering syntax. For queries that use Graph-specific syntax, the <a href="https://docs.envio.dev/docs/HyperIndex/query-conversion">Query Conversion Guide</a> covers the differences. For backwards compatibility, Envio’s subgraph-compatible endpoint accepts The Graph’s query syntax. Katana’s production migration ran against this endpoint, allowing their existing app queries to work without changes while they transitioned to the native endpoint.</p><h3>What it looks like in production</h3><p>Katana migrated two production SushiSwap subgraphs from The Graph to Envio, carrying the data model across entity-for-entity, all 23 entity types, tracking the Uniswap V3 factory, the position manager, and every pool it deploys. Same entities, same shape.</p><ul><li>SushiSwap V3 indexer: 11,473,382 events synced in about two hours</li><li>Sushi staker indexer: 68,201 events synced in under 20 seconds</li></ul><p>Full case study: <a href="https://docs.envio.dev/blog/case-study-katana-sushiswap">How Katana migrated SushiSwap data from The Graph to Envio</a>.</p><h3>Why bother, the performance case</h3><p>From the Sentio Uniswap V2 Factory benchmark (April 2025):</p><p>IndexerTimevs HyperIndexEnvio HyperIndex8 secondsbaselineSubsquid (SQD)2 minutes15x slowerThe Graph19 minutes142x slowerPonder21 minutes157x slower</p><p>The pattern holds every time. Your logic is already TypeScript, so it moves. The wiring changes in a handful of well-defined places, the validator confirms the output matches your old subgraph, and you cut over. That is the whole migration.</p><h3>Get started</h3><ul><li><a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">Migration guide</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/query-conversion">Query Conversion Guide</a></li><li><a href="https://github.com/enviodev/indexer-migration-validator">Indexer Migration Validator</a></li><li><a href="https://docs.envio.dev/blog/case-study-katana-sushiswap">Katana case study</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/hosted-service">Envio Cloud</a></li></ul><h3>Frequently asked questions</h3><h3>Is the AssemblyScript-to-TypeScript conversion really just a copy-paste?</h3><p>For pure logic functions, yes. AssemblyScript is a subset of TypeScript, so any function that does not import from @graphprotocol/graph-ts is valid TypeScript and carries across without changes. The parts that require translation are the imports, the entity save calls, the entity load calls (synchronous becomes async/await), and the handler registration syntax. The event parsing logic, the business logic, and the arithmetic are identical.</p><h3>Do I need to handle reorgs in my HyperIndex handlers?</h3><p>No. HyperIndex handles reorgs at the framework level by tracking entity state history for every unfinalized block and rolling back automatically. You write forward-only handler logic and the framework manages rollback.</p><h3>Can I keep my existing GraphQL queries after migrating?</h3><p>Most queries carry across without change. Envio’s subgraph-compatible endpoint accepts The Graph’s query syntax as a drop-in, so existing app queries keep working while you transition to the native endpoint. The Query Conversion Guide covers the syntax differences.</p><h3>How long does a subgraph migration take?</h3><p>For a single-contract subgraph with straightforward handlers, the mechanical migration is typically a few hours. Katana migrated two production SushiSwap subgraphs with entity-for-entity parity and had both syncing on Envio within a working session. For multi-subgraph setups, the consolidation into one TypeScript codebase adds time but reduces ongoing maintenance.</p><h3>What is the Indexer Migration Validator and how do I use it?</h3><p>The Indexer Migration Validator is an open-source CLI tool that diffs entity state between a subgraph endpoint and a HyperIndex endpoint. It generates entity configs from your GraphQL schema automatically, runs both endpoints over the same block range in parallel, and produces field-level analysis of any discrepancies.</p><h3>Can I run multiple chains in one HyperIndex indexer?</h3><p>Yes. A single config.yaml declares all chains under a chains: array. Multichain indexing is the default in V3, with no opt-in required. Each chain-specific entity ID should include event.chainId to prevent collisions across chains.</p><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use Envio Cloud or self-host. If you’re building onchain, come talk to us about your data needs.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a></p><p><a href="https://envio.dev/">Website</a> | <a href="https://x.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+kAIGElzPjApiMjI0">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a687b597bc1d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Just-in-Time Indexing: Using Agents to Answer Onchain Questions]]></title>
            <link>https://medium.com/@envio_indexer/just-in-time-indexing-using-agents-to-answer-onchain-questions-330b22cfd7bf?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/330b22cfd7bf</guid>
            <category><![CDATA[blockchain-indexing]]></category>
            <category><![CDATA[curve-finance]]></category>
            <category><![CDATA[blockchain-indexer]]></category>
            <category><![CDATA[blockchain-development]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Wed, 03 Jun 2026 00:00:02 GMT</pubDate>
            <atom:updated>2026-06-03T19:18:59.083Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BBMWeE2QQzQMaJYt.png" /></figure><p>Just-in-time indexing is a way of using an AI agent to answer one-off questions about onchain data without maintaining permanent infrastructure or finding a pre-indexed data point. Rather than building an indexer in advance and keeping it running, the dataset is built on demand when a question comes up, read once, and deleted afterward.</p><h3>How it Works</h3><p>One user, Michael K from Curve Finance, uses it for ad hoc analysis of pool activity. The flow starts with a plain-language prompt to Claude, for example: “Use Envio to parse all the trades from this pool.”</p><p>Claude, using Envio’s tooling, generates the indexer: the config, schema, and event handlers, scoped to the specific contract and events in the question. It deploys to Envio’s free development plan cloud service with envio-cloud, the CLI, and the indexer backfills from scratch. After 5 to 10 minutes, the data is ready to query. Once the researcher has pulled what they need, they delete the indexer.</p><blockquote>“One of the simplest ways to get large datasets of onchain data for our research purposes.” — Michael K, Researcher at Curve Finance</blockquote><h3>Why the Free Tier Covers it</h3><p>The workflow runs on Envio’s free hosted cloud tier. The requests are one-off, so a single repo is enough: the agent manages it and deploys each question as a branch. A backfill of 5 to 10 minutes is acceptable for ad hoc work, where the alternative is building a pipeline by hand.</p><h3>The Pattern</h3><p>Traditional indexing requires deciding what data is needed, building the pipeline, and then querying it, which limits the user to questions planned for in advance. Just-in-time indexing reverses the order: the question comes first, and the dataset is built to answer it.</p><p>This works because backfilling takes minutes rather than days, and because an agent can stand up the indexer from a natural-language prompt without anyone writing config by hand. The same pattern applies to any agent or user asking one-off onchain questions.</p><blockquote>“We use Envio regularly to parse all kinds of data from all kinds of contracts across dozens of chains.” — Michael K, Researcher at Curve Finance</blockquote><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use <a href="https://docs.envio.dev/docs/HyperIndex/hosted-service">Envio Cloud</a> or self-host. If you’re building onchain, come talk to us about your data needs.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a> 💌</p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/just-in-time-indexing-agents-onchain"><em>https://docs.envio.dev</em></a><em> on June 3, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=330b22cfd7bf" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Envio Developer Update May 2026]]></title>
            <link>https://medium.com/@envio_indexer/envio-developer-update-may-2026-22935cd94b9a?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/22935cd94b9a</guid>
            <category><![CDATA[blockchain-indexer]]></category>
            <category><![CDATA[blockchain-development]]></category>
            <category><![CDATA[web3-development]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <category><![CDATA[blockchain-technology]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Fri, 29 May 2026 00:00:22 GMT</pubDate>
            <atom:updated>2026-06-01T18:56:00.255Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*TdkJzubppJC1r8ZB.png" /></figure><p>May was our biggest month yet. After five months of alpha and release candidates, HyperIndex V3 officially shipped, production-ready, faster, and the foundation for everything we build next. Alongside it we went live on Katana, published four large-scale case studies (Polymarket, Revert Finance, Privacy Pools, and Katana’s SushiSwap migration off The Graph), and shipped a stack of deep-dive guides on HyperSync, production reliability, and building onchain with AI.</p><p>We also joined Monad’s Devrel livestream to talk HyperIndex, started rolling out HyperSync rate limits ahead of paid plans, and confirmed our ETHConf New York sponsorship in June.</p><p>Let’s dive in!</p><h3>HyperIndex V3 Is Here</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HwqO_P8QSHKu5VdL.png" /></figure><p>After five months of alpha, HyperIndex V3 officially shipped. This is the biggest release in the framework’s history, a full modernisation that bundles five months of work into a stable, production-ready release. A unified handlers API, ESM with top-level await, a purpose-built testing framework, 3x faster historical sync, Solana support, ClickHouse as a second storage backend, and a much smaller package. With V3 we are back to following SemVer and set up for the next year of features.</p><p>To upgrade an existing project, follow the <a href="https://docs.envio.dev/docs/HyperIndex/migrate-to-v3">Migrate to V3</a> guide. For the complete rundown, see <a href="https://docs.envio.dev/docs/HyperIndex/whats-new-in-v3">What’s New in V3</a>.</p><h3>Unified Handlers API</h3><p>All handler registrations now flow through a single indexer value. Contract-specific exports are replaced by indexer.onEvent, indexer.contractRegister, and indexer.onBlock.</p><pre>import { indexer } from &quot;envio&quot;;</pre><pre>indexer.onEvent(<br>  {<br>    contract: &quot;ERC20&quot;,<br>    event: &quot;Transfer&quot;,<br>    wildcard: true,<br>    where: ({ chain }) =&gt; ({<br>      params: [<br>        { from: chain.Safe.addresses },<br>        { to: chain.Safe.addresses },<br>      ],<br>    }),<br>  },<br>  async ({ event, context }) =&gt; {<br>    // Handler logic<br>  },<br>);</pre><h3>3x Faster Historical Backfill</h3><p>We added chunking logic to request events across multiple ranges at once, removed overfetching for contracts with a much later start block, and sped up dynamic contract registration.</p><p><strong>25k events per second is now standard.</strong></p><h3>A Purpose-Built Testing Framework</h3><p>HyperIndex now ships its own testing framework powered by createTestIndexer(). You write tests against the same indexer that runs in production, with no database, no Docker, and no manual mock wiring. It integrates with Vitest, includes snapshot testing out of the box, and gives you three ways to feed events (auto-exit, explicit block range, or simulate).</p><pre>import { describe, it } from &quot;vitest&quot;;<br>import { createTestIndexer } from &quot;envio&quot;;</pre><pre>describe(&quot;ERC20 indexer&quot;, () =&gt; {<br>  it(&quot;processes the first block with events&quot;, async (t) =&gt; {<br>    const indexer = createTestIndexer();</pre><pre>    const result = await indexer.process({ chains: { 1: {} } });</pre><pre>    // Auto-filled by Vitest on first run -- just review and commit<br>    t.expect(result).toMatchInlineSnapshot(`<br>      {<br>        &quot;changes&quot;: [<br>          {<br>            &quot;Transfer&quot;: {<br>              &quot;sets&quot;: [<br>                {<br>                  &quot;blockNumber&quot;: 10861674,<br>                  &quot;from&quot;: &quot;0x0000000000000000000000000000000000000000&quot;,<br>                  &quot;id&quot;: &quot;1-10861674-23&quot;,<br>                  &quot;to&quot;: &quot;0x41653c7d61609D856f29355E404F310Ec4142Cfb&quot;,<br>                  &quot;transactionHash&quot;: &quot;0x4b37d2f343608457ca...&quot;,<br>                  &quot;value&quot;: 1000000000000000000000000000n,<br>                },<br>              ],<br>            },<br>            &quot;block&quot;: 10861674,<br>            &quot;chainId&quot;: 1,<br>            &quot;eventsProcessed&quot;: 1,<br>          },<br>        ],<br>      }<br>    `);<br>  });<br>});</pre><h3>ESM and Top-Level Await</h3><p>We migrated HyperIndex from CommonJS to ESM. That unlocks the latest versions of libraries that dropped CommonJS long ago, and lets you use await directly at the top of your handler files.</p><h3>Solana Support (Experimental)</h3><p>HyperIndex now supports Solana with RPC as a source. Spin up a Solana project with pnpx envio init svm. Solana exposes its block-stream handler as indexer.onSlot rather than onBlock, matching Solana&#39;s slot-based model.</p><h3>ClickHouse as an Additional Storage Backend (Experimental)</h3><p>HyperIndex can now run with multiple storage backends side by side. Postgres remains the primary database, and entities can additionally be written to a ClickHouse database that is restart and reorg resistant. Enable it in config.yaml and route each entity via the @storage directive in schema.graphql.</p><pre>storage:<br>  postgres: true<br>  clickhouse: true</pre><p>Envio Cloud supports ClickHouse on the Dedicated Plan.</p><h3>A Much Smaller Package and Bun Support</h3><p>You can run HyperIndex on Bun with bun --bun envio dev, and we removed the runtime ReScript compiler from the published package by eliminating dynamically generated ReScript code.</p><p><strong>The envio npm package shrank from 141MB to 53MB.</strong></p><h3>Agentic Mode in envio init</h3><p>envio init now ships an agentic mode. When an AI coding assistant runs the command, it produces an AI-readable guiding prompt instead of a TTY error, so the agent knows exactly how to scaffold an indexer end to end.</p><pre>Welcome to Envio Indexer! Let&#39;s set up an indexer that will become a reliable blockchain backend you trust, love, and own.</pre><pre>Leave the rest to your favorite agent:</pre><pre>  1. Prompt the user for the project intent if it is missing from context (what should the indexer track and surface?).<br>  2. Determine the chain, contract, and addresses needed to produce that result. Use web search or block-explorer tool calls when the user hasn&#39;t supplied them.<br>  3. To continue, call:</pre><pre>       pnpx envio init contract-import explorer \<br>         -n ${indexer-name} \<br>         -c ${address} \<br>         -b ${chainId} \<br>         --single-contract \<br>         --all-events \<br>         -d ${directory}</pre><pre>Then `cd ${directory}` and run `pnpm test`. Don&#39;t hand the project off yet -- keep iterating on the indexer with a TDD loop (extend tests, run them, fix handlers) until the user&#39;s goal is met.</pre><p>See the full <a href="https://github.com/enviodev/hyperindex/releases">release notes</a></p><p>Star us on <a href="https://github.com/enviodev/hyperindex">GitHub</a> ⭐</p><h3>Envio is Live on Katana</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*FJ7FdZh7ujiokCMZ.gif" /></figure><p>We launched production-grade indexing on Katana, the DeFi-first chain built where liquidity concentrates and real yield flows back to users. Developers can now access real-time and historical onchain data on Katana, up to 2000x faster than RPC.</p><p>Easy, fast, and fully customisable.</p><p>Original post on X: <a href="https://x.com/katana/status/2056389958303441051">https://x.com/katana/status/2056389958303441051</a></p><h3>Indexing 4 Billion Polymarket Events</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*sv4haM5iKVxHAsbG.png" /></figure><p>We replaced Polymarket’s eight production subgraphs, four years of fragmentation across separate AssemblyScript codebases on The Graph, with a single HyperIndex indexer written in TypeScript. Over 4 billion events synced in 6 days on Polygon.</p><p>The unlock is handler merging. A shared contract event like ConditionalTokens.PositionSplit previously fired across three or four separate subgraphs. In the unified indexer, one handler fires once and updates open interest, activity, and PnL together. That is 25+ entity types behind a single GraphQL endpoint, and one deployment to maintain instead of eight. The full indexer is open source as a reference for any team migrating from The Graph.</p><p>Read the case study: <a href="https://docs.envio.dev/blog/polymarket-hyperindex-case-study">https://docs.envio.dev/blog/polymarket-hyperindex-case-study</a></p><h3>Revert Finance Fixed 2 Years of Unsynced PancakeSwap V3 Data</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*cX_RAwLYa292rk55.png" /></figure><p>Revert Finance builds analytics and management tools for AMM liquidity providers. Their PancakeSwap V3 subgraph on BNB Smart Chain had been stuck at 70% sync for over two years, unable to reach chain head, because the chain’s throughput outpaced what RPC-based indexing could sustain.</p><p>We built a HyperIndex indexer covering the full PancakeSwap V3 contract surface on BNB Smart Chain. 1,711,569,200 events synced to 100% in 10 days.</p><p>Read the case study: <a href="https://docs.envio.dev/blog/revert-finance-pancakeswap-bnb-hyperindex">https://docs.envio.dev/blog/revert-finance-pancakeswap-bnb-hyperindex</a></p><h3>Privacy in Public, Indexing Privacy Pools</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UjMJuCOnjsUwBY1a.png" /></figure><p>Privacy Pools is a privacy primitive co-authored by Vitalik Buterin that pairs a zero-knowledge proof of pool membership with an off-chain compliance layer. We indexed every deposit, withdrawal, ragequit, ASP root update, and relayer fee across all 21 live pools on four chains (Ethereum, Optimism, BSC, and Arbitrum) with a single HyperIndex indexer using dual Postgres and ClickHouse storage.</p><p>Full multichain sync to head in roughly 30 seconds, and 91% of withdrawals use the privacy-preserving relayed path. The full stack, including the indexer, the analytics queries, and the BI report generator, is open source under MIT license. It is a great example of multichain coverage and an analytics-grade columnar store as first-class features.</p><p>Read the case study: <a href="https://docs.envio.dev/blog/privacy-in-public-case-study">https://docs.envio.dev/blog/privacy-in-public-case-study</a></p><h3>Katana Migrates SushiSwap Off The Graph</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*azu1FUBhGN1C15fY.png" /></figure><p>Katana migrated two production subgraphs, SushiSwap V3 and the Sushi staker, from The Graph to Envio HyperIndex without disrupting the app surfacing the data. Katana’s existing subgraph-style queries kept working through Envio’s subgraph-compatible endpoint, and for the full GraphQL feature set its app needed, Katana moved onto Envio’s native endpoint, with our team supporting the move directly.</p><p>SushiSwap V3 synced 11,473,382 events in about two hours, and the Sushi staker synced 68,201 events in under 20 seconds.</p><p>Read the case study: <a href="https://docs.envio.dev/blog/case-study-katana-sushiswap">https://docs.envio.dev/blog/case-study-katana-sushiswap</a></p><h3>What is HyperSync?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*sBZV9-cjy_TfYZU-.png" /></figure><p>Reading onchain data over standard JSON-RPC breaks down the moment you need fast, filtered, or multichain historical data. HyperSync is our high-performance data retrieval layer built to fix exactly that. It is written in Rust, uses optimised binary encoding and parallel fetching, and exposes a single query interface across every supported chain.</p><p>Scanning Arbitrum for sparse log data takes 2 seconds with HyperSync, up to 2000x faster than RPC. HyperSync is the engine behind HyperIndex. Client libraries are available for TypeScript, Python, Rust, and Go. This blog covers what it is, how it works, and how to use it in your own application.</p><p>Learn more here: <a href="https://docs.envio.dev/blog/what-is-hypersync">https://docs.envio.dev/blog/what-is-hypersync</a></p><h3>Production Indexer Reliability with HyperIndex</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*APw_X4TYbKqMK9ir.png" /></figure><p>Speed wins benchmarks, but reliability is what keeps an indexer running for years. This post walks through the four reliability guarantees HyperIndex provides at the framework level, so any indexer built on it inherits them without writing operational code. Those guarantees are built-in reorg handling with automatic rollback, restart-resistant operation, HyperSync data validation, and multi data-source recovery.</p><p>Reorgs are handled automatically by tracking entity state history for every unfinalized block and rolling back without any custom handler logic. Multi data-source recovery fails over to a fallback within seconds and recovers to the primary 60 seconds later. Observability comes through a semver-stable Prometheus endpoint.</p><p>More here: <a href="https://docs.envio.dev/blog/production-indexer-reliability-hyperindex">https://docs.envio.dev/blog/production-indexer-reliability-hyperindex</a></p><h3>Why AI Agents Acting Onchain Need an Indexer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GwqBJfMtTWrhWc9y.png" /></figure><p>SQL warehouses let agents ask. Indexers let them act. An agent reading raw RPC hits four walls quickly, namely reorgs, no schema, low throughput, and per-chain quirks at multichain scale. A SQL warehouse fronted by an LLM solves the read side, but an agent acting onchain needs to build, deploy, and own new data pipelines mid-session, not just query existing ones.</p><p>This post makes the case for a programmable indexer over a query layer, backed by the docs MCP server, the auto-discovered .claude/skills/ directory, and the GitHub-native deploy flow.</p><p><strong>One prompt, roughly 20 seconds, 400,000 events indexed on Monad.</strong></p><p>Read the full breakdown: <a href="https://docs.envio.dev/blog/ai-agents-acting-onchain-indexer">https://docs.envio.dev/blog/ai-agents-acting-onchain-indexer</a></p><h3>AI-Assisted Subgraph Migration to HyperIndex with Claude</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gIwamyeWtJZ_4n91.png" /></figure><p>The hardest part of moving off The Graph has always been the AssemblyScript rewrite. With the docs MCP server and the dedicated migrate-from-subgraph skill shipped in every HyperIndex project, Claude can handle the AssemblyScript-to-TypeScript translation end to end while a developer reviews the diff, runs the tests, and ships the indexer.</p><p>This guide walks the full workflow on a real surface area, anchored to the open-source Polymarket reference. A migration that used to take weeks becomes a one or two day exercise.</p><p>Read the full tutorial: <a href="https://docs.envio.dev/blog/ai-subgraph-migration-hyperindex-claude">https://docs.envio.dev/blog/ai-subgraph-migration-hyperindex-claude</a></p><h3>Build an AI-Powered Onchain App with HyperIndex and Claude</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*dSg8OWMmFW4IGZa6.png" /></figure><p>A practical, end-to-end walkthrough of building a multichain HyperIndex indexer with Claude as a pair programmer. It covers wiring up the docs MCP server, scaffolding the project, making it multichain, writing the schema and handlers, running locally, and deploying to Envio Cloud through the GitHub-native flow.</p><p>Every command is reproducible against the current release, and the patterns come straight from the public Polymarket reference indexer. With Claude driving, you can go from a blank project to a deployed, queryable indexer in minutes.</p><p>More here: <a href="https://docs.envio.dev/blog/ai-onchain-app-hyperindex-claude">https://docs.envio.dev/blog/ai-onchain-app-hyperindex-claude</a></p><h3>Migrating from Ponder to Envio</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JGMDRGDeLDkLHWMN.png" /></figure><p>Both Ponder and HyperIndex are TypeScript-first and expose a GraphQL API, so migration is mostly mechanical translation. Three things change. ponder.config.ts becomes config.yaml, ponder.schema.ts becomes schema.graphql, and event handlers adapt to the HyperIndex entity API. This guide walks all three steps end to end, with every code block taken from the official migration reference.</p><p>Up to 157x faster historical sync via HyperSync, with multichain support by default.</p><p>For teams looking for a clear path forward, our team supports the migration end to end, from planning the rewrite to getting the indexer live on Envio Cloud.</p><p>Read the full tutorial: <a href="https://docs.envio.dev/blog/migrate-from-ponder-to-envio">https://docs.envio.dev/blog/migrate-from-ponder-to-envio</a></p><h3>HyperSync Rate Limits</h3><p>Throughout May we have been rolling out HyperSync rate limits more aggressively. Limits ratchet down gradually so you get the smoothest possible transition to paid plans without disruption to your services. Keep an eye out for 429 rate limit exceeded errors.</p><p>If you are already on a paid HyperSync plan, your normal plan limits apply and no action is needed. If you are not on a paid plan yet, get sorted as soon as possible by opening a Discord ticket to arrange one with the team, or by picking a plan directly.</p><p>This affects all HyperSync users and anyone self-hosting HyperIndex with a HyperSync token. Envio Cloud deployments are not affected.</p><h3>Polymarket’s Top Traders Run on Indexed Data</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jIJ1ojQqn1zmxGNN.png" /></figure><p>Co-founder Jonjon Clark published a data-driven series profiling the top 100 Polymarket traders by realised PnL, and the deeper he digs, the clearer it becomes that these operations live or die on fast, real-time access to onchain data, exactly the workload HyperIndex and HyperSync are built for. Here are a few that stand out.</p><h3>The 95% Win Rate Trader</h3><p>$23.6M in realised PnL and a 95.4% win rate. It runs a live NBA model that prices games faster than the order book, pre-positions on the cheap side before tip-off, and rides the eventual winner to oracle redemption.</p><p><a href="https://x.com/jonjonclark">Read the thread</a></p><h3>The 15-Minute Bitcoin Loop Trader</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qkoO8p2BeSg5ZL6Y.png" /></figure><p>7.6 million fills across 32,021 markets in 111 days, about one fill per second, netting $2.38M. It posts resting bids on both sides of Polymarket’s 15-minute BTC binaries and captures the spread off retail flow, completely indifferent to which way Bitcoin moves.</p><p><a href="https://x.com/jonjonclark">Read the thread</a></p><h3>The UMA Gap Trader</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Nu_JNlaWn3XBW2yP.png" /></figure><p>Number 26 on the leaderboard with $8M in lifetime realised PnL. Its cleanest mechanism is the settlement sweep, buying near-par winning tokens in the gap between when a result is known and when the UMA oracle finalises payout, for a 98.2% win rate across more than 4,000 positions.</p><p><a href="https://x.com/jonjonclark">Read the thread</a></p><h3>Envio x Monad’s Devrel Livestream</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*kNOyU1NEL3t_pLu5.png" /></figure><p>Co-founder Denham joined Monad’s Devrel Livestream to chat HyperIndex on Monad, Monskills, and how to vibecode your way to a production indexer.</p><p>Missed it live? Catch the full recording on <a href="https://x.com/i/broadcasts/1qxvvkjpedaxB">X</a>.</p><h3>Current &amp; Upcoming Events &amp; Hackathons</h3><ul><li><a href="https://ethconf.com/">ETHConf — New York</a>: June 8th -&gt; 10th (sponsoring)</li></ul><h3>Playlist of the Month</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*vK2xMEN-4ubPaQk8.png" /></figure><p>▶ <a href="https://open.spotify.com/playlist/3XgXvqbIgrCTLzxqJRehxC?si=5d1949361dfb49a4">Open Spotify</a></p><h3>Build With Envio</h3><p>Envio is a multichain EVM blockchain indexer for querying real-time and historical data. If you’re working on a Web3 project and want a smoother development process, Envio’s got your back(end). Check out our docs, join the community, and let’s talk about your data needs.</p><p>Stay tuned for more monthly updates by subscribing to our newsletter, following us on X, or hopping into our Discord for more up-to-date information.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a> 💌</p><p><a href="https://envio.dev/">Website</a> | <a href="https://twitter.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+5mI61oZibEM5OGQ8">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/envio-developer-update-may-2026"><em>https://docs.envio.dev</em></a><em> on May 29, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=22935cd94b9a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How Katana Migrated SushiSwap Data from The Graph to Envio]]></title>
            <link>https://medium.com/@envio_indexer/how-katana-migrated-sushiswap-data-from-the-graph-to-envio-3ba863150daa?source=rss-a7ecef0aa960------2</link>
            <guid isPermaLink="false">https://medium.com/p/3ba863150daa</guid>
            <category><![CDATA[katana]]></category>
            <category><![CDATA[blockchain-indexer]]></category>
            <category><![CDATA[blockchain-development]]></category>
            <category><![CDATA[sushiswap]]></category>
            <category><![CDATA[blockchain-indexing]]></category>
            <dc:creator><![CDATA[ENVIO]]></dc:creator>
            <pubDate>Thu, 28 May 2026 00:00:26 GMT</pubDate>
            <atom:updated>2026-06-01T18:52:05.101Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*OQaPRtSB4BOkvtXE.png" /></figure><p>TL;DR</p><ul><li>Katana migrated two production subgraphs, SushiSwap V3 and the Sushi staker, from The Graph to Envio HyperIndex while keeping its existing data model intact.</li><li>Katana’s existing subgraph-style queries ran against Envio’s subgraph-compatible endpoint, and for the full GraphQL feature set its app needed, Katana moved its queries onto Envio’s native endpoint. The data model itself carried over unchanged.</li><li>Katana forked the indexer and deployed it on Envio Cloud, and the Envio team assisted with the backend configuration, the subgraph-compatible endpoint, and the cache.</li></ul><p>Migrating your data infrastructure from one provider to another is rarely simple, mostly because of everything that has to change around it. Katana is a DeFi network, and its app surfaces SushiSwap data such as V3 pools, swaps, fees, positions, and staking to its users. That data was served by two production subgraphs running on The Graph. Katana wanted to move this data layer to Envio HyperIndex without disrupting the apps that depend on it.</p><p>Because this was a live production system rather than a greenfield build, the priority was continuity. The existing queries had to keep working and the data had to stay correct. This case study walks through how the migration came together, from the subgraph-compatible endpoint that kept Katana’s queries running to the hands-on support that handled the rest.</p><h3>The Challenge: Moving a Production Data Layer Without Disrupting It</h3><p>Katana’s existing subgraph queries were wired into production and had to keep working. Data quality and expected behaviour had to be preserved. And it had to be efficient, a swap, not a multi-week infrastructure project. For DeFi data, correctness and uptime were non-negotiable, because their application and users depended on it.</p><p>During development, the team also noticed the existing subgraph data often running around three blocks behind the chain head. For user-facing DeFi data, that kind of freshness gap matters.</p><h3>The Solution: A Subgraph-Compatible Path off The Graph</h3><p>The migration came down to two things. Envio’s tooling fit the setup Katana already had, and the support was there at every step.</p><p>The foundation was schema parity. The HyperIndex deployment reproduces the original Sushi V3 subgraph entity-for-entity, all 23 entity types, tracking the Uniswap V3 factory, the position manager, and every pool it deploys. Same entities, same shape, so Katana did not have to redesign its data or rebuild against a new model.</p><p>Envio exposes two GraphQL endpoints, a subgraph-compatible one that runs existing subgraph-style queries as a drop-in, and a native one with the full query feature set. Katana’s standard queries ran against the compatible endpoint, and for the full feature set its app needed, Katana standardised on the native endpoint, with the Envio team working through the move alongside them.</p><h3>Contracts Indexed</h3><p>The SushiSwap V3 indexer runs on Katana mainnet:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qJN7p0dAJnnIdQaQ_OQUGQ.png" /></figure><p>The process was a fork-and-deploy flow. Katana forked the indexer, connected it to Envio Cloud, and deployed, while the Envio team handled the backend configuration, set up the subgraph-compatible endpoint, and managed the caching for the deployment. The team could also validate on a fast instance first. With the most RPC-heavy fields turned off, backfill ran about ten times faster, so they could confirm everything looked right before running the full indexer with every field populated.</p><p>The Envio team set up the endpoints, configured the caching, and worked through the query migration directly with Katana’s engineers.</p><h3>The Results</h3><p>Katana migrated both production subgraphs, SushiSwap V3 and the Sushi staker, from The Graph to Envio. Its existing queries kept working through the subgraph-compatible endpoint, so the app did not need a rewrite. A third subgraph, a pre-staking one with deprecation already planned, was left as-is by design.</p><p><em>The SushiSwap V3 indexer on Envio, fully synced (11,473,382 events) in about two hours.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SudKSTVZIf2VupSq.png" /></figure><p><em>The Sushi staker subgraph, fully synced (68,201 events) in under 20 seconds on Envio.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8ICZiuF9dtiRvEJq.png" /></figure><p>With the migration complete, both SushiSwap indexers run on Envio Cloud, serving Katana’s app through the same queries it used before. Where the original subgraph had drifted a few blocks behind, the new indexer indexes in real time at the chain head.</p><blockquote>“The comprehensive resources and proactive support provided by the Envio team made our migration from The Graph remarkably smooth and efficient.”</blockquote><blockquote>Kirienzo, Senior Software Engineer, Katana</blockquote><h3>Before and After the Migration</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yqpYr7d4ilIL_uJC1B8vDA.png" /></figure><h3>What Carries Over When You Move Off The Graph</h3><p>A subgraph rarely sits on its own. Queries, dashboards, and app code are all built against its schema, which is what makes moving it feel risky. The part that carries over cleanly is the data model. Because the HyperIndex indexer reproduced the Sushi V3 subgraph entity-for-entity, Katana did not have to redesign its data or rebuild against a new model. On the query side, Envio gives you a subgraph-compatible endpoint for a drop-in start and a native GraphQL endpoint for the full feature set, and Katana’s app runs on the native one.</p><p>For a team considering a migration off The Graph, Envio’s subgraph-compatible endpoint is what makes it a swap rather than a multi-week rebuild.</p><h3>Relevant Resources</h3><ul><li><a href="https://github.com/katana-network/katana-sushi-v3-subgraph">Katana SushiSwap V3 indexer (GitHub)</a></li><li><a href="https://thegraph.com/explorer/subgraphs/2hnbrb3a4zWmQDkAbvDmYsBLGMWSaH6vAYcJnUJcLe1B?view=Query&amp;chain=arbitrum-one">Original Sushi staker subgraph on The Graph</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/katana">Indexing Katana Data with Envio</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">Migrating from The Graph</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/contract-import">HyperIndex Quickstart</a></li><li><a href="https://docs.envio.dev/docs/HyperSync/overview">HyperSync</a></li><li><a href="https://docs.envio.dev/docs/HyperIndex/hosted-service">Envio Cloud</a></li></ul><h3>Frequently Asked Questions</h3><h3>What is Katana?</h3><p>Katana is a DeFi-focused blockchain, designed to concentrate liquidity into a small set of core applications instead of spreading it thin across many. SushiSwap V3 is its spot exchange, which is why the Katana app surfaces SushiSwap data such as pools, swaps, fees, and staking to its users.</p><h3>What is SushiSwap?</h3><p>SushiSwap is a decentralised exchange (DEX). Its V3 deployment, the concentrated-liquidity version, is Katana’s spot trading venue, and it generates the pools, positions, swaps, and fees that the migrated subgraphs index.</p><h3>What did Katana migrate?</h3><p>Two production subgraphs, the SushiSwap V3 subgraph and the Sushi staker subgraph, both from The Graph to Envio HyperIndex. A third, pre-staking subgraph scheduled for deprecation was not migrated.</p><h3>What did Katana have to change to migrate?</h3><p>The data model carried over entity-for-entity, so there was no schema rebuild. Katana’s existing queries ran against Envio’s subgraph-compatible endpoint, and for the full GraphQL feature set its app needed, Katana moved its queries onto Envio’s native endpoint, with the Envio team supporting the move.</p><h3>What is the subgraph-compatible endpoint?</h3><p>It is an Envio feature that runs existing The Graph subgraph-style GraphQL queries against a HyperIndex deployment, a drop-in path for standard subgraph queries. For the full GraphQL feature set, Envio also exposes a native endpoint, which is what Katana’s app runs on.</p><h3>How do I migrate from The Graph to HyperIndex?</h3><p>HyperIndex handlers are written in TypeScript, and AssemblyScript is a subset of TypeScript, so most handler logic carries across directly. Envio provides a <a href="https://docs.envio.dev/docs/HyperIndex/migration-guide">migration guide</a>, a subgraph-compatible endpoint that preserves existing queries, and hands-on migration support.</p><h3>Build With Envio</h3><p>Envio is a real-time multichain blockchain indexer that turns onchain events into a queryable GraphQL API. Supports any EVM chain, plus Solana and Fuel. Use Envio Cloud or self-host. If you’re building onchain, come talk to us about your data needs.</p><p><a href="https://envio.beehiiv.com/subscribe?utm_source=envio.beehiiv.com&amp;utm_medium=newsletter&amp;utm_campaign=new-post">Subscribe to our newsletter</a></p><p><a href="https://envio.dev/">Website</a> | <a href="https://x.com/envio_indexer">X</a> | <a href="https://discord.gg/envio">Discord</a> | <a href="https://t.me/+kAIGElzPjApiMjI0">Telegram</a> | <a href="https://github.com/enviodev">GitHub</a> | <a href="https://www.youtube.com/channel/UCR7nZ2yzEtc5SZNM0dhrkhA">YouTube</a> | <a href="https://www.reddit.com/user/Envio_indexer">Reddit</a></p><p><em>Originally published at </em><a href="https://docs.envio.dev/blog/case-study-katana-sushiswap"><em>https://docs.envio.dev</em></a><em> on May 28, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3ba863150daa" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>