From 15172ee8c6f5179412dc32fbc4591d9e023f83ab Mon Sep 17 00:00:00 2001 From: quangkeu95 Date: Fri, 17 Jan 2025 15:20:57 +0700 Subject: [PATCH] fix: Allow input normal token amounts --- src/langchain/meteora/meteora_dynamic_pool.ts | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/langchain/meteora/meteora_dynamic_pool.ts b/src/langchain/meteora/meteora_dynamic_pool.ts index 05e1992..21dbc3f 100644 --- a/src/langchain/meteora/meteora_dynamic_pool.ts +++ b/src/langchain/meteora/meteora_dynamic_pool.ts @@ -2,6 +2,8 @@ import { PublicKey } from "@solana/web3.js"; import { Tool } from "langchain/tools"; import { SolanaAgentKit } from "../../agent"; import { BN } from "bn.js"; +import { MintLayout } from "@solana/spl-token"; +import Decimal from "decimal.js"; export class SolanaMeteoraCreateDynamicPool extends Tool { name = "meteora_create_dynamic_pool"; @@ -10,8 +12,8 @@ export class SolanaMeteoraCreateDynamicPool extends Tool { Inputs (JSON string): - tokenAMint: string, token A mint (required). - tokenBMint: string, token B mint (required). - - tokenAAmount: number, token A amount including decimals, e.g., 1000000000 (required). - - tokenBAmount: number, token B amount including decimals, e.g., 1000000000 (required). + - tokenAAmount: number, token A amount not including decimals, e.g., 1 (required). + - tokenBAmount: number, token B amount not including decimals, e.g., 0.2 (required). - tradeFeeNumerator: number, trade fee numerator, e.g., 2500 for 2.5% (required). - activationType: number, pool start trading time indicator, 0 is slot and 1 is timestamp, default is 1 for timestamp (optional). - activationPoint: number, pool start trading slot / timestamp, default is null means pool can start trading immediately (optional). @@ -38,8 +40,40 @@ export class SolanaMeteoraCreateDynamicPool extends Tool { const tokenAMint = new PublicKey(inputFormat.tokenAMint); const tokenBMint = new PublicKey(inputFormat.tokenBMint); - const tokenAAmount = new BN(inputFormat.tokenAAmount.toString()); - const tokenBAmount = new BN(inputFormat.tokenBAmount.toString()); + + const tokenAMintInfo = + await this.solanaKit.connection.getAccountInfo(tokenAMint); + const tokenBMintInfo = + await this.solanaKit.connection.getAccountInfo(tokenBMint); + + if (!tokenAMintInfo) { + return JSON.stringify({ + status: "error", + message: "failed to fetch tokenAMint info", + code: "UNKNOWN_ERROR", + }); + } + if (!tokenBMintInfo) { + return JSON.stringify({ + status: "error", + message: "failed to fetch tokenBMint info", + code: "UNKNOWN_ERROR", + }); + } + + const tokenADecimals = MintLayout.decode(tokenAMintInfo.data).decimals; + const tokenBDecimals = MintLayout.decode(tokenBMintInfo.data).decimals; + + const tokenAAmount = new BN( + new Decimal(inputFormat.tokenAAmount) + .mul(10 ** tokenADecimals) + .toString(), + ); + const tokenBAmount = new BN( + new Decimal(inputFormat.tokenBAmount) + .mul(10 ** tokenBDecimals) + .toString(), + ); const tradeFeeNumerator = new BN( inputFormat.tradeFeeNumerator.toString(),