@elizaos/plugin-auto-trader 2.0.0-alpha.1
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/README.md +143 -0
- package/dist/MeanReversionStrategy-4ZBKT4XN.js +9 -0
- package/dist/MeanReversionStrategy-4ZBKT4XN.js.map +1 -0
- package/dist/MomentumBreakoutStrategy-O7I3EMGB.js +9 -0
- package/dist/MomentumBreakoutStrategy-O7I3EMGB.js.map +1 -0
- package/dist/RandomStrategy-GPGG56MV.js +9 -0
- package/dist/RandomStrategy-GPGG56MV.js.map +1 -0
- package/dist/RuleBasedStrategy-7O47DGTU.js +9 -0
- package/dist/RuleBasedStrategy-7O47DGTU.js.map +1 -0
- package/dist/chunk-AS6N6A3H.js +18 -0
- package/dist/chunk-AS6N6A3H.js.map +1 -0
- package/dist/chunk-BSXTWI5Q.js +162 -0
- package/dist/chunk-BSXTWI5Q.js.map +1 -0
- package/dist/chunk-GYTZTIWK.js +276 -0
- package/dist/chunk-GYTZTIWK.js.map +1 -0
- package/dist/chunk-JCQL2EFG.js +58 -0
- package/dist/chunk-JCQL2EFG.js.map +1 -0
- package/dist/chunk-KB2EBQUN.js +100 -0
- package/dist/chunk-KB2EBQUN.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-Z6SUPK5O.js +310 -0
- package/dist/chunk-Z6SUPK5O.js.map +1 -0
- package/dist/index.js +7818 -0
- package/dist/index.js.map +1 -0
- package/dist/index.node-YLFTRMAZ.js +836 -0
- package/dist/index.node-YLFTRMAZ.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/__tests__/e2e/test-utils.ts","../src/__tests__/e2e/autotrading-scenarios.ts","../../../../node_modules/axios/lib/helpers/bind.js","../../../../node_modules/axios/lib/utils.js","../../../../node_modules/axios/lib/core/AxiosError.js","../../../../node_modules/axios/lib/platform/node/classes/FormData.js","../../../../node_modules/axios/lib/helpers/toFormData.js","../../../../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../../../../node_modules/axios/lib/helpers/buildURL.js","../../../../node_modules/axios/lib/core/InterceptorManager.js","../../../../node_modules/axios/lib/defaults/transitional.js","../../../../node_modules/axios/lib/platform/node/index.js","../../../../node_modules/axios/lib/platform/node/classes/URLSearchParams.js","../../../../node_modules/axios/lib/platform/common/utils.js","../../../../node_modules/axios/lib/platform/index.js","../../../../node_modules/axios/lib/helpers/toURLEncodedForm.js","../../../../node_modules/axios/lib/helpers/formDataToJSON.js","../../../../node_modules/axios/lib/defaults/index.js","../../../../node_modules/axios/lib/helpers/parseHeaders.js","../../../../node_modules/axios/lib/core/AxiosHeaders.js","../../../../node_modules/axios/lib/core/transformData.js","../../../../node_modules/axios/lib/cancel/isCancel.js","../../../../node_modules/axios/lib/cancel/CanceledError.js","../../../../node_modules/axios/lib/core/settle.js","../../../../node_modules/axios/lib/helpers/isAbsoluteURL.js","../../../../node_modules/axios/lib/helpers/combineURLs.js","../../../../node_modules/axios/lib/core/buildFullPath.js","../../../../node_modules/axios/lib/adapters/http.js","../../../../node_modules/axios/lib/env/data.js","../../../../node_modules/axios/lib/helpers/parseProtocol.js","../../../../node_modules/axios/lib/helpers/fromDataURI.js","../../../../node_modules/axios/lib/helpers/AxiosTransformStream.js","../../../../node_modules/axios/lib/helpers/formDataToStream.js","../../../../node_modules/axios/lib/helpers/readBlob.js","../../../../node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js","../../../../node_modules/axios/lib/helpers/callbackify.js","../../../../node_modules/axios/lib/helpers/speedometer.js","../../../../node_modules/axios/lib/helpers/throttle.js","../../../../node_modules/axios/lib/helpers/progressEventReducer.js","../../../../node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js","../../../../node_modules/axios/lib/helpers/isURLSameOrigin.js","../../../../node_modules/axios/lib/helpers/cookies.js","../../../../node_modules/axios/lib/core/mergeConfig.js","../../../../node_modules/axios/lib/helpers/resolveConfig.js","../../../../node_modules/axios/lib/adapters/xhr.js","../../../../node_modules/axios/lib/helpers/composeSignals.js","../../../../node_modules/axios/lib/helpers/trackStream.js","../../../../node_modules/axios/lib/adapters/fetch.js","../../../../node_modules/axios/lib/adapters/adapters.js","../../../../node_modules/axios/lib/core/dispatchRequest.js","../../../../node_modules/axios/lib/helpers/validator.js","../../../../node_modules/axios/lib/core/Axios.js","../../../../node_modules/axios/lib/cancel/CancelToken.js","../../../../node_modules/axios/lib/helpers/spread.js","../../../../node_modules/axios/lib/helpers/isAxiosError.js","../../../../node_modules/axios/lib/helpers/HttpStatusCode.js","../../../../node_modules/axios/lib/axios.js","../../../../node_modules/axios/index.js","../src/__tests__/e2e/liveTrading-scenarios.ts","../src/__tests__/e2e/mock-trading-scenario.ts","../src/actions/analyzePerformanceAction.ts","../src/actions/checkPortfolioAction.ts","../src/actions/compareStrategiesAction.ts","../src/actions/configureStrategyAction.ts","../src/actions/executeLiveTradeAction.ts","../src/services/SwapService.ts","../src/actions/getMarketAnalysisAction.ts","../src/actions/runBacktestAction.ts","../src/actions/startTradingAction.ts","../src/actions/stopTradingAction.ts","../src/providers/marketDataProvider.ts","../src/providers/strategyProvider.ts","../src/providers/tradingProvider.ts","../src/services/AutoTradingManager.ts","../src/strategies/LLMStrategy.ts","../src/services/TokenResolverService.ts","../src/services/TokenValidationService.ts","../src/services/TradingTrajectoryService.ts","../src/index.ts"],"sourcesContent":["import { strict as assert } from \"node:assert\";\nimport {\n asUUID,\n ChannelType,\n type Content,\n createUniqueUuid,\n type Entity,\n EventType,\n elizaLogger,\n type IAgentRuntime,\n type Memory,\n type Room,\n type World,\n} from \"@elizaos/core\";\nimport { v4 as uuid } from \"uuid\";\nimport type { AutoTradingManager } from \"../../services/AutoTradingManager.ts\";\n\n/**\n * Sets up a standard scenario environment for an E2E test.\n *\n * This function creates a world, a user, and a room, providing an\n * isolated environment for each test case.\n *\n * @param runtime The live IAgentRuntime instance provided by the TestRunner.\n * @returns A promise that resolves to an object containing the created world, user, and room.\n */\nexport async function setupScenario(\n runtime: IAgentRuntime,\n): Promise<{ user: Entity; room: Room; world: World }> {\n assert(runtime.agentId, \"Runtime must have an agentId to run a scenario\");\n\n // Set up mock environment for auto-trader\n process.env.USE_MOCK_EXCHANGE = \"true\";\n\n // 1. Create a test user entity first, so we can assign ownership\n const user: Entity = {\n id: asUUID(uuid()),\n names: [\"Test User\"],\n agentId: runtime.agentId,\n metadata: { type: \"user\" },\n };\n await runtime.createEntity(user);\n assert(user.id, \"Created user must have an id\");\n\n // 2. Create a World and assign the user as the owner.\n // This is critical for providers that check for ownership.\n const testServerId = asUUID(uuid());\n const world: World = {\n id: asUUID(uuid()),\n agentId: runtime.agentId,\n name: \"E2E Test World\",\n serverId: testServerId,\n metadata: {\n ownership: {\n ownerId: user.id,\n },\n },\n };\n await runtime.ensureWorldExists(world);\n\n // 3. Create a test room associated with the world\n const room: Room = {\n id: asUUID(uuid()),\n name: \"Test DM Room\",\n type: ChannelType.DM,\n source: \"e2e-test\",\n worldId: world.id,\n serverId: world.serverId,\n };\n await runtime.createRoom(room);\n\n // 4. Ensure both the agent and the user are participants in the room\n await runtime.ensureParticipantInRoom(runtime.agentId, room.id);\n await runtime.ensureParticipantInRoom(user.id, room.id);\n\n // 5. Cache mock data for testing\n await runtime.setCache(\"mock_strategies\", [\n {\n id: \"random\",\n name: \"Random Strategy\",\n description: \"Makes random trades.\",\n },\n {\n id: \"rsi\",\n name: \"RSI Strategy\",\n description: \"Trades based on RSI indicator.\",\n },\n {\n id: \"rule-based\",\n name: \"Rule-Based Strategy\",\n description: \"A simple rule-based strategy.\",\n },\n ]);\n\n return { user, room, world };\n}\n\n/**\n * Simulates a user sending a message and waits for the agent's response.\n *\n * This function abstracts the event-driven nature of the message handler\n * into a simple async function, making tests easier to write and read.\n *\n * @param runtime The live IAgentRuntime instance.\n * @param room The room where the message is sent.\n * @param user The user entity sending the message.\n * @param text The content of the message.\n * @returns A promise that resolves with the agent's response content.\n */\nexport function sendMessageAndWaitForResponse(\n runtime: IAgentRuntime,\n room: Room,\n user: Entity,\n text: string,\n): Promise<Content> {\n return new Promise((resolve) => {\n assert(runtime.agentId, \"Runtime must have an agentId to send a message\");\n assert(user.id, \"User must have an id to send a message\");\n\n // Construct the message object, simulating an incoming message from a user\n const message: Memory = {\n id: createUniqueUuid(runtime, `${user.id}-${Date.now()}`),\n agentId: runtime.agentId,\n entityId: user.id,\n roomId: room.id,\n content: {\n text,\n },\n createdAt: Date.now(),\n };\n\n // The callback function that the message handler will invoke with the agent's final response.\n // We use this callback to resolve our promise.\n const callback = async (responseContent: Content): Promise<Memory[]> => {\n resolve(responseContent);\n return [];\n };\n\n // Emit the event to trigger the agent's message processing logic.\n runtime.emitEvent(EventType.MESSAGE_RECEIVED, {\n runtime,\n message,\n callback,\n } as unknown as Parameters<typeof runtime.emitEvent>[1]);\n });\n}\n\nexport interface TestContext {\n runtime: IAgentRuntime;\n tradingManager: AutoTradingManager;\n startTime: number;\n}\n\nexport async function waitForTrading(runtime: IAgentRuntime, maxWaitMs = 30000): Promise<boolean> {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitMs) {\n const status = tradingManager.getStatus();\n if (status.isTrading) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return false;\n}\n\nexport async function monitorTrades(runtime: IAgentRuntime, durationMs: number): Promise<any> {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n const startTime = Date.now();\n const tradeLog: any[] = [];\n\n elizaLogger.info(`[Test] Monitoring trades for ${durationMs / 1000} seconds...`);\n\n while (Date.now() - startTime < durationMs) {\n const status = tradingManager.getStatus();\n const performance = tradingManager.getPerformance();\n\n tradeLog.push({\n timestamp: Date.now(),\n isTrading: status.isTrading,\n strategy: status.strategy,\n positions: status.positions.length,\n performance: {\n totalPnL: performance.totalPnL,\n dailyPnL: performance.dailyPnL,\n totalTrades: performance.totalTrades,\n winRate: performance.winRate,\n },\n });\n\n // Log every 10 seconds\n if ((Date.now() - startTime) % 10000 < 1000) {\n elizaLogger.info(\n `[Test] Trading status: elapsed=${Math.floor((Date.now() - startTime) / 1000)}s positions=${tradeLog[tradeLog.length - 1]?.positions ?? 0}`,\n );\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n return {\n duration: Date.now() - startTime,\n tradeLog,\n finalStatus: tradingManager.getStatus(),\n finalPerformance: tradingManager.getPerformance(),\n };\n}\n\nexport function validateTradingResult(result: any): void {\n if (!result.finalStatus) {\n throw new Error(\"No final status in trading result\");\n }\n\n if (!result.finalPerformance) {\n throw new Error(\"No final performance in trading result\");\n }\n\n // Log summary\n elizaLogger.info(\n `[Test] Trading Summary: duration=${result.duration / 1000}s trades=${result.finalPerformance.totalTrades} winRate=${(result.finalPerformance.winRate * 100).toFixed(1)}% totalPnL=${result.finalPerformance.totalPnL.toFixed(2)} dailyPnL=${result.finalPerformance.dailyPnL.toFixed(2)} positions=${result.finalStatus.positions.length}`,\n );\n}\n\nexport async function simulateConversation(\n _runtime: IAgentRuntime,\n messages: string[],\n delayMs = 5000,\n): Promise<void> {\n for (const message of messages) {\n elizaLogger.info(`[Test] User message: \"${message}\"`);\n\n // Simulate user sending a message\n // In a real implementation, this would go through the message handler\n // For now, we'll just log it\n\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n}\n","import type { TestSuite } from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../../services/AutoTradingManager.ts\";\nimport { monitorTrades, validateTradingResult, waitForTrading } from \"./test-utils.ts\";\n\nconst _sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * E2E test suite for autonomous trading functionality\n */\nexport const autoTradingScenarios: TestSuite = {\n name: \"Auto Trading Core Scenarios\",\n tests: [\n {\n name: \"should start and stop trading with momentum strategy\",\n fn: async (runtime) => {\n console.log(\"\\nš Testing momentum strategy trading...\\n\");\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n if (!tradingManager) {\n throw new Error(\"AutoTradingManager service not found\");\n }\n\n // Start trading with momentum strategy\n await tradingManager.startTrading({\n strategy: \"momentum-breakout-v1\",\n tokens: [\"BONK\", \"WIF\"],\n maxPositionSize: 100, // $100 max position\n intervalMs: 5000, // 5 second intervals for testing\n stopLossPercent: 2,\n takeProfitPercent: 5,\n maxDailyLoss: 50,\n });\n\n // Wait for trading to start\n const started = await waitForTrading(runtime);\n if (!started) {\n throw new Error(\"Trading did not start within timeout\");\n }\n\n // Monitor for 30 seconds\n const result = await monitorTrades(runtime, 30000);\n\n // Stop trading\n await tradingManager.stopTrading();\n\n // Validate results\n validateTradingResult(result);\n\n console.log(\"ā
Momentum strategy test completed\");\n },\n },\n\n {\n name: \"should handle multiple strategies and switch between them\",\n fn: async (runtime) => {\n console.log(\"\\nš Testing strategy switching...\\n\");\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n\n // Start with rule-based strategy\n await tradingManager.startTrading({\n strategy: \"rule-based-v1\",\n tokens: [\"SOL\"],\n maxPositionSize: 200,\n intervalMs: 3000,\n });\n\n await monitorTrades(runtime, 15000);\n\n // Switch to mean reversion\n await tradingManager.stopTrading();\n await tradingManager.startTrading({\n strategy: \"mean-reversion\",\n tokens: [\"BONK\"],\n maxPositionSize: 150,\n intervalMs: 3000,\n });\n\n await monitorTrades(runtime, 15000);\n\n await tradingManager.stopTrading();\n\n console.log(\"ā
Strategy switching test completed\");\n },\n },\n\n {\n name: \"should respect risk management limits\",\n fn: async (runtime) => {\n console.log(\"\\nš”ļø Testing risk management...\\n\");\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n\n // Start with tight risk limits\n await tradingManager.startTrading({\n strategy: \"momentum-breakout-v1\",\n tokens: [\"WIF\", \"POPCAT\"],\n maxPositionSize: 50,\n intervalMs: 2000,\n stopLossPercent: 1, // Tight stop loss\n takeProfitPercent: 2,\n maxDailyLoss: 20, // Low daily loss limit\n });\n\n const result = await monitorTrades(runtime, 20000);\n\n await tradingManager.stopTrading();\n\n // Check that positions respect limits\n const maxPositionValue = Math.max(\n ...result.tradeLog.map(\n (log: any) => log.positions * 50, // Assuming rough position value\n ),\n );\n\n if (maxPositionValue > 50) {\n throw new Error(`Position size exceeded limit: ${maxPositionValue}`);\n }\n\n console.log(\"ā
Risk management test completed\");\n },\n },\n\n {\n name: \"should track performance metrics accurately\",\n fn: async (runtime) => {\n console.log(\"\\nš Testing performance tracking...\\n\");\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n\n // Get initial performance\n const initialPerf = tradingManager.getPerformance();\n\n // Run random strategy for predictable trades\n await tradingManager.startTrading({\n strategy: \"random-v1\",\n tokens: [\"BONK\"],\n maxPositionSize: 100,\n intervalMs: 4000,\n });\n\n const _result = await monitorTrades(runtime, 20000);\n\n await tradingManager.stopTrading();\n\n const finalPerf = tradingManager.getPerformance();\n\n // Verify metrics changed\n if (finalPerf.totalTrades === initialPerf.totalTrades) {\n console.warn(\"ā ļø No trades executed during test period\");\n }\n\n console.log(\"š Performance Metrics:\", {\n trades: finalPerf.totalTrades - initialPerf.totalTrades,\n winRate: `${(finalPerf.winRate * 100).toFixed(1)}%`,\n totalPnL: finalPerf.totalPnL.toFixed(2),\n dailyPnL: finalPerf.dailyPnL.toFixed(2),\n });\n\n console.log(\"ā
Performance tracking test completed\");\n },\n },\n\n {\n name: \"should handle concurrent operations gracefully\",\n fn: async (runtime) => {\n console.log(\"\\nš Testing concurrent operations...\\n\");\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n\n // Try to start multiple trading sessions\n const promises = [\n tradingManager.startTrading({\n strategy: \"random-v1\",\n tokens: [\"SOL\"],\n maxPositionSize: 100,\n intervalMs: 5000,\n }),\n tradingManager.startTrading({\n strategy: \"momentum-breakout-v1\",\n tokens: [\"BONK\"],\n maxPositionSize: 100,\n intervalMs: 5000,\n }),\n ];\n\n try {\n await Promise.all(promises);\n throw new Error(\"Should not allow concurrent trading sessions\");\n } catch (error: any) {\n if (!error.message.includes(\"Already trading\")) {\n throw error;\n }\n console.log(\"ā
Correctly prevented concurrent trading sessions\");\n }\n\n await tradingManager.stopTrading();\n\n console.log(\"ā
Concurrent operations test completed\");\n },\n },\n ],\n};\n\nexport default autoTradingScenarios;\n","'use strict';\n\n/**\n * Create a bound version of a function with a specified `this` context\n *\n * @param {Function} fn - The function to bind\n * @param {*} thisArg - The value to be passed as the `this` parameter\n * @returns {Function} A new function that will call the original function with the specified `this` context\n */\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","import FormData from 'form-data';\n\nexport default FormData;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import crypto from 'crypto';\nimport URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n const randomValues = new Uint32Array(size);\n crypto.randomFillSync(randomValues);\n for (let i = 0; i < size; i++) {\n str += alphabet[randomValues[i] % length];\n }\n\n return str;\n}\n\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: typeof Blob !== 'undefined' && Blob || null\n },\n ALPHABET,\n generateString,\n protocols: [ 'http', 'https', 'file', 'data' ]\n};\n","'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from './../helpers/buildURL.js';\nimport proxyFromEnv from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport http2 from 'http2';\nimport util from 'util';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport {VERSION} from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport {EventEmitter} from 'events';\nimport formDataToStream from \"../helpers/formDataToStream.js\";\nimport readBlob from \"../helpers/readBlob.js\";\nimport ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';\nimport callbackify from \"../helpers/callbackify.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';\n\nconst zlibOptions = {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n};\n\nconst brotliOptions = {\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n}\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst {http: httpFollow, https: httpsFollow} = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map(protocol => {\n return protocol + ':';\n});\n\n\nconst flushOnFinish = (stream, [throttled, flush]) => {\n stream\n .on('end', flush)\n .on('error', flush);\n\n return throttled;\n}\n\nclass Http2Sessions {\n constructor() {\n this.sessions = Object.create(null);\n }\n\n getSession(authority, options) {\n options = Object.assign({\n sessionTimeout: 1000\n }, options);\n\n let authoritySessions = this.sessions[authority];\n\n if (authoritySessions) {\n let len = authoritySessions.length;\n\n for (let i = 0; i < len; i++) {\n const [sessionHandle, sessionOptions] = authoritySessions[i];\n if (!sessionHandle.destroyed && !sessionHandle.closed && util.isDeepStrictEqual(sessionOptions, options)) {\n return sessionHandle;\n }\n }\n }\n\n const session = http2.connect(authority, options);\n\n let removed;\n\n const removeSession = () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n let entries = authoritySessions, len = entries.length, i = len;\n\n while (i--) {\n if (entries[i][0] === session) {\n if (len === 1) {\n delete this.sessions[authority];\n } else {\n entries.splice(i, 1);\n }\n return;\n }\n }\n };\n\n const originalRequestFn = session.request;\n\n const {sessionTimeout} = options;\n\n if(sessionTimeout != null) {\n\n let timer;\n let streamsCount = 0;\n\n session.request = function () {\n const stream = originalRequestFn.apply(this, arguments);\n\n streamsCount++;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n stream.once('close', () => {\n if (!--streamsCount) {\n timer = setTimeout(() => {\n timer = null;\n removeSession();\n }, sessionTimeout);\n }\n });\n\n return stream;\n }\n }\n\n session.once('close', removeSession);\n\n let entry = [\n session,\n options\n ];\n\n authoritySessions ? authoritySessions.push(entry) : authoritySessions = this.sessions[authority] = [entry];\n\n return session;\n }\n}\n\nconst http2Sessions = new Http2Sessions();\n\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */\nfunction dispatchBeforeRedirect(options, responseDetails) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options, responseDetails);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = proxyFromEnv.getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n const base64 = Buffer\n .from(proxy.auth, 'utf8')\n .toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\nconst isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process';\n\n// temporary hotfix\n\nconst wrapAsync = (asyncExecutor) => {\n return new Promise((resolve, reject) => {\n let onDone;\n let isDone;\n\n const done = (value, isRejected) => {\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n }\n\n const _resolve = (value) => {\n done(value);\n resolve(value);\n };\n\n const _reject = (reason) => {\n done(reason, true);\n reject(reason);\n }\n\n asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);\n })\n};\n\nconst resolveFamily = ({address, family}) => {\n if (!utils.isString(address)) {\n throw TypeError('address must be a string');\n }\n return ({\n address,\n family: family || (address.indexOf('.') < 0 ? 6 : 4)\n });\n}\n\nconst buildAddressEntry = (address, family) => resolveFamily(utils.isObject(address) ? address : {address, family});\n\nconst http2Transport = {\n request(options, cb) {\n const authority = options.protocol + '//' + options.hostname + ':' + (options.port || 80);\n\n const {http2Options, headers} = options;\n\n const session = http2Sessions.getSession(authority, http2Options);\n\n const {\n HTTP2_HEADER_SCHEME,\n HTTP2_HEADER_METHOD,\n HTTP2_HEADER_PATH,\n HTTP2_HEADER_STATUS\n } = http2.constants;\n\n const http2Headers = {\n [HTTP2_HEADER_SCHEME]: options.protocol.replace(':', ''),\n [HTTP2_HEADER_METHOD]: options.method,\n [HTTP2_HEADER_PATH]: options.path,\n }\n\n utils.forEach(headers, (header, name) => {\n name.charAt(0) !== ':' && (http2Headers[name] = header);\n });\n\n const req = session.request(http2Headers);\n\n req.once('response', (responseHeaders) => {\n const response = req; //duplex\n\n responseHeaders = Object.assign({}, responseHeaders);\n\n const status = responseHeaders[HTTP2_HEADER_STATUS];\n\n delete responseHeaders[HTTP2_HEADER_STATUS];\n\n response.headers = responseHeaders;\n\n response.statusCode = +status;\n\n cb(response);\n })\n\n return req;\n }\n}\n\n/*eslint consistent-return:0*/\nexport default isHttpAdapterSupported && function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let {data, lookup, family, httpVersion = 1, http2Options} = config;\n const {responseType, responseEncoding} = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n\n httpVersion = +httpVersion;\n\n if (Number.isNaN(httpVersion)) {\n throw TypeError(`Invalid protocol version: '${config.httpVersion}' is not a number`);\n }\n\n if (httpVersion !== 1 && httpVersion !== 2) {\n throw TypeError(`Unsupported protocol version '${httpVersion}'`);\n }\n\n const isHttp2 = httpVersion === 2;\n\n if (lookup) {\n const _lookup = callbackify(lookup, (value) => utils.isArray(value) ? value : [value]);\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb) => {\n _lookup(hostname, opt, (err, arg0, arg1) => {\n if (err) {\n return cb(err);\n }\n\n const addresses = utils.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];\n\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n }\n }\n\n const abortEmitter = new EventEmitter();\n\n function abort(reason) {\n try {\n abortEmitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);\n } catch(err) {\n console.warn('emit error', err);\n }\n }\n\n abortEmitter.once('abort', reject);\n\n const onFinished = () => {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n abortEmitter.removeAllListeners();\n }\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n onDone((response, isRejected) => {\n isDone = true;\n\n if (isRejected) {\n rejected = true;\n onFinished();\n return;\n }\n\n const {data} = response;\n\n if (data instanceof stream.Readable || data instanceof stream.Duplex) {\n const offListeners = stream.finished(data, () => {\n offListeners();\n onFinished();\n });\n } else {\n onFinished();\n }\n });\n\n\n\n\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n // Apply the same semantics as HTTP: only enforce if a finite, non-negative cap is set.\n if (config.maxContentLength > -1) {\n // Use the exact string passed to fromDataURI (config.url); fall back to fullPath if needed.\n const dataUrl = String(config.url || fullPath || '');\n const estimated = estimateDataURLDecodedBytes(dataUrl);\n\n if (estimated > config.maxContentLength) {\n return reject(new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config\n ));\n }\n }\n\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n convertedData = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: new AxiosHeaders(),\n config\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\n 'Unsupported protocol ' + protocol,\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const {onUploadProgress, onDownloadProgress} = config;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for spec compliant FormData objects\n if (utils.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n\n data = formDataToStream(data, (formHeaders) => {\n headers.set(formHeaders);\n }, {\n tag: `axios-${VERSION}-boundary`,\n boundary: userBoundary && userBoundary[1] || undefined\n });\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util.promisify(data.getLength).call(data);\n Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);\n /*eslint no-empty:0*/\n } catch (e) {\n }\n }\n } else if (utils.isBlob(data) || utils.isFile(data)) {\n data.size && headers.setContentType(data.type || 'application/octet-stream');\n headers.setContentLength(data.size || 0);\n data = stream.Readable.from(readBlob(data));\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n }\n\n const contentLength = utils.toFiniteNumber(headers.getContentLength());\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, {objectMode: false});\n }\n\n data = stream.pipeline([data, new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxUploadRate)\n })], utils.noop);\n\n onUploadProgress && data.on('progress', flushOnFinish(\n data,\n progressEventDecorator(\n contentLength,\n progressEventReducer(asyncDecorator(onUploadProgress), false, 3)\n )\n ));\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set(\n 'Accept-Encoding',\n 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false\n );\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {},\n http2Options\n };\n\n // cacheable-lookup integration hotfix\n !utils.isUndefined(lookup) && (options.lookup = lookup);\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname.startsWith(\"[\") ? parsed.hostname.slice(1, -1) : parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n\n if (isHttp2) {\n transport = http2Transport;\n } else {\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n const responseLength = utils.toFiniteNumber(res.headers['content-length']);\n\n if (onDownloadProgress || maxDownloadRate) {\n const transformStream = new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxDownloadRate)\n });\n\n onDownloadProgress && transformStream.on('progress', flushOnFinish(\n transformStream,\n progressEventDecorator(\n responseLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)\n )\n ));\n\n streams.push(transformStream);\n }\n\n // decompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers['content-encoding']) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === 'HEAD' || res.statusCode === 204) {\n delete res.headers['content-encoding'];\n }\n\n switch ((res.headers['content-encoding'] || '').toLowerCase()) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'x-gzip':\n case 'compress':\n case 'x-compress':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'deflate':\n streams.push(new ZlibHeaderTransformStream());\n\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress(brotliOptions));\n delete res.headers['content-encoding'];\n }\n }\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n abort(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'stream has been aborted',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n abortEmitter.once('abort', err => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n abortEmitter.once('abort', err => {\n if (req.close) {\n req.close();\n } else {\n req.destroy(err);\n }\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (Number.isNaN(timeout)) {\n abort(new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n ));\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n abort(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n ));\n });\n } else {\n // explicitly reset the socket timeout value for a possible `keep-alive` request\n req.setTimeout(0);\n }\n\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', err => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n data && req.write(data);\n req.end();\n }\n });\n}\n\nexport const __setProxy = setProxy;\n","export const VERSION = \"1.13.2\";","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], {type: mime});\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n","'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform{\n constructor(options) {\n options = utils.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source) => {\n return !utils.isUndefined(source[prop]);\n });\n\n super({\n readableHighWaterMark: options.chunkSize\n });\n\n const internals = this[kInternals] = {\n timeWindow: options.timeWindow,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n\n this.on('newListener', event => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = (maxRate / divider);\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n\n const pushChunk = (_chunk, _callback) => {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n internals.isCaptured && this.emit('progress', internals.bytesSeen);\n\n if (this.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n }\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(_chunk, chunkRemainder ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n}\n\nexport default AxiosTransformStream;\n","import util from 'util';\nimport {Readable} from 'stream';\nimport utils from \"../utils.js\";\nimport readBlob from \"./readBlob.js\";\nimport platform from \"../platform/index.js\";\n\nconst BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';\n\nconst textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util.TextEncoder();\n\nconst CRLF = '\\r\\n';\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\n\nclass FormDataPart {\n constructor(name, value) {\n const {escapeName} = this.constructor;\n const isStringValue = utils.isString(value);\n\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${\n !isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : ''\n }${CRLF}`;\n\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || \"application/octet-stream\"}${CRLF}`\n }\n\n this.headers = textEncoder.encode(headers + CRLF);\n\n this.contentLength = isStringValue ? value.byteLength : value.size;\n\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n\n this.name = name;\n this.value = value;\n }\n\n async *encode(){\n yield this.headers;\n\n const {value} = this;\n\n if(utils.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob(value);\n }\n\n yield CRLF_BYTES;\n }\n\n static escapeName(name) {\n return String(name).replace(/[\\r\\n\"]/g, (match) => ({\n '\\r' : '%0D',\n '\\n' : '%0A',\n '\"' : '%22',\n }[match]));\n }\n}\n\nconst formDataToStream = (form, headersHandler, options) => {\n const {\n tag = 'form-data-boundary',\n size = 25,\n boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)\n } = options || {};\n\n if(!utils.isFormData(form)) {\n throw TypeError('FormData instance required');\n }\n\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error('boundary must be 10-70 characters long')\n }\n\n const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);\n const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF);\n let contentLength = footerBytes.byteLength;\n\n const parts = Array.from(form.entries()).map(([name, value]) => {\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n\n contentLength += boundaryBytes.byteLength * parts.length;\n\n contentLength = utils.toFiniteNumber(contentLength);\n\n const computedHeaders = {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`\n }\n\n if (Number.isFinite(contentLength)) {\n computedHeaders['Content-Length'] = contentLength;\n }\n\n headersHandler && headersHandler(computedHeaders);\n\n return Readable.from((async function *() {\n for(const part of parts) {\n yield boundaryBytes;\n yield* part.encode();\n }\n\n yield footerBytes;\n })());\n};\n\nexport default formDataToStream;\n","const {asyncIterator} = Symbol;\n\nconst readBlob = async function* (blob) {\n if (blob.stream) {\n yield* blob.stream()\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer()\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n}\n\nexport default readBlob;\n","\"use strict\";\n\nimport stream from \"stream\";\n\nclass ZlibHeaderTransformStream extends stream.Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) { // Hex: 78\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C \n this.push(header, encoding);\n }\n }\n\n this.__transform(chunk, encoding, callback);\n }\n}\n\nexport default ZlibHeaderTransformStream;\n","import utils from \"../utils.js\";\n\nconst callbackify = (fn, reducer) => {\n return utils.isAsyncFn(fn) ? function (...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value) => {\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n } : fn;\n}\n\nexport default callbackify;\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","/**\n * Estimate decoded byte length of a data:// URL *without* allocating large buffers.\n * - For base64: compute exact decoded size using length and padding;\n * handle %XX at the character-count level (no string allocation).\n * - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound.\n *\n * @param {string} url\n * @returns {number}\n */\nexport default function estimateDataURLDecodedBytes(url) {\n if (!url || typeof url !== 'string') return 0;\n if (!url.startsWith('data:')) return 0;\n\n const comma = url.indexOf(',');\n if (comma < 0) return 0;\n\n const meta = url.slice(5, comma);\n const body = url.slice(comma + 1);\n const isBase64 = /;base64/i.test(meta);\n\n if (isBase64) {\n let effectiveLen = body.length;\n const len = body.length; // cache length\n\n for (let i = 0; i < len; i++) {\n if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) {\n const a = body.charCodeAt(i + 1);\n const b = body.charCodeAt(i + 2);\n const isHex =\n ((a >= 48 && a <= 57) || (a >= 65 && a <= 70) || (a >= 97 && a <= 102)) &&\n ((b >= 48 && b <= 57) || (b >= 65 && b <= 70) || (b >= 97 && b <= 102));\n\n if (isHex) {\n effectiveLen -= 2;\n i += 2;\n }\n }\n }\n\n let pad = 0;\n let idx = len - 1;\n\n const tailIsPct3D = (j) =>\n j >= 2 &&\n body.charCodeAt(j - 2) === 37 && // '%'\n body.charCodeAt(j - 1) === 51 && // '3'\n (body.charCodeAt(j) === 68 || body.charCodeAt(j) === 100); // 'D' or 'd'\n\n if (idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n idx--;\n } else if (tailIsPct3D(idx)) {\n pad++;\n idx -= 3;\n }\n }\n\n if (pad === 1 && idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n } else if (tailIsPct3D(idx)) {\n pad++;\n }\n }\n\n const groups = Math.floor(effectiveLen / 4);\n const bytes = groups * 3 - (pad || 0);\n return bytes > 0 ? bytes : 0;\n }\n\n return Buffer.byteLength(body, 'utf8');\n}\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure, sameSite) {\n if (typeof document === 'undefined') return;\n\n const cookie = [`${name}=${encodeURIComponent(value)}`];\n\n if (utils.isNumber(expires)) {\n cookie.push(`expires=${new Date(expires).toUTCString()}`);\n }\n if (utils.isString(path)) {\n cookie.push(`path=${path}`);\n }\n if (utils.isString(domain)) {\n cookie.push(`domain=${domain}`);\n }\n if (secure === true) {\n cookie.push('secure');\n }\n if (utils.isString(sameSite)) {\n cookie.push(`SameSite=${sameSite}`);\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n return match ? decodeURIComponent(match[1]) : null;\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000, '/');\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b, prop) => mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n Request, Response\n}))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, env);\n\n const {fetch: envFetch, Request, Response} = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = (config && config.env) || {};\n const {fetch, Request, Response} = env;\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\n/**\n * Known adapters mapping.\n * Provides environment-specific adapters for Axios:\n * - `http` for Node.js\n * - `xhr` for browsers\n * - `fetch` for fetch API-based requests\n * \n * @type {Object<string, Function|Object>}\n */\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n};\n\n// Assign adapter names for easier debugging and identification\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', { value });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', { value });\n }\n});\n\n/**\n * Render a rejection reason string for unknown or unsupported adapters\n * \n * @param {string} reason\n * @returns {string}\n */\nconst renderReason = (reason) => `- ${reason}`;\n\n/**\n * Check if the adapter is resolved (function, null, or false)\n * \n * @param {Function|null|false} adapter\n * @returns {boolean}\n */\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\n/**\n * Get the first suitable adapter from the provided list.\n * Tries each adapter in order until a supported one is found.\n * Throws an AxiosError if no adapter is suitable.\n * \n * @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.\n * @param {Object} config - Axios request configuration\n * @throws {AxiosError} If no suitable adapter is available\n * @returns {Function} The resolved adapter function\n */\nfunction getAdapter(adapters, config) {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const { length } = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n}\n\n/**\n * Exports Axios adapters and utility to resolve an adapter\n */\nexport default {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter,\n\n /**\n * Exposes all known adapters\n * @type {Object<string, Function|Object>}\n */\n adapters: knownAdapters\n};\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n","import type { TestSuite } from \"@elizaos/core\";\nimport axios from \"axios\";\nimport type { AutoTradingManager } from \"../../services/AutoTradingManager.ts\";\nimport { waitForTrading } from \"./test-utils.ts\";\n\n// Test configuration\nconst _LIVE_TRADING_TEST_CONFIG = {\n TEST_DURATION: 300000, // 5 minutes\n TRADE_INTERVAL: 30000, // Try to trade every 30 seconds\n MAX_POSITION_SIZE: 5, // $5 max per position (small for testing)\n MAX_DAILY_LOSS: 10, // $10 max daily loss\n STOP_LOSS_PERCENT: 5, // 5% stop loss\n TAKE_PROFIT_PERCENT: 10, // 10% take profit\n TRADE_PROBABILITY: 0.8, // 80% chance to trade when checked\n};\n\n// Solscan API for transaction verification\nconst SOLSCAN_API = \"https://public-api.solscan.io/transaction\";\n\nasync function verifySolscanTransaction(txId: string, retries = 3): Promise<boolean> {\n for (let i = 0; i < retries; i++) {\n try {\n await new Promise((resolve) => setTimeout(resolve, 2000 * (i + 1))); // Wait before checking\n\n const response = await axios.get(`${SOLSCAN_API}/${txId}`, {\n headers: {\n accept: \"application/json\",\n },\n });\n\n if (response.data?.success) {\n return true;\n }\n } catch (_error) {\n // Transaction might not be indexed yet\n }\n }\n return false;\n}\n\nexport const liveTradingScenarios: TestSuite = {\n name: \"Live Trading Scenarios (2 Minutes)\",\n tests: [\n {\n name: \"LIVE MAINNET: Trade real tokens for 2 minutes\",\n fn: async (runtime) => {\n const testStartTime = Date.now();\n console.log(\"\\nšø STARTING LIVE MAINNET TRADING TEST - REAL MONEY INVOLVED! šø\");\n console.log(`ā° Start time: ${new Date().toLocaleTimeString()}`);\n console.log(\"ā±ļø Duration: 2 minutes (120 seconds)\\n\");\n\n // Check if live trading is enabled\n const tradingMode = runtime.getSetting(\"TRADING_MODE\");\n if (tradingMode !== \"live\") {\n console.log('ā ļø TRADING_MODE is not set to \"live\". Skipping live trading test.');\n console.log(\"Set TRADING_MODE=live in your .env file to enable this test.\");\n return;\n }\n\n // Check for wallet\n const walletAddress =\n runtime.getSetting(\"SOLANA_ADDRESS\") || runtime.getSetting(\"WALLET_PUBLIC_KEY\");\n const privateKey = runtime.getSetting(\"SOLANA_PRIVATE_KEY\");\n\n if (!walletAddress || !privateKey) {\n throw new Error(\n \"Wallet not configured! Set SOLANA_ADDRESS and SOLANA_PRIVATE_KEY in .env\",\n );\n }\n\n console.log(`š Wallet: ${walletAddress}`);\n console.log(`š Network: Solana Mainnet`);\n\n // Check wallet balance first\n try {\n const swapService = runtime.getService(\"SwapService\") as any;\n if (swapService?.getWalletBalances) {\n const balance = await swapService.getWalletBalances();\n console.log(`š° Current Balance:`);\n console.log(` SOL: ${balance.solBalance?.toFixed(4) || \"0\"} SOL`);\n const usdcToken = balance.tokens?.find(\n (t: { mint: string }) => t.mint === \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n );\n console.log(` USDC: $${usdcToken?.uiAmount?.toFixed(2) || \"0\"}`);\n }\n } catch (_e) {\n console.log(\"ā ļø Could not fetch wallet balance\");\n }\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n if (!tradingManager) {\n throw new Error(\"AutoTradingManager service not found\");\n }\n\n // Get verified tokens to trade\n const tokenAddresses: Record<string, string> = {\n BONK: \"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263\",\n WIF: \"EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm\",\n };\n\n console.log(`\\nš Trading Configuration:`);\n console.log(` Tokens: BONK, WIF`);\n console.log(` Strategy: momentum-breakout-v1`);\n console.log(` Max Position: $10`);\n console.log(` Stop Loss: 2%`);\n console.log(` Take Profit: 3%`);\n console.log(` Trade Interval: 15 seconds`);\n\n // Conservative settings for live trading\n const config = {\n strategy: \"momentum-breakout-v1\",\n tokens: Object.values(tokenAddresses),\n maxPositionSize: 10,\n intervalMs: 15000,\n stopLossPercent: 2,\n takeProfitPercent: 3,\n maxDailyLoss: 20,\n };\n\n console.log(\"\\nšØ LIVE TRADING WILL START IN 5 SECONDS... Press Ctrl+C to cancel\");\n for (let i = 5; i > 0; i--) {\n console.log(` ${i}...`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n // Start trading\n console.log(\"\\nš LIVE TRADING STARTED!\\n\");\n await tradingManager.startTrading(config);\n\n // Wait for trading to actually start\n const started = await waitForTrading(runtime, 10000);\n if (!started) {\n throw new Error(\"Trading did not start within 10 seconds\");\n }\n\n // Track trades in real-time\n const tradeLog: any[] = [];\n const executedTxs: string[] = [];\n let lastLogTime = Date.now();\n let lastTradeCount = 0;\n\n console.log(\"š” Monitoring live trades...\\n\");\n\n // Monitor for exactly 2 minutes with detailed logging\n const monitoringDuration = 120000; // 2 minutes\n const monitoringInterval = 5000; // Log every 5 seconds\n let elapsedTime = 0;\n\n while (elapsedTime < monitoringDuration) {\n const loopStart = Date.now();\n\n // Get current status\n const status = tradingManager.getStatus();\n const performance = tradingManager.getPerformance();\n\n // Log progress every 5 seconds\n if (Date.now() - lastLogTime >= monitoringInterval) {\n const timeRemaining = Math.ceil((monitoringDuration - elapsedTime) / 1000);\n console.log(`ā±ļø [${new Date().toLocaleTimeString()}] Time remaining: ${timeRemaining}s`);\n console.log(` š Status: ${status.isTrading ? \"TRADING\" : \"STOPPED\"}`);\n console.log(` š Trades: ${performance.totalTrades}`);\n console.log(` šµ P&L: $${performance.totalPnL.toFixed(2)}`);\n console.log(` š Positions: ${status.positions.length}`);\n\n // Log any new trades\n if (performance.totalTrades > lastTradeCount) {\n console.log(` šÆ NEW TRADE EXECUTED!`);\n\n // Get transaction details\n const latestTxs = tradingManager.getLatestTransactions(\n performance.totalTrades - lastTradeCount,\n );\n for (const tx of latestTxs) {\n const tokenSymbol =\n Object.keys(tokenAddresses).find((k) => tokenAddresses[k] === tx.token) ||\n tx.token;\n console.log(` Token: ${tokenSymbol}`);\n console.log(` Amount: ${tx.quantity}`);\n console.log(` Price: $${tx.price}`);\n console.log(` TX ID: ${tx.id}`);\n console.log(` š View on Solscan: https://solscan.io/tx/${tx.id}`);\n\n executedTxs.push(tx.id);\n }\n\n lastTradeCount = performance.totalTrades;\n }\n\n console.log(\"\"); // Empty line for readability\n lastLogTime = Date.now();\n }\n\n // Store trade data\n tradeLog.push({\n timestamp: Date.now(),\n elapsed: elapsedTime,\n trades: performance.totalTrades,\n pnl: performance.totalPnL,\n positions: status.positions.length,\n });\n\n // Small delay to not overwhelm the system\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n elapsedTime += Date.now() - loopStart;\n }\n\n // Stop trading\n console.log(\"\\nš Stopping live trading...\");\n await tradingManager.stopTrading();\n\n const testEndTime = Date.now();\n const actualDuration = (testEndTime - testStartTime) / 1000;\n\n // Final comprehensive results\n console.log(\"\\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n console.log(\"š LIVE TRADING TEST RESULTS\");\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n console.log(`ā° Test Duration: ${actualDuration.toFixed(1)} seconds`);\n console.log(`š
End Time: ${new Date().toLocaleTimeString()}`);\n\n const finalPerf = tradingManager.getPerformance();\n const finalStatus = tradingManager.getStatus();\n\n console.log(`\\nš Trading Performance:`);\n console.log(` Total Trades: ${finalPerf.totalTrades}`);\n console.log(` Win Rate: ${(finalPerf.winRate * 100).toFixed(1)}%`);\n console.log(` Total P&L: $${finalPerf.totalPnL.toFixed(2)}`);\n console.log(` Daily P&L: $${finalPerf.dailyPnL.toFixed(2)}`);\n\n if (finalStatus.positions.length > 0) {\n console.log(`\\nš Open Positions:`);\n finalStatus.positions.forEach((pos: any) => {\n const tokenSymbol =\n Object.keys(tokenAddresses).find((k) => tokenAddresses[k] === pos.tokenAddress) ||\n \"Unknown\";\n console.log(` ${tokenSymbol}: ${pos.amount} @ $${pos.entryPrice}`);\n if (pos.currentPrice) {\n const pnl = (pos.currentPrice - pos.entryPrice) * pos.amount;\n console.log(` Current: $${pos.currentPrice} (P&L: $${pnl.toFixed(2)})`);\n }\n });\n }\n\n // Transaction verification\n if (executedTxs.length > 0) {\n console.log(`\\nš Executed Transactions (${executedTxs.length} total):`);\n\n // Get full transaction history for more details\n const txHistory = tradingManager.getTransactionHistory();\n\n for (const tx of txHistory) {\n const tokenSymbol =\n Object.keys(tokenAddresses).find((k) => tokenAddresses[k] === tx.token) || \"Unknown\";\n const time = new Date(tx.timestamp).toLocaleTimeString();\n\n console.log(`\\n ${tx.action} ${tx.quantity} ${tokenSymbol} @ $${tx.price}`);\n console.log(` Time: ${time}`);\n console.log(` TX: ${tx.id}`);\n console.log(` View: https://solscan.io/tx/${tx.id}`);\n\n // Try to verify on Solscan (only for real-looking TXs)\n if (!tx.id.startsWith(\"mock_\") && tx.id.length > 40) {\n const verified = await verifySolscanTransaction(tx.id, 1);\n console.log(` Status: ${verified ? \"ā
Verified\" : \"ā³ Pending\"}`);\n }\n }\n }\n\n // Summary\n console.log(`\\nš Test Summary:`);\n if (finalPerf.totalTrades === 0) {\n console.log(\" ā ļø No trades were executed during the test period\");\n console.log(\" š” This could be due to market conditions or strategy parameters\");\n } else {\n console.log(` ā
Successfully executed ${finalPerf.totalTrades} live trades`);\n console.log(\n ` š° Net result: $${finalPerf.totalPnL >= 0 ? \"+\" : \"\"}${finalPerf.totalPnL.toFixed(2)}`,\n );\n }\n\n console.log(\"\\nā
Live trading test completed successfully!\");\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\\n\");\n },\n },\n\n {\n name: \"LIVE MAINNET: Test risk management with real funds\",\n fn: async (runtime) => {\n const testStartTime = Date.now();\n console.log(\"\\nš”ļø TESTING RISK MANAGEMENT WITH REAL FUNDS\");\n console.log(`ā° Start time: ${new Date().toLocaleTimeString()}`);\n console.log(\"ā±ļø Duration: 1 minute (60 seconds)\\n\");\n\n const tradingMode = runtime.getSetting(\"TRADING_MODE\");\n if (tradingMode !== \"live\") {\n console.log('ā ļø Skipping - TRADING_MODE is not \"live\"');\n return;\n }\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n const bonkAddress = \"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263\";\n\n // Start with very tight risk parameters\n const config = {\n strategy: \"mean-reversion\",\n tokens: [bonkAddress],\n maxPositionSize: 5,\n intervalMs: 10000,\n stopLossPercent: 1,\n takeProfitPercent: 1.5,\n maxDailyLoss: 5,\n };\n\n console.log(\"š Risk Management Configuration:\");\n console.log(\" Token: BONK\");\n console.log(\" Max Position: $5\");\n console.log(\" Stop Loss: 1% (tight!)\");\n console.log(\" Take Profit: 1.5%\");\n console.log(\" Max Daily Loss: $5\");\n console.log(\" Trade Interval: 10 seconds\");\n\n console.log(\"\\nš Starting risk management test...\\n\");\n await tradingManager.startTrading(config);\n\n // Monitor for 1 minute with detailed risk tracking\n const monitoringDuration = 60000;\n const logInterval = 10000; // Log every 10 seconds\n let elapsedTime = 0;\n let lastLogTime = Date.now();\n let maxLoss = 0;\n let stopLossTriggered = false;\n let takeProfitTriggered = false;\n\n console.log(\"š” Monitoring risk limits...\\n\");\n\n while (elapsedTime < monitoringDuration) {\n const loopStart = Date.now();\n\n const status = tradingManager.getStatus();\n const perf = tradingManager.getPerformance();\n\n // Track max loss\n if (perf.dailyPnL < maxLoss) {\n maxLoss = perf.dailyPnL;\n }\n\n // Check if we hit risk limits\n if (perf.dailyPnL <= -5) {\n console.log(\"šØ DAILY LOSS LIMIT HIT! Trading should stop.\");\n stopLossTriggered = true;\n }\n\n // Log every 10 seconds\n if (Date.now() - lastLogTime >= logInterval) {\n const timeRemaining = Math.ceil((monitoringDuration - elapsedTime) / 1000);\n console.log(`ā±ļø [${new Date().toLocaleTimeString()}] Time remaining: ${timeRemaining}s`);\n console.log(` š Trades: ${perf.totalTrades}`);\n console.log(\n ` šµ Daily P&L: $${perf.dailyPnL.toFixed(2)} (Max Loss: $${maxLoss.toFixed(2)})`,\n );\n console.log(` š Total P&L: $${perf.totalPnL.toFixed(2)}`);\n console.log(\n ` š”ļø Risk Status: ${perf.dailyPnL > -5 ? \"WITHIN LIMITS\" : \"LIMIT EXCEEDED\"}`,\n );\n\n if (status.positions.length > 0) {\n const pos = status.positions[0];\n console.log(` š Position: ${pos.amount} BONK @ $${pos.entryPrice}`);\n if (pos.currentPrice) {\n const pnlPercent = ((pos.currentPrice - pos.entryPrice) / pos.entryPrice) * 100;\n console.log(` Current P&L: ${pnlPercent.toFixed(2)}%`);\n\n if (pnlPercent <= -1) {\n stopLossTriggered = true;\n console.log(\" š Stop loss level reached!\");\n } else if (pnlPercent >= 1.5) {\n takeProfitTriggered = true;\n console.log(\" š° Take profit level reached!\");\n }\n }\n }\n\n console.log(\"\");\n lastLogTime = Date.now();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n elapsedTime += Date.now() - loopStart;\n }\n\n await tradingManager.stopTrading();\n\n const testEndTime = Date.now();\n const actualDuration = (testEndTime - testStartTime) / 1000;\n\n // Final risk management report\n console.log(\"\\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n console.log(\"š”ļø RISK MANAGEMENT TEST RESULTS\");\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n console.log(`ā° Test Duration: ${actualDuration.toFixed(1)} seconds`);\n\n const finalPerf = tradingManager.getPerformance();\n\n console.log(`\\nš Risk Metrics:`);\n console.log(` Daily P&L: $${finalPerf.dailyPnL.toFixed(2)}`);\n console.log(` Max Drawdown: $${maxLoss.toFixed(2)}`);\n console.log(` Daily Loss Limit: $5.00`);\n console.log(` Limit Used: ${Math.abs((finalPerf.dailyPnL / 5) * 100).toFixed(1)}%`);\n\n console.log(`\\nšÆ Risk Events:`);\n console.log(` Stop Loss Triggered: ${stopLossTriggered ? \"ā
Yes\" : \"ā No\"}`);\n console.log(` Take Profit Triggered: ${takeProfitTriggered ? \"ā
Yes\" : \"ā No\"}`);\n console.log(` Daily Limit Hit: ${finalPerf.dailyPnL <= -5 ? \"ā
Yes\" : \"ā No\"}`);\n\n // Verify risk limits\n if (finalPerf.dailyPnL < -5.5) {\n // Allow small buffer for slippage\n throw new Error(\n `Daily loss exceeded limit: $${finalPerf.dailyPnL.toFixed(2)} (limit: $5.00)`,\n );\n }\n\n console.log(`\\nā
Risk management test PASSED!`);\n console.log(` All risk limits were properly enforced.`);\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\\n\");\n },\n },\n\n {\n name: \"LIVE MAINNET: Execute single trade with confirmation\",\n fn: async (runtime) => {\n const testStartTime = Date.now();\n console.log(\"\\nšÆ EXECUTING SINGLE LIVE TRADE TEST\");\n console.log(`ā° Start time: ${new Date().toLocaleTimeString()}`);\n console.log(\"ā±ļø Max Duration: 30 seconds\\n\");\n\n const tradingMode = runtime.getSetting(\"TRADING_MODE\");\n if (tradingMode !== \"live\") {\n console.log('ā ļø Skipping - TRADING_MODE is not \"live\"');\n return;\n }\n\n const walletAddress =\n runtime.getSetting(\"SOLANA_ADDRESS\") || runtime.getSetting(\"WALLET_PUBLIC_KEY\");\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n const wifAddress = \"EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm\";\n\n // Configure for high-probability single trade\n const config = {\n strategy: \"random-v1\",\n tokens: [wifAddress],\n maxPositionSize: 3,\n intervalMs: 5000,\n };\n\n console.log(\"š° Single Trade Configuration:\");\n console.log(\" Token: WIF (dogwifhat)\");\n console.log(\" Strategy: Random (90% trade probability)\");\n console.log(\" Trade Size: $3\");\n console.log(\" Check Interval: 5 seconds\");\n console.log(\" Max Wait: 30 seconds\");\n\n // Get initial balance if available\n let initialUsdcBalance = 0;\n try {\n const swapService = runtime.getService(\"SwapService\") as any;\n if (swapService?.getWalletBalances) {\n const balance = await swapService.getWalletBalances();\n const usdcToken = balance.tokens?.find(\n (t: { mint: string }) => t.mint === \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n );\n initialUsdcBalance = usdcToken?.uiAmount || 0;\n console.log(`\\nšµ Initial USDC Balance: $${initialUsdcBalance.toFixed(2)}`);\n }\n } catch (_e) {\n // Ignore if service not available\n }\n\n console.log(\"\\nš Starting trading for single execution...\\n\");\n await tradingManager.startTrading(config);\n\n // Wait for up to 30 seconds for a trade\n const startPerf = tradingManager.getPerformance();\n let traded = false;\n let executedTx: string | null = null;\n let tradeDetails: any = null;\n\n console.log(\"ā³ Waiting for trade execution...\");\n\n for (let i = 0; i < 6; i++) {\n console.log(` Check ${i + 1}/6...`);\n\n const currentPerf = tradingManager.getPerformance();\n const status = tradingManager.getStatus();\n\n if (currentPerf.totalTrades > startPerf.totalTrades) {\n traded = true;\n const elapsedTime = ((Date.now() - testStartTime) / 1000).toFixed(1);\n\n console.log(`\\nš TRADE EXECUTED! (after ${elapsedTime} seconds)`);\n\n if (status.positions.length > 0) {\n const pos = status.positions[status.positions.length - 1];\n tradeDetails = {\n token: \"WIF\",\n amount: pos.amount,\n price: pos.entryPrice,\n value: pos.amount * pos.entryPrice,\n time: new Date().toLocaleTimeString(),\n };\n\n console.log(\"\\nš Trade Details:\");\n console.log(` Token: ${tradeDetails.token}`);\n console.log(` Amount: ${tradeDetails.amount.toFixed(6)} WIF`);\n console.log(` Entry Price: $${tradeDetails.price.toFixed(6)}`);\n console.log(` Total Value: $${tradeDetails.value.toFixed(2)}`);\n console.log(` Execution Time: ${tradeDetails.time}`);\n\n // Get transaction ID from AutoTradingManager\n const txHistory = tradingManager.getLatestTransactions(1);\n if (txHistory.length > 0) {\n executedTx = txHistory[0].id;\n console.log(`\\n Transaction ID: ${executedTx}`);\n }\n }\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 5000));\n }\n\n console.log(\"\\nš Stopping trading...\");\n await tradingManager.stopTrading();\n\n const testEndTime = Date.now();\n const totalDuration = ((testEndTime - testStartTime) / 1000).toFixed(1);\n\n // Final report\n console.log(\"\\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n console.log(\"šÆ SINGLE TRADE TEST RESULTS\");\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n console.log(`ā° Test Duration: ${totalDuration} seconds`);\n\n if (traded && tradeDetails) {\n console.log(\"\\nā
TRADE SUCCESSFULLY EXECUTED!\");\n console.log(`\\nš Trade Summary:`);\n console.log(` Type: BUY`);\n console.log(` Token: ${tradeDetails.token}`);\n console.log(` Amount: ${tradeDetails.amount.toFixed(6)} WIF`);\n console.log(` Price: $${tradeDetails.price.toFixed(6)}`);\n console.log(` Value: $${tradeDetails.value.toFixed(2)}`);\n\n // Show balance change\n try {\n const swapService = runtime.getService(\"SwapService\") as any;\n if (swapService?.getWalletBalances) {\n const balance = await swapService.getWalletBalances();\n const usdcToken = balance.tokens?.find(\n (t: { mint: string }) => t.mint === \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n );\n const wifToken = balance.tokens?.find((t: { mint: string }) => t.mint === wifAddress);\n const finalUsdcBalance = usdcToken?.uiAmount || 0;\n const wifBalance = wifToken?.uiAmount || 0;\n\n console.log(`\\nš° Balance Changes:`);\n console.log(\n ` USDC: $${initialUsdcBalance.toFixed(2)} ā $${finalUsdcBalance.toFixed(2)}`,\n );\n console.log(` WIF: 0 ā ${wifBalance.toFixed(6)}`);\n }\n } catch (_e) {\n // Ignore if service not available\n }\n\n console.log(\"\\nš Verification:\");\n if (executedTx) {\n console.log(` Transaction: ${executedTx}`);\n console.log(` View on Solscan: https://solscan.io/tx/${executedTx}`);\n }\n console.log(` Wallet: https://solscan.io/account/${walletAddress}`);\n\n // Wait for transaction to be indexed\n if (executedTx) {\n console.log(\"\\nā³ Verifying transaction on Solscan...\");\n const verified = await verifySolscanTransaction(executedTx);\n console.log(` Verification: ${verified ? \"ā
Confirmed\" : \"ā ļø Not yet indexed\"}`);\n }\n } else {\n console.log(\"\\nā ļø NO TRADE EXECUTED\");\n console.log(\"\\nPossible reasons:\");\n console.log(\" ⢠Market conditions not favorable\");\n console.log(\" ⢠Insufficient balance\");\n console.log(\" ⢠Network congestion\");\n console.log(\" ⢠Strategy parameters too restrictive\");\n }\n\n console.log(\"\\nā
Single trade test completed!\");\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\\n\");\n },\n },\n ],\n};\n\nexport default liveTradingScenarios;\n","import type { TestSuite } from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../../services/AutoTradingManager.ts\";\nimport { monitorTrades, validateTradingResult } from \"./test-utils.ts\";\n\n// Mock trading configuration\nconst MOCK_CONFIG = {\n INITIAL_BALANCE: {\n SOL: 1.5,\n USDC: 1000,\n BONK: 1000000,\n WIF: 500,\n } as Record<string, number>,\n MOCK_PRICES: {\n BONK: 0.00002,\n WIF: 2.5,\n SOL: 100,\n } as Record<string, number>,\n PRICE_VOLATILITY: 0.05, // 5% price swings\n TRADE_SUCCESS_RATE: 0.9, // 90% of trades succeed\n};\n\n// Mock price generator\nfunction _generateMockPrice(basePrice: number, volatility: number): number {\n const change = (Math.random() - 0.5) * 2 * volatility;\n return basePrice * (1 + change);\n}\n\n// Mock transaction generator\nfunction _generateMockTransaction(\n type: \"buy\" | \"sell\",\n token: string,\n amount: number,\n price: number,\n): any {\n const txId = `mock_${Date.now()}_${Math.random().toString(36).substring(7)}`;\n return {\n signature: txId,\n timestamp: Date.now(),\n status: Math.random() < MOCK_CONFIG.TRADE_SUCCESS_RATE ? \"success\" : \"failed\",\n type: \"swap\",\n metadata: {\n direction: type,\n token,\n amount,\n price,\n usdValue: amount * price,\n },\n };\n}\n\nexport const mockTradingScenarios: TestSuite = {\n name: \"Mock Trading Scenarios (Safe Development)\",\n tests: [\n {\n name: \"MOCK: Test strategy with simulated prices (30s)\",\n fn: async (runtime) => {\n console.log(\"\\nš§Ŗ STARTING MOCK TRADING TEST - NO REAL MONEY\\n\");\n\n // Enable mock mode\n runtime.setCache(\"MOCK_TRADING\", true);\n runtime.setCache(\"MOCK_PRICES\", {\n BONK: { price: 0.00001234, change24h: 15.5 },\n WIF: { price: 1.85, change24h: -5.2 },\n PEPE: { price: 0.00000892, change24h: 22.1 },\n });\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n if (!tradingManager) {\n throw new Error(\"AutoTradingManager service not found\");\n }\n\n // Start trading with multiple strategies\n console.log(\"š Testing momentum strategy with mock prices...\\n\");\n\n await tradingManager.startTrading({\n strategy: \"momentum-breakout-v1\",\n tokens: [\"BONK\", \"WIF\", \"PEPE\"],\n maxPositionSize: 100, // Can use larger amounts in mock\n intervalMs: 5000, // Faster for testing\n stopLossPercent: 5,\n takeProfitPercent: 8,\n maxDailyLoss: 500,\n });\n\n // Monitor for 30 seconds\n const result = await monitorTrades(runtime, 30000);\n\n await tradingManager.stopTrading();\n\n console.log(\"\\nš MOCK TRADING RESULTS:\");\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n validateTradingResult(result);\n\n // Ensure we executed some mock trades\n if (result.finalPerformance.totalTrades === 0) {\n throw new Error(\"No mock trades were executed\");\n }\n\n console.log(\"\\nā
Mock trading test completed successfully\");\n\n // Clean up\n runtime.setCache(\"MOCK_TRADING\", false);\n },\n },\n\n {\n name: \"MOCK: Compare multiple strategies (1 min)\",\n fn: async (runtime) => {\n console.log(\"\\nāļø COMPARING TRADING STRATEGIES WITH MOCK DATA\\n\");\n\n runtime.setCache(\"MOCK_TRADING\", true);\n runtime.setCache(\"MOCK_PRICES\", {\n BONK: { price: 0.00001234, change24h: 15.5 },\n WIF: { price: 1.85, change24h: -5.2 },\n });\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n const strategies = [\"random-v1\", \"mean-reversion\", \"momentum-breakout-v1\"];\n const results: any[] = [];\n\n for (const strategy of strategies) {\n console.log(`\\nš Testing ${strategy}...`);\n\n await tradingManager.startTrading({\n strategy,\n tokens: [\"BONK\", \"WIF\"],\n maxPositionSize: 50,\n intervalMs: 3000,\n stopLossPercent: 5,\n takeProfitPercent: 8,\n });\n\n // Run for 20 seconds each\n const result = await monitorTrades(runtime, 20000);\n await tradingManager.stopTrading();\n\n results.push({\n strategy,\n trades: result.finalPerformance.totalTrades,\n winRate: result.finalPerformance.winRate,\n totalPnL: result.finalPerformance.totalPnL,\n });\n\n // Reset for next strategy\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n // Compare results\n console.log(\"\\nš STRATEGY COMPARISON:\");\n console.log(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n results.forEach((r) => {\n console.log(`\\n${r.strategy}:`);\n console.log(` Trades: ${r.trades}`);\n console.log(` Win Rate: ${(r.winRate * 100).toFixed(1)}%`);\n console.log(` Total P&L: $${r.totalPnL.toFixed(2)}`);\n });\n\n // Find best performer\n const best = results.reduce((prev, current) =>\n current.totalPnL > prev.totalPnL ? current : prev,\n );\n\n console.log(`\\nš Best performing strategy: ${best.strategy}`);\n\n runtime.setCache(\"MOCK_TRADING\", false);\n },\n },\n\n {\n name: \"MOCK: Stress test with rapid trades\",\n fn: async (runtime) => {\n console.log(\"\\nā” STRESS TESTING WITH RAPID MOCK TRADES\\n\");\n\n runtime.setCache(\"MOCK_TRADING\", true);\n runtime.setCache(\"MOCK_PRICES\", {\n TEST1: { price: 1.0, change24h: 0 },\n TEST2: { price: 2.0, change24h: 0 },\n TEST3: { price: 3.0, change24h: 0 },\n });\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n\n // Use random strategy with high probability for stress test\n await tradingManager.startTrading({\n strategy: \"random-v1\",\n tokens: [\"TEST1\", \"TEST2\", \"TEST3\"],\n maxPositionSize: 10,\n intervalMs: 1000, // Trade every second\n });\n\n // Monitor for 15 seconds\n const startTime = Date.now();\n let tradeCount = 0;\n\n while (Date.now() - startTime < 15000) {\n const perf = tradingManager.getPerformance();\n if (perf.totalTrades > tradeCount) {\n tradeCount = perf.totalTrades;\n console.log(`ā” Trade #${tradeCount} executed`);\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n\n await tradingManager.stopTrading();\n\n const finalPerf = tradingManager.getPerformance();\n console.log(`\\nā
Stress test completed:`);\n console.log(` Total trades: ${finalPerf.totalTrades}`);\n console.log(` Trades per second: ${(finalPerf.totalTrades / 15).toFixed(2)}`);\n\n if (finalPerf.totalTrades < 5) {\n throw new Error(\"Too few trades in stress test\");\n }\n\n runtime.setCache(\"MOCK_TRADING\", false);\n },\n },\n\n {\n name: \"MOCK: Test risk management triggers\",\n fn: async (runtime) => {\n console.log(\"\\nš”ļø TESTING RISK MANAGEMENT WITH MOCK LOSSES\\n\");\n\n runtime.setCache(\"MOCK_TRADING\", true);\n\n // Set up prices that will trigger stop losses\n runtime.setCache(\"MOCK_PRICES\", {\n RISK1: { price: 100, change24h: -10 },\n });\n\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n\n await tradingManager.startTrading({\n strategy: \"random-v1\",\n tokens: [\"RISK1\"],\n maxPositionSize: 50,\n intervalMs: 2000,\n stopLossPercent: 2, // Tight stop loss\n maxDailyLoss: 20, // Low daily loss limit\n });\n\n // Simulate price drops\n let _priceDrops = 0;\n for (let i = 0; i < 10; i++) {\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n // Progressively drop the price\n const currentPrice = 100 - i * 5;\n runtime.setCache(\"MOCK_PRICES\", {\n RISK1: { price: currentPrice, change24h: -20 - i },\n });\n\n const status = tradingManager.getStatus();\n const perf = tradingManager.getPerformance();\n\n console.log(`š Price: $${currentPrice}, Daily P&L: $${perf.dailyPnL.toFixed(2)}`);\n\n // Check if trading stopped due to risk limits\n if (!status.isTrading) {\n console.log(\"\\nš Trading stopped due to risk limits!\");\n break;\n }\n\n // Check if we hit daily loss limit\n if (perf.dailyPnL <= -20) {\n console.log(\"\\nšØ Daily loss limit reached!\");\n break;\n }\n\n _priceDrops++;\n }\n\n await tradingManager.stopTrading();\n\n const finalPerf = tradingManager.getPerformance();\n console.log(`\\nā
Risk management test completed:`);\n console.log(` Final P&L: $${finalPerf.totalPnL.toFixed(2)}`);\n console.log(` Daily P&L: $${finalPerf.dailyPnL.toFixed(2)}`);\n\n // Verify risk limits worked\n if (finalPerf.dailyPnL < -25) {\n throw new Error(\"Daily loss limit was not enforced\");\n }\n\n runtime.setCache(\"MOCK_TRADING\", false);\n },\n },\n ],\n};\n\nexport default mockTradingScenarios;\n","/**\n * Analyze Performance Action\n *\n * Provides trading performance metrics from the AutoTradingManager.\n */\n\nimport type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\n\nexport const analyzePerformanceAction: Action = {\n name: \"ANALYZE_PERFORMANCE\",\n similes: [\"PERFORMANCE_ANALYSIS\", \"CHECK_PERFORMANCE\", \"TRADING_RESULTS\", \"SHOW_PERFORMANCE\"],\n description: \"Analyze trading performance and show metrics\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = message.content.text?.toLowerCase() || \"\";\n const keywords = [\n \"performance\",\n \"metrics\",\n \"results\",\n \"p&l\",\n \"pnl\",\n \"profit\",\n \"loss\",\n \"stats\",\n \"statistics\",\n ];\n return keywords.some((kw) => text.includes(kw));\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as\n | AutoTradingManager\n | undefined;\n\n if (!tradingManager) {\n callback?.({\n text: \"ā Trading manager not available. Please ensure the plugin is loaded.\",\n });\n return;\n }\n\n const status = tradingManager.getStatus();\n const performance = status.performance;\n const transactions = tradingManager.getLatestTransactions(10);\n\n const isActive = status.isTrading ? \"š¢ Active\" : \"š“ Inactive\";\n const pnlEmoji = performance.totalPnL >= 0 ? \"š\" : \"š\";\n const dailyPnlEmoji = performance.dailyPnL >= 0 ? \"š\" : \"š\";\n\n let response = `š **Trading Performance Analysis**\n\n**Status:** ${isActive}\n**Strategy:** ${status.strategy || \"None\"}\n\n**Performance Metrics:**\n⢠Total P&L: ${pnlEmoji} $${performance.totalPnL.toFixed(2)}\n⢠Daily P&L: ${dailyPnlEmoji} $${performance.dailyPnL.toFixed(2)}\n⢠Win Rate: ${(performance.winRate * 100).toFixed(1)}%\n⢠Total Trades: ${performance.totalTrades}\n\n**Open Positions:** ${status.positions.length}\n`;\n\n if (status.positions.length > 0) {\n response += \"\\n**Current Positions:**\\n\";\n status.positions.forEach((pos) => {\n const pnl = pos.currentPrice\n ? (((pos.currentPrice - pos.entryPrice) / pos.entryPrice) * 100).toFixed(2)\n : \"0.00\";\n const emoji = parseFloat(pnl) >= 0 ? \"š¢\" : \"š“\";\n response += `${emoji} ${pos.tokenAddress.slice(0, 8)}... | Entry: $${pos.entryPrice.toFixed(4)} | P&L: ${pnl}%\\n`;\n });\n }\n\n if (transactions.length > 0) {\n response += \"\\n**Recent Trades:**\\n\";\n transactions.slice(0, 5).forEach((tx) => {\n const emoji = tx.action === \"BUY\" ? \"š¢ BUY\" : \"š“ SELL\";\n const time = new Date(tx.timestamp).toLocaleTimeString();\n response += `⢠${emoji} ${tx.token.slice(0, 8)}... @ $${tx.price.toFixed(4)} (${time})\\n`;\n });\n }\n\n response += `\n**Analysis:**\n${\n performance.totalPnL > 0\n ? \"ā
Positive overall performance\"\n : performance.totalPnL < 0\n ? \"ā ļø Negative performance - consider reviewing strategy\"\n : \"ā No realized P&L yet\"\n}\n${\n performance.winRate > 0.5\n ? \"šÆ Good win rate - more winning than losing trades\"\n : performance.totalTrades > 0\n ? \"ā ļø Low win rate - consider adjusting parameters\"\n : \"\"\n}\n\nUse \"Check portfolio\" for more details or \"Stop trading\" to pause.`;\n\n callback?.({ text: response });\n return undefined;\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"How did my trading strategy perform?\" },\n },\n {\n name: \"{{agentName}}\",\n content: { text: \"Let me analyze your trading performance...\" },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Show me my P&L and statistics\" } },\n {\n name: \"{{agentName}}\",\n content: { text: \"Here are your performance metrics...\" },\n },\n ],\n ],\n};\n","import type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\nimport type { SwapService } from \"../services/SwapService.ts\";\n\nexport const checkPortfolioAction: Action = {\n name: \"CHECK_PORTFOLIO\",\n similes: [\n \"PORTFOLIO_CHECK\",\n \"VIEW_PORTFOLIO\",\n \"SHOW_HOLDINGS\",\n \"LIST_POSITIONS\",\n \"WALLET_BALANCE\",\n \"CHECK_BALANCE\",\n \"MY_PORTFOLIO\",\n \"MY_HOLDINGS\",\n \"MY_BALANCE\",\n \"TRADING_STATUS\",\n \"CHECK_TRADING\",\n ],\n description:\n \"Check current portfolio status including holdings, positions, and trading performance\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = message.content.text?.toLowerCase() || \"\";\n const portfolioKeywords = [\n \"portfolio\",\n \"balance\",\n \"holdings\",\n \"positions\",\n \"wallet\",\n \"check\",\n \"show\",\n \"view\",\n \"list\",\n \"status\",\n \"trading\",\n \"performance\",\n ];\n\n return portfolioKeywords.some((keyword) => text.includes(keyword));\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n // Get services\n const tradingManager = runtime.getService(\"AutoTradingManager\") as\n | AutoTradingManager\n | undefined;\n const swapService = runtime.getService(\"SwapService\") as SwapService | undefined;\n\n let walletSection = \"\";\n let tradingSection = \"\";\n let positionsSection = \"\";\n let performanceSection = \"\";\n\n // Get wallet balances\n if (swapService?.isReady()) {\n const balances = await swapService.getWalletBalances();\n const walletAddress = swapService.getWalletAddress();\n\n walletSection = `š¼ **Wallet**\n\\`${walletAddress}\\`\n\n**SOL Balance:** ${balances.solBalance.toFixed(4)} SOL (~$${(balances.solBalance * 150).toFixed(2)})\n\n${\n balances.tokens.length > 0\n ? `**Tokens:**\\n${balances.tokens\n .filter((t) => t.uiAmount > 0)\n .slice(0, 10)\n .map((t) => `⢠${t.mint.slice(0, 8)}...: ${t.uiAmount.toFixed(4)}`)\n .join(\"\\n\")}`\n : \"**Tokens:** None\"\n}`;\n } else {\n walletSection = `š¼ **Wallet**\nā ļø Wallet not configured. Set SOLANA_PRIVATE_KEY to enable trading.`;\n }\n\n // Get trading status\n if (tradingManager) {\n const status = tradingManager.getStatus();\n const recentTrades = tradingManager.getLatestTransactions(5);\n\n // Trading status\n tradingSection = `\\n\\nš¤ **Trading Status**\n**Active:** ${status.isTrading ? \"ā
Yes\" : \"ā No\"}\n${status.strategy ? `**Strategy:** ${status.strategy}` : \"\"}`;\n\n // Open positions\n if (status.positions.length > 0) {\n positionsSection = `\\n\\nš **Open Positions** (${status.positions.length})\n${status.positions\n .map((p) => {\n const pnl = (((p.currentPrice || p.entryPrice) - p.entryPrice) / p.entryPrice) * 100;\n const pnlEmoji = pnl >= 0 ? \"š¢\" : \"š“\";\n return `${pnlEmoji} **${p.tokenAddress.slice(0, 8)}...**\n Entry: $${p.entryPrice.toFixed(6)} | Current: $${(p.currentPrice || p.entryPrice).toFixed(6)}\n Amount: ${p.amount.toFixed(4)} | P&L: ${pnl >= 0 ? \"+\" : \"\"}${pnl.toFixed(2)}%`;\n })\n .join(\"\\n\\n\")}`;\n } else {\n positionsSection = \"\\n\\nš **Open Positions:** None\";\n }\n\n // Performance metrics\n const perf = status.performance;\n performanceSection = `\\n\\nš **Performance**\n**Total P&L:** ${perf.totalPnL >= 0 ? \"+\" : \"\"}$${perf.totalPnL.toFixed(2)}\n**Today's P&L:** ${perf.dailyPnL >= 0 ? \"+\" : \"\"}$${perf.dailyPnL.toFixed(2)}\n**Win Rate:** ${(perf.winRate * 100).toFixed(1)}%\n**Total Trades:** ${perf.totalTrades}`;\n\n // Recent trades\n if (recentTrades.length > 0) {\n performanceSection += `\\n\\nš **Recent Trades**\n${recentTrades\n .slice(-5)\n .reverse()\n .map((t) => {\n const time = new Date(t.timestamp).toLocaleTimeString();\n const emoji = t.action === \"BUY\" ? \"š¢\" : \"š“\";\n return `${emoji} ${t.action} ${t.quantity.toFixed(4)} ${t.token.slice(0, 8)}... @ $${t.price.toFixed(6)} (${time})`;\n })\n .join(\"\\n\")}`;\n }\n }\n\n const response = `${walletSection}${tradingSection}${positionsSection}${performanceSection}\n\n---\n*Last updated: ${new Date().toLocaleString()}*`;\n\n if (callback) {\n callback({\n text: response,\n });\n }\n\n logger.info(\"[checkPortfolioAction] Portfolio check completed\");\n return undefined;\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Check my portfolio\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"š **Portfolio Status**\\n\\nš¼ **Wallet**\\nSOL Balance: 10.5 SOL\\n\\nš¤ **Trading Status**\\nActive: ā
Yes\\nStrategy: LLM Trading Strategy\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Show trading status\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"š¤ **Trading Status**\\nActive: ā
Yes\\nStrategy: Momentum Breakout\\n\\nš **Performance**\\nTotal P&L: +$125.50\\nWin Rate: 65%\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"What are my positions?\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"š **Open Positions** (2)\\nš¢ BONK: +15.2%\\nš“ WIF: -3.1%\",\n },\n },\n ],\n ],\n};\n","/**\n * Compare Strategies Action\n *\n * Lists available strategies and their characteristics.\n */\n\nimport type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\n\nconst STRATEGY_DETAILS: Record<string, { description: string; bestFor: string; risk: string }> = {\n llm: {\n description: \"AI-powered analysis of trending tokens using language models\",\n bestFor: \"Dynamic markets, trending tokens, meme coins\",\n risk: \"Medium - AI decisions can be unpredictable\",\n },\n \"momentum-breakout-v1\": {\n description: \"Technical analysis detecting price breakouts with momentum indicators\",\n bestFor: \"Volatile markets with clear trends\",\n risk: \"Medium-High - Can get caught in false breakouts\",\n },\n \"mean-reversion\": {\n description: \"Trades based on price deviation from moving averages\",\n bestFor: \"Range-bound markets, stable tokens\",\n risk: \"Low-Medium - May miss strong trends\",\n },\n \"rule-based\": {\n description: \"Configurable technical indicator rules (RSI, SMA, MACD)\",\n bestFor: \"Systematic traders who want control over entry/exit rules\",\n risk: \"Depends on configuration\",\n },\n \"random-v1\": {\n description: \"Random trade decisions - for testing purposes only\",\n bestFor: \"Testing infrastructure and paper trading\",\n risk: \"High - Not a real strategy\",\n },\n};\n\nexport const compareStrategiesAction: Action = {\n name: \"COMPARE_STRATEGIES\",\n similes: [\"STRATEGY_COMPARISON\", \"LIST_STRATEGIES\", \"WHICH_STRATEGY\", \"BEST_STRATEGY\"],\n description: \"Compare available trading strategies\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = message.content.text?.toLowerCase() || \"\";\n return [\"compare\", \"strategies\", \"which strategy\", \"best strategy\", \"list strategy\"].some(\n (kw) => text.includes(kw),\n );\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as\n | AutoTradingManager\n | undefined;\n const strategies = tradingManager?.getStrategies() || [];\n\n let response = `š **Trading Strategy Comparison**\\n\\n`;\n\n strategies.forEach((strategy, index) => {\n const details = STRATEGY_DETAILS[strategy.id] || {\n description: strategy.description || \"No description available\",\n bestFor: \"General trading\",\n risk: \"Unknown\",\n };\n\n const emoji =\n strategy.id === \"llm\"\n ? \"š¤\"\n : strategy.id.includes(\"momentum\")\n ? \"š\"\n : strategy.id.includes(\"reversion\")\n ? \"āļø\"\n : strategy.id.includes(\"rule\")\n ? \"š\"\n : \"š²\";\n\n response += `**${index + 1}. ${emoji} ${strategy.name}** (\\`${strategy.id}\\`)\n⢠${details.description}\n⢠**Best for:** ${details.bestFor}\n⢠**Risk level:** ${details.risk}\n\n`;\n });\n\n response += `---\n\n**š Recommended Strategy:** LLM Strategy\n⢠Uses AI to analyze trending tokens from Birdeye\n⢠Includes automatic stop-loss and take-profit\n⢠Pre-filters honeypots and scam tokens\n\n**How to Start:**\n\\`\\`\\`\n\"Start trading with LLM strategy\"\n\"Begin momentum trading\"\n\"Start paper trading with rule-based strategy\"\n\\`\\`\\`\n\nWould you like to start trading with a specific strategy?`;\n\n callback?.({ text: response });\n return undefined;\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Compare the different trading strategies\" },\n },\n {\n name: \"{{agentName}}\",\n content: { text: \"Here is a comparison of available strategies...\" },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Which strategy is best?\" } },\n {\n name: \"{{agentName}}\",\n content: { text: \"Let me compare the strategies for you...\" },\n },\n ],\n ],\n};\n","/**\n * Configure Strategy Action\n *\n * Allows users to configure trading strategy parameters.\n */\n\nimport type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\nimport type { TokenValidationService } from \"../services/TokenValidationService.ts\";\n\nexport const configureStrategyAction: Action = {\n name: \"CONFIGURE_STRATEGY\",\n similes: [\"CONFIG_STRATEGY\", \"SET_STRATEGY\", \"ADJUST_SETTINGS\", \"CHANGE_PARAMS\"],\n description: \"Configure trading strategy parameters\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = message.content.text?.toLowerCase() || \"\";\n return [\"configure\", \"config\", \"set\", \"adjust\", \"parameter\", \"setting\"].some((kw) =>\n text.includes(kw),\n );\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as\n | AutoTradingManager\n | undefined;\n const validationService = runtime.getService(\"TokenValidationService\") as\n | TokenValidationService\n | undefined;\n\n if (!tradingManager) {\n callback?.({ text: \"ā Trading manager not available.\" });\n return;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const changes: string[] = [];\n\n // Parse stop loss\n const slMatch = text.match(/stop\\s*loss\\s*(?:to\\s*)?(\\d+)%?/i);\n if (slMatch) {\n const value = parseInt(slMatch[1], 10);\n runtime.setSetting(\"STOP_LOSS_PERCENT\", String(value));\n changes.push(`Stop loss set to ${value}%`);\n }\n\n // Parse take profit\n const tpMatch = text.match(/take\\s*profit\\s*(?:to\\s*)?(\\d+)%?/i);\n if (tpMatch) {\n const value = parseInt(tpMatch[1], 10);\n runtime.setSetting(\"TAKE_PROFIT_PERCENT\", String(value));\n changes.push(`Take profit set to ${value}%`);\n }\n\n // Parse position size\n const posMatch = text.match(/position\\s*(?:size)?\\s*(?:to\\s*)?(\\d+)%?/i);\n if (posMatch) {\n const value = parseInt(posMatch[1], 10);\n runtime.setSetting(\"MAX_POSITION_SIZE_USD\", String(value * 10)); // Convert % to rough USD\n changes.push(`Max position size set to ${value}%`);\n }\n\n // Parse liquidity requirement\n const liqMatch = text.match(/liquidity\\s*(?:to\\s*)?\\$?(\\d+)k?/i);\n if (liqMatch) {\n let value = parseInt(liqMatch[1], 10);\n if (text.includes(\"k\")) value *= 1000;\n runtime.setSetting(\"MIN_LIQUIDITY_USD\", String(value));\n if (validationService) {\n validationService.setRequirements({ minLiquidityUsd: value });\n }\n changes.push(`Minimum liquidity set to $${value.toLocaleString()}`);\n }\n\n // Parse volume requirement\n const volMatch = text.match(/volume\\s*(?:to\\s*)?\\$?(\\d+)k?/i);\n if (volMatch) {\n let value = parseInt(volMatch[1], 10);\n if (text.includes(\"k\")) value *= 1000;\n runtime.setSetting(\"MIN_VOLUME_24H_USD\", String(value));\n if (validationService) {\n validationService.setRequirements({ minVolume24hUsd: value });\n }\n changes.push(`Minimum 24h volume set to $${value.toLocaleString()}`);\n }\n\n // Parse trading mode\n if (text.includes(\"live\") && text.includes(\"mode\")) {\n runtime.setSetting(\"TRADING_MODE\", \"live\");\n changes.push(\"ā ļø Trading mode set to LIVE - real funds will be used!\");\n } else if (text.includes(\"paper\") && text.includes(\"mode\")) {\n runtime.setSetting(\"TRADING_MODE\", \"paper\");\n changes.push(\"Trading mode set to paper (simulated)\");\n }\n\n if (changes.length === 0) {\n const currentSettings = `š **Current Settings**\n\n**Risk Management:**\n⢠Stop Loss: ${runtime.getSetting(\"STOP_LOSS_PERCENT\") || \"5\"}%\n⢠Take Profit: ${runtime.getSetting(\"TAKE_PROFIT_PERCENT\") || \"15\"}%\n⢠Max Position Size: ${runtime.getSetting(\"MAX_POSITION_SIZE_USD\") || \"100\"} USD\n\n**Token Filters:**\n⢠Min Liquidity: $${runtime.getSetting(\"MIN_LIQUIDITY_USD\") || \"50000\"}\n⢠Min Volume 24h: $${runtime.getSetting(\"MIN_VOLUME_24H_USD\") || \"100000\"}\n\n**Mode:**\n⢠Trading Mode: ${runtime.getSetting(\"TRADING_MODE\") || \"paper\"}\n\n**Example Commands:**\n⢠\"Set stop loss to 3%\"\n⢠\"Set take profit to 20%\"\n⢠\"Set liquidity to $100k\"\n⢠\"Set volume to $500k\"\n⢠\"Set paper mode\" or \"Set live mode\"`;\n\n callback?.({ text: currentSettings });\n return undefined;\n }\n\n const response = `ā
**Settings Updated**\n\n${changes.map((c) => `⢠${c}`).join(\"\\n\")}\n\n${changes.some((c) => c.includes(\"LIVE\")) ? \"\\nā ļø **WARNING:** Live mode enabled. Real funds at risk!\" : \"\"}\n\nUse \"configure\" to see current settings.`;\n\n callback?.({ text: response });\n return undefined;\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Set stop loss to 3% and take profit to 25%\" },\n },\n {\n name: \"{{agentName}}\",\n content: { text: \"Settings updated: Stop loss 3%, Take profit 25%\" },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Configure minimum liquidity to $100k\" },\n },\n {\n name: \"{{agentName}}\",\n content: { text: \"Minimum liquidity set to $100,000\" },\n },\n ],\n ],\n};\n","/**\n * Execute Live Trade Action\n *\n * Executes token swaps on Solana via Jupiter DEX.\n * Supports ANY token - resolves symbols dynamically via Birdeye API.\n */\n\nimport type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { KNOWN_TOKENS, type SwapService } from \"../services/SwapService.ts\";\nimport type { TokenResolverService } from \"../services/TokenResolverService.ts\";\nimport type { TokenValidationService } from \"../services/TokenValidationService.ts\";\n\nconst TRADE_KEYWORDS = [\n \"live trade\",\n \"real trade\",\n \"execute\",\n \"place order\",\n \"buy\",\n \"sell\",\n \"swap\",\n \"trade\",\n \"purchase\",\n \"exchange\",\n];\nconst SIMULATION_KEYWORDS = [\"backtest\", \"simulation\", \"simulate\", \"paper\"];\n\n/** Parse trade parameters from message text */\nasync function parseTradeParams(\n text: string,\n resolver: TokenResolverService | undefined,\n): Promise<{\n isSell: boolean;\n amount: number;\n tokenSymbol: string;\n tokenAddress: string | null;\n}> {\n const isSell = text.includes(\"sell\");\n\n // Extract amount\n const amountMatch = text.match(/(\\d+(?:\\.\\d+)?)\\s*(?:sol|usd)?/i);\n const amount = amountMatch ? parseFloat(amountMatch[1]) : 0;\n\n // Extract token - could be symbol, name, or address\n // Patterns: \"buy BONK\", \"sell 100 PEPE\", \"swap for WIF\", \"trade into POPCAT\"\n let tokenQuery: string | null = null;\n\n // Check for token after action words\n const tokenPatterns = [\n /(?:buy|purchase|get|acquire)\\s+(?:\\d+(?:\\.\\d+)?\\s*(?:sol|usd)?\\s+(?:worth\\s+)?(?:of\\s+)?)?(\\w+)/i,\n /(?:sell)\\s+(?:\\d+(?:\\.\\d+)?\\s+)?(\\w+)/i,\n /(?:swap|trade|exchange)\\s+(?:for|into|to)\\s+(\\w+)/i,\n /(?:worth of|for|into)\\s+(\\w+)/i,\n ];\n\n for (const pattern of tokenPatterns) {\n const match = text.match(pattern);\n if (match?.[1] && ![\"sol\", \"usd\", \"usdc\", \"dollars\"].includes(match[1].toLowerCase())) {\n tokenQuery = match[1];\n break;\n }\n }\n\n // Check for Solana address directly in text\n const addressMatch = text.match(/[1-9A-HJ-NP-Za-km-z]{32,44}/);\n if (addressMatch) {\n const address = addressMatch[0];\n if (resolver) {\n const tokenInfo = await resolver.resolveByAddress(address);\n return {\n isSell,\n amount,\n tokenSymbol: tokenInfo?.symbol || `${address.slice(0, 8)}...`,\n tokenAddress: address,\n };\n }\n return {\n isSell,\n amount,\n tokenSymbol: `${address.slice(0, 8)}...`,\n tokenAddress: address,\n };\n }\n\n // Resolve token symbol/name to address\n if (tokenQuery && resolver) {\n const tokenInfo = await resolver.resolve(tokenQuery);\n if (tokenInfo) {\n return {\n isSell,\n amount,\n tokenSymbol: tokenInfo.symbol,\n tokenAddress: tokenInfo.address,\n };\n }\n }\n\n return {\n isSell,\n amount,\n tokenSymbol: tokenQuery || \"UNKNOWN\",\n tokenAddress: null,\n };\n}\n\n/** Helper to send callback response */\nfunction respond(callback: HandlerCallback | undefined, text: string): undefined {\n callback?.({ text });\n return undefined;\n}\n\nexport const executeLiveTradeAction: Action = {\n name: \"EXECUTE_LIVE_TRADE\",\n similes: [\n \"LIVE_TRADE\",\n \"REAL_TRADE\",\n \"EXECUTE_TRADE\",\n \"PLACE_ORDER\",\n \"MAKE_TRADE\",\n \"SWAP\",\n \"BUY_TOKEN\",\n \"SELL_TOKEN\",\n ],\n description: \"Execute a live token swap on Solana using Jupiter DEX. Supports ANY Solana token.\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = message.content.text?.toLowerCase() || \"\";\n const hasTradeKeyword = TRADE_KEYWORDS.some((kw) => text.includes(kw));\n const isSimulation = SIMULATION_KEYWORDS.some((kw) => text.includes(kw));\n return hasTradeKeyword && !isSimulation;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n const text = message.content.text?.toLowerCase() || \"\";\n\n // Get services\n const swapService = runtime.getService(\"SwapService\") as SwapService | undefined;\n const resolver = runtime.getService(\"TokenResolverService\") as TokenResolverService | undefined;\n\n // Parse trade parameters with dynamic resolution\n const { isSell, amount, tokenSymbol, tokenAddress } = await parseTradeParams(text, resolver);\n\n // Validate amount\n if (amount <= 0) {\n return respond(\n callback,\n `Please specify a valid amount. Example: \"buy 0.5 SOL worth of ${tokenSymbol || \"BONK\"}\"`,\n );\n }\n\n // Validate token\n if (!tokenAddress) {\n const suggestion = resolver\n ? `I couldn't find token \"${tokenSymbol}\". Try:\\n⢠Using the full token name\\n⢠Providing the contract address\\n⢠Checking if the token exists on Solana`\n : `Unknown token \"${tokenSymbol}\". Please provide the token contract address directly.`;\n return respond(callback, suggestion);\n }\n\n // Check SwapService\n if (!swapService?.isReady()) {\n return respond(\n callback,\n \"ā ļø **Trading Not Available**\\n\\nSwapService not configured. Set SOLANA_PRIVATE_KEY and ensure the plugin is loaded.\",\n );\n }\n\n // Check trading mode\n const tradingMode = runtime.getSetting(\"TRADING_MODE\");\n if (tradingMode !== \"live\") {\n return respond(\n callback,\n `ā ļø **Paper Trading Mode**\\n\\nYour trade would be: ${isSell ? \"SELL\" : \"BUY\"} ${amount} ${isSell ? tokenSymbol : \"SOL\"} ā ${isSell ? \"SOL\" : tokenSymbol}\\n\\nSet TRADING_MODE=live to enable real trades.`,\n );\n }\n\n // Validate token safety for buys\n if (!isSell && tokenAddress !== KNOWN_TOKENS.SOL) {\n const validationService = runtime.getService(\"TokenValidationService\") as\n | TokenValidationService\n | undefined;\n if (validationService) {\n const validation = await validationService.validateToken(tokenAddress);\n if (!validation.isValid) {\n return respond(\n callback,\n `ā **Token Validation Failed**\\n\\n${tokenSymbol} (${tokenAddress.slice(0, 8)}...) failed safety checks:\\n${validation.rejectionReasons.map((r) => `⢠${r}`).join(\"\\n\")}\\n\\nā ļø Trading this token is not recommended.`,\n );\n }\n if (validation.warnings.length > 0) {\n logger.warn(\n `[executeLiveTradeAction] Token warnings for ${tokenSymbol}: ${validation.warnings.join(\", \")}`,\n );\n }\n }\n }\n\n const _walletAddress = swapService.getWalletAddress();\n logger.info(\n `[executeLiveTradeAction] ${isSell ? \"SELL\" : \"BUY\"}: ${amount} ${tokenSymbol} (${tokenAddress.slice(0, 12)}...)`,\n );\n\n // Execute trade\n if (isSell) {\n const balance = await swapService.getTokenBalance(tokenAddress);\n if (balance < amount) {\n return respond(\n callback,\n `ā **Insufficient Balance**\\n\\nNeed: ${amount} ${tokenSymbol}\\nHave: ${balance.toFixed(6)} ${tokenSymbol}`,\n );\n }\n\n const result = await swapService.sell(tokenAddress, amount);\n return respond(\n callback,\n result.success\n ? `ā
**Sold ${tokenSymbol}**\\n\\n**Spent:** ${result.inputAmount} ${tokenSymbol}\\n**Received:** ${result.outputAmount} SOL\\n**Impact:** ${result.priceImpact}%\\n\\n[View tx](${result.explorerUrl})`\n : `ā **Sell Failed:** ${result.error}`,\n );\n }\n\n // BUY\n const balances = await swapService.getWalletBalances();\n if (balances.solBalance < amount) {\n return respond(\n callback,\n `ā **Insufficient SOL**\\n\\nNeed: ${amount} SOL\\nHave: ${balances.solBalance.toFixed(4)} SOL`,\n );\n }\n\n const result = await swapService.buy(tokenAddress, amount);\n return respond(\n callback,\n result.success\n ? `ā
**Bought ${tokenSymbol}**\\n\\n**Spent:** ${result.inputAmount} SOL\\n**Received:** ${result.outputAmount} ${tokenSymbol}\\n**Impact:** ${result.priceImpact}%\\n\\n[View tx](${result.explorerUrl})`\n : `ā **Buy Failed:** ${result.error}`,\n );\n },\n\n examples: [\n [\n { name: \"{{user1}}\", content: { text: \"Buy 0.5 SOL worth of BONK\" } },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"ā
**Bought BONK**\\n\\n**Spent:** 0.5 SOL\\n**Received:** 1,234,567 BONK\",\n },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Sell 1000000 WIF\" } },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"ā
**Sold WIF**\\n\\n**Spent:** 1,000,000 WIF\\n**Received:** 0.4 SOL\",\n },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Buy some PEPE with 1 SOL\" } },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"ā
**Bought PEPE**\\n\\n**Spent:** 1 SOL\\n**Received:** 50,000 PEPE\",\n },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Swap 2 SOL for dogwifhat\" } },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"ā
**Bought WIF**\\n\\n**Spent:** 2 SOL\\n**Received:** 85.5 WIF\",\n },\n },\n ],\n ],\n};\n","import { type IAgentRuntime, logger, parseJSONObjectFromText, Service } from \"@elizaos/core\";\nimport {\n Connection,\n Keypair,\n PublicKey,\n type TransactionConfirmationStatus,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport bs58 from \"bs58\";\n\n/**\n * Well-known token addresses on Solana\n */\nexport const KNOWN_TOKENS = {\n SOL: \"So11111111111111111111111111111111111111112\",\n USDC: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n USDT: \"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\",\n} as const;\n\n/**\n * Swap quote from Jupiter API\n */\nexport interface SwapQuote {\n inputMint: string;\n outputMint: string;\n inAmount: string;\n outAmount: string;\n priceImpactPct: string;\n marketInfos: Array<{\n id: string;\n label: string;\n inputMint: string;\n outputMint: string;\n notEnoughLiquidity: boolean;\n inAmount: string;\n outAmount: string;\n lpFee: { amount: string; mint: string; pct: number };\n platformFee: { amount: string; mint: string; pct: number };\n }>;\n routePlan: Array<{\n swapInfo: {\n ammKey: string;\n label: string;\n inputMint: string;\n outputMint: string;\n inAmount: string;\n outAmount: string;\n feeAmount: string;\n feeMint: string;\n };\n percent: number;\n }>;\n contextSlot: number;\n timeTaken: number;\n otherAmountThreshold: string;\n swapMode: string;\n slippageBps: number;\n}\n\n/**\n * Parameters for executing a swap\n */\nexport interface SwapParams {\n inputMint: string;\n outputMint: string;\n amount: number;\n slippageBps?: number;\n priorityFeeMicroLamports?: number;\n}\n\n/**\n * Result of a swap execution\n */\nexport interface SwapResult {\n success: boolean;\n signature?: string;\n inputAmount: string;\n outputAmount: string;\n inputMint: string;\n outputMint: string;\n priceImpact: string;\n explorerUrl?: string;\n error?: string;\n}\n\n/**\n * Wallet balance information\n */\nexport interface WalletBalance {\n solBalance: number;\n tokens: Array<{\n mint: string;\n balance: string;\n decimals: number;\n uiAmount: number;\n }>;\n}\n\n/**\n * Configuration for transaction confirmation\n */\nconst CONFIRMATION_CONFIG = {\n MAX_ATTEMPTS: 12,\n getDelayForAttempt: (attempt: number): number => Math.min(2000 * 1.5 ** attempt, 20000),\n};\n\n/**\n * SwapService - Handles token swaps on Solana using Jupiter aggregator\n *\n * This service provides:\n * - Token swap execution via Jupiter\n * - Wallet balance queries\n * - Transaction confirmation with retry logic\n * - Dynamic slippage calculation\n */\nexport class SwapService extends Service {\n public static readonly serviceType = \"SwapService\";\n public readonly capabilityDescription =\n \"Executes token swaps on Solana via Jupiter DEX aggregator\";\n\n private connection: Connection | null = null;\n private walletKeypair: Keypair | null = null;\n\n private readonly JUPITER_QUOTE_API = \"https://public.jupiterapi.com/quote\";\n private readonly JUPITER_SWAP_API = \"https://public.jupiterapi.com/swap\";\n\n private decimalsCache = new Map<string, number>([\n [KNOWN_TOKENS.SOL, 9],\n [KNOWN_TOKENS.USDC, 6],\n [KNOWN_TOKENS.USDT, 6],\n ]);\n\n public static async start(runtime: IAgentRuntime): Promise<SwapService> {\n logger.info(`[${SwapService.serviceType}] Starting...`);\n const instance = new SwapService(runtime);\n await instance.initialize();\n return instance;\n }\n\n private async initialize(): Promise<void> {\n logger.info(`[${SwapService.serviceType}] Initializing swap service...`);\n\n const rpcUrlSetting = this.runtime.getSetting(\"SOLANA_RPC_URL\");\n const rpcUrl =\n typeof rpcUrlSetting === \"string\" ? rpcUrlSetting : \"https://api.mainnet-beta.solana.com\";\n this.connection = new Connection(rpcUrl, \"confirmed\");\n\n const privateKeyString = this.runtime.getSetting(\"SOLANA_PRIVATE_KEY\");\n if (privateKeyString && typeof privateKeyString === \"string\") {\n const privateKeyBytes = bs58.decode(privateKeyString);\n this.walletKeypair = Keypair.fromSecretKey(privateKeyBytes);\n logger.info(\n `[${SwapService.serviceType}] Wallet configured: ${this.walletKeypair.publicKey.toBase58()}`,\n );\n } else {\n logger.warn(\n `[${SwapService.serviceType}] No wallet private key configured - swaps will fail`,\n );\n }\n\n logger.info(`[${SwapService.serviceType}] Initialized successfully`);\n }\n\n public async stop(): Promise<void> {\n logger.info(`[${SwapService.serviceType}] Stopped`);\n }\n\n /**\n * Check if the service is ready to execute swaps\n */\n public isReady(): boolean {\n return this.connection !== null && this.walletKeypair !== null;\n }\n\n /**\n * Get the wallet public key\n */\n public getWalletAddress(): string | null {\n return this.walletKeypair?.publicKey.toBase58() ?? null;\n }\n\n /**\n * Get token decimals from chain or cache\n */\n private async getTokenDecimals(mint: string): Promise<number> {\n if (this.decimalsCache.has(mint)) {\n return this.decimalsCache.get(mint)!;\n }\n\n if (!this.connection) {\n return 9;\n }\n\n const mintPubkey = new PublicKey(mint);\n const info = await this.connection.getParsedAccountInfo(mintPubkey);\n\n if (info.value?.data && \"parsed\" in info.value.data) {\n const decimals = info.value.data.parsed.info.decimals as number;\n this.decimalsCache.set(mint, decimals);\n return decimals;\n }\n\n return 9;\n }\n\n /**\n * Convert token amount to smallest unit (lamports equivalent)\n */\n private async amountToSmallestUnit(mint: string, amount: number): Promise<string> {\n const decimals = await this.getTokenDecimals(mint);\n const smallest = new BigNumber(amount).multipliedBy(new BigNumber(10).pow(decimals));\n return smallest.integerValue(BigNumber.ROUND_FLOOR).toString();\n }\n\n /**\n * Convert smallest unit back to token amount\n */\n private async smallestUnitToAmount(mint: string, smallest: string): Promise<string> {\n const decimals = await this.getTokenDecimals(mint);\n return new BigNumber(smallest).dividedBy(new BigNumber(10).pow(decimals)).toString();\n }\n\n /**\n * Calculate dynamic slippage based on trade size and market conditions\n */\n private calculateDynamicSlippage(amount: string, quoteData: SwapQuote): number {\n const baseSlippage = 100; // 1% base\n const priceImpact = Number.parseFloat(quoteData.priceImpactPct || \"0\");\n const amountNum = Number(amount);\n\n let dynamicSlippage = baseSlippage;\n\n // Increase slippage for high price impact\n if (priceImpact > 1) {\n dynamicSlippage += Math.floor(priceImpact * 50);\n }\n\n // Increase slippage for large amounts\n if (amountNum > 10000) {\n dynamicSlippage = Math.floor(dynamicSlippage * 1.5);\n }\n\n // Cap at 2.5%\n return Math.min(dynamicSlippage, 250);\n }\n\n /**\n * Get a swap quote from Jupiter\n */\n public async getQuote(params: SwapParams): Promise<SwapQuote | null> {\n try {\n const amountSmallest = await this.amountToSmallestUnit(params.inputMint, params.amount);\n const slippageBps = params.slippageBps ?? 100;\n\n const queryParams = new URLSearchParams({\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n amount: amountSmallest,\n slippageBps: slippageBps.toString(),\n });\n\n logger.info(\n `[SwapService] Quote: ${params.amount} ${params.inputMint.slice(0, 8)}... ā ${params.outputMint.slice(0, 8)}...`,\n );\n\n const response = await fetch(`${this.JUPITER_QUOTE_API}?${queryParams.toString()}`);\n\n if (!response.ok) {\n const errorText = await response.text();\n const parsedError = parseJSONObjectFromText(errorText);\n\n if (parsedError?.errorCode === \"TOKEN_NOT_TRADABLE\") {\n logger.error(\n `[${SwapService.serviceType}] Token not tradable: ${String(parsedError.error ?? \"unknown error\")}`,\n );\n return null;\n }\n\n logger.error(\n `[${SwapService.serviceType}] Quote request failed: status=${response.status} error=${errorText}`,\n );\n return null;\n }\n\n const quote = (await response.json()) as SwapQuote;\n\n const outputAmount = await this.smallestUnitToAmount(params.outputMint, quote.outAmount);\n logger.info(\n `[SwapService] Quote: ${params.amount} ā ${outputAmount} (${quote.priceImpactPct}% impact, ${quote.routePlan.length} routes)`,\n );\n return quote;\n } catch (error) {\n logger.error(\n `[${SwapService.serviceType}] Quote fetch error: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n }\n\n /**\n * Execute a swap using Jupiter\n */\n public async executeSwap(params: SwapParams): Promise<SwapResult> {\n const errorResult = (error: string): SwapResult => ({\n success: false,\n inputAmount: params.amount.toString(),\n outputAmount: \"0\",\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n priceImpact: \"0\",\n error,\n });\n\n if (!this.isReady()) {\n return errorResult(\"Swap service not ready - wallet not configured\");\n }\n\n try {\n const quote = await this.getQuote(params);\n if (!quote) {\n return errorResult(\"Failed to get quote from Jupiter\");\n }\n\n const dynamicSlippage = this.calculateDynamicSlippage(quote.inAmount, quote);\n logger.info(`[${SwapService.serviceType}] Using dynamic slippage: ${dynamicSlippage} bps`);\n\n // Get swap transaction from Jupiter\n const swapResponse = await fetch(this.JUPITER_SWAP_API, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n quoteResponse: {\n ...quote,\n slippageBps: dynamicSlippage,\n },\n userPublicKey: this.walletKeypair?.publicKey.toString(),\n wrapAndUnwrapSol: true,\n computeUnitPriceMicroLamports: params.priorityFeeMicroLamports ?? 5000000,\n dynamicComputeUnitLimit: true,\n }),\n });\n\n if (!swapResponse.ok) {\n const errorText = await swapResponse.text();\n logger.error(\n `[${SwapService.serviceType}] Swap request failed: status=${swapResponse.status} error=${errorText}`,\n );\n return {\n ...errorResult(`Jupiter swap request failed: ${errorText}`),\n outputAmount: await this.smallestUnitToAmount(params.outputMint, quote.outAmount),\n priceImpact: quote.priceImpactPct,\n };\n }\n\n const swapData = (await swapResponse.json()) as {\n swapTransaction: string;\n };\n\n if (!swapData?.swapTransaction) {\n logger.error(`[${SwapService.serviceType}] No swap transaction returned`);\n return {\n ...errorResult(\"No swap transaction returned from Jupiter\"),\n outputAmount: await this.smallestUnitToAmount(params.outputMint, quote.outAmount),\n priceImpact: quote.priceImpactPct,\n };\n }\n\n // Deserialize and sign the transaction\n const transactionBuf = Buffer.from(swapData.swapTransaction, \"base64\");\n const transaction = VersionedTransaction.deserialize(transactionBuf);\n\n // Get fresh blockhash\n const latestBlockhash = await this.connection?.getLatestBlockhash(\"processed\");\n if (!latestBlockhash) {\n throw new Error(\"Failed to get latest blockhash\");\n }\n transaction.message.recentBlockhash = latestBlockhash.blockhash;\n\n // Sign the transaction\n transaction.sign([this.walletKeypair!]);\n\n // Send the transaction\n const signature = await this.connection?.sendRawTransaction(transaction.serialize(), {\n skipPreflight: true,\n maxRetries: 5,\n preflightCommitment: \"processed\",\n });\n\n if (!signature) {\n throw new Error(\"Failed to send transaction - no signature returned\");\n }\n\n logger.info(\n `[SwapService] Tx sent: ${signature.slice(0, 16)}... (https://solscan.io/tx/${signature})`,\n );\n\n // Confirm the transaction\n const confirmed = await this.confirmTransaction(signature);\n\n if (!confirmed) {\n return {\n success: false,\n signature,\n inputAmount: params.amount.toString(),\n outputAmount: await this.smallestUnitToAmount(params.outputMint, quote.outAmount),\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n priceImpact: quote.priceImpactPct,\n explorerUrl: `https://solscan.io/tx/${signature}`,\n error: \"Transaction confirmation failed\",\n };\n }\n\n logger.info(\n `[SwapService] Swap complete: ${params.amount} ā ${await this.smallestUnitToAmount(params.outputMint, quote.outAmount)}`,\n );\n\n return {\n success: true,\n signature,\n inputAmount: params.amount.toString(),\n outputAmount: await this.smallestUnitToAmount(params.outputMint, quote.outAmount),\n inputMint: params.inputMint,\n outputMint: params.outputMint,\n priceImpact: quote.priceImpactPct,\n explorerUrl: `https://solscan.io/tx/${signature}`,\n };\n } catch (error) {\n logger.error(\n `[${SwapService.serviceType}] Swap execution error: ${error instanceof Error ? error.message : String(error)}`,\n );\n return errorResult(error instanceof Error ? error.message : \"Unknown swap error\");\n }\n }\n\n /**\n * Confirm a transaction with exponential backoff\n */\n private async confirmTransaction(signature: string): Promise<boolean> {\n for (let attempt = 0; attempt < CONFIRMATION_CONFIG.MAX_ATTEMPTS; attempt++) {\n const status = await this.connection?.getSignatureStatus(signature);\n if (!status) continue;\n\n const confirmationStatus = status.value?.confirmationStatus as\n | TransactionConfirmationStatus\n | undefined;\n if (confirmationStatus === \"confirmed\" || confirmationStatus === \"finalized\") {\n logger.info(\n `[SwapService] Confirmed: ${signature.slice(0, 16)}... (${confirmationStatus})`,\n );\n return true;\n }\n\n const delay = CONFIRMATION_CONFIG.getDelayForAttempt(attempt);\n logger.debug(\n `[${SwapService.serviceType}] Waiting ${delay}ms for confirmation (attempt ${attempt + 1})`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n logger.error(`[${SwapService.serviceType}] Transaction confirmation timed out:`, signature);\n return false;\n }\n\n /**\n * Get wallet balances including SOL and all SPL tokens\n */\n public async getWalletBalances(): Promise<WalletBalance> {\n if (!this.isReady() || !this.walletKeypair?.publicKey) {\n return { solBalance: 0, tokens: [] };\n }\n\n const solBalance = await this.connection?.getBalance(this.walletKeypair.publicKey);\n const tokenProgramId = new PublicKey(\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\");\n\n const tokenAccounts = await this.connection?.getParsedTokenAccountsByOwner(\n this.walletKeypair.publicKey,\n { programId: tokenProgramId },\n );\n\n if (!tokenAccounts) {\n return { solBalance: (solBalance ?? 0) / 1e9, tokens: [] };\n }\n\n const tokens = tokenAccounts.value.map((account) => {\n const parsed = account.account.data.parsed.info;\n return {\n mint: parsed.mint as string,\n balance: parsed.tokenAmount.amount as string,\n decimals: parsed.tokenAmount.decimals as number,\n uiAmount: parsed.tokenAmount.uiAmount as number,\n };\n });\n\n return {\n solBalance: (solBalance ?? 0) / 1e9,\n tokens,\n };\n }\n\n /**\n * Get balance of a specific token\n */\n public async getTokenBalance(mint: string): Promise<number> {\n const balances = await this.getWalletBalances();\n\n if (mint === KNOWN_TOKENS.SOL) {\n return balances.solBalance;\n }\n\n const token = balances.tokens.find((t) => t.mint.toLowerCase() === mint.toLowerCase());\n return token?.uiAmount ?? 0;\n }\n\n /**\n * Execute a buy (SOL -> Token)\n */\n public async buy(\n tokenMint: string,\n solAmount: number,\n slippageBps?: number,\n ): Promise<SwapResult> {\n return this.executeSwap({\n inputMint: KNOWN_TOKENS.SOL,\n outputMint: tokenMint,\n amount: solAmount,\n slippageBps,\n });\n }\n\n /**\n * Execute a sell (Token -> SOL)\n */\n public async sell(\n tokenMint: string,\n tokenAmount: number,\n slippageBps?: number,\n ): Promise<SwapResult> {\n return this.executeSwap({\n inputMint: tokenMint,\n outputMint: KNOWN_TOKENS.SOL,\n amount: tokenAmount,\n slippageBps,\n });\n }\n}\n","/**\n * Get Market Analysis Action\n *\n * Provides market analysis using TokenResolver to fetch trending tokens\n * and display market data.\n */\n\nimport type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { TokenResolverService } from \"../services/TokenResolverService.ts\";\nimport type { TokenValidationService } from \"../services/TokenValidationService.ts\";\n\nexport const getMarketAnalysisAction: Action = {\n name: \"GET_MARKET_ANALYSIS\",\n similes: [\"MARKET_ANALYSIS\", \"ANALYZE_MARKET\", \"MARKET_OVERVIEW\", \"TRENDING_TOKENS\"],\n description: \"Get market analysis and trending token information\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = message.content.text?.toLowerCase() || \"\";\n const keywords = [\n \"analyze\",\n \"analysis\",\n \"market\",\n \"trending\",\n \"outlook\",\n \"sentiment\",\n \"overview\",\n ];\n return keywords.some((kw) => text.includes(kw));\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n const resolver = runtime.getService(\"TokenResolverService\") as TokenResolverService | undefined;\n const validator = runtime.getService(\"TokenValidationService\") as\n | TokenValidationService\n | undefined;\n\n if (!resolver) {\n callback?.({\n text: \"ā Market data service not available. Configure BIRDEYE_API_KEY.\",\n });\n return undefined;\n }\n\n // Check if user asked about a specific token\n const text = message.content.text || \"\";\n const tokenMatch = text.match(/\\b([A-Z]{2,10})\\b/);\n\n let response = \"š **Market Analysis**\\n\\n\";\n\n // If specific token mentioned, analyze it\n if (tokenMatch && tokenMatch[1] !== \"USDC\" && tokenMatch[1] !== \"USD\") {\n const tokenInfo = await resolver.resolve(tokenMatch[1]);\n\n if (tokenInfo) {\n response += `**${tokenInfo.symbol} (${tokenInfo.name})**\\n`;\n response += `⢠Address: \\`${tokenInfo.address.slice(0, 12)}...\\`\\n`;\n response += `⢠Price: $${tokenInfo.price?.toFixed(6) || \"N/A\"}\\n`;\n response += `⢠24h Volume: $${tokenInfo.volume24h?.toLocaleString() || \"N/A\"}\\n`;\n response += `⢠Liquidity: $${tokenInfo.liquidity?.toLocaleString() || \"N/A\"}\\n\\n`;\n\n // Validate token\n if (validator) {\n const validation = await validator.validateToken(tokenInfo.address);\n if (validation.isValid) {\n response += \"ā
**Safety Check: PASSED**\\n\";\n } else {\n response += \"ā **Safety Check: FAILED**\\n\";\n validation.rejectionReasons.forEach((r) => {\n response += `⢠${r}\\n`;\n });\n }\n if (validation.warnings.length > 0) {\n response += \"\\nā ļø **Warnings:**\\n\";\n validation.warnings.slice(0, 3).forEach((w) => {\n response += `⢠${w}\\n`;\n });\n }\n }\n response += \"\\n---\\n\\n\";\n }\n }\n\n // Get trending tokens\n const trending = await resolver.getTrendingTokens(10);\n\n if (trending.length > 0) {\n response += \"**š Top Trending Tokens (by 24h Volume)**\\n\\n\";\n\n trending.slice(0, 10).forEach((token, i) => {\n const vol = token.volume24h ? `$${(token.volume24h / 1e6).toFixed(1)}M` : \"N/A\";\n const liq = token.liquidity ? `$${(token.liquidity / 1e6).toFixed(1)}M` : \"N/A\";\n response += `${i + 1}. **${token.symbol}** - $${token.price?.toFixed(6) || \"N/A\"} | Vol: ${vol} | Liq: ${liq}\\n`;\n });\n\n response += `\\n---\\n\\n`;\n response += `**š” Tips:**\\n`;\n response += `⢠High volume with high liquidity = safer trades\\n`;\n response += `⢠Use \"Buy [amount] SOL of [TOKEN]\" to trade\\n`;\n response += `⢠Start trading with \"Start trading with LLM strategy\"\\n`;\n } else {\n response += \"ā ļø Could not fetch trending tokens. Check BIRDEYE_API_KEY.\\n\";\n }\n\n callback?.({ text: response });\n return undefined;\n },\n\n examples: [\n [\n { name: \"{{user1}}\", content: { text: \"Give me a market analysis\" } },\n {\n name: \"{{agentName}}\",\n content: { text: \"Here is the current market overview...\" },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Analyze BONK for me\" } },\n { name: \"{{agentName}}\", content: { text: \"Let me analyze BONK...\" } },\n ],\n ],\n};\n","/**\n * Run Backtest Action\n *\n * Provides backtesting information. Note: Full backtesting requires\n * additional infrastructure (historical data service, simulation engine).\n * This action provides guidance on strategy testing.\n */\n\nimport type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\n\nexport const runBacktestAction: Action = {\n name: \"RUN_BACKTEST\",\n similes: [\"BACKTEST\", \"TEST_STRATEGY\", \"SIMULATE_TRADING\"],\n description: \"Get information about backtesting strategies\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = message.content.text?.toLowerCase() || \"\";\n return [\"backtest\", \"simulation\", \"test strategy\", \"simulate\"].some((kw) => text.includes(kw));\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as\n | AutoTradingManager\n | undefined;\n const strategies = tradingManager?.getStrategies() || [];\n\n const strategyList = strategies.map((s) => `⢠**${s.name}** (${s.id})`).join(\"\\n\");\n\n const response = `š **Backtesting Information**\n\n**Available Strategies:**\n${strategyList || \"⢠No strategies loaded\"}\n\n**How to Test Strategies:**\n\n1. **Paper Trading Mode** (Recommended)\n Start with paper trading to test strategies without real funds:\n \\`\\`\\`\n \"Start paper trading with LLM strategy\"\n \\`\\`\\`\n\n2. **Monitor Performance**\n Track your paper trades over time:\n \\`\\`\\`\n \"Check portfolio\" or \"Show performance\"\n \\`\\`\\`\n\n3. **Compare Results**\n Run different strategies and compare performance metrics.\n\n**Settings:**\n⢠Set \\`TRADING_MODE=paper\\` for simulated trading\n⢠Use \\`BIRDEYE_API_KEY\\` for real market data\n⢠Adjust \\`STOP_LOSS_PERCENT\\` and \\`TAKE_PROFIT_PERCENT\\`\n\n**Note:** For production backtesting with historical data, consider using dedicated backtesting tools or running paper trading over extended periods.\n\nWould you like to start paper trading with a specific strategy?`;\n\n callback?.({ text: response });\n return undefined;\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Can you run a backtest for the LLM strategy?\" },\n },\n {\n name: \"{{agentName}}\",\n content: { text: \"Here is information about testing strategies...\" },\n },\n ],\n ],\n};\n","/**\n * Start Trading Action\n *\n * Starts automated trading with a specified strategy.\n * Supports ANY Solana token via dynamic resolution.\n * LLM strategy auto-discovers trending tokens.\n */\n\nimport type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\nimport type { TokenResolverService } from \"../services/TokenResolverService.ts\";\n\n/** Map user-friendly strategy names to internal strategy IDs */\nconst STRATEGY_MAP: Record<string, string> = {\n llm: \"llm\",\n ai: \"llm\",\n smart: \"llm\",\n intelligent: \"llm\",\n momentum: \"momentum-breakout-v1\",\n breakout: \"momentum-breakout-v1\",\n \"mean reversion\": \"mean-reversion\",\n \"mean-reversion\": \"mean-reversion\",\n reversion: \"mean-reversion\",\n rules: \"rule-based\",\n \"rule-based\": \"rule-based\",\n technical: \"rule-based\",\n random: \"random-v1\",\n};\n\n/** Extract token mentions from text - any word that could be a token symbol */\nasync function extractTokens(\n text: string,\n resolver: TokenResolverService | undefined,\n): Promise<string[]> {\n const resolved: string[] = [];\n\n // Check for direct Solana addresses\n const addressMatches = text.matchAll(/[1-9A-HJ-NP-Za-km-z]{32,44}/g);\n for (const match of addressMatches) {\n resolved.push(match[0]);\n }\n\n // Check for token mentions in text\n // Pattern: \"trade BONK\", \"on WIF and POPCAT\", \"tokens: PEPE, DOGE\"\n const tokenPatterns = [\n /(?:trade|on|tokens?:?|with)\\s+([A-Z0-9]+(?:\\s*,?\\s*[A-Z0-9]+)*)/gi,\n /(?:trade|buy|sell)\\s+([A-Z][A-Z0-9]{2,10})/gi,\n ];\n\n const potentialSymbols = new Set<string>();\n for (const pattern of tokenPatterns) {\n const matches = text.matchAll(pattern);\n for (const match of matches) {\n const symbols = match[1].split(/[\\s,]+/).filter((s) => s.length >= 2 && s.length <= 12);\n for (const s of symbols) {\n potentialSymbols.add(s.toUpperCase());\n }\n }\n }\n\n // Common tokens mentioned by name\n const namedTokens: Record<string, string> = {\n bonk: \"BONK\",\n wif: \"WIF\",\n dogwifhat: \"WIF\",\n popcat: \"POPCAT\",\n jupiter: \"JUP\",\n raydium: \"RAY\",\n pepe: \"PEPE\",\n solana: \"SOL\",\n };\n\n for (const [name, symbol] of Object.entries(namedTokens)) {\n if (text.includes(name)) {\n potentialSymbols.add(symbol);\n }\n }\n\n // Resolve all symbols\n if (resolver && potentialSymbols.size > 0) {\n for (const symbol of potentialSymbols) {\n const tokenInfo = await resolver.resolve(symbol);\n if (tokenInfo) {\n resolved.push(tokenInfo.address);\n }\n }\n }\n\n return resolved;\n}\n\nexport const startTradingAction: Action = {\n name: \"START_TRADING\",\n similes: [\"BEGIN_TRADING\", \"START_AUTO_TRADING\", \"ENABLE_TRADING\", \"TURN_ON_TRADING\"],\n description: \"Start automated trading with a specified strategy. Supports ANY Solana token.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Start trading with the LLM strategy\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"š Auto-trading started!\\nStrategy: LLM Trading Strategy\\nMode: Analyzing trending tokens from Birdeye\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Start momentum trading on BONK with $500 max position\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"š Auto-trading started!\\nStrategy: Momentum Breakout\\nTokens: BONK\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Trade PEPE and DOGE using AI strategy\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"š Auto-trading started!\\nStrategy: LLM Trading Strategy\\nTokens: PEPE, DOGE\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Begin trading EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: { text: \"š Auto-trading started!\\nTokens: WIF (EKpQGSJ...)\" },\n },\n ],\n ],\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = (message.content.text || \"\").toLowerCase();\n return text.includes(\"start\") || text.includes(\"begin\") || text.includes(\"enable\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n const autoTradingManager = runtime.getService(\"AutoTradingManager\") as\n | AutoTradingManager\n | undefined;\n const resolver = runtime.getService(\"TokenResolverService\") as TokenResolverService | undefined;\n\n if (!autoTradingManager) {\n callback?.({\n text: \"ā AutoTradingManager not found. Ensure plugin is loaded.\",\n action: \"START_TRADING\",\n });\n return undefined;\n }\n\n // Check if already trading\n const currentStatus = autoTradingManager.getStatus();\n if (currentStatus.isTrading) {\n callback?.({\n text: `ā ļø Trading is already active with the ${currentStatus.strategy} strategy.\\n\\nTo change strategies, first stop trading with \"Stop trading\" and then start again.`,\n action: \"START_TRADING\",\n });\n return undefined;\n }\n\n const text = (message.content.text || \"\").toLowerCase();\n\n // Extract strategy\n let strategyId = \"llm\";\n let strategyName = \"LLM Trading Strategy\";\n\n for (const [keyword, id] of Object.entries(STRATEGY_MAP)) {\n if (text.includes(keyword)) {\n strategyId = id;\n break;\n }\n }\n\n const strategies = autoTradingManager.getStrategies();\n const selectedStrategy = strategies.find((s) => s.id === strategyId);\n if (selectedStrategy) {\n strategyName = selectedStrategy.name;\n }\n\n // Extract tokens dynamically\n let tokens = await extractTokens(message.content.text || \"\", resolver);\n\n // Check for \"top X trending\" pattern\n const topMatch = text.match(/top (\\d+) (?:trending|meme|coins?)/);\n if (topMatch && resolver) {\n const count = parseInt(topMatch[1], 10);\n const trending = await resolver.getTrendingTokens(count);\n tokens = trending.map((t) => t.address);\n }\n\n // For LLM strategy with no tokens, use 'auto' for dynamic discovery\n if (tokens.length === 0 && strategyId === \"llm\") {\n tokens = [\"auto\"];\n }\n\n // Default to fetching trending tokens for other strategies too\n if (tokens.length === 0 && resolver) {\n const trending = await resolver.getTrendingTokens(3);\n tokens = trending.map((t) => t.address);\n }\n\n // If still no tokens and no resolver, fail gracefully\n if (tokens.length === 0) {\n callback?.({\n text: 'ā No tokens specified and unable to fetch trending tokens.\\n\\nPlease specify tokens to trade (e.g., \"start trading BONK, WIF\") or configure BIRDEYE_API_KEY.',\n action: \"START_TRADING\",\n });\n return undefined;\n }\n\n // Extract position size\n let maxPositionSize = 0.1; // default 10%\n const percentMatch = text.match(/(\\d+)%?\\s*(?:of\\s+)?(?:portfolio|position)/);\n if (percentMatch) {\n maxPositionSize = parseInt(percentMatch[1], 10) / 100;\n }\n\n const amountMatch = text.match(/\\$(\\d+)/);\n if (amountMatch) {\n maxPositionSize = Math.min(parseInt(amountMatch[1], 10) / 1000, 0.25);\n }\n\n // Extract risk parameters\n let stopLossPercent = Number(runtime.getSetting(\"STOP_LOSS_PERCENT\")) || 5;\n let takeProfitPercent = Number(runtime.getSetting(\"TAKE_PROFIT_PERCENT\")) || 15;\n\n const slMatch = text.match(/stop\\s*loss\\s*(?:at\\s*)?(\\d+)%?/);\n if (slMatch) stopLossPercent = parseInt(slMatch[1], 10);\n\n const tpMatch = text.match(/take\\s*profit\\s*(?:at\\s*)?(\\d+)%?/);\n if (tpMatch) takeProfitPercent = parseInt(tpMatch[1], 10);\n\n // Extract interval\n let intervalMs = Number(runtime.getSetting(\"TRADING_INTERVAL_MS\")) || 60000;\n const intervalMatch = text.match(/every\\s*(\\d+)\\s*(minute|min|second|sec|hour|hr)/);\n if (intervalMatch) {\n const value = parseInt(intervalMatch[1], 10);\n const unit = intervalMatch[2];\n if (unit.startsWith(\"sec\")) intervalMs = value * 1000;\n else if (unit.startsWith(\"min\")) intervalMs = value * 60 * 1000;\n else if (unit.startsWith(\"hour\") || unit.startsWith(\"hr\"))\n intervalMs = value * 60 * 60 * 1000;\n }\n\n const maxDailyLoss = Number(runtime.getSetting(\"MAX_DAILY_LOSS_USD\")) || 500;\n\n // Start trading\n await autoTradingManager.startTrading({\n strategy: strategyId,\n tokens,\n maxPositionSize,\n intervalMs,\n stopLossPercent,\n takeProfitPercent,\n maxDailyLoss,\n });\n\n // Format token names for response\n let tokenNames: string;\n if (tokens[0] === \"auto\") {\n tokenNames = \"Auto-discovered trending tokens\";\n } else if (resolver) {\n const names = await Promise.all(\n tokens.map(async (addr) => {\n const info = await resolver.resolveByAddress(addr);\n return info?.symbol || `${addr.slice(0, 8)}...`;\n }),\n );\n tokenNames = names.join(\", \");\n } else {\n tokenNames = tokens.map((t) => `${t.slice(0, 8)}...`).join(\", \");\n }\n\n const tradingMode = runtime.getSetting(\"TRADING_MODE\") || \"paper\";\n const modeWarning =\n tradingMode === \"live\"\n ? \"\\n\\nā ļø **LIVE TRADING MODE** - Real funds at risk!\"\n : \"\\n\\nš Paper trading mode - No real funds used.\";\n\n const response = `š **Auto-trading started!**\n\n**Strategy:** ${strategyName}\n**Tokens:** ${tokenNames}\n**Max position size:** ${(maxPositionSize * 100).toFixed(0)}% of portfolio\n**Stop loss:** ${stopLossPercent}%\n**Take profit:** ${takeProfitPercent}%\n**Trading interval:** ${intervalMs / 1000}s\n**Max daily loss:** $${maxDailyLoss}${modeWarning}\n\nUse \"Stop trading\" to stop, or \"Check portfolio\" to see positions.`;\n\n callback?.({ text: response, action: \"START_TRADING\" });\n logger.info(`[startTradingAction] Started: ${strategyId}, tokens: ${tokenNames}`);\n return undefined;\n },\n};\n","import type {\n Action,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\n\nexport const stopTradingAction: Action = {\n name: \"STOP_TRADING\",\n description: \"Stop automated trading\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Stop trading\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Stopping automated trading. All positions remain open. You can check your portfolio status anytime.\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Pause auto-trader\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Auto-trading has been paused. Your open positions will not be affected. You can restart trading whenever you're ready.\",\n },\n },\n ],\n ],\n\n validate: async (_runtime: IAgentRuntime, message: Memory) => {\n const text = (message.content.text || \"\").toLowerCase();\n return text.includes(\"stop\") || text.includes(\"pause\") || text.includes(\"halt\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ) => {\n try {\n const autoTradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n if (!autoTradingManager) {\n throw new Error(\"AutoTradingManager not found\");\n }\n\n const status = autoTradingManager.getStatus();\n const wasTrading = status.isTrading;\n await autoTradingManager.stopTrading();\n\n let response = \"\";\n if (wasTrading) {\n const positions = status.positions;\n const dailyPnL = status.performance.dailyPnL;\n\n response = `š Auto-trading stopped.\n\nš Current Status:\n⢠Open positions: ${positions.length}\n⢠Today's P&L: ${dailyPnL >= 0 ? \"+\" : \"\"}$${dailyPnL.toFixed(2)}\n\nYour open positions will remain active. You can:\n- Check portfolio status anytime\n- Restart trading when ready\n- Manually manage positions if needed`;\n } else {\n response = \"Auto-trading is not currently active.\";\n }\n\n if (callback) {\n callback({\n text: response,\n action: \"STOP_TRADING\",\n });\n }\n\n return undefined;\n } catch (error) {\n logger.error(\n \"Error stopping trading:\",\n error instanceof Error ? error.message : String(error),\n );\n\n if (callback) {\n callback({\n text: `Failed to stop trading: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n action: \"STOP_TRADING\",\n });\n }\n\n return undefined;\n }\n },\n};\n","import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\n\nexport const marketDataProvider: Provider = {\n name: \"MARKET_DATA\",\n get: async (_runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n // For now, provide mock market data\n // In a real implementation, this would fetch from real APIs\n const marketText = `š **Market Overview**\n\nš„ **Trending Tokens:**\n⢠SOL: $102.45 (+2.3% 24h) - Vol: $2.1B\n⢠ETH: $2,985.67 (+1.8% 24h) - Vol: $8.4B \n⢠BTC: $45,234.11 (+0.9% 24h) - Vol: $15.2B\n\nš **Market Sentiment:** Bullish\nšļø **Fear & Greed Index:** 68 (Greed)\nš **Total Market Cap:** $1.82T\n\nā” **Quick Stats:**\n⢠Active DEX Pairs: 12,847\n⢠24h Volume: $28.6B\n⢠BTC Dominance: 48.2%`;\n\n return { text: marketText };\n } catch (error) {\n console.error(\"[MarketDataProvider] Error:\", error);\n return { text: \"Market data is currently unavailable.\" };\n }\n },\n};\n","import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\n\nconst STRATEGY_INFO: Record<string, { type: string; bestFor: string; riskLevel: string }> = {\n llm: {\n type: \"AI-driven analysis\",\n bestFor: \"Complex market analysis\",\n riskLevel: \"Variable\",\n },\n \"momentum-breakout-v1\": {\n type: \"Technical analysis\",\n bestFor: \"Trending markets\",\n riskLevel: \"Moderate\",\n },\n \"mean-reversion\": {\n type: \"Statistical\",\n bestFor: \"Range-bound markets\",\n riskLevel: \"Moderate\",\n },\n \"rule-based\": {\n type: \"Technical indicators\",\n bestFor: \"Systematic trading\",\n riskLevel: \"Low-Moderate\",\n },\n \"random-v1\": {\n type: \"Probabilistic\",\n bestFor: \"Baseline testing\",\n riskLevel: \"High\",\n },\n};\n\nexport const strategyProvider: Provider = {\n name: \"STRATEGY\",\n get: async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as\n | AutoTradingManager\n | undefined;\n\n if (!tradingManager) {\n return {\n text: \"Strategy information unavailable - trading service not loaded.\",\n };\n }\n\n const strategies = tradingManager.getStrategies();\n const status = tradingManager.getStatus();\n\n let text = `šÆ **Available Trading Strategies**\\n\\n`;\n\n for (const strategy of strategies) {\n const info = STRATEGY_INFO[strategy.id] || {\n type: \"Custom\",\n bestFor: \"Various\",\n riskLevel: \"Variable\",\n };\n const isActive = status.strategy === strategy.name;\n text += `**${strategy.name}** ${isActive ? \"ā
Active\" : \"\"}\\n`;\n text += `⢠ID: \\`${strategy.id}\\`\\n`;\n text += `⢠Type: ${info.type}\\n`;\n text += `⢠Best for: ${info.bestFor}\\n`;\n text += `⢠Risk: ${info.riskLevel}\\n\\n`;\n }\n\n text += `š” **Quick Start:**\\n`;\n text += `⢠\"Start trading with LLM strategy\"\\n`;\n text += `⢠\"Start momentum trading on BONK\"\\n`;\n text += `⢠\"Run backtest with mean reversion\"`;\n\n return { text };\n },\n};\n","import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { AutoTradingManager } from \"../services/AutoTradingManager.ts\";\n\nexport const tradingProvider: Provider = {\n name: \"TRADING\",\n\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const tradingManager = runtime.getService(\"AutoTradingManager\") as AutoTradingManager;\n if (!tradingManager) {\n return { text: \"Trading services not available\" };\n }\n\n const status = tradingManager.getStatus();\n const performance = status.performance;\n\n // Calculate unrealized P&L\n let unrealizedPnL = 0;\n status.positions.forEach((pos) => {\n if (pos.currentPrice && pos.currentPrice > 0) {\n const pnl = (pos.currentPrice - pos.entryPrice) * pos.amount;\n unrealizedPnL += pnl;\n }\n });\n\n const totalPnL = performance.totalPnL + unrealizedPnL;\n\n // Format comprehensive trading info\n const response = `š **Trading Dashboard**\n\nš“ **Status:** ${status.isTrading ? \"ACTIVE š¢\" : \"STOPPED š“\"}\n${status.strategy ? `š **Strategy:** ${status.strategy}` : \"\"}\n\nš° **Portfolio Performance:**\n⢠Total P&L: ${totalPnL >= 0 ? \"+\" : \"\"}$${totalPnL.toFixed(2)} ${totalPnL >= 0 ? \"š\" : \"š\"}\n⢠Today's P&L: ${performance.dailyPnL >= 0 ? \"+\" : \"\"}$${performance.dailyPnL.toFixed(2)}\n⢠Unrealized P&L: ${unrealizedPnL >= 0 ? \"+\" : \"\"}$${unrealizedPnL.toFixed(2)}\n\nš **Trading Statistics:**\n⢠Total Trades: ${performance.totalTrades}\n⢠Win Rate: ${(performance.winRate * 100).toFixed(1)}%\n⢠Open Positions: ${status.positions.length}\n\n${status.positions.length > 0 ? `\\nš **Current Positions:**\\n${formatPositions(status.positions)}` : \"\"}\n\n${!status.isTrading ? '\\nš” Use \"start trading\" to begin automated trading.' : \"\\nā” Trading is active and monitoring markets.\"}`;\n\n return { text: response };\n } catch (error) {\n console.error(\"Error in tradingProvider:\", error);\n return { text: \"Unable to fetch trading information\" };\n }\n },\n};\n\ninterface PositionData {\n tokenAddress: string;\n amount: number;\n entryPrice: number;\n currentPrice?: number;\n}\n\nfunction formatPositions(positions: PositionData[]): string {\n return positions\n .map((pos) => {\n const currentPrice = pos.currentPrice ?? pos.entryPrice;\n const pnl = (currentPrice - pos.entryPrice) * pos.amount;\n const pnlPercent = ((currentPrice - pos.entryPrice) / pos.entryPrice) * 100;\n return `⢠${pos.tokenAddress.slice(0, 8)}...: ${pos.amount.toFixed(4)} @ $${pos.entryPrice.toFixed(4)} (${pnlPercent.toFixed(2)}% | ${pnl >= 0 ? \"+\" : \"\"}$${pnl.toFixed(2)})`;\n })\n .join(\"\\n\");\n}\n","import { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { LLMStrategy } from \"../strategies/LLMStrategy.ts\";\nimport type {\n AgentState,\n OHLCV,\n PortfolioSnapshot,\n Position,\n StrategyContextMarketData,\n TradeOrder,\n TradingStrategy,\n} from \"../types.ts\";\nimport { OrderType, TradeType } from \"../types.ts\";\nimport type { SwapService } from \"./SwapService.ts\";\nimport type { TokenValidationService } from \"./TokenValidationService.ts\";\nimport type {\n TradingEnvironmentState,\n TradingTrajectoryService,\n} from \"./TradingTrajectoryService.ts\";\n\n/** Risk management helper */\nclass RiskManager {\n constructor(\n private maxDailyLoss = 1000,\n private stopLossPercent = 0.05,\n private takeProfitPercent = 0.1,\n ) {}\n\n checkLimits(\n dailyPnL: number,\n position: Position,\n currentPrice: number,\n ): { shouldExit: boolean; reason?: string } {\n if (dailyPnL < -this.maxDailyLoss) {\n return { shouldExit: true, reason: \"Daily loss limit exceeded\" };\n }\n const pnlPercent = (currentPrice - position.entryPrice) / position.entryPrice;\n if (pnlPercent < -this.stopLossPercent) {\n return {\n shouldExit: true,\n reason: `Stop loss at ${(pnlPercent * 100).toFixed(1)}%`,\n };\n }\n if (pnlPercent > this.takeProfitPercent) {\n return {\n shouldExit: true,\n reason: `Take profit at ${(pnlPercent * 100).toFixed(1)}%`,\n };\n }\n return { shouldExit: false };\n }\n}\n\n/** Trade analytics tracker */\nclass Analytics {\n private trades: Array<{\n timestamp: number;\n type: TradeType;\n price: number;\n quantity: number;\n realizedPnL?: number;\n txId?: string;\n }> = [];\n\n trackTrade(trade: {\n type: TradeType;\n price: number;\n quantity: number;\n realizedPnL?: number;\n txId?: string;\n }): void {\n this.trades.push({ ...trade, timestamp: Date.now() });\n }\n\n getMetrics() {\n const todayStart = new Date().setHours(0, 0, 0, 0);\n const winning = this.trades.filter((t) => (t.realizedPnL || 0) > 0);\n const totalPnL = this.trades.reduce((sum, t) => sum + (t.realizedPnL || 0), 0);\n const dailyPnL = this.trades\n .filter((t) => t.timestamp >= todayStart)\n .reduce((sum, t) => sum + (t.realizedPnL || 0), 0);\n\n return {\n totalPnL,\n dailyPnL,\n winRate: this.trades.length > 0 ? winning.length / this.trades.length : 0,\n totalTrades: this.trades.length,\n winningTrades: winning.length,\n losingTrades: this.trades.length - winning.length,\n };\n }\n}\n\nexport interface TradingConfig {\n strategy: string;\n tokens: string[];\n maxPositionSize: number;\n intervalMs: number;\n stopLossPercent?: number;\n takeProfitPercent?: number;\n maxDailyLoss?: number;\n}\n\nexport interface TradingStatus {\n isTrading: boolean;\n strategy?: string;\n positions: Position[];\n performance: {\n totalPnL: number;\n dailyPnL: number;\n winRate: number;\n totalTrades: number;\n };\n}\n\ninterface TransactionRecord {\n id: string;\n timestamp: number;\n action: TradeType;\n token: string;\n quantity: number;\n price: number;\n reason?: string;\n signature?: string;\n}\n\nexport class AutoTradingManager extends Service {\n public static readonly serviceType = \"AutoTradingManager\";\n public readonly capabilityDescription =\n \"Trading service with LLM strategies and Jupiter swap execution\";\n\n private strategies = new Map<string, TradingStrategy>();\n private activeStrategy?: TradingStrategy;\n private isTrading = false;\n private positions = new Map<string, Position>();\n private tradingInterval?: NodeJS.Timeout;\n private currentConfig?: TradingConfig;\n private transactionHistory: TransactionRecord[] = [];\n private riskManager = new RiskManager();\n private analytics = new Analytics();\n private swapService: SwapService | null = null;\n private validationService: TokenValidationService | null = null;\n private trajectoryService: TradingTrajectoryService | null = null;\n\n public static async start(runtime: IAgentRuntime): Promise<AutoTradingManager> {\n const instance = new AutoTradingManager(runtime);\n await instance.initialize();\n return instance;\n }\n\n private async initialize(): Promise<void> {\n this.swapService = this.runtime.getService(\"SwapService\") as SwapService | null;\n this.validationService = this.runtime.getService(\n \"TokenValidationService\",\n ) as TokenValidationService | null;\n this.trajectoryService = this.runtime.getService(\n \"TradingTrajectoryService\",\n ) as TradingTrajectoryService | null;\n\n const liveReady = this.swapService?.isReady();\n const trajectoryEnabled = this.trajectoryService?.isEnabled();\n logger.info(\n `[AutoTradingManager] Initialized (live: ${liveReady ? \"yes\" : \"no\"}, trajectory: ${trajectoryEnabled ? \"yes\" : \"no\"})`,\n );\n\n await this.registerDefaultStrategies();\n logger.info(`[AutoTradingManager] Loaded ${this.strategies.size} strategies`);\n }\n\n public async stop(): Promise<void> {\n await this.stopTrading();\n }\n\n private async registerDefaultStrategies(): Promise<void> {\n const [\n { MomentumBreakoutStrategy },\n { MeanReversionStrategy },\n { RuleBasedStrategy },\n { RandomStrategy },\n ] = await Promise.all([\n import(\"../strategies/MomentumBreakoutStrategy.ts\"),\n import(\"../strategies/MeanReversionStrategy.ts\"),\n import(\"../strategies/RuleBasedStrategy.ts\"),\n import(\"../strategies/RandomStrategy.ts\"),\n ]);\n\n const llm = new LLMStrategy();\n await llm.initialize(this.runtime);\n this.registerStrategy(llm);\n this.registerStrategy(new MomentumBreakoutStrategy());\n this.registerStrategy(new MeanReversionStrategy());\n this.registerStrategy(new RuleBasedStrategy());\n this.registerStrategy(new RandomStrategy());\n }\n\n public registerStrategy(strategy: TradingStrategy): void {\n this.strategies.set(strategy.id, strategy);\n }\n\n public async startTrading(config: TradingConfig): Promise<void> {\n if (this.isTrading) throw new Error(\"Already trading\");\n\n const strategy = this.strategies.get(config.strategy);\n if (!strategy) throw new Error(`Strategy \"${config.strategy}\" not found`);\n\n this.riskManager = new RiskManager(\n config.maxDailyLoss,\n config.stopLossPercent,\n config.takeProfitPercent,\n );\n this.activeStrategy = strategy;\n this.currentConfig = config;\n this.isTrading = true;\n\n // Start trajectory logging session\n if (this.trajectoryService?.isEnabled()) {\n const envState = await this.getEnvironmentState();\n this.trajectoryService.startSession({\n strategy: strategy.id,\n initialState: envState,\n scenarioId: `auto-trade-${strategy.id}`,\n });\n }\n\n logger.info(`[AutoTradingManager] Started: ${strategy.name}, interval: ${config.intervalMs}ms`);\n\n this.tradingInterval = setInterval(\n () => this.tradingLoop().catch((e) => logger.error(\"[AutoTradingManager] Loop error:\", e)),\n config.intervalMs,\n );\n this.tradingLoop().catch((e) => logger.error(\"[AutoTradingManager] Initial loop error:\", e));\n }\n\n public async stopTrading(): Promise<void> {\n // End trajectory logging session\n if (this.trajectoryService?.isEnabled()) {\n const envState = await this.getEnvironmentState();\n await this.trajectoryService.endSession(\"completed\", envState);\n }\n\n this.isTrading = false;\n this.activeStrategy = undefined;\n if (this.tradingInterval) {\n clearInterval(this.tradingInterval);\n this.tradingInterval = undefined;\n }\n logger.info(\"[AutoTradingManager] Stopped\");\n }\n\n private async tradingLoop(): Promise<void> {\n if (!this.isTrading || !this.activeStrategy || !this.currentConfig) return;\n\n // For 'auto' mode (LLM strategy), the strategy handles token discovery\n // We call processToken once with null to trigger the strategy's internal token selection\n if (this.currentConfig.tokens.length === 1 && this.currentConfig.tokens[0] === \"auto\") {\n await this.processToken(null);\n } else {\n // For explicit token lists, process each token\n for (const token of this.currentConfig.tokens) {\n await this.processToken(token);\n }\n }\n }\n\n private async processToken(token: string | null): Promise<void> {\n if (!this.activeStrategy) return;\n\n // Start trajectory step\n const envState = await this.getEnvironmentState();\n this.trajectoryService?.startTradingStep(envState);\n\n // For auto mode (token=null), LLM strategy handles its own token discovery\n // For explicit tokens, we get market data for that specific token\n const marketData = token ? await this.getMarketData(token) : this.createAutoModeMarketData();\n if (!marketData) return;\n\n // Check risk limits for existing positions\n if (token) {\n const position = this.positions.get(token);\n if (position && marketData.currentPrice) {\n const exitCheck = this.riskManager.checkLimits(\n this.analytics.getMetrics().dailyPnL,\n position,\n marketData.currentPrice,\n );\n if (exitCheck.shouldExit) {\n const order: TradeOrder = {\n action: TradeType.SELL,\n pair: `${token}/USDC`,\n quantity: position.amount,\n orderType: OrderType.MARKET,\n timestamp: Date.now(),\n reason: exitCheck.reason || \"Risk limit exit\",\n };\n await this.executeTrade(order);\n return;\n }\n }\n }\n\n // Also check all open positions for risk limits\n for (const [posToken, position] of this.positions) {\n if (posToken !== token) {\n const posMarketData = await this.getMarketData(posToken);\n if (posMarketData?.currentPrice) {\n const exitCheck = this.riskManager.checkLimits(\n this.analytics.getMetrics().dailyPnL,\n position,\n posMarketData.currentPrice,\n );\n if (exitCheck.shouldExit) {\n const order: TradeOrder = {\n action: TradeType.SELL,\n pair: `${posToken}/USDC`,\n quantity: position.amount,\n orderType: OrderType.MARKET,\n timestamp: Date.now(),\n reason: exitCheck.reason || \"Risk limit exit\",\n };\n await this.executeTrade(order);\n }\n }\n }\n }\n\n const portfolioSnapshot: PortfolioSnapshot = {\n timestamp: Date.now(),\n holdings: this.getHoldingsSnapshot(),\n totalValue: await this.calculatePortfolioValue(),\n };\n\n const agentState: AgentState = {\n portfolioValue: portfolioSnapshot.totalValue,\n volatility: 0.02,\n confidenceLevel: 0.7,\n recentTrades: this.analytics.getMetrics().totalTrades,\n };\n\n const decision = await this.activeStrategy.decide({\n marketData,\n agentState,\n portfolioSnapshot,\n agentRuntime: this.runtime,\n });\n\n if (decision) {\n await this.executeTrade(decision);\n } else {\n // Log HOLD decision\n this.trajectoryService?.completeTradingStep({\n order: null,\n success: true,\n });\n }\n }\n\n private createAutoModeMarketData(): StrategyContextMarketData {\n // For auto mode, provide minimal market data - the strategy will fetch its own\n return {\n currentPrice: 0,\n lastPrices: [],\n priceData: [],\n };\n }\n\n public async executeTrade(order: TradeOrder): Promise<string> {\n if (!this.isTrading) throw new Error(\"Not currently trading\");\n\n const [token] = order.pair.split(\"/\");\n const isLive =\n this.runtime.getSetting(\"TRADING_MODE\") === \"live\" && this.swapService?.isReady();\n const slippageBps = Number(this.runtime.getSetting(\"SLIPPAGE_BPS\")) || 100;\n let txId: string;\n let signature: string | undefined;\n\n if (isLive) {\n // Validate token for buys\n if (order.action === TradeType.BUY && this.validationService) {\n const validation = await this.validationService.validateToken(token);\n if (!validation.isValid) {\n throw new Error(`Validation failed: ${validation.rejectionReasons.join(\", \")}`);\n }\n }\n\n const result =\n order.action === TradeType.BUY\n ? await this.swapService?.buy(\n token,\n ((order.price || 0) * order.quantity) / (await this.getSolPrice()),\n slippageBps,\n )\n : await this.swapService?.sell(token, order.quantity, slippageBps);\n\n if (!result) throw new Error(\"Swap service not available\");\n if (!result.success) throw new Error(`Swap failed: ${result.error}`);\n txId = result.signature ?? `unknown_${Date.now()}`;\n signature = result.signature;\n logger.info(\n `[AutoTradingManager] ${order.action}: ${result.inputAmount} ā ${result.outputAmount} (${result.explorerUrl})`,\n );\n } else {\n txId = `paper_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n logger.info(`[AutoTradingManager] Paper ${order.action}: ${order.quantity} ${token}`);\n }\n\n this.transactionHistory.push({\n id: txId,\n timestamp: Date.now(),\n action: order.action,\n token,\n quantity: order.quantity,\n price: order.price || 100,\n reason: order.reason,\n signature,\n });\n\n // Calculate P&L change for this trade\n const pnlBefore = this.analytics.getMetrics().totalPnL;\n this.updatePosition(token, order, txId);\n const pnlAfter = this.analytics.getMetrics().totalPnL;\n\n // Log trajectory step completion\n this.trajectoryService?.completeTradingStep({\n order,\n success: true,\n txId,\n pnlChange: pnlAfter - pnlBefore,\n });\n\n return txId;\n }\n\n private updatePosition(token: string, order: TradeOrder, txId: string): void {\n const price = order.price || 100;\n\n if (order.action === TradeType.BUY) {\n const existing = this.positions.get(token);\n if (existing) {\n const newQty = existing.amount + order.quantity;\n existing.entryPrice =\n (existing.entryPrice * existing.amount + price * order.quantity) / newQty;\n existing.amount = newQty;\n } else {\n this.positions.set(token, {\n id: uuidv4() as `${string}-${string}-${string}-${string}-${string}`,\n tokenAddress: token,\n amount: order.quantity,\n entryPrice: price,\n currentPrice: price,\n });\n }\n } else {\n const position = this.positions.get(token);\n if (position) {\n const realizedPnL = order.quantity * (price - position.entryPrice);\n this.analytics.trackTrade({\n type: order.action,\n price,\n quantity: order.quantity,\n realizedPnL,\n txId,\n });\n position.amount -= order.quantity;\n if (position.amount <= 0) this.positions.delete(token);\n }\n }\n }\n\n private async getSolPrice(): Promise<number> {\n const resp = await fetch(\n \"https://api.coingecko.com/api/v3/simple/price?ids=solana&vs_currencies=usd\",\n );\n if (resp.ok) {\n const data = (await resp.json()) as { solana: { usd: number } };\n return data.solana.usd;\n }\n return 150;\n }\n\n public getStatus(): TradingStatus {\n return {\n isTrading: this.isTrading,\n strategy: this.activeStrategy?.name,\n positions: Array.from(this.positions.values()),\n performance: this.getPerformance(),\n };\n }\n\n public getPerformance() {\n return this.analytics.getMetrics();\n }\n\n public getStrategies(): TradingStrategy[] {\n return Array.from(this.strategies.values());\n }\n\n public getTransactionHistory(): TransactionRecord[] {\n return [...this.transactionHistory];\n }\n\n public getLatestTransactions(limit = 10): TransactionRecord[] {\n return this.transactionHistory.slice(-limit);\n }\n\n private async getMarketData(_token: string): Promise<StrategyContextMarketData | null> {\n const basePrice = 100 + Math.random() * 10;\n const priceData: OHLCV[] = Array.from({ length: 100 }, (_, i) => ({\n timestamp: Date.now() - (100 - i) * 60000,\n open: basePrice + Math.random() * 2 - 1,\n high: basePrice + Math.random() * 3,\n low: basePrice - Math.random() * 3,\n close: basePrice + Math.random() * 2 - 1,\n volume: 1000 + Math.random() * 1000,\n }));\n\n return {\n currentPrice: basePrice,\n lastPrices: priceData.slice(-10).map((d) => d.close),\n priceData,\n };\n }\n\n private getHoldingsSnapshot(): Record<string, number> {\n const holdings: Record<string, number> = { USDC: 10000 };\n for (const [token, pos] of this.positions) holdings[token] = pos.amount;\n return holdings;\n }\n\n private async calculatePortfolioValue(): Promise<number> {\n let total = 10000;\n for (const pos of this.positions.values()) {\n total += pos.amount * (pos.currentPrice || pos.entryPrice);\n }\n return total;\n }\n\n /**\n * Get current environment state for trajectory logging\n */\n private async getEnvironmentState(): Promise<TradingEnvironmentState> {\n const metrics = this.analytics.getMetrics();\n let solBalance = 10;\n\n if (this.swapService?.isReady()) {\n const balances = await this.swapService.getWalletBalances();\n solBalance = balances.solBalance;\n }\n\n return {\n solBalance,\n portfolioValue: await this.calculatePortfolioValue(),\n totalPnL: metrics.totalPnL,\n dailyPnL: metrics.dailyPnL,\n openPositions: Array.from(this.positions.values()),\n winRate: metrics.winRate,\n totalTrades: metrics.totalTrades,\n };\n }\n}\n","import { type IAgentRuntime, logger, ModelType, parseJSONObjectFromText } from \"@elizaos/core\";\nimport type { TokenValidationService } from \"../services/TokenValidationService.ts\";\nimport type {\n AgentState,\n PortfolioSnapshot,\n StrategyContextMarketData,\n TradeOrder,\n TradingStrategy,\n} from \"../types.ts\";\nimport { OrderType, TradeType } from \"../types.ts\";\n\n/**\n * Token data from Birdeye trending API\n */\ninterface TrendingToken {\n address: string;\n symbol: string;\n name: string;\n price: number;\n priceChange24h: number;\n volume24h: number;\n liquidity: number;\n marketCap: number;\n logoURI?: string;\n}\n\n/**\n * LLM trading decision response\n */\ninterface LLMTradingDecision {\n marketAssessment: string;\n pickedNothing: boolean;\n recommendBuyIndex: number | null;\n reason: string;\n opportunityScore: number;\n riskScore: number;\n buyAmountPercent: number;\n tokenStrengths: string;\n tokenWeaknesses: string;\n exitConditions: string;\n exitLiquidityThreshold: number;\n exitVolumeThreshold: number;\n currentPrice: number;\n stopLossPrice: number;\n takeProfitPrice: number;\n stopLossReasoning: string;\n takeProfitReasoning: string;\n}\n\n/**\n * Configuration for LLM Strategy\n */\nexport interface LLMStrategyConfig {\n maxBuyAmountPercent: number;\n minOpportunityScore: number;\n maxRiskScore: number;\n minLiquidity: number;\n minVolume24h: number;\n trendingTokensCount: number;\n birdeyeApiKey?: string;\n}\n\nconst DEFAULT_CONFIG: LLMStrategyConfig = {\n maxBuyAmountPercent: 15,\n minOpportunityScore: 60,\n maxRiskScore: 70,\n minLiquidity: 50000,\n minVolume24h: 100000,\n trendingTokensCount: 25,\n};\n\n/**\n * LLM-based trading prompt template\n */\nconst TRADING_DECISION_PROMPT = `You are an expert cryptocurrency trader analyzing trending Solana tokens for trading opportunities.\n\nTASK: Analyze the trending tokens below and decide whether to buy any of them.\n\nRULES:\n1. Only recommend a buy if you see a genuine opportunity with good risk/reward\n2. Buy amount should be between 1-15% of available balance\n3. Stop loss must be BELOW current price\n4. Take profit must be ABOVE current price\n5. Consider liquidity and volume - avoid illiquid tokens\n6. It's perfectly acceptable to pick nothing if no good opportunities exist\n\nPREVIOUS PICKS:\n{{previousPicks}}\n\nTRENDING TOKENS (Solana):\n{{trendingTokens}}\n\nCURRENT PORTFOLIO VALUE: $PORTFOLIO_VALUE_PLACEHOLDER\n\nRespond ONLY with a JSON object in this exact format:\n{\n \"marketAssessment\": \"Brief overall market assessment without mentioning specific tokens\",\n \"pickedNothing\": true/false,\n \"recommendBuyIndex\": number or null (1-based index from the trending list),\n \"reason\": \"Detailed reasoning for your decision\",\n \"opportunityScore\": number 0-100,\n \"riskScore\": number 0-100,\n \"buyAmountPercent\": number 1-15,\n \"tokenStrengths\": \"Why this token is strong (if buying)\",\n \"tokenWeaknesses\": \"What's weak about this token (if buying)\",\n \"exitConditions\": \"Conditions that would trigger an exit\",\n \"exitLiquidityThreshold\": number (minimum liquidity in USD),\n \"exitVolumeThreshold\": number (minimum 24h volume in USD),\n \"currentPrice\": number (current token price in USD),\n \"stopLossPrice\": number (absolute price for stop loss, must be < currentPrice),\n \"takeProfitPrice\": number (absolute price for take profit, must be > currentPrice),\n \"stopLossReasoning\": \"Why this stop loss level\",\n \"takeProfitReasoning\": \"Why this take profit level\"\n}`;\n\n/**\n * LLMStrategy - AI-powered trading strategy using language models\n *\n * This strategy:\n * 1. Fetches trending tokens from Birdeye\n * 2. Uses an LLM to analyze opportunities\n * 3. Validates tokens via RugCheck\n * 4. Generates buy signals with proper exit conditions\n */\nexport class LLMStrategy implements TradingStrategy {\n public readonly id = \"llm\";\n public readonly name = \"LLM Trading Strategy\";\n public readonly description =\n \"AI-powered trading using language models to analyze trending tokens\";\n\n private runtime: IAgentRuntime | null = null;\n private config: LLMStrategyConfig;\n private previousPicks: Array<{\n timestamp: number;\n token: string;\n reason: string;\n }> = [];\n private trendingTokensCache: TrendingToken[] = [];\n private lastTrendingFetch = 0;\n private readonly TRENDING_CACHE_TTL = 60000; // 1 minute\n\n constructor(config: Partial<LLMStrategyConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n public async initialize(runtime?: IAgentRuntime): Promise<void> {\n if (runtime) {\n this.runtime = runtime;\n\n const birdeyeKey = runtime.getSetting(\"BIRDEYE_API_KEY\");\n if (birdeyeKey && typeof birdeyeKey === \"string\") {\n this.config.birdeyeApiKey = birdeyeKey;\n }\n\n const maxBuy = runtime.getSetting(\"MAX_PORTFOLIO_ALLOCATION\");\n if (maxBuy) {\n this.config.maxBuyAmountPercent = Number(maxBuy) * 100;\n }\n\n const minLiquidity = runtime.getSetting(\"MIN_LIQUIDITY_USD\");\n if (minLiquidity) {\n this.config.minLiquidity = Number(minLiquidity);\n }\n\n logger.info(\n `[${this.name}] Initialized: maxBuy=${this.config.maxBuyAmountPercent}% minOpportunity=${this.config.minOpportunityScore} maxRisk=${this.config.maxRiskScore}`,\n );\n }\n }\n\n public isReady(): boolean {\n return this.runtime !== null && !!this.config.birdeyeApiKey;\n }\n\n public configure(params: Partial<LLMStrategyConfig>): void {\n this.config = { ...this.config, ...params };\n }\n\n /**\n * Main decision function called by the trading loop\n */\n public async decide(params: {\n marketData: StrategyContextMarketData;\n agentState: AgentState;\n portfolioSnapshot: PortfolioSnapshot;\n agentRuntime?: IAgentRuntime;\n }): Promise<TradeOrder | null> {\n const runtime = params.agentRuntime || this.runtime;\n if (!runtime) {\n logger.warn(`[${this.name}] Runtime not available`);\n return null;\n }\n\n // Fetch trending tokens (pre-filtered by basic criteria)\n const trendingTokens = await this.fetchTrendingTokens(runtime);\n if (trendingTokens.length === 0) {\n logger.info(`[${this.name}] No trending tokens available`);\n return null;\n }\n\n // Pre-validate tokens to filter out obvious scams/honeypots BEFORE LLM analysis\n const validationService = runtime.getService(\"TokenValidationService\") as\n | TokenValidationService\n | undefined;\n let validTokens = trendingTokens;\n\n if (validationService) {\n const validationResults = await Promise.all(\n trendingTokens.map(async (token) => ({\n token,\n validation: await validationService.validateToken(token.address),\n })),\n );\n\n validTokens = validationResults.filter((r) => r.validation.isValid).map((r) => r.token);\n\n const rejected = validationResults.filter((r) => !r.validation.isValid);\n if (rejected.length > 0) {\n logger.info(\n `[${this.name}] Pre-filtered ${rejected.length} tokens (honeypot/scam indicators)`,\n );\n rejected.slice(0, 3).forEach((r) => {\n logger.debug(\n `[${this.name}] Rejected ${r.token.symbol}: ${r.validation.rejectionReasons.join(\", \")}`,\n );\n });\n }\n }\n\n if (validTokens.length === 0) {\n logger.info(`[${this.name}] All trending tokens failed safety validation`);\n return null;\n }\n\n // Get LLM decision from pre-validated tokens only\n const decision = await this.getLLMDecision(\n runtime,\n validTokens,\n params.portfolioSnapshot.totalValue,\n );\n\n if (!decision || decision.pickedNothing || decision.recommendBuyIndex === null) {\n logger.info(`[${this.name}] LLM decided not to trade:`, decision?.marketAssessment);\n return null;\n }\n\n // Validate the decision\n const tokenIndex = decision.recommendBuyIndex - 1;\n if (tokenIndex < 0 || tokenIndex >= validTokens.length) {\n logger.warn(`[${this.name}] Invalid token index from LLM: ${decision.recommendBuyIndex}`);\n return null;\n }\n\n const selectedToken = validTokens[tokenIndex];\n\n // Validate opportunity and risk scores\n if (decision.opportunityScore < this.config.minOpportunityScore) {\n logger.info(`[${this.name}] Opportunity score too low: ${decision.opportunityScore}`);\n return null;\n }\n\n if (decision.riskScore > this.config.maxRiskScore) {\n logger.info(`[${this.name}] Risk score too high: ${decision.riskScore}`);\n return null;\n }\n\n // Validate exit prices\n if (decision.stopLossPrice >= selectedToken.price) {\n logger.warn(`[${this.name}] Invalid stop loss price - must be below current price`);\n return null;\n }\n\n if (decision.takeProfitPrice <= selectedToken.price) {\n logger.warn(`[${this.name}] Invalid take profit price - must be above current price`);\n return null;\n }\n\n // Calculate trade amount\n const buyPercent = Math.min(decision.buyAmountPercent, this.config.maxBuyAmountPercent);\n const tradeValueUsd = params.portfolioSnapshot.totalValue * (buyPercent / 100);\n const tradeQuantity = tradeValueUsd / selectedToken.price;\n\n // Record this pick\n this.previousPicks.push({\n timestamp: Date.now(),\n token: selectedToken.symbol,\n reason: decision.reason,\n });\n\n // Keep only last 10 picks\n if (this.previousPicks.length > 10) {\n this.previousPicks = this.previousPicks.slice(-10);\n }\n\n logger.info(\n `[${this.name}] Generating buy signal: ${selectedToken.symbol} price=$${selectedToken.price.toFixed(6)} buyPercent=${buyPercent}% opportunity=${decision.opportunityScore} risk=${decision.riskScore}`,\n );\n\n return {\n pair: `${selectedToken.address}/SOL`,\n action: TradeType.BUY,\n quantity: tradeQuantity,\n orderType: OrderType.MARKET,\n price: selectedToken.price,\n timestamp: Date.now(),\n reason: `LLM Strategy: ${decision.reason} | Stop: $${decision.stopLossPrice.toFixed(6)} | Target: $${decision.takeProfitPrice.toFixed(6)}`,\n };\n }\n\n /**\n * Fetch trending tokens from Birdeye API\n */\n private async fetchTrendingTokens(runtime: IAgentRuntime): Promise<TrendingToken[]> {\n // Check cache\n if (\n Date.now() - this.lastTrendingFetch < this.TRENDING_CACHE_TTL &&\n this.trendingTokensCache.length > 0\n ) {\n return this.trendingTokensCache;\n }\n\n const settingKey = runtime.getSetting(\"BIRDEYE_API_KEY\");\n const apiKey = this.config.birdeyeApiKey || (typeof settingKey === \"string\" ? settingKey : null);\n if (!apiKey) {\n logger.error(`[${this.name}] Birdeye API key not configured`);\n return [];\n }\n\n const response = await fetch(\n `https://public-api.birdeye.so/defi/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=${this.config.trendingTokensCount}`,\n {\n headers: {\n \"X-API-KEY\": apiKey,\n \"x-chain\": \"solana\",\n },\n },\n );\n\n if (!response.ok) {\n logger.error(`[${this.name}] Birdeye API error: ${response.status}`);\n return [];\n }\n\n const data = (await response.json()) as {\n success: boolean;\n data: {\n tokens: Array<{\n address: string;\n symbol: string;\n name: string;\n price: number;\n priceChange24hPercent: number;\n v24hUSD: number;\n liquidity: number;\n mc: number;\n logoURI?: string;\n }>;\n };\n };\n\n if (!data.success || !data.data?.tokens) {\n logger.warn(`[${this.name}] Invalid Birdeye response`);\n return [];\n }\n\n // Filter tokens by liquidity and volume\n const filteredTokens = data.data.tokens\n .filter(\n (t) => t.liquidity >= this.config.minLiquidity && t.v24hUSD >= this.config.minVolume24h,\n )\n .map((t) => ({\n address: t.address,\n symbol: t.symbol,\n name: t.name,\n price: t.price,\n priceChange24h: t.priceChange24hPercent,\n volume24h: t.v24hUSD,\n liquidity: t.liquidity,\n marketCap: t.mc,\n logoURI: t.logoURI,\n }));\n\n this.trendingTokensCache = filteredTokens;\n this.lastTrendingFetch = Date.now();\n\n logger.info(`[${this.name}] Fetched ${filteredTokens.length} trending tokens`);\n return filteredTokens;\n }\n\n /**\n * Get trading decision from LLM\n */\n private async getLLMDecision(\n runtime: IAgentRuntime,\n trendingTokens: TrendingToken[],\n portfolioValue: number,\n ): Promise<LLMTradingDecision | null> {\n // Format trending tokens for prompt\n const tokensText = trendingTokens\n .map(\n (t, i) =>\n `${i + 1}. ${t.symbol}: $${t.price.toFixed(6)} | 24h: ${t.priceChange24h.toFixed(2)}% | Vol: $${(t.volume24h / 1e6).toFixed(2)}M | Liq: $${(t.liquidity / 1e6).toFixed(2)}M | MCap: $${(t.marketCap / 1e6).toFixed(2)}M`,\n )\n .join(\"\\n\");\n\n // Format previous picks\n const previousPicksText =\n this.previousPicks.length > 0\n ? this.previousPicks\n .map((p) => `${new Date(p.timestamp).toISOString()}: ${p.token} - ${p.reason}`)\n .join(\"\\n\")\n : \"No previous picks in this session.\";\n\n const systemPrompt =\n \"You are an expert cryptocurrency trading analyst. Respond only with valid JSON.\";\n const userPrompt = TRADING_DECISION_PROMPT.replace(\"{{trendingTokens}}\", tokensText)\n .replace(\"{{previousPicks}}\", previousPicksText)\n .replace(\"PORTFOLIO_VALUE_PLACEHOLDER\", portfolioValue.toFixed(2));\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: `${systemPrompt}\\n\\n${userPrompt}`,\n });\n\n if (!response) {\n logger.warn(`[${this.name}] No response from LLM`);\n return null;\n }\n\n const parsed = parseJSONObjectFromText(response) as Record<string, unknown> | null;\n if (!parsed) {\n logger.warn(`[${this.name}] Failed to parse LLM response`);\n return null;\n }\n\n // Validate and normalize the response\n const decision: LLMTradingDecision = {\n marketAssessment: String(parsed.marketAssessment || \"\"),\n pickedNothing: Boolean(parsed.pickedNothing),\n recommendBuyIndex:\n parsed.recommendBuyIndex !== null ? Number(parsed.recommendBuyIndex) : null,\n reason: String(parsed.reason || \"\"),\n opportunityScore: Number(parsed.opportunityScore || 0),\n riskScore: Number(parsed.riskScore || 100),\n buyAmountPercent: Math.min(\n Number(parsed.buyAmountPercent || 0),\n this.config.maxBuyAmountPercent,\n ),\n tokenStrengths: String(parsed.tokenStrengths || \"\"),\n tokenWeaknesses: String(parsed.tokenWeaknesses || \"\"),\n exitConditions: String(parsed.exitConditions || \"\"),\n exitLiquidityThreshold: Number(parsed.exitLiquidityThreshold || this.config.minLiquidity),\n exitVolumeThreshold: Number(parsed.exitVolumeThreshold || this.config.minVolume24h),\n currentPrice: Number(parsed.currentPrice || 0),\n stopLossPrice: Number(parsed.stopLossPrice || 0),\n takeProfitPrice: Number(parsed.takeProfitPrice || 0),\n stopLossReasoning: String(parsed.stopLossReasoning || \"\"),\n takeProfitReasoning: String(parsed.takeProfitReasoning || \"\"),\n };\n\n logger.debug(\n `[${this.name}] LLM decision: pickedNothing=${decision.pickedNothing} buyIndex=${decision.recommendBuyIndex} opportunity=${decision.opportunityScore} risk=${decision.riskScore}`,\n );\n\n return decision;\n }\n\n /**\n * Get recent picks for display\n */\n public getPreviousPicks(): Array<{\n timestamp: number;\n token: string;\n reason: string;\n }> {\n return [...this.previousPicks];\n }\n\n /**\n * Clear the picks history\n */\n public clearPicks(): void {\n this.previousPicks = [];\n }\n}\n","/**\n * Token Resolver Service\n *\n * Dynamically resolves token symbols to addresses using Birdeye API.\n * Supports any Solana token, not just hardcoded ones.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\n\nexport interface TokenInfo {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n price?: number;\n volume24h?: number;\n liquidity?: number;\n logoURI?: string;\n}\n\n/** Well-known tokens that don't need API lookup */\nconst WELL_KNOWN_TOKENS: Record<string, TokenInfo> = {\n SOL: {\n address: \"So11111111111111111111111111111111111111112\",\n symbol: \"SOL\",\n name: \"Solana\",\n decimals: 9,\n },\n USDC: {\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n },\n USDT: {\n address: \"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n};\n\n/** Solana address regex - base58, 32-44 chars */\nconst SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\nexport class TokenResolverService extends Service {\n public static readonly serviceType = \"TokenResolverService\";\n public readonly capabilityDescription = \"Resolves token symbols to addresses dynamically\";\n\n private cache = new Map<string, TokenInfo>();\n private cacheExpiry = new Map<string, number>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n // Pre-populate cache with well-known tokens\n for (const [symbol, info] of Object.entries(WELL_KNOWN_TOKENS)) {\n this.cache.set(symbol.toUpperCase(), info);\n this.cache.set(info.address, info);\n }\n }\n\n public static async start(runtime: IAgentRuntime): Promise<TokenResolverService> {\n const instance = new TokenResolverService(runtime);\n logger.info(\"[TokenResolverService] Started\");\n return instance;\n }\n\n public async stop(): Promise<void> {\n this.cache.clear();\n this.cacheExpiry.clear();\n }\n\n /**\n * Check if a string is a valid Solana address\n */\n public isValidAddress(input: string): boolean {\n return SOLANA_ADDRESS_REGEX.test(input);\n }\n\n /**\n * Resolve a token symbol or address to full token info\n * Supports: symbol (e.g., \"BONK\"), address, or partial name\n */\n public async resolve(input: string): Promise<TokenInfo | null> {\n const normalized = input.trim().toUpperCase();\n\n // Check if it's already an address\n if (this.isValidAddress(input)) {\n return this.resolveByAddress(input);\n }\n\n // Check cache first\n const cached = this.cache.get(normalized);\n if (cached && this.isCacheValid(normalized)) {\n return cached;\n }\n\n // Search via Birdeye API\n return this.searchToken(input);\n }\n\n /**\n * Resolve multiple tokens at once\n */\n public async resolveMany(inputs: string[]): Promise<Map<string, TokenInfo | null>> {\n const results = new Map<string, TokenInfo | null>();\n\n await Promise.all(\n inputs.map(async (input) => {\n results.set(input, await this.resolve(input));\n }),\n );\n\n return results;\n }\n\n /**\n * Get token info by address\n */\n public async resolveByAddress(address: string): Promise<TokenInfo | null> {\n // Check cache\n const cached = this.cache.get(address);\n if (cached && this.isCacheValid(address)) {\n return cached;\n }\n\n const apiKey = this.runtime.getSetting(\"BIRDEYE_API_KEY\");\n if (!apiKey) {\n logger.warn(\"[TokenResolverService] No Birdeye API key configured\");\n return null;\n }\n\n const response = await fetch(\n `https://public-api.birdeye.so/defi/token_overview?address=${address}`,\n {\n headers: {\n \"X-API-KEY\": String(apiKey),\n \"x-chain\": \"solana\",\n },\n },\n );\n\n if (!response.ok) {\n logger.warn(\n `[TokenResolverService] Failed to resolve address ${address}: ${response.status}`,\n );\n return null;\n }\n\n const data = (await response.json()) as {\n success: boolean;\n data: {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n price: number;\n v24hUSD: number;\n liquidity: number;\n logoURI?: string;\n };\n };\n\n if (!data.success || !data.data) {\n return null;\n }\n\n const tokenInfo: TokenInfo = {\n address: data.data.address,\n symbol: data.data.symbol,\n name: data.data.name,\n decimals: data.data.decimals,\n price: data.data.price,\n volume24h: data.data.v24hUSD,\n liquidity: data.data.liquidity,\n logoURI: data.data.logoURI,\n };\n\n this.setCache(address, tokenInfo);\n this.setCache(tokenInfo.symbol.toUpperCase(), tokenInfo);\n\n return tokenInfo;\n }\n\n /**\n * Search for a token by symbol or name\n */\n public async searchToken(query: string): Promise<TokenInfo | null> {\n const apiKey = this.runtime.getSetting(\"BIRDEYE_API_KEY\");\n if (!apiKey) {\n logger.warn(\"[TokenResolverService] No Birdeye API key configured\");\n return null;\n }\n\n const response = await fetch(\n `https://public-api.birdeye.so/defi/v3/search?chain=solana&keyword=${encodeURIComponent(query)}&target=token&sort_by=volume_24h_usd&sort_type=desc&limit=5`,\n {\n headers: {\n \"X-API-KEY\": String(apiKey),\n \"x-chain\": \"solana\",\n },\n },\n );\n\n if (!response.ok) {\n logger.warn(`[TokenResolverService] Search failed for \"${query}\": ${response.status}`);\n return null;\n }\n\n const data = (await response.json()) as {\n success: boolean;\n data: {\n items: Array<{\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n price: number;\n volume_24h_usd: number;\n liquidity: number;\n logo_uri?: string;\n }>;\n };\n };\n\n if (!data.success || !data.data?.items?.length) {\n logger.info(`[TokenResolverService] No results for \"${query}\"`);\n return null;\n }\n\n // Find best match - exact symbol match preferred\n const exactMatch = data.data.items.find((t) => t.symbol.toUpperCase() === query.toUpperCase());\n const token = exactMatch || data.data.items[0];\n\n const tokenInfo: TokenInfo = {\n address: token.address,\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n price: token.price,\n volume24h: token.volume_24h_usd,\n liquidity: token.liquidity,\n logoURI: token.logo_uri,\n };\n\n this.setCache(tokenInfo.address, tokenInfo);\n this.setCache(tokenInfo.symbol.toUpperCase(), tokenInfo);\n\n logger.info(\n `[TokenResolverService] Resolved \"${query}\" ā ${tokenInfo.symbol} (${tokenInfo.address.slice(0, 8)}...)`,\n );\n return tokenInfo;\n }\n\n /**\n * Get trending tokens from Birdeye\n */\n public async getTrendingTokens(limit = 20): Promise<TokenInfo[]> {\n const apiKey = this.runtime.getSetting(\"BIRDEYE_API_KEY\");\n if (!apiKey) {\n return [];\n }\n\n const response = await fetch(\n `https://public-api.birdeye.so/defi/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=${limit}`,\n {\n headers: {\n \"X-API-KEY\": String(apiKey),\n \"x-chain\": \"solana\",\n },\n },\n );\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as {\n success: boolean;\n data: {\n tokens: Array<{\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n price: number;\n v24hUSD: number;\n liquidity: number;\n logoURI?: string;\n }>;\n };\n };\n\n if (!data.success || !data.data?.tokens) {\n return [];\n }\n\n return data.data.tokens.map((t) => ({\n address: t.address,\n symbol: t.symbol,\n name: t.name,\n decimals: t.decimals,\n price: t.price,\n volume24h: t.v24hUSD,\n liquidity: t.liquidity,\n logoURI: t.logoURI,\n }));\n }\n\n private setCache(key: string, info: TokenInfo): void {\n this.cache.set(key, info);\n this.cacheExpiry.set(key, Date.now() + this.CACHE_TTL);\n }\n\n private isCacheValid(key: string): boolean {\n const expiry = this.cacheExpiry.get(key);\n return expiry ? Date.now() < expiry : false;\n }\n}\n","import { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\n\n/**\n * RugCheck risk levels\n */\nexport type RiskLevel = \"safe\" | \"warning\" | \"danger\" | \"unknown\";\n\n/**\n * RugCheck report for a token\n */\nexport interface RugCheckReport {\n tokenAddress: string;\n riskLevel: RiskLevel;\n score: number;\n risks: TokenRisk[];\n tokenInfo: {\n name: string;\n symbol: string;\n decimals: number;\n supply: string;\n mintAuthority: string | null;\n freezeAuthority: string | null;\n };\n holders: {\n totalHolders: number;\n topHoldersPercent: number;\n top10Holders: Array<{\n address: string;\n percent: number;\n isInsider: boolean;\n }>;\n };\n liquidity: {\n totalLiquidityUsd: number;\n pools: Array<{\n dex: string;\n liquidityUsd: number;\n lpLocked: boolean;\n lpLockPercent: number;\n }>;\n };\n validatedAt: number;\n cacheExpiry: number;\n}\n\n/**\n * Individual risk factor\n */\nexport interface TokenRisk {\n name: string;\n description: string;\n level: RiskLevel;\n score: number;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n isValid: boolean;\n report: RugCheckReport | null;\n rejectionReasons: string[];\n warnings: string[];\n}\n\n/**\n * Minimum requirements for trading\n */\nexport interface TradingRequirements {\n minLiquidityUsd: number;\n minVolume24hUsd: number;\n maxTopHoldersPercent: number;\n maxRugPullScore: number;\n requireLpLock: boolean;\n // Honeypot detection\n minSellCount24h: number; // Minimum sell transactions in 24h\n maxBuySellRatio: number; // Max buy/sell ratio (high = honeypot)\n minTokenAgeSeconds: number; // Minimum token age in seconds\n minUniqueTraders24h: number; // Minimum unique traders\n}\n\nconst DEFAULT_REQUIREMENTS: TradingRequirements = {\n minLiquidityUsd: 50000,\n minVolume24hUsd: 100000,\n maxTopHoldersPercent: 80,\n maxRugPullScore: 30,\n requireLpLock: false,\n // Honeypot detection defaults\n minSellCount24h: 50, // At least 50 sells in 24h\n maxBuySellRatio: 5, // If 5x more buys than sells, suspicious\n minTokenAgeSeconds: 24 * 60 * 60, // At least 24 hours old\n minUniqueTraders24h: 100, // At least 100 unique traders\n};\n\n/**\n * Cache duration for RugCheck reports (6 hours)\n */\nconst CACHE_DURATION_MS = 6 * 60 * 60 * 1000;\n\n/**\n * Trading activity data for honeypot detection\n */\nexport interface TradingActivity {\n volume24h: number;\n buyCount24h: number;\n sellCount24h: number;\n buyVolume24h: number;\n sellVolume24h: number;\n uniqueTraders24h: number;\n createdAt: number | null;\n lastTradeAt: number | null;\n}\n\n/**\n * TokenValidationService - Validates tokens before trading using RugCheck API\n *\n * This service provides:\n * - RugCheck API integration for token safety analysis\n * - Caching of validation results\n * - Configurable trading requirements\n * - Risk scoring and recommendations\n */\nexport class TokenValidationService extends Service {\n public static readonly serviceType = \"TokenValidationService\";\n public readonly capabilityDescription = \"Validates token safety using RugCheck before trading\";\n\n private readonly RUGCHECK_API = \"https://api.rugcheck.xyz/v1/tokens\";\n private readonly BIRDEYE_API = \"https://public-api.birdeye.so/defi\";\n private cache = new Map<string, RugCheckReport>();\n private activityCache = new Map<string, { data: TradingActivity; expiry: number }>();\n private requirements: TradingRequirements;\n private enabled: boolean;\n private birdeyeApiKey: string | null = null;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n this.requirements = DEFAULT_REQUIREMENTS;\n this.enabled = true;\n }\n\n public static async start(runtime: IAgentRuntime): Promise<TokenValidationService> {\n logger.info(`[${TokenValidationService.serviceType}] Starting...`);\n const instance = new TokenValidationService(runtime);\n await instance.initialize();\n return instance;\n }\n\n private async initialize(): Promise<void> {\n const enabledSetting = this.runtime.getSetting(\"RUGCHECK_ENABLED\");\n this.enabled = enabledSetting !== \"false\";\n\n const birdeyeKeySetting = this.runtime.getSetting(\"BIRDEYE_API_KEY\");\n this.birdeyeApiKey = typeof birdeyeKeySetting === \"string\" ? birdeyeKeySetting : null;\n\n const minLiquidity = this.runtime.getSetting(\"MIN_LIQUIDITY_USD\");\n if (minLiquidity) {\n this.requirements.minLiquidityUsd = Number(minLiquidity);\n }\n\n const minVolume = this.runtime.getSetting(\"MIN_VOLUME_24H_USD\");\n if (minVolume) {\n this.requirements.minVolume24hUsd = Number(minVolume);\n }\n\n const minSells = this.runtime.getSetting(\"MIN_SELL_COUNT_24H\");\n if (minSells) {\n this.requirements.minSellCount24h = Number(minSells);\n }\n\n const maxBuySellRatio = this.runtime.getSetting(\"MAX_BUY_SELL_RATIO\");\n if (maxBuySellRatio) {\n this.requirements.maxBuySellRatio = Number(maxBuySellRatio);\n }\n\n logger.info(\n `[${TokenValidationService.serviceType}] Initialized: enabled=${this.enabled} hasBirdeyeKey=${!!this.birdeyeApiKey}`,\n );\n }\n\n public async stop(): Promise<void> {\n this.cache.clear();\n logger.info(`[${TokenValidationService.serviceType}] Stopped`);\n }\n\n /**\n * Set custom trading requirements\n */\n public setRequirements(requirements: Partial<TradingRequirements>): void {\n this.requirements = { ...this.requirements, ...requirements };\n logger.info(\n `[${TokenValidationService.serviceType}] Requirements updated: minLiquidity=$${this.requirements.minLiquidityUsd}`,\n );\n }\n\n /**\n * Get RugCheck report for a token (with caching)\n */\n public async getRugCheckReport(tokenAddress: string): Promise<RugCheckReport | null> {\n // Check cache first\n const cached = this.cache.get(tokenAddress);\n if (cached && cached.cacheExpiry > Date.now()) {\n logger.debug(\n `[${TokenValidationService.serviceType}] Using cached report for ${tokenAddress}`,\n );\n return cached;\n }\n\n const report = await this.fetchRugCheckReport(tokenAddress);\n if (report) {\n this.cache.set(tokenAddress, report);\n }\n\n return report;\n }\n\n /**\n * Fetch fresh report from RugCheck API\n */\n private async fetchRugCheckReport(tokenAddress: string): Promise<RugCheckReport | null> {\n logger.info(\n `[${TokenValidationService.serviceType}] Fetching RugCheck report for ${tokenAddress}`,\n );\n\n const response = await fetch(`${this.RUGCHECK_API}/${tokenAddress}/report`);\n\n if (!response.ok) {\n if (response.status === 404) {\n logger.warn(\n `[${TokenValidationService.serviceType}] Token not found in RugCheck: ${tokenAddress}`,\n );\n return this.createUnknownReport(tokenAddress);\n }\n logger.error(\n `[${TokenValidationService.serviceType}] RugCheck API error: status=${response.status} token=${tokenAddress}`,\n );\n return null;\n }\n\n const data = (await response.json()) as {\n mint: string;\n risks: Array<{\n name: string;\n description: string;\n level: string;\n score: number;\n }>;\n score: number;\n tokenMeta: {\n name: string;\n symbol: string;\n decimals: number;\n supply: string;\n mintAuthority: string | null;\n freezeAuthority: string | null;\n };\n topHolders: Array<{ address: string; pct: number; insider: boolean }>;\n totalHolders: number;\n markets: Array<{\n marketType: string;\n lp: { lpLocked: boolean; lpLockedPct: number };\n liquidityA: string;\n liquidityB: string;\n }>;\n };\n\n const topHoldersPercent = data.topHolders.slice(0, 10).reduce((sum, h) => sum + h.pct, 0);\n\n const totalLiquidityUsd = data.markets.reduce((sum, m) => {\n const liqA = Number.parseFloat(m.liquidityA || \"0\");\n const liqB = Number.parseFloat(m.liquidityB || \"0\");\n return sum + liqA + liqB;\n }, 0);\n\n const report: RugCheckReport = {\n tokenAddress,\n riskLevel: this.scoreToRiskLevel(data.score),\n score: data.score,\n risks: data.risks.map((r) => ({\n name: r.name,\n description: r.description,\n level: r.level as RiskLevel,\n score: r.score,\n })),\n tokenInfo: {\n name: data.tokenMeta.name,\n symbol: data.tokenMeta.symbol,\n decimals: data.tokenMeta.decimals,\n supply: data.tokenMeta.supply,\n mintAuthority: data.tokenMeta.mintAuthority,\n freezeAuthority: data.tokenMeta.freezeAuthority,\n },\n holders: {\n totalHolders: data.totalHolders,\n topHoldersPercent,\n top10Holders: data.topHolders.slice(0, 10).map((h) => ({\n address: h.address,\n percent: h.pct,\n isInsider: h.insider,\n })),\n },\n liquidity: {\n totalLiquidityUsd,\n pools: data.markets.map((m) => ({\n dex: m.marketType,\n liquidityUsd:\n Number.parseFloat(m.liquidityA || \"0\") + Number.parseFloat(m.liquidityB || \"0\"),\n lpLocked: m.lp.lpLocked,\n lpLockPercent: m.lp.lpLockedPct,\n })),\n },\n validatedAt: Date.now(),\n cacheExpiry: Date.now() + CACHE_DURATION_MS,\n };\n\n logger.info(\n `[${TokenValidationService.serviceType}] RugCheck report: ${report.tokenInfo.symbol} risk=${report.riskLevel} score=${report.score} liquidity=$${report.liquidity.totalLiquidityUsd.toFixed(0)}`,\n );\n\n return report;\n }\n\n /**\n * Create a report for unknown tokens\n */\n private createUnknownReport(tokenAddress: string): RugCheckReport {\n return {\n tokenAddress,\n riskLevel: \"unknown\",\n score: 100,\n risks: [\n {\n name: \"Unknown Token\",\n description: \"Token not found in RugCheck database\",\n level: \"warning\",\n score: 50,\n },\n ],\n tokenInfo: {\n name: \"Unknown\",\n symbol: \"UNKNOWN\",\n decimals: 9,\n supply: \"0\",\n mintAuthority: null,\n freezeAuthority: null,\n },\n holders: {\n totalHolders: 0,\n topHoldersPercent: 100,\n top10Holders: [],\n },\n liquidity: {\n totalLiquidityUsd: 0,\n pools: [],\n },\n validatedAt: Date.now(),\n cacheExpiry: Date.now() + CACHE_DURATION_MS / 6, // Shorter cache for unknown tokens\n };\n }\n\n /**\n * Convert score to risk level\n */\n private scoreToRiskLevel(score: number): RiskLevel {\n if (score <= 20) return \"safe\";\n if (score <= 50) return \"warning\";\n return \"danger\";\n }\n\n /**\n * Fetch trading activity from Birdeye for honeypot detection\n */\n public async getTradingActivity(tokenAddress: string): Promise<TradingActivity | null> {\n // Check cache first\n const cached = this.activityCache.get(tokenAddress);\n if (cached && cached.expiry > Date.now()) {\n return cached.data;\n }\n\n if (!this.birdeyeApiKey) {\n logger.warn(\n `[${TokenValidationService.serviceType}] No Birdeye API key - skipping activity check`,\n );\n return null;\n }\n\n // Fetch token overview for volume and creation time\n const overviewResp = await fetch(`${this.BIRDEYE_API}/token_overview?address=${tokenAddress}`, {\n headers: { \"X-API-KEY\": this.birdeyeApiKey, \"x-chain\": \"solana\" },\n });\n\n if (!overviewResp.ok) {\n logger.warn(\n `[${TokenValidationService.serviceType}] Failed to fetch token overview: ${overviewResp.status}`,\n );\n return null;\n }\n\n const overviewData = (await overviewResp.json()) as {\n success: boolean;\n data: {\n v24hUSD: number;\n v24hChangePercent: number;\n trade24h: number;\n trade24hChangePercent: number;\n buy24h: number;\n sell24h: number;\n buyVolume24h: number;\n sellVolume24h: number;\n uniqueWallet24h: number;\n createdAt?: number;\n lastTradeUnixTime?: number;\n };\n };\n\n if (!overviewData.success || !overviewData.data) {\n logger.warn(\n `[${TokenValidationService.serviceType}] Invalid Birdeye response for ${tokenAddress}`,\n );\n return null;\n }\n\n const d = overviewData.data;\n const activity: TradingActivity = {\n volume24h: d.v24hUSD || 0,\n buyCount24h: d.buy24h || 0,\n sellCount24h: d.sell24h || 0,\n buyVolume24h: d.buyVolume24h || 0,\n sellVolume24h: d.sellVolume24h || 0,\n uniqueTraders24h: d.uniqueWallet24h || 0,\n createdAt: d.createdAt ? d.createdAt * 1000 : null,\n lastTradeAt: d.lastTradeUnixTime ? d.lastTradeUnixTime * 1000 : null,\n };\n\n // Cache for 5 minutes\n this.activityCache.set(tokenAddress, {\n data: activity,\n expiry: Date.now() + 5 * 60 * 1000,\n });\n\n logger.info(\n `[${TokenValidationService.serviceType}] Trading activity for ${tokenAddress}: vol=$${activity.volume24h.toFixed(0)} buys=${activity.buyCount24h} sells=${activity.sellCount24h} traders=${activity.uniqueTraders24h}`,\n );\n\n return activity;\n }\n\n /**\n * Check for honeypot indicators\n */\n private async checkHoneypotIndicators(\n tokenAddress: string,\n requirements: TradingRequirements,\n ): Promise<{ isHoneypot: boolean; reasons: string[]; warnings: string[] }> {\n const reasons: string[] = [];\n const warnings: string[] = [];\n\n const activity = await this.getTradingActivity(tokenAddress);\n if (!activity) {\n warnings.push(\"Could not fetch trading activity - honeypot check skipped\");\n return { isHoneypot: false, reasons, warnings };\n }\n\n // Check for no sells (major honeypot signal)\n if (activity.sellCount24h === 0) {\n reasons.push(\"šØ HONEYPOT: No sells in 24h - token may be unsellable\");\n } else if (activity.sellCount24h < requirements.minSellCount24h) {\n reasons.push(\n `Very few sells in 24h: ${activity.sellCount24h} (min: ${requirements.minSellCount24h})`,\n );\n }\n\n // Check buy/sell ratio\n if (activity.sellCount24h > 0) {\n const buySellRatio = activity.buyCount24h / activity.sellCount24h;\n if (buySellRatio > requirements.maxBuySellRatio) {\n reasons.push(\n `šØ Suspicious buy/sell ratio: ${buySellRatio.toFixed(1)}x more buys than sells (max: ${requirements.maxBuySellRatio}x)`,\n );\n } else if (buySellRatio > requirements.maxBuySellRatio * 0.7) {\n warnings.push(`High buy/sell ratio: ${buySellRatio.toFixed(1)}x`);\n }\n }\n\n // Check volume\n if (activity.volume24h < requirements.minVolume24hUsd) {\n reasons.push(\n `Insufficient volume: $${activity.volume24h.toLocaleString()} (min: $${requirements.minVolume24hUsd.toLocaleString()})`,\n );\n }\n\n // Check sell volume vs buy volume (honeypots often have 0 sell volume)\n if (activity.buyVolume24h > 0 && activity.sellVolume24h === 0) {\n reasons.push(\"šØ HONEYPOT: Zero sell volume despite buy volume\");\n } else if (activity.buyVolume24h > 0) {\n const volumeRatio = activity.buyVolume24h / (activity.sellVolume24h || 1);\n if (volumeRatio > 10) {\n warnings.push(`Buy volume 10x+ higher than sell volume: ${volumeRatio.toFixed(1)}x`);\n }\n }\n\n // Check unique traders\n if (activity.uniqueTraders24h < requirements.minUniqueTraders24h) {\n reasons.push(\n `Too few unique traders: ${activity.uniqueTraders24h} (min: ${requirements.minUniqueTraders24h})`,\n );\n }\n\n // Check token age\n if (activity.createdAt) {\n const ageSeconds = (Date.now() - activity.createdAt) / 1000;\n if (ageSeconds < requirements.minTokenAgeSeconds) {\n const ageHours = ageSeconds / 3600;\n const minHours = requirements.minTokenAgeSeconds / 3600;\n reasons.push(`Token too new: ${ageHours.toFixed(1)}h old (min: ${minHours}h)`);\n }\n }\n\n // Check for recent trading activity\n if (activity.lastTradeAt) {\n const timeSinceLastTrade = Date.now() - activity.lastTradeAt;\n if (timeSinceLastTrade > 30 * 60 * 1000) {\n // 30 minutes\n warnings.push(`No trades in ${(timeSinceLastTrade / 60000).toFixed(0)} minutes`);\n }\n }\n\n return { isHoneypot: reasons.length > 0, reasons, warnings };\n }\n\n /**\n * Validate a token against trading requirements\n */\n public async validateToken(\n tokenAddress: string,\n customRequirements?: Partial<TradingRequirements>,\n ): Promise<ValidationResult> {\n const requirements = { ...this.requirements, ...customRequirements };\n\n if (!this.enabled) {\n return {\n isValid: true,\n report: null,\n rejectionReasons: [],\n warnings: [\"Token validation is disabled\"],\n };\n }\n\n const report = await this.getRugCheckReport(tokenAddress);\n\n if (!report) {\n return {\n isValid: false,\n report: null,\n rejectionReasons: [\"Failed to fetch token validation report\"],\n warnings: [],\n };\n }\n\n const rejectionReasons: string[] = [];\n const warnings: string[] = [];\n\n // === HONEYPOT DETECTION (CRITICAL) ===\n const honeypotCheck = await this.checkHoneypotIndicators(tokenAddress, requirements);\n if (honeypotCheck.isHoneypot) {\n rejectionReasons.push(...honeypotCheck.reasons);\n }\n warnings.push(...honeypotCheck.warnings);\n\n // === RUG CHECK VALIDATION ===\n // Check risk level\n if (report.riskLevel === \"danger\") {\n rejectionReasons.push(`Token flagged as dangerous (risk score: ${report.score})`);\n }\n\n // Check rug pull score\n if (report.score > requirements.maxRugPullScore) {\n rejectionReasons.push(\n `Rug pull risk too high: ${report.score}% (max: ${requirements.maxRugPullScore}%)`,\n );\n }\n\n // Check liquidity\n if (report.liquidity.totalLiquidityUsd < requirements.minLiquidityUsd) {\n rejectionReasons.push(\n `Insufficient liquidity: $${report.liquidity.totalLiquidityUsd.toLocaleString()} ` +\n `(min: $${requirements.minLiquidityUsd.toLocaleString()})`,\n );\n }\n\n // Check holder concentration\n if (report.holders.topHoldersPercent > requirements.maxTopHoldersPercent) {\n rejectionReasons.push(\n `Top holders concentration too high: ${report.holders.topHoldersPercent.toFixed(1)}% ` +\n `(max: ${requirements.maxTopHoldersPercent}%)`,\n );\n }\n\n // Check LP lock if required\n if (requirements.requireLpLock) {\n const hasLockedLp = report.liquidity.pools.some((p) => p.lpLocked);\n if (!hasLockedLp) {\n rejectionReasons.push(\"No locked liquidity pool found\");\n }\n }\n\n // === ADDITIONAL RISK FACTORS ===\n // Check for specific risk factors (warnings)\n for (const risk of report.risks) {\n if (risk.level === \"warning\") {\n warnings.push(`${risk.name}: ${risk.description}`);\n } else if (risk.level === \"danger\" && !rejectionReasons.includes(`RugCheck: ${risk.name}`)) {\n rejectionReasons.push(`RugCheck: ${risk.name} - ${risk.description}`);\n }\n }\n\n // Check mint authority\n if (report.tokenInfo.mintAuthority) {\n warnings.push(\"Mint authority is not renounced - token supply can be increased\");\n }\n\n // Check freeze authority\n if (report.tokenInfo.freezeAuthority) {\n warnings.push(\"Freeze authority is not renounced - accounts can be frozen\");\n }\n\n const isValid = rejectionReasons.length === 0;\n\n logger.info(\n `[${TokenValidationService.serviceType}] Validation result for ${tokenAddress}: valid=${isValid} rejections=${rejectionReasons.length} warnings=${warnings.length}`,\n );\n\n return {\n isValid,\n report,\n rejectionReasons,\n warnings,\n };\n }\n\n /**\n * Quick check if a token is safe to trade\n */\n public async isSafeToTrade(tokenAddress: string): Promise<boolean> {\n const result = await this.validateToken(tokenAddress);\n return result.isValid;\n }\n\n /**\n * Clear the validation cache\n */\n public clearCache(): void {\n this.cache.clear();\n logger.info(`[${TokenValidationService.serviceType}] Cache cleared`);\n }\n\n /**\n * Mark a token as flagged (e.g., after a rug pull)\n */\n public flagToken(tokenAddress: string, reason: string): void {\n const report = this.cache.get(tokenAddress);\n if (report) {\n report.riskLevel = \"danger\";\n report.score = 100;\n report.risks.push({\n name: \"Manually Flagged\",\n description: reason,\n level: \"danger\",\n score: 100,\n });\n report.cacheExpiry = Date.now() + CACHE_DURATION_MS * 4; // Extend cache for flagged tokens\n }\n logger.warn(\n `[${TokenValidationService.serviceType}] Token flagged: ${tokenAddress} reason=${reason}`,\n );\n }\n}\n","/**\n * Trading Trajectory Service\n *\n * Integrates with @elizaos/plugin-trajectory-logger to capture trading\n * decisions and outcomes for reinforcement learning training.\n */\n\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport type { Position, TradeOrder } from \"../types.ts\";\nimport { TradeType } from \"../types.ts\";\n\n// Import types from trajectory logger (we'll make this optional)\ninterface EnvironmentState {\n timestamp: number;\n agentBalance: number;\n agentPoints: number;\n agentPnL: number;\n openPositions: number;\n activeMarkets?: number;\n portfolioValue?: number;\n custom?: Record<string, unknown>;\n}\n\ninterface TrajectoryLoggerService {\n startTrajectory(\n agentId: string,\n options?: {\n scenarioId?: string;\n episodeId?: string;\n metadata?: Record<string, unknown>;\n },\n ): string;\n startStep(trajectoryId: string, envState: EnvironmentState): string;\n logLLMCall(\n stepId: string,\n llmCall: {\n model: string;\n systemPrompt: string;\n userPrompt: string;\n response: string;\n reasoning?: string;\n temperature: number;\n maxTokens: number;\n purpose: \"action\" | \"reasoning\" | \"evaluation\" | \"response\" | \"other\";\n actionType?: string;\n },\n ): void;\n completeStep(\n trajectoryId: string,\n stepId: string,\n action: {\n actionType: string;\n actionName: string;\n parameters: Record<string, unknown>;\n success: boolean;\n result?: Record<string, unknown>;\n reasoning?: string;\n },\n rewardInfo?: { reward?: number; components?: Record<string, number> },\n ): void;\n endTrajectory(\n trajectoryId: string,\n status: \"completed\" | \"terminated\" | \"error\" | \"timeout\",\n finalMetrics?: Record<string, unknown>,\n ): Promise<void>;\n getActiveTrajectory(trajectoryId: string): unknown | null;\n}\n\nexport interface TradingEnvironmentState {\n solBalance: number;\n portfolioValue: number;\n totalPnL: number;\n dailyPnL: number;\n openPositions: Position[];\n winRate: number;\n totalTrades: number;\n}\n\nexport class TradingTrajectoryService extends Service {\n public static readonly serviceType = \"TradingTrajectoryService\";\n public readonly capabilityDescription = \"Logs trading trajectories for RL training\";\n\n private trajectoryLogger: TrajectoryLoggerService | null = null;\n private activeTrajectoryId: string | null = null;\n private activeStepId: string | null = null;\n private sessionStartState: TradingEnvironmentState | null = null;\n private enabled = false;\n\n public static async start(runtime: IAgentRuntime): Promise<TradingTrajectoryService> {\n const instance = new TradingTrajectoryService(runtime);\n await instance.initialize();\n return instance;\n }\n\n private async initialize(): Promise<void> {\n // Try to get TrajectoryLoggerService if available\n try {\n const { TrajectoryLoggerService } = await import(\"@elizaos/plugin-trajectory-logger\");\n this.trajectoryLogger = new TrajectoryLoggerService();\n this.enabled = true;\n logger.info(\"[TradingTrajectoryService] Trajectory logging enabled\");\n } catch {\n logger.info(\"[TradingTrajectoryService] Trajectory logger not available - logging disabled\");\n this.enabled = false;\n }\n }\n\n public async stop(): Promise<void> {\n if (this.activeTrajectoryId) {\n await this.endSession(\"terminated\");\n }\n }\n\n public isEnabled(): boolean {\n return this.enabled && this.trajectoryLogger !== null;\n }\n\n /**\n * Start a new trading session trajectory\n */\n public startSession(params: {\n strategy: string;\n initialState: TradingEnvironmentState;\n scenarioId?: string;\n }): string | null {\n if (!this.isEnabled()) return null;\n\n this.sessionStartState = params.initialState;\n\n this.activeTrajectoryId =\n this.trajectoryLogger?.startTrajectory(this.runtime.agentId, {\n scenarioId: params.scenarioId || `trading-${params.strategy}`,\n episodeId: `session-${Date.now()}`,\n metadata: {\n strategy: params.strategy,\n initialBalance: params.initialState.solBalance,\n initialPortfolioValue: params.initialState.portfolioValue,\n tradingMode: this.runtime.getSetting(\"TRADING_MODE\") || \"paper\",\n },\n }) ?? null;\n\n logger.info(`[TradingTrajectoryService] Started trajectory: ${this.activeTrajectoryId}`);\n return this.activeTrajectoryId;\n }\n\n /**\n * Log a trading decision step\n */\n public startTradingStep(envState: TradingEnvironmentState): string | null {\n if (!this.isEnabled() || !this.activeTrajectoryId) return null;\n\n const trajectoryEnvState: EnvironmentState = {\n timestamp: Date.now(),\n agentBalance: envState.solBalance,\n agentPoints: envState.totalTrades,\n agentPnL: envState.totalPnL,\n openPositions: envState.openPositions.length,\n portfolioValue: envState.portfolioValue,\n custom: {\n dailyPnL: envState.dailyPnL,\n winRate: envState.winRate,\n positions: envState.openPositions.map((p) => ({\n token: p.tokenAddress,\n amount: p.amount,\n entryPrice: p.entryPrice,\n currentPrice: p.currentPrice,\n })),\n },\n };\n\n this.activeStepId =\n this.activeTrajectoryId && this.trajectoryLogger\n ? (this.trajectoryLogger.startStep(this.activeTrajectoryId, trajectoryEnvState) ?? null)\n : null;\n return this.activeStepId;\n }\n\n /**\n * Log an LLM decision for trading\n */\n public logTradingDecision(params: {\n model: string;\n prompt: string;\n response: string;\n reasoning?: string;\n actionType: string;\n }): void {\n if (!this.isEnabled() || !this.activeStepId) return;\n\n this.trajectoryLogger?.logLLMCall(this.activeStepId, {\n model: params.model,\n systemPrompt: \"Trading strategy analysis\",\n userPrompt: params.prompt,\n response: params.response,\n reasoning: params.reasoning,\n temperature: 0.7,\n maxTokens: 4096,\n purpose: \"action\",\n actionType: params.actionType,\n });\n }\n\n /**\n * Complete a trading step with the action taken\n */\n public completeTradingStep(params: {\n order: TradeOrder | null;\n success: boolean;\n txId?: string;\n error?: string;\n pnlChange?: number;\n }): void {\n if (!this.isEnabled() || !this.activeTrajectoryId || !this.activeStepId) return;\n\n const action = params.order\n ? {\n actionType: params.order.action === TradeType.BUY ? \"BUY\" : \"SELL\",\n actionName: `${params.order.action}_${params.order.pair}`,\n parameters: {\n pair: params.order.pair,\n quantity: params.order.quantity,\n price: params.order.price,\n orderType: params.order.orderType,\n },\n success: params.success,\n result: params.txId\n ? { txId: params.txId }\n : params.error\n ? { error: params.error }\n : undefined,\n reasoning: params.order.reason,\n }\n : {\n actionType: \"HOLD\",\n actionName: \"HOLD\",\n parameters: {},\n success: true,\n reasoning: \"No trade signal\",\n };\n\n // Calculate reward based on outcome\n const reward = this.calculateReward(params);\n\n this.trajectoryLogger?.completeStep(this.activeTrajectoryId, this.activeStepId, action, {\n reward,\n components: {\n environmentReward: reward,\n profitLoss: params.pnlChange || 0,\n },\n });\n\n this.activeStepId = null;\n }\n\n /**\n * End the trading session trajectory\n */\n public async endSession(\n status: \"completed\" | \"terminated\" | \"error\" | \"timeout\",\n finalState?: TradingEnvironmentState,\n ): Promise<void> {\n if (!this.isEnabled() || !this.activeTrajectoryId) return;\n\n const metrics: Record<string, unknown> = {};\n\n if (finalState && this.sessionStartState) {\n metrics.finalBalance = finalState.solBalance;\n metrics.finalPnL = finalState.totalPnL;\n metrics.tradesExecuted = finalState.totalTrades - this.sessionStartState.totalTrades;\n metrics.successRate = finalState.winRate;\n metrics.portfolioChange = finalState.portfolioValue - this.sessionStartState.portfolioValue;\n metrics.pnlChange = finalState.totalPnL - this.sessionStartState.totalPnL;\n }\n\n await this.trajectoryLogger?.endTrajectory(this.activeTrajectoryId, status, metrics);\n\n logger.info(\n `[TradingTrajectoryService] Ended trajectory: ${this.activeTrajectoryId} status=${status}`,\n );\n\n this.activeTrajectoryId = null;\n this.activeStepId = null;\n this.sessionStartState = null;\n }\n\n /**\n * Calculate reward for a trading step\n */\n private calculateReward(params: {\n order: TradeOrder | null;\n success: boolean;\n pnlChange?: number;\n error?: string;\n }): number {\n let reward = 0;\n\n // Base reward for successful trade execution\n if (params.success && params.order) {\n reward += 0.1;\n }\n\n // Penalty for failed trades\n if (!params.success && params.order) {\n reward -= 0.2;\n }\n\n // Reward/penalty based on P&L change\n if (params.pnlChange !== undefined) {\n if (params.pnlChange > 0) {\n // Positive P&L: scale reward logarithmically\n reward += Math.min(Math.log10(params.pnlChange + 1) * 0.5, 1.0);\n } else if (params.pnlChange < 0) {\n // Negative P&L: penalty\n reward += Math.max(Math.log10(Math.abs(params.pnlChange) + 1) * -0.3, -0.5);\n }\n }\n\n // Small reward for holding when no good opportunity\n if (!params.order) {\n reward += 0.01;\n }\n\n return reward;\n }\n\n /**\n * Get the current active trajectory ID\n */\n public getActiveTrajectoryId(): string | null {\n return this.activeTrajectoryId;\n }\n}\n","import type { Plugin } from \"@elizaos/core\";\n// Import test scenarios\nimport { autoTradingScenarios } from \"./__tests__/e2e/autotrading-scenarios.ts\";\nimport { liveTradingScenarios } from \"./__tests__/e2e/liveTrading-scenarios.ts\";\nimport { mockTradingScenarios } from \"./__tests__/e2e/mock-trading-scenario.ts\";\nimport { analyzePerformanceAction } from \"./actions/analyzePerformanceAction.ts\";\nimport { checkPortfolioAction } from \"./actions/checkPortfolioAction.ts\";\nimport { compareStrategiesAction } from \"./actions/compareStrategiesAction.ts\";\nimport { configureStrategyAction } from \"./actions/configureStrategyAction.ts\";\nimport { executeLiveTradeAction } from \"./actions/executeLiveTradeAction.ts\";\nimport { getMarketAnalysisAction } from \"./actions/getMarketAnalysisAction.ts\";\nimport { runBacktestAction } from \"./actions/runBacktestAction.ts\";\n// Import actions\nimport { startTradingAction } from \"./actions/startTradingAction.ts\";\nimport { stopTradingAction } from \"./actions/stopTradingAction.ts\";\nimport { marketDataProvider } from \"./providers/marketDataProvider.ts\";\nimport { strategyProvider } from \"./providers/strategyProvider.ts\";\n\n// Import providers\nimport { tradingProvider } from \"./providers/tradingProvider.ts\";\n// Import services\nimport { AutoTradingManager } from \"./services/AutoTradingManager.ts\";\nimport { SwapService } from \"./services/SwapService.ts\";\nimport { TokenResolverService } from \"./services/TokenResolverService.ts\";\nimport { TokenValidationService } from \"./services/TokenValidationService.ts\";\nimport { TradingTrajectoryService } from \"./services/TradingTrajectoryService.ts\";\n\n/**\n * Auto Trader Plugin\n *\n * Provides autonomous trading capabilities with:\n * - LLM-powered trading strategies\n * - Jupiter DEX integration for token swaps\n * - RugCheck token validation\n * - Risk management with stop-loss/take-profit\n * - Backtesting and paper trading modes\n */\nconst autoTraderPlugin: Plugin = {\n name: \"plugin-auto-trader\",\n description:\n \"Autonomous trading plugin with LLM-powered strategies, Jupiter integration, and risk management\",\n services: [\n AutoTradingManager,\n SwapService,\n TokenValidationService,\n TokenResolverService,\n TradingTrajectoryService,\n ],\n actions: [\n startTradingAction,\n stopTradingAction,\n checkPortfolioAction,\n runBacktestAction,\n compareStrategiesAction,\n analyzePerformanceAction,\n getMarketAnalysisAction,\n configureStrategyAction,\n executeLiveTradeAction,\n ],\n providers: [tradingProvider, marketDataProvider, strategyProvider],\n tests: [autoTradingScenarios, liveTradingScenarios, mockTradingScenarios],\n};\n\nexport default autoTraderPlugin;\nexport { autoTraderPlugin };\n\nexport type {\n TradingConfig,\n TradingStatus,\n} from \"./services/AutoTradingManager.ts\";\n// Export services for direct access\nexport { AutoTradingManager } from \"./services/AutoTradingManager.ts\";\nexport type {\n SwapParams,\n SwapQuote,\n SwapResult,\n WalletBalance,\n} from \"./services/SwapService.ts\";\nexport { KNOWN_TOKENS, SwapService } from \"./services/SwapService.ts\";\nexport type { TokenInfo } from \"./services/TokenResolverService.ts\";\nexport { TokenResolverService } from \"./services/TokenResolverService.ts\";\nexport type {\n RugCheckReport,\n TradingActivity,\n TradingRequirements,\n ValidationResult,\n} from \"./services/TokenValidationService.ts\";\nexport { TokenValidationService } from \"./services/TokenValidationService.ts\";\nexport type { TradingEnvironmentState } from \"./services/TradingTrajectoryService.ts\";\nexport { TradingTrajectoryService } from \"./services/TradingTrajectoryService.ts\";\nexport type { LLMStrategyConfig } from \"./strategies/LLMStrategy.ts\";\n// Export strategies\nexport { LLMStrategy } from \"./strategies/LLMStrategy.ts\";\nexport { MeanReversionStrategy } from \"./strategies/MeanReversionStrategy.ts\";\nexport { MomentumBreakoutStrategy } from \"./strategies/MomentumBreakoutStrategy.ts\";\nexport { RandomStrategy } from \"./strategies/RandomStrategy.ts\";\nexport { RuleBasedStrategy } from \"./strategies/RuleBasedStrategy.ts\";\n// Export types from trading.ts (excluding TradingConfig which is also in AutoTradingManager)\nexport type { RiskLimits, WalletPortfolioItem } from \"./types/trading.ts\";\n// Re-export TradingConfig from trading.ts as TradingSettings to avoid conflict\nexport type { TradingConfig as TradingSettings } from \"./types/trading.ts\";\n// Export types - these include PortfolioAssetHolding and WalletPortfolio\nexport * from \"./types.ts\";\n"],"mappings":"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","names":["prototype","descriptors","filter","hasOwnProperty","filter","FormData","prototype","toString","encode","url","isFormData","isFileList","transitional","filter","self","prototype","validateStatus","url","util","url","stream","stream","url","stream","util","data","transitional","origin","url","merge","transitional","signal","stream","iterator","done","isFunction","ReadableStream","TextEncoder","url","fetch","adapter","adapter","validators","transitional","url","Axios","AxiosError","CanceledError","isCancel","CancelToken","VERSION","all","isAxiosError","spread","toFormData","AxiosHeaders","HttpStatusCode","getAdapter","mergeConfig","logger","logger","logger","result","logger","logger","logger","Service","logger","parseJSONObjectFromText","logger","parseJSONObjectFromText","Service","logger","MomentumBreakoutStrategy","MeanReversionStrategy","RuleBasedStrategy","RandomStrategy","logger","Service","logger","Service","logger","Service","Service","logger"]}
|