This skill should be used when the user asks to "migrate from subgraph", "convert subgraph to hyperindex", "migrate from thegraph", "port subgraph", "convert subgraph handlers", "migrate assemblyscript to typescript", or mentions TheGraph, subgraph migration, subgraph.yaml conversion, or converting from TheGraph to Envio. For core HyperIndex development patterns, refer to the hyperindex-development skill.
Migrates TheGraph subgraphs to Envio HyperIndex by converting config files, schemas, and AssemblyScript handlers to TypeScript. Triggers on requests to migrate from TheGraph/subgraph, convert handlers, or mentions of TheGraph/Envio migration.
/plugin marketplace add enviodev/envio-plugins/plugin install envio-hyperindex@envio-pluginsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
references/common-mistakes.mdreferences/migration-patterns.mdMigrate from TheGraph subgraphs to Envio HyperIndex. HyperIndex delivers up to 100x faster indexing with a developer-friendly TypeScript API.
Three major steps:
subgraph.yaml → config.yamlTheGraph:
specVersion: 0.0.4
dataSources:
- kind: ethereum/contract
name: Factory
network: mainnet
source:
address: "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f"
startBlock: 10000835
abi: Factory
mapping:
eventHandlers:
- event: PairCreated(indexed address,indexed address,address,uint256)
handler: handlePairCreated
templates:
- name: Pair
source:
abi: Pair
HyperIndex:
name: my-indexer
networks:
- id: 1
start_block: 10000835
contracts:
- name: Factory
address: 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
handler: src/factory.ts
events:
- event: PairCreated(address indexed token0, address indexed token1, address pair, uint256)
- name: Pair
handler: src/pair.ts # No address - dynamic
events:
- event: Swap(...)
Key differences:
dataSources, templates, mapping nestingnetworks → contracts structure# TheGraph
type Token @entity {
id: ID!
symbol: String!
}
# HyperIndex
type Token {
id: ID!
symbol: String!
}
# TheGraph
address: Bytes!
# HyperIndex
address: String!
# TheGraph
type Transfer @entity {
token: Token!
}
# HyperIndex - use _id suffix
type Transfer {
token_id: String!
}
# TheGraph (sometimes implicit)
type Token @entity {
transfers: [Transfer!]!
}
# HyperIndex - REQUIRED explicit @derivedFrom
type Token {
transfers: [Transfer!]! @derivedFrom(field: "token")
}
type Transfer {
token_id: String! # The field referenced by @derivedFrom
}
Critical: Arrays without @derivedFrom cause codegen error EE211.
TheGraph (AssemblyScript):
export function handleTransfer(event: TransferEvent): void {
let entity = new Transfer(event.transaction.hash.toHexString());
entity.from = event.params.from;
entity.to = event.params.to;
entity.amount = event.params.value;
entity.save();
}
HyperIndex (TypeScript):
import { MyContract } from "generated";
MyContract.Transfer.handler(async ({ event, context }) => {
const entity = {
id: `${event.chainId}-${event.transaction.hash}-${event.logIndex}`,
from: event.params.from,
to: event.params.to,
amount: event.params.value,
blockNumber: BigInt(event.block.number),
};
context.Transfer.set(entity);
});
TheGraph:
let token = Token.load(id);
if (token == null) {
token = new Token(id);
}
HyperIndex:
let token = await context.Token.get(id);
if (!token) {
token = { id, name: "Unknown", /* ... */ };
}
TheGraph:
token.totalSupply = newSupply;
token.save();
HyperIndex (use spread - entities are immutable):
context.Token.set({
...token,
totalSupply: newSupply,
});
TheGraph:
import { Pair as PairTemplate } from "../generated/templates";
PairTemplate.create(event.params.pair);
HyperIndex:
// Register BEFORE handler
Factory.PairCreated.contractRegister(({ event, context }) => {
context.addPair(event.params.pair);
});
Factory.PairCreated.handler(async ({ event, context }) => {
// Handle event...
});
TheGraph:
let contract = ERC20.bind(address);
let name = contract.name();
HyperIndex (use Effect API):
import { createEffect, S } from "envio";
export const getTokenName = createEffect({
name: "getTokenName",
input: S.string,
output: S.string,
cache: true,
}, async ({ input: address }) => {
// Use viem for RPC calls
const name = await client.readContract({
address: address as `0x${string}`,
abi: ERC20_ABI,
functionName: "name",
});
return name;
});
// In handler
const name = await context.effect(getTokenName, address);
// WRONG - returns {} instead of entity
const token = context.Token.get(id);
// CORRECT
const token = await context.Token.get(id);
# Add to config.yaml for event.transaction.hash access
events:
- event: Transfer(...)
field_selection:
transaction_fields:
- hash
// Always prefix with chainId for multichain
const id = `${event.chainId}-${originalId}`;
Maintain precision from original subgraph:
import { BigDecimal } from "generated";
const ZERO_BD = new BigDecimal(0);
const ONE_BD = new BigDecimal(1);
// Don't simplify to JavaScript numbers
For detailed migration patterns:
references/migration-patterns.md - Complete pattern referencereferences/common-mistakes.md - Pitfalls and solutionsThis skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.