mantle-agent-kit-sdk 1.0.0 → 1.0.2
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/.env.example +2 -2
- package/README.md +11 -8
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.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/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/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/okx/getSwapQuote.ts","../src/utils/x402/index.ts","../src/agent.ts"],"names":["parseEther","getTransactionReceipt","erc20Abi","CryptoJS","axios","getHeaders","checkAllowance","approveToken","encodeFunctionData","NATIVE_TOKEN_ADDRESS","configs","getQuoteData","getSwapData","WMNT_ADDRESS","FEE_TIERS","baseUrl","privateKeyToAccount","createWalletClient","mantle","mantleSepoliaTestnet","http","publicActions"],"mappings":"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","file":"index.cjs","sourcesContent":["import { parseEther, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { getTransactionReceipt } from \"viem/actions\";\n\nexport const sendTransaction = async (\n agent: MNTAgentKit,\n to: Address,\n amount: string,\n) => {\n const hash = await agent.client.sendTransaction({\n to,\n value: parseEther(amount),\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 { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { ETH_ADDRESS } from \"../../constants/okx\";\nimport { approveToken, getGasLimit, getSwapTransaction } from \"../../utils/okx\";\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 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\";\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 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 { NATIVE_TOKEN_ADDRESS, OPENOCEAN_EXCHANGE_PROXY } from \"../../constants/openocean\";\nimport { approveToken } from \"../../utils/common\";\nimport { getSwapData } from \"../../utils/openocean\";\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 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\";\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 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\";\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 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\";\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 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\";\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 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\";\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 // 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 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","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\";\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 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\";\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 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\";\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 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\";\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 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","// 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\";\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 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\";\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 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// 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","import type { MNTAgentKit } from \"../../agent\";\nimport { getSwapTransaction } from \"../../utils/okx\";\n\nexport const getSwapQuote = async (\n agent: MNTAgentKit,\n from: string,\n to: string,\n amount: string,\n slippagePercentage: string,\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-x402.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 {\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} from \"./tools/lendle\";\nimport { agniSwap } from \"./tools/agni\";\nimport { merchantMoeSwap } from \"./tools/merchantmoe\";\nimport { METH_TOKEN } from \"./tools/meth\";\nimport {\n initializePlatform,\n type ProjectConfig,\n} from \"./utils/x402\";\n\nexport class MNTAgentKit {\n public account: PrivateKeyAccount;\n public client: WalletClient<Transport, Chain, PrivateKeyAccount> &\n PublicActions;\n public chain: \"testnet\" | \"mainnet\";\n public projectConfig?: ProjectConfig;\n\n constructor(privateKey: Address, chain: \"mainnet\" | \"testnet\") {\n this.account = privateKeyToAccount(privateKey);\n this.chain = chain;\n this.client = createWalletClient({\n chain: chain == \"mainnet\" ? mantle : mantleSepoliaTestnet,\n transport: http(),\n account: this.account,\n }).extend(publicActions);\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 if (this.chain === \"mainnet\") {\n return await executeSwap(\n this,\n fromTokenAddress,\n toTokenAddress,\n amount,\n slippagePercentage,\n );\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(\n fromToken: Address,\n toToken: Address,\n amount: string,\n ) {\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(\n fromToken: Address,\n toToken: Address,\n amount: string,\n ) {\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(\n tokenAddress: Address,\n amount: string,\n to?: Address,\n ) {\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 // 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 return METH_TOKEN[this.chain];\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}\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/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/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/okx/getSwapQuote.ts","../src/utils/x402/index.ts","../src/agent.ts"],"names":["parseEther","getTransactionReceipt","erc20Abi","CryptoJS","axios","getHeaders","checkAllowance","approveToken","encodeFunctionData","NATIVE_TOKEN_ADDRESS","configs","getQuoteData","getSwapData","WMNT_ADDRESS","FEE_TIERS","baseUrl","privateKeyToAccount","createWalletClient","mantle","mantleSepoliaTestnet","http","publicActions"],"mappings":"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","file":"index.cjs","sourcesContent":["import { parseEther, type Address } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { getTransactionReceipt } from \"viem/actions\";\n\nexport const sendTransaction = async (\n agent: MNTAgentKit,\n to: Address,\n amount: string,\n) => {\n const hash = await agent.client.sendTransaction({\n to,\n value: parseEther(amount),\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 { Address, Hex } from \"viem\";\nimport type { MNTAgentKit } from \"../../agent\";\nimport { ETH_ADDRESS } from \"../../constants/okx\";\nimport { approveToken, getGasLimit, getSwapTransaction } from \"../../utils/okx\";\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 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\";\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 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 { NATIVE_TOKEN_ADDRESS, OPENOCEAN_EXCHANGE_PROXY } from \"../../constants/openocean\";\nimport { approveToken } from \"../../utils/common\";\nimport { getSwapData } from \"../../utils/openocean\";\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 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\";\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 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\";\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 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\";\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 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\";\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 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\";\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 // 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 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","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\";\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 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\";\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 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\";\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 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\";\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 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","// 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\";\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 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\";\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 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// 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","import type { MNTAgentKit } from \"../../agent\";\nimport { getSwapTransaction } from \"../../utils/okx\";\n\nexport const getSwapQuote = async (\n agent: MNTAgentKit,\n from: string,\n to: string,\n amount: string,\n slippagePercentage: string,\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 {\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} from \"./tools/lendle\";\nimport { agniSwap } from \"./tools/agni\";\nimport { merchantMoeSwap } from \"./tools/merchantmoe\";\nimport { METH_TOKEN } from \"./tools/meth\";\nimport {\n initializePlatform,\n type ProjectConfig,\n} from \"./utils/x402\";\n\nexport class MNTAgentKit {\n public account: PrivateKeyAccount;\n public client: WalletClient<Transport, Chain, PrivateKeyAccount> &\n PublicActions;\n public chain: \"testnet\" | \"mainnet\";\n public projectConfig?: ProjectConfig;\n\n constructor(privateKey: Address, chain: \"mainnet\" | \"testnet\") {\n this.account = privateKeyToAccount(privateKey);\n this.chain = chain;\n this.client = createWalletClient({\n chain: chain == \"mainnet\" ? mantle : mantleSepoliaTestnet,\n transport: http(),\n account: this.account,\n }).extend(publicActions);\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 if (this.chain === \"mainnet\") {\n return await executeSwap(\n this,\n fromTokenAddress,\n toTokenAddress,\n amount,\n slippagePercentage,\n );\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(\n fromToken: Address,\n toToken: Address,\n amount: string,\n ) {\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(\n fromToken: Address,\n toToken: Address,\n amount: string,\n ) {\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(\n tokenAddress: Address,\n amount: string,\n to?: Address,\n ) {\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 // 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 return METH_TOKEN[this.chain];\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}\n"]}
|