원클릭으로
indexer-factory
// Use when indexing contracts deployed by factory contracts at runtime. contractRegister API, dynamic contract config (no address), async registration, and same-block event coverage.
// Use when indexing contracts deployed by factory contracts at runtime. contractRegister API, dynamic contract config (no address), async registration, and same-block event coverage.
Use when something is unclear, confusing, or not covered by other skills. Search and read the latest Envio documentation without leaving the terminal.
Use when processing every block (or every Nth block) for time-series data, periodic snapshots, or block-level aggregations. indexer.onBlock API, where filter with block-number range and stride, and block handler context.
Use when writing or editing config.yaml. Chain/contract structure, addresses, start_block, event selection, field_selection, custom event names, env vars, address_format, schema/output paths, YAML validation, and deprecated options.
Use when making RPC calls, fetch requests, or any external I/O from handlers. Effect API with createEffect, S schema validation, context.effect(), preload optimization (handlers run twice), cache and rateLimit options.
Use when filtering events by indexed parameters to reduce processing volume. The `where` option supports static filters, dynamic per-chain functions, contract address filtering, and conditional enable/disable.
Use when writing or editing event handlers. Handler registration, context API (entity CRUD, getWhere queries, chain, log), spread updates, indexer runtime API, and common pitfalls.
| name | indexer-factory |
| description | Use when indexing contracts deployed by factory contracts at runtime. contractRegister API, dynamic contract config (no address), async registration, and same-block event coverage. |
| metadata | {"managed-by":"envio"} |
For contracts created at runtime by factory contracts (e.g., Uniswap Pair creation).
Dynamic contracts have no address — they're registered by contractRegister:
contracts:
- name: Factory
events:
- event: PairCreated(indexed address token0, indexed address token1, address pair, uint256)
- name: Pair
# No address — registered dynamically
events:
- event: Swap(indexed address sender, uint256 amount0In, ...)
- event: Sync(uint112 reserve0, uint112 reserve1)
chains:
- id: 1
contracts:
- name: Factory
address:
- 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
- name: Pair
# No address here — will be registered by contractRegister
Must be defined BEFORE the handler. Registers new contract addresses for indexing:
Factory.PairCreated.contractRegister(({ event, context }) => {
context.addPair(event.params.pair);
});
Factory.PairCreated.handler(async ({ event, context }) => {
const pair: Pair = {
id: `${event.chainId}-${event.params.pair}`,
token0_id: `${event.chainId}-${event.params.token0}`,
token1_id: `${event.chainId}-${event.params.token1}`,
};
context.Pair.set(pair);
});
The context.add<ContractName>() methods are auto-generated based on contracts in config that have no address.
Perform external calls to decide which contract to register:
NftFactory.SimpleNftCreated.contractRegister(async ({ event, context }) => {
const version = await getContractVersion(event.params.contractAddress);
if (version === "v2") {
context.addSimpleNftV2(event.params.contractAddress);
} else {
context.addSimpleNft(event.params.contractAddress);
}
});
When a dynamic contract is registered, the Envio Indexer indexes all events from that contract in the same block where it was created — even events from earlier transactions in that block.
If something is unclear, use the
envio-docsskill to search and read the latest documentation.