import { z } from "zod";
import axios, { AxiosResponse } from "axios";
import { baseUri, chainName } from "../../constants";
interface TokenBalanceResponse {
cursor: string;
ercTokenBalances: (ERC20Balance | ERC721Balance | ERC1155Balance)[];
resultCount: number;
}
//for erc20 tokens
interface ERC20Balance {
balance: string;
contract: ERC20BalanceContract;
raw_balance: string;
}
interface ERC20BalanceContract {
address: string;
decimals: number | null;
erc_type: string;
logoUri: string | null;
name: string;
symbol: string;
}
//for erc721 tokens
interface ERC721Balance {
address: string;
ercType: string;
metadata: {
attributes: string;
description: string;
externalUrl: string;
name: string;
symbol: string;
};
tokenId: string;
tokenUri: string;
}
//for erc1155 tokens
interface ERC1155Balance {
address: string;
balance: string;
ercType: string;
metadata: {
attributes: string;
decimals: number;
};
tokenId: string;
tokenUri: string;
}
export default function (server: any) {
server.tool(
"getERC20Balance",
"Get ERC20 tokens balance of a wallet",
{
chainName: z.literal(chainName),
walletAddress: z.string().describe("Wallet address to fetch balance for"),
authToken: z
.string()
.describe("Authorization token for accessing the Somnia API"),
},
{
title: "Get ERC20 Token Balance",
readOnlyHint: true,
description:
"Fetch the ERC20 token balance for a specific wallet address.",
destructiveHint: false,
},
async (args:any) => {
const { chainName, walletAddress, authToken } = args;
try {
const response: AxiosResponse<TokenBalanceResponse> = await axios.get(
`${baseUri}/${chainName}/v1/address/${walletAddress}/balance/erc20`,
{
headers: {
Authorization: `Bearer ${authToken}`,
"Content-Type": "application/json",
Accept: "application/json",
},
}
);
return {
content: [
{
type: "text",
text: `ERC20 Token Balance Data: ${JSON.stringify(
response.data
)}`,
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error fetching token balance: ${error}`,
},
],
};
}
}
);
server.tool(
"getERC721Balance",
"Returns a list of ERC-721 token balances",
{
chainName: z.literal(chainName),
walletAddress: z.string().describe("Wallet address to fetch balance for"),
authToken: z
.string()
.describe("Authorization token for accessing the Somnia API"),
},
{
title: "Get ERC721 Token Balance",
readOnlyHint: true,
description:
"Fetch the ERC721 token balance for a specific wallet address.",
destructiveHint: false,
},
async (args:any) => {
const { chainName, walletAddress, authToken } = args;
try {
const response: AxiosResponse<TokenBalanceResponse> = await axios.get(
`${baseUri}/${chainName}/v1/address/${walletAddress}/balance/erc721`,
{
headers: {
Authorization: `Bearer ${authToken}`,
"Content-Type": "application/json",
Accept: "application/json",
},
}
);
return {
content: [
{
type: "text",
text: `ERC721 Token Balance Data: ${JSON.stringify(
response.data
)}`,
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error fetching token balance: ${error}`,
},
],
};
}
}
);
server.tool(
"getERC1155Balance",
"Returns a list of ERC-1155 token balances",
{
chainName: z.literal(chainName),
walletAddress: z.string().describe("Wallet address to fetch balance for"),
authToken: z
.string()
.describe("Authorization token for accessing the Somnia API"),
},
{
title: "Get ERC1155 Token Balance",
readOnlyHint: true,
description:
"Fetch the ERC1155 token balance for a specific wallet address.",
destructiveHint: false,
},
async (args:any) => {
const { chainName, walletAddress, authToken } = args;
try {
const response: AxiosResponse<TokenBalanceResponse> = await axios.get(
`${baseUri}/${chainName}/v1/address/${walletAddress}/balance/erc1155`,
{
headers: {
Authorization: `Bearer ${authToken}`,
"Content-Type": "application/json",
Accept: "application/json",
},
}
);
return {
content: [
{
type: "text",
text: `ERC1155 Token Balance Data: ${JSON.stringify(
response.data
)}`,
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error fetching token balance: ${error}`,
},
],
};
}
}
);
}