@agentek/tools
Version:
Blockchain tools for AI agents
157 lines • 7.41 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 the current state of a Uniswap V3 pool including sqrtPriceX96, current tick, and whether the pool is unlocked.",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
poolAddress: zod_1.z.string().describe("The Uniswap V3 pool contract address (0x...)"),
chainId: zod_1.z.number().describe("Chain ID where the pool is deployed (e.g. 1, 8453, 42161)"),
}),
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 Uniswap V3 LP position including token pair, fee tier, tick range, liquidity, and owed fees.",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
tokenId: zod_1.z.string().describe("The NFT token ID of the LP position"),
chainId: zod_1.z.number().describe("Chain ID where the position exists (e.g. 1, 8453, 42161)"),
}),
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 LP positions owned by a user. Defaults to the connected wallet if no user address is provided.",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
chainId: zod_1.z.number().describe("Chain ID to query (e.g. 1, 8453, 42161)"),
user: zod_1.z.string().optional().describe("The wallet address to check. Omit to use the connected wallet."),
}),
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 growth globals and protocol fee data for a Uniswap V3 pool.",
supportedChains: constants_js_1.supportedChains,
parameters: zod_1.z.object({
poolAddress: utils_js_2.addressSchema.describe("The Uniswap V3 pool contract address (0x...)"),
chainId: zod_1.z.number().describe("Chain ID where the pool is deployed (e.g. 1, 8453, 42161)"),
}),
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