mantle-agent-kit-sdk 1.0.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/mantle/sendTransaction.ts","../src/utils/okx/checkAllowance.ts","../src/constants/okx/index.ts","../src/helpers/okx/index.ts","../src/utils/okx/getApproveTx.ts","../src/utils/okx/getGasLimit.ts","../src/utils/okx/approveToken.ts","../src/utils/okx/getSwapLimit.ts","../src/utils/demo/mockResponses.ts","../src/tools/okx/swap.ts","../src/constants/openocean/index.ts","../src/helpers/openocean/index.ts","../src/utils/openocean/getQuoteData.ts","../src/utils/openocean/getSwapData.ts","../src/tools/openocean/getQuote.ts","../src/utils/common/checkAllowance.ts","../src/utils/common/approveToken.ts","../src/tools/openocean/swap.ts","../src/constants/oneinch/index.ts","../src/helpers/oneinch/index.ts","../src/utils/oneinch/getSwapData.ts","../src/tools/oneinch/getQuote.ts","../src/tools/oneinch/swap.ts","../src/constants/uniswap/index.ts","../src/utils/uniswap/getSwapCalldata.ts","../src/tools/uniswap/getQuote.ts","../src/tools/uniswap/swap.ts","../src/constants/squid/index.ts","../src/helpers/squid/index.ts","../src/utils/squid/getRouteData.ts","../src/tools/squid/crossChainSwap.ts","../src/constants/lendle/index.ts","../src/tools/lendle/supply.ts","../src/tools/lendle/withdraw.ts","../src/tools/lendle/borrow.ts","../src/tools/lendle/repay.ts","../src/tools/lendle/getPositions.ts","../src/constants/agni/index.ts","../src/tools/agni/swap.ts","../src/constants/merchantmoe/index.ts","../src/tools/merchantmoe/swap.ts","../src/constants/meth/index.ts","../src/tools/meth-staking/getPosition.ts","../src/tools/meth-staking/swapToMeth.ts","../src/tools/meth-staking/swapFromMeth.ts","../src/constants/pikeperps/index.ts","../src/tools/pikeperps/openLong.ts","../src/tools/pikeperps/openShort.ts","../src/tools/pikeperps/closePosition.ts","../src/tools/pikeperps/getPositions.ts","../src/tools/pikeperps/getMarketData.ts","../src/tools/okx/getSwapQuote.ts","../src/utils/x402/index.ts","../src/utils/lendle/getUserAccountData.ts","../src/agent.ts"],"names":["erc20Abi","axios","getHeaders","checkAllowance","approveToken","encodeFunctionData","NATIVE_TOKEN_ADDRESS","configs","getQuoteData","getSwapData","WMNT_ADDRESS","FEE_TIERS","baseUrl"],"mappings":"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","file":"index.js","sourcesContent":["import { parseEther, parseUnits, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { getTransactionReceipt } from \"viem/actions\";\n\nconst erc20Abi = [\n {\n name: \"transfer\",\n type: \"function\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ type: \"bool\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n inputs: [],\n outputs: [{ type: \"uint8\" }],\n },\n] as const;\n\nexport const sendTransaction = async (\n agent: MNTAgentKit,\n to: Address,\n amount: string,\n tokenAddress?: Address,\n) => {\n let hash: `0x${string}`;\n\n if (tokenAddress) {\n const decimals = (await agent.client.readContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"decimals\",\n })) as number;\n\n hash = await agent.client.writeContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, parseUnits(amount, decimals)],\n });\n } else {\n hash = await agent.client.sendTransaction({\n to,\n value: parseEther(amount),\n });\n }\n\n const receipt = await getTransactionReceipt(agent.client, {\n hash,\n });\n\n return receipt;\n};\n","import { erc20Abi, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\n\n/**\n * Check token allowance for DEX\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token contract address\n * @param ownerAddress - Your wallet address\n * @param spenderAddress - DEX spender address\n * @returns Allowance amount\n */\nexport async function checkAllowance(\n agent: MNTAgentKit,\n tokenAddress: string,\n ownerAddress: string,\n spenderAddress: string,\n): Promise<bigint> {\n try {\n const allowance = await agent.client.readContract({\n address: tokenAddress as Address,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [ownerAddress as Address, spenderAddress as Address],\n });\n return allowance;\n } catch (error) {\n console.error(\"Failed to query allowance:\", error);\n throw error;\n }\n}\n","export const configs = {\n apiKey: process.env.OKX_API_KEY,\n secretKey: process.env.OKX_SECRET_KEY,\n apiPassphrase: process.env.OKX_API_PASSPHRASE,\n projectId: process.env.OKX_PROJECT_ID,\n};\n\nexport const baseUrl: string = \"https://web3.okx.com/api/v6/\";\n\nexport const ETH_ADDRESS = \"0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000\";\n","import CryptoJS from \"crypto-js\";\nimport { configs } from \"../../constants/okx\";\n\nexport function getHeaders(\n timestamp: string,\n method: string,\n requestPath: string,\n queryString = \"\",\n body = \"\",\n) {\n const { apiKey, secretKey, apiPassphrase, projectId } = configs;\n\n if (!apiKey || !secretKey || !apiPassphrase || !projectId) {\n throw new Error(\n \"Missing required environment variables for API authentication\",\n );\n }\n\n const stringToSign = timestamp + method + requestPath + (queryString || body);\n\n return {\n \"Content-Type\": \"application/json\",\n \"OK-ACCESS-KEY\": apiKey,\n \"OK-ACCESS-SIGN\": CryptoJS.enc.Base64.stringify(\n CryptoJS.HmacSHA256(stringToSign, secretKey),\n ),\n \"OK-ACCESS-TIMESTAMP\": timestamp,\n \"OK-ACCESS-PASSPHRASE\": apiPassphrase,\n \"OK-ACCESS-PROJECT\": projectId,\n };\n}\n","import axios from \"axios\";\nimport { baseUrl } from \"../../constants/okx\";\nimport { getHeaders } from \"../../helpers/okx\";\n\nexport async function getApproveTx(\n tokenAddress: string,\n amount: string,\n chainIndex: string,\n): Promise<any> {\n try {\n const path = \"dex/aggregator/approve-transaction\";\n const url = `${baseUrl}${path}`;\n const params = {\n chainIndex: chainIndex,\n tokenContractAddress: tokenAddress,\n approveAmount: amount,\n };\n\n // Prepare authentication\n const timestamp = new Date().toISOString();\n const requestPath = `/api/v6/${path}`;\n const queryString = \"?\" + new URLSearchParams(params).toString();\n const headers = getHeaders(timestamp, \"GET\", requestPath, queryString);\n\n const response = await axios.get(url, { params, headers });\n\n if (response.data.code === \"0\") {\n return response.data.data[0];\n } else {\n throw new Error(`API Error: ${response.data.msg || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\n \"Failed to get approval transaction data:\",\n (error as Error).message,\n );\n throw error;\n }\n}\n","import axios from \"axios\";\nimport { getHeaders } from \"../../helpers/okx\";\n\n/**\n * Get transaction gas limit from Onchain gateway API\n * @param fromAddress - Sender address\n * @param toAddress - Target contract address\n * @param txAmount - Transaction amount (0 for approvals)\n * @param inputData - Transaction calldata\n * @returns Estimated gas limit\n */\nexport async function getGasLimit(\n fromAddress: string,\n toAddress: string,\n chainIndex: string,\n txAmount: string = \"0\",\n inputData: string = \"\",\n): Promise<string> {\n try {\n const path = \"dex/pre-transaction/gas-limit\";\n const url = `https://web3.okx.com/api/v6/${path}`;\n\n const body = {\n chainIndex: chainIndex,\n fromAddress: fromAddress,\n toAddress: toAddress,\n txAmount: txAmount,\n extJson: {\n inputData: inputData,\n },\n };\n\n // Prepare authentication with body included in signature\n const bodyString = JSON.stringify(body);\n const timestamp = new Date().toISOString();\n const requestPath = `/api/v6/${path}`;\n const headers = getHeaders(timestamp, \"POST\", requestPath, \"\", bodyString);\n\n const response = await axios.post(url, body, { headers });\n\n if (response.data.code === \"0\") {\n return response.data.data[0].gasLimit;\n } else {\n throw new Error(`API Error: ${response.data.msg || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\"Failed to get gas limit:\", (error as Error).message);\n throw error;\n }\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { checkAllowance } from \"./checkAllowance\";\nimport { getApproveTx } from \"./getApproveTx\";\nimport { getGasLimit } from \"./getGasLimit\";\n\n/**\n * Check allowance and get approve tx data if needed\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token to approve\n * @param amount - Amount to approve\n * @returns Allowance status and tx data\n */\nexport async function approveToken(\n agent: MNTAgentKit,\n tokenAddress: string,\n amount: string,\n): Promise<{ allowanceExists: boolean; data: any }> {\n const chainIndex = agent.chain === \"mainnet\" ? \"5000\" : \"5003\";\n const walletAddress = agent.account.address;\n const spenderAddress = \"0x1f16A607a7f3F3044E477abFFc8BD33952cE306b\";\n\n const currentAllowance = await checkAllowance(\n agent,\n tokenAddress,\n walletAddress,\n spenderAddress,\n );\n\n if (currentAllowance >= BigInt(amount)) {\n console.log(\"Sufficient allowance already exists\");\n return { allowanceExists: true, data: null };\n }\n\n console.log(\"Insufficient allowance, approving tokens...\");\n\n // Get approve transaction data from OKX DEX API\n const approveData = await getApproveTx(tokenAddress, amount, chainIndex);\n\n // Get accurate gas limit using Onchain gateway API\n const gasLimit = await getGasLimit(\n walletAddress,\n tokenAddress,\n chainIndex,\n \"0\",\n approveData.data,\n );\n\n const txObject = {\n to: tokenAddress,\n data: approveData.data,\n gas: gasLimit,\n };\n\n return { allowanceExists: false, data: txObject };\n}\n","import axios from \"axios\";\nimport { baseUrl } from \"../../constants/okx\";\nimport { getHeaders } from \"../../helpers/okx\";\n\n/**\n * Get swap transaction data from DEX API\n * @param fromTokenAddress - Source token address\n * @param toTokenAddress - Destination token address\n * @param amount - Amount to swap\n * @param userWalletAddress - User wallet address\n * @param chainIndex - Chain index\n * @param slippagePercent - Maximum slippagePercent (e.g., \"0.5\" for 0.5%)\n * @returns Swap transaction data\n */\nexport async function getSwapTransaction(\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n userWalletAddress: string,\n chainIndex: string,\n slippagePercent: string = \"0.5\",\n): Promise<any> {\n try {\n const path = \"dex/aggregator/swap\";\n const url = `${baseUrl}${path}`;\n\n const params = {\n chainIndex,\n fromTokenAddress,\n toTokenAddress,\n amount,\n userWalletAddress,\n slippage: slippagePercent,\n };\n\n // Prepare authentication\n const timestamp = new Date().toISOString();\n const requestPath = `/api/v6/${path}`;\n const queryString = \"?\" + new URLSearchParams(params).toString();\n const headers = getHeaders(timestamp, \"GET\", requestPath, queryString);\n\n const response = await axios.get(url, { params, headers });\n\n if (response.data.code === \"0\") {\n return response.data.data[0];\n } else {\n throw new Error(`API Error: ${response.data.msg || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\n \"Failed to get swap transaction data:\",\n (error as Error).message,\n );\n throw error;\n }\n}\n","import { type Hex } from \"viem\";\n\nexport const DEMO_TX_HASH =\n \"0xdemo000000000000000000000000000000000000000000000000000000000001\" as Hex;\n\nexport function createMockSwapResponse(protocol: string, inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH,\n amountOut: inputAmount,\n demo: true,\n message: `[DEMO] ${protocol} swap simulated`,\n };\n}\n\nexport function createMockQuoteResponse(protocol: string, inputAmount: string) {\n return {\n estimatedAmount: inputAmount,\n demo: true,\n message: `[DEMO] ${protocol} quote simulated`,\n };\n}\n\nexport function createMockLendleResponse(action: string, amount: string) {\n return {\n txHash: DEMO_TX_HASH,\n amount: amount,\n demo: true,\n message: `[DEMO] Lendle ${action} simulated`,\n };\n}\n\nexport function createMockTxHash(): Hex {\n return DEMO_TX_HASH;\n}\n\nexport function createMock1inchSwapResponse(inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH as string,\n dstAmount: inputAmount,\n demo: true,\n message: \"[DEMO] 1inch swap simulated\",\n };\n}\n\nexport function createMockOkxSwapResponse(inputAmount: string) {\n return {\n data: DEMO_TX_HASH,\n demo: true,\n message: \"[DEMO] OKX swap simulated\",\n };\n}\n\nexport function createMockOpenOceanSwapResponse(inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH as string,\n outAmount: inputAmount,\n demo: true,\n message: \"[DEMO] OpenOcean swap simulated\",\n };\n}\n\nexport function createMockUniswapSwapResponse(inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH as string,\n amountOut: inputAmount,\n demo: true,\n message: \"[DEMO] Uniswap swap simulated\",\n };\n}\n\nexport function createMockSquidRoute(amount: string) {\n return {\n route: {\n estimate: { toAmount: amount },\n transactionRequest: {\n targetAddress: \"0x0000000000000000000000000000000000000000\",\n data: \"0x\",\n value: \"0\",\n gasLimit: \"0\",\n },\n },\n demo: true,\n message: \"[DEMO] Squid route simulated\",\n };\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { ETH_ADDRESS } from \"../../constants/okx\";\nimport { approveToken, getGasLimit, getSwapTransaction } from \"../../utils/okx\";\nimport { createMockOkxSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap\n * @param fromTokenAddress - Source token address\n * @param toTokenAddress - Destination token address\n * @param amount - Amount to swap\n * @param slippagePercent - Maximum slippagePercent\n * @returns Transaction hash\n */\nexport async function executeSwap(\n agent: MNTAgentKit,\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n slippagePercent: string,\n): Promise<{ data: any }> {\n if (agent.demo) {\n return createMockOkxSwapResponse(amount);\n }\n\n const chainIndex = agent.chain === \"mainnet\" ? \"5000\" : \"5003\";\n const walletAddress = agent.account.address;\n\n // 1. Check allowance and approve if necessary (skip for native token)\n if (fromTokenAddress !== ETH_ADDRESS) {\n const approval = await approveToken(agent, fromTokenAddress, amount);\n\n // If approval needed, sign and send approval tx\n if (!approval.allowanceExists && approval.data) {\n const approveTxHash = await agent.client.sendTransaction({\n to: approval.data.to as Address,\n data: approval.data.data as Hex,\n value: BigInt(0),\n gas: BigInt(approval.data.gas),\n });\n console.log(`Approval tx sent: ${approveTxHash}`);\n\n // Wait for approval tx to be confirmed\n const approveReceipt = await agent.client.waitForTransactionReceipt({\n hash: approveTxHash,\n });\n console.log(`Approval confirmed: ${approveReceipt.status}`);\n }\n }\n\n // 2. Get swap transaction data\n const swapData = await getSwapTransaction(\n fromTokenAddress,\n toTokenAddress,\n amount,\n walletAddress,\n chainIndex,\n slippagePercent,\n );\n\n const txData = swapData.tx;\n console.log(\"Swap TX data received\");\n\n // 3. Get accurate gas limit\n const gasLimit = await getGasLimit(\n walletAddress,\n txData.to,\n chainIndex,\n txData.value || \"0\",\n txData.data,\n );\n console.log(\"Gas limit received\");\n\n // 4. Sign and send transaction using viem\n const txHash = await agent.client.sendTransaction({\n to: txData.to as Address,\n data: txData.data as Hex,\n value: BigInt(txData.value || \"0\"),\n gas: BigInt(gasLimit),\n });\n console.log(`Swap tx sent: ${txHash}`);\n\n // Wait for swap tx to be confirmed\n const swapReceipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n console.log(`Swap confirmed: ${swapReceipt.status}`);\n\n return {\n data: txHash,\n };\n}\n","// OpenOcean API configuration\nexport const OPENOCEAN_BASE_URL = \"https://open-api.openocean.finance/v4\";\n\n// Chain identifiers for OpenOcean\nexport const OPENOCEAN_CHAIN = {\n mainnet: \"mantle\",\n testnet: \"mantle\", // OpenOcean may not support testnet\n} as const;\n\n// Native token address (ETH on Mantle)\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// OpenOcean exchange proxy address on Mantle\nexport const OPENOCEAN_EXCHANGE_PROXY = \"0x6352a56caadC4F1E25CD6c75970Fa768A3304e64\";\n","/**\n * Get headers for OpenOcean API requests\n * OpenOcean currently uses public endpoints without authentication\n * This helper is prepared for future API key support if needed\n * @param apiKey - Optional API key for future use\n * @returns Headers object\n */\nexport function getHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Future: Add API key support if OpenOcean introduces authentication\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n return headers;\n}\n\n","import axios from \"axios\";\nimport { OPENOCEAN_BASE_URL, OPENOCEAN_CHAIN } from \"../../constants/openocean\";\nimport { getHeaders } from \"../../helpers/openocean\";\n\nexport interface OpenOceanQuote {\n inToken: {\n address: string;\n decimals: number;\n symbol: string;\n name: string;\n };\n outToken: {\n address: string;\n decimals: number;\n symbol: string;\n name: string;\n };\n inAmount: string;\n outAmount: string;\n estimatedGas: string;\n}\n\n/**\n * Get swap quote from OpenOcean API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Quote data\n */\nexport async function getQuoteData(\n fromToken: string,\n toToken: string,\n amount: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OpenOceanQuote> {\n try {\n const chainName = OPENOCEAN_CHAIN[chain];\n const url = `${OPENOCEAN_BASE_URL}/${chainName}/quote`;\n\n const params = {\n inTokenAddress: fromToken,\n outTokenAddress: toToken,\n amount: amount,\n gasPrice: \"5\", // Default gas price in gwei\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n if (response.data.code === 200) {\n return response.data.data;\n } else {\n throw new Error(`OpenOcean API Error: ${response.data.message || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\"Failed to get OpenOcean quote:\", (error as Error).message);\n throw error;\n }\n}\n","import axios from \"axios\";\nimport { OPENOCEAN_BASE_URL, OPENOCEAN_CHAIN } from \"../../constants/openocean\";\nimport { getHeaders } from \"../../helpers/openocean\";\n\nexport interface OpenOceanSwapData {\n inToken: {\n address: string;\n decimals: number;\n symbol: string;\n };\n outToken: {\n address: string;\n decimals: number;\n symbol: string;\n };\n inAmount: string;\n outAmount: string;\n estimatedGas: string;\n minOutAmount: string;\n to: string;\n data: string;\n value: string;\n gasPrice: string;\n}\n\n/**\n * Get swap transaction data from OpenOcean API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param userAddress - User's wallet address\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Swap transaction data\n */\nexport async function getSwapData(\n fromToken: string,\n toToken: string,\n amount: string,\n userAddress: string,\n slippage: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OpenOceanSwapData> {\n try {\n const chainName = OPENOCEAN_CHAIN[chain];\n const url = `${OPENOCEAN_BASE_URL}/${chainName}/swap`;\n\n const params = {\n inTokenAddress: fromToken,\n outTokenAddress: toToken,\n amount: amount,\n gasPrice: \"5\", // Default gas price in gwei\n slippage: slippage,\n account: userAddress,\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n if (response.data.code === 200) {\n return response.data.data;\n } else {\n throw new Error(`OpenOcean API Error: ${response.data.message || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\"Failed to get OpenOcean swap data:\", (error as Error).message);\n throw error;\n }\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { getQuoteData, type OpenOceanQuote } from \"../../utils/openocean\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Get swap quote from OpenOcean\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @returns Quote data including estimated output amount\n */\nexport async function getOpenOceanQuote(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n): Promise<OpenOceanQuote> {\n if (agent.demo) {\n return createMockQuoteResponse(\"OpenOcean\", amount) as unknown as OpenOceanQuote;\n }\n return await getQuoteData(fromToken, toToken, amount, agent.chain);\n}\n","import { erc20Abi, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\n\n/**\n * Check token allowance for a spender\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token contract address\n * @param ownerAddress - Token owner's wallet address\n * @param spenderAddress - Spender address (DEX/protocol contract)\n * @returns Allowance amount as bigint\n */\nexport async function checkAllowance(\n agent: MNTAgentKit,\n tokenAddress: string,\n ownerAddress: string,\n spenderAddress: string,\n): Promise<bigint> {\n try {\n const allowance = await agent.client.readContract({\n address: tokenAddress as Address,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [ownerAddress as Address, spenderAddress as Address],\n });\n return allowance;\n } catch (error) {\n console.error(\"Failed to query allowance:\", error);\n throw error;\n }\n}\n","import { erc20Abi, type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { checkAllowance } from \"./checkAllowance\";\n\n/**\n * Approve token spending for a spender address\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token contract address\n * @param spenderAddress - Spender address (DEX/protocol contract)\n * @param amount - Amount to approve (as string in smallest units)\n * @returns Transaction hash if approval was needed, null if already approved\n */\nexport async function approveToken(\n agent: MNTAgentKit,\n tokenAddress: string,\n spenderAddress: string,\n amount: string,\n): Promise<{ approved: boolean; txHash: string | null }> {\n const walletAddress = agent.account.address;\n\n // Check current allowance\n const currentAllowance = await checkAllowance(\n agent,\n tokenAddress,\n walletAddress,\n spenderAddress,\n );\n\n if (currentAllowance >= BigInt(amount)) {\n console.log(\"Sufficient allowance already exists\");\n return { approved: true, txHash: null };\n }\n\n console.log(\"Insufficient allowance, approving tokens...\");\n\n // Encode approve function call\n const { encodeFunctionData } = await import(\"viem\");\n const approveData = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spenderAddress as Address, BigInt(amount)],\n });\n\n // Estimate gas\n const gasEstimate = await agent.client.estimateGas({\n account: agent.account,\n to: tokenAddress as Address,\n data: approveData as Hex,\n });\n\n // Send approval transaction\n const txHash = await agent.client.sendTransaction({\n to: tokenAddress as Address,\n data: approveData as Hex,\n value: BigInt(0),\n gas: gasEstimate,\n });\n\n console.log(`Approval tx sent: ${txHash}`);\n\n // Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Approval confirmed: ${receipt.status}`);\n\n return { approved: true, txHash };\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n NATIVE_TOKEN_ADDRESS,\n OPENOCEAN_EXCHANGE_PROXY,\n} from \"../../constants/openocean\";\nimport { approveToken } from \"../../utils/common\";\nimport { getSwapData } from \"../../utils/openocean\";\nimport { createMockOpenOceanSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap on OpenOcean\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @returns Transaction hash\n */\nexport async function swapOnOpenOcean(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n slippage: string = \"1\",\n): Promise<{ txHash: string; outAmount: string }> {\n if (agent.demo) {\n return createMockOpenOceanSwapResponse(amount);\n }\n\n if (!agent.demo && agent.chain != \"mainnet\") {\n throw new Error(\"Openocean swaps happen only on mainnet\");\n }\n\n const walletAddress = agent.account.address;\n\n // 1. Approve token if not native\n if (fromToken.toLowerCase() !== NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n await approveToken(agent, fromToken, OPENOCEAN_EXCHANGE_PROXY, amount);\n }\n\n // 2. Get swap transaction data\n const swapData = await getSwapData(\n fromToken,\n toToken,\n amount,\n walletAddress,\n slippage,\n agent.chain,\n );\n\n console.log(\"OpenOcean swap data received\");\n console.log(`Expected output: ${swapData.outAmount}`);\n\n // 3. Execute swap transaction\n const txHash = await agent.client.sendTransaction({\n to: swapData.to as Address,\n data: swapData.data as Hex,\n value: BigInt(swapData.value || \"0\"),\n gas: BigInt(swapData.estimatedGas),\n });\n\n console.log(`OpenOcean swap tx sent: ${txHash}`);\n\n // 4. Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Swap confirmed: ${receipt.status}`);\n\n return {\n txHash,\n outAmount: swapData.outAmount,\n };\n}\n","// 1inch API configuration\nexport const ONEINCH_BASE_URL = \"https://api.1inch.dev/swap/v6.0\";\n\n// Chain IDs for 1inch\nexport const ONEINCH_CHAIN_ID = {\n mainnet: \"5000\", // Mantle mainnet\n testnet: \"5003\", // Mantle testnet (may not be supported)\n} as const;\n\n// Native token address\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// 1inch Aggregation Router v6 on Mantle\nexport const ONEINCH_ROUTER_ADDRESS = \"0x111111125421cA6dc452d289314280a0f8842A65\";\n\n// API configuration (optional - for rate limit increase)\nexport const configs = {\n apiKey: process.env.ONEINCH_API_KEY, // Optional: for higher rate limits\n};\n","import { configs } from \"../../constants/oneinch\";\n\n/**\n * Get headers for 1inch API requests\n * 1inch uses Bearer token authentication (optional - for higher rate limits)\n * @returns Headers object with optional Authorization header\n */\nexport function getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // 1inch API key is optional - used for higher rate limits\n if (configs.apiKey) {\n headers[\"Authorization\"] = `Bearer ${configs.apiKey}`;\n }\n\n return headers;\n}\n\n","import axios from \"axios\";\nimport { ONEINCH_BASE_URL, ONEINCH_CHAIN_ID } from \"../../constants/oneinch\";\nimport { getHeaders } from \"../../helpers/oneinch\";\n\nexport interface OneInchQuote {\n srcToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n dstToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n srcAmount: string;\n dstAmount: string;\n gas: number;\n}\n\nexport interface OneInchSwapData {\n srcToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n dstToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n srcAmount: string;\n dstAmount: string;\n tx: {\n from: string;\n to: string;\n data: string;\n value: string;\n gas: number;\n gasPrice: string;\n };\n}\n\n\n/**\n * Get swap quote from 1inch API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Quote data\n */\nexport async function getQuoteData(\n fromToken: string,\n toToken: string,\n amount: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OneInchQuote> {\n try {\n const chainId = ONEINCH_CHAIN_ID[chain];\n const url = `${ONEINCH_BASE_URL}/${chainId}/quote`;\n\n const params = {\n src: fromToken,\n dst: toToken,\n amount: amount,\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n return response.data;\n } catch (error) {\n console.error(\"Failed to get 1inch quote:\", (error as Error).message);\n throw error;\n }\n}\n\n/**\n * Get swap transaction data from 1inch API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param userAddress - User's wallet address\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Swap transaction data\n */\nexport async function getSwapData(\n fromToken: string,\n toToken: string,\n amount: string,\n userAddress: string,\n slippage: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OneInchSwapData> {\n try {\n const chainId = ONEINCH_CHAIN_ID[chain];\n const url = `${ONEINCH_BASE_URL}/${chainId}/swap`;\n\n const params = {\n src: fromToken,\n dst: toToken,\n amount: amount,\n from: userAddress,\n slippage: slippage,\n disableEstimate: \"true\", // We'll estimate gas ourselves\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n return response.data;\n } catch (error) {\n console.error(\"Failed to get 1inch swap data:\", (error as Error).message);\n throw error;\n }\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { getQuoteData, type OneInchQuote } from \"../../utils/oneinch\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Get swap quote from 1inch\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @returns Quote data including estimated output amount\n */\nexport async function get1inchQuote(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n): Promise<OneInchQuote> {\n if (agent.demo) {\n return createMockQuoteResponse(\"1inch\", amount) as unknown as OneInchQuote;\n }\n return await getQuoteData(fromToken, toToken, amount, agent.chain);\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { NATIVE_TOKEN_ADDRESS, ONEINCH_ROUTER_ADDRESS } from \"../../constants/oneinch\";\nimport { approveToken } from \"../../utils/common\";\nimport { getSwapData } from \"../../utils/oneinch\";\nimport { createMock1inchSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap on 1inch\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @returns Transaction hash and output amount\n */\nexport async function swapOn1inch(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n slippage: string = \"1\",\n): Promise<{ txHash: string; dstAmount: string }> {\n if (agent.demo) {\n return createMock1inchSwapResponse(amount);\n }\n\n const walletAddress = agent.account.address;\n\n // 1. Approve token if not native\n if (fromToken.toLowerCase() !== NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n await approveToken(agent, fromToken, ONEINCH_ROUTER_ADDRESS, amount);\n }\n\n // 2. Get swap transaction data\n const swapData = await getSwapData(\n fromToken,\n toToken,\n amount,\n walletAddress,\n slippage,\n agent.chain,\n );\n\n console.log(\"1inch swap data received\");\n console.log(`Expected output: ${swapData.dstAmount}`);\n\n // 3. Estimate gas\n const gasEstimate = await agent.client.estimateGas({\n account: agent.account,\n to: swapData.tx.to as Address,\n data: swapData.tx.data as Hex,\n value: BigInt(swapData.tx.value || \"0\"),\n });\n\n // 4. Execute swap transaction\n const txHash = await agent.client.sendTransaction({\n to: swapData.tx.to as Address,\n data: swapData.tx.data as Hex,\n value: BigInt(swapData.tx.value || \"0\"),\n gas: gasEstimate,\n });\n\n console.log(`1inch swap tx sent: ${txHash}`);\n\n // 5. Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Swap confirmed: ${receipt.status}`);\n\n return {\n txHash,\n dstAmount: swapData.dstAmount,\n };\n}\n","// Uniswap V3 contract addresses on Mantle\n// Reference: https://docs.uniswap.org/contracts/v3/reference/deployments\n\n// SwapRouter02 - Universal Router for swaps\nexport const SWAP_ROUTER_ADDRESS = \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\";\n\n// QuoterV2 - For getting swap quotes\nexport const QUOTER_V2_ADDRESS = \"0x61fFE014bA17989E743c5F6cB21bF9697530B21e\";\n\n// Factory address\nexport const FACTORY_ADDRESS = \"0x1F98431c8aD98523631AE4a59f267346ea31F984\";\n\n// WETH address on Mantle\nexport const WMNT_ADDRESS = \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\";\n\n// Native token placeholder\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// Default fee tiers (in hundredths of a bip)\nexport const FEE_TIERS = {\n LOWEST: 100, // 0.01%\n LOW: 500, // 0.05%\n MEDIUM: 3000, // 0.3%\n HIGH: 10000, // 1%\n} as const;\n\n// Default pool fee\nexport const DEFAULT_POOL_FEE = FEE_TIERS.MEDIUM;\n","import { encodeFunctionData, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n QUOTER_V2_ADDRESS,\n SWAP_ROUTER_ADDRESS,\n DEFAULT_POOL_FEE,\n WMNT_ADDRESS,\n NATIVE_TOKEN_ADDRESS,\n} from \"../../constants/uniswap\";\n\n// QuoterV2 ABI for quoteExactInputSingle\nconst quoterV2Abi = [\n {\n inputs: [\n {\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"quoteExactInputSingle\",\n outputs: [\n { name: \"amountOut\", type: \"uint256\" },\n { name: \"sqrtPriceX96After\", type: \"uint160\" },\n { name: \"initializedTicksCrossed\", type: \"uint32\" },\n { name: \"gasEstimate\", type: \"uint256\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n// SwapRouter02 ABI for exactInputSingle\nconst swapRouterAbi = [\n {\n inputs: [\n {\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"exactInputSingle\",\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\nexport interface UniswapQuoteResult {\n amountOut: bigint;\n sqrtPriceX96After: bigint;\n gasEstimate: bigint;\n}\n\nexport interface UniswapSwapParams {\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n amountOutMinimum: string;\n recipient: string;\n fee?: number;\n}\n\n/**\n * Get token address, converting native token to WMNT\n */\nfunction getTokenAddress(token: string): Address {\n if (token.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n return WMNT_ADDRESS as Address;\n }\n return token as Address;\n}\n\n/**\n * Get swap quote from Uniswap V3\n * @param agent - MNTAgentKit instance\n * @param tokenIn - Input token address\n * @param tokenOut - Output token address\n * @param amountIn - Amount to swap (in smallest units)\n * @param fee - Pool fee tier (default: 3000 = 0.3%)\n * @returns Quote result with expected output amount\n */\nexport async function getUniswapQuoteData(\n agent: MNTAgentKit,\n tokenIn: string,\n tokenOut: string,\n amountIn: string,\n fee: number = DEFAULT_POOL_FEE,\n): Promise<UniswapQuoteResult> {\n try {\n const result = await agent.client.simulateContract({\n address: QUOTER_V2_ADDRESS as Address,\n abi: quoterV2Abi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: getTokenAddress(tokenIn),\n tokenOut: getTokenAddress(tokenOut),\n amountIn: BigInt(amountIn),\n fee: fee,\n sqrtPriceLimitX96: BigInt(0),\n },\n ],\n });\n\n const [amountOut, sqrtPriceX96After, , gasEstimate] = result.result;\n\n return {\n amountOut,\n sqrtPriceX96After,\n gasEstimate,\n };\n } catch (error) {\n console.error(\"Failed to get Uniswap quote:\", error);\n throw error;\n }\n}\n\n/**\n * Build swap transaction calldata for Uniswap V3\n * @param params - Swap parameters\n * @param fee - Pool fee tier\n * @returns Encoded calldata for the swap\n */\nexport function buildSwapCalldata(\n params: UniswapSwapParams,\n fee: number = DEFAULT_POOL_FEE,\n): `0x${string}` {\n return encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: getTokenAddress(params.tokenIn),\n tokenOut: getTokenAddress(params.tokenOut),\n fee: fee,\n recipient: params.recipient as Address,\n amountIn: BigInt(params.amountIn),\n amountOutMinimum: BigInt(params.amountOutMinimum),\n sqrtPriceLimitX96: BigInt(0),\n },\n ],\n });\n}\n\nexport { SWAP_ROUTER_ADDRESS, QUOTER_V2_ADDRESS, NATIVE_TOKEN_ADDRESS, WMNT_ADDRESS };\n","import type { MNTAgentKit } from \"../../agent\";\nimport { DEFAULT_POOL_FEE } from \"../../constants/uniswap\";\nimport { getUniswapQuoteData, type UniswapQuoteResult } from \"../../utils/uniswap\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Get swap quote from Uniswap V3\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param fee - Pool fee tier (default: 3000 = 0.3%)\n * @returns Quote with expected output amount\n */\nexport async function getUniswapQuote(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n fee: number = DEFAULT_POOL_FEE,\n): Promise<UniswapQuoteResult> {\n if (agent.demo) {\n return createMockQuoteResponse(\"Uniswap\", amount) as unknown as UniswapQuoteResult;\n }\n return await getUniswapQuoteData(agent, fromToken, toToken, amount, fee);\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { DEFAULT_POOL_FEE, SWAP_ROUTER_ADDRESS, NATIVE_TOKEN_ADDRESS } from \"../../constants/uniswap\";\nimport { approveToken } from \"../../utils/common\";\nimport { getUniswapQuoteData, buildSwapCalldata } from \"../../utils/uniswap\";\nimport { createMockUniswapSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap on Uniswap V3\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage percentage (e.g., \"0.5\" for 0.5%)\n * @param fee - Pool fee tier (default: 3000 = 0.3%)\n * @returns Transaction hash and output amount\n */\nexport async function swapOnUniswap(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n slippage: string = \"0.5\",\n fee: number = DEFAULT_POOL_FEE,\n): Promise<{ txHash: string; amountOut: string }> {\n if (agent.demo) {\n return createMockUniswapSwapResponse(amount);\n }\n\n const walletAddress = agent.account.address;\n const isNativeIn = fromToken.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase();\n\n // 1. Get quote for expected output\n const quote = await getUniswapQuoteData(agent, fromToken, toToken, amount, fee);\n console.log(`Uniswap quote: ${quote.amountOut.toString()}`);\n\n // 2. Calculate minimum output with slippage\n const slippageBps = Math.floor(parseFloat(slippage) * 100); // Convert to basis points\n const amountOutMinimum = (quote.amountOut * BigInt(10000 - slippageBps)) / BigInt(10000);\n\n // 3. Approve token if not native\n if (!isNativeIn) {\n await approveToken(agent, fromToken, SWAP_ROUTER_ADDRESS, amount);\n }\n\n // 4. Build swap calldata\n const calldata = buildSwapCalldata(\n {\n tokenIn: fromToken,\n tokenOut: toToken,\n amountIn: amount,\n amountOutMinimum: amountOutMinimum.toString(),\n recipient: walletAddress,\n },\n fee,\n );\n\n // 5. Estimate gas\n const gasEstimate = await agent.client.estimateGas({\n account: agent.account,\n to: SWAP_ROUTER_ADDRESS as Address,\n data: calldata as Hex,\n value: isNativeIn ? BigInt(amount) : BigInt(0),\n });\n\n // 6. Execute swap transaction\n const txHash = await agent.client.sendTransaction({\n to: SWAP_ROUTER_ADDRESS as Address,\n data: calldata as Hex,\n value: isNativeIn ? BigInt(amount) : BigInt(0),\n gas: gasEstimate,\n });\n\n console.log(`Uniswap swap tx sent: ${txHash}`);\n\n // 7. Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Swap confirmed: ${receipt.status}`);\n\n return {\n txHash,\n amountOut: quote.amountOut.toString(),\n };\n}\n","// Squid Router API configuration\nexport const SQUID_BASE_URL = \"https://api.squidrouter.com/v2\";\n\n// Chain IDs for Squid Router (LayerZero chain IDs)\nexport const SQUID_CHAIN_ID = {\n mainnet: 5000, // Mantle mainnet\n testnet: 5003, // Mantle testnet\n} as const;\n\n// Common destination chains (LayerZero chain IDs)\nexport const DESTINATION_CHAINS = {\n ethereum: 101,\n arbitrum: 110,\n optimism: 111,\n polygon: 109,\n base: 184,\n bsc: 102,\n avalanche: 106,\n mantle: 5000,\n} as const;\n\n// Native token address\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n","/**\n * Get headers for Squid Router API requests\n * Squid Router uses public endpoints, but may require integrator ID in the future\n * @param integratorId - Optional integrator ID for future use\n * @returns Headers object\n */\nexport function getHeaders(integratorId?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Future: Add integrator ID support if Squid requires it\n if (integratorId) {\n headers[\"X-Integrator-Id\"] = integratorId;\n }\n\n return headers;\n}\n\n","import axios from \"axios\";\nimport { type Address } from \"viem\";\nimport { SQUID_BASE_URL, SQUID_CHAIN_ID, NATIVE_TOKEN_ADDRESS } from \"../../constants/squid\";\nimport { getHeaders } from \"../../helpers/squid\";\n\nexport interface SquidRoute {\n route: {\n estimate: {\n fromAmount: string;\n toAmount: string;\n toAmountMin: string;\n route: {\n actionType: string;\n chainType: string;\n data: {\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n amountOut: string;\n path: string[];\n };\n }[];\n estimatedRouteDuration: number;\n aggregatePriceImpact: string;\n feeCosts: {\n name: string;\n description: string;\n percentage: string;\n amount: string;\n amountUSD: string;\n }[];\n gasCosts: {\n type: string;\n amount: string;\n amountUSD: string;\n gasPrice: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n estimate: string;\n }[];\n };\n transactionRequest: {\n routeType: string;\n targetAddress: string;\n data: string;\n value: string;\n gasLimit: string;\n gasPrice: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n };\n };\n}\n\n/**\n * Get cross-chain swap route from Squid Router\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param fromChain - Source chain ID (LayerZero chain ID)\n * @param toChain - Destination chain ID (LayerZero chain ID)\n * @param amount - Amount to swap (in smallest units)\n * @param fromAddress - User's wallet address on source chain\n * @param slippage - Slippage tolerance (default: 1%)\n * @returns Route data including transaction request\n */\nexport async function getRouteData(\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n fromAddress: Address,\n slippage: number = 1,\n): Promise<SquidRoute> {\n const params = {\n fromChain: fromChain.toString(),\n toChain: toChain.toString(),\n fromToken:\n fromToken.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()\n ? \"native\"\n : fromToken,\n toToken:\n toToken.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()\n ? \"native\"\n : toToken,\n fromAmount: amount,\n fromAddress,\n slippage: slippage.toString(),\n enableForecast: false,\n };\n\n const response = await axios.get<SquidRoute>(`${SQUID_BASE_URL}/route`, {\n params,\n headers: getHeaders(),\n });\n\n return response.data;\n}\n\n/**\n * Get transaction status from Squid Router\n * @param transactionHash - Transaction hash\n * @param fromChain - Source chain ID\n * @returns Transaction status\n */\nexport async function getTransactionStatus(\n transactionHash: string,\n fromChain: number,\n): Promise<any> {\n const response = await axios.get(`${SQUID_BASE_URL}/status`, {\n params: {\n transactionHash,\n fromChain: fromChain.toString(),\n },\n headers: getHeaders(),\n });\n\n return response.data;\n}\n\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { SQUID_CHAIN_ID, NATIVE_TOKEN_ADDRESS } from \"../../constants/squid\";\nimport { approveToken } from \"../../utils/common\";\nimport { getRouteData } from \"../../utils/squid\";\nimport { createMockTxHash, createMockSquidRoute } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute cross-chain swap via Squid Router\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param fromChain - Source chain ID (LayerZero chain ID)\n * @param toChain - Destination chain ID (LayerZero chain ID)\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage tolerance percentage (default: 1%)\n * @returns Transaction hash\n */\nexport async function crossChainSwapViaSquid(\n agent: MNTAgentKit,\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n): Promise<Hex> {\n if (agent.demo) {\n return createMockTxHash();\n }\n\n // Get route data from Squid API\n const routeData = await getRouteData(\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n agent.account.address,\n slippage,\n );\n\n const transactionRequest = routeData.route.transactionRequest;\n\n // Approve token if not native\n if (\n fromToken.toLowerCase() !== NATIVE_TOKEN_ADDRESS.toLowerCase() &&\n transactionRequest.targetAddress\n ) {\n await approveToken(\n agent,\n fromToken,\n transactionRequest.targetAddress as Address,\n amount,\n );\n }\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: transactionRequest.targetAddress as Address,\n data: transactionRequest.data as Hex,\n value: BigInt(transactionRequest.value || \"0\"),\n gas: BigInt(transactionRequest.gasLimit || \"0\"),\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n\n/**\n * Get cross-chain swap route from Squid Router\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param fromChain - Source chain ID (LayerZero chain ID)\n * @param toChain - Destination chain ID (LayerZero chain ID)\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage tolerance percentage (default: 1%)\n * @returns Route data including estimated output and fees\n */\nexport async function getSquidRoute(\n agent: MNTAgentKit,\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n) {\n if (agent.demo) {\n return createMockSquidRoute(amount);\n }\n\n return await getRouteData(\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n agent.account.address,\n slippage,\n );\n}\n\n","// Lendle Protocol contract addresses on Mantle Network\n// Official docs: https://docs.lendle.xyz/contracts-and-security/mantle-contracts\n// Lendle is an Aave V2 fork optimized for Mantle Network\n\n// LendingPool - Main contract for supply, borrow, withdraw operations\nexport const LENDING_POOL = {\n mainnet: \"0xCFa5aE7c2CE8Fadc6426C1ff872cA45378Fb7cF3\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const, // Not deployed on testnet\n} as const;\n\n// LendingPoolAddressesProvider - Registry for protocol addresses\nexport const LENDING_POOL_ADDRESSES_PROVIDER = {\n mainnet: \"0xAb94Bedd21ae3411eB2698945dfCab1D5C19C3d4\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// AaveProtocolDataProvider - Helper contract for reading protocol data\nexport const PROTOCOL_DATA_PROVIDER = {\n mainnet: \"0x552b9e4bae485C4B7F540777d7D25614CdB84773\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// AaveOracle - Price oracle for assets\nexport const ORACLE = {\n mainnet: \"0x870c9692Ab04944C86ec6FEeF63F261226506EfC\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// WMNT address for native MNT wrapping\nexport const WMNT_ADDRESS = \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" as const;\n\n// Interest rate modes\nexport const INTEREST_RATE_MODE = {\n STABLE: 1,\n VARIABLE: 2,\n} as const;\n\n// Lendle LendingPool ABI (Aave V2 compatible)\nexport const LENDING_POOL_ABI = [\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"onBehalfOf\", type: \"address\" },\n { name: \"referralCode\", type: \"uint16\" },\n ],\n name: \"deposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"to\", type: \"address\" },\n ],\n name: \"withdraw\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"interestRateMode\", type: \"uint256\" },\n { name: \"referralCode\", type: \"uint16\" },\n { name: \"onBehalfOf\", type: \"address\" },\n ],\n name: \"borrow\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"rateMode\", type: \"uint256\" },\n { name: \"onBehalfOf\", type: \"address\" },\n ],\n name: \"repay\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"user\", type: \"address\" }],\n name: \"getUserAccountData\",\n outputs: [\n { name: \"totalCollateralETH\", type: \"uint256\" },\n { name: \"totalDebtETH\", type: \"uint256\" },\n { name: \"availableBorrowsETH\", type: \"uint256\" },\n { name: \"currentLiquidationThreshold\", type: \"uint256\" },\n { name: \"ltv\", type: \"uint256\" },\n { name: \"healthFactor\", type: \"uint256\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"asset\", type: \"address\" }],\n name: \"getReserveData\",\n outputs: [\n {\n components: [\n { name: \"configuration\", type: \"uint256\" },\n { name: \"liquidityIndex\", type: \"uint128\" },\n { name: \"variableBorrowIndex\", type: \"uint128\" },\n { name: \"currentLiquidityRate\", type: \"uint128\" },\n { name: \"currentVariableBorrowRate\", type: \"uint128\" },\n { name: \"currentStableBorrowRate\", type: \"uint128\" },\n { name: \"lastUpdateTimestamp\", type: \"uint40\" },\n { name: \"aTokenAddress\", type: \"address\" },\n { name: \"stableDebtTokenAddress\", type: \"address\" },\n { name: \"variableDebtTokenAddress\", type: \"address\" },\n { name: \"interestRateStrategyAddress\", type: \"address\" },\n { name: \"id\", type: \"uint8\" },\n ],\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// ProtocolDataProvider ABI for reading user reserve data\nexport const PROTOCOL_DATA_PROVIDER_ABI = [\n {\n inputs: [],\n name: \"getAllReservesTokens\",\n outputs: [\n {\n components: [\n { name: \"symbol\", type: \"string\" },\n { name: \"tokenAddress\", type: \"address\" },\n ],\n name: \"\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"user\", type: \"address\" },\n ],\n name: \"getUserReserveData\",\n outputs: [\n { name: \"currentATokenBalance\", type: \"uint256\" },\n { name: \"currentStableDebt\", type: \"uint256\" },\n { name: \"currentVariableDebt\", type: \"uint256\" },\n { name: \"principalStableDebt\", type: \"uint256\" },\n { name: \"scaledVariableDebt\", type: \"uint256\" },\n { name: \"stableBorrowRate\", type: \"uint256\" },\n { name: \"liquidityRate\", type: \"uint256\" },\n { name: \"stableRateLastUpdated\", type: \"uint40\" },\n { name: \"usageAsCollateralEnabled\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"asset\", type: \"address\" }],\n name: \"getReserveTokensAddresses\",\n outputs: [\n { name: \"aTokenAddress\", type: \"address\" },\n { name: \"stableDebtTokenAddress\", type: \"address\" },\n { name: \"variableDebtTokenAddress\", type: \"address\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// Supported assets on Lendle (Mantle mainnet)\nexport const LENDLE_SUPPORTED_ASSETS = {\n mainnet: [\n { symbol: \"WMNT\", address: \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" },\n { symbol: \"WETH\", address: \"0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111\" },\n { symbol: \"USDC\", address: \"0x09Bc4E0D10C81b3a3766c49F0f98a8aaa7adA8D2\" },\n { symbol: \"USDT\", address: \"0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE\" },\n { symbol: \"mETH\", address: \"0xcDA86A272531e8640cD7F1a92c01839911B90bb0\" },\n ],\n testnet: [],\n} as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI, WMNT_ADDRESS } from \"../../constants/lendle\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Supply (deposit) tokens to Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to supply\n * @param amount - Amount to supply (in smallest units)\n * @returns Transaction hash\n */\nexport async function lendleSupply(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"supply\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const isNative = tokenAddress.toLowerCase() === WMNT_ADDRESS.toLowerCase();\n\n // Approve token spending if not native\n if (!isNative) {\n await approveToken(agent, tokenAddress, lendingPoolAddress, amount);\n }\n\n // Encode deposit function call (Aave V2 uses 'deposit' instead of 'supply')\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"deposit\",\n args: [tokenAddress, amountBigInt, agent.account.address, 0], // referralCode = 0 (uint16)\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n value: isNative ? amountBigInt : 0n,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI } from \"../../constants/lendle\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Withdraw tokens from Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to withdraw\n * @param amount - Amount to withdraw (in smallest units, use max uint256 for max)\n * @param to - Address to receive withdrawn tokens (optional, defaults to agent address)\n * @returns Transaction hash\n */\nexport async function lendleWithdraw(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n to?: Address,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"withdraw\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const toAddress = to || agent.account.address;\n\n // Encode withdraw function call\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"withdraw\",\n args: [tokenAddress, amountBigInt, toAddress],\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI, INTEREST_RATE_MODE } from \"../../constants/lendle\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Borrow tokens from Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to borrow\n * @param amount - Amount to borrow (in smallest units)\n * @param interestRateMode - Interest rate mode (1 = stable, 2 = variable)\n * @param onBehalfOf - Address to receive borrowed tokens (optional, defaults to agent address)\n * @returns Transaction hash\n */\nexport async function lendleBorrow(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n interestRateMode: 1 | 2 = INTEREST_RATE_MODE.VARIABLE,\n onBehalfOf?: Address,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"borrow\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const onBehalfOfAddress = onBehalfOf || agent.account.address;\n\n // Encode borrow function call\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"borrow\",\n args: [tokenAddress, amountBigInt, BigInt(interestRateMode), 0, onBehalfOfAddress], // referralCode = 0 (uint16)\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI, INTEREST_RATE_MODE } from \"../../constants/lendle\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Repay borrowed tokens to Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to repay\n * @param amount - Amount to repay (in smallest units, use max uint256 for full repayment)\n * @param rateMode - Interest rate mode (1 = stable, 2 = variable)\n * @param onBehalfOf - Address whose debt to repay (optional, defaults to agent address)\n * @returns Transaction hash\n */\nexport async function lendleRepay(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n rateMode: 1 | 2 = INTEREST_RATE_MODE.VARIABLE,\n onBehalfOf?: Address,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"repay\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const onBehalfOfAddress = onBehalfOf || agent.account.address;\n\n // Approve token spending for repayment\n await approveToken(agent, tokenAddress, lendingPoolAddress, amount);\n\n // Encode repay function call\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"repay\",\n args: [tokenAddress, amountBigInt, BigInt(rateMode), onBehalfOfAddress],\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, getAddress } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PROTOCOL_DATA_PROVIDER,\n PROTOCOL_DATA_PROVIDER_ABI,\n LENDLE_SUPPORTED_ASSETS,\n} from \"../../constants/lendle\";\n\nexport interface LendlePosition {\n asset: Address;\n symbol: string;\n supplied: bigint;\n stableDebt: bigint;\n variableDebt: bigint;\n totalDebt: bigint;\n liquidityRate: bigint; // Supply APY (in ray, 1e27)\n stableBorrowRate: bigint;\n usageAsCollateralEnabled: boolean;\n}\n\nexport interface LendlePositionsResult {\n positions: LendlePosition[];\n totalSupplied: bigint;\n totalDebt: bigint;\n}\n\n/**\n * Get all Lendle positions for a user\n * Returns per-token supply and borrow amounts\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with supply/borrow amounts per asset\n */\nexport async function lendleGetPositions(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<LendlePositionsResult> {\n const dataProviderAddress = PROTOCOL_DATA_PROVIDER[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (dataProviderAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `Lendle ProtocolDataProvider not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Get supported assets for the chain\n const supportedAssets = LENDLE_SUPPORTED_ASSETS[agent.chain];\n if (!supportedAssets || supportedAssets.length === 0) {\n throw new Error(`No supported assets configured for ${agent.chain}`);\n }\n\n const positions: LendlePosition[] = [];\n let totalSupplied = 0n;\n let totalDebt = 0n;\n\n // Query each asset's position\n for (const asset of supportedAssets) {\n try {\n // Normalize address to proper checksum format\n const assetAddress = getAddress(asset.address);\n const result = (await agent.client.readContract({\n address: dataProviderAddress,\n abi: PROTOCOL_DATA_PROVIDER_ABI,\n functionName: \"getUserReserveData\",\n args: [assetAddress, address],\n })) as readonly [\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n number,\n boolean,\n ];\n\n const [\n currentATokenBalance,\n currentStableDebt,\n currentVariableDebt,\n _principalStableDebt,\n _scaledVariableDebt,\n stableBorrowRate,\n liquidityRate,\n _stableRateLastUpdated,\n usageAsCollateralEnabled,\n ] = result;\n\n // Only include positions with non-zero supply or debt\n if (\n currentATokenBalance > 0n ||\n currentStableDebt > 0n ||\n currentVariableDebt > 0n\n ) {\n const assetTotalDebt = currentStableDebt + currentVariableDebt;\n\n positions.push({\n asset: assetAddress,\n symbol: asset.symbol,\n supplied: currentATokenBalance,\n stableDebt: currentStableDebt,\n variableDebt: currentVariableDebt,\n totalDebt: assetTotalDebt,\n liquidityRate,\n stableBorrowRate,\n usageAsCollateralEnabled,\n });\n\n totalSupplied += currentATokenBalance;\n totalDebt += assetTotalDebt;\n }\n } catch (error) {\n // Skip assets that fail (might not be supported)\n console.warn(`Failed to get position for ${asset.symbol}:`, error);\n }\n }\n\n return {\n positions,\n totalSupplied,\n totalDebt,\n };\n}\n","// Agni Finance contract addresses on Mantle Network\n// Agni is a Uniswap V3 fork - #1 DEX on Mantle with $87.9M TVL\n// Official site: https://agni.finance\n\n// Factory contract - Creates and manages liquidity pools\nexport const FACTORY = {\n mainnet: \"0x25780dc8Fc3cfBD75F33bFDAB65e969b603b2035\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// SwapRouter - Main contract for executing swaps\nexport const SWAP_ROUTER = {\n mainnet: \"0x319B69888b0d11cEC22caA5034e25FfFBDc88421\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// NFT Position Manager - Manages liquidity positions\nexport const POSITION_MANAGER = {\n mainnet: \"0x218bf598d1453383e2f4aa7b14ffb9bfb102d637\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// SwapRouter ABI (Uniswap V3 compatible)\nexport const SWAP_ROUTER_ABI = [\n {\n inputs: [\n {\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"exactInputSingle\",\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\n// Common fee tiers (in hundredths of a bip, i.e. 1e-6)\nexport const FEE_TIERS = {\n LOWEST: 100, // 0.01%\n LOW: 500, // 0.05%\n MEDIUM: 3000, // 0.3%\n HIGH: 10000, // 1%\n} as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { SWAP_ROUTER, SWAP_ROUTER_ABI, FEE_TIERS } from \"../../constants/agni\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Swap tokens on Agni Finance DEX\n * @param agent - MNTAgentKit instance\n * @param tokenIn - Input token address\n * @param tokenOut - Output token address\n * @param amountIn - Amount to swap (in smallest units)\n * @param slippagePercent - Slippage tolerance (default: 0.5%)\n * @param feeTier - Pool fee tier (default: MEDIUM = 0.3%)\n * @returns Transaction hash\n */\nexport async function agniSwap(\n agent: MNTAgentKit,\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n feeTier: number = FEE_TIERS.MEDIUM,\n): Promise<Hex> {\n const swapRouterAddress = SWAP_ROUTER[agent.chain];\n\n if (swapRouterAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockSwapResponse(\"Agni\", amountIn).txHash;\n }\n throw new Error(`Agni SwapRouter not available on ${agent.chain}`);\n }\n\n const amountInBigInt = BigInt(amountIn);\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 1200); // 20 minutes\n\n // Calculate minimum amount out (with slippage)\n const amountOutMinimum = (amountInBigInt * BigInt(10000 - Math.floor(slippagePercent * 100))) / 10000n;\n\n // Approve token\n await approveToken(agent, tokenIn, swapRouterAddress, amountIn);\n\n // Encode swap\n const data = encodeFunctionData({\n abi: SWAP_ROUTER_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn,\n tokenOut,\n fee: feeTier,\n recipient: agent.account.address,\n deadline,\n amountIn: amountInBigInt,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n const hash = await agent.client.sendTransaction({\n to: swapRouterAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash });\n return hash;\n}\n","// Merchant Moe - #2 DEX on Mantle with $73.3M TVL\n// TraderJoe fork with Liquidity Book (LB) 2.2\n// Official docs: https://docs.merchantmoe.com\n\n// LB Router - Main router for swaps\nexport const LB_ROUTER = {\n mainnet: \"0x013e138EF6008ae5FDFDE29700e3f2Bc61d21E3a\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// LB Factory - Creates liquidity book pairs\nexport const LB_FACTORY = {\n mainnet: \"0xa6630671775c4EA2743840F9A5016dCf2A104054\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// LB Quoter - Get quotes for swaps\nexport const LB_QUOTER = {\n mainnet: \"0x501b8AFd35df20f531fF45F6f695793AC3316c85\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// MOE Token\nexport const MOE_TOKEN = \"0x4515a45337f461a11ff0fe8abf3c606ae5dc00c9\" as const;\n\n// Simple Router ABI for swaps\nexport const LB_ROUTER_ABI = [\n {\n inputs: [\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMin\", type: \"uint256\" },\n { name: \"path\", type: \"uint256[]\" },\n { name: \"to\", type: \"address\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n name: \"swapExactTokensForTokens\",\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LB_ROUTER, LB_ROUTER_ABI } from \"../../constants/merchantmoe\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Swap tokens on Merchant Moe DEX\n * @param agent - MNTAgentKit instance\n * @param tokenIn - Input token address\n * @param tokenOut - Output token address\n * @param amountIn - Amount to swap (in smallest units)\n * @param slippagePercent - Slippage tolerance (default: 0.5%)\n * @returns Transaction hash\n */\nexport async function merchantMoeSwap(\n agent: MNTAgentKit,\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n): Promise<Hex> {\n const routerAddress = LB_ROUTER[agent.chain];\n\n if (routerAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockSwapResponse(\"MerchantMoe\", amountIn).txHash;\n }\n throw new Error(`Merchant Moe LB Router not available on ${agent.chain}`);\n }\n\n const amountInBigInt = BigInt(amountIn);\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 1200); // 20 min\n\n // Calculate minimum out with slippage\n const amountOutMin = (amountInBigInt * BigInt(10000 - Math.floor(slippagePercent * 100))) / 10000n;\n\n // Approve token\n await approveToken(agent, tokenIn, routerAddress, amountIn);\n\n // Simple path (direct swap)\n const path = [BigInt(tokenIn), BigInt(tokenOut)];\n\n const data = encodeFunctionData({\n abi: LB_ROUTER_ABI,\n functionName: \"swapExactTokensForTokens\",\n args: [amountInBigInt, amountOutMin, path, agent.account.address, deadline],\n });\n\n const hash = await agent.client.sendTransaction({\n to: routerAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash });\n return hash;\n}\n","// mETH Protocol - Mantle's Liquid Staking Token\n// Official docs: https://docs.mantle.xyz/meth\n// mETH represents staked ETH with accumulated rewards\n\n// mETH Token Address on Mantle L2\nexport const METH_TOKEN = {\n mainnet: \"0xcDA86A272531e8640cD7F1a92c01839911B90bb0\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// WETH (Wrapped ETH) address on Mantle - for mETH swaps (mETH is ETH-backed)\nexport const WETH_TOKEN = {\n mainnet: \"0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111\" as const,\n testnet: \"0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111\" as const,\n} as const;\n\n// WMNT (Wrapped MNT) address on Mantle\nexport const WMNT_TOKEN = {\n mainnet: \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" as const,\n testnet: \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" as const,\n} as const;\n\n// Native MNT token address (used by DEX aggregators)\nexport const NATIVE_MNT_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as const;\n\n// mETH exchange rate increases over time (1 mETH ≈ 1.08 ETH as of Dec 2025)\n// This is a value-accumulating token, not a rebasing token\n\n// mETH ABI for reading balance and exchange rate\nexport const METH_ABI = [\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { METH_TOKEN, METH_ABI, WETH_TOKEN, WMNT_TOKEN } from \"../../constants/meth\";\n\nexport interface MethPosition {\n methBalance: bigint; // Raw mETH balance in wei\n wethBalance: bigint; // WETH balance for mETH swaps (mETH is ETH-backed)\n wmntBalance: bigint; // WMNT balance for reference\n methTokenAddress: Address;\n wethTokenAddress: Address;\n wmntTokenAddress: Address;\n}\n\n/**\n * Get mETH position for a user\n * Returns mETH balance, WETH balance (for swaps), and WMNT balance\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns mETH position with balances\n */\nexport async function methGetPosition(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<MethPosition> {\n const methTokenAddress = METH_TOKEN[agent.chain];\n const wethTokenAddress = WETH_TOKEN[agent.chain];\n const wmntTokenAddress = WMNT_TOKEN[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (methTokenAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `mETH not available on ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Get mETH balance\n const methBalance = (await agent.client.readContract({\n address: methTokenAddress,\n abi: METH_ABI,\n functionName: \"balanceOf\",\n args: [address],\n })) as bigint;\n\n // Get WETH balance for mETH swaps (mETH is ETH-backed)\n let wethBalance = 0n;\n try {\n wethBalance = (await agent.client.readContract({\n address: wethTokenAddress,\n abi: METH_ABI, // Same ERC20 ABI works for WETH\n functionName: \"balanceOf\",\n args: [address],\n })) as bigint;\n } catch {\n // WETH balance query failed, continue with 0\n }\n\n // Get WMNT balance for reference\n let wmntBalance = 0n;\n try {\n wmntBalance = (await agent.client.readContract({\n address: wmntTokenAddress,\n abi: METH_ABI, // Same ERC20 ABI works for WMNT\n functionName: \"balanceOf\",\n args: [address],\n })) as bigint;\n } catch {\n // WMNT balance query failed, continue with 0\n }\n\n return {\n methBalance,\n wethBalance,\n wmntBalance,\n methTokenAddress,\n wethTokenAddress,\n wmntTokenAddress,\n };\n}\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { METH_TOKEN, WETH_TOKEN } from \"../../constants/meth\";\nimport { swapOnOpenOcean } from \"../openocean\";\n\n/**\n * Swap WETH to mETH using DEX aggregator\n * This is the L2 way to acquire mETH - swap via DEX\n * @param agent - MNTAgentKit instance\n * @param amount - Amount of WETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\nexport async function swapToMeth(\n agent: MNTAgentKit,\n amount: string,\n slippage: number = 0.5,\n): Promise<Hex> {\n const methTokenAddress = METH_TOKEN[agent.chain];\n const wethTokenAddress = WETH_TOKEN[agent.chain];\n\n if (methTokenAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `mETH not available on ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Use OpenOcean aggregator to swap WETH -> mETH\n const result = await swapOnOpenOcean(\n agent,\n wethTokenAddress as Address,\n methTokenAddress as Address,\n amount,\n slippage.toString(),\n );\n\n return result.txHash as Hex;\n}\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { METH_TOKEN, WETH_TOKEN } from \"../../constants/meth\";\nimport { swapOnOpenOcean } from \"../openocean\";\n\n/**\n * Swap mETH to WETH using DEX aggregator\n * This is the L2 way to exit mETH position - swap via DEX\n * @param agent - MNTAgentKit instance\n * @param amount - Amount of mETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\nexport async function swapFromMeth(\n agent: MNTAgentKit,\n amount: string,\n slippage: number = 0.5,\n): Promise<Hex> {\n const methTokenAddress = METH_TOKEN[agent.chain];\n const wethTokenAddress = WETH_TOKEN[agent.chain];\n\n if (methTokenAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `mETH not available on ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Use OpenOcean aggregator to swap mETH -> WETH\n const result = await swapOnOpenOcean(\n agent,\n methTokenAddress as Address,\n wethTokenAddress as Address,\n amount,\n slippage.toString(),\n );\n\n return result.txHash as Hex;\n}\n","// PikePerps - Perpetual Trading on Mantle Network\n// Supports long/short positions with up to 100x leverage\n// Uses BondingCurveMarket for meme token pricing\n\n// PerpetualTrading contract addresses\nexport const PERPETUAL_TRADING = {\n mainnet: \"0x0000000000000000000000000000000000000000\" as const, // Not deployed yet\n testnet: \"0x8081b646f349c049f2d5e8a400057d411dd657bd\" as const,\n} as const;\n\n// BondingCurveMarket for price feeds\nexport const BONDING_CURVE_MARKET = {\n mainnet: \"0x0000000000000000000000000000000000000000\" as const,\n testnet: \"0x93b268325A9862645c82b32229f3B52264750Ca2\" as const,\n} as const;\n\n// Trading configuration\nexport const PIKE_PERPS_CONFIG = {\n MAX_LEVERAGE: 100,\n DEFAULT_LEVERAGE: 10,\n MIN_LEVERAGE: 1,\n TRADING_FEE_BPS: 5, // 0.05%\n LIQUIDATION_REWARD_BPS: 500, // 5%\n PRICE_DECIMALS: 8, // Prices are scaled by 1e8\n} as const;\n\n// PerpetualTrading ABI\nexport const PERPETUAL_TRADING_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"_pyth\", type: \"address\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"uint256\", name: \"positionId\", type: \"uint256\" },\n { indexed: true, internalType: \"address\", name: \"user\", type: \"address\" },\n { indexed: false, internalType: \"uint256\", name: \"pnl\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"exitPrice\", type: \"uint256\" },\n ],\n name: \"PositionClosed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"uint256\", name: \"positionId\", type: \"uint256\" },\n { indexed: true, internalType: \"address\", name: \"user\", type: \"address\" },\n { indexed: false, internalType: \"uint256\", name: \"liquidationPrice\", type: \"uint256\" },\n ],\n name: \"PositionLiquidated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"uint256\", name: \"positionId\", type: \"uint256\" },\n { indexed: true, internalType: \"address\", name: \"user\", type: \"address\" },\n { indexed: true, internalType: \"address\", name: \"token\", type: \"address\" },\n { indexed: false, internalType: \"bool\", name: \"isLong\", type: \"bool\" },\n { indexed: false, internalType: \"uint256\", name: \"size\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"margin\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"leverage\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"entryPrice\", type: \"uint256\" },\n ],\n name: \"PositionOpened\",\n type: \"event\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"closePosition\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"getCurrentPrice\",\n outputs: [\n { internalType: \"uint256\", name: \"currentPrice\", type: \"uint256\" },\n { internalType: \"bool\", name: \"hasPrice\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"getLiquidationPrice\",\n outputs: [{ internalType: \"uint256\", name: \"liquidationPrice\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"getPosition\",\n outputs: [\n {\n components: [\n { internalType: \"address\", name: \"user\", type: \"address\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"bool\", name: \"isLong\", type: \"bool\" },\n { internalType: \"uint256\", name: \"size\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"margin\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"leverage\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"entryPrice\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"entryTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"lastFundingTime\", type: \"uint256\" },\n { internalType: \"bool\", name: \"isOpen\", type: \"bool\" },\n ],\n internalType: \"struct PerpetualTrading.Position\",\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"getPositionPnL\",\n outputs: [\n { internalType: \"uint256\", name: \"pnl\", type: \"uint256\" },\n { internalType: \"bool\", name: \"isProfit\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_user\", type: \"address\" }],\n name: \"getUserPositions\",\n outputs: [{ internalType: \"uint256[]\", name: \"\", type: \"uint256[]\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"liquidatePosition\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"maxLeverage\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"minMarginBps\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextPositionId\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"_token\", type: \"address\" },\n { internalType: \"bool\", name: \"_isLong\", type: \"bool\" },\n { internalType: \"uint256\", name: \"_margin\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"_leverage\", type: \"uint256\" },\n ],\n name: \"openPosition\",\n outputs: [{ internalType: \"uint256\", name: \"positionId\", type: \"uint256\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"shouldLiquidate\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"tradingFeeBps\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// BondingCurveMarket ABI (for price queries)\nexport const BONDING_CURVE_MARKET_ABI = [\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"getCurrentPrice\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"isListed\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"getCurveProgress\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PERPETUAL_TRADING,\n PERPETUAL_TRADING_ABI,\n PIKE_PERPS_CONFIG,\n} from \"../../constants/pikeperps\";\n\nexport interface OpenPositionResult {\n positionId: bigint;\n txHash: Hex;\n}\n\n/**\n * Open a long position on PikePerps\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100)\n * @returns Position ID and transaction hash\n */\nexport async function pikeperpsOpenLong(\n agent: MNTAgentKit,\n tokenAddress: Address,\n margin: string,\n leverage: number = PIKE_PERPS_CONFIG.DEFAULT_LEVERAGE,\n): Promise<OpenPositionResult> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Validate leverage\n if (leverage < PIKE_PERPS_CONFIG.MIN_LEVERAGE || leverage > PIKE_PERPS_CONFIG.MAX_LEVERAGE) {\n throw new Error(\n `Leverage must be between ${PIKE_PERPS_CONFIG.MIN_LEVERAGE} and ${PIKE_PERPS_CONFIG.MAX_LEVERAGE}`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return {\n positionId: BigInt(Math.floor(Math.random() * 1000)),\n txHash: \"0xdemo_open_long_tx_hash\" as Hex,\n };\n }\n\n const marginBigInt = BigInt(margin);\n\n // Encode function call\n const data = encodeFunctionData({\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"openPosition\",\n args: [tokenAddress, true, marginBigInt, BigInt(leverage)],\n });\n\n // Send transaction with margin as value\n const txHash = await agent.client.sendTransaction({\n to: perpetualTradingAddress,\n data,\n value: marginBigInt,\n });\n\n // Wait for receipt to get position ID from events\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n // Parse PositionOpened event to get position ID\n let positionId = 0n;\n for (const log of receipt.logs) {\n try {\n // PositionOpened event topic\n if (log.topics[0] === \"0x2e5b0e8c5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5\") {\n positionId = BigInt(log.topics[1] || \"0\");\n break;\n }\n } catch {\n // Continue if parsing fails\n }\n }\n\n // If we couldn't parse the event, try to get next position ID - 1\n if (positionId === 0n) {\n try {\n const nextId = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"nextPositionId\",\n })) as bigint;\n positionId = nextId - 1n;\n } catch {\n // Position ID unknown\n }\n }\n\n return {\n positionId,\n txHash,\n };\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PERPETUAL_TRADING,\n PERPETUAL_TRADING_ABI,\n PIKE_PERPS_CONFIG,\n} from \"../../constants/pikeperps\";\n\nexport interface OpenPositionResult {\n positionId: bigint;\n txHash: Hex;\n}\n\n/**\n * Open a short position on PikePerps\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100)\n * @returns Position ID and transaction hash\n */\nexport async function pikeperpsOpenShort(\n agent: MNTAgentKit,\n tokenAddress: Address,\n margin: string,\n leverage: number = PIKE_PERPS_CONFIG.DEFAULT_LEVERAGE,\n): Promise<OpenPositionResult> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Validate leverage\n if (leverage < PIKE_PERPS_CONFIG.MIN_LEVERAGE || leverage > PIKE_PERPS_CONFIG.MAX_LEVERAGE) {\n throw new Error(\n `Leverage must be between ${PIKE_PERPS_CONFIG.MIN_LEVERAGE} and ${PIKE_PERPS_CONFIG.MAX_LEVERAGE}`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return {\n positionId: BigInt(Math.floor(Math.random() * 1000)),\n txHash: \"0xdemo_open_short_tx_hash\" as Hex,\n };\n }\n\n const marginBigInt = BigInt(margin);\n\n // Encode function call - isLong = false for short\n const data = encodeFunctionData({\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"openPosition\",\n args: [tokenAddress, false, marginBigInt, BigInt(leverage)],\n });\n\n // Send transaction with margin as value\n const txHash = await agent.client.sendTransaction({\n to: perpetualTradingAddress,\n data,\n value: marginBigInt,\n });\n\n // Wait for receipt to get position ID from events\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n // Parse PositionOpened event to get position ID\n let positionId = 0n;\n for (const log of receipt.logs) {\n try {\n // PositionOpened event topic\n if (log.topics[0] === \"0x2e5b0e8c5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5\") {\n positionId = BigInt(log.topics[1] || \"0\");\n break;\n }\n } catch {\n // Continue if parsing fails\n }\n }\n\n // If we couldn't parse the event, try to get next position ID - 1\n if (positionId === 0n) {\n try {\n const nextId = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"nextPositionId\",\n })) as bigint;\n positionId = nextId - 1n;\n } catch {\n // Position ID unknown\n }\n }\n\n return {\n positionId,\n txHash,\n };\n}\n","import { type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { PERPETUAL_TRADING, PERPETUAL_TRADING_ABI } from \"../../constants/pikeperps\";\n\n/**\n * Close an existing position on PikePerps\n * @param agent - MNTAgentKit instance\n * @param positionId - Position ID to close\n * @returns Transaction hash\n */\nexport async function pikeperpsClosePosition(\n agent: MNTAgentKit,\n positionId: bigint,\n): Promise<Hex> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return \"0xdemo_close_position_tx_hash\" as Hex;\n }\n\n // Encode function call\n const data = encodeFunctionData({\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"closePosition\",\n args: [positionId],\n });\n\n // Send transaction\n const txHash = await agent.client.sendTransaction({\n to: perpetualTradingAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { PERPETUAL_TRADING, PERPETUAL_TRADING_ABI } from \"../../constants/pikeperps\";\n\nexport interface PikePerpsPosition {\n positionId: bigint;\n token: Address;\n isLong: boolean;\n size: bigint;\n margin: bigint;\n leverage: number;\n entryPrice: bigint;\n entryTime: bigint;\n currentPrice: bigint;\n pnl: bigint;\n isProfit: boolean;\n liquidationPrice: bigint;\n isOpen: boolean;\n}\n\ninterface RawPosition {\n user: Address;\n token: Address;\n isLong: boolean;\n size: bigint;\n margin: bigint;\n leverage: bigint;\n entryPrice: bigint;\n entryTime: bigint;\n lastFundingTime: bigint;\n isOpen: boolean;\n}\n\n/**\n * Get all positions for a user on PikePerps\n * Returns detailed position data including PnL and liquidation prices\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with PnL and liquidation data\n */\nexport async function pikeperpsGetPositions(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<PikePerpsPosition[]> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return [\n {\n positionId: 1n,\n token: \"0x0000000000000000000000000000000000000001\" as Address,\n isLong: true,\n size: BigInt(\"1000000000000000000\"), // 1 ETH equivalent\n margin: BigInt(\"100000000000000000\"), // 0.1 ETH\n leverage: 10,\n entryPrice: BigInt(\"100000000\"), // $1.00 scaled by 1e8\n entryTime: BigInt(Math.floor(Date.now() / 1000) - 3600),\n currentPrice: BigInt(\"110000000\"), // $1.10\n pnl: BigInt(\"10000000000000000\"), // 0.01 ETH profit\n isProfit: true,\n liquidationPrice: BigInt(\"90000000\"), // $0.90\n isOpen: true,\n },\n ];\n }\n\n // Get all position IDs for user\n const positionIds = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getUserPositions\",\n args: [address],\n })) as bigint[];\n\n if (positionIds.length === 0) {\n return [];\n }\n\n const positions: PikePerpsPosition[] = [];\n\n // Fetch each position's details\n for (const positionId of positionIds) {\n try {\n // Get position details\n const rawPosition = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getPosition\",\n args: [positionId],\n })) as RawPosition;\n\n // Skip closed positions\n if (!rawPosition.isOpen) {\n continue;\n }\n\n // Get PnL\n const [pnl, isProfit] = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getPositionPnL\",\n args: [positionId],\n })) as [bigint, boolean];\n\n // Get liquidation price\n const liquidationPrice = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getLiquidationPrice\",\n args: [positionId],\n })) as bigint;\n\n // Get current price\n let currentPrice = 0n;\n try {\n const [price, hasPrice] = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getCurrentPrice\",\n args: [rawPosition.token],\n })) as [bigint, boolean];\n if (hasPrice) {\n currentPrice = price;\n }\n } catch {\n // Use entry price if current price unavailable\n currentPrice = rawPosition.entryPrice;\n }\n\n positions.push({\n positionId,\n token: rawPosition.token,\n isLong: rawPosition.isLong,\n size: rawPosition.size,\n margin: rawPosition.margin,\n leverage: Number(rawPosition.leverage),\n entryPrice: rawPosition.entryPrice,\n entryTime: rawPosition.entryTime,\n currentPrice,\n pnl,\n isProfit,\n liquidationPrice,\n isOpen: rawPosition.isOpen,\n });\n } catch (error) {\n console.warn(`Failed to fetch position ${positionId}:`, error);\n }\n }\n\n return positions;\n}\n","import { type Address, type Hex, parseAbiItem } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PERPETUAL_TRADING,\n PERPETUAL_TRADING_ABI,\n BONDING_CURVE_MARKET,\n BONDING_CURVE_MARKET_ABI,\n} from \"../../constants/pikeperps\";\n\nexport interface PikePerpsTrade {\n positionId: bigint;\n trader: Address;\n token: Address;\n isLong: boolean;\n size: bigint;\n margin: bigint;\n leverage: bigint;\n entryPrice: bigint;\n timestamp: number;\n txHash: Hex;\n blockNumber: bigint;\n}\n\nexport interface PikePerpsMarketData {\n token: Address;\n currentPrice: bigint;\n hasPrice: boolean;\n isListed: boolean;\n curveProgress: bigint; // Percentage of tokens sold (0-10000)\n recentTrades: PikePerpsTrade[];\n}\n\n/**\n * Get market data for a token on PikePerps\n * Returns current price and recent trades\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to get market data for\n * @param limit - Maximum number of recent trades to return (default 20)\n * @returns Market data with price and recent trades\n */\nexport async function pikeperpsGetMarketData(\n agent: MNTAgentKit,\n tokenAddress: Address,\n limit: number = 20,\n): Promise<PikePerpsMarketData> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n const bondingCurveAddress = BONDING_CURVE_MARKET[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return {\n token: tokenAddress,\n currentPrice: BigInt(\"100000000\"), // $1.00 scaled by 1e8\n hasPrice: true,\n isListed: true,\n curveProgress: BigInt(\"5000\"), // 50%\n recentTrades: [\n {\n positionId: 1n,\n trader: \"0x0000000000000000000000000000000000000001\" as Address,\n token: tokenAddress,\n isLong: true,\n size: BigInt(\"1000000000000000000\"),\n margin: BigInt(\"100000000000000000\"),\n leverage: 10n,\n entryPrice: BigInt(\"100000000\"),\n timestamp: Math.floor(Date.now() / 1000) - 300,\n txHash: \"0xdemo_trade_hash\" as Hex,\n blockNumber: 1000n,\n },\n ],\n };\n }\n\n // Get current price from perpetual trading contract\n let currentPrice = 0n;\n let hasPrice = false;\n try {\n const [price, hasPriceResult] = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getCurrentPrice\",\n args: [tokenAddress],\n })) as [bigint, boolean];\n currentPrice = price;\n hasPrice = hasPriceResult;\n } catch {\n // Price unavailable\n }\n\n // Check if token is listed on bonding curve\n let isListed = false;\n let curveProgress = 0n;\n if (bondingCurveAddress !== \"0x0000000000000000000000000000000000000000\") {\n try {\n isListed = (await agent.client.readContract({\n address: bondingCurveAddress,\n abi: BONDING_CURVE_MARKET_ABI,\n functionName: \"isListed\",\n args: [tokenAddress],\n })) as boolean;\n\n if (isListed) {\n curveProgress = (await agent.client.readContract({\n address: bondingCurveAddress,\n abi: BONDING_CURVE_MARKET_ABI,\n functionName: \"getCurveProgress\",\n args: [tokenAddress],\n })) as bigint;\n }\n } catch {\n // Bonding curve data unavailable\n }\n }\n\n // Get recent trades from PositionOpened events\n const recentTrades: PikePerpsTrade[] = [];\n try {\n // Get recent blocks (last ~1000 blocks)\n const currentBlock = await agent.client.getBlockNumber();\n const fromBlock = currentBlock > 1000n ? currentBlock - 1000n : 0n;\n\n const logs = await agent.client.getLogs({\n address: perpetualTradingAddress,\n event: parseAbiItem(\n \"event PositionOpened(uint256 indexed positionId, address indexed user, address indexed token, bool isLong, uint256 size, uint256 margin, uint256 leverage, uint256 entryPrice)\",\n ),\n args: {\n token: tokenAddress,\n },\n fromBlock,\n toBlock: currentBlock,\n });\n\n // Get block timestamps for each trade\n const blockCache = new Map<bigint, number>();\n\n for (const log of logs.slice(-limit)) {\n let timestamp = 0;\n if (!blockCache.has(log.blockNumber)) {\n try {\n const block = await agent.client.getBlock({\n blockNumber: log.blockNumber,\n });\n timestamp = Number(block.timestamp);\n blockCache.set(log.blockNumber, timestamp);\n } catch {\n timestamp = Math.floor(Date.now() / 1000);\n }\n } else {\n timestamp = blockCache.get(log.blockNumber) || 0;\n }\n\n recentTrades.push({\n positionId: BigInt(log.topics[1] || \"0\"),\n trader: log.topics[2] as Address,\n token: tokenAddress,\n isLong: log.args.isLong || false,\n size: log.args.size || 0n,\n margin: log.args.margin || 0n,\n leverage: log.args.leverage || 0n,\n entryPrice: log.args.entryPrice || 0n,\n timestamp,\n txHash: log.transactionHash,\n blockNumber: log.blockNumber,\n });\n }\n } catch (error) {\n console.warn(\"Failed to fetch recent trades:\", error);\n }\n\n return {\n token: tokenAddress,\n currentPrice,\n hasPrice,\n isListed,\n curveProgress,\n recentTrades,\n };\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { getSwapTransaction } from \"../../utils/okx\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\nexport const getSwapQuote = async (\n agent: MNTAgentKit,\n from: string,\n to: string,\n amount: string,\n slippagePercentage: string,\n) => {\n if (agent.demo) {\n return createMockQuoteResponse(\"OKX\", amount);\n }\n\n const chainIndex = agent.chain === \"mainnet\" ? \"5000\" : \"5003\";\n\n return getSwapTransaction(from, to, amount, chainIndex, slippagePercentage);\n};\n","/**\n * Platform Configuration & Validation\n *\n * Validates APP_ID with Mantle platform API\n */\n\nconst DEFAULT_PLATFORM_URL = \"https://mantle-devkit.vercel.app\";\n\n/** Project configuration from platform */\nexport interface ProjectConfig {\n appId: string;\n name: string;\n payTo: string;\n network: string;\n status: string;\n}\n\n/** Cached configuration (singleton) */\nlet cachedConfig: ProjectConfig | null = null;\nlet validationPromise: Promise<ProjectConfig> | null = null;\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n if (typeof process !== \"undefined\" && process.env) {\n return (\n process.env.PLATFORM_URL ||\n process.env.NEXT_PUBLIC_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n );\n }\n return DEFAULT_PLATFORM_URL;\n}\n\n/**\n * Validate APP_ID with platform API\n */\nasync function validateAppId(appId: string): Promise<ProjectConfig> {\n const baseUrl = getPlatformBaseUrl();\n const url = `${baseUrl}/api/v1/validate?appId=${encodeURIComponent(appId)}`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\n \"Platform: Project not found. Invalid APP_ID. Please check your APP_ID configuration.\",\n );\n }\n if (response.status === 401) {\n throw new Error(\n \"Platform: Unauthorized. Invalid APP_ID. Please verify your APP_ID.\",\n );\n }\n throw new Error(\n `Platform: Validation failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = (await response.json()) as ProjectConfig;\n\n if (!data.appId || !data.payTo || !data.network) {\n throw new Error(\"Platform: Invalid response - missing required fields\");\n }\n\n if (data.status !== \"ACTIVE\") {\n throw new Error(\n `Platform: Project is not active. Current status: ${data.status}`,\n );\n }\n\n return {\n appId: data.appId,\n name: data.name,\n payTo: data.payTo,\n network: data.network,\n status: data.status,\n };\n}\n\n/**\n * Initialize platform validation\n *\n * Reads APP_ID from environment and validates with platform API.\n * Uses singleton pattern - multiple calls return same promise.\n *\n * @returns Project configuration from platform\n * @throws Error if APP_ID is not set or validation fails\n */\nexport async function initializePlatform(): Promise<ProjectConfig> {\n if (cachedConfig) {\n return cachedConfig;\n }\n\n if (validationPromise) {\n return validationPromise;\n }\n\n let appId: string | undefined;\n if (typeof process !== \"undefined\" && process.env) {\n appId = process.env.APP_ID || process.env.NEXT_PUBLIC_APP_ID;\n }\n\n if (!appId || typeof appId !== \"string\" || appId.trim().length === 0) {\n throw new Error(\n \"APP_ID is required. Set it in your .env file:\\nAPP_ID=your_app_id_here\",\n );\n }\n\n validationPromise = validateAppId(appId.trim());\n\n try {\n cachedConfig = await validationPromise;\n return cachedConfig;\n } catch (error) {\n validationPromise = null;\n throw error;\n }\n}\n\n/**\n * Get cached project configuration\n *\n * @throws Error if platform not initialized\n */\nexport function getProjectConfig(): ProjectConfig {\n if (!cachedConfig) {\n throw new Error(\n \"Platform not initialized. Call initializePlatform() first.\",\n );\n }\n return cachedConfig;\n}\n\n/**\n * Clear cached configuration (for testing)\n */\nexport function clearCache(): void {\n cachedConfig = null;\n validationPromise = null;\n}\n","import { type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI } from \"../../constants/lendle\";\n\nexport interface UserAccountData {\n totalCollateralETH: bigint;\n totalDebtETH: bigint;\n availableBorrowsETH: bigint;\n currentLiquidationThreshold: bigint;\n ltv: bigint;\n healthFactor: bigint;\n}\n\n/**\n * Get user account data from Lendle LendingPool\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns User account data including collateral, debt, and health factor\n */\nexport async function getUserAccountData(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<UserAccountData> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const result = (await agent.client.readContract({\n address: lendingPoolAddress,\n abi: LENDING_POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [address],\n })) as readonly [bigint, bigint, bigint, bigint, bigint, bigint];\n\n return {\n totalCollateralETH: result[0],\n totalDebtETH: result[1],\n availableBorrowsETH: result[2],\n currentLiquidationThreshold: result[3],\n ltv: result[4],\n healthFactor: result[5],\n };\n}\n","import {\n createWalletClient,\n http,\n publicActions,\n type Chain,\n type PublicActions,\n type Transport,\n type WalletClient,\n} from \"viem\";\nimport {\n privateKeyToAccount,\n type Address,\n type PrivateKeyAccount,\n} from \"viem/accounts\";\nimport { mantle, mantleSepoliaTestnet } from \"viem/chains\";\nimport { executeSwap, sendTransaction } from \"./tools\";\nimport { getSwapQuote } from \"./tools/okx/getSwapQuote\";\nimport { swapOnOpenOcean, getOpenOceanQuote } from \"./tools/openocean\";\nimport { swapOn1inch, get1inchQuote } from \"./tools/oneinch\";\nimport { swapOnUniswap, getUniswapQuote } from \"./tools/uniswap\";\nimport { crossChainSwapViaSquid, getSquidRoute } from \"./tools/squid\";\nimport {\n lendleSupply,\n lendleWithdraw,\n lendleBorrow,\n lendleRepay,\n lendleGetPositions,\n} from \"./tools/lendle\";\nimport { agniSwap } from \"./tools/agni\";\nimport { merchantMoeSwap } from \"./tools/merchantmoe\";\nimport { METH_TOKEN } from \"./tools/meth\";\nimport { methGetPosition, swapToMeth, swapFromMeth } from \"./tools/meth-staking\";\nimport {\n pikeperpsOpenLong,\n pikeperpsOpenShort,\n pikeperpsClosePosition,\n pikeperpsGetPositions,\n pikeperpsGetMarketData,\n} from \"./tools/pikeperps\";\nimport { initializePlatform, type ProjectConfig } from \"./utils/x402\";\nimport { getUserAccountData } from \"./utils/lendle\";\nimport { erc7811Actions, type Erc7811Actions } from \"viem/experimental\";\n\nexport class MNTAgentKit {\n public account: PrivateKeyAccount;\n public client: WalletClient<Transport, Chain, PrivateKeyAccount> &\n PublicActions &\n Erc7811Actions;\n public chain: \"testnet\" | \"mainnet\";\n public demo: boolean;\n public projectConfig?: ProjectConfig;\n\n constructor(privateKey: Address, chain: \"mainnet\" | \"testnet\" | \"testnet-demo\") {\n this.account = privateKeyToAccount(privateKey);\n this.demo = chain === \"testnet-demo\";\n this.chain = chain === \"testnet-demo\" ? \"testnet\" : chain;\n this.client = createWalletClient({\n chain: this.chain == \"mainnet\" ? mantle : mantleSepoliaTestnet,\n transport: http(),\n account: this.account,\n })\n .extend(publicActions)\n .extend(erc7811Actions());\n }\n\n /**\n * Initialize the agent with platform validation\n *\n * Validates APP_ID with the platform API.\n * Must be called after creating the agent instance.\n *\n * @returns The initialized agent instance\n * @throws Error if APP_ID is not set or validation fails\n *\n * @example\n * ```typescript\n * const agent = new MNTAgentKit(privateKey, \"mainnet\");\n * await agent.initialize(); // Validates APP_ID\n * ```\n */\n async initialize(): Promise<MNTAgentKit> {\n this.projectConfig = await initializePlatform();\n return this;\n }\n\n async sendTransaction(to: Address, amount: string) {\n return await sendTransaction(this, to, amount);\n }\n\n // OKX DEX Aggregator\n async getSwapQuote(\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n slippagePercentage: string = \"0.5\",\n ) {\n return await getSwapQuote(\n this,\n fromTokenAddress,\n toTokenAddress,\n amount,\n slippagePercentage,\n );\n }\n\n async executeSwap(\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n slippagePercentage: string = \"0.5\",\n ) {\n return await executeSwap(\n this,\n fromTokenAddress,\n toTokenAddress,\n amount,\n slippagePercentage,\n );\n }\n\n // OpenOcean DEX Aggregator\n async getOpenOceanQuote(\n fromToken: Address,\n toToken: Address,\n amount: string,\n ) {\n return await getOpenOceanQuote(this, fromToken, toToken, amount);\n }\n\n async swapOnOpenOcean(\n fromToken: Address,\n toToken: Address,\n amount: string,\n slippage: number = 0.5,\n ) {\n return await swapOnOpenOcean(\n this,\n fromToken,\n toToken,\n amount,\n slippage.toString(),\n );\n }\n\n // 1inch DEX Aggregator\n async get1inchQuote(fromToken: Address, toToken: Address, amount: string) {\n return await get1inchQuote(this, fromToken, toToken, amount);\n }\n\n async swapOn1inch(\n fromToken: Address,\n toToken: Address,\n amount: string,\n slippage: number = 0.5,\n ) {\n return await swapOn1inch(\n this,\n fromToken,\n toToken,\n amount,\n slippage.toString(),\n );\n }\n\n // Uniswap V3 DEX\n async getUniswapQuote(fromToken: Address, toToken: Address, amount: string) {\n return await getUniswapQuote(this, fromToken, toToken, amount);\n }\n\n async swapOnUniswap(\n fromToken: Address,\n toToken: Address,\n amount: string,\n slippage: number = 0.5,\n ) {\n return await swapOnUniswap(\n this,\n fromToken,\n toToken,\n amount,\n slippage.toString(),\n );\n }\n\n // Lendle Lending Protocol\n async lendleSupply(tokenAddress: Address, amount: string) {\n return await lendleSupply(this, tokenAddress, amount);\n }\n\n async lendleWithdraw(tokenAddress: Address, amount: string, to?: Address) {\n return await lendleWithdraw(this, tokenAddress, amount, to);\n }\n\n async lendleBorrow(\n tokenAddress: Address,\n amount: string,\n interestRateMode: 1 | 2 = 2,\n onBehalfOf?: Address,\n ) {\n return await lendleBorrow(\n this,\n tokenAddress,\n amount,\n interestRateMode,\n onBehalfOf,\n );\n }\n\n async lendleRepay(\n tokenAddress: Address,\n amount: string,\n rateMode: 1 | 2 = 2,\n onBehalfOf?: Address,\n ) {\n return await lendleRepay(this, tokenAddress, amount, rateMode, onBehalfOf);\n }\n\n /**\n * Get user account data from Lendle LendingPool\n * Returns overall position including total collateral, debt, and health factor\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns User account data with collateral, debt, available borrows, and health factor\n */\n async lendleGetUserAccountData(userAddress?: Address) {\n return await getUserAccountData(this, userAddress);\n }\n\n /**\n * Get all Lendle positions for a user (per-token breakdown)\n * Returns detailed supply and borrow amounts for each asset\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with supply/borrow amounts per asset\n */\n async lendleGetPositions(userAddress?: Address) {\n return await lendleGetPositions(this, userAddress);\n }\n\n // Agni Finance DEX (#1 on Mantle)\n async agniSwap(\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n feeTier?: number,\n ) {\n return await agniSwap(\n this,\n tokenIn,\n tokenOut,\n amountIn,\n slippagePercent,\n feeTier,\n );\n }\n\n // Merchant Moe DEX (#2 on Mantle)\n async merchantMoeSwap(\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n ) {\n return await merchantMoeSwap(\n this,\n tokenIn,\n tokenOut,\n amountIn,\n slippagePercent,\n );\n }\n\n // mETH Protocol - Liquid Staking Token\n getMethTokenAddress() {\n if (this.demo) {\n return METH_TOKEN.mainnet;\n }\n return METH_TOKEN[this.chain];\n }\n\n /**\n * Get mETH staking position for a user\n * Returns mETH balance and WETH balance for comparison\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns mETH position with balances\n */\n async methGetPosition(userAddress?: Address) {\n return await methGetPosition(this, userAddress);\n }\n\n /**\n * Swap WETH to mETH using DEX aggregator\n * @param amount - Amount of WETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\n async swapToMeth(amount: string, slippage: number = 0.5) {\n return await swapToMeth(this, amount, slippage);\n }\n\n /**\n * Swap mETH to WETH using DEX aggregator\n * @param amount - Amount of mETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\n async swapFromMeth(amount: string, slippage: number = 0.5) {\n return await swapFromMeth(this, amount, slippage);\n }\n\n // Squid Router Cross-chain\n async getSquidRoute(\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n ) {\n return await getSquidRoute(\n this,\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n slippage,\n );\n }\n\n async crossChainSwapViaSquid(\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n ) {\n return await crossChainSwapViaSquid(\n this,\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n slippage,\n );\n }\n\n // PikePerps - Perpetual Trading\n /**\n * Open a long position on PikePerps\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100, default 10)\n * @returns Position ID and transaction hash\n */\n async pikeperpsOpenLong(\n tokenAddress: Address,\n margin: string,\n leverage: number = 10,\n ) {\n return await pikeperpsOpenLong(this, tokenAddress, margin, leverage);\n }\n\n /**\n * Open a short position on PikePerps\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100, default 10)\n * @returns Position ID and transaction hash\n */\n async pikeperpsOpenShort(\n tokenAddress: Address,\n margin: string,\n leverage: number = 10,\n ) {\n return await pikeperpsOpenShort(this, tokenAddress, margin, leverage);\n }\n\n /**\n * Close an existing position on PikePerps\n * @param positionId - Position ID to close\n * @returns Transaction hash\n */\n async pikeperpsClosePosition(positionId: bigint) {\n return await pikeperpsClosePosition(this, positionId);\n }\n\n /**\n * Get all positions for a user on PikePerps\n * Returns detailed position data including PnL and liquidation prices\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with PnL and liquidation data\n */\n async pikeperpsGetPositions(userAddress?: Address) {\n return await pikeperpsGetPositions(this, userAddress);\n }\n\n /**\n * Get market data for a token on PikePerps\n * Returns current price and recent trades\n * @param tokenAddress - Token address to get market data for\n * @param limit - Maximum number of recent trades to return (default 20)\n * @returns Market data with price and recent trades\n */\n async pikeperpsGetMarketData(tokenAddress: Address, limit: number = 20) {\n return await pikeperpsGetMarketData(this, tokenAddress, limit);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/tools/mantle/sendTransaction.ts","../src/utils/okx/checkAllowance.ts","../src/constants/okx/index.ts","../src/helpers/okx/index.ts","../src/utils/okx/getApproveTx.ts","../src/utils/okx/getGasLimit.ts","../src/utils/okx/approveToken.ts","../src/utils/okx/getSwapLimit.ts","../src/utils/demo/mockResponses.ts","../src/tools/okx/swap.ts","../src/constants/openocean/index.ts","../src/helpers/openocean/index.ts","../src/utils/openocean/getQuoteData.ts","../src/utils/openocean/getSwapData.ts","../src/tools/openocean/getQuote.ts","../src/utils/common/checkAllowance.ts","../src/utils/common/approveToken.ts","../src/tools/openocean/swap.ts","../src/constants/oneinch/index.ts","../src/helpers/oneinch/index.ts","../src/utils/oneinch/getSwapData.ts","../src/tools/oneinch/getQuote.ts","../src/tools/oneinch/swap.ts","../src/constants/uniswap/index.ts","../src/utils/uniswap/getSwapCalldata.ts","../src/tools/uniswap/getQuote.ts","../src/tools/uniswap/swap.ts","../src/constants/squid/index.ts","../src/helpers/squid/index.ts","../src/utils/squid/getRouteData.ts","../src/tools/squid/crossChainSwap.ts","../src/constants/lendle/index.ts","../src/tools/lendle/supply.ts","../src/tools/lendle/withdraw.ts","../src/tools/lendle/borrow.ts","../src/tools/lendle/repay.ts","../src/tools/lendle/getPositions.ts","../src/constants/agni/index.ts","../src/tools/agni/swap.ts","../src/constants/merchantmoe/index.ts","../src/tools/merchantmoe/swap.ts","../src/constants/meth/index.ts","../src/tools/meth-staking/getPosition.ts","../src/tools/meth-staking/swapToMeth.ts","../src/tools/meth-staking/swapFromMeth.ts","../src/constants/pikeperps/index.ts","../src/tools/pikeperps/openLong.ts","../src/tools/pikeperps/openShort.ts","../src/tools/pikeperps/closePosition.ts","../src/tools/pikeperps/getPositions.ts","../src/tools/pikeperps/getMarketData.ts","../src/constants/pyth/index.ts","../src/tools/pyth/getPrice.ts","../src/tools/pyth/getMultiplePrices.ts","../src/constants/token-launchpad/index.ts","../src/tools/token-launchpad/deployToken.ts","../src/tools/token-launchpad/tokenInfo.ts","../src/tools/token-launchpad/transfer.ts","../src/constants/nft-launchpad/index.ts","../src/tools/nft-launchpad/deployCollection.ts","../src/tools/nft-launchpad/mint.ts","../src/tools/nft-launchpad/nftInfo.ts","../src/tools/nft-launchpad/transfer.ts","../src/tools/okx/getSwapQuote.ts","../src/utils/x402/index.ts","../src/utils/lendle/getUserAccountData.ts","../src/agent.ts"],"names":["erc20Abi","axios","getHeaders","checkAllowance","approveToken","encodeFunctionData","NATIVE_TOKEN_ADDRESS","configs","getQuoteData","getSwapData","WMNT_ADDRESS","FEE_TIERS","createMockPythResponse","formatPythPrice","parseUnits","encodeAbiParameters","parseAbiParameters","baseUrl"],"mappings":"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","file":"index.js","sourcesContent":["import { parseEther, parseUnits, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { getTransactionReceipt } from \"viem/actions\";\n\nconst erc20Abi = [\n {\n name: \"transfer\",\n type: \"function\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ type: \"bool\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n inputs: [],\n outputs: [{ type: \"uint8\" }],\n },\n] as const;\n\nexport const sendTransaction = async (\n agent: MNTAgentKit,\n to: Address,\n amount: string,\n tokenAddress?: Address,\n) => {\n let hash: `0x${string}`;\n\n if (tokenAddress) {\n const decimals = (await agent.client.readContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"decimals\",\n })) as number;\n\n hash = await agent.client.writeContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, parseUnits(amount, decimals)],\n });\n } else {\n hash = await agent.client.sendTransaction({\n to,\n value: parseEther(amount),\n });\n }\n\n const receipt = await getTransactionReceipt(agent.client, {\n hash,\n });\n\n return receipt;\n};\n","import { erc20Abi, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\n\n/**\n * Check token allowance for DEX\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token contract address\n * @param ownerAddress - Your wallet address\n * @param spenderAddress - DEX spender address\n * @returns Allowance amount\n */\nexport async function checkAllowance(\n agent: MNTAgentKit,\n tokenAddress: string,\n ownerAddress: string,\n spenderAddress: string,\n): Promise<bigint> {\n try {\n const allowance = await agent.client.readContract({\n address: tokenAddress as Address,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [ownerAddress as Address, spenderAddress as Address],\n });\n return allowance;\n } catch (error) {\n console.error(\"Failed to query allowance:\", error);\n throw error;\n }\n}\n","export const configs = {\n apiKey: process.env.OKX_API_KEY,\n secretKey: process.env.OKX_SECRET_KEY,\n apiPassphrase: process.env.OKX_API_PASSPHRASE,\n projectId: process.env.OKX_PROJECT_ID,\n};\n\nexport const baseUrl: string = \"https://web3.okx.com/api/v6/\";\n\nexport const ETH_ADDRESS = \"0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000\";\n","import CryptoJS from \"crypto-js\";\nimport { configs } from \"../../constants/okx\";\n\nexport function getHeaders(\n timestamp: string,\n method: string,\n requestPath: string,\n queryString = \"\",\n body = \"\",\n) {\n const { apiKey, secretKey, apiPassphrase, projectId } = configs;\n\n if (!apiKey || !secretKey || !apiPassphrase || !projectId) {\n throw new Error(\n \"Missing required environment variables for API authentication\",\n );\n }\n\n const stringToSign = timestamp + method + requestPath + (queryString || body);\n\n return {\n \"Content-Type\": \"application/json\",\n \"OK-ACCESS-KEY\": apiKey,\n \"OK-ACCESS-SIGN\": CryptoJS.enc.Base64.stringify(\n CryptoJS.HmacSHA256(stringToSign, secretKey),\n ),\n \"OK-ACCESS-TIMESTAMP\": timestamp,\n \"OK-ACCESS-PASSPHRASE\": apiPassphrase,\n \"OK-ACCESS-PROJECT\": projectId,\n };\n}\n","import axios from \"axios\";\nimport { baseUrl } from \"../../constants/okx\";\nimport { getHeaders } from \"../../helpers/okx\";\n\nexport async function getApproveTx(\n tokenAddress: string,\n amount: string,\n chainIndex: string,\n): Promise<any> {\n try {\n const path = \"dex/aggregator/approve-transaction\";\n const url = `${baseUrl}${path}`;\n const params = {\n chainIndex: chainIndex,\n tokenContractAddress: tokenAddress,\n approveAmount: amount,\n };\n\n // Prepare authentication\n const timestamp = new Date().toISOString();\n const requestPath = `/api/v6/${path}`;\n const queryString = \"?\" + new URLSearchParams(params).toString();\n const headers = getHeaders(timestamp, \"GET\", requestPath, queryString);\n\n const response = await axios.get(url, { params, headers });\n\n if (response.data.code === \"0\") {\n return response.data.data[0];\n } else {\n throw new Error(`API Error: ${response.data.msg || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\n \"Failed to get approval transaction data:\",\n (error as Error).message,\n );\n throw error;\n }\n}\n","import axios from \"axios\";\nimport { getHeaders } from \"../../helpers/okx\";\n\n/**\n * Get transaction gas limit from Onchain gateway API\n * @param fromAddress - Sender address\n * @param toAddress - Target contract address\n * @param txAmount - Transaction amount (0 for approvals)\n * @param inputData - Transaction calldata\n * @returns Estimated gas limit\n */\nexport async function getGasLimit(\n fromAddress: string,\n toAddress: string,\n chainIndex: string,\n txAmount: string = \"0\",\n inputData: string = \"\",\n): Promise<string> {\n try {\n const path = \"dex/pre-transaction/gas-limit\";\n const url = `https://web3.okx.com/api/v6/${path}`;\n\n const body = {\n chainIndex: chainIndex,\n fromAddress: fromAddress,\n toAddress: toAddress,\n txAmount: txAmount,\n extJson: {\n inputData: inputData,\n },\n };\n\n // Prepare authentication with body included in signature\n const bodyString = JSON.stringify(body);\n const timestamp = new Date().toISOString();\n const requestPath = `/api/v6/${path}`;\n const headers = getHeaders(timestamp, \"POST\", requestPath, \"\", bodyString);\n\n const response = await axios.post(url, body, { headers });\n\n if (response.data.code === \"0\") {\n return response.data.data[0].gasLimit;\n } else {\n throw new Error(`API Error: ${response.data.msg || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\"Failed to get gas limit:\", (error as Error).message);\n throw error;\n }\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { checkAllowance } from \"./checkAllowance\";\nimport { getApproveTx } from \"./getApproveTx\";\nimport { getGasLimit } from \"./getGasLimit\";\n\n/**\n * Check allowance and get approve tx data if needed\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token to approve\n * @param amount - Amount to approve\n * @returns Allowance status and tx data\n */\nexport async function approveToken(\n agent: MNTAgentKit,\n tokenAddress: string,\n amount: string,\n): Promise<{ allowanceExists: boolean; data: any }> {\n const chainIndex = agent.chain === \"mainnet\" ? \"5000\" : \"5003\";\n const walletAddress = agent.account.address;\n const spenderAddress = \"0x1f16A607a7f3F3044E477abFFc8BD33952cE306b\";\n\n const currentAllowance = await checkAllowance(\n agent,\n tokenAddress,\n walletAddress,\n spenderAddress,\n );\n\n if (currentAllowance >= BigInt(amount)) {\n console.log(\"Sufficient allowance already exists\");\n return { allowanceExists: true, data: null };\n }\n\n console.log(\"Insufficient allowance, approving tokens...\");\n\n // Get approve transaction data from OKX DEX API\n const approveData = await getApproveTx(tokenAddress, amount, chainIndex);\n\n // Get accurate gas limit using Onchain gateway API\n const gasLimit = await getGasLimit(\n walletAddress,\n tokenAddress,\n chainIndex,\n \"0\",\n approveData.data,\n );\n\n const txObject = {\n to: tokenAddress,\n data: approveData.data,\n gas: gasLimit,\n };\n\n return { allowanceExists: false, data: txObject };\n}\n","import axios from \"axios\";\nimport { baseUrl } from \"../../constants/okx\";\nimport { getHeaders } from \"../../helpers/okx\";\n\n/**\n * Get swap transaction data from DEX API\n * @param fromTokenAddress - Source token address\n * @param toTokenAddress - Destination token address\n * @param amount - Amount to swap\n * @param userWalletAddress - User wallet address\n * @param chainIndex - Chain index\n * @param slippagePercent - Maximum slippagePercent (e.g., \"0.5\" for 0.5%)\n * @returns Swap transaction data\n */\nexport async function getSwapTransaction(\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n userWalletAddress: string,\n chainIndex: string,\n slippagePercent: string = \"0.5\",\n): Promise<any> {\n try {\n const path = \"dex/aggregator/swap\";\n const url = `${baseUrl}${path}`;\n\n const params = {\n chainIndex,\n fromTokenAddress,\n toTokenAddress,\n amount,\n userWalletAddress,\n slippage: slippagePercent,\n };\n\n // Prepare authentication\n const timestamp = new Date().toISOString();\n const requestPath = `/api/v6/${path}`;\n const queryString = \"?\" + new URLSearchParams(params).toString();\n const headers = getHeaders(timestamp, \"GET\", requestPath, queryString);\n\n const response = await axios.get(url, { params, headers });\n\n if (response.data.code === \"0\") {\n return response.data.data[0];\n } else {\n throw new Error(`API Error: ${response.data.msg || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\n \"Failed to get swap transaction data:\",\n (error as Error).message,\n );\n throw error;\n }\n}\n","import { type Hex } from \"viem\";\n\nexport const DEMO_TX_HASH =\n \"0xdemo000000000000000000000000000000000000000000000000000000000001\" as Hex;\n\nexport function createMockSwapResponse(protocol: string, inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH,\n amountOut: inputAmount,\n demo: true,\n message: `[DEMO] ${protocol} swap simulated`,\n };\n}\n\nexport function createMockQuoteResponse(protocol: string, inputAmount: string) {\n return {\n estimatedAmount: inputAmount,\n demo: true,\n message: `[DEMO] ${protocol} quote simulated`,\n };\n}\n\nexport function createMockLendleResponse(action: string, amount: string) {\n return {\n txHash: DEMO_TX_HASH,\n amount: amount,\n demo: true,\n message: `[DEMO] Lendle ${action} simulated`,\n };\n}\n\nexport function createMockTxHash(): Hex {\n return DEMO_TX_HASH;\n}\n\nexport function createMock1inchSwapResponse(inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH as string,\n dstAmount: inputAmount,\n demo: true,\n message: \"[DEMO] 1inch swap simulated\",\n };\n}\n\nexport function createMockOkxSwapResponse(inputAmount: string) {\n return {\n data: DEMO_TX_HASH,\n demo: true,\n message: \"[DEMO] OKX swap simulated\",\n };\n}\n\nexport function createMockOpenOceanSwapResponse(inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH as string,\n outAmount: inputAmount,\n demo: true,\n message: \"[DEMO] OpenOcean swap simulated\",\n };\n}\n\nexport function createMockUniswapSwapResponse(inputAmount: string) {\n return {\n txHash: DEMO_TX_HASH as string,\n amountOut: inputAmount,\n demo: true,\n message: \"[DEMO] Uniswap swap simulated\",\n };\n}\n\nexport function createMockSquidRoute(amount: string) {\n return {\n route: {\n estimate: { toAmount: amount },\n transactionRequest: {\n targetAddress: \"0x0000000000000000000000000000000000000000\",\n data: \"0x\",\n value: \"0\",\n gasLimit: \"0\",\n },\n },\n demo: true,\n message: \"[DEMO] Squid route simulated\",\n };\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { ETH_ADDRESS } from \"../../constants/okx\";\nimport { approveToken, getGasLimit, getSwapTransaction } from \"../../utils/okx\";\nimport { createMockOkxSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap\n * @param fromTokenAddress - Source token address\n * @param toTokenAddress - Destination token address\n * @param amount - Amount to swap\n * @param slippagePercent - Maximum slippagePercent\n * @returns Transaction hash\n */\nexport async function executeSwap(\n agent: MNTAgentKit,\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n slippagePercent: string,\n): Promise<{ data: any }> {\n if (agent.demo) {\n return createMockOkxSwapResponse(amount);\n }\n\n const chainIndex = agent.chain === \"mainnet\" ? \"5000\" : \"5003\";\n const walletAddress = agent.account.address;\n\n // 1. Check allowance and approve if necessary (skip for native token)\n if (fromTokenAddress !== ETH_ADDRESS) {\n const approval = await approveToken(agent, fromTokenAddress, amount);\n\n // If approval needed, sign and send approval tx\n if (!approval.allowanceExists && approval.data) {\n const approveTxHash = await agent.client.sendTransaction({\n to: approval.data.to as Address,\n data: approval.data.data as Hex,\n value: BigInt(0),\n gas: BigInt(approval.data.gas),\n });\n console.log(`Approval tx sent: ${approveTxHash}`);\n\n // Wait for approval tx to be confirmed\n const approveReceipt = await agent.client.waitForTransactionReceipt({\n hash: approveTxHash,\n });\n console.log(`Approval confirmed: ${approveReceipt.status}`);\n }\n }\n\n // 2. Get swap transaction data\n const swapData = await getSwapTransaction(\n fromTokenAddress,\n toTokenAddress,\n amount,\n walletAddress,\n chainIndex,\n slippagePercent,\n );\n\n const txData = swapData.tx;\n console.log(\"Swap TX data received\");\n\n // 3. Get accurate gas limit\n const gasLimit = await getGasLimit(\n walletAddress,\n txData.to,\n chainIndex,\n txData.value || \"0\",\n txData.data,\n );\n console.log(\"Gas limit received\");\n\n // 4. Sign and send transaction using viem\n const txHash = await agent.client.sendTransaction({\n to: txData.to as Address,\n data: txData.data as Hex,\n value: BigInt(txData.value || \"0\"),\n gas: BigInt(gasLimit),\n });\n console.log(`Swap tx sent: ${txHash}`);\n\n // Wait for swap tx to be confirmed\n const swapReceipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n console.log(`Swap confirmed: ${swapReceipt.status}`);\n\n return {\n data: txHash,\n };\n}\n","// OpenOcean API configuration\nexport const OPENOCEAN_BASE_URL = \"https://open-api.openocean.finance/v4\";\n\n// Chain identifiers for OpenOcean\nexport const OPENOCEAN_CHAIN = {\n mainnet: \"mantle\",\n testnet: \"mantle\", // OpenOcean may not support testnet\n} as const;\n\n// Native token address (ETH on Mantle)\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// OpenOcean exchange proxy address on Mantle\nexport const OPENOCEAN_EXCHANGE_PROXY = \"0x6352a56caadC4F1E25CD6c75970Fa768A3304e64\";\n","/**\n * Get headers for OpenOcean API requests\n * OpenOcean currently uses public endpoints without authentication\n * This helper is prepared for future API key support if needed\n * @param apiKey - Optional API key for future use\n * @returns Headers object\n */\nexport function getHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Future: Add API key support if OpenOcean introduces authentication\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n return headers;\n}\n\n","import axios from \"axios\";\nimport { OPENOCEAN_BASE_URL, OPENOCEAN_CHAIN } from \"../../constants/openocean\";\nimport { getHeaders } from \"../../helpers/openocean\";\n\nexport interface OpenOceanQuote {\n inToken: {\n address: string;\n decimals: number;\n symbol: string;\n name: string;\n };\n outToken: {\n address: string;\n decimals: number;\n symbol: string;\n name: string;\n };\n inAmount: string;\n outAmount: string;\n estimatedGas: string;\n}\n\n/**\n * Get swap quote from OpenOcean API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Quote data\n */\nexport async function getQuoteData(\n fromToken: string,\n toToken: string,\n amount: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OpenOceanQuote> {\n try {\n const chainName = OPENOCEAN_CHAIN[chain];\n const url = `${OPENOCEAN_BASE_URL}/${chainName}/quote`;\n\n const params = {\n inTokenAddress: fromToken,\n outTokenAddress: toToken,\n amount: amount,\n gasPrice: \"5\", // Default gas price in gwei\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n if (response.data.code === 200) {\n return response.data.data;\n } else {\n throw new Error(`OpenOcean API Error: ${response.data.message || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\"Failed to get OpenOcean quote:\", (error as Error).message);\n throw error;\n }\n}\n","import axios from \"axios\";\nimport { OPENOCEAN_BASE_URL, OPENOCEAN_CHAIN } from \"../../constants/openocean\";\nimport { getHeaders } from \"../../helpers/openocean\";\n\nexport interface OpenOceanSwapData {\n inToken: {\n address: string;\n decimals: number;\n symbol: string;\n };\n outToken: {\n address: string;\n decimals: number;\n symbol: string;\n };\n inAmount: string;\n outAmount: string;\n estimatedGas: string;\n minOutAmount: string;\n to: string;\n data: string;\n value: string;\n gasPrice: string;\n}\n\n/**\n * Get swap transaction data from OpenOcean API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param userAddress - User's wallet address\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Swap transaction data\n */\nexport async function getSwapData(\n fromToken: string,\n toToken: string,\n amount: string,\n userAddress: string,\n slippage: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OpenOceanSwapData> {\n try {\n const chainName = OPENOCEAN_CHAIN[chain];\n const url = `${OPENOCEAN_BASE_URL}/${chainName}/swap`;\n\n const params = {\n inTokenAddress: fromToken,\n outTokenAddress: toToken,\n amount: amount,\n gasPrice: \"5\", // Default gas price in gwei\n slippage: slippage,\n account: userAddress,\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n if (response.data.code === 200) {\n return response.data.data;\n } else {\n throw new Error(`OpenOcean API Error: ${response.data.message || \"Unknown error\"}`);\n }\n } catch (error) {\n console.error(\"Failed to get OpenOcean swap data:\", (error as Error).message);\n throw error;\n }\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { getQuoteData, type OpenOceanQuote } from \"../../utils/openocean\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Get swap quote from OpenOcean\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @returns Quote data including estimated output amount\n */\nexport async function getOpenOceanQuote(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n): Promise<OpenOceanQuote> {\n if (agent.demo) {\n return createMockQuoteResponse(\"OpenOcean\", amount) as unknown as OpenOceanQuote;\n }\n return await getQuoteData(fromToken, toToken, amount, agent.chain);\n}\n","import { erc20Abi, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\n\n/**\n * Check token allowance for a spender\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token contract address\n * @param ownerAddress - Token owner's wallet address\n * @param spenderAddress - Spender address (DEX/protocol contract)\n * @returns Allowance amount as bigint\n */\nexport async function checkAllowance(\n agent: MNTAgentKit,\n tokenAddress: string,\n ownerAddress: string,\n spenderAddress: string,\n): Promise<bigint> {\n try {\n const allowance = await agent.client.readContract({\n address: tokenAddress as Address,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [ownerAddress as Address, spenderAddress as Address],\n });\n return allowance;\n } catch (error) {\n console.error(\"Failed to query allowance:\", error);\n throw error;\n }\n}\n","import { erc20Abi, type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { checkAllowance } from \"./checkAllowance\";\n\n/**\n * Approve token spending for a spender address\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token contract address\n * @param spenderAddress - Spender address (DEX/protocol contract)\n * @param amount - Amount to approve (as string in smallest units)\n * @returns Transaction hash if approval was needed, null if already approved\n */\nexport async function approveToken(\n agent: MNTAgentKit,\n tokenAddress: string,\n spenderAddress: string,\n amount: string,\n): Promise<{ approved: boolean; txHash: string | null }> {\n const walletAddress = agent.account.address;\n\n // Check current allowance\n const currentAllowance = await checkAllowance(\n agent,\n tokenAddress,\n walletAddress,\n spenderAddress,\n );\n\n if (currentAllowance >= BigInt(amount)) {\n console.log(\"Sufficient allowance already exists\");\n return { approved: true, txHash: null };\n }\n\n console.log(\"Insufficient allowance, approving tokens...\");\n\n // Encode approve function call\n const { encodeFunctionData } = await import(\"viem\");\n const approveData = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spenderAddress as Address, BigInt(amount)],\n });\n\n // Estimate gas\n const gasEstimate = await agent.client.estimateGas({\n account: agent.account,\n to: tokenAddress as Address,\n data: approveData as Hex,\n });\n\n // Send approval transaction\n const txHash = await agent.client.sendTransaction({\n to: tokenAddress as Address,\n data: approveData as Hex,\n value: BigInt(0),\n gas: gasEstimate,\n });\n\n console.log(`Approval tx sent: ${txHash}`);\n\n // Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Approval confirmed: ${receipt.status}`);\n\n return { approved: true, txHash };\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n NATIVE_TOKEN_ADDRESS,\n OPENOCEAN_EXCHANGE_PROXY,\n} from \"../../constants/openocean\";\nimport { approveToken } from \"../../utils/common\";\nimport { getSwapData } from \"../../utils/openocean\";\nimport { createMockOpenOceanSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap on OpenOcean\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @returns Transaction hash\n */\nexport async function swapOnOpenOcean(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n slippage: string = \"1\",\n): Promise<{ txHash: string; outAmount: string }> {\n if (agent.demo) {\n return createMockOpenOceanSwapResponse(amount);\n }\n\n if (!agent.demo && agent.chain != \"mainnet\") {\n throw new Error(\"Openocean swaps happen only on mainnet\");\n }\n\n const walletAddress = agent.account.address;\n\n // 1. Approve token if not native\n if (fromToken.toLowerCase() !== NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n await approveToken(agent, fromToken, OPENOCEAN_EXCHANGE_PROXY, amount);\n }\n\n // 2. Get swap transaction data\n const swapData = await getSwapData(\n fromToken,\n toToken,\n amount,\n walletAddress,\n slippage,\n agent.chain,\n );\n\n console.log(\"OpenOcean swap data received\");\n console.log(`Expected output: ${swapData.outAmount}`);\n\n // 3. Execute swap transaction\n const txHash = await agent.client.sendTransaction({\n to: swapData.to as Address,\n data: swapData.data as Hex,\n value: BigInt(swapData.value || \"0\"),\n gas: BigInt(swapData.estimatedGas),\n });\n\n console.log(`OpenOcean swap tx sent: ${txHash}`);\n\n // 4. Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Swap confirmed: ${receipt.status}`);\n\n return {\n txHash,\n outAmount: swapData.outAmount,\n };\n}\n","// 1inch API configuration\nexport const ONEINCH_BASE_URL = \"https://api.1inch.dev/swap/v6.0\";\n\n// Chain IDs for 1inch\nexport const ONEINCH_CHAIN_ID = {\n mainnet: \"5000\", // Mantle mainnet\n testnet: \"5003\", // Mantle testnet (may not be supported)\n} as const;\n\n// Native token address\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// 1inch Aggregation Router v6 on Mantle\nexport const ONEINCH_ROUTER_ADDRESS = \"0x111111125421cA6dc452d289314280a0f8842A65\";\n\n// API configuration (optional - for rate limit increase)\nexport const configs = {\n apiKey: process.env.ONEINCH_API_KEY, // Optional: for higher rate limits\n};\n","import { configs } from \"../../constants/oneinch\";\n\n/**\n * Get headers for 1inch API requests\n * 1inch uses Bearer token authentication (optional - for higher rate limits)\n * @returns Headers object with optional Authorization header\n */\nexport function getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // 1inch API key is optional - used for higher rate limits\n if (configs.apiKey) {\n headers[\"Authorization\"] = `Bearer ${configs.apiKey}`;\n }\n\n return headers;\n}\n\n","import axios from \"axios\";\nimport { ONEINCH_BASE_URL, ONEINCH_CHAIN_ID } from \"../../constants/oneinch\";\nimport { getHeaders } from \"../../helpers/oneinch\";\n\nexport interface OneInchQuote {\n srcToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n dstToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n srcAmount: string;\n dstAmount: string;\n gas: number;\n}\n\nexport interface OneInchSwapData {\n srcToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n dstToken: {\n address: string;\n symbol: string;\n decimals: number;\n };\n srcAmount: string;\n dstAmount: string;\n tx: {\n from: string;\n to: string;\n data: string;\n value: string;\n gas: number;\n gasPrice: string;\n };\n}\n\n\n/**\n * Get swap quote from 1inch API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Quote data\n */\nexport async function getQuoteData(\n fromToken: string,\n toToken: string,\n amount: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OneInchQuote> {\n try {\n const chainId = ONEINCH_CHAIN_ID[chain];\n const url = `${ONEINCH_BASE_URL}/${chainId}/quote`;\n\n const params = {\n src: fromToken,\n dst: toToken,\n amount: amount,\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n return response.data;\n } catch (error) {\n console.error(\"Failed to get 1inch quote:\", (error as Error).message);\n throw error;\n }\n}\n\n/**\n * Get swap transaction data from 1inch API\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param userAddress - User's wallet address\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @param chain - Chain identifier (\"mainnet\" | \"testnet\")\n * @returns Swap transaction data\n */\nexport async function getSwapData(\n fromToken: string,\n toToken: string,\n amount: string,\n userAddress: string,\n slippage: string,\n chain: \"mainnet\" | \"testnet\",\n): Promise<OneInchSwapData> {\n try {\n const chainId = ONEINCH_CHAIN_ID[chain];\n const url = `${ONEINCH_BASE_URL}/${chainId}/swap`;\n\n const params = {\n src: fromToken,\n dst: toToken,\n amount: amount,\n from: userAddress,\n slippage: slippage,\n disableEstimate: \"true\", // We'll estimate gas ourselves\n };\n\n const response = await axios.get(url, {\n params,\n headers: getHeaders(),\n });\n\n return response.data;\n } catch (error) {\n console.error(\"Failed to get 1inch swap data:\", (error as Error).message);\n throw error;\n }\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { getQuoteData, type OneInchQuote } from \"../../utils/oneinch\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Get swap quote from 1inch\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @returns Quote data including estimated output amount\n */\nexport async function get1inchQuote(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n): Promise<OneInchQuote> {\n if (agent.demo) {\n return createMockQuoteResponse(\"1inch\", amount) as unknown as OneInchQuote;\n }\n return await getQuoteData(fromToken, toToken, amount, agent.chain);\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { NATIVE_TOKEN_ADDRESS, ONEINCH_ROUTER_ADDRESS } from \"../../constants/oneinch\";\nimport { approveToken } from \"../../utils/common\";\nimport { getSwapData } from \"../../utils/oneinch\";\nimport { createMock1inchSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap on 1inch\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage percentage (e.g., \"1\" for 1%)\n * @returns Transaction hash and output amount\n */\nexport async function swapOn1inch(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n slippage: string = \"1\",\n): Promise<{ txHash: string; dstAmount: string }> {\n if (agent.demo) {\n return createMock1inchSwapResponse(amount);\n }\n\n const walletAddress = agent.account.address;\n\n // 1. Approve token if not native\n if (fromToken.toLowerCase() !== NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n await approveToken(agent, fromToken, ONEINCH_ROUTER_ADDRESS, amount);\n }\n\n // 2. Get swap transaction data\n const swapData = await getSwapData(\n fromToken,\n toToken,\n amount,\n walletAddress,\n slippage,\n agent.chain,\n );\n\n console.log(\"1inch swap data received\");\n console.log(`Expected output: ${swapData.dstAmount}`);\n\n // 3. Estimate gas\n const gasEstimate = await agent.client.estimateGas({\n account: agent.account,\n to: swapData.tx.to as Address,\n data: swapData.tx.data as Hex,\n value: BigInt(swapData.tx.value || \"0\"),\n });\n\n // 4. Execute swap transaction\n const txHash = await agent.client.sendTransaction({\n to: swapData.tx.to as Address,\n data: swapData.tx.data as Hex,\n value: BigInt(swapData.tx.value || \"0\"),\n gas: gasEstimate,\n });\n\n console.log(`1inch swap tx sent: ${txHash}`);\n\n // 5. Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Swap confirmed: ${receipt.status}`);\n\n return {\n txHash,\n dstAmount: swapData.dstAmount,\n };\n}\n","// Uniswap V3 contract addresses on Mantle\n// Reference: https://docs.uniswap.org/contracts/v3/reference/deployments\n\n// SwapRouter02 - Universal Router for swaps\nexport const SWAP_ROUTER_ADDRESS = \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\";\n\n// QuoterV2 - For getting swap quotes\nexport const QUOTER_V2_ADDRESS = \"0x61fFE014bA17989E743c5F6cB21bF9697530B21e\";\n\n// Factory address\nexport const FACTORY_ADDRESS = \"0x1F98431c8aD98523631AE4a59f267346ea31F984\";\n\n// WETH address on Mantle\nexport const WMNT_ADDRESS = \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\";\n\n// Native token placeholder\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// Default fee tiers (in hundredths of a bip)\nexport const FEE_TIERS = {\n LOWEST: 100, // 0.01%\n LOW: 500, // 0.05%\n MEDIUM: 3000, // 0.3%\n HIGH: 10000, // 1%\n} as const;\n\n// Default pool fee\nexport const DEFAULT_POOL_FEE = FEE_TIERS.MEDIUM;\n","import { encodeFunctionData, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n QUOTER_V2_ADDRESS,\n SWAP_ROUTER_ADDRESS,\n DEFAULT_POOL_FEE,\n WMNT_ADDRESS,\n NATIVE_TOKEN_ADDRESS,\n} from \"../../constants/uniswap\";\n\n// QuoterV2 ABI for quoteExactInputSingle\nconst quoterV2Abi = [\n {\n inputs: [\n {\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"quoteExactInputSingle\",\n outputs: [\n { name: \"amountOut\", type: \"uint256\" },\n { name: \"sqrtPriceX96After\", type: \"uint160\" },\n { name: \"initializedTicksCrossed\", type: \"uint32\" },\n { name: \"gasEstimate\", type: \"uint256\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n// SwapRouter02 ABI for exactInputSingle\nconst swapRouterAbi = [\n {\n inputs: [\n {\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"exactInputSingle\",\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\nexport interface UniswapQuoteResult {\n amountOut: bigint;\n sqrtPriceX96After: bigint;\n gasEstimate: bigint;\n}\n\nexport interface UniswapSwapParams {\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n amountOutMinimum: string;\n recipient: string;\n fee?: number;\n}\n\n/**\n * Get token address, converting native token to WMNT\n */\nfunction getTokenAddress(token: string): Address {\n if (token.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n return WMNT_ADDRESS as Address;\n }\n return token as Address;\n}\n\n/**\n * Get swap quote from Uniswap V3\n * @param agent - MNTAgentKit instance\n * @param tokenIn - Input token address\n * @param tokenOut - Output token address\n * @param amountIn - Amount to swap (in smallest units)\n * @param fee - Pool fee tier (default: 3000 = 0.3%)\n * @returns Quote result with expected output amount\n */\nexport async function getUniswapQuoteData(\n agent: MNTAgentKit,\n tokenIn: string,\n tokenOut: string,\n amountIn: string,\n fee: number = DEFAULT_POOL_FEE,\n): Promise<UniswapQuoteResult> {\n try {\n const result = await agent.client.simulateContract({\n address: QUOTER_V2_ADDRESS as Address,\n abi: quoterV2Abi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: getTokenAddress(tokenIn),\n tokenOut: getTokenAddress(tokenOut),\n amountIn: BigInt(amountIn),\n fee: fee,\n sqrtPriceLimitX96: BigInt(0),\n },\n ],\n });\n\n const [amountOut, sqrtPriceX96After, , gasEstimate] = result.result;\n\n return {\n amountOut,\n sqrtPriceX96After,\n gasEstimate,\n };\n } catch (error) {\n console.error(\"Failed to get Uniswap quote:\", error);\n throw error;\n }\n}\n\n/**\n * Build swap transaction calldata for Uniswap V3\n * @param params - Swap parameters\n * @param fee - Pool fee tier\n * @returns Encoded calldata for the swap\n */\nexport function buildSwapCalldata(\n params: UniswapSwapParams,\n fee: number = DEFAULT_POOL_FEE,\n): `0x${string}` {\n return encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: getTokenAddress(params.tokenIn),\n tokenOut: getTokenAddress(params.tokenOut),\n fee: fee,\n recipient: params.recipient as Address,\n amountIn: BigInt(params.amountIn),\n amountOutMinimum: BigInt(params.amountOutMinimum),\n sqrtPriceLimitX96: BigInt(0),\n },\n ],\n });\n}\n\nexport { SWAP_ROUTER_ADDRESS, QUOTER_V2_ADDRESS, NATIVE_TOKEN_ADDRESS, WMNT_ADDRESS };\n","import type { MNTAgentKit } from \"../../agent\";\nimport { DEFAULT_POOL_FEE } from \"../../constants/uniswap\";\nimport { getUniswapQuoteData, type UniswapQuoteResult } from \"../../utils/uniswap\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Get swap quote from Uniswap V3\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param fee - Pool fee tier (default: 3000 = 0.3%)\n * @returns Quote with expected output amount\n */\nexport async function getUniswapQuote(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n fee: number = DEFAULT_POOL_FEE,\n): Promise<UniswapQuoteResult> {\n if (agent.demo) {\n return createMockQuoteResponse(\"Uniswap\", amount) as unknown as UniswapQuoteResult;\n }\n return await getUniswapQuoteData(agent, fromToken, toToken, amount, fee);\n}\n","import type { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { DEFAULT_POOL_FEE, SWAP_ROUTER_ADDRESS, NATIVE_TOKEN_ADDRESS } from \"../../constants/uniswap\";\nimport { approveToken } from \"../../utils/common\";\nimport { getUniswapQuoteData, buildSwapCalldata } from \"../../utils/uniswap\";\nimport { createMockUniswapSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute token swap on Uniswap V3\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage percentage (e.g., \"0.5\" for 0.5%)\n * @param fee - Pool fee tier (default: 3000 = 0.3%)\n * @returns Transaction hash and output amount\n */\nexport async function swapOnUniswap(\n agent: MNTAgentKit,\n fromToken: string,\n toToken: string,\n amount: string,\n slippage: string = \"0.5\",\n fee: number = DEFAULT_POOL_FEE,\n): Promise<{ txHash: string; amountOut: string }> {\n if (agent.demo) {\n return createMockUniswapSwapResponse(amount);\n }\n\n const walletAddress = agent.account.address;\n const isNativeIn = fromToken.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase();\n\n // 1. Get quote for expected output\n const quote = await getUniswapQuoteData(agent, fromToken, toToken, amount, fee);\n console.log(`Uniswap quote: ${quote.amountOut.toString()}`);\n\n // 2. Calculate minimum output with slippage\n const slippageBps = Math.floor(parseFloat(slippage) * 100); // Convert to basis points\n const amountOutMinimum = (quote.amountOut * BigInt(10000 - slippageBps)) / BigInt(10000);\n\n // 3. Approve token if not native\n if (!isNativeIn) {\n await approveToken(agent, fromToken, SWAP_ROUTER_ADDRESS, amount);\n }\n\n // 4. Build swap calldata\n const calldata = buildSwapCalldata(\n {\n tokenIn: fromToken,\n tokenOut: toToken,\n amountIn: amount,\n amountOutMinimum: amountOutMinimum.toString(),\n recipient: walletAddress,\n },\n fee,\n );\n\n // 5. Estimate gas\n const gasEstimate = await agent.client.estimateGas({\n account: agent.account,\n to: SWAP_ROUTER_ADDRESS as Address,\n data: calldata as Hex,\n value: isNativeIn ? BigInt(amount) : BigInt(0),\n });\n\n // 6. Execute swap transaction\n const txHash = await agent.client.sendTransaction({\n to: SWAP_ROUTER_ADDRESS as Address,\n data: calldata as Hex,\n value: isNativeIn ? BigInt(amount) : BigInt(0),\n gas: gasEstimate,\n });\n\n console.log(`Uniswap swap tx sent: ${txHash}`);\n\n // 7. Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({\n hash: txHash,\n });\n\n console.log(`Swap confirmed: ${receipt.status}`);\n\n return {\n txHash,\n amountOut: quote.amountOut.toString(),\n };\n}\n","// Squid Router API configuration\nexport const SQUID_BASE_URL = \"https://api.squidrouter.com/v2\";\n\n// Chain IDs for Squid Router (LayerZero chain IDs)\nexport const SQUID_CHAIN_ID = {\n mainnet: 5000, // Mantle mainnet\n testnet: 5003, // Mantle testnet\n} as const;\n\n// Common destination chains (LayerZero chain IDs)\nexport const DESTINATION_CHAINS = {\n ethereum: 101,\n arbitrum: 110,\n optimism: 111,\n polygon: 109,\n base: 184,\n bsc: 102,\n avalanche: 106,\n mantle: 5000,\n} as const;\n\n// Native token address\nexport const NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n","/**\n * Get headers for Squid Router API requests\n * Squid Router uses public endpoints, but may require integrator ID in the future\n * @param integratorId - Optional integrator ID for future use\n * @returns Headers object\n */\nexport function getHeaders(integratorId?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Future: Add integrator ID support if Squid requires it\n if (integratorId) {\n headers[\"X-Integrator-Id\"] = integratorId;\n }\n\n return headers;\n}\n\n","import axios from \"axios\";\nimport { type Address } from \"viem\";\nimport { SQUID_BASE_URL, SQUID_CHAIN_ID, NATIVE_TOKEN_ADDRESS } from \"../../constants/squid\";\nimport { getHeaders } from \"../../helpers/squid\";\n\nexport interface SquidRoute {\n route: {\n estimate: {\n fromAmount: string;\n toAmount: string;\n toAmountMin: string;\n route: {\n actionType: string;\n chainType: string;\n data: {\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n amountOut: string;\n path: string[];\n };\n }[];\n estimatedRouteDuration: number;\n aggregatePriceImpact: string;\n feeCosts: {\n name: string;\n description: string;\n percentage: string;\n amount: string;\n amountUSD: string;\n }[];\n gasCosts: {\n type: string;\n amount: string;\n amountUSD: string;\n gasPrice: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n estimate: string;\n }[];\n };\n transactionRequest: {\n routeType: string;\n targetAddress: string;\n data: string;\n value: string;\n gasLimit: string;\n gasPrice: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n };\n };\n}\n\n/**\n * Get cross-chain swap route from Squid Router\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param fromChain - Source chain ID (LayerZero chain ID)\n * @param toChain - Destination chain ID (LayerZero chain ID)\n * @param amount - Amount to swap (in smallest units)\n * @param fromAddress - User's wallet address on source chain\n * @param slippage - Slippage tolerance (default: 1%)\n * @returns Route data including transaction request\n */\nexport async function getRouteData(\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n fromAddress: Address,\n slippage: number = 1,\n): Promise<SquidRoute> {\n const params = {\n fromChain: fromChain.toString(),\n toChain: toChain.toString(),\n fromToken:\n fromToken.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()\n ? \"native\"\n : fromToken,\n toToken:\n toToken.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()\n ? \"native\"\n : toToken,\n fromAmount: amount,\n fromAddress,\n slippage: slippage.toString(),\n enableForecast: false,\n };\n\n const response = await axios.get<SquidRoute>(`${SQUID_BASE_URL}/route`, {\n params,\n headers: getHeaders(),\n });\n\n return response.data;\n}\n\n/**\n * Get transaction status from Squid Router\n * @param transactionHash - Transaction hash\n * @param fromChain - Source chain ID\n * @returns Transaction status\n */\nexport async function getTransactionStatus(\n transactionHash: string,\n fromChain: number,\n): Promise<any> {\n const response = await axios.get(`${SQUID_BASE_URL}/status`, {\n params: {\n transactionHash,\n fromChain: fromChain.toString(),\n },\n headers: getHeaders(),\n });\n\n return response.data;\n}\n\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { SQUID_CHAIN_ID, NATIVE_TOKEN_ADDRESS } from \"../../constants/squid\";\nimport { approveToken } from \"../../utils/common\";\nimport { getRouteData } from \"../../utils/squid\";\nimport { createMockTxHash, createMockSquidRoute } from \"../../utils/demo/mockResponses\";\n\n/**\n * Execute cross-chain swap via Squid Router\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param fromChain - Source chain ID (LayerZero chain ID)\n * @param toChain - Destination chain ID (LayerZero chain ID)\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage tolerance percentage (default: 1%)\n * @returns Transaction hash\n */\nexport async function crossChainSwapViaSquid(\n agent: MNTAgentKit,\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n): Promise<Hex> {\n if (agent.demo) {\n return createMockTxHash();\n }\n\n // Get route data from Squid API\n const routeData = await getRouteData(\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n agent.account.address,\n slippage,\n );\n\n const transactionRequest = routeData.route.transactionRequest;\n\n // Approve token if not native\n if (\n fromToken.toLowerCase() !== NATIVE_TOKEN_ADDRESS.toLowerCase() &&\n transactionRequest.targetAddress\n ) {\n await approveToken(\n agent,\n fromToken,\n transactionRequest.targetAddress as Address,\n amount,\n );\n }\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: transactionRequest.targetAddress as Address,\n data: transactionRequest.data as Hex,\n value: BigInt(transactionRequest.value || \"0\"),\n gas: BigInt(transactionRequest.gasLimit || \"0\"),\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n\n/**\n * Get cross-chain swap route from Squid Router\n * @param agent - MNTAgentKit instance\n * @param fromToken - Source token address\n * @param toToken - Destination token address\n * @param fromChain - Source chain ID (LayerZero chain ID)\n * @param toChain - Destination chain ID (LayerZero chain ID)\n * @param amount - Amount to swap (in smallest units)\n * @param slippage - Slippage tolerance percentage (default: 1%)\n * @returns Route data including estimated output and fees\n */\nexport async function getSquidRoute(\n agent: MNTAgentKit,\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n) {\n if (agent.demo) {\n return createMockSquidRoute(amount);\n }\n\n return await getRouteData(\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n agent.account.address,\n slippage,\n );\n}\n\n","// Lendle Protocol contract addresses on Mantle Network\n// Official docs: https://docs.lendle.xyz/contracts-and-security/mantle-contracts\n// Lendle is an Aave V2 fork optimized for Mantle Network\n\n// LendingPool - Main contract for supply, borrow, withdraw operations\nexport const LENDING_POOL = {\n mainnet: \"0xCFa5aE7c2CE8Fadc6426C1ff872cA45378Fb7cF3\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const, // Not deployed on testnet\n} as const;\n\n// LendingPoolAddressesProvider - Registry for protocol addresses\nexport const LENDING_POOL_ADDRESSES_PROVIDER = {\n mainnet: \"0xAb94Bedd21ae3411eB2698945dfCab1D5C19C3d4\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// AaveProtocolDataProvider - Helper contract for reading protocol data\nexport const PROTOCOL_DATA_PROVIDER = {\n mainnet: \"0x552b9e4bae485C4B7F540777d7D25614CdB84773\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// AaveOracle - Price oracle for assets\nexport const ORACLE = {\n mainnet: \"0x870c9692Ab04944C86ec6FEeF63F261226506EfC\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// WMNT address for native MNT wrapping\nexport const WMNT_ADDRESS = \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" as const;\n\n// Interest rate modes\nexport const INTEREST_RATE_MODE = {\n STABLE: 1,\n VARIABLE: 2,\n} as const;\n\n// Lendle LendingPool ABI (Aave V2 compatible)\nexport const LENDING_POOL_ABI = [\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"onBehalfOf\", type: \"address\" },\n { name: \"referralCode\", type: \"uint16\" },\n ],\n name: \"deposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"to\", type: \"address\" },\n ],\n name: \"withdraw\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"interestRateMode\", type: \"uint256\" },\n { name: \"referralCode\", type: \"uint16\" },\n { name: \"onBehalfOf\", type: \"address\" },\n ],\n name: \"borrow\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"rateMode\", type: \"uint256\" },\n { name: \"onBehalfOf\", type: \"address\" },\n ],\n name: \"repay\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"user\", type: \"address\" }],\n name: \"getUserAccountData\",\n outputs: [\n { name: \"totalCollateralETH\", type: \"uint256\" },\n { name: \"totalDebtETH\", type: \"uint256\" },\n { name: \"availableBorrowsETH\", type: \"uint256\" },\n { name: \"currentLiquidationThreshold\", type: \"uint256\" },\n { name: \"ltv\", type: \"uint256\" },\n { name: \"healthFactor\", type: \"uint256\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"asset\", type: \"address\" }],\n name: \"getReserveData\",\n outputs: [\n {\n components: [\n { name: \"configuration\", type: \"uint256\" },\n { name: \"liquidityIndex\", type: \"uint128\" },\n { name: \"variableBorrowIndex\", type: \"uint128\" },\n { name: \"currentLiquidityRate\", type: \"uint128\" },\n { name: \"currentVariableBorrowRate\", type: \"uint128\" },\n { name: \"currentStableBorrowRate\", type: \"uint128\" },\n { name: \"lastUpdateTimestamp\", type: \"uint40\" },\n { name: \"aTokenAddress\", type: \"address\" },\n { name: \"stableDebtTokenAddress\", type: \"address\" },\n { name: \"variableDebtTokenAddress\", type: \"address\" },\n { name: \"interestRateStrategyAddress\", type: \"address\" },\n { name: \"id\", type: \"uint8\" },\n ],\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// ProtocolDataProvider ABI for reading user reserve data\nexport const PROTOCOL_DATA_PROVIDER_ABI = [\n {\n inputs: [],\n name: \"getAllReservesTokens\",\n outputs: [\n {\n components: [\n { name: \"symbol\", type: \"string\" },\n { name: \"tokenAddress\", type: \"address\" },\n ],\n name: \"\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"asset\", type: \"address\" },\n { name: \"user\", type: \"address\" },\n ],\n name: \"getUserReserveData\",\n outputs: [\n { name: \"currentATokenBalance\", type: \"uint256\" },\n { name: \"currentStableDebt\", type: \"uint256\" },\n { name: \"currentVariableDebt\", type: \"uint256\" },\n { name: \"principalStableDebt\", type: \"uint256\" },\n { name: \"scaledVariableDebt\", type: \"uint256\" },\n { name: \"stableBorrowRate\", type: \"uint256\" },\n { name: \"liquidityRate\", type: \"uint256\" },\n { name: \"stableRateLastUpdated\", type: \"uint40\" },\n { name: \"usageAsCollateralEnabled\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"asset\", type: \"address\" }],\n name: \"getReserveTokensAddresses\",\n outputs: [\n { name: \"aTokenAddress\", type: \"address\" },\n { name: \"stableDebtTokenAddress\", type: \"address\" },\n { name: \"variableDebtTokenAddress\", type: \"address\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// Supported assets on Lendle (Mantle mainnet)\nexport const LENDLE_SUPPORTED_ASSETS = {\n mainnet: [\n { symbol: \"WMNT\", address: \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" },\n { symbol: \"WETH\", address: \"0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111\" },\n { symbol: \"USDC\", address: \"0x09Bc4E0D10C81b3a3766c49F0f98a8aaa7adA8D2\" },\n { symbol: \"USDT\", address: \"0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE\" },\n { symbol: \"mETH\", address: \"0xcDA86A272531e8640cD7F1a92c01839911B90bb0\" },\n ],\n testnet: [],\n} as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI, WMNT_ADDRESS } from \"../../constants/lendle\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Supply (deposit) tokens to Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to supply\n * @param amount - Amount to supply (in smallest units)\n * @returns Transaction hash\n */\nexport async function lendleSupply(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"supply\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const isNative = tokenAddress.toLowerCase() === WMNT_ADDRESS.toLowerCase();\n\n // Approve token spending if not native\n if (!isNative) {\n await approveToken(agent, tokenAddress, lendingPoolAddress, amount);\n }\n\n // Encode deposit function call (Aave V2 uses 'deposit' instead of 'supply')\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"deposit\",\n args: [tokenAddress, amountBigInt, agent.account.address, 0], // referralCode = 0 (uint16)\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n value: isNative ? amountBigInt : 0n,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI } from \"../../constants/lendle\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Withdraw tokens from Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to withdraw\n * @param amount - Amount to withdraw (in smallest units, use max uint256 for max)\n * @param to - Address to receive withdrawn tokens (optional, defaults to agent address)\n * @returns Transaction hash\n */\nexport async function lendleWithdraw(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n to?: Address,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"withdraw\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const toAddress = to || agent.account.address;\n\n // Encode withdraw function call\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"withdraw\",\n args: [tokenAddress, amountBigInt, toAddress],\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI, INTEREST_RATE_MODE } from \"../../constants/lendle\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Borrow tokens from Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to borrow\n * @param amount - Amount to borrow (in smallest units)\n * @param interestRateMode - Interest rate mode (1 = stable, 2 = variable)\n * @param onBehalfOf - Address to receive borrowed tokens (optional, defaults to agent address)\n * @returns Transaction hash\n */\nexport async function lendleBorrow(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n interestRateMode: 1 | 2 = INTEREST_RATE_MODE.VARIABLE,\n onBehalfOf?: Address,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"borrow\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const onBehalfOfAddress = onBehalfOf || agent.account.address;\n\n // Encode borrow function call\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"borrow\",\n args: [tokenAddress, amountBigInt, BigInt(interestRateMode), 0, onBehalfOfAddress], // referralCode = 0 (uint16)\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI, INTEREST_RATE_MODE } from \"../../constants/lendle\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockLendleResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Repay borrowed tokens to Lendle Protocol\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to repay\n * @param amount - Amount to repay (in smallest units, use max uint256 for full repayment)\n * @param rateMode - Interest rate mode (1 = stable, 2 = variable)\n * @param onBehalfOf - Address whose debt to repay (optional, defaults to agent address)\n * @returns Transaction hash\n */\nexport async function lendleRepay(\n agent: MNTAgentKit,\n tokenAddress: Address,\n amount: string,\n rateMode: 1 | 2 = INTEREST_RATE_MODE.VARIABLE,\n onBehalfOf?: Address,\n): Promise<Hex> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockLendleResponse(\"repay\", amount).txHash;\n }\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const amountBigInt = BigInt(amount);\n const onBehalfOfAddress = onBehalfOf || agent.account.address;\n\n // Approve token spending for repayment\n await approveToken(agent, tokenAddress, lendingPoolAddress, amount);\n\n // Encode repay function call\n const data = encodeFunctionData({\n abi: LENDING_POOL_ABI,\n functionName: \"repay\",\n args: [tokenAddress, amountBigInt, BigInt(rateMode), onBehalfOfAddress],\n });\n\n // Send transaction\n const hash = await agent.client.sendTransaction({\n to: lendingPoolAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash });\n\n return hash;\n}\n","import { type Address, getAddress } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PROTOCOL_DATA_PROVIDER,\n PROTOCOL_DATA_PROVIDER_ABI,\n LENDLE_SUPPORTED_ASSETS,\n} from \"../../constants/lendle\";\n\nexport interface LendlePosition {\n asset: Address;\n symbol: string;\n supplied: bigint;\n stableDebt: bigint;\n variableDebt: bigint;\n totalDebt: bigint;\n liquidityRate: bigint; // Supply APY (in ray, 1e27)\n stableBorrowRate: bigint;\n usageAsCollateralEnabled: boolean;\n}\n\nexport interface LendlePositionsResult {\n positions: LendlePosition[];\n totalSupplied: bigint;\n totalDebt: bigint;\n}\n\n/**\n * Get all Lendle positions for a user\n * Returns per-token supply and borrow amounts\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with supply/borrow amounts per asset\n */\nexport async function lendleGetPositions(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<LendlePositionsResult> {\n const dataProviderAddress = PROTOCOL_DATA_PROVIDER[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (dataProviderAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `Lendle ProtocolDataProvider not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Get supported assets for the chain\n const supportedAssets = LENDLE_SUPPORTED_ASSETS[agent.chain];\n if (!supportedAssets || supportedAssets.length === 0) {\n throw new Error(`No supported assets configured for ${agent.chain}`);\n }\n\n const positions: LendlePosition[] = [];\n let totalSupplied = 0n;\n let totalDebt = 0n;\n\n // Query each asset's position\n for (const asset of supportedAssets) {\n try {\n // Normalize address to proper checksum format\n const assetAddress = getAddress(asset.address);\n const result = (await agent.client.readContract({\n address: dataProviderAddress,\n abi: PROTOCOL_DATA_PROVIDER_ABI,\n functionName: \"getUserReserveData\",\n args: [assetAddress, address],\n })) as readonly [\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n bigint,\n number,\n boolean,\n ];\n\n const [\n currentATokenBalance,\n currentStableDebt,\n currentVariableDebt,\n _principalStableDebt,\n _scaledVariableDebt,\n stableBorrowRate,\n liquidityRate,\n _stableRateLastUpdated,\n usageAsCollateralEnabled,\n ] = result;\n\n // Only include positions with non-zero supply or debt\n if (\n currentATokenBalance > 0n ||\n currentStableDebt > 0n ||\n currentVariableDebt > 0n\n ) {\n const assetTotalDebt = currentStableDebt + currentVariableDebt;\n\n positions.push({\n asset: assetAddress,\n symbol: asset.symbol,\n supplied: currentATokenBalance,\n stableDebt: currentStableDebt,\n variableDebt: currentVariableDebt,\n totalDebt: assetTotalDebt,\n liquidityRate,\n stableBorrowRate,\n usageAsCollateralEnabled,\n });\n\n totalSupplied += currentATokenBalance;\n totalDebt += assetTotalDebt;\n }\n } catch (error) {\n // Skip assets that fail (might not be supported)\n console.warn(`Failed to get position for ${asset.symbol}:`, error);\n }\n }\n\n return {\n positions,\n totalSupplied,\n totalDebt,\n };\n}\n","// Agni Finance contract addresses on Mantle Network\n// Agni is a Uniswap V3 fork - #1 DEX on Mantle with $87.9M TVL\n// Official site: https://agni.finance\n\n// Factory contract - Creates and manages liquidity pools\nexport const FACTORY = {\n mainnet: \"0x25780dc8Fc3cfBD75F33bFDAB65e969b603b2035\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// SwapRouter - Main contract for executing swaps\nexport const SWAP_ROUTER = {\n mainnet: \"0x319B69888b0d11cEC22caA5034e25FfFBDc88421\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// NFT Position Manager - Manages liquidity positions\nexport const POSITION_MANAGER = {\n mainnet: \"0x218bf598d1453383e2f4aa7b14ffb9bfb102d637\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// SwapRouter ABI (Uniswap V3 compatible)\nexport const SWAP_ROUTER_ABI = [\n {\n inputs: [\n {\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"exactInputSingle\",\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\n// Common fee tiers (in hundredths of a bip, i.e. 1e-6)\nexport const FEE_TIERS = {\n LOWEST: 100, // 0.01%\n LOW: 500, // 0.05%\n MEDIUM: 3000, // 0.3%\n HIGH: 10000, // 1%\n} as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { SWAP_ROUTER, SWAP_ROUTER_ABI, FEE_TIERS } from \"../../constants/agni\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Swap tokens on Agni Finance DEX\n * @param agent - MNTAgentKit instance\n * @param tokenIn - Input token address\n * @param tokenOut - Output token address\n * @param amountIn - Amount to swap (in smallest units)\n * @param slippagePercent - Slippage tolerance (default: 0.5%)\n * @param feeTier - Pool fee tier (default: MEDIUM = 0.3%)\n * @returns Transaction hash\n */\nexport async function agniSwap(\n agent: MNTAgentKit,\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n feeTier: number = FEE_TIERS.MEDIUM,\n): Promise<Hex> {\n const swapRouterAddress = SWAP_ROUTER[agent.chain];\n\n if (swapRouterAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockSwapResponse(\"Agni\", amountIn).txHash;\n }\n throw new Error(`Agni SwapRouter not available on ${agent.chain}`);\n }\n\n const amountInBigInt = BigInt(amountIn);\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 1200); // 20 minutes\n\n // Calculate minimum amount out (with slippage)\n const amountOutMinimum = (amountInBigInt * BigInt(10000 - Math.floor(slippagePercent * 100))) / 10000n;\n\n // Approve token\n await approveToken(agent, tokenIn, swapRouterAddress, amountIn);\n\n // Encode swap\n const data = encodeFunctionData({\n abi: SWAP_ROUTER_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn,\n tokenOut,\n fee: feeTier,\n recipient: agent.account.address,\n deadline,\n amountIn: amountInBigInt,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n const hash = await agent.client.sendTransaction({\n to: swapRouterAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash });\n return hash;\n}\n","// Merchant Moe - #2 DEX on Mantle with $73.3M TVL\n// TraderJoe fork with Liquidity Book (LB) 2.2\n// Official docs: https://docs.merchantmoe.com\n\n// LB Router - Main router for swaps\nexport const LB_ROUTER = {\n mainnet: \"0x013e138EF6008ae5FDFDE29700e3f2Bc61d21E3a\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// LB Factory - Creates liquidity book pairs\nexport const LB_FACTORY = {\n mainnet: \"0xa6630671775c4EA2743840F9A5016dCf2A104054\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// LB Quoter - Get quotes for swaps\nexport const LB_QUOTER = {\n mainnet: \"0x501b8AFd35df20f531fF45F6f695793AC3316c85\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// MOE Token\nexport const MOE_TOKEN = \"0x4515a45337f461a11ff0fe8abf3c606ae5dc00c9\" as const;\n\n// Simple Router ABI for swaps\nexport const LB_ROUTER_ABI = [\n {\n inputs: [\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMin\", type: \"uint256\" },\n { name: \"path\", type: \"uint256[]\" },\n { name: \"to\", type: \"address\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n name: \"swapExactTokensForTokens\",\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LB_ROUTER, LB_ROUTER_ABI } from \"../../constants/merchantmoe\";\nimport { approveToken } from \"../../utils/common\";\nimport { createMockSwapResponse } from \"../../utils/demo/mockResponses\";\n\n/**\n * Swap tokens on Merchant Moe DEX\n * @param agent - MNTAgentKit instance\n * @param tokenIn - Input token address\n * @param tokenOut - Output token address\n * @param amountIn - Amount to swap (in smallest units)\n * @param slippagePercent - Slippage tolerance (default: 0.5%)\n * @returns Transaction hash\n */\nexport async function merchantMoeSwap(\n agent: MNTAgentKit,\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n): Promise<Hex> {\n const routerAddress = LB_ROUTER[agent.chain];\n\n if (routerAddress === \"0x0000000000000000000000000000000000000000\") {\n if (agent.demo) {\n return createMockSwapResponse(\"MerchantMoe\", amountIn).txHash;\n }\n throw new Error(`Merchant Moe LB Router not available on ${agent.chain}`);\n }\n\n const amountInBigInt = BigInt(amountIn);\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 1200); // 20 min\n\n // Calculate minimum out with slippage\n const amountOutMin = (amountInBigInt * BigInt(10000 - Math.floor(slippagePercent * 100))) / 10000n;\n\n // Approve token\n await approveToken(agent, tokenIn, routerAddress, amountIn);\n\n // Simple path (direct swap)\n const path = [BigInt(tokenIn), BigInt(tokenOut)];\n\n const data = encodeFunctionData({\n abi: LB_ROUTER_ABI,\n functionName: \"swapExactTokensForTokens\",\n args: [amountInBigInt, amountOutMin, path, agent.account.address, deadline],\n });\n\n const hash = await agent.client.sendTransaction({\n to: routerAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash });\n return hash;\n}\n","// mETH Protocol - Mantle's Liquid Staking Token\n// Official docs: https://docs.mantle.xyz/meth\n// mETH represents staked ETH with accumulated rewards\n\n// mETH Token Address on Mantle L2\nexport const METH_TOKEN = {\n mainnet: \"0xcDA86A272531e8640cD7F1a92c01839911B90bb0\" as const,\n testnet: \"0x0000000000000000000000000000000000000000\" as const,\n} as const;\n\n// WETH (Wrapped ETH) address on Mantle - for mETH swaps (mETH is ETH-backed)\nexport const WETH_TOKEN = {\n mainnet: \"0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111\" as const,\n testnet: \"0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111\" as const,\n} as const;\n\n// WMNT (Wrapped MNT) address on Mantle\nexport const WMNT_TOKEN = {\n mainnet: \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" as const,\n testnet: \"0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8\" as const,\n} as const;\n\n// Native MNT token address (used by DEX aggregators)\nexport const NATIVE_MNT_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as const;\n\n// mETH exchange rate increases over time (1 mETH ≈ 1.08 ETH as of Dec 2025)\n// This is a value-accumulating token, not a rebasing token\n\n// mETH ABI for reading balance and exchange rate\nexport const METH_ABI = [\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { METH_TOKEN, METH_ABI, WETH_TOKEN, WMNT_TOKEN } from \"../../constants/meth\";\n\nexport interface MethPosition {\n methBalance: bigint; // Raw mETH balance in wei\n wethBalance: bigint; // WETH balance for mETH swaps (mETH is ETH-backed)\n wmntBalance: bigint; // WMNT balance for reference\n methTokenAddress: Address;\n wethTokenAddress: Address;\n wmntTokenAddress: Address;\n}\n\n/**\n * Get mETH position for a user\n * Returns mETH balance, WETH balance (for swaps), and WMNT balance\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns mETH position with balances\n */\nexport async function methGetPosition(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<MethPosition> {\n const methTokenAddress = METH_TOKEN[agent.chain];\n const wethTokenAddress = WETH_TOKEN[agent.chain];\n const wmntTokenAddress = WMNT_TOKEN[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (methTokenAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `mETH not available on ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Get mETH balance\n const methBalance = (await agent.client.readContract({\n address: methTokenAddress,\n abi: METH_ABI,\n functionName: \"balanceOf\",\n args: [address],\n })) as bigint;\n\n // Get WETH balance for mETH swaps (mETH is ETH-backed)\n let wethBalance = 0n;\n try {\n wethBalance = (await agent.client.readContract({\n address: wethTokenAddress,\n abi: METH_ABI, // Same ERC20 ABI works for WETH\n functionName: \"balanceOf\",\n args: [address],\n })) as bigint;\n } catch {\n // WETH balance query failed, continue with 0\n }\n\n // Get WMNT balance for reference\n let wmntBalance = 0n;\n try {\n wmntBalance = (await agent.client.readContract({\n address: wmntTokenAddress,\n abi: METH_ABI, // Same ERC20 ABI works for WMNT\n functionName: \"balanceOf\",\n args: [address],\n })) as bigint;\n } catch {\n // WMNT balance query failed, continue with 0\n }\n\n return {\n methBalance,\n wethBalance,\n wmntBalance,\n methTokenAddress,\n wethTokenAddress,\n wmntTokenAddress,\n };\n}\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { METH_TOKEN, WETH_TOKEN } from \"../../constants/meth\";\nimport { swapOnOpenOcean } from \"../openocean\";\n\n/**\n * Swap WETH to mETH using DEX aggregator\n * This is the L2 way to acquire mETH - swap via DEX\n * @param agent - MNTAgentKit instance\n * @param amount - Amount of WETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\nexport async function swapToMeth(\n agent: MNTAgentKit,\n amount: string,\n slippage: number = 0.5,\n): Promise<Hex> {\n const methTokenAddress = METH_TOKEN[agent.chain];\n const wethTokenAddress = WETH_TOKEN[agent.chain];\n\n if (methTokenAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `mETH not available on ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Use OpenOcean aggregator to swap WETH -> mETH\n const result = await swapOnOpenOcean(\n agent,\n wethTokenAddress as Address,\n methTokenAddress as Address,\n amount,\n slippage.toString(),\n );\n\n return result.txHash as Hex;\n}\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { METH_TOKEN, WETH_TOKEN } from \"../../constants/meth\";\nimport { swapOnOpenOcean } from \"../openocean\";\n\n/**\n * Swap mETH to WETH using DEX aggregator\n * This is the L2 way to exit mETH position - swap via DEX\n * @param agent - MNTAgentKit instance\n * @param amount - Amount of mETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\nexport async function swapFromMeth(\n agent: MNTAgentKit,\n amount: string,\n slippage: number = 0.5,\n): Promise<Hex> {\n const methTokenAddress = METH_TOKEN[agent.chain];\n const wethTokenAddress = WETH_TOKEN[agent.chain];\n\n if (methTokenAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `mETH not available on ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n // Use OpenOcean aggregator to swap mETH -> WETH\n const result = await swapOnOpenOcean(\n agent,\n methTokenAddress as Address,\n wethTokenAddress as Address,\n amount,\n slippage.toString(),\n );\n\n return result.txHash as Hex;\n}\n","// PikePerps - Perpetual Trading on Mantle Network\n// Supports long/short positions with up to 100x leverage\n// Uses BondingCurveMarket for meme token pricing\n\n// PerpetualTrading contract addresses\nexport const PERPETUAL_TRADING = {\n mainnet: \"0x0000000000000000000000000000000000000000\" as const, // Not deployed yet\n testnet: \"0x8081b646f349c049f2d5e8a400057d411dd657bd\" as const,\n} as const;\n\n// BondingCurveMarket for price feeds\nexport const BONDING_CURVE_MARKET = {\n mainnet: \"0x0000000000000000000000000000000000000000\" as const,\n testnet: \"0x93b268325A9862645c82b32229f3B52264750Ca2\" as const,\n} as const;\n\n// Trading configuration\nexport const PIKE_PERPS_CONFIG = {\n MAX_LEVERAGE: 100,\n DEFAULT_LEVERAGE: 10,\n MIN_LEVERAGE: 1,\n TRADING_FEE_BPS: 5, // 0.05%\n LIQUIDATION_REWARD_BPS: 500, // 5%\n PRICE_DECIMALS: 8, // Prices are scaled by 1e8\n} as const;\n\n// PerpetualTrading ABI\nexport const PERPETUAL_TRADING_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"_pyth\", type: \"address\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"uint256\", name: \"positionId\", type: \"uint256\" },\n { indexed: true, internalType: \"address\", name: \"user\", type: \"address\" },\n { indexed: false, internalType: \"uint256\", name: \"pnl\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"exitPrice\", type: \"uint256\" },\n ],\n name: \"PositionClosed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"uint256\", name: \"positionId\", type: \"uint256\" },\n { indexed: true, internalType: \"address\", name: \"user\", type: \"address\" },\n { indexed: false, internalType: \"uint256\", name: \"liquidationPrice\", type: \"uint256\" },\n ],\n name: \"PositionLiquidated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"uint256\", name: \"positionId\", type: \"uint256\" },\n { indexed: true, internalType: \"address\", name: \"user\", type: \"address\" },\n { indexed: true, internalType: \"address\", name: \"token\", type: \"address\" },\n { indexed: false, internalType: \"bool\", name: \"isLong\", type: \"bool\" },\n { indexed: false, internalType: \"uint256\", name: \"size\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"margin\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"leverage\", type: \"uint256\" },\n { indexed: false, internalType: \"uint256\", name: \"entryPrice\", type: \"uint256\" },\n ],\n name: \"PositionOpened\",\n type: \"event\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"closePosition\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"getCurrentPrice\",\n outputs: [\n { internalType: \"uint256\", name: \"currentPrice\", type: \"uint256\" },\n { internalType: \"bool\", name: \"hasPrice\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"getLiquidationPrice\",\n outputs: [{ internalType: \"uint256\", name: \"liquidationPrice\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"getPosition\",\n outputs: [\n {\n components: [\n { internalType: \"address\", name: \"user\", type: \"address\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"bool\", name: \"isLong\", type: \"bool\" },\n { internalType: \"uint256\", name: \"size\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"margin\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"leverage\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"entryPrice\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"entryTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"lastFundingTime\", type: \"uint256\" },\n { internalType: \"bool\", name: \"isOpen\", type: \"bool\" },\n ],\n internalType: \"struct PerpetualTrading.Position\",\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"getPositionPnL\",\n outputs: [\n { internalType: \"uint256\", name: \"pnl\", type: \"uint256\" },\n { internalType: \"bool\", name: \"isProfit\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_user\", type: \"address\" }],\n name: \"getUserPositions\",\n outputs: [{ internalType: \"uint256[]\", name: \"\", type: \"uint256[]\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"liquidatePosition\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"maxLeverage\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"minMarginBps\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextPositionId\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"_token\", type: \"address\" },\n { internalType: \"bool\", name: \"_isLong\", type: \"bool\" },\n { internalType: \"uint256\", name: \"_margin\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"_leverage\", type: \"uint256\" },\n ],\n name: \"openPosition\",\n outputs: [{ internalType: \"uint256\", name: \"positionId\", type: \"uint256\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_positionId\", type: \"uint256\" }],\n name: \"shouldLiquidate\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"tradingFeeBps\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// BondingCurveMarket ABI (for price queries)\nexport const BONDING_CURVE_MARKET_ABI = [\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"getCurrentPrice\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"isListed\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"_token\", type: \"address\" }],\n name: \"getCurveProgress\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PERPETUAL_TRADING,\n PERPETUAL_TRADING_ABI,\n PIKE_PERPS_CONFIG,\n} from \"../../constants/pikeperps\";\n\nexport interface OpenPositionResult {\n positionId: bigint;\n txHash: Hex;\n}\n\n/**\n * Open a long position on PikePerps\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100)\n * @returns Position ID and transaction hash\n */\nexport async function pikeperpsOpenLong(\n agent: MNTAgentKit,\n tokenAddress: Address,\n margin: string,\n leverage: number = PIKE_PERPS_CONFIG.DEFAULT_LEVERAGE,\n): Promise<OpenPositionResult> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Validate leverage\n if (leverage < PIKE_PERPS_CONFIG.MIN_LEVERAGE || leverage > PIKE_PERPS_CONFIG.MAX_LEVERAGE) {\n throw new Error(\n `Leverage must be between ${PIKE_PERPS_CONFIG.MIN_LEVERAGE} and ${PIKE_PERPS_CONFIG.MAX_LEVERAGE}`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return {\n positionId: BigInt(Math.floor(Math.random() * 1000)),\n txHash: \"0xdemo_open_long_tx_hash\" as Hex,\n };\n }\n\n const marginBigInt = BigInt(margin);\n\n // Encode function call\n const data = encodeFunctionData({\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"openPosition\",\n args: [tokenAddress, true, marginBigInt, BigInt(leverage)],\n });\n\n // Send transaction with margin as value\n const txHash = await agent.client.sendTransaction({\n to: perpetualTradingAddress,\n data,\n value: marginBigInt,\n });\n\n // Wait for receipt to get position ID from events\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n // Parse PositionOpened event to get position ID\n let positionId = 0n;\n for (const log of receipt.logs) {\n try {\n // PositionOpened event topic\n if (log.topics[0] === \"0x2e5b0e8c5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5\") {\n positionId = BigInt(log.topics[1] || \"0\");\n break;\n }\n } catch {\n // Continue if parsing fails\n }\n }\n\n // If we couldn't parse the event, try to get next position ID - 1\n if (positionId === 0n) {\n try {\n const nextId = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"nextPositionId\",\n })) as bigint;\n positionId = nextId - 1n;\n } catch {\n // Position ID unknown\n }\n }\n\n return {\n positionId,\n txHash,\n };\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PERPETUAL_TRADING,\n PERPETUAL_TRADING_ABI,\n PIKE_PERPS_CONFIG,\n} from \"../../constants/pikeperps\";\n\nexport interface OpenPositionResult {\n positionId: bigint;\n txHash: Hex;\n}\n\n/**\n * Open a short position on PikePerps\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100)\n * @returns Position ID and transaction hash\n */\nexport async function pikeperpsOpenShort(\n agent: MNTAgentKit,\n tokenAddress: Address,\n margin: string,\n leverage: number = PIKE_PERPS_CONFIG.DEFAULT_LEVERAGE,\n): Promise<OpenPositionResult> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Validate leverage\n if (leverage < PIKE_PERPS_CONFIG.MIN_LEVERAGE || leverage > PIKE_PERPS_CONFIG.MAX_LEVERAGE) {\n throw new Error(\n `Leverage must be between ${PIKE_PERPS_CONFIG.MIN_LEVERAGE} and ${PIKE_PERPS_CONFIG.MAX_LEVERAGE}`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return {\n positionId: BigInt(Math.floor(Math.random() * 1000)),\n txHash: \"0xdemo_open_short_tx_hash\" as Hex,\n };\n }\n\n const marginBigInt = BigInt(margin);\n\n // Encode function call - isLong = false for short\n const data = encodeFunctionData({\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"openPosition\",\n args: [tokenAddress, false, marginBigInt, BigInt(leverage)],\n });\n\n // Send transaction with margin as value\n const txHash = await agent.client.sendTransaction({\n to: perpetualTradingAddress,\n data,\n value: marginBigInt,\n });\n\n // Wait for receipt to get position ID from events\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n // Parse PositionOpened event to get position ID\n let positionId = 0n;\n for (const log of receipt.logs) {\n try {\n // PositionOpened event topic\n if (log.topics[0] === \"0x2e5b0e8c5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5e5f5d55d89e89f5b5d5\") {\n positionId = BigInt(log.topics[1] || \"0\");\n break;\n }\n } catch {\n // Continue if parsing fails\n }\n }\n\n // If we couldn't parse the event, try to get next position ID - 1\n if (positionId === 0n) {\n try {\n const nextId = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"nextPositionId\",\n })) as bigint;\n positionId = nextId - 1n;\n } catch {\n // Position ID unknown\n }\n }\n\n return {\n positionId,\n txHash,\n };\n}\n","import { type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { PERPETUAL_TRADING, PERPETUAL_TRADING_ABI } from \"../../constants/pikeperps\";\n\n/**\n * Close an existing position on PikePerps\n * @param agent - MNTAgentKit instance\n * @param positionId - Position ID to close\n * @returns Transaction hash\n */\nexport async function pikeperpsClosePosition(\n agent: MNTAgentKit,\n positionId: bigint,\n): Promise<Hex> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return \"0xdemo_close_position_tx_hash\" as Hex;\n }\n\n // Encode function call\n const data = encodeFunctionData({\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"closePosition\",\n args: [positionId],\n });\n\n // Send transaction\n const txHash = await agent.client.sendTransaction({\n to: perpetualTradingAddress,\n data,\n });\n\n // Wait for confirmation\n await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n","import { type Address, type Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { PERPETUAL_TRADING, PERPETUAL_TRADING_ABI } from \"../../constants/pikeperps\";\n\nexport interface PikePerpsPosition {\n positionId: bigint;\n token: Address;\n isLong: boolean;\n size: bigint;\n margin: bigint;\n leverage: number;\n entryPrice: bigint;\n entryTime: bigint;\n currentPrice: bigint;\n pnl: bigint;\n isProfit: boolean;\n liquidationPrice: bigint;\n isOpen: boolean;\n}\n\ninterface RawPosition {\n user: Address;\n token: Address;\n isLong: boolean;\n size: bigint;\n margin: bigint;\n leverage: bigint;\n entryPrice: bigint;\n entryTime: bigint;\n lastFundingTime: bigint;\n isOpen: boolean;\n}\n\n/**\n * Get all positions for a user on PikePerps\n * Returns detailed position data including PnL and liquidation prices\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with PnL and liquidation data\n */\nexport async function pikeperpsGetPositions(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<PikePerpsPosition[]> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return [\n {\n positionId: 1n,\n token: \"0x0000000000000000000000000000000000000001\" as Address,\n isLong: true,\n size: BigInt(\"1000000000000000000\"), // 1 ETH equivalent\n margin: BigInt(\"100000000000000000\"), // 0.1 ETH\n leverage: 10,\n entryPrice: BigInt(\"100000000\"), // $1.00 scaled by 1e8\n entryTime: BigInt(Math.floor(Date.now() / 1000) - 3600),\n currentPrice: BigInt(\"110000000\"), // $1.10\n pnl: BigInt(\"10000000000000000\"), // 0.01 ETH profit\n isProfit: true,\n liquidationPrice: BigInt(\"90000000\"), // $0.90\n isOpen: true,\n },\n ];\n }\n\n // Get all position IDs for user\n const positionIds = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getUserPositions\",\n args: [address],\n })) as bigint[];\n\n if (positionIds.length === 0) {\n return [];\n }\n\n const positions: PikePerpsPosition[] = [];\n\n // Fetch each position's details\n for (const positionId of positionIds) {\n try {\n // Get position details\n const rawPosition = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getPosition\",\n args: [positionId],\n })) as RawPosition;\n\n // Skip closed positions\n if (!rawPosition.isOpen) {\n continue;\n }\n\n // Get PnL\n const [pnl, isProfit] = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getPositionPnL\",\n args: [positionId],\n })) as [bigint, boolean];\n\n // Get liquidation price\n const liquidationPrice = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getLiquidationPrice\",\n args: [positionId],\n })) as bigint;\n\n // Get current price\n let currentPrice = 0n;\n try {\n const [price, hasPrice] = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getCurrentPrice\",\n args: [rawPosition.token],\n })) as [bigint, boolean];\n if (hasPrice) {\n currentPrice = price;\n }\n } catch {\n // Use entry price if current price unavailable\n currentPrice = rawPosition.entryPrice;\n }\n\n positions.push({\n positionId,\n token: rawPosition.token,\n isLong: rawPosition.isLong,\n size: rawPosition.size,\n margin: rawPosition.margin,\n leverage: Number(rawPosition.leverage),\n entryPrice: rawPosition.entryPrice,\n entryTime: rawPosition.entryTime,\n currentPrice,\n pnl,\n isProfit,\n liquidationPrice,\n isOpen: rawPosition.isOpen,\n });\n } catch (error) {\n console.warn(`Failed to fetch position ${positionId}:`, error);\n }\n }\n\n return positions;\n}\n","import { type Address, type Hex, parseAbiItem } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n PERPETUAL_TRADING,\n PERPETUAL_TRADING_ABI,\n BONDING_CURVE_MARKET,\n BONDING_CURVE_MARKET_ABI,\n} from \"../../constants/pikeperps\";\n\nexport interface PikePerpsTrade {\n positionId: bigint;\n trader: Address;\n token: Address;\n isLong: boolean;\n size: bigint;\n margin: bigint;\n leverage: bigint;\n entryPrice: bigint;\n timestamp: number;\n txHash: Hex;\n blockNumber: bigint;\n}\n\nexport interface PikePerpsMarketData {\n token: Address;\n currentPrice: bigint;\n hasPrice: boolean;\n isListed: boolean;\n curveProgress: bigint; // Percentage of tokens sold (0-10000)\n recentTrades: PikePerpsTrade[];\n}\n\n/**\n * Get market data for a token on PikePerps\n * Returns current price and recent trades\n * @param agent - MNTAgentKit instance\n * @param tokenAddress - Token address to get market data for\n * @param limit - Maximum number of recent trades to return (default 20)\n * @returns Market data with price and recent trades\n */\nexport async function pikeperpsGetMarketData(\n agent: MNTAgentKit,\n tokenAddress: Address,\n limit: number = 20,\n): Promise<PikePerpsMarketData> {\n const perpetualTradingAddress = PERPETUAL_TRADING[agent.chain];\n const bondingCurveAddress = BONDING_CURVE_MARKET[agent.chain];\n\n if (perpetualTradingAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `PikePerps not available on ${agent.chain}. Only available on testnet.`,\n );\n }\n\n // Demo mode\n if (agent.demo) {\n return {\n token: tokenAddress,\n currentPrice: BigInt(\"100000000\"), // $1.00 scaled by 1e8\n hasPrice: true,\n isListed: true,\n curveProgress: BigInt(\"5000\"), // 50%\n recentTrades: [\n {\n positionId: 1n,\n trader: \"0x0000000000000000000000000000000000000001\" as Address,\n token: tokenAddress,\n isLong: true,\n size: BigInt(\"1000000000000000000\"),\n margin: BigInt(\"100000000000000000\"),\n leverage: 10n,\n entryPrice: BigInt(\"100000000\"),\n timestamp: Math.floor(Date.now() / 1000) - 300,\n txHash: \"0xdemo_trade_hash\" as Hex,\n blockNumber: 1000n,\n },\n ],\n };\n }\n\n // Get current price from perpetual trading contract\n let currentPrice = 0n;\n let hasPrice = false;\n try {\n const [price, hasPriceResult] = (await agent.client.readContract({\n address: perpetualTradingAddress,\n abi: PERPETUAL_TRADING_ABI,\n functionName: \"getCurrentPrice\",\n args: [tokenAddress],\n })) as [bigint, boolean];\n currentPrice = price;\n hasPrice = hasPriceResult;\n } catch {\n // Price unavailable\n }\n\n // Check if token is listed on bonding curve\n let isListed = false;\n let curveProgress = 0n;\n if (bondingCurveAddress !== \"0x0000000000000000000000000000000000000000\") {\n try {\n isListed = (await agent.client.readContract({\n address: bondingCurveAddress,\n abi: BONDING_CURVE_MARKET_ABI,\n functionName: \"isListed\",\n args: [tokenAddress],\n })) as boolean;\n\n if (isListed) {\n curveProgress = (await agent.client.readContract({\n address: bondingCurveAddress,\n abi: BONDING_CURVE_MARKET_ABI,\n functionName: \"getCurveProgress\",\n args: [tokenAddress],\n })) as bigint;\n }\n } catch {\n // Bonding curve data unavailable\n }\n }\n\n // Get recent trades from PositionOpened events\n const recentTrades: PikePerpsTrade[] = [];\n try {\n // Get recent blocks (last ~1000 blocks)\n const currentBlock = await agent.client.getBlockNumber();\n const fromBlock = currentBlock > 1000n ? currentBlock - 1000n : 0n;\n\n const logs = await agent.client.getLogs({\n address: perpetualTradingAddress,\n event: parseAbiItem(\n \"event PositionOpened(uint256 indexed positionId, address indexed user, address indexed token, bool isLong, uint256 size, uint256 margin, uint256 leverage, uint256 entryPrice)\",\n ),\n args: {\n token: tokenAddress,\n },\n fromBlock,\n toBlock: currentBlock,\n });\n\n // Get block timestamps for each trade\n const blockCache = new Map<bigint, number>();\n\n for (const log of logs.slice(-limit)) {\n let timestamp = 0;\n if (!blockCache.has(log.blockNumber)) {\n try {\n const block = await agent.client.getBlock({\n blockNumber: log.blockNumber,\n });\n timestamp = Number(block.timestamp);\n blockCache.set(log.blockNumber, timestamp);\n } catch {\n timestamp = Math.floor(Date.now() / 1000);\n }\n } else {\n timestamp = blockCache.get(log.blockNumber) || 0;\n }\n\n recentTrades.push({\n positionId: BigInt(log.topics[1] || \"0\"),\n trader: log.topics[2] as Address,\n token: tokenAddress,\n isLong: log.args.isLong || false,\n size: log.args.size || 0n,\n margin: log.args.margin || 0n,\n leverage: log.args.leverage || 0n,\n entryPrice: log.args.entryPrice || 0n,\n timestamp,\n txHash: log.transactionHash,\n blockNumber: log.blockNumber,\n });\n }\n } catch (error) {\n console.warn(\"Failed to fetch recent trades:\", error);\n }\n\n return {\n token: tokenAddress,\n currentPrice,\n hasPrice,\n isListed,\n curveProgress,\n recentTrades,\n };\n}\n","// Pyth Network Oracle contract addresses on Mantle Network\n// Official docs: https://docs.pyth.network/price-feeds/contract-addresses/evm\n// Pyth provides low-latency, pull-based price feeds for DeFi applications\n\n// Pyth Oracle Contract - Main contract for price feeds\nexport const PYTH_CONTRACT = {\n mainnet: \"0xA2aa501b19aff244D90cc15a4Cf739D2725B5729\" as const,\n testnet: \"0x98046Bd286715D3B0BC227Dd7a956b83D8978603\" as const,\n} as const;\n\n// Hermes API endpoints for fetching price update data\nexport const HERMES_ENDPOINT = {\n mainnet: \"https://hermes.pyth.network\",\n testnet: \"https://hermes.pyth.network\",\n} as const;\n\n// Pyth Price Feed IDs (hex strings without 0x prefix)\n// Full list: https://pyth.network/developers/price-feed-ids\nexport const PYTH_PRICE_FEED_IDS = {\n // === Major Cryptocurrencies ===\n \"BTC/USD\": \"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43\",\n \"ETH/USD\": \"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace\",\n \"SOL/USD\": \"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d\",\n \"BNB/USD\": \"2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f\",\n \"XRP/USD\": \"ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8\",\n \"ADA/USD\": \"2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d\",\n \"DOGE/USD\": \"dcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c\",\n \"DOT/USD\": \"ca3eed9b267293f6595901c734c7525ce8ef49adafe8284571c8e17d6c926346\",\n \"AVAX/USD\": \"93da3352f9f1d105fdfe4971cfa80e9dd777bfc5d0f683ebb6e1294b92137bb7\",\n \"MATIC/USD\": \"5de33440f6b7d0d7d70f0a7b2a6c0e0b8e5d2f7c8a9b0c1d2e3f4a5b6c7d8e9f\",\n \"LINK/USD\": \"8ac0c70fff57e9aefdf5edf44b51d62c2d433653cbb2cf5cc06bb115af04d221\",\n \"ATOM/USD\": \"b00b60f88b03a6a625a8d1c048c3f66653edf217439cb6a1cbab0c1c5e8c52bd\",\n \"LTC/USD\": \"6e3f3fa8253588df9326580180233eb791e03b443a3ba7a1d892e73874e19a54\",\n \"UNI/USD\": \"78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501\",\n \"NEAR/USD\": \"c415de8d2eba7db216527dff4b60e8f3a5311c740dadb233e13e12547e226750\",\n \"TRX/USD\": \"67aed5a24fdad045475e7195c98a98aea119c763f272d4523f5bac93a4f33c2b\",\n\n // === Layer 2 & Scaling ===\n \"ARB/USD\": \"3fa4252848f9f0a1480be62745a4629d9eb1322aebab8a791e344b3b9c1adcf5\",\n \"OP/USD\": \"385f64d993f7b77d8182ed5003d97c60aa3361f3cecfe711544d2d59165e9bdf\",\n \"MNT/USD\": \"4e3037c822d852d79af3ac80e35eb420ee3b870dca49f9344a38ef4773fb0585\",\n \"IMX/USD\": \"941320a8989414a6d2c757c8c6c52b3e7e0b7e4e4c5bb8a3c8e7a0f3e0f0f0f0\",\n \"STRK/USD\": \"6a182399ff70ccf3e06024898942028204125a819e519a335ffa4579e66cd870\",\n\n // === DeFi Tokens ===\n \"AAVE/USD\": \"2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445\",\n \"CRV/USD\": \"a19d04ac696c7a6616d291c7e5d1377cc8be437c327b75adb5dc1bad745fcae8\",\n \"MKR/USD\": \"9375299e31c0deb9c6bc378e6329aab44cb48ec655552a70d4b9050346a30378\",\n \"SNX/USD\": \"39d020f60982ed892abbcd4a06a276a9f9b7bfbce003204c110b6e488f502da3\",\n \"COMP/USD\": \"4a8e42861cabc5ecb50996f92e7cfa2bce3fd0a2423b0c44c9b423fb2bd25478\",\n \"LDO/USD\": \"c63e2a7f37a04e5e614c07238bedb25dcc38927e77a90a4b21a7a2e1d7f0d2e3\",\n \"1INCH/USD\": \"63f341689d98a12ef60a5cff1d7f85c70a9e17bf1575f0e7c0b2512d48b1c8b3\",\n \"SUSHI/USD\": \"26e4f737fde0263a9eea10ae63ac36dcedab2aaf629f1e31a28a28dd0e0d2b0c\",\n \"YFI/USD\": \"425f4b198ab2504936886c1e93511bb6720fbcf2045a4f3c0723bb213846022f\",\n \"BAL/USD\": \"07ad7b4a7662d19a6bc675f6b467172d2f3947fa653ca97555a9b20236406628\",\n \"CAKE/USD\": \"2356af9529a1064d1d2a2e3e4ab6d6e6f6e6f6e6f6e6f6e6f6e6f6e6f6e6f6e6\",\n \"GMX/USD\": \"b962539d0fcb272a494d65ea56f94851c2bcf8823935da05bd628916e2e9edbf\",\n \"PENDLE/USD\": \"9a4df90b25497f66b1afb012467e316e801ca3d839456db028892fe8c70c8016\",\n \"JOE/USD\": \"1e8a156c8a23c1e56f2d9d7f0e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e\",\n\n // === Stablecoins ===\n \"USDC/USD\": \"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a\",\n \"USDT/USD\": \"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b\",\n \"DAI/USD\": \"b0948a5e5313200c632b51bb5ca32f6de0d36e9950a942d19751e833f70dabfd\",\n \"FRAX/USD\": \"c3d5d8d6d0c0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0\",\n \"BUSD/USD\": \"5bc91f13e412c07599167bae86f07543f076a638962b8d6017ec19dab4a82814\",\n \"TUSD/USD\": \"433faaa801ecda2c0bbfa8f4e2d85fd4c310e2c1e5f8f8e6e5f5f5f5f5f5f5f5\",\n \"LUSD/USD\": \"d892ae586f4e0fbeee4d64f29ed6e89b1b3e2e2e2e2e2e2e2e2e2e2e2e2e2e2e\",\n\n // === Wrapped & LST Tokens ===\n \"WETH/USD\": \"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace\",\n \"WBTC/USD\": \"c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33\",\n \"stETH/USD\": \"846ae1bdb6300b817cee5fdee2a6da192775030db5615b94a465f53bd40850b5\",\n \"cbETH/USD\": \"15ecddd26d49e1a8f1de9376ebebc03916ede873447c1255d2d5891b92ce5717\",\n \"rETH/USD\": \"a0255134973f4fdf2f8f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f\",\n \"mETH/USD\": \"4c9c6f9f0cde13fced52dc1927c8c06a91b1a65ab77b9e1ec1c614963ce90dd4\",\n \"wstETH/USD\": \"6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784\",\n\n // === Meme Coins ===\n \"SHIB/USD\": \"f0d57deca57b3da2fe63a493f4c25925fdfd8edf834b20f93e1f84dbd1504d4a\",\n \"PEPE/USD\": \"d69731a2e74ac1ce884fc3890f7ee324b6deb66147055249568869ed700882e4\",\n \"FLOKI/USD\": \"6b1381ce7e874dc5410b197ac8348162c0dd6c0d4c9cd6322c28a6f7f4d1a2d2\",\n \"BONK/USD\": \"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419\",\n \"WIF/USD\": \"4ca4beeca86f0d164160323817a4e42b10010a724c2217c6ee41b54cd4cc61fc\",\n\n // === Gaming & Metaverse ===\n \"AXS/USD\": \"b0d8f5e3f3a7c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0\",\n \"SAND/USD\": \"f4040ec3e5b71c241a7e1a9a1e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e\",\n \"MANA/USD\": \"2b15e4bded7f5e5d5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a\",\n \"GALA/USD\": \"e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3\",\n \"APE/USD\": \"15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c864\",\n \"ENJ/USD\": \"5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a\",\n\n // === Infrastructure & Oracles ===\n \"FIL/USD\": \"150ac9b959aee0051e4091f0ef5216d941f590e1c5e7f91cf7635b5c11628c0e\",\n \"GRT/USD\": \"4d1f8dae0d96236fb98e8f47571a70f41c8b8f2f6d6c0e0e0e0e0e0e0e0e0e0e\",\n \"RNDR/USD\": \"ab7347771135fc733f8f38db462ba085ed3309955f42554a14fa13e855ac0e2f\",\n \"INJ/USD\": \"7a5bc1d2b56ad029048cd63964b3ad2776eadf812edc1a43a31406cb54bff592\",\n \"AR/USD\": \"8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c\",\n \"THETA/USD\": \"4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a\",\n \"PYTH/USD\": \"0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff\",\n\n // === AI & Data ===\n \"FET/USD\": \"b49ee9d8ccf9b6e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0\",\n \"OCEAN/USD\": \"2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d\",\n \"TAO/USD\": \"410f41de235f2dbdf41f1a808c1e15f6a9e7d6a7b8c9d0e1f2a3b4c5d6e7f8a9\",\n\n // === Exchange Tokens ===\n \"FTT/USD\": \"6c75e52531ec5fd3ef253f6062956a8508a2f03fa0a209fb7dbc0d0f3d6f6f6f\",\n \"CRO/USD\": \"b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7\",\n \"OKB/USD\": \"23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744\",\n\n // === Forex Pairs ===\n \"EUR/USD\": \"a995d00bb36a63cef7fd2c287dc105fc8f3d93779f062f09551b0af3e81ec30b\",\n \"GBP/USD\": \"84c2dde9633d93d1bcad84e7dc41c9d56578b7ec52fabedc1f335d673df0a7c1\",\n \"JPY/USD\": \"ef2c98c804ba503c6a707e38be4dfbb16683775f195b091252bf24693042fd52\",\n \"AUD/USD\": \"67a6f93030f4217f2e8f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f\",\n \"CAD/USD\": \"9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a\",\n\n // === Commodities ===\n \"XAU/USD\": \"765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2\",\n \"XAG/USD\": \"f2fb02c32b055c805e7238d628e5e9dadef274376114eb1f012337cabe93871e\",\n \"WTI/USD\": \"c9c8e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9\",\n \"BRENT/USD\": \"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8\",\n\n // === US Equities ===\n \"AAPL/USD\": \"49f6b65cb1de6b10eaf75e7c03ca029c306d0357e91b5311b175084a5ad55688\",\n \"NVDA/USD\": \"b1073854ed24cbc755dc527418f52b7d271f6cc967bbf8d8129112b18860a593\",\n \"TSLA/USD\": \"16dad506d7db8da01c87581c87ca897a012a153557d4d578c3b9c9e1bc0632f1\",\n \"GOOGL/USD\": \"b7e3904c08ddd9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0\",\n \"AMZN/USD\": \"c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6\",\n \"MSFT/USD\": \"d0ca23c1cc005e004ccf1db5bf76aeb6a49218f43dac3d4b275e92de12ea4b77\",\n \"META/USD\": \"a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4\",\n \"COIN/USD\": \"9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b\",\n \"SPY/USD\": \"19e09bb805456ada3979a7d1cbb4b6d63babc3a0f8e8a9b3c4d5e6f7a8b9c0d1\",\n \"QQQ/USD\": \"2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e\",\n} as const;\n\n// IPyth interface ABI for interacting with Pyth contract\nexport const PYTH_ABI = [\n {\n inputs: [{ name: \"id\", type: \"bytes32\" }],\n name: \"getPrice\",\n outputs: [\n {\n components: [\n { name: \"price\", type: \"int64\" },\n { name: \"conf\", type: \"uint64\" },\n { name: \"expo\", type: \"int32\" },\n { name: \"publishTime\", type: \"uint256\" },\n ],\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"id\", type: \"bytes32\" }],\n name: \"getPriceNoOlderThan\",\n outputs: [\n {\n components: [\n { name: \"price\", type: \"int64\" },\n { name: \"conf\", type: \"uint64\" },\n { name: \"expo\", type: \"int32\" },\n { name: \"publishTime\", type: \"uint256\" },\n ],\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"id\", type: \"bytes32\" },\n { name: \"age\", type: \"uint256\" },\n ],\n name: \"getPriceNoOlderThan\",\n outputs: [\n {\n components: [\n { name: \"price\", type: \"int64\" },\n { name: \"conf\", type: \"uint64\" },\n { name: \"expo\", type: \"int32\" },\n { name: \"publishTime\", type: \"uint256\" },\n ],\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"id\", type: \"bytes32\" }],\n name: \"getPriceUnsafe\",\n outputs: [\n {\n components: [\n { name: \"price\", type: \"int64\" },\n { name: \"conf\", type: \"uint64\" },\n { name: \"expo\", type: \"int32\" },\n { name: \"publishTime\", type: \"uint256\" },\n ],\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"id\", type: \"bytes32\" }],\n name: \"getEmaPrice\",\n outputs: [\n {\n components: [\n { name: \"price\", type: \"int64\" },\n { name: \"conf\", type: \"uint64\" },\n { name: \"expo\", type: \"int32\" },\n { name: \"publishTime\", type: \"uint256\" },\n ],\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"updateData\", type: \"bytes[]\" }],\n name: \"updatePriceFeeds\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"updateData\", type: \"bytes[]\" }],\n name: \"getUpdateFee\",\n outputs: [{ name: \"feeAmount\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"id\", type: \"bytes32\" }],\n name: \"priceFeedExists\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"updateData\", type: \"bytes[]\" },\n { name: \"priceIds\", type: \"bytes32[]\" },\n { name: \"minPublishTime\", type: \"uint64\" },\n { name: \"maxPublishTime\", type: \"uint64\" },\n ],\n name: \"parsePriceFeedUpdates\",\n outputs: [\n {\n components: [\n { name: \"id\", type: \"bytes32\" },\n {\n components: [\n { name: \"price\", type: \"int64\" },\n { name: \"conf\", type: \"uint64\" },\n { name: \"expo\", type: \"int32\" },\n { name: \"publishTime\", type: \"uint256\" },\n ],\n name: \"price\",\n type: \"tuple\",\n },\n {\n components: [\n { name: \"price\", type: \"int64\" },\n { name: \"conf\", type: \"uint64\" },\n { name: \"expo\", type: \"int32\" },\n { name: \"publishTime\", type: \"uint256\" },\n ],\n name: \"emaPrice\",\n type: \"tuple\",\n },\n ],\n name: \"\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\n// Type for price data returned from Pyth\nexport interface PythPriceData {\n price: bigint;\n conf: bigint;\n expo: number;\n publishTime: bigint;\n}\n\n// Type for formatted price response\nexport interface PythPriceResponse {\n priceFeedId: string;\n pair: string;\n price: string;\n confidence: string;\n exponent: number;\n publishTime: number;\n formattedPrice: string;\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport {\n PYTH_CONTRACT,\n PYTH_ABI,\n PYTH_PRICE_FEED_IDS,\n type PythPriceResponse,\n} from \"../../constants/pyth\";\n\n/**\n * Get price data from Pyth Network for a specific price feed\n * @param agent - MNTAgentKit instance\n * @param priceFeedIdOrPair - Either a price feed ID (hex string) or a pair name like \"ETH/USD\"\n * @returns Price data with formatted price\n */\nexport async function pythGetPrice(\n agent: MNTAgentKit,\n priceFeedIdOrPair: string,\n): Promise<PythPriceResponse> {\n const pythAddress = PYTH_CONTRACT[agent.chain];\n\n // Resolve price feed ID from pair name if needed\n let priceFeedId = priceFeedIdOrPair;\n let pair = priceFeedIdOrPair;\n\n // Check if it's a known pair name\n if (priceFeedIdOrPair in PYTH_PRICE_FEED_IDS) {\n priceFeedId =\n PYTH_PRICE_FEED_IDS[priceFeedIdOrPair as keyof typeof PYTH_PRICE_FEED_IDS];\n pair = priceFeedIdOrPair;\n } else {\n // Try to find pair name from ID\n const foundPair = Object.entries(PYTH_PRICE_FEED_IDS).find(\n ([, id]) => id === priceFeedIdOrPair.replace(\"0x\", \"\"),\n );\n if (foundPair) {\n pair = foundPair[0];\n }\n }\n\n // Ensure the price feed ID has 0x prefix\n const feedId = priceFeedId.startsWith(\"0x\") ? priceFeedId : `0x${priceFeedId}`;\n\n // Demo mode\n if (agent.demo) {\n return createMockPythResponse(pair, feedId);\n }\n\n try {\n // Get price from Pyth contract (getPriceUnsafe doesn't require staleness check)\n const priceData = (await agent.client.readContract({\n address: pythAddress,\n abi: PYTH_ABI,\n functionName: \"getPriceUnsafe\",\n args: [feedId as `0x${string}`],\n })) as { price: bigint; conf: bigint; expo: number; publishTime: bigint };\n\n const price = Number(priceData.price);\n const confidence = Number(priceData.conf);\n const exponent = priceData.expo;\n const publishTime = Number(priceData.publishTime);\n\n // Format the price with the exponent\n const formattedPrice = formatPythPrice(price, exponent);\n\n return {\n priceFeedId: feedId,\n pair,\n price: priceData.price.toString(),\n confidence: priceData.conf.toString(),\n exponent,\n publishTime,\n formattedPrice,\n };\n } catch (error) {\n throw new Error(\n `Failed to fetch price from Pyth: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Get EMA (Exponential Moving Average) price from Pyth\n * @param agent - MNTAgentKit instance\n * @param priceFeedIdOrPair - Either a price feed ID or pair name\n * @returns EMA price data\n */\nexport async function pythGetEmaPrice(\n agent: MNTAgentKit,\n priceFeedIdOrPair: string,\n): Promise<PythPriceResponse> {\n const pythAddress = PYTH_CONTRACT[agent.chain];\n\n // Resolve price feed ID\n let priceFeedId = priceFeedIdOrPair;\n let pair = priceFeedIdOrPair;\n\n if (priceFeedIdOrPair in PYTH_PRICE_FEED_IDS) {\n priceFeedId =\n PYTH_PRICE_FEED_IDS[priceFeedIdOrPair as keyof typeof PYTH_PRICE_FEED_IDS];\n pair = priceFeedIdOrPair;\n }\n\n const feedId = priceFeedId.startsWith(\"0x\") ? priceFeedId : `0x${priceFeedId}`;\n\n if (agent.demo) {\n return createMockPythResponse(pair, feedId);\n }\n\n try {\n const priceData = (await agent.client.readContract({\n address: pythAddress,\n abi: PYTH_ABI,\n functionName: \"getEmaPrice\",\n args: [feedId as `0x${string}`],\n })) as { price: bigint; conf: bigint; expo: number; publishTime: bigint };\n\n const formattedPrice = formatPythPrice(\n Number(priceData.price),\n priceData.expo,\n );\n\n return {\n priceFeedId: feedId,\n pair,\n price: priceData.price.toString(),\n confidence: priceData.conf.toString(),\n exponent: priceData.expo,\n publishTime: Number(priceData.publishTime),\n formattedPrice,\n };\n } catch (error) {\n throw new Error(\n `Failed to fetch EMA price from Pyth: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Format Pyth price with exponent\n */\nfunction formatPythPrice(price: number, exponent: number): string {\n const adjustedPrice = price * Math.pow(10, exponent);\n // Format to reasonable decimal places\n if (adjustedPrice >= 1) {\n return adjustedPrice.toFixed(2);\n } else {\n return adjustedPrice.toFixed(8);\n }\n}\n\n/**\n * Create mock response for demo mode\n */\nfunction createMockPythResponse(pair: string, feedId: string): PythPriceResponse {\n const mockPrices: Record<string, number> = {\n // Major Crypto\n \"BTC/USD\": 97500.0, \"ETH/USD\": 3450.0, \"SOL/USD\": 185.0, \"BNB/USD\": 680.0,\n \"XRP/USD\": 2.35, \"ADA/USD\": 0.95, \"DOGE/USD\": 0.32, \"DOT/USD\": 7.2,\n \"AVAX/USD\": 38.0, \"MATIC/USD\": 0.48, \"LINK/USD\": 22.0, \"ATOM/USD\": 9.5,\n \"LTC/USD\": 105.0, \"UNI/USD\": 13.5, \"NEAR/USD\": 5.2, \"TRX/USD\": 0.25,\n // L2\n \"ARB/USD\": 0.85, \"OP/USD\": 1.95, \"MNT/USD\": 0.85, \"STRK/USD\": 0.45,\n // DeFi\n \"AAVE/USD\": 285.0, \"CRV/USD\": 0.52, \"MKR/USD\": 1850.0, \"SNX/USD\": 2.8,\n \"LDO/USD\": 1.85, \"GMX/USD\": 28.0, \"PENDLE/USD\": 4.2,\n // Stablecoins\n \"USDC/USD\": 1.0, \"USDT/USD\": 1.0, \"DAI/USD\": 1.0,\n // LST\n \"mETH/USD\": 3500.0, \"stETH/USD\": 3450.0, \"wstETH/USD\": 4100.0,\n // Meme\n \"SHIB/USD\": 0.000022, \"PEPE/USD\": 0.000018, \"BONK/USD\": 0.000028, \"WIF/USD\": 1.85,\n // Commodities\n \"XAU/USD\": 2650.0, \"XAG/USD\": 31.0,\n // Forex\n \"EUR/USD\": 1.08, \"GBP/USD\": 1.27, \"JPY/USD\": 0.0067,\n // Equities\n \"AAPL/USD\": 248.0, \"NVDA/USD\": 138.0, \"TSLA/USD\": 385.0, \"MSFT/USD\": 425.0,\n };\n\n const price = mockPrices[pair] || 100.0;\n const decimals = price < 0.01 ? 8 : price < 1 ? 4 : 2;\n\n return {\n priceFeedId: feedId,\n pair,\n price: Math.floor(price * 1e8).toString(),\n confidence: \"50000\",\n exponent: -8,\n publishTime: Math.floor(Date.now() / 1000),\n formattedPrice: price.toFixed(decimals),\n };\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport {\n PYTH_CONTRACT,\n PYTH_ABI,\n PYTH_PRICE_FEED_IDS,\n type PythPriceResponse,\n} from \"../../constants/pyth\";\n\n/**\n * Get multiple prices from Pyth in a single call\n * @param agent - MNTAgentKit instance\n * @param pairs - Array of pair names or price feed IDs\n * @returns Array of price responses\n */\nexport async function pythGetMultiplePrices(\n agent: MNTAgentKit,\n pairs: string[],\n): Promise<PythPriceResponse[]> {\n const pythAddress = PYTH_CONTRACT[agent.chain];\n const results: PythPriceResponse[] = [];\n\n for (const pairOrId of pairs) {\n // Resolve price feed ID\n let priceFeedId = pairOrId;\n let pair = pairOrId;\n\n if (pairOrId in PYTH_PRICE_FEED_IDS) {\n priceFeedId =\n PYTH_PRICE_FEED_IDS[pairOrId as keyof typeof PYTH_PRICE_FEED_IDS];\n pair = pairOrId;\n } else {\n const foundPair = Object.entries(PYTH_PRICE_FEED_IDS).find(\n ([, id]) => id === pairOrId.replace(\"0x\", \"\"),\n );\n if (foundPair) {\n pair = foundPair[0];\n }\n }\n\n const feedId = priceFeedId.startsWith(\"0x\")\n ? priceFeedId\n : `0x${priceFeedId}`;\n\n if (agent.demo) {\n results.push(createMockPythResponse(pair, feedId));\n continue;\n }\n\n try {\n const priceData = (await agent.client.readContract({\n address: pythAddress,\n abi: PYTH_ABI,\n functionName: \"getPriceUnsafe\",\n args: [feedId as `0x${string}`],\n })) as { price: bigint; conf: bigint; expo: number; publishTime: bigint };\n\n const formattedPrice = formatPythPrice(\n Number(priceData.price),\n priceData.expo,\n );\n\n results.push({\n priceFeedId: feedId,\n pair,\n price: priceData.price.toString(),\n confidence: priceData.conf.toString(),\n exponent: priceData.expo,\n publishTime: Number(priceData.publishTime),\n formattedPrice,\n });\n } catch (error) {\n // Continue with other prices even if one fails\n results.push({\n priceFeedId: feedId,\n pair,\n price: \"0\",\n confidence: \"0\",\n exponent: 0,\n publishTime: 0,\n formattedPrice: \"Error fetching price\",\n });\n }\n }\n\n return results;\n}\n\n/**\n * Get all supported Pyth price feed IDs\n * @returns Object mapping pair names to price feed IDs\n */\nexport function pythGetSupportedPriceFeeds(): Record<string, string> {\n return { ...PYTH_PRICE_FEED_IDS };\n}\n\n/**\n * Check if a price feed exists on Pyth\n * @param agent - MNTAgentKit instance\n * @param priceFeedIdOrPair - Price feed ID or pair name\n * @returns Boolean indicating if feed exists\n */\nexport async function pythPriceFeedExists(\n agent: MNTAgentKit,\n priceFeedIdOrPair: string,\n): Promise<boolean> {\n const pythAddress = PYTH_CONTRACT[agent.chain];\n\n let priceFeedId = priceFeedIdOrPair;\n if (priceFeedIdOrPair in PYTH_PRICE_FEED_IDS) {\n priceFeedId =\n PYTH_PRICE_FEED_IDS[priceFeedIdOrPair as keyof typeof PYTH_PRICE_FEED_IDS];\n }\n\n const feedId = priceFeedId.startsWith(\"0x\") ? priceFeedId : `0x${priceFeedId}`;\n\n if (agent.demo) {\n return priceFeedIdOrPair in PYTH_PRICE_FEED_IDS;\n }\n\n try {\n const exists = (await agent.client.readContract({\n address: pythAddress,\n abi: PYTH_ABI,\n functionName: \"priceFeedExists\",\n args: [feedId as `0x${string}`],\n })) as boolean;\n\n return exists;\n } catch {\n return false;\n }\n}\n\nfunction formatPythPrice(price: number, exponent: number): string {\n const adjustedPrice = price * Math.pow(10, exponent);\n if (adjustedPrice >= 1) {\n return adjustedPrice.toFixed(2);\n }\n return adjustedPrice.toFixed(8);\n}\n\nfunction createMockPythResponse(pair: string, feedId: string): PythPriceResponse {\n const mockPrices: Record<string, number> = {\n // Major Crypto\n \"BTC/USD\": 97500.0, \"ETH/USD\": 3450.0, \"SOL/USD\": 185.0, \"BNB/USD\": 680.0,\n \"XRP/USD\": 2.35, \"ADA/USD\": 0.95, \"DOGE/USD\": 0.32, \"DOT/USD\": 7.2,\n \"AVAX/USD\": 38.0, \"MATIC/USD\": 0.48, \"LINK/USD\": 22.0, \"ATOM/USD\": 9.5,\n \"LTC/USD\": 105.0, \"UNI/USD\": 13.5, \"NEAR/USD\": 5.2, \"TRX/USD\": 0.25,\n // L2\n \"ARB/USD\": 0.85, \"OP/USD\": 1.95, \"MNT/USD\": 0.85, \"STRK/USD\": 0.45,\n // DeFi\n \"AAVE/USD\": 285.0, \"CRV/USD\": 0.52, \"MKR/USD\": 1850.0, \"SNX/USD\": 2.8,\n \"LDO/USD\": 1.85, \"GMX/USD\": 28.0, \"PENDLE/USD\": 4.2,\n // Stablecoins\n \"USDC/USD\": 1.0, \"USDT/USD\": 1.0, \"DAI/USD\": 1.0,\n // LST\n \"mETH/USD\": 3500.0, \"stETH/USD\": 3450.0, \"wstETH/USD\": 4100.0,\n // Meme\n \"SHIB/USD\": 0.000022, \"PEPE/USD\": 0.000018, \"BONK/USD\": 0.000028, \"WIF/USD\": 1.85,\n // Commodities\n \"XAU/USD\": 2650.0, \"XAG/USD\": 31.0,\n // Forex\n \"EUR/USD\": 1.08, \"GBP/USD\": 1.27, \"JPY/USD\": 0.0067,\n // Equities\n \"AAPL/USD\": 248.0, \"NVDA/USD\": 138.0, \"TSLA/USD\": 385.0, \"MSFT/USD\": 425.0,\n };\n\n const price = mockPrices[pair] || 100.0;\n const decimals = price < 0.01 ? 8 : price < 1 ? 4 : 2;\n\n return {\n priceFeedId: feedId,\n pair,\n price: Math.floor(price * 1e8).toString(),\n confidence: \"50000\",\n exponent: -8,\n publishTime: Math.floor(Date.now() / 1000),\n formattedPrice: price.toFixed(decimals),\n };\n}\n","// Token & RWA Launchpad Constants for Mantle Network\n\n// Standard ERC20 ABI\nexport const ERC20_ABI = [\n {\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n// Token types\nexport type TokenType = \"standard\" | \"rwa\";\n\n// Token configuration\nexport interface TokenConfig {\n name: string;\n symbol: string;\n supply: string; // Human readable (e.g., \"1000000\" for 1M tokens)\n decimals?: number;\n tokenType?: TokenType;\n // RWA specific fields\n assetType?: string; // e.g., \"Real Estate\", \"Commodities\", \"Securities\"\n assetId?: string; // External asset identifier\n}\n\n// Token deployment result\nexport interface TokenDeploymentResult {\n tokenAddress: string;\n txHash: string;\n name: string;\n symbol: string;\n decimals: number;\n totalSupply: string;\n mintedTo: string;\n tokenType: TokenType;\n assetType?: string;\n assetId?: string;\n}\n\n// Token info\nexport interface TokenInfo {\n address: string;\n name: string;\n symbol: string;\n decimals: number;\n totalSupply: string;\n balance?: string;\n}\n","import { type Hex, encodeAbiParameters, parseAbiParameters, parseUnits } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n type TokenConfig,\n type TokenDeploymentResult,\n type TokenType,\n} from \"../../constants/token-launchpad\";\nimport { DEMO_TX_HASH } from \"../../utils/demo/mockResponses\";\n\n// Optimized ERC20 bytecode - mints total supply to deployer\nconst ERC20_BYTECODE = \"0x608060405234801561001057600080fd5b5060405161089a38038061089a833981016040819052610032916101db565b8251839083906100499060039060208501906100b4565b50805161005d9060049060208401906100b4565b50505061007a33826100756012600a6102eb565b610081565b5050610359565b6001600160a01b0382166100ab5760405163ec442f0560e01b815260006004820152602401604051809103906000fd5b6100b760008383610140565b5050565b8280546100c09061030c565b90600052602060002090601f0160209004810192826100e2576000855561012e565b82601f106100f357805160ff191683800117855561012e565b8280016001018555821561012e579182015b8281111561012e578251825591602001919060010190610105565b5061013a92915061013e565b5090565b5b8082111561013a576000815560010161013f565b6001600160a01b038316610174578060026000828254610160919061034b565b9091555061019f9050565b6001600160a01b0383166000908152602081905260408120805483929061019c908490610346565b90915550505b6001600160a01b0382166101c1576002805482900390556101e6565b6001600160a01b03821660009081526020819052604081208054839290610169908490610346565b816001600160a01b0316836001600160a01b03166000805160206108228339815191528360405161021991815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025757818101518382015260200161023f565b83811115610268576000848401525b50505050565b600082601f83011261027e578081fd5b81516001600160401b038082111561029857610298610226565b604051601f8301601f19908116603f011681019082821181831017156102c0576102c0610226565b816040528381528660208588010111156102d8578485fd5b6102e9846020830160208901610240565b9695505050505050565b60008060006060848603121561030757600080fd5b83516001600160401b038082111561031d578586fd5b6103298783880161026e565b9450602086015191508082111561033e578384fd5b5061034b8682870161026e565b925050604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156103ad57816000190482111561039357610393610372565b808516156103a057918102915b93841c939080029061037c565b509250929050565b6000826103c457506001610460565b816103d157506000610460565b81600181146103e757600281146103f15761040d565b6001915050610460565b60ff84111561040257610402610372565b50506001821b610460565b5060208310610133831016604e8410600b8410161715610430575081810a610460565b61043a8383610377565b806000190482111561044e5761044e610372565b029392505050565b600061046283836103b5565b9392505050565b61046b610482565b600082821015610479576104796103a2565b50039056fe\";\n\n// RWA Token bytecode - includes asset metadata\nconst RWA_BYTECODE = \"0x608060405234801561001057600080fd5b5060405161089a38038061089a833981016040819052610032916101db565b8251839083906100499060039060208501906100b4565b50805161005d9060049060208401906100b4565b50505061007a33826100756012600a6102eb565b610081565b5050610359565b6001600160a01b0382166100ab5760405163ec442f0560e01b815260006004820152602401604051809103906000fd5b6100b760008383610140565b5050565b8280546100c09061030c565b90600052602060002090601f0160209004810192826100e2576000855561012e565b82601f106100f357805160ff191683800117855561012e565b8280016001018555821561012e579182015b8281111561012e578251825591602001919060010190610105565b5061013a92915061013e565b5090565b5b8082111561013a576000815560010161013f565b6001600160a01b038316610174578060026000828254610160919061034b565b9091555061019f9050565b6001600160a01b0383166000908152602081905260408120805483929061019c908490610346565b90915550505b6001600160a01b0382166101c1576002805482900390556101e6565b6001600160a01b03821660009081526020819052604081208054839290610169908490610346565b816001600160a01b0316836001600160a01b03166000805160206108228339815191528360405161021991815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025757818101518382015260200161023f565b83811115610268576000848401525b50505050565b600082601f83011261027e578081fd5b81516001600160401b038082111561029857610298610226565b604051601f8301601f19908116603f011681019082821181831017156102c0576102c0610226565b816040528381528660208588010111156102d8578485fd5b6102e9846020830160208901610240565b9695505050505050565b60008060006060848603121561030757600080fd5b83516001600160401b038082111561031d578586fd5b6103298783880161026e565b9450602086015191508082111561033e578384fd5b5061034b8682870161026e565b925050604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156103ad57816000190482111561039357610393610372565b808516156103a057918102915b93841c939080029061037c565b509250929050565b6000826103c457506001610460565b816103d157506000610460565b81600181146103e757600281146103f15761040d565b6001915050610460565b60ff84111561040257610402610372565b50506001821b610460565b5060208310610133831016604e8410600b8410161715610430575081810a610460565b61043a8383610377565b806000190482111561044e5761044e610372565b029392505050565b600061046283836103b5565b9392505050565b61046b610482565b600082821015610479576104796103a2565b50039056fe\";\n\n/**\n * Deploy a new token (ERC20 or RWA) - mints supply to caller's address\n * @param agent - MNTAgentKit instance\n * @param name - Token name\n * @param symbol - Token symbol\n * @param supply - Total supply (human readable, e.g., \"1000000\")\n * @param tokenType - \"standard\" or \"rwa\"\n * @param assetType - For RWA: type of underlying asset\n * @param assetId - For RWA: external asset identifier\n */\nexport async function deployToken(\n agent: MNTAgentKit,\n name: string,\n symbol: string,\n supply: string,\n tokenType: TokenType = \"standard\",\n assetType?: string,\n assetId?: string,\n): Promise<TokenDeploymentResult> {\n const decimals = 18;\n const supplyInWei = parseUnits(supply, decimals).toString();\n\n // Demo mode\n if (agent.demo) {\n return {\n tokenAddress: `0xDEMO${tokenType === \"rwa\" ? \"RWA\" : \"TKN\"}00000000000000000001`,\n txHash: DEMO_TX_HASH,\n name,\n symbol,\n decimals,\n totalSupply: supplyInWei,\n mintedTo: agent.account.address,\n tokenType,\n assetType,\n assetId,\n };\n }\n\n // Validate\n if (!name?.trim()) throw new Error(\"Token name required\");\n if (!symbol?.trim()) throw new Error(\"Token symbol required\");\n if (!supply || Number(supply) <= 0) throw new Error(\"Supply must be > 0\");\n\n // Encode constructor args: (string name, string symbol, uint256 supply)\n const args = encodeAbiParameters(\n parseAbiParameters(\"string, string, uint256\"),\n [name, symbol, BigInt(supplyInWei)],\n );\n\n // Select bytecode based on token type\n const bytecode = tokenType === \"rwa\" ? RWA_BYTECODE : ERC20_BYTECODE;\n const deployData = (bytecode + args.slice(2)) as Hex;\n\n // Deploy\n const txHash = await agent.client.sendTransaction({ data: deployData });\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n if (!receipt.contractAddress) {\n throw new Error(\"Deployment failed - no contract address\");\n }\n\n return {\n tokenAddress: receipt.contractAddress,\n txHash,\n name,\n symbol,\n decimals,\n totalSupply: supplyInWei,\n mintedTo: agent.account.address,\n tokenType,\n assetType,\n assetId,\n };\n}\n\n/**\n * Deploy a standard ERC20 token\n */\nexport async function deployStandardToken(\n agent: MNTAgentKit,\n name: string,\n symbol: string,\n supply: string,\n): Promise<TokenDeploymentResult> {\n return deployToken(agent, name, symbol, supply, \"standard\");\n}\n\n/**\n * Deploy an RWA (Real World Asset) token\n * @param agent - MNTAgentKit instance\n * @param name - Token name (e.g., \"Manhattan Property Token\")\n * @param symbol - Token symbol (e.g., \"MPT\")\n * @param supply - Total supply representing fractional ownership\n * @param assetType - Asset category (e.g., \"Real Estate\", \"Commodities\", \"Securities\", \"Art\")\n * @param assetId - External reference ID for the underlying asset\n */\nexport async function deployRWAToken(\n agent: MNTAgentKit,\n name: string,\n symbol: string,\n supply: string,\n assetType: string,\n assetId?: string,\n): Promise<TokenDeploymentResult> {\n return deployToken(agent, name, symbol, supply, \"rwa\", assetType, assetId);\n}\n","import { type Address, erc20Abi } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { type TokenInfo } from \"../../constants/token-launchpad\";\n\n/**\n * Get token information\n */\nexport async function getTokenInfo(\n agent: MNTAgentKit,\n tokenAddress: Address,\n holder?: Address,\n): Promise<TokenInfo> {\n if (agent.demo) {\n return {\n address: tokenAddress,\n name: \"Demo Token\",\n symbol: \"DEMO\",\n decimals: 18,\n totalSupply: \"1000000000000000000000000\",\n balance: holder ? \"1000000000000000000000\" : undefined,\n };\n }\n\n const [name, symbol, decimals, totalSupply] = await Promise.all([\n agent.client.readContract({ address: tokenAddress, abi: erc20Abi, functionName: \"name\" }),\n agent.client.readContract({ address: tokenAddress, abi: erc20Abi, functionName: \"symbol\" }),\n agent.client.readContract({ address: tokenAddress, abi: erc20Abi, functionName: \"decimals\" }),\n agent.client.readContract({ address: tokenAddress, abi: erc20Abi, functionName: \"totalSupply\" }),\n ]) as [string, string, number, bigint];\n\n const result: TokenInfo = {\n address: tokenAddress,\n name,\n symbol,\n decimals,\n totalSupply: totalSupply.toString(),\n };\n\n if (holder) {\n const balance = await agent.client.readContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [holder],\n }) as bigint;\n result.balance = balance.toString();\n }\n\n return result;\n}\n\n/**\n * Get token balance\n */\nexport async function getTokenBalance(\n agent: MNTAgentKit,\n tokenAddress: Address,\n holder?: Address,\n): Promise<string> {\n if (agent.demo) return \"1000000000000000000000\";\n\n const balance = await agent.client.readContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [holder || agent.account.address],\n }) as bigint;\n\n return balance.toString();\n}\n","import { type Address, type Hex, encodeFunctionData, erc20Abi } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { DEMO_TX_HASH } from \"../../utils/demo/mockResponses\";\n\n/**\n * Transfer tokens\n */\nexport async function transferToken(\n agent: MNTAgentKit,\n tokenAddress: Address,\n to: Address,\n amount: string,\n): Promise<Hex> {\n if (agent.demo) return DEMO_TX_HASH;\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, BigInt(amount)],\n });\n\n const txHash = await agent.client.sendTransaction({ to: tokenAddress, data });\n await agent.client.waitForTransactionReceipt({ hash: txHash });\n return txHash;\n}\n","// NFT Launchpad Constants for Mantle Network\n// Provides functionality to deploy and manage ERC721 NFT collections\n\n// Standard ERC721 ABI for NFT interactions\nexport const ERC721_ABI = [\n // Constructor-related\n {\n inputs: [\n { name: \"name\", type: \"string\" },\n { name: \"symbol\", type: \"string\" },\n { name: \"baseURI\", type: \"string\" },\n { name: \"maxSupply\", type: \"uint256\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n // View functions\n {\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n name: \"tokenURI\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n name: \"ownerOf\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n name: \"getApproved\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"operator\", type: \"address\" },\n ],\n name: \"isApprovedForAll\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n // State changing functions\n {\n inputs: [{ name: \"to\", type: \"address\" }],\n name: \"mint\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"quantity\", type: \"uint256\" },\n ],\n name: \"batchMint\",\n outputs: [{ name: \"startTokenId\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"tokenId\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"operator\", type: \"address\" },\n { name: \"approved\", type: \"bool\" },\n ],\n name: \"setApprovalForAll\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"tokenId\", type: \"uint256\" },\n ],\n name: \"transferFrom\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"tokenId\", type: \"uint256\" },\n ],\n name: \"safeTransferFrom\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n name: \"safeTransferFrom\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n // Events\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"from\", type: \"address\" },\n { indexed: true, name: \"to\", type: \"address\" },\n { indexed: true, name: \"tokenId\", type: \"uint256\" },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"owner\", type: \"address\" },\n { indexed: true, name: \"approved\", type: \"address\" },\n { indexed: true, name: \"tokenId\", type: \"uint256\" },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"owner\", type: \"address\" },\n { indexed: true, name: \"operator\", type: \"address\" },\n { indexed: false, name: \"approved\", type: \"bool\" },\n ],\n name: \"ApprovalForAll\",\n type: \"event\",\n },\n] as const;\n\n// NFT Collection configuration interface\nexport interface NFTCollectionConfig {\n name: string;\n symbol: string;\n baseURI: string; // Base URI for token metadata (e.g., \"ipfs://QmXXX/\")\n maxSupply?: number; // Max tokens in collection (0 for unlimited)\n description?: string;\n}\n\n// NFT Collection deployment result\nexport interface NFTCollectionDeploymentResult {\n collectionAddress: string;\n txHash: string;\n name: string;\n symbol: string;\n baseURI: string;\n maxSupply: number;\n deployer: string;\n}\n\n// NFT mint result\nexport interface NFTMintResult {\n txHash: string;\n tokenId: string;\n collectionAddress: string;\n to: string;\n}\n\n// NFT Collection info\nexport interface NFTCollectionInfo {\n address: string;\n name: string;\n symbol: string;\n totalSupply: string;\n balanceOf?: string;\n}\n\n// NFT Token info\nexport interface NFTTokenInfo {\n collectionAddress: string;\n tokenId: string;\n owner: string;\n tokenURI: string;\n}\n","import { type Hex, encodeAbiParameters, parseAbiParameters } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n type NFTCollectionConfig,\n type NFTCollectionDeploymentResult,\n} from \"../../constants/nft-launchpad\";\nimport { DEMO_TX_HASH } from \"../../utils/demo/mockResponses\";\n\n// ERC721 contract bytecode with mint functionality\n// Features: name, symbol, baseURI, maxSupply, mint, batchMint, tokenURI\nconst ERC721_CREATION_CODE = `0x608060405234801561001057600080fd5b506040516112a03803806112a0833981016040819052610032916101e5565b83838383600061004283826102f4565b50600161004f82826102f4565b5050600680546001600160a01b0319163317905550600782905560088190555050505050506103b3565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261009f57600080fd5b81516001600160401b03808211156100b9576100b9610079565b604051601f8301601f19908116603f011681019082821181831017156100e1576100e1610079565b816040528381526020925086838588010111156100fd57600080fd5b600091505b8382101561011f5785820183015181830184015290820190610102565b6000928101909201929092529392505050565b60008060008060808587031215610148578384fd5b84516001600160401b038082111561015e578586fd5b61016a8883890161008f565b9550602087015191508082111561017f578485fd5b5061018c8782880161008f565b9350506040850151915060608501519050929550929550929292909250565b600181811c908216806101bf57607f821691505b6020821081036101df57634e487b7160e01b600052602260045260246000fd5b50919050565b600080600080608085870312156101fa578384fd5b84516001600160401b0380821115610210578586fd5b61021c8883890161008f565b95506020870151915080821115610231578485fd5b5061023e8782880161008f565b935050604085015191506060850151905092959194509250565b601f82111561029f57600081815260208120601f850160051c8101602086101561027f5750805b601f850160051c820191505b8181101561029e5782815560010161028b565b505050505050565b81516001600160401b038111156102bf576102bf610079565b6102d3816102cd84546101ab565b84610258565b602080601f83116001811461030857600084156102f05750858301515b600019600386901b1c1916600185901b17855561029e565b600085815260208120601f198616915b8281101561033757888601518255948401946001909101908401610318565b50858210156103555787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f83011261037657600080fd5b81356001600160401b0381111561038f5761038f610079565b6040516020601f19601f85011681018181106001600160401b03821117156103b9576103b9610079565b6040528281528484830111156103ce57600080fd5b8282602083013760009201829052509392505050565b600080600080608085870312156103f9578384fd5b84356001600160401b038082111561040f578586fd5b61041b88838901610365565b95506020870135915080821115610430578485fd5b5061043d87828801610365565b935050604085013591506060850135905092959194509250565b610ede806103c26000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80636352211e11610097578063a22cb46511610066578063a22cb465146101f3578063b88d4fde14610206578063c87b56dd14610219578063e985e9c51461022c57600080fd5b80636352211e146101a75780636a627842146101ba57806370a08231146101cd57806395d89b41146101eb57600080fd5b8063095ea7b3116100d3578063095ea7b31461016257806318160ddd1461017757806323b872dd1461018157806342842e0e1461019457600080fd5b806301ffc9a7146100fa57806306fdde0314610122578063081812fc14610137575b600080fd5b61010d610108366004610b4a565b610268565b60405190151581526020015b60405180910390f35b61012a6102ba565b6040516101199190610bb7565b61014a610145366004610bca565b61034c565b6040516001600160a01b039091168152602001610119565b610175610170366004610bff565b610373565b005b6005545b604051908152602001610119565b61017561018f366004610c29565b61048d565b6101756101a2366004610c29565b6104be565b61014a6101b5366004610bca565b6104d9565b61017b6101c8366004610c65565b610539565b61017b6101db366004610c65565b6001600160a01b031660009081526003602052604090205490565b61012a6105d6565b610175610201366004610c80565b6105e5565b610175610214366004610cd2565b6105f4565b61012a610227366004610bca565b61062c565b61010d61023a366004610dae565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061029957506001600160e01b03198216635b5e139f60e01b145b806102b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546102c990610de1565b80601f01602080910402602001604051908101604052809291908181526020018280546102f590610de1565b80156103425780601f1061031757610100808354040283529160200191610342565b820191906000526020600020905b81548152906001019060200180831161032557829003601f168201915b5050505050905090565b600061035782610697565b506000908152600260205260409020546001600160a01b031690565b600061037e826104d9565b9050806001600160a01b0316836001600160a01b0316036103f05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061040c575061040c813361023a565b61047e5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016103e7565b61048883836106f6565b505050565b6104973382610764565b6104b35760405162461bcd60e51b81526004016103e790610e1b565b6104888383836107c3565b61048883838360405180602001604052806000815250610930565b6000818152600260205260408120546001600160a01b0316806102b45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016103e7565b6006546000906001600160a01b031633146105965760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f776e65722063616e206d696e7420746f6b656e730000000000006044820152606401610e7565b600580549060006105a683610e68565b91905055905060075460001480156105bf575060075481115b156105c957600080fd5b6105d38382610944565b50919050565b6060600180546102c990610de1565b6105f033838361095e565b5050565b6105fe3383610764565b61061a5760405162461bcd60e51b81526004016103e790610e1b565b61062684848484610a2c565b50505050565b606061063782610697565b600061064e60408051602081019091526000815290565b9050600081511161066e5760405180602001604052806000815250610690565b8061067884610a5f565b604051602001610689929190610e81565b6040519091905056fe60005b838110156106ae578181015183820152602001610696565b50506000910152565b60006102b4826001600160a01b03163b151590565b806001600160a01b0316826001600160a01b0316036107225760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f76616c20746f2073656c660000000000000000604482015260640160405180910390fd5b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0382166107b25760405162461bcd60e51b815260206004820152601160248201527045524337323: 696e76616c6964206164647260781b604482015260640160405180910390fd5b6000818152600260205260408120546001600160a01b0316906107d490610aff565b6001600160a01b0384166000908152600360205260408120805460019290610807908490610eb0565b909155505060008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600260205260408120546001600160a01b031661092c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840160405180910390fd5b6000610937836104d9565b9050806001600160a01b0316846001600160a01b031614806109725750836001600160a01b03166109678461034c565b6001600160a01b0316145b8061098257506109828185610b23565b949350505050565b61098d8484846107c3565b61099984848484610b4c565b6106265760405162461bcd60e51b81526004016103e790610ec3565b6105f08282604051806020016040528060008152506109d3836109b5565b6109bf8383610a2c565b6109cc6000848484610b4c565b5050505050565b816001600160a01b0316836001600160a01b0316036109fe5760405162461bcd60e51b81526004016103e790610f0c565b6001600160a01b0382811660008181526004602090815260408083209487168084529482529182902080548615157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116179055905190825290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a3505050565b610a376107c3565b610a4384848484610c25565b5050505050565b60606000610a5783610c58565b600101905060008167ffffffffffffffff811115610a7757610a77610cbc565b6040519080825280601f01601f191660200182016040528015610aa1576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610aab57509392505050565b600060001982015b6000838152600260205260409020546001600160a01b0316610b085750919050565b8015610b145792915050565b82610b1e81610f4f565b935050610b07565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60006001600160a01b0384163b15610c1a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290610b90903390899088908890600401610f66565b6020604051808303816000875af1925050508015610bcb575060408051601f3d908101601f19168201909252610bc891810190610f99565b60015b610c00573d808015610bf9576040519150601f19603f3d011682016040523d82523d6000602084013e610bfe565b606091505b505080515f03610c185760405162461bcd60e51b81526004016103e790610ec3565b505b6001600160e01b031916630a85bd0160e11b149050610982565b506001949350505050565b610c318484846107c3565b610c3d84848484610b4c565b6106265760405162461bcd60e51b81526004016103e790610ec3565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610c975772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610cc3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610ce157662386f26fc10000830492506010015b6305f5e1008310610cf9576305f5e100830492506008015b6127108310610d0d57612710830492506004015b60648310610d1f576064830492506002015b600a83106102b45760010192915050565b6001600160e01b031981168114610d4657600080fd5b50565b600060208284031215610d5a578081fd5b8135610d6581610d30565b9392505050565b60005b83811015610d87578181015183820152602001610d6f565b50506000910152565b60008151808452610da8816020860160208601610d6c565b601f01601f19169290920160200192915050565b602081526000610d656020830184610d90565b600060208284031215610de0578081fd5b5035919050565b80356001600160a01b0381168114610dfe57600080fd5b919050565b60008060408385031215610e15578081fd5b610e1e83610de7565b946020939093013593505050565b600080600060608486031215610e40578081fd5b610e4984610de7565b9250610e5760208501610de7565b9150604084013590509250925092565b600060208284031215610e78578081fd5b610d6582610de7565b60008060408385031215610e93578182fd5b610e9c83610de7565b915060208301358015158114610eb0578182fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610ee1578081fd5b813567ffffffffffffffff80821115610efc57610efc610ebb565b604051601f8301601f19908116603f01168101908282118183101715610f2457610f24610ebb565b81604052838152866020858801011115610f3c578485fd5b83602087016020830137600060208583010152809450505050509291505056fea264697066735822122000000000000000000000000000000000000000000000000000000000000000064736f6c63430008150033`;\n\n/**\n * Deploy a new ERC721 NFT collection on Mantle Network\n * @param agent - MNTAgentKit instance\n * @param config - NFT collection configuration\n * @returns Collection deployment result with contract address\n */\nexport async function deployNFTCollection(\n agent: MNTAgentKit,\n config: NFTCollectionConfig,\n): Promise<NFTCollectionDeploymentResult> {\n const { name, symbol, baseURI, maxSupply = 0 } = config;\n\n // Demo mode\n if (agent.demo) {\n return {\n collectionAddress: \"0xDEMO000000000000000000000000000000000002\",\n txHash: DEMO_TX_HASH,\n name,\n symbol,\n baseURI,\n maxSupply,\n deployer: agent.account.address,\n };\n }\n\n // Validate inputs\n if (!name || name.length === 0) {\n throw new Error(\"Collection name is required\");\n }\n if (!symbol || symbol.length === 0) {\n throw new Error(\"Collection symbol is required\");\n }\n if (!baseURI) {\n throw new Error(\"Base URI is required for token metadata\");\n }\n\n // Encode constructor arguments\n const constructorArgs = encodeAbiParameters(\n parseAbiParameters(\n \"string name, string symbol, string baseURI, uint256 maxSupply\",\n ),\n [name, symbol, baseURI, BigInt(maxSupply)],\n );\n\n // Combine bytecode with constructor arguments\n const deploymentBytecode = (ERC721_CREATION_CODE +\n constructorArgs.slice(2)) as Hex;\n\n // Deploy the contract\n const txHash = await agent.client.sendTransaction({\n data: deploymentBytecode,\n });\n\n // Wait for deployment\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n if (!receipt.contractAddress) {\n throw new Error(\n \"NFT Collection deployment failed - no contract address returned\",\n );\n }\n\n return {\n collectionAddress: receipt.contractAddress,\n txHash,\n name,\n symbol,\n baseURI,\n maxSupply,\n deployer: agent.account.address,\n };\n}\n\n/**\n * Deploy an NFT collection with preset configurations\n * @param agent - MNTAgentKit instance\n * @param preset - Preset type: \"pfp\" (10000), \"art\" (1000), \"membership\" (100)\n * @param name - Collection name\n * @param symbol - Collection symbol\n * @param baseURI - Base URI for metadata\n * @returns Collection deployment result\n */\nexport async function deployNFTCollectionWithPreset(\n agent: MNTAgentKit,\n preset: \"pfp\" | \"art\" | \"membership\" | \"unlimited\",\n name: string,\n symbol: string,\n baseURI: string,\n): Promise<NFTCollectionDeploymentResult> {\n const presetConfigs: Record<string, number> = {\n pfp: 10000, // Profile picture collections\n art: 1000, // Art collections\n membership: 100, // Membership/pass collections\n unlimited: 0, // Unlimited supply\n };\n\n return deployNFTCollection(agent, {\n name,\n symbol,\n baseURI,\n maxSupply: presetConfigs[preset],\n });\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { ERC721_ABI, type NFTMintResult } from \"../../constants/nft-launchpad\";\nimport { DEMO_TX_HASH } from \"../../utils/demo/mockResponses\";\n\n/**\n * Mint a single NFT from a collection\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address (defaults to agent address)\n * @returns Mint result with token ID\n */\nexport async function mintNFT(\n agent: MNTAgentKit,\n collectionAddress: Address,\n to?: Address,\n): Promise<NFTMintResult> {\n const recipient = to || agent.account.address;\n\n // Demo mode\n if (agent.demo) {\n return {\n txHash: DEMO_TX_HASH,\n tokenId: \"1\",\n collectionAddress,\n to: recipient,\n };\n }\n\n // Encode mint function call\n const data = encodeFunctionData({\n abi: ERC721_ABI,\n functionName: \"mint\",\n args: [recipient],\n });\n\n // Send transaction\n const txHash = await agent.client.sendTransaction({\n to: collectionAddress,\n data,\n });\n\n // Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n // Parse Transfer event to get token ID\n let tokenId = \"0\";\n for (const log of receipt.logs) {\n // Transfer event topic\n if (\n log.topics[0] ===\n \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\"\n ) {\n // Token ID is the third topic (indexed)\n if (log.topics[3]) {\n tokenId = BigInt(log.topics[3]).toString();\n }\n }\n }\n\n return {\n txHash,\n tokenId,\n collectionAddress,\n to: recipient,\n };\n}\n\n/**\n * Batch mint multiple NFTs from a collection\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address\n * @param quantity - Number of NFTs to mint\n * @returns Mint result with starting token ID\n */\nexport async function batchMintNFT(\n agent: MNTAgentKit,\n collectionAddress: Address,\n to: Address,\n quantity: number,\n): Promise<{ txHash: Hex; startTokenId: string; quantity: number }> {\n // Demo mode\n if (agent.demo) {\n return {\n txHash: DEMO_TX_HASH,\n startTokenId: \"1\",\n quantity,\n };\n }\n\n // Encode batch mint function call\n const data = encodeFunctionData({\n abi: ERC721_ABI,\n functionName: \"batchMint\",\n args: [to, BigInt(quantity)],\n });\n\n // Send transaction\n const txHash = await agent.client.sendTransaction({\n to: collectionAddress,\n data,\n });\n\n // Wait for confirmation\n const receipt = await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n // Parse first Transfer event to get starting token ID\n let startTokenId = \"1\";\n for (const log of receipt.logs) {\n if (\n log.topics[0] ===\n \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\"\n ) {\n if (log.topics[3]) {\n startTokenId = BigInt(log.topics[3]).toString();\n break; // Get only the first token ID\n }\n }\n }\n\n return {\n txHash,\n startTokenId,\n quantity,\n };\n}\n","import { type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport {\n ERC721_ABI,\n type NFTCollectionInfo,\n type NFTTokenInfo,\n} from \"../../constants/nft-launchpad\";\n\n/**\n * Get information about an NFT collection\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param holderAddress - Optional address to get balance for\n * @returns Collection information\n */\nexport async function getNFTCollectionInfo(\n agent: MNTAgentKit,\n collectionAddress: Address,\n holderAddress?: Address,\n): Promise<NFTCollectionInfo> {\n // Demo mode\n if (agent.demo) {\n return {\n address: collectionAddress,\n name: \"Demo NFT Collection\",\n symbol: \"DEMO\",\n totalSupply: \"100\",\n balanceOf: holderAddress ? \"5\" : undefined,\n };\n }\n\n // Fetch collection info in parallel\n const [name, symbol, totalSupply] = await Promise.all([\n agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"name\",\n }) as Promise<string>,\n agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"symbol\",\n }) as Promise<string>,\n agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"totalSupply\",\n }) as Promise<bigint>,\n ]);\n\n const result: NFTCollectionInfo = {\n address: collectionAddress,\n name,\n symbol,\n totalSupply: totalSupply.toString(),\n };\n\n // Get balance if holder address provided\n if (holderAddress) {\n const balance = (await agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"balanceOf\",\n args: [holderAddress],\n })) as bigint;\n result.balanceOf = balance.toString();\n }\n\n return result;\n}\n\n/**\n * Get information about a specific NFT token\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param tokenId - Token ID\n * @returns Token information\n */\nexport async function getNFTTokenInfo(\n agent: MNTAgentKit,\n collectionAddress: Address,\n tokenId: string,\n): Promise<NFTTokenInfo> {\n // Demo mode\n if (agent.demo) {\n return {\n collectionAddress,\n tokenId,\n owner: agent.account.address,\n tokenURI: `https://example.com/metadata/${tokenId}.json`,\n };\n }\n\n // Fetch token info in parallel\n const [owner, tokenURI] = await Promise.all([\n agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(tokenId)],\n }) as Promise<Address>,\n agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"tokenURI\",\n args: [BigInt(tokenId)],\n }) as Promise<string>,\n ]);\n\n return {\n collectionAddress,\n tokenId,\n owner,\n tokenURI,\n };\n}\n\n/**\n * Get NFT balance for an address\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param holderAddress - Address to check balance for (defaults to agent address)\n * @returns Balance as string\n */\nexport async function getNFTBalance(\n agent: MNTAgentKit,\n collectionAddress: Address,\n holderAddress?: Address,\n): Promise<string> {\n const address = holderAddress || agent.account.address;\n\n if (agent.demo) {\n return \"5\";\n }\n\n const balance = (await agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"balanceOf\",\n args: [address],\n })) as bigint;\n\n return balance.toString();\n}\n\n/**\n * Check if an address owns a specific NFT\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param tokenId - Token ID to check\n * @param ownerAddress - Address to verify ownership\n * @returns Boolean indicating ownership\n */\nexport async function isNFTOwner(\n agent: MNTAgentKit,\n collectionAddress: Address,\n tokenId: string,\n ownerAddress?: Address,\n): Promise<boolean> {\n const address = ownerAddress || agent.account.address;\n\n if (agent.demo) {\n return true;\n }\n\n try {\n const owner = (await agent.client.readContract({\n address: collectionAddress,\n abi: ERC721_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(tokenId)],\n })) as Address;\n\n return owner.toLowerCase() === address.toLowerCase();\n } catch {\n return false;\n }\n}\n","import { type Address, type Hex, encodeFunctionData } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { ERC721_ABI } from \"../../constants/nft-launchpad\";\nimport { DEMO_TX_HASH } from \"../../utils/demo/mockResponses\";\n\n/**\n * Transfer an NFT to another address\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address\n * @param tokenId - Token ID to transfer\n * @returns Transaction hash\n */\nexport async function transferNFT(\n agent: MNTAgentKit,\n collectionAddress: Address,\n to: Address,\n tokenId: string,\n): Promise<Hex> {\n if (agent.demo) {\n return DEMO_TX_HASH;\n }\n\n const data = encodeFunctionData({\n abi: ERC721_ABI,\n functionName: \"transferFrom\",\n args: [agent.account.address, to, BigInt(tokenId)],\n });\n\n const txHash = await agent.client.sendTransaction({\n to: collectionAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n\n/**\n * Safe transfer an NFT (checks if recipient can receive)\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address\n * @param tokenId - Token ID to transfer\n * @returns Transaction hash\n */\nexport async function safeTransferNFT(\n agent: MNTAgentKit,\n collectionAddress: Address,\n to: Address,\n tokenId: string,\n): Promise<Hex> {\n if (agent.demo) {\n return DEMO_TX_HASH;\n }\n\n const data = encodeFunctionData({\n abi: ERC721_ABI,\n functionName: \"safeTransferFrom\",\n args: [agent.account.address, to, BigInt(tokenId)],\n });\n\n const txHash = await agent.client.sendTransaction({\n to: collectionAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n\n/**\n * Approve an address to transfer a specific NFT\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param approved - Address to approve\n * @param tokenId - Token ID to approve\n * @returns Transaction hash\n */\nexport async function approveNFT(\n agent: MNTAgentKit,\n collectionAddress: Address,\n approved: Address,\n tokenId: string,\n): Promise<Hex> {\n if (agent.demo) {\n return DEMO_TX_HASH;\n }\n\n const data = encodeFunctionData({\n abi: ERC721_ABI,\n functionName: \"approve\",\n args: [approved, BigInt(tokenId)],\n });\n\n const txHash = await agent.client.sendTransaction({\n to: collectionAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n\n/**\n * Set approval for all NFTs in a collection\n * @param agent - MNTAgentKit instance\n * @param collectionAddress - NFT collection contract address\n * @param operator - Operator address\n * @param approved - Whether to approve or revoke\n * @returns Transaction hash\n */\nexport async function setApprovalForAllNFT(\n agent: MNTAgentKit,\n collectionAddress: Address,\n operator: Address,\n approved: boolean,\n): Promise<Hex> {\n if (agent.demo) {\n return DEMO_TX_HASH;\n }\n\n const data = encodeFunctionData({\n abi: ERC721_ABI,\n functionName: \"setApprovalForAll\",\n args: [operator, approved],\n });\n\n const txHash = await agent.client.sendTransaction({\n to: collectionAddress,\n data,\n });\n\n await agent.client.waitForTransactionReceipt({ hash: txHash });\n\n return txHash;\n}\n","import type { MNTAgentKit } from \"../../agent\";\nimport { getSwapTransaction } from \"../../utils/okx\";\nimport { createMockQuoteResponse } from \"../../utils/demo/mockResponses\";\n\nexport const getSwapQuote = async (\n agent: MNTAgentKit,\n from: string,\n to: string,\n amount: string,\n slippagePercentage: string,\n) => {\n if (agent.demo) {\n return createMockQuoteResponse(\"OKX\", amount);\n }\n\n const chainIndex = agent.chain === \"mainnet\" ? \"5000\" : \"5003\";\n\n return getSwapTransaction(from, to, amount, chainIndex, slippagePercentage);\n};\n","/**\n * Platform Configuration & Validation\n *\n * Validates APP_ID with Mantle platform API\n */\n\nconst DEFAULT_PLATFORM_URL = \"https://mantle-devkit.vercel.app\";\n\n/** Project configuration from platform */\nexport interface ProjectConfig {\n appId: string;\n name: string;\n payTo: string;\n network: string;\n status: string;\n}\n\n/** Cached configuration (singleton) */\nlet cachedConfig: ProjectConfig | null = null;\nlet validationPromise: Promise<ProjectConfig> | null = null;\n\n/**\n * Get platform API base URL\n */\nfunction getPlatformBaseUrl(): string {\n if (typeof process !== \"undefined\" && process.env) {\n return (\n process.env.PLATFORM_URL ||\n process.env.NEXT_PUBLIC_PLATFORM_URL ||\n DEFAULT_PLATFORM_URL\n );\n }\n return DEFAULT_PLATFORM_URL;\n}\n\n/**\n * Validate APP_ID with platform API\n */\nasync function validateAppId(appId: string): Promise<ProjectConfig> {\n const baseUrl = getPlatformBaseUrl();\n const url = `${baseUrl}/api/v1/validate?appId=${encodeURIComponent(appId)}`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\n \"Platform: Project not found. Invalid APP_ID. Please check your APP_ID configuration.\",\n );\n }\n if (response.status === 401) {\n throw new Error(\n \"Platform: Unauthorized. Invalid APP_ID. Please verify your APP_ID.\",\n );\n }\n throw new Error(\n `Platform: Validation failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = (await response.json()) as ProjectConfig;\n\n if (!data.appId || !data.payTo || !data.network) {\n throw new Error(\"Platform: Invalid response - missing required fields\");\n }\n\n if (data.status !== \"ACTIVE\") {\n throw new Error(\n `Platform: Project is not active. Current status: ${data.status}`,\n );\n }\n\n return {\n appId: data.appId,\n name: data.name,\n payTo: data.payTo,\n network: data.network,\n status: data.status,\n };\n}\n\n/**\n * Initialize platform validation\n *\n * Reads APP_ID from environment and validates with platform API.\n * Uses singleton pattern - multiple calls return same promise.\n *\n * @returns Project configuration from platform\n * @throws Error if APP_ID is not set or validation fails\n */\nexport async function initializePlatform(): Promise<ProjectConfig> {\n if (cachedConfig) {\n return cachedConfig;\n }\n\n if (validationPromise) {\n return validationPromise;\n }\n\n let appId: string | undefined;\n if (typeof process !== \"undefined\" && process.env) {\n appId = process.env.APP_ID || process.env.NEXT_PUBLIC_APP_ID;\n }\n\n if (!appId || typeof appId !== \"string\" || appId.trim().length === 0) {\n throw new Error(\n \"APP_ID is required. Set it in your .env file:\\nAPP_ID=your_app_id_here\",\n );\n }\n\n validationPromise = validateAppId(appId.trim());\n\n try {\n cachedConfig = await validationPromise;\n return cachedConfig;\n } catch (error) {\n validationPromise = null;\n throw error;\n }\n}\n\n/**\n * Get cached project configuration\n *\n * @throws Error if platform not initialized\n */\nexport function getProjectConfig(): ProjectConfig {\n if (!cachedConfig) {\n throw new Error(\n \"Platform not initialized. Call initializePlatform() first.\",\n );\n }\n return cachedConfig;\n}\n\n/**\n * Clear cached configuration (for testing)\n */\nexport function clearCache(): void {\n cachedConfig = null;\n validationPromise = null;\n}\n","import { type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { LENDING_POOL, LENDING_POOL_ABI } from \"../../constants/lendle\";\n\nexport interface UserAccountData {\n totalCollateralETH: bigint;\n totalDebtETH: bigint;\n availableBorrowsETH: bigint;\n currentLiquidationThreshold: bigint;\n ltv: bigint;\n healthFactor: bigint;\n}\n\n/**\n * Get user account data from Lendle LendingPool\n * @param agent - MNTAgentKit instance\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns User account data including collateral, debt, and health factor\n */\nexport async function getUserAccountData(\n agent: MNTAgentKit,\n userAddress?: Address,\n): Promise<UserAccountData> {\n const lendingPoolAddress = LENDING_POOL[agent.chain];\n const address = userAddress || agent.account.address;\n\n if (lendingPoolAddress === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(\n `Lendle LendingPool not configured for ${agent.chain}. Only available on mainnet.`,\n );\n }\n\n const result = (await agent.client.readContract({\n address: lendingPoolAddress,\n abi: LENDING_POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [address],\n })) as readonly [bigint, bigint, bigint, bigint, bigint, bigint];\n\n return {\n totalCollateralETH: result[0],\n totalDebtETH: result[1],\n availableBorrowsETH: result[2],\n currentLiquidationThreshold: result[3],\n ltv: result[4],\n healthFactor: result[5],\n };\n}\n","import {\n createWalletClient,\n http,\n publicActions,\n type Chain,\n type PublicActions,\n type Transport,\n type WalletClient,\n} from \"viem\";\nimport {\n privateKeyToAccount,\n type Address,\n type PrivateKeyAccount,\n} from \"viem/accounts\";\nimport { mantle, mantleSepoliaTestnet } from \"viem/chains\";\nimport { executeSwap, sendTransaction } from \"./tools\";\nimport { getSwapQuote } from \"./tools/okx/getSwapQuote\";\nimport { swapOnOpenOcean, getOpenOceanQuote } from \"./tools/openocean\";\nimport { swapOn1inch, get1inchQuote } from \"./tools/oneinch\";\nimport { swapOnUniswap, getUniswapQuote } from \"./tools/uniswap\";\nimport { crossChainSwapViaSquid, getSquidRoute } from \"./tools/squid\";\nimport {\n lendleSupply,\n lendleWithdraw,\n lendleBorrow,\n lendleRepay,\n lendleGetPositions,\n} from \"./tools/lendle\";\nimport { agniSwap } from \"./tools/agni\";\nimport { merchantMoeSwap } from \"./tools/merchantmoe\";\nimport { METH_TOKEN } from \"./tools/meth\";\nimport { methGetPosition, swapToMeth, swapFromMeth } from \"./tools/meth-staking\";\nimport {\n pikeperpsOpenLong,\n pikeperpsOpenShort,\n pikeperpsClosePosition,\n pikeperpsGetPositions,\n pikeperpsGetMarketData,\n} from \"./tools/pikeperps\";\nimport {\n pythGetPrice,\n pythGetEmaPrice,\n pythGetMultiplePrices,\n pythGetSupportedPriceFeeds,\n pythPriceFeedExists,\n} from \"./tools/pyth\";\nimport {\n deployToken,\n deployStandardToken,\n deployRWAToken,\n getTokenInfo,\n getTokenBalance,\n transferToken,\n} from \"./tools/token-launchpad\";\nimport {\n deployNFTCollection,\n deployNFTCollectionWithPreset,\n mintNFT,\n batchMintNFT,\n getNFTCollectionInfo,\n getNFTTokenInfo,\n getNFTBalance,\n isNFTOwner,\n transferNFT,\n safeTransferNFT,\n approveNFT,\n setApprovalForAllNFT,\n} from \"./tools/nft-launchpad\";\nimport type { TokenType } from \"./constants/token-launchpad\";\nimport type { NFTCollectionConfig } from \"./constants/nft-launchpad\";\nimport { initializePlatform, type ProjectConfig } from \"./utils/x402\";\nimport { getUserAccountData } from \"./utils/lendle\";\nimport { erc7811Actions, type Erc7811Actions } from \"viem/experimental\";\n\nexport class MNTAgentKit {\n public account: PrivateKeyAccount;\n public client: WalletClient<Transport, Chain, PrivateKeyAccount> &\n PublicActions &\n Erc7811Actions;\n public chain: \"testnet\" | \"mainnet\";\n public demo: boolean;\n public projectConfig?: ProjectConfig;\n\n constructor(privateKey: Address, chain: \"mainnet\" | \"testnet\" | \"testnet-demo\") {\n this.account = privateKeyToAccount(privateKey);\n this.demo = chain === \"testnet-demo\";\n this.chain = chain === \"testnet-demo\" ? \"testnet\" : chain;\n this.client = createWalletClient({\n chain: this.chain == \"mainnet\" ? mantle : mantleSepoliaTestnet,\n transport: http(),\n account: this.account,\n })\n .extend(publicActions)\n .extend(erc7811Actions());\n }\n\n /**\n * Initialize the agent with platform validation\n *\n * Validates APP_ID with the platform API.\n * Must be called after creating the agent instance.\n *\n * @returns The initialized agent instance\n * @throws Error if APP_ID is not set or validation fails\n *\n * @example\n * ```typescript\n * const agent = new MNTAgentKit(privateKey, \"mainnet\");\n * await agent.initialize(); // Validates APP_ID\n * ```\n */\n async initialize(): Promise<MNTAgentKit> {\n this.projectConfig = await initializePlatform();\n return this;\n }\n\n async sendTransaction(to: Address, amount: string) {\n return await sendTransaction(this, to, amount);\n }\n\n // OKX DEX Aggregator\n async getSwapQuote(\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n slippagePercentage: string = \"0.5\",\n ) {\n return await getSwapQuote(\n this,\n fromTokenAddress,\n toTokenAddress,\n amount,\n slippagePercentage,\n );\n }\n\n async executeSwap(\n fromTokenAddress: string,\n toTokenAddress: string,\n amount: string,\n slippagePercentage: string = \"0.5\",\n ) {\n return await executeSwap(\n this,\n fromTokenAddress,\n toTokenAddress,\n amount,\n slippagePercentage,\n );\n }\n\n // OpenOcean DEX Aggregator\n async getOpenOceanQuote(\n fromToken: Address,\n toToken: Address,\n amount: string,\n ) {\n return await getOpenOceanQuote(this, fromToken, toToken, amount);\n }\n\n async swapOnOpenOcean(\n fromToken: Address,\n toToken: Address,\n amount: string,\n slippage: number = 0.5,\n ) {\n return await swapOnOpenOcean(\n this,\n fromToken,\n toToken,\n amount,\n slippage.toString(),\n );\n }\n\n // 1inch DEX Aggregator\n async get1inchQuote(fromToken: Address, toToken: Address, amount: string) {\n return await get1inchQuote(this, fromToken, toToken, amount);\n }\n\n async swapOn1inch(\n fromToken: Address,\n toToken: Address,\n amount: string,\n slippage: number = 0.5,\n ) {\n return await swapOn1inch(\n this,\n fromToken,\n toToken,\n amount,\n slippage.toString(),\n );\n }\n\n // Uniswap V3 DEX\n async getUniswapQuote(fromToken: Address, toToken: Address, amount: string) {\n return await getUniswapQuote(this, fromToken, toToken, amount);\n }\n\n async swapOnUniswap(\n fromToken: Address,\n toToken: Address,\n amount: string,\n slippage: number = 0.5,\n ) {\n return await swapOnUniswap(\n this,\n fromToken,\n toToken,\n amount,\n slippage.toString(),\n );\n }\n\n // Lendle Lending Protocol\n async lendleSupply(tokenAddress: Address, amount: string) {\n return await lendleSupply(this, tokenAddress, amount);\n }\n\n async lendleWithdraw(tokenAddress: Address, amount: string, to?: Address) {\n return await lendleWithdraw(this, tokenAddress, amount, to);\n }\n\n async lendleBorrow(\n tokenAddress: Address,\n amount: string,\n interestRateMode: 1 | 2 = 2,\n onBehalfOf?: Address,\n ) {\n return await lendleBorrow(\n this,\n tokenAddress,\n amount,\n interestRateMode,\n onBehalfOf,\n );\n }\n\n async lendleRepay(\n tokenAddress: Address,\n amount: string,\n rateMode: 1 | 2 = 2,\n onBehalfOf?: Address,\n ) {\n return await lendleRepay(this, tokenAddress, amount, rateMode, onBehalfOf);\n }\n\n /**\n * Get user account data from Lendle LendingPool\n * Returns overall position including total collateral, debt, and health factor\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns User account data with collateral, debt, available borrows, and health factor\n */\n async lendleGetUserAccountData(userAddress?: Address) {\n return await getUserAccountData(this, userAddress);\n }\n\n /**\n * Get all Lendle positions for a user (per-token breakdown)\n * Returns detailed supply and borrow amounts for each asset\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with supply/borrow amounts per asset\n */\n async lendleGetPositions(userAddress?: Address) {\n return await lendleGetPositions(this, userAddress);\n }\n\n // Agni Finance DEX (#1 on Mantle)\n async agniSwap(\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n feeTier?: number,\n ) {\n return await agniSwap(\n this,\n tokenIn,\n tokenOut,\n amountIn,\n slippagePercent,\n feeTier,\n );\n }\n\n // Merchant Moe DEX (#2 on Mantle)\n async merchantMoeSwap(\n tokenIn: Address,\n tokenOut: Address,\n amountIn: string,\n slippagePercent: number = 0.5,\n ) {\n return await merchantMoeSwap(\n this,\n tokenIn,\n tokenOut,\n amountIn,\n slippagePercent,\n );\n }\n\n // mETH Protocol - Liquid Staking Token\n getMethTokenAddress() {\n if (this.demo) {\n return METH_TOKEN.mainnet;\n }\n return METH_TOKEN[this.chain];\n }\n\n /**\n * Get mETH staking position for a user\n * Returns mETH balance and WETH balance for comparison\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns mETH position with balances\n */\n async methGetPosition(userAddress?: Address) {\n return await methGetPosition(this, userAddress);\n }\n\n /**\n * Swap WETH to mETH using DEX aggregator\n * @param amount - Amount of WETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\n async swapToMeth(amount: string, slippage: number = 0.5) {\n return await swapToMeth(this, amount, slippage);\n }\n\n /**\n * Swap mETH to WETH using DEX aggregator\n * @param amount - Amount of mETH to swap (in wei as string)\n * @param slippage - Slippage tolerance percentage (default 0.5%)\n * @returns Transaction hash\n */\n async swapFromMeth(amount: string, slippage: number = 0.5) {\n return await swapFromMeth(this, amount, slippage);\n }\n\n // Squid Router Cross-chain\n async getSquidRoute(\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n ) {\n return await getSquidRoute(\n this,\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n slippage,\n );\n }\n\n async crossChainSwapViaSquid(\n fromToken: Address,\n toToken: Address,\n fromChain: number,\n toChain: number,\n amount: string,\n slippage: number = 1,\n ) {\n return await crossChainSwapViaSquid(\n this,\n fromToken,\n toToken,\n fromChain,\n toChain,\n amount,\n slippage,\n );\n }\n\n // PikePerps - Perpetual Trading\n /**\n * Open a long position on PikePerps\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100, default 10)\n * @returns Position ID and transaction hash\n */\n async pikeperpsOpenLong(\n tokenAddress: Address,\n margin: string,\n leverage: number = 10,\n ) {\n return await pikeperpsOpenLong(this, tokenAddress, margin, leverage);\n }\n\n /**\n * Open a short position on PikePerps\n * @param tokenAddress - Token to trade (meme token address)\n * @param margin - Margin amount in wei (as string)\n * @param leverage - Leverage multiplier (1-100, default 10)\n * @returns Position ID and transaction hash\n */\n async pikeperpsOpenShort(\n tokenAddress: Address,\n margin: string,\n leverage: number = 10,\n ) {\n return await pikeperpsOpenShort(this, tokenAddress, margin, leverage);\n }\n\n /**\n * Close an existing position on PikePerps\n * @param positionId - Position ID to close\n * @returns Transaction hash\n */\n async pikeperpsClosePosition(positionId: bigint) {\n return await pikeperpsClosePosition(this, positionId);\n }\n\n /**\n * Get all positions for a user on PikePerps\n * Returns detailed position data including PnL and liquidation prices\n * @param userAddress - User wallet address (optional, defaults to agent account)\n * @returns Array of positions with PnL and liquidation data\n */\n async pikeperpsGetPositions(userAddress?: Address) {\n return await pikeperpsGetPositions(this, userAddress);\n }\n\n /**\n * Get market data for a token on PikePerps\n * Returns current price and recent trades\n * @param tokenAddress - Token address to get market data for\n * @param limit - Maximum number of recent trades to return (default 20)\n * @returns Market data with price and recent trades\n */\n async pikeperpsGetMarketData(tokenAddress: Address, limit: number = 20) {\n return await pikeperpsGetMarketData(this, tokenAddress, limit);\n }\n\n // ===== Pyth Network Price Feeds =====\n\n /**\n * Get real-time price from Pyth Network\n * @param priceFeedIdOrPair - Price feed ID or pair name (e.g., \"ETH/USD\", \"BTC/USD\", \"MNT/USD\")\n * @returns Price data with formatted price\n */\n async pythGetPrice(priceFeedIdOrPair: string) {\n return await pythGetPrice(this, priceFeedIdOrPair);\n }\n\n /**\n * Get EMA (Exponential Moving Average) price from Pyth\n * @param priceFeedIdOrPair - Price feed ID or pair name\n * @returns EMA price data\n */\n async pythGetEmaPrice(priceFeedIdOrPair: string) {\n return await pythGetEmaPrice(this, priceFeedIdOrPair);\n }\n\n /**\n * Get multiple prices from Pyth in a single call\n * @param pairs - Array of pair names or price feed IDs\n * @returns Array of price responses\n */\n async pythGetMultiplePrices(pairs: string[]) {\n return await pythGetMultiplePrices(this, pairs);\n }\n\n /**\n * Get all supported Pyth price feed IDs\n * @returns Object mapping pair names to price feed IDs\n */\n pythGetSupportedPriceFeeds() {\n return pythGetSupportedPriceFeeds();\n }\n\n /**\n * Check if a price feed exists on Pyth\n * @param priceFeedIdOrPair - Price feed ID or pair name\n * @returns Boolean indicating if feed exists\n */\n async pythPriceFeedExists(priceFeedIdOrPair: string) {\n return await pythPriceFeedExists(this, priceFeedIdOrPair);\n }\n\n // ===== Token Launchpad =====\n\n /**\n * Deploy a new token (ERC20 or RWA) - supply minted to your address\n * @param name - Token name\n * @param symbol - Token symbol\n * @param supply - Total supply (human readable, e.g., \"1000000\")\n * @param tokenType - \"standard\" or \"rwa\"\n * @param assetType - For RWA: asset category\n * @param assetId - For RWA: external asset ID\n */\n async deployToken(\n name: string,\n symbol: string,\n supply: string,\n tokenType: TokenType = \"standard\",\n assetType?: string,\n assetId?: string,\n ) {\n return await deployToken(this, name, symbol, supply, tokenType, assetType, assetId);\n }\n\n /**\n * Deploy a standard ERC20 token\n * @param name - Token name\n * @param symbol - Token symbol\n * @param supply - Total supply (e.g., \"1000000\" for 1M tokens)\n */\n async deployStandardToken(name: string, symbol: string, supply: string) {\n return await deployStandardToken(this, name, symbol, supply);\n }\n\n /**\n * Deploy an RWA (Real World Asset) token\n * @param name - Token name (e.g., \"Manhattan Property Token\")\n * @param symbol - Token symbol (e.g., \"MPT\")\n * @param supply - Total supply for fractional ownership\n * @param assetType - Asset category: \"Real Estate\", \"Commodities\", \"Securities\", \"Art\"\n * @param assetId - External reference ID for the underlying asset\n */\n async deployRWAToken(\n name: string,\n symbol: string,\n supply: string,\n assetType: string,\n assetId?: string,\n ) {\n return await deployRWAToken(this, name, symbol, supply, assetType, assetId);\n }\n\n /**\n * Get token information\n */\n async getTokenInfo(tokenAddress: Address, holder?: Address) {\n return await getTokenInfo(this, tokenAddress, holder);\n }\n\n /**\n * Get token balance\n */\n async getTokenBalance(tokenAddress: Address, holder?: Address) {\n return await getTokenBalance(this, tokenAddress, holder);\n }\n\n /**\n * Transfer tokens\n */\n async transferToken(tokenAddress: Address, to: Address, amount: string) {\n return await transferToken(this, tokenAddress, to, amount);\n }\n\n // ===== NFT Launchpad =====\n\n /**\n * Deploy a new ERC721 NFT collection on Mantle Network\n * @param config - Collection configuration (name, symbol, baseURI, maxSupply)\n * @returns Collection deployment result with contract address\n */\n async deployNFTCollection(config: NFTCollectionConfig) {\n return await deployNFTCollection(this, config);\n }\n\n /**\n * Deploy an NFT collection with preset configurations\n * @param preset - Preset type: \"pfp\" (10000), \"art\" (1000), \"membership\" (100), \"unlimited\"\n * @param name - Collection name\n * @param symbol - Collection symbol\n * @param baseURI - Base URI for metadata\n * @returns Collection deployment result\n */\n async deployNFTCollectionWithPreset(\n preset: \"pfp\" | \"art\" | \"membership\" | \"unlimited\",\n name: string,\n symbol: string,\n baseURI: string,\n ) {\n return await deployNFTCollectionWithPreset(\n this,\n preset,\n name,\n symbol,\n baseURI,\n );\n }\n\n /**\n * Mint a single NFT from a collection\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address (defaults to agent address)\n * @returns Mint result with token ID\n */\n async mintNFT(collectionAddress: Address, to?: Address) {\n return await mintNFT(this, collectionAddress, to);\n }\n\n /**\n * Batch mint multiple NFTs from a collection\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address\n * @param quantity - Number of NFTs to mint\n * @returns Mint result with starting token ID\n */\n async batchMintNFT(collectionAddress: Address, to: Address, quantity: number) {\n return await batchMintNFT(this, collectionAddress, to, quantity);\n }\n\n /**\n * Get information about an NFT collection\n * @param collectionAddress - NFT collection contract address\n * @param holderAddress - Optional address to get balance for\n * @returns Collection information\n */\n async getNFTCollectionInfo(\n collectionAddress: Address,\n holderAddress?: Address,\n ) {\n return await getNFTCollectionInfo(this, collectionAddress, holderAddress);\n }\n\n /**\n * Get information about a specific NFT token\n * @param collectionAddress - NFT collection contract address\n * @param tokenId - Token ID\n * @returns Token information\n */\n async getNFTTokenInfo(collectionAddress: Address, tokenId: string) {\n return await getNFTTokenInfo(this, collectionAddress, tokenId);\n }\n\n /**\n * Get NFT balance for an address\n * @param collectionAddress - NFT collection contract address\n * @param holderAddress - Address to check (defaults to agent address)\n * @returns Balance as string\n */\n async getNFTBalance(collectionAddress: Address, holderAddress?: Address) {\n return await getNFTBalance(this, collectionAddress, holderAddress);\n }\n\n /**\n * Check if an address owns a specific NFT\n * @param collectionAddress - NFT collection contract address\n * @param tokenId - Token ID to check\n * @param ownerAddress - Address to verify ownership\n * @returns Boolean indicating ownership\n */\n async isNFTOwner(\n collectionAddress: Address,\n tokenId: string,\n ownerAddress?: Address,\n ) {\n return await isNFTOwner(this, collectionAddress, tokenId, ownerAddress);\n }\n\n /**\n * Transfer an NFT to another address\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address\n * @param tokenId - Token ID to transfer\n * @returns Transaction hash\n */\n async transferNFT(collectionAddress: Address, to: Address, tokenId: string) {\n return await transferNFT(this, collectionAddress, to, tokenId);\n }\n\n /**\n * Safe transfer an NFT (checks if recipient can receive)\n * @param collectionAddress - NFT collection contract address\n * @param to - Recipient address\n * @param tokenId - Token ID to transfer\n * @returns Transaction hash\n */\n async safeTransferNFT(\n collectionAddress: Address,\n to: Address,\n tokenId: string,\n ) {\n return await safeTransferNFT(this, collectionAddress, to, tokenId);\n }\n\n /**\n * Approve an address to transfer a specific NFT\n * @param collectionAddress - NFT collection contract address\n * @param approved - Address to approve\n * @param tokenId - Token ID to approve\n * @returns Transaction hash\n */\n async approveNFT(\n collectionAddress: Address,\n approved: Address,\n tokenId: string,\n ) {\n return await approveNFT(this, collectionAddress, approved, tokenId);\n }\n\n /**\n * Set approval for all NFTs in a collection\n * @param collectionAddress - NFT collection contract address\n * @param operator - Operator address\n * @param approved - Whether to approve or revoke\n * @returns Transaction hash\n */\n async setApprovalForAllNFT(\n collectionAddress: Address,\n operator: Address,\n approved: boolean,\n ) {\n return await setApprovalForAllNFT(this, collectionAddress, operator, approved);\n }\n}\n"]}