diff --git a/package.json b/package.json index 648ce0f..95bb3ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "solana-agent-kit", - "version": "1.3.5", + "version": "1.3.6", "description": "connect any ai agents to solana protocols", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/actions/pythFetchPrice.ts b/src/actions/pythFetchPrice.ts index 3f9b9de..b25dbba 100644 --- a/src/actions/pythFetchPrice.ts +++ b/src/actions/pythFetchPrice.ts @@ -30,10 +30,10 @@ const pythFetchPriceAction: Action = { ], ], schema: z.object({ - priceFeedId: z + tokenSymbol: z .string() .min(1) - .describe("The Pyth price feed ID to fetch the price from"), + .describe("The token symbol to fetch the price for"), }), handler: async (_agent: SolanaAgentKit, input: Record) => { try { diff --git a/src/agent/index.ts b/src/agent/index.ts index a28c899..e82a464 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -23,8 +23,8 @@ import { registerDomain, request_faucet_funds, trade, - limitOrder, - batchOrder, + // limitOrder, + // batchOrder, cancelAllOrders, withdrawAll, closePerpTradeShort, @@ -69,7 +69,7 @@ import { MintCollectionNFTResponse, PumpfunLaunchResponse, PumpFunTokenOptions, - OrderParams, + // OrderParams, } from "../types"; /** @@ -190,21 +190,21 @@ export class SolanaAgentKit { return trade(this, outputMint, inputAmount, inputMint, slippageBps); } - async limitOrder( - marketId: PublicKey, - quantity: number, - side: string, - price: number, - ): Promise { - return limitOrder(this, marketId, quantity, side, price); - } + // async limitOrder( + // marketId: PublicKey, + // quantity: number, + // side: string, + // price: number, + // ): Promise { + // return limitOrder(this, marketId, quantity, side, price); + // } - async batchOrder( - marketId: PublicKey, - orders: OrderParams[], - ): Promise { - return batchOrder(this, marketId, orders); - } + // async batchOrder( + // marketId: PublicKey, + // orders: OrderParams[], + // ): Promise { + // return batchOrder(this, marketId, orders); + // } async cancelAllOrders(marketId: PublicKey): Promise { return cancelAllOrders(this, marketId); diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 97810e8..ac6319f 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -4,11 +4,10 @@ import Decimal from "decimal.js"; import { Tool } from "langchain/tools"; import { GibworkCreateTaskReponse, - OrderParams, PythFetchPriceResponse, SolanaAgentKit, } from "../index"; -import { create_image, FEE_TIERS, generateOrdersfromPattern } from "../tools"; +import { create_image, FEE_TIERS } from "../tools"; export class SolanaBalanceTool extends Tool { name = "solana_balance"; @@ -414,143 +413,143 @@ export class SolanaTradeTool extends Tool { } } -export class SolanaLimitOrderTool extends Tool { - name = "solana_limit_order"; - description = `This tool can be used to place limit orders using Manifest. +// export class SolanaLimitOrderTool extends Tool { +// name = "solana_limit_order"; +// description = `This tool can be used to place limit orders using Manifest. - Do not allow users to place multiple orders with this instruction, use solana_batch_order instead. +// Do not allow users to place multiple orders with this instruction, use solana_batch_order instead. - Inputs ( input is a JSON string ): - marketId: PublicKey, eg "ENhU8LsaR7vDD2G1CsWcsuSGNrih9Cv5WZEk7q9kPapQ" for SOL/USDC (required) - quantity: number, eg 1 or 0.01 (required) - side: string, eg "Buy" or "Sell" (required) - price: number, in tokens eg 200 for SOL/USDC (required)`; +// Inputs ( input is a JSON string ): +// marketId: PublicKey, eg "ENhU8LsaR7vDD2G1CsWcsuSGNrih9Cv5WZEk7q9kPapQ" for SOL/USDC (required) +// quantity: number, eg 1 or 0.01 (required) +// side: string, eg "Buy" or "Sell" (required) +// price: number, in tokens eg 200 for SOL/USDC (required)`; - constructor(private solanaKit: SolanaAgentKit) { - super(); - } +// constructor(private solanaKit: SolanaAgentKit) { +// super(); +// } - protected async _call(input: string): Promise { - try { - const parsedInput = JSON.parse(input); +// protected async _call(input: string): Promise { +// try { +// const parsedInput = JSON.parse(input); - const tx = await this.solanaKit.limitOrder( - new PublicKey(parsedInput.marketId), - parsedInput.quantity, - parsedInput.side, - parsedInput.price, - ); +// const tx = await this.solanaKit.limitOrder( +// new PublicKey(parsedInput.marketId), +// parsedInput.quantity, +// parsedInput.side, +// parsedInput.price, +// ); - return JSON.stringify({ - status: "success", - message: "Trade executed successfully", - transaction: tx, - marketId: parsedInput.marketId, - quantity: parsedInput.quantity, - side: parsedInput.side, - price: parsedInput.price, - }); - } catch (error: any) { - return JSON.stringify({ - status: "error", - message: error.message, - code: error.code || "UNKNOWN_ERROR", - }); - } - } -} +// return JSON.stringify({ +// status: "success", +// message: "Trade executed successfully", +// transaction: tx, +// marketId: parsedInput.marketId, +// quantity: parsedInput.quantity, +// side: parsedInput.side, +// price: parsedInput.price, +// }); +// } catch (error: any) { +// return JSON.stringify({ +// status: "error", +// message: error.message, +// code: error.code || "UNKNOWN_ERROR", +// }); +// } +// } +// } -export class SolanaBatchOrderTool extends Tool { - name = "solana_batch_order"; - description = `Places multiple limit orders in one transaction using Manifest. Submit orders either as a list or pattern: +// export class SolanaBatchOrderTool extends Tool { +// name = "solana_batch_order"; +// description = `Places multiple limit orders in one transaction using Manifest. Submit orders either as a list or pattern: - 1. List format: - { - "marketId": "ENhU8LsaR7vDD2G1CsWcsuSGNrih9Cv5WZEk7q9kPapQ", - "orders": [ - { "quantity": 1, "side": "Buy", "price": 200 }, - { "quantity": 0.5, "side": "Sell", "price": 205 } - ] - } +// 1. List format: +// { +// "marketId": "ENhU8LsaR7vDD2G1CsWcsuSGNrih9Cv5WZEk7q9kPapQ", +// "orders": [ +// { "quantity": 1, "side": "Buy", "price": 200 }, +// { "quantity": 0.5, "side": "Sell", "price": 205 } +// ] +// } - 2. Pattern format: - { - "marketId": "ENhU8LsaR7vDD2G1CsWcsuSGNrih9Cv5WZEk7q9kPapQ", - "pattern": { - "side": "Buy", - "totalQuantity": 100, - "priceRange": { "max": 1.0 }, - "spacing": { "type": "percentage", "value": 1 }, - "numberOfOrders": 5 - } - } +// 2. Pattern format: +// { +// "marketId": "ENhU8LsaR7vDD2G1CsWcsuSGNrih9Cv5WZEk7q9kPapQ", +// "pattern": { +// "side": "Buy", +// "totalQuantity": 100, +// "priceRange": { "max": 1.0 }, +// "spacing": { "type": "percentage", "value": 1 }, +// "numberOfOrders": 5 +// } +// } - Examples: - - "Place 5 buy orders totaling 100 tokens, 1% apart below $1" - - "Create 3 sell orders of 10 tokens each between $50-$55" - - "Place buy orders worth 50 tokens, $0.10 spacing from $0.80" +// Examples: +// - "Place 5 buy orders totaling 100 tokens, 1% apart below $1" +// - "Create 3 sell orders of 10 tokens each between $50-$55" +// - "Place buy orders worth 50 tokens, $0.10 spacing from $0.80" - Important: All orders must be in one transaction. Combine buy and sell orders into a single pattern or list. Never break the orders down to individual buy or sell orders.`; +// Important: All orders must be in one transaction. Combine buy and sell orders into a single pattern or list. Never break the orders down to individual buy or sell orders.`; - constructor(private solanaKit: SolanaAgentKit) { - super(); - } +// constructor(private solanaKit: SolanaAgentKit) { +// super(); +// } - protected async _call(input: string): Promise { - try { - const parsedInput = JSON.parse(input); - let ordersToPlace: OrderParams[] = []; +// protected async _call(input: string): Promise { +// try { +// const parsedInput = JSON.parse(input); +// let ordersToPlace: OrderParams[] = []; - if (!parsedInput.marketId) { - throw new Error("Market ID is required"); - } +// if (!parsedInput.marketId) { +// throw new Error("Market ID is required"); +// } - if (parsedInput.pattern) { - ordersToPlace = generateOrdersfromPattern(parsedInput.pattern); - } else if (Array.isArray(parsedInput.orders)) { - ordersToPlace = parsedInput.orders; - } else { - throw new Error("Either pattern or orders array is required"); - } +// if (parsedInput.pattern) { +// ordersToPlace = generateOrdersfromPattern(parsedInput.pattern); +// } else if (Array.isArray(parsedInput.orders)) { +// ordersToPlace = parsedInput.orders; +// } else { +// throw new Error("Either pattern or orders array is required"); +// } - if (ordersToPlace.length === 0) { - throw new Error("No orders generated or provided"); - } +// if (ordersToPlace.length === 0) { +// throw new Error("No orders generated or provided"); +// } - ordersToPlace.forEach((order: OrderParams, index: number) => { - if (!order.quantity || !order.side || !order.price) { - throw new Error( - `Invalid order at index ${index}: quantity, side, and price are required`, - ); - } - if (order.side !== "Buy" && order.side !== "Sell") { - throw new Error( - `Invalid side at index ${index}: must be "Buy" or "Sell"`, - ); - } - }); +// ordersToPlace.forEach((order: OrderParams, index: number) => { +// if (!order.quantity || !order.side || !order.price) { +// throw new Error( +// `Invalid order at index ${index}: quantity, side, and price are required`, +// ); +// } +// if (order.side !== "Buy" && order.side !== "Sell") { +// throw new Error( +// `Invalid side at index ${index}: must be "Buy" or "Sell"`, +// ); +// } +// }); - const tx = await this.solanaKit.batchOrder( - new PublicKey(parsedInput.marketId), - parsedInput.orders, - ); +// const tx = await this.solanaKit.batchOrder( +// new PublicKey(parsedInput.marketId), +// parsedInput.orders, +// ); - return JSON.stringify({ - status: "success", - message: "Batch order executed successfully", - transaction: tx, - marketId: parsedInput.marketId, - orders: parsedInput.orders, - }); - } catch (error: any) { - return JSON.stringify({ - status: "error", - message: error.message, - code: error.code || "UNKNOWN_ERROR", - }); - } - } -} +// return JSON.stringify({ +// status: "success", +// message: "Batch order executed successfully", +// transaction: tx, +// marketId: parsedInput.marketId, +// orders: parsedInput.orders, +// }); +// } catch (error: any) { +// return JSON.stringify({ +// status: "error", +// message: error.message, +// code: error.code || "UNKNOWN_ERROR", +// }); +// } +// } +// } export class SolanaCancelAllOrdersTool extends Tool { name = "solana_cancel_all_orders"; @@ -2153,8 +2152,8 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaRaydiumCreateCpmm(solanaKit), new SolanaOpenbookCreateMarket(solanaKit), new SolanaManifestCreateMarket(solanaKit), - new SolanaLimitOrderTool(solanaKit), - new SolanaBatchOrderTool(solanaKit), + // new SolanaLimitOrderTool(solanaKit), + // new SolanaBatchOrderTool(solanaKit), new SolanaCancelAllOrdersTool(solanaKit), new SolanaWithdrawAllTool(solanaKit), new SolanaClosePosition(solanaKit), diff --git a/src/tools/index.ts b/src/tools/index.ts index 2544fed..1f6e9f5 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,5 +1,5 @@ export * from "./adrena_perp_trading"; -export * from "./batch_order"; +// export * from "./batch_order"; export * from "./cancel_all_orders"; export * from "./create_gibwork_task"; export * from "./create_image"; @@ -20,7 +20,7 @@ export * from "./get_tps"; export * from "./get_wallet_address"; export * from "./launch_pumpfun_token"; export * from "./lend"; -export * from "./limit_order"; +// export * from "./limit_order"; export * from "./manifest_create_market"; export * from "./mint_nft"; export * from "./openbook_create_market"; diff --git a/src/tools/pyth_fetch_price.ts b/src/tools/pyth_fetch_price.ts index 35d619c..3ed87f5 100644 --- a/src/tools/pyth_fetch_price.ts +++ b/src/tools/pyth_fetch_price.ts @@ -11,9 +11,9 @@ export async function fetchPythPriceFeedID( ): Promise { try { const stableHermesServiceUrl: string = "https://hermes.pyth.network"; - + const response = await fetch( - `${stableHermesServiceUrl}/v2/price_feeds/?query=${tokenSymbol}&asset_type=crypto`, + `${stableHermesServiceUrl}/v2/price_feeds?query=${tokenSymbol}&asset_type=crypto`, ); if (!response.ok) { @@ -60,7 +60,7 @@ export async function fetchPythPrice(feedID: string): Promise { const stableHermesServiceUrl: string = "https://hermes.pyth.network"; const response = await fetch( - `${stableHermesServiceUrl}/v2/updates/price/latest/?ids[]=${feedID}`, + `${stableHermesServiceUrl}/v2/updates/price/latest?ids[]=${feedID}`, ); const data = await response.json();