Files
gh-enviodev-envio-plugins-p…/skills/hyperindex-development/examples/basic-handler.ts
2025-11-29 18:26:05 +08:00

89 lines
2.4 KiB
TypeScript

/**
* Basic HyperIndex Event Handler Example
*
* This example demonstrates the fundamental patterns for handling
* blockchain events with HyperIndex.
*/
import { MyContract } from "generated";
// Simple event handler - creates a new entity for each event
MyContract.Transfer.handler(async ({ event, context }) => {
// Create unique ID using chainId, transaction hash, and log index
const id = `${event.chainId}-${event.transaction.hash}-${event.logIndex}`;
// Create the entity object with all required fields
const transfer = {
id,
from: event.params.from,
to: event.params.to,
amount: event.params.amount,
token_id: event.srcAddress, // Relationship to Token entity
blockNumber: BigInt(event.block.number),
blockTimestamp: BigInt(event.block.timestamp),
transactionHash: event.transaction.hash,
};
// Save the entity
context.Transfer.set(transfer);
});
// Handler that updates existing entities
MyContract.Approval.handler(async ({ event, context }) => {
// Load existing token entity
const tokenId = `${event.chainId}-${event.srcAddress}`;
const token = await context.Token.get(tokenId);
if (token) {
// Update entity using spread operator (entities are immutable)
const updatedToken = {
...token,
lastApprovalTime: BigInt(event.block.timestamp),
approvalCount: token.approvalCount + BigInt(1),
};
context.Token.set(updatedToken);
}
// Create approval record
const approval = {
id: `${event.chainId}-${event.transaction.hash}-${event.logIndex}`,
owner: event.params.owner,
spender: event.params.spender,
amount: event.params.value,
token_id: tokenId,
blockTimestamp: BigInt(event.block.timestamp),
};
context.Approval.set(approval);
});
// Get-or-create pattern for entities that may not exist
MyContract.Mint.handler(async ({ event, context }) => {
const tokenId = `${event.chainId}-${event.srcAddress}`;
// Try to load existing token
let token = await context.Token.get(tokenId);
if (!token) {
// Create new token with default values
token = {
id: tokenId,
address: event.srcAddress,
name: "Unknown",
symbol: "???",
decimals: BigInt(18),
totalSupply: BigInt(0),
transferCount: BigInt(0),
};
}
// Update with new values
const updatedToken = {
...token,
totalSupply: token.totalSupply + event.params.amount,
};
context.Token.set(updatedToken);
});