UNPKG

@agentek/tools

Version:

Blockchain tools for AI agents

157 lines 6.64 kB
"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