build_event_topic
Generates event topic signatures for blockchain events by specifying the event name and argument types, enabling accurate data retrieval and analysis on supported networks.
Instructions
Builds an event topic signature based on event name and arguments
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | Yes | Event arguments types | |
| name | Yes | Event name (e.g., "Transfer(address,address,uint256)") | |
| network | Yes | The blockchain network (e.g., "ethereum", "base") |
Implementation Reference
- src/operations/events.ts:123-176 (handler)The main handler function that executes the tool logic: validates inputs implicitly via caller, processes arguments, makes authenticated POST request to Bankless API to build the event topic signature, and handles various errors.export async function buildEventTopic( network: string, name: string, arguments_: z.infer<typeof OutputSchema>[] ): Promise<string> { const token = process.env.BANKLESS_API_TOKEN; if (!token) { throw new BanklessAuthenticationError('BANKLESS_API_TOKEN environment variable is not set'); } const endpoint = `${BASE_URL}/chains/${network}/contract/build-event-topic`; const cleanedOutputs = processOutputs(arguments_); try { const response = await axios.post( endpoint, { name, arguments: cleanedOutputs }, { headers: { 'Content-Type': 'application/json', 'X-BANKLESS-TOKEN': `${token}` } } ); return response.data; } catch (error) { if (axios.isAxiosError(error)) { const statusCode = error.response?.status || 'unknown'; const errorMessage = error.response?.data?.message || error.message; if (statusCode === 401 || statusCode === 403) { throw new BanklessAuthenticationError(`Authentication Failed: ${errorMessage}`); } else if (statusCode === 404) { throw new BanklessResourceNotFoundError(`Not Found: ${errorMessage}`); } else if (statusCode === 422) { throw new BanklessValidationError(`Validation Error: ${errorMessage}`, error.response?.data); } else if (statusCode === 429) { // Extract reset timestamp or default to 60 seconds from now const resetAt = new Date(); resetAt.setSeconds(resetAt.getSeconds() + 60); throw new BanklessRateLimitError(`Rate Limit Exceeded: ${errorMessage}`, resetAt); } throw new Error(`Bankless API Error (${statusCode}): ${errorMessage}`); } throw new Error(`Failed to build event topic: ${error instanceof Error ? error.message : String(error)}`); } }
- src/operations/events.ts:24-28 (schema)Input schema using Zod for validating the tool's parameters: network, event name, and array of argument types.export const BuildEventTopicSchema = z.object({ network: z.string().describe('The blockchain network (e.g., "ethereum", "base")'), name: z.string().describe('Event name (e.g., "Transfer(address,address,uint256)")'), arguments: z.array(OutputSchema).describe('Event arguments types') });
- src/index.ts:104-108 (registration)Tool registration in the MCP server's ListTools handler, specifying name, description, and input schema.{ name: "build_event_topic", description: "Builds an event topic signature based on event name and arguments", inputSchema: zodToJsonSchema(events.BuildEventTopicSchema), },
- src/index.ts:206-216 (registration)Dispatch handler in the MCP server's CallToolRequestHandler that parses arguments with the schema and invokes the buildEventTopic function.case "build_event_topic": { const args = events.BuildEventTopicSchema.parse(request.params.arguments); const result = await events.buildEventTopic( args.network, args.name, args.arguments ); return { content: [{type: "text", text: JSON.stringify(result, null, 2)}], }; }