import { z } from "zod";
import axios, { AxiosResponse } from "axios";
import { baseUri, chainName } from "../../constants";
interface TokenHoldersResponse {
cursor: string;
resultCount: number;
tokenHolders: {
address: string;
balance: string;
}[];
}
export default function (server: any) {
server.tool(
"getTokenHolders",
"Commonly used to get a list of all the token holders for a specified ERC20 or ERC721 token. Returns historic token holders when block-height is set (defaults to latest). Useful for building pie charts of token holders.",
{
chainName: z.literal(chainName),
tokenAddress: z.string().describe("Token address to fetch holders for"),
authToken: z
.string()
.describe("Authorization token for accessing the Somnia API"),
},
{
title: "Get Token Holders",
readOnlyHint: true,
description:
"Fetch the token holders for a specific token contract.",
destructiveHint: false,
},
async (args:any) => {
const { chainName, tokenAddress, authToken } = args;
try {
const response: AxiosResponse<TokenHoldersResponse> = await axios.get(
`${baseUri}/${chainName}/v1/tokens/${tokenAddress}/holders`,
{
headers: {
Authorization: `Bearer ${authToken}`,
"Content-Type": "application/json",
Accept: "application/json",
},
}
);
return {
content: [
{
type: "text",
text: `Token Holders Data: ${JSON.stringify(response.data)}`,
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error fetching token holders: ${error}`,
},
],
};
}
}
);
}