@tamago-labs/xrpl-mcp
Version:
MCP server implementation for XRP Ledger
1 lines • 61.8 kB
Source Map (JSON)
{"version":3,"sources":["../src/tools/dex/orderbook.ts","../src/config.ts","../src/index.ts","../src/mcp/xrpl/get_wallet_address_tool.ts","../src/mcp/xrpl/get_account_info_tool.ts","../src/mcp/xrpl/get_balances_tool.ts","../src/mcp/xrpl/send_payment_tool.ts","../src/mcp/token/create_token_tool.ts","../src/mcp/token/set_trust_line_tool.ts","../src/mcp/token/mint_nftoken_tool.ts","../src/mcp/token/burn_nftoken_tool.ts","../src/mcp/transaction/create_offer_tool.ts","../src/mcp/transaction/cancel_offer_tool.ts","../src/mcp/transaction/get_transaction_tool.ts","../src/mcp/transaction/get_recent_transactions_tool.ts","../src/mcp/dex/get_order_book_tool.ts","../src/mcp/dex/get_account_offers_tool.ts","../src/mcp/index.ts","../src/agent/index.ts","../src/tools/xrpl/account.ts","../src/tools/xrpl/balance.ts","../src/tools/xrpl/payment.ts","../src/tools/token/create.ts","../src/tools/token/trustline.ts","../src/tools/token/nft.ts","../src/tools/transaction/offer.ts","../src/tools/transaction/management.ts","../src/constants.ts"],"sourcesContent":["import { Agent } from '../../agent';\n\nexport async function getOrderBook(agent: Agent, takerGets: any, takerPays: any, limit: number = 20) {\n try {\n const response = await agent.client.request({\n command: 'book_offers',\n taker_gets: takerGets,\n taker_pays: takerPays,\n limit: limit\n });\n\n return {\n offers: response.result.offers || [],\n ledger_current_index: response.result.ledger_current_index\n };\n } catch (error) {\n throw new Error(`Failed to get order book: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\nexport async function getAccountOffers(agent: Agent, address: string) {\n try {\n const response = await agent.client.request({\n command: 'account_offers',\n account: address,\n ledger_index: 'current'\n });\n\n return response.result.offers || [];\n } catch (error) {\n throw new Error(`Failed to get account offers: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\nexport async function getTickerInfo(agent: Agent, takerGets: any, takerPays: any) {\n try {\n // Get recent trades by looking at order book and recent transactions\n const orderBook = await getOrderBook(agent, takerGets, takerPays, 10);\n \n return {\n pair: `${takerGets.currency || 'XRP'}/${takerPays.currency || 'XRP'}`,\n orderBook: orderBook.offers,\n timestamp: new Date().toISOString()\n };\n } catch (error) {\n throw new Error(`Failed to get ticker info: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","#!/usr/bin/env node\n\nimport { XrplConfig } from './types';\n\n\nconst getArgs = () =>\n process.argv.reduce((args: any, arg: any) => {\n // long arg\n if (arg.slice(0, 2) === \"--\") {\n const longArg = arg.split(\"=\");\n const longArgFlag = longArg[0].slice(2);\n const longArgValue = longArg.length > 1 ? longArg[1] : true;\n args[longArgFlag] = longArgValue;\n }\n // flags\n else if (arg[0] === \"-\") {\n const flags = arg.slice(1).split(\"\");\n flags.forEach((flag: any) => {\n args[flag] = true;\n });\n }\n return args;\n }, {});\n\nexport function validateEnvironment(): void {\n const args = getArgs();\n\n // Check if private key is provided\n const hasPrivateKey = !!(args?.xrpl_private_key);\n\n if (!hasPrivateKey) {\n throw new Error(\n 'Missing required environment variable: XRPL_PRIVATE_KEY must be provided'\n );\n }\n\n // Network is required\n const hasXrplNetwork = !!(args?.xrpl_network);\n if (!hasXrplNetwork) {\n throw new Error('Missing required environment variable: XRPL_NETWORK');\n }\n}\n\nexport function getXrplConfig(): XrplConfig {\n validateEnvironment();\n\n const args = getArgs();\n\n const currentEnv = {\n XRPL_PRIVATE_KEY: args?.xrpl_private_key,\n XRPL_NETWORK: args?.xrpl_network\n };\n\n return {\n privateKey: currentEnv.XRPL_PRIVATE_KEY!,\n network: (currentEnv.XRPL_NETWORK || 'testnet') as 'testnet' | 'mainnet' | 'devnet'\n };\n}\n","#!/usr/bin/env node\n\nimport { validateEnvironment } from './config';\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { XrplMcpTools } from './mcp';\nimport { Agent } from './agent';\n\n/**\n * Creates an MCP server\n */\nfunction createMcpServer(agent: Agent) {\n // Create MCP server instance\n const server = new McpServer({\n name: \"xrpl-mcp\",\n version: \"0.1.0\"\n });\n\n for (const [_key, tool] of Object.entries(XrplMcpTools)) {\n server.tool(tool.name, tool.description, tool.schema, async (params: any): Promise<any> => {\n try {\n // Execute the handler with the params directly\n const result = await tool.handler(agent, params);\n\n // Format the result as MCP tool response\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n console.error(\"error\", error);\n // Handle errors in MCP format\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text:\n error instanceof Error\n ? error.message\n : \"Unknown error occurred\",\n },\n ],\n };\n }\n });\n }\n\n return server;\n}\n\nasync function main() {\n try {\n // Validate environment before proceeding\n validateEnvironment();\n\n const myAgent = new Agent();\n\n const server = createMcpServer(myAgent);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(\"XRPL MCP server is running...\");\n } catch (error) {\n console.error('Error starting MCP server:', error);\n process.exit(1);\n }\n}\n\nmain();\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetWalletAddressTool: McpTool = {\n name: \"xrpl_get_wallet_address\",\n description: \"Get the active wallet address\",\n schema: {},\n handler: async (agent: Agent, input: Record<string, any>) => {\n const walletAddress = await agent.getWalletAddress();\n return {\n status: \"success\",\n walletAddress\n };\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetAccountInfoTool: McpTool = {\n name: \"xrpl_get_account_info\",\n description: \"Get account information for a given address\",\n schema: {\n address: z.string()\n .regex(/^r[a-zA-Z0-9]{24,34}$/)\n .optional()\n .describe(\"XRPL address to get info for (optional, defaults to wallet address)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const accountInfo = await agent.getAccountInfo(input.address);\n return {\n status: \"success\",\n accountInfo\n };\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetBalancesTool: McpTool = {\n name: \"xrpl_get_balances\",\n description: \"Get all token balances for a given address\",\n schema: {\n address: z.string()\n .regex(/^r[a-zA-Z0-9]{24,34}$/)\n .optional()\n .describe(\"XRPL address to get balances for (optional, defaults to wallet address)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const balances = await agent.getBalances(input.address);\n return {\n status: \"success\",\n balances\n };\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const SendPaymentTool: McpTool = {\n name: \"xrpl_send_payment\",\n description: \"Send XRP or tokens to another address\",\n schema: {\n destination: z.string()\n .regex(/^r[a-zA-Z0-9]{24,34}$/)\n .describe(\"Destination XRPL address\"),\n amount: z.union([\n z.string().describe(\"Amount of XRP to send\"),\n z.object({\n currency: z.string(),\n value: z.string(),\n issuer: z.string().regex(/^r[a-zA-Z0-9]{24,34}$/)\n })\n ]).describe(\"Amount to send (XRP as string or token object)\"),\n destinationTag: z.number()\n .int()\n .min(0)\n .max(4294967295)\n .optional()\n .describe(\"Optional destination tag\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const result = await agent.sendPayment({\n destination: input.destination,\n amount: input.amount,\n destinationTag: input.destinationTag\n });\n return result;\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const CreateTokenTool: McpTool = {\n name: \"xrpl_create_token\",\n description: \"Create a new token by setting account flags\",\n schema: {\n currency: z.string()\n .regex(/^[A-Z0-9]{3}$/)\n .describe(\"Token currency code (3 characters)\"),\n domain: z.string()\n .max(256)\n .optional()\n .describe(\"Domain name for the token issuer\"),\n emailHash: z.string()\n .length(32)\n .optional()\n .describe(\"Email hash for the issuer (32 hex characters)\"),\n transferRate: z.number()\n .int()\n .min(1000000000)\n .max(2000000000)\n .optional()\n .describe(\"Transfer rate (fee) for the token (1000000000 = 0%, 1010000000 = 1%)\"),\n requireAuth: z.boolean()\n .default(false)\n .describe(\"Require authorization for trust lines\"),\n requireDest: z.boolean()\n .default(false)\n .describe(\"Require destination tag\"),\n disallowXRP: z.boolean()\n .default(false)\n .describe(\"Disallow XRP payments\"),\n globalFreeze: z.boolean()\n .default(false)\n .describe(\"Enable global freeze\"),\n noFreeze: z.boolean()\n .default(false)\n .describe(\"Disable freeze functionality\"),\n defaultRipple: z.boolean()\n .default(false)\n .describe(\"Enable default ripple\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const result = await agent.createToken(input);\n return result;\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const SetTrustLineTool: McpTool = {\n name: \"xrpl_set_trust_line\",\n description: \"Set a trust line for a token\",\n schema: {\n currency: z.string()\n .regex(/^[A-Z0-9]{3}$/)\n .describe(\"Currency code for the token (3 characters)\"),\n issuer: z.string()\n .regex(/^r[a-zA-Z0-9]{24,34}$/)\n .describe(\"Token issuer address\"),\n limit: z.string()\n .regex(/^\\d+(\\.\\d+)?$/)\n .describe(\"Trust limit amount\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const result = await agent.setTrustLine(input.currency, input.issuer, input.limit);\n return result;\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const MintNFTokenTool: McpTool = {\n name: \"xrpl_mint_nftoken\",\n description: \"Mint a new NFToken\",\n schema: {\n uri: z.string()\n .url()\n .max(512)\n .optional()\n .describe(\"URI for the NFToken metadata\"),\n flags: z.number()\n .int()\n .min(0)\n .max(15)\n .optional()\n .describe(\"NFToken flags (0-15)\"),\n transferFee: z.number()\n .int()\n .min(0)\n .max(50000)\n .optional()\n .describe(\"Transfer fee (0-50000, representing 0-50%)\"),\n taxon: z.number()\n .int()\n .min(0)\n .max(4294967295)\n .optional()\n .describe(\"NFToken taxon\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const result = await agent.mintNFToken(input);\n return result;\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const BurnNFTokenTool: McpTool = {\n name: \"xrpl_burn_nftoken\",\n description: \"Burn an NFToken\",\n schema: {\n nftokenID: z.string()\n .regex(/^[A-F0-9]{64}$/i)\n .describe(\"NFToken ID to burn (64 hex characters)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const result = await agent.burnNFToken(input.nftokenID);\n return result;\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const CreateOfferTool: McpTool = {\n name: \"xrpl_create_offer\",\n description: \"Create a trading offer on the DEX\",\n schema: {\n takerGets: z.union([\n z.string().describe(\"Amount of XRP in drops\"),\n z.object({\n currency: z.string().regex(/^[A-Z0-9]{3}$/),\n value: z.string().regex(/^\\d+(\\.\\d+)?$/),\n issuer: z.string().regex(/^r[a-zA-Z0-9]{24,34}$/)\n })\n ]).describe(\"What the taker gets\"),\n takerPays: z.union([\n z.string().describe(\"Amount of XRP in drops\"),\n z.object({\n currency: z.string().regex(/^[A-Z0-9]{3}$/),\n value: z.string().regex(/^\\d+(\\.\\d+)?$/),\n issuer: z.string().regex(/^r[a-zA-Z0-9]{24,34}$/)\n })\n ]).describe(\"What the taker pays\"),\n expiration: z.number()\n .int()\n .min(0)\n .optional()\n .describe(\"Offer expiration time (XRPL timestamp)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const result = await agent.createOffer(input);\n return result;\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const CancelOfferTool: McpTool = {\n name: \"xrpl_cancel_offer\",\n description: \"Cancel an existing offer\",\n schema: {\n offerSequence: z.number()\n .int()\n .positive()\n .describe(\"Sequence number of the offer to cancel\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const result = await agent.cancelOffer(input.offerSequence);\n return result;\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetTransactionTool: McpTool = {\n name: \"xrpl_get_transaction\",\n description: \"Get transaction details by hash\",\n schema: {\n hash: z.string()\n .regex(/^[A-F0-9]{64}$/i)\n .describe(\"Transaction hash (64 hex characters)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const transaction = await agent.getTransaction(input.hash);\n return {\n status: \"success\",\n transaction\n };\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetRecentTransactionsTool: McpTool = {\n name: \"xrpl_get_recent_transactions\",\n description: \"Get recent transactions for an account\",\n schema: {\n address: z.string()\n .regex(/^r[a-zA-Z0-9]{24,34}$/)\n .optional()\n .describe(\"Account address (optional, defaults to wallet address)\"),\n limit: z.number()\n .int()\n .min(1)\n .max(100)\n .default(10)\n .describe(\"Number of transactions to retrieve (default: 10, max: 100)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const transactions = await agent.getRecentTransactions(input.address, input.limit);\n return {\n status: \"success\",\n transactions\n };\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetOrderBookTool: McpTool = {\n name: \"xrpl_get_order_book\",\n description: \"Get order book for a trading pair\",\n schema: {\n takerGets: z.union([\n z.literal(\"XRP\").describe(\"XRP currency\"),\n z.object({\n currency: z.string().regex(/^[A-Z0-9]{3}$/),\n issuer: z.string().regex(/^r[a-zA-Z0-9]{24,34}$/)\n })\n ]).describe(\"Base currency (what taker gets)\"),\n takerPays: z.union([\n z.literal(\"XRP\").describe(\"XRP currency\"),\n z.object({\n currency: z.string().regex(/^[A-Z0-9]{3}$/),\n issuer: z.string().regex(/^r[a-zA-Z0-9]{24,34}$/)\n })\n ]).describe(\"Quote currency (what taker pays)\"),\n limit: z.number()\n .int()\n .min(1)\n .max(100)\n .default(20)\n .describe(\"Number of offers to retrieve (default: 20, max: 100)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const { getOrderBook } = await import('../../tools/dex/orderbook');\n \n // Convert 'XRP' string to proper format\n const takerGets = input.takerGets === 'XRP' ? { currency: 'XRP' } : input.takerGets;\n const takerPays = input.takerPays === 'XRP' ? { currency: 'XRP' } : input.takerPays;\n \n const orderBook = await getOrderBook(agent, takerGets, takerPays, input.limit);\n return {\n status: \"success\",\n orderBook\n };\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","import { z } from \"zod\";\nimport { Agent } from \"../../agent\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetAccountOffersTool: McpTool = {\n name: \"xrpl_get_account_offers\",\n description: \"Get all active offers for an account\",\n schema: {\n address: z.string()\n .regex(/^r[a-zA-Z0-9]{24,34}$/)\n .optional()\n .describe(\"Account address (optional, defaults to wallet address)\")\n },\n handler: async (agent: Agent, input: Record<string, any>) => {\n try {\n const { getAccountOffers } = await import('../../tools/dex/orderbook');\n const offers = await getAccountOffers(agent, input.address || agent.walletAddress);\n return {\n status: \"success\",\n offers\n };\n } catch (error) {\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error occurred\"\n };\n }\n },\n};\n","// XRPL Core Tools\nimport { GetWalletAddressTool } from \"./xrpl/get_wallet_address_tool\";\nimport { GetAccountInfoTool } from \"./xrpl/get_account_info_tool\";\nimport { GetBalancesTool } from \"./xrpl/get_balances_tool\";\nimport { SendPaymentTool } from \"./xrpl/send_payment_tool\";\n\n// Token Tools\nimport { CreateTokenTool } from \"./token/create_token_tool\";\nimport { SetTrustLineTool } from \"./token/set_trust_line_tool\";\nimport { MintNFTokenTool } from \"./token/mint_nftoken_tool\";\nimport { BurnNFTokenTool } from \"./token/burn_nftoken_tool\";\n\n// Transaction Tools\nimport { CreateOfferTool } from \"./transaction/create_offer_tool\";\nimport { CancelOfferTool } from \"./transaction/cancel_offer_tool\";\nimport { GetTransactionTool } from \"./transaction/get_transaction_tool\";\nimport { GetRecentTransactionsTool } from \"./transaction/get_recent_transactions_tool\";\n\n// DEX Tools\nimport { GetOrderBookTool } from \"./dex/get_order_book_tool\";\nimport { GetAccountOffersTool } from \"./dex/get_account_offers_tool\";\n\nexport const XrplMcpTools = {\n // XRPL Core\n \"GetWalletAddressTool\": GetWalletAddressTool,\n \"GetAccountInfoTool\": GetAccountInfoTool,\n \"GetBalancesTool\": GetBalancesTool,\n \"SendPaymentTool\": SendPaymentTool,\n \n // Token Management\n \"CreateTokenTool\": CreateTokenTool,\n \"SetTrustLineTool\": SetTrustLineTool,\n \"MintNFTokenTool\": MintNFTokenTool,\n \"BurnNFTokenTool\": BurnNFTokenTool,\n \n // Trading & Transactions\n \"CreateOfferTool\": CreateOfferTool,\n \"CancelOfferTool\": CancelOfferTool,\n \"GetTransactionTool\": GetTransactionTool,\n \"GetRecentTransactionsTool\": GetRecentTransactionsTool,\n \n // DEX & Order Book\n \"GetOrderBookTool\": GetOrderBookTool,\n \"GetAccountOffersTool\": GetAccountOffersTool\n};\n","import { Client, Wallet, xrpToDrops, dropsToXrp } from 'xrpl';\nimport { AccountInfo, TokenBalance, TransactionResponse, PaymentParams, TokenParams, NFTokenParams, OfferParams, TrustLine, NFToken } from '../types';\nimport { getAccountInfo } from '../tools/xrpl/account';\nimport { getBalances } from '../tools/xrpl/balance';\nimport { sendPayment } from '../tools/xrpl/payment';\nimport { createToken } from '../tools/token/create';\nimport { setTrustLine } from '../tools/token/trustline';\nimport { mintNFToken, burnNFToken } from '../tools/token/nft';\nimport { createOffer, cancelOffer } from '../tools/transaction/offer';\nimport { getTransactionInfo, getAccountTransactions } from '../tools/transaction/management';\nimport { getOrderBook, getAccountOffers } from '../tools/dex/orderbook';\nimport { getXrplConfig } from '../config';\nimport { NETWORKS } from '../constants';\n\nexport class Agent {\n public client: Client;\n public wallet: Wallet;\n public walletAddress: string;\n public network: 'testnet' | 'mainnet' | 'devnet';\n\n constructor() {\n const config = getXrplConfig();\n \n // Determine server URL\n const serverUrl = NETWORKS[config.network];\n \n this.client = new Client(serverUrl);\n this.network = config.network;\n \n // Initialize wallet from private key\n this.wallet = Wallet.fromSeed(config.privateKey);\n this.walletAddress = this.wallet.address;\n }\n\n async connect(): Promise<void> {\n if (!this.client.isConnected()) {\n await this.client.connect();\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.client.isConnected()) {\n await this.client.disconnect();\n }\n }\n\n async getWalletAddress(): Promise<string> {\n return this.walletAddress;\n }\n\n async getAccountInfo(address?: string): Promise<AccountInfo> {\n await this.connect();\n return getAccountInfo(this, address || this.walletAddress);\n }\n\n async getBalances(address?: string): Promise<TokenBalance[]> {\n await this.connect();\n return getBalances(this, address || this.walletAddress);\n }\n\n async sendPayment(params: PaymentParams): Promise<TransactionResponse> {\n await this.connect();\n return sendPayment(this, params);\n }\n\n async createToken(params: any): Promise<TransactionResponse> {\n await this.connect();\n return createToken(this, params);\n }\n\n async setTrustLine(currency: string, issuer: string, limit: string): Promise<TransactionResponse> {\n await this.connect();\n return setTrustLine(this, currency, issuer, limit);\n }\n\n async mintNFToken(params: NFTokenParams): Promise<TransactionResponse> {\n await this.connect();\n return mintNFToken(this, params);\n }\n\n async burnNFToken(nftokenID: string): Promise<TransactionResponse> {\n await this.connect();\n return burnNFToken(this, nftokenID);\n }\n\n async createOffer(params: any): Promise<TransactionResponse> {\n await this.connect();\n return createOffer(this, params);\n }\n\n async cancelOffer(offerSequence: number): Promise<TransactionResponse> {\n await this.connect();\n return cancelOffer(this, offerSequence);\n }\n\n async getTransaction(hash: string): Promise<any> {\n await this.connect();\n return getTransactionInfo(this, hash);\n }\n\n async getRecentTransactions(address?: string, limit?: number) {\n await this.connect();\n return getAccountTransactions(this, address || this.walletAddress, limit || 10);\n }\n\n // DEX methods\n async getOrderBook(takerGets: any, takerPays: any, limit?: number) {\n await this.connect();\n return getOrderBook(this, takerGets, takerPays, limit);\n }\n\n async getAccountOffers(address?: string) {\n await this.connect();\n return getAccountOffers(this, address || this.walletAddress);\n }\n\n // Utility methods\n xrpToDrops(xrp: string): string {\n return xrpToDrops(xrp);\n }\n\n dropsToXrp(drops: string): string {\n return `${dropsToXrp(drops)}`;\n }\n}\n","import { Agent } from '../../agent';\n\nexport async function getAccountInfo(agent: Agent, address: string) {\n try {\n const response = await agent.client.request({\n command: 'account_info',\n account: address,\n ledger_index: 'current'\n });\n\n return {\n account: response.result.account_data.Account,\n balance: response.result.account_data.Balance,\n flags: response.result.account_data.Flags,\n ledgerEntryType: response.result.account_data.LedgerEntryType,\n ownerCount: response.result.account_data.OwnerCount,\n previousTxnID: response.result.account_data.PreviousTxnID,\n previousTxnLgrSeq: response.result.account_data.PreviousTxnLgrSeq,\n sequence: response.result.account_data.Sequence\n };\n } catch (error) {\n throw new Error(`Failed to get account info: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Agent } from '../../agent';\nimport { TokenBalance } from '../../types';\n\nexport async function getBalances(agent: Agent, address: string): Promise<TokenBalance[]> {\n try {\n const balances: TokenBalance[] = [];\n\n // Get XRP balance\n const accountInfo = await agent.client.request({\n command: 'account_info',\n account: address,\n ledger_index: 'current'\n });\n\n balances.push({\n currency: 'XRP',\n value: agent.dropsToXrp(accountInfo.result.account_data.Balance)\n });\n\n // Get token balances (trust lines)\n try {\n const trustLines = await agent.client.request({\n command: 'account_lines',\n account: address,\n ledger_index: 'current'\n });\n\n if (trustLines.result.lines) {\n for (const line of trustLines.result.lines) {\n balances.push({\n currency: line.currency,\n value: line.balance,\n issuer: line.account\n });\n }\n }\n } catch (error) {\n // Trust lines might not exist, which is fine\n }\n\n return balances;\n } catch (error) {\n throw new Error(`Failed to get balances: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Agent } from '../../agent';\nimport { PaymentParams, TransactionResponse } from '../../types';\n\nexport async function sendPayment(agent: Agent, params: PaymentParams): Promise<TransactionResponse> {\n try {\n const payment: any = {\n TransactionType: 'Payment',\n Account: agent.walletAddress,\n Destination: params.destination,\n Amount: typeof params.amount === 'string' ? agent.xrpToDrops(params.amount) : params.amount,\n ...(params.destinationTag && { DestinationTag: params.destinationTag })\n };\n\n const prepared = await agent.client.autofill(payment);\n const signed = agent.wallet.sign(prepared);\n const result: any = await agent.client.submitAndWait(signed.tx_blob);\n\n return {\n hash: result.result.hash,\n status: result.result.meta?.TransactionResult || 'unknown',\n result: result.result\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n","import { Agent } from '../../agent';\nimport { TokenParams, TransactionResponse } from '../../types';\n\nexport async function createToken(agent: Agent, params: TokenParams): Promise<TransactionResponse> {\n try {\n const accountSet: any = {\n TransactionType: 'AccountSet',\n Account: agent.walletAddress,\n ...(params.domain && { Domain: Buffer.from(params.domain).toString('hex').toUpperCase() }),\n ...(params.emailHash && { EmailHash: params.emailHash }),\n ...(params.messageKey && { MessageKey: params.messageKey }),\n ...(params.transferRate && { TransferRate: params.transferRate }),\n ...(params.tickSize && { TickSize: params.tickSize })\n };\n\n // Set flags for token configuration\n let setFlag = 0;\n let clearFlag = 0;\n\n if (params.requireAuth) setFlag |= 0x00000002;\n if (params.requireDest) setFlag |= 0x00000001;\n if (params.disallowXRP) setFlag |= 0x00000008;\n if (params.globalFreeze) setFlag |= 0x00000080;\n if (params.noFreeze) setFlag |= 0x00000040;\n if (params.defaultRipple) setFlag |= 0x00020000;\n\n if (setFlag > 0) (accountSet as any).SetFlag = setFlag;\n if (clearFlag > 0) (accountSet as any).ClearFlag = clearFlag;\n\n const prepared = await agent.client.autofill(accountSet);\n const signed = agent.wallet.sign(prepared);\n const result: any = await agent.client.submitAndWait(signed.tx_blob);\n\n return {\n hash: result.result.hash,\n status: result.result.meta?.TransactionResult || 'unknown',\n result: result.result\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n","import { Agent } from '../../agent';\nimport { TransactionResponse } from '../../types';\n\nexport async function setTrustLine(agent: Agent, currency: string, issuer: string, limit: string): Promise<TransactionResponse> {\n try {\n const trustSet: any = {\n TransactionType: 'TrustSet',\n Account: agent.walletAddress,\n LimitAmount: {\n currency: currency,\n issuer: issuer,\n value: limit\n }\n };\n\n const prepared = await agent.client.autofill(trustSet);\n const signed = agent.wallet.sign(prepared);\n const result: any = await agent.client.submitAndWait(signed.tx_blob);\n\n return {\n hash: result.result.hash,\n status: result.result.meta?.TransactionResult || 'unknown',\n result: result.result\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n","import { Agent } from '../../agent';\nimport { NFTokenParams, TransactionResponse } from '../../types';\n\nexport async function mintNFToken(agent: Agent, params: NFTokenParams): Promise<TransactionResponse> {\n try {\n const nftokenMint: any = {\n TransactionType: 'NFTokenMint',\n Account: agent.walletAddress,\n ...(params.uri && { URI: Buffer.from(params.uri).toString('hex').toUpperCase() }),\n ...(params.flags && { Flags: params.flags }),\n ...(params.transferFee && { TransferFee: params.transferFee }),\n ...(params.taxon && { NFTokenTaxon: params.taxon })\n };\n\n const prepared = await agent.client.autofill(nftokenMint);\n const signed = agent.wallet.sign(prepared);\n const result: any = await agent.client.submitAndWait(signed.tx_blob);\n\n return {\n hash: result.result.hash,\n status: result.result.meta?.TransactionResult || 'unknown',\n result: result.result\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n\nexport async function burnNFToken(agent: Agent, nftokenID: string): Promise<TransactionResponse> {\n try {\n const nftokenBurn: any = {\n TransactionType: 'NFTokenBurn',\n Account: agent.walletAddress,\n NFTokenID: nftokenID\n };\n\n const prepared = await agent.client.autofill(nftokenBurn);\n const signed = agent.wallet.sign(prepared);\n const result: any = await agent.client.submitAndWait(signed.tx_blob);\n\n return {\n hash: result.result.hash,\n status: result.result.meta?.TransactionResult || 'unknown',\n result: result.result\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n","import { Agent } from '../../agent';\nimport { OfferParams, TransactionResponse } from '../../types';\n\nexport async function createOffer(agent: Agent, params: OfferParams): Promise<TransactionResponse> {\n try {\n const offerCreate: any = {\n TransactionType: 'OfferCreate',\n Account: agent.walletAddress,\n TakerGets: params.takerGets,\n TakerPays: params.takerPays,\n ...(params.expiration && { Expiration: params.expiration }),\n ...(params.offerSequence && { OfferSequence: params.offerSequence })\n };\n\n const prepared = await agent.client.autofill(offerCreate);\n const signed = agent.wallet.sign(prepared);\n const result: any = await agent.client.submitAndWait(signed.tx_blob);\n\n return {\n hash: result.result.hash,\n status: result.result.meta?.TransactionResult || 'unknown',\n result: result.result\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n\nexport async function cancelOffer(agent: Agent, offerSequence: number): Promise<TransactionResponse> {\n try {\n const offerCancel: any = {\n TransactionType: 'OfferCancel',\n Account: agent.walletAddress,\n OfferSequence: offerSequence\n };\n\n const prepared = await agent.client.autofill(offerCancel);\n const signed = agent.wallet.sign(prepared);\n const result: any = await agent.client.submitAndWait(signed.tx_blob);\n\n return {\n hash: result.result.hash,\n status: result.result.meta?.TransactionResult || 'unknown',\n result: result.result\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n","import { Agent } from '../../agent';\n\nexport async function getTransactionInfo(agent: Agent, hash: string): Promise<any> {\n try {\n const response = await agent.client.request({\n command: 'tx',\n transaction: hash\n });\n\n return response.result;\n } catch (error) {\n throw new Error(`Failed to get transaction info: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\nexport async function getAccountTransactions(agent: Agent, address: string, limit: number = 10) {\n try {\n const response = await agent.client.request({\n command: 'account_tx',\n account: address,\n ledger_index_min: -1,\n ledger_index_max: -1,\n limit: limit,\n binary: false\n });\n\n return response.result.transactions || [];\n } catch (error) {\n throw new Error(`Failed to get account transactions: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","export const NETWORKS = {\n testnet: 'wss://s.altnet.rippletest.net:51233',\n mainnet: 'wss://xrplcluster.com',\n devnet: 'wss://s.devnet.rippletest.net:51233'\n} as const;\n\nexport const MEMO_TYPES = {\n TEXT: 'text/plain',\n JSON: 'application/json',\n URL: 'text/uri-list'\n} as const;\n\nexport const XRP_DECIMAL_PLACES = 6;\nexport const TOKEN_DECIMAL_PLACES = 15;\n\nexport const TRANSACTION_TYPES = {\n PAYMENT: 'Payment',\n OFFER_CREATE: 'OfferCreate',\n OFFER_CANCEL: 'OfferCancel',\n TRUST_SET: 'TrustSet',\n ACCOUNT_SET: 'AccountSet',\n NFTOKEN_MINT: 'NFTokenMint',\n NFTOKEN_BURN: 'NFTokenBurn',\n NFTOKEN_CREATE_OFFER: 'NFTokenCreateOffer',\n NFTOKEN_ACCEPT_OFFER: 'NFTokenAcceptOffer',\n NFTOKEN_CANCEL_OFFER: 'NFTokenCancelOffer'\n} as const;\n\nexport const FLAGS = {\n ACCOUNT_SET: {\n REQUIRE_DEST_TAG: 0x00000001,\n REQUIRE_AUTH: 0x00000002,\n DISALLOW_XRP: 0x00000008,\n DISABLE_MASTER: 0x00000010,\n ACCOUNT_TXN_ID: 0x00000020,\n NO_FREEZE: 0x00000040,\n GLOBAL_FREEZE: 0x00000080,\n DEFAULT_RIPPLE: 0x00020000\n },\n TRUST_SET: {\n SET_F_RIPPLE: 0x00020000,\n CLEAR_NO_RIPPLE: 0x00020000,\n SET_NO_RIPPLE: 0x00000000,\n CLEAR_F_RIPPLE: 0x00000000\n },\n NFTOKEN: {\n BURNABLE: 0x00000001,\n ONLY_XRP: 0x00000002,\n TRUST_LINE: 0x00000004,\n TRANSFERABLE: 0x00000008\n }\n} as const;\n"],"mappings":"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