@agentek/tools
Version:
Blockchain tools for AI agents
157 lines • 6.64 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPositionDetails = exports.getPoolFeeData = exports.getUserPositions = exports.getUniV3Pool = void 0;
const zod_1 = require("zod");
const client_js_1 = require("../client.js");
const utils_js_1 = require("../utils.js");
const constants_js_1 = require("./constants.js");
const viem_1 = require("viem");
const utils_js_2 = require("../utils.js");
const getUniV3Pool = (0, client_js_1.createTool)({
name: "getUniV3Pool",
description: "Gets information about a Uniswap V3 pool",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
poolAddress: zod_1.z.string(),
chainId: zod_1.z.number(),
}),
execute: async (client, args) => {
const publicClient = client.getPublicClient(args.chainId);
const poolData = await publicClient.readContract({
address: args.poolAddress,
abi: constants_js_1.uniV3poolAbi,
functionName: "slot0",
});
return (0, utils_js_1.clean)({
sqrtPriceX96: poolData[0].toString(),
tick: poolData[1].toString(),
unlocked: poolData[6],
});
},
});
exports.getUniV3Pool = getUniV3Pool;
const getPositionDetails = (0, client_js_1.createTool)({
name: "getPositionDetails",
description: "Gets detailed information about a specific LP position",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
tokenId: zod_1.z.string(),
chainId: zod_1.z.number(),
}),
execute: async (client, { tokenId, chainId }) => {
const publicClient = client.getPublicClient(chainId);
const data = await publicClient.multicall({
contracts: [
{
address: (0, constants_js_1.getPositionManagerAddress)(chainId),
abi: constants_js_1.nonfungiblePositionManagerAbi,
functionName: "positions",
args: [BigInt(tokenId)],
},
{
address: (0, constants_js_1.getPositionManagerAddress)(chainId),
abi: viem_1.erc721Abi,
functionName: "ownerOf",
args: [BigInt(tokenId)],
},
],
});
const [position, owner] = data;
return (0, utils_js_1.clean)({
owner: owner.result,
token0: position.result?.[2],
token1: position.result?.[3],
fee: position.result?.[4],
tickLower: position.result?.[5],
tickUpper: position.result?.[6],
liquidity: position.result?.[7].toString(),
tokensOwed0: position.result?.[10].toString(),
tokensOwed1: position.result?.[11].toString(),
});
},
});
exports.getPositionDetails = getPositionDetails;
const getUserPositions = (0, client_js_1.createTool)({
name: "getUserPositions",
description: "Gets all Uniswap V3 positions for a user",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
chainId: zod_1.z.number(),
user: zod_1.z.string().optional(),
}),
execute: async (client, { chainId, user }) => {
const publicClient = client.getPublicClient(chainId);
const owner = user || (await client.getAddress());
const balance = await publicClient.readContract({
address: (0, constants_js_1.getPositionManagerAddress)(chainId),
abi: constants_js_1.nonfungiblePositionManagerAbi,
functionName: "balanceOf",
args: [owner],
});
const tokenIds = await Promise.all(Array.from({ length: Number(balance) }).map((_, i) => publicClient.readContract({
address: (0, constants_js_1.getPositionManagerAddress)(chainId),
abi: constants_js_1.nonfungiblePositionManagerAbi,
functionName: "tokenOfOwnerByIndex",
args: [owner, BigInt(i)],
})));
const positionDetails = await Promise.all(tokenIds.map((tokenId) => publicClient.readContract({
address: (0, constants_js_1.getPositionManagerAddress)(chainId),
abi: constants_js_1.nonfungiblePositionManagerAbi,
functionName: "positions",
args: [tokenId],
})));
return (0, utils_js_1.clean)({
positions: tokenIds.map((id, index) => ({
tokenId: id.toString(),
token0: positionDetails[index][2],
token1: positionDetails[index][3],
fee: positionDetails[index][4],
tickLower: positionDetails[index][5],
tickUpper: positionDetails[index][6],
liquidity: positionDetails[index][7].toString(),
tokensOwed0: positionDetails[index][10].toString(),
tokensOwed1: positionDetails[index][11].toString(),
})),
});
},
});
exports.getUserPositions = getUserPositions;
const getPoolFeeData = (0, client_js_1.createTool)({
name: "getPoolFeeData",
description: "Gets fee-related data for a pool",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
poolAddress: utils_js_2.addressSchema,
chainId: zod_1.z.number(),
}),
execute: async (client, { poolAddress, chainId }) => {
const publicClient = client.getPublicClient(chainId);
const [feeGrowthGlobal0X128, feeGrowthGlobal1X128, protocolFees] = await publicClient.multicall({
contracts: [
{
address: poolAddress,
abi: constants_js_1.uniV3poolAbi,
functionName: "feeGrowthGlobal0X128",
},
{
address: poolAddress,
abi: constants_js_1.uniV3poolAbi,
functionName: "feeGrowthGlobal1X128",
},
{
address: poolAddress,
abi: constants_js_1.uniV3poolAbi,
functionName: "protocolFees",
},
],
});
return (0, utils_js_1.clean)({
feeGrowth0: feeGrowthGlobal0X128.result?.toString() || "0",
feeGrowth1: feeGrowthGlobal1X128.result?.toString() || "0",
protocolFeesToken0: protocolFees.result?.[0]?.toString() || "0",
protocolFeesToken1: protocolFees.result?.[1]?.toString() || "0",
});
},
});
exports.getPoolFeeData = getPoolFeeData;
//# sourceMappingURL=tools.js.map