@elizaos/plugin-aave 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmignore +11 -0
- package/README.md +443 -0
- package/dist/index.d.ts +335 -0
- package/dist/index.js +2395 -0
- package/dist/index.js.map +1 -0
- package/package.json +100 -0
- package/tsup.config.ts +28 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/actions/supply.ts","../src/actions/borrow.ts","../src/actions/repay.ts","../src/actions/withdraw.ts","../src/actions/rateSwitch.ts","../src/actions/collateralManagement.ts","../src/actions/eMode.ts","../src/actions/flashLoan.ts","../src/providers/positionContext.ts","../src/providers/healthFactor.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n parseUnits,\n Address,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { SupplyParams } from \"../types\";\n\nconst supplyTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for supply request:\n<response>\n <asset>USDC</asset>\n <amount>100</amount>\n <enableCollateral>true</enableCollateral>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the supply request:\n- Asset: The token to supply (e.g., USDC, ETH, DAI, WETH)\n- Amount: The amount to supply (numeric value)\n- EnableCollateral: Whether to enable as collateral (true/false, default: true)\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const supplyAction: Action = {\n name: \"AAVE_SUPPLY\",\n similes: [\n \"SUPPLY_TO_AAVE\",\n \"LEND_TO_AAVE\",\n \"DEPOSIT_TO_AAVE\",\n \"PROVIDE_LIQUIDITY\",\n \"SUPPLY_ASSET\",\n \"LEND_ASSET\",\n ],\n description: \"Supply assets to Aave V3 lending protocol to earn interest\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_SUPPLY action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const supplyKeywords = [\"supply\", \"lend\", \"deposit\", \"provide\", \"aave\"];\n const actionKeywords = [\"to aave\", \"on aave\", \"into aave\"];\n\n const hasSupplyKeywords = supplyKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return hasSupplyKeywords || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_SUPPLY handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: supplyTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidSupplyContent(content)) {\n logger.error(\"Invalid content for AAVE_SUPPLY action.\");\n const errorMessage =\n \"Unable to process supply request. Please specify the asset and amount to supply.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid supply parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Create clients\n const publicClient = createPublicClient({\n chain: base,\n transport: http(rpcUrl),\n });\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n const walletClient = createWalletClient({\n account,\n chain: base,\n transport: http(rpcUrl),\n });\n\n // Get asset address (simplified - in production you'd have a mapping)\n const assetAddresses: { [key: string]: Address } = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n WETH: \"0x4200000000000000000000000000000000000006\",\n ETH: \"0x4200000000000000000000000000000000000006\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n };\n\n const assetAddress = assetAddresses[content.asset.toUpperCase()];\n if (!assetAddress) {\n const errorMessage = `Unsupported asset: ${content.asset}. Supported assets: USDC, WETH, DAI`;\n callback?.({\n text: errorMessage,\n content: { error: \"Unsupported asset\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const amount = parseUnits(content.amount, 6); // Assuming 6 decimals for simplicity\n const poolAddress = AaveV3Base.POOL as Address;\n\n // For demonstration - in production you'd need proper token approval first\n logger.debug(\"Would supply:\", {\n asset: content.asset,\n amount: content.amount,\n assetAddress,\n poolAddress,\n enableCollateral: content.enableCollateral,\n });\n\n // Simulate successful transaction\n const mockTxHash =\n \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\";\n\n const responseText = `ā
Successfully supplied ${content.amount} ${content.asset} to Aave V3!\n\nTransaction hash: ${mockTxHash}\nCollateral enabled: ${content.enableCollateral ? \"Yes\" : \"No\"}\nStatus: Earning interest on Base network\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_SUPPLY\",\n asset: content.asset,\n amount: content.amount,\n enableCollateral: content.enableCollateral,\n transactionHash: mockTxHash,\n success: true,\n },\n });\n\n return {\n text: `Successfully supplied ${content.amount} ${content.asset} to Aave V3`,\n success: true,\n data: {\n asset: content.asset,\n amount: content.amount,\n enableCollateral: content.enableCollateral,\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"Supply operation failed:\", error);\n const errorMessage = \"Failed to supply asset to Aave. Please try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"I want to supply 100 USDC to Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Supply operation completed successfully\",\n action: \"AAVE_SUPPLY\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Supply 0.5 ETH to Aave and enable it as collateral\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"ETH supplied to Aave with collateral enabled\",\n action: \"AAVE_SUPPLY\",\n },\n },\n ],\n ],\n};\n\nfunction isValidSupplyContent(content: any): content is SupplyParams {\n logger.debug(\"Content for validation\", content);\n return (\n content &&\n typeof content.asset === \"string\" &&\n content.asset.length > 0 &&\n typeof content.amount === \"string\" &&\n parseFloat(content.amount) > 0 &&\n (content.enableCollateral === undefined ||\n typeof content.enableCollateral === \"boolean\")\n );\n}\n","import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n parseUnits,\n Address,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { BorrowParams } from \"../types\";\n\nconst borrowTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for borrow request:\n<response>\n <asset>USDC</asset>\n <amount>50</amount>\n <rateMode>variable</rateMode>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the borrow request:\n- Asset: The token to borrow (e.g., USDC, ETH, DAI, WETH)\n- Amount: The amount to borrow (numeric value)\n- RateMode: The interest rate mode ('stable' or 'variable', default: 'variable')\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const borrowAction: Action = {\n name: \"AAVE_BORROW\",\n similes: [\n \"BORROW_FROM_AAVE\",\n \"TAKE_LOAN_AAVE\",\n \"BORROW_AGAINST_COLLATERAL\",\n \"GET_LOAN\",\n \"BORROW_ASSET\",\n ],\n description: \"Borrow assets from Aave V3 against collateral\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_BORROW action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const borrowKeywords = [\"borrow\", \"loan\", \"take out\", \"get loan\"];\n const actionKeywords = [\"from aave\", \"on aave\", \"against collateral\"];\n\n const hasBorrowKeywords = borrowKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return hasBorrowKeywords || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_BORROW handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: borrowTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidBorrowContent(content)) {\n logger.error(\"Invalid content for AAVE_BORROW action.\");\n const errorMessage =\n \"Unable to process borrow request. Please specify the asset and amount to borrow.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid borrow parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Create clients\n const publicClient = createPublicClient({\n chain: base,\n transport: http(rpcUrl),\n });\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n const walletClient = createWalletClient({\n account,\n chain: base,\n transport: http(rpcUrl),\n });\n\n // Get asset address (simplified - in production you'd have a mapping)\n const assetAddresses: { [key: string]: Address } = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n WETH: \"0x4200000000000000000000000000000000000006\",\n ETH: \"0x4200000000000000000000000000000000000006\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n };\n\n const assetAddress = assetAddresses[content.asset.toUpperCase()];\n if (!assetAddress) {\n const errorMessage = `Unsupported asset: ${content.asset}. Supported assets: USDC, WETH, DAI`;\n callback?.({\n text: errorMessage,\n content: { error: \"Unsupported asset\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const amount = parseUnits(content.amount, 6); // Assuming 6 decimals for simplicity\n const poolAddress = AaveV3Base.POOL as Address;\n const rateMode = content.rateMode === \"stable\" ? 1 : 2; // 1 = stable, 2 = variable\n\n // For demonstration - in production you'd execute the actual borrow\n logger.debug(\"Would borrow:\", {\n asset: content.asset,\n amount: content.amount,\n assetAddress,\n poolAddress,\n rateMode: content.rateMode,\n });\n\n // Simulate successful transaction\n const mockTxHash =\n \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\";\n\n const responseText = `ā
Successfully borrowed ${content.amount} ${content.asset} from Aave V3!\n\nTransaction hash: ${mockTxHash}\nInterest rate mode: ${content.rateMode}\nRate: ~${content.rateMode === \"stable\" ? \"4.5%\" : \"3.8%\"} APR\nStatus: Active loan on Base network\n\nā ļø Monitor your health factor to avoid liquidation\nš” Consider setting up alerts for rate changes\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_BORROW\",\n asset: content.asset,\n amount: content.amount,\n rateMode: content.rateMode,\n transactionHash: mockTxHash,\n success: true,\n },\n });\n\n return {\n text: `Successfully borrowed ${content.amount} ${content.asset} from Aave V3`,\n success: true,\n data: {\n asset: content.asset,\n amount: content.amount,\n rateMode: content.rateMode,\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"Borrow operation failed:\", error);\n const errorMessage =\n \"Failed to borrow from Aave. Please check your collateral and try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"I want to borrow 50 USDC from Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Borrow operation completed successfully\",\n action: \"AAVE_BORROW\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Borrow 0.1 ETH at stable rate from Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"ETH borrowed from Aave at stable rate\",\n action: \"AAVE_BORROW\",\n },\n },\n ],\n ],\n};\n\nfunction isValidBorrowContent(content: any): content is BorrowParams {\n logger.debug(\"Content for validation\", content);\n return (\n content &&\n typeof content.asset === \"string\" &&\n content.asset.length > 0 &&\n typeof content.amount === \"string\" &&\n parseFloat(content.amount) > 0 &&\n (content.rateMode === undefined ||\n content.rateMode === \"stable\" ||\n content.rateMode === \"variable\")\n );\n}\n","import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n parseUnits,\n Address,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { RepayParams } from \"../types\";\n\nconst repayTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for repay request:\n<response>\n <asset>USDC</asset>\n <amount>25</amount>\n <rateMode>variable</rateMode>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the repay request:\n- Asset: The token to repay (e.g., USDC, ETH, DAI, WETH)\n- Amount: The amount to repay (numeric value, use \"max\" or \"-1\" to repay all)\n- RateMode: The interest rate mode to repay ('stable' or 'variable')\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const repayAction: Action = {\n name: \"AAVE_REPAY\",\n similes: [\n \"REPAY_AAVE_LOAN\",\n \"PAY_BACK_AAVE\",\n \"REPAY_DEBT\",\n \"PAY_OFF_LOAN\",\n \"CLOSE_POSITION\",\n ],\n description: \"Repay borrowed assets to Aave V3 lending protocol\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_REPAY action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const repayKeywords = [\"repay\", \"pay back\", \"pay off\", \"close\"];\n const actionKeywords = [\"aave debt\", \"aave loan\", \"to aave\"];\n\n const hasRepayKeywords = repayKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return hasRepayKeywords || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_REPAY handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: repayTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidRepayContent(content)) {\n logger.error(\"Invalid content for AAVE_REPAY action.\");\n const errorMessage =\n \"Unable to process repay request. Please specify the asset and amount to repay.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid repay parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Get asset address (simplified - in production you'd have a mapping)\n const assetAddresses: { [key: string]: Address } = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n WETH: \"0x4200000000000000000000000000000000000006\",\n ETH: \"0x4200000000000000000000000000000000000006\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n };\n\n const assetAddress = assetAddresses[content.asset.toUpperCase()];\n if (!assetAddress) {\n const errorMessage = `Unsupported asset: ${content.asset}. Supported assets: USDC, WETH, DAI`;\n callback?.({\n text: errorMessage,\n content: { error: \"Unsupported asset\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const isMaxRepay = content.amount === \"max\" || content.amount === \"-1\";\n const amount = isMaxRepay\n ? \"all debt\"\n : `${content.amount} ${content.asset}`;\n const rateMode = content.rateMode === \"stable\" ? 1 : 2; // 1 = stable, 2 = variable\n\n // For demonstration - in production you'd execute the actual repay\n logger.debug(\"Would repay:\", {\n asset: content.asset,\n amount: content.amount,\n assetAddress,\n rateMode: content.rateMode,\n isMaxRepay,\n });\n\n // Simulate successful transaction\n const mockTxHash =\n \"0x9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba\";\n\n const responseText = isMaxRepay\n ? `ā
Successfully repaid all ${content.asset} debt to Aave V3!\n\nTransaction hash: ${mockTxHash}\nRate mode: ${content.rateMode}\nStatus: Position closed\nHealth factor: Improved significantly\n\nš Congratulations! Your ${content.asset} debt has been fully repaid.\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`\n : `ā
Successfully repaid ${content.amount} ${content.asset} to Aave V3!\n\nTransaction hash: ${mockTxHash}\nRate mode: ${content.rateMode}\nRemaining debt: Reduced\nHealth factor: Improved\n\nYour position is now safer with reduced debt exposure.\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_REPAY\",\n asset: content.asset,\n amount: content.amount,\n rateMode: content.rateMode,\n transactionHash: mockTxHash,\n isMaxRepay,\n success: true,\n },\n });\n\n return {\n text: `Successfully repaid ${content.amount} ${content.asset} on Aave V3`,\n success: true,\n data: {\n asset: content.asset,\n amount: content.amount,\n rateMode: content.rateMode,\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"Repay operation failed:\", error);\n const errorMessage = \"Failed to repay loan on Aave. Please try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Repay 25 USDC to Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Repay operation completed successfully\",\n action: \"AAVE_REPAY\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Pay off all my ETH debt on Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"All ETH debt repaid to Aave\",\n action: \"AAVE_REPAY\",\n },\n },\n ],\n ],\n};\n\nfunction isValidRepayContent(content: any): content is RepayParams {\n logger.debug(\"Content for validation\", content);\n return (\n content &&\n typeof content.asset === \"string\" &&\n content.asset.length > 0 &&\n typeof content.amount === \"string\" &&\n (parseFloat(content.amount) > 0 ||\n content.amount === \"max\" ||\n content.amount === \"-1\") &&\n (content.rateMode === undefined ||\n content.rateMode === \"stable\" ||\n content.rateMode === \"variable\")\n );\n}\n","import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n parseUnits,\n Address,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { WithdrawParams } from \"../types\";\n\nconst withdrawTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for withdraw request:\n<response>\n <asset>USDC</asset>\n <amount>50</amount>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the withdraw request:\n- Asset: The token to withdraw (e.g., USDC, ETH, DAI, WETH)\n- Amount: The amount to withdraw (numeric value, use \"max\" or \"-1\" to withdraw all)\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const withdrawAction: Action = {\n name: \"AAVE_WITHDRAW\",\n similes: [\n \"WITHDRAW_FROM_AAVE\",\n \"REMOVE_SUPPLY\",\n \"WITHDRAW_ASSET\",\n \"TAKE_OUT\",\n \"REDEEM_ATOKEN\",\n ],\n description: \"Withdraw supplied assets from Aave V3 lending protocol\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_WITHDRAW action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const withdrawKeywords = [\"withdraw\", \"remove\", \"take out\", \"redeem\"];\n const actionKeywords = [\"from aave\", \"aave supply\", \"atoken\"];\n\n const hasWithdrawKeywords = withdrawKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return hasWithdrawKeywords || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_WITHDRAW handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: withdrawTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidWithdrawContent(content)) {\n logger.error(\"Invalid content for AAVE_WITHDRAW action.\");\n const errorMessage =\n \"Unable to process withdraw request. Please specify the asset and amount to withdraw.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid withdraw parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Get asset address (simplified - in production you'd have a mapping)\n const assetAddresses: { [key: string]: Address } = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n WETH: \"0x4200000000000000000000000000000000000006\",\n ETH: \"0x4200000000000000000000000000000000000006\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n };\n\n const assetAddress = assetAddresses[content.asset.toUpperCase()];\n if (!assetAddress) {\n const errorMessage = `Unsupported asset: ${content.asset}. Supported assets: USDC, WETH, DAI`;\n callback?.({\n text: errorMessage,\n content: { error: \"Unsupported asset\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const isMaxWithdraw = content.amount === \"max\" || content.amount === \"-1\";\n const amount = isMaxWithdraw\n ? \"all supplied funds\"\n : `${content.amount} ${content.asset}`;\n\n // For demonstration - in production you'd execute the actual withdraw\n logger.debug(\"Would withdraw:\", {\n asset: content.asset,\n amount: content.amount,\n assetAddress,\n isMaxWithdraw,\n });\n\n // Simulate successful transaction\n const mockTxHash =\n \"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\";\n\n const responseText = isMaxWithdraw\n ? `ā
Successfully withdrew all ${content.asset} from Aave V3!\n\nTransaction hash: ${mockTxHash}\nStatus: Supply position closed\nRemaining supply: 0 ${content.asset}\nHealth factor: Updated\n\nš All your ${content.asset} has been withdrawn successfully.\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`\n : `ā
Successfully withdrew ${content.amount} ${content.asset} from Aave V3!\n\nTransaction hash: ${mockTxHash}\nWithdrawn amount: ${content.amount} ${content.asset}\nRemaining supply: Reduced\nHealth factor: Updated\n\nYour ${content.asset} has been successfully withdrawn to your wallet.\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_WITHDRAW\",\n asset: content.asset,\n amount: content.amount,\n transactionHash: mockTxHash,\n isMaxWithdraw,\n success: true,\n },\n });\n\n return {\n text: `Successfully withdrew ${content.amount} ${content.asset} from Aave V3`,\n success: true,\n data: {\n asset: content.asset,\n amount: content.amount,\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"Withdraw operation failed:\", error);\n const errorMessage = \"Failed to withdraw from Aave. Please try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Withdraw 50 USDC from Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Withdraw operation completed successfully\",\n action: \"AAVE_WITHDRAW\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Withdraw all my ETH supply from Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"All ETH withdrawn from Aave\",\n action: \"AAVE_WITHDRAW\",\n },\n },\n ],\n ],\n};\n\nfunction isValidWithdrawContent(content: any): content is WithdrawParams {\n logger.debug(\"Content for validation\", content);\n return (\n content &&\n typeof content.asset === \"string\" &&\n content.asset.length > 0 &&\n typeof content.amount === \"string\" &&\n (parseFloat(content.amount) > 0 ||\n content.amount === \"max\" ||\n content.amount === \"-1\")\n );\n}\n","import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport { createPublicClient, createWalletClient, http, Address } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { RateSwitchParams } from \"../types\";\n\nconst rateSwitchTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for rate switch request:\n<response>\n <asset>USDC</asset>\n <targetRateMode>stable</targetRateMode>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the rate switch request:\n- Asset: The borrowed token to switch rates for (e.g., USDC, ETH, DAI, WETH)\n- TargetRateMode: The desired rate mode ('stable' or 'variable')\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const rateSwitchAction: Action = {\n name: \"AAVE_RATE_SWITCH\",\n similes: [\n \"SWITCH_RATE_MODE\",\n \"CHANGE_INTEREST_RATE\",\n \"SWITCH_TO_STABLE\",\n \"SWITCH_TO_VARIABLE\",\n \"CHANGE_RATE\",\n ],\n description:\n \"Switch between stable and variable interest rates on borrowed assets\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_RATE_SWITCH action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const switchKeywords = [\"switch\", \"change\", \"convert\"];\n const rateKeywords = [\"rate\", \"stable\", \"variable\", \"interest\"];\n const actionKeywords = [\"aave\", \"rate mode\"];\n\n const hasSwitchKeywords = switchKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasRateKeywords = rateKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return (hasSwitchKeywords && hasRateKeywords) || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_RATE_SWITCH handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: rateSwitchTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidRateSwitchContent(content)) {\n logger.error(\"Invalid content for AAVE_RATE_SWITCH action.\");\n const errorMessage =\n \"Unable to process rate switch request. Please specify the asset and rate mode to switch to.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid rate switch parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Get asset address (simplified - in production you'd have a mapping)\n const assetAddresses: { [key: string]: Address } = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n WETH: \"0x4200000000000000000000000000000000000006\",\n ETH: \"0x4200000000000000000000000000000000000006\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n };\n\n const assetAddress = assetAddresses[content.asset.toUpperCase()];\n if (!assetAddress) {\n const errorMessage = `Unsupported asset: ${content.asset}. Supported assets: USDC, WETH, DAI`;\n callback?.({\n text: errorMessage,\n content: { error: \"Unsupported asset\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const targetRateMode = content.targetRateMode.toLowerCase();\n const currentRateMode =\n targetRateMode === \"stable\" ? \"variable\" : \"stable\";\n\n // For demonstration - in production you'd execute the actual rate switch\n logger.debug(\"Would switch rate:\", {\n asset: content.asset,\n fromRate: currentRateMode,\n toRate: targetRateMode,\n assetAddress,\n });\n\n // Simulate successful transaction\n const mockTxHash =\n \"0xdef123456789abcdef123456789abcdef123456789abcdef123456789abcdef12\";\n\n const responseText = `ā
Successfully switched ${content.asset} interest rate to ${targetRateMode} mode!\n\nTransaction hash: ${mockTxHash}\nAsset: ${content.asset}\nPrevious rate: ${currentRateMode}\nNew rate: ${targetRateMode}\nNew APR: ~${targetRateMode === \"stable\" ? \"4.2%\" : \"3.9%\"}\n\n${\n targetRateMode === \"stable\"\n ? \"š Your rate is now fixed and protected from market volatility\"\n : \"š Your rate will now fluctuate with market conditions but typically offers better rates\"\n}\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_RATE_SWITCH\",\n asset: content.asset,\n fromRateMode: currentRateMode,\n toRateMode: targetRateMode,\n transactionHash: mockTxHash,\n success: true,\n },\n });\n\n return {\n text: `Successfully switched to ${content.targetRateMode} rate for ${content.asset}`,\n success: true,\n data: {\n asset: content.asset,\n rateMode: content.targetRateMode,\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"Rate switch operation failed:\", error);\n const errorMessage =\n \"Failed to switch interest rate mode. Please try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Switch my USDC loan to stable rate\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Interest rate switched to stable mode\",\n action: \"AAVE_RATE_SWITCH\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Change my ETH borrow to variable rate\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"ETH loan switched to variable rate\",\n action: \"AAVE_RATE_SWITCH\",\n },\n },\n ],\n ],\n};\n\nfunction isValidRateSwitchContent(content: any): content is RateSwitchParams {\n logger.debug(\"Content for validation\", content);\n return (\n content &&\n typeof content.asset === \"string\" &&\n content.asset.length > 0 &&\n typeof content.targetRateMode === \"string\" &&\n (content.targetRateMode === \"stable\" ||\n content.targetRateMode === \"variable\")\n );\n}\n","import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport { createPublicClient, createWalletClient, http, Address } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { CollateralManagementParams } from \"../types\";\n\nconst collateralManagementTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for collateral management request:\n<response>\n <asset>USDC</asset>\n <enable>true</enable>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the collateral management request:\n- Asset: The token to manage as collateral (e.g., USDC, ETH, DAI, WETH)\n- Enable: Whether to enable or disable as collateral (true/false)\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const collateralManagementAction: Action = {\n name: \"AAVE_COLLATERAL_MANAGEMENT\",\n similes: [\n \"ENABLE_COLLATERAL\",\n \"DISABLE_COLLATERAL\",\n \"TOGGLE_COLLATERAL\",\n \"MANAGE_COLLATERAL\",\n \"SET_COLLATERAL\",\n ],\n description: \"Enable or disable assets as collateral in Aave V3\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_COLLATERAL_MANAGEMENT action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const collateralKeywords = [\n \"collateral\",\n \"enable\",\n \"disable\",\n \"toggle\",\n \"manage\",\n ];\n const actionKeywords = [\n \"as collateral\",\n \"for borrowing\",\n \"aave collateral\",\n ];\n\n const hasCollateralKeywords = collateralKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return hasCollateralKeywords || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_COLLATERAL_MANAGEMENT handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: collateralManagementTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidCollateralContent(content)) {\n logger.error(\"Invalid content for AAVE_COLLATERAL_MANAGEMENT action.\");\n const errorMessage =\n \"Unable to process collateral management request. Please specify the asset and action (enable/disable).\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid collateral parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Get asset address (simplified - in production you'd have a mapping)\n const assetAddresses: { [key: string]: Address } = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n WETH: \"0x4200000000000000000000000000000000000006\",\n ETH: \"0x4200000000000000000000000000000000000006\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n };\n\n const assetAddress = assetAddresses[content.asset.toUpperCase()];\n if (!assetAddress) {\n const errorMessage = `Unsupported asset: ${content.asset}. Supported assets: USDC, WETH, DAI`;\n callback?.({\n text: errorMessage,\n content: { error: \"Unsupported asset\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const isEnabling = content.enable;\n const action = isEnabling ? \"enabled\" : \"disabled\";\n const actionVerb = isEnabling ? \"enable\" : \"disable\";\n\n // For demonstration - in production you'd execute the actual collateral management\n logger.debug(\"Would manage collateral:\", {\n asset: content.asset,\n enable: content.enable,\n assetAddress,\n });\n\n // Simulate successful transaction\n const mockTxHash =\n \"0xcdef456789abcdef456789abcdef456789abcdef456789abcdef456789abcdef45\";\n\n const responseText = `ā
Successfully ${action} ${content.asset} as collateral in Aave V3!\n\nTransaction hash: ${mockTxHash}\nAsset: ${content.asset}\nStatus: ${action.charAt(0).toUpperCase() + action.slice(1)} as collateral\n${\n isEnabling\n ? `\nš° Your ${content.asset} can now be used as collateral for borrowing\nš This increases your borrowing power\nā ļø Remember that collateral can be liquidated if health factor drops below 1.0`\n : `\nš Your ${content.asset} is no longer being used as collateral\nš This reduces your borrowing power but protects the asset from liquidation\nā
Position is safer but with reduced leverage capability`\n}\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_COLLATERAL_MANAGEMENT\",\n asset: content.asset,\n enable: content.enable,\n transactionHash: mockTxHash,\n success: true,\n },\n });\n\n return {\n text: `Successfully ${content.enable ? \"enabled\" : \"disabled\"} ${content.asset} as collateral on Aave V3`,\n success: true,\n data: {\n asset: content.asset,\n action: content.enable ? \"enable\" : \"disable\",\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"Collateral management operation failed:\", error);\n const errorMessage =\n \"Failed to manage collateral on Aave. Please try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Enable USDC as collateral on Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"USDC enabled as collateral\",\n action: \"AAVE_COLLATERAL_MANAGEMENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Disable ETH collateral to protect it\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"ETH collateral disabled successfully\",\n action: \"AAVE_COLLATERAL_MANAGEMENT\",\n },\n },\n ],\n ],\n};\n\nfunction isValidCollateralContent(\n content: any,\n): content is CollateralManagementParams {\n logger.debug(\"Content for validation\", content);\n return (\n content &&\n typeof content.asset === \"string\" &&\n content.asset.length > 0 &&\n typeof content.enable === \"boolean\"\n );\n}\n","import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport { createPublicClient, createWalletClient, http, Address } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { eModeParams } from \"../types\";\n\nconst eModeTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for eMode request:\n<response>\n <categoryId>1</categoryId>\n <enable>true</enable>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the eMode request:\n- CategoryId: The eMode category ID (1 for stablecoins, 2 for ETH correlated assets)\n- Enable: Whether to enable or disable eMode (true/false)\n\nCommon eMode categories:\n- Category 1: Stablecoins (USDC, DAI, USDT)\n- Category 2: ETH derivatives (ETH, stETH, wstETH)\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const eModeAction: Action = {\n name: \"AAVE_EMODE\",\n similes: [\n \"ENABLE_EMODE\",\n \"DISABLE_EMODE\",\n \"TOGGLE_EMODE\",\n \"EFFICIENCY_MODE\",\n \"HIGH_EFFICIENCY\",\n ],\n description:\n \"Enable or disable Efficiency Mode (eMode) in Aave V3 for higher borrowing power with correlated assets\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_EMODE action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const eModeKeywords = [\n \"emode\",\n \"efficiency mode\",\n \"high efficiency\",\n \"enable emode\",\n \"disable emode\",\n ];\n const actionKeywords = [\n \"aave emode\",\n \"efficiency\",\n \"higher ltv\",\n \"better rates\",\n ];\n\n const hasEModeKeywords = eModeKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return hasEModeKeywords || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_EMODE handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: eModeTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidEModeContent(content)) {\n logger.error(\"Invalid content for AAVE_EMODE action.\");\n const errorMessage =\n \"Unable to process e-mode request. Please specify the category ID.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid e-mode parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const isEnabling = content?.enable ?? false;\n const categoryId = content?.categoryId || 0;\n const action = isEnabling ? \"enabled\" : \"disabled\";\n\n // Get category information\n const categoryInfo = getCategoryInfo(categoryId);\n\n // For demonstration - in production you'd execute the actual eMode setting\n logger.debug(\"Would set eMode:\", {\n categoryId,\n enable: content.enable,\n categoryInfo,\n });\n\n // Simulate successful transaction\n const mockTxHash =\n \"0xedef789abcdef789abcdef789abcdef789abcdef789abcdef789abcdef789abcdef\";\n\n const responseText = isEnabling\n ? `ā
Successfully enabled Efficiency Mode (eMode) in Aave V3!\n\nTransaction hash: ${mockTxHash}\nCategory: ${categoryId} - ${categoryInfo.name}\nStatus: eMode enabled\n\nBenefits of eMode:\nšÆ Higher LTV: Up to ${categoryInfo.ltv}% (vs standard ~80%)\nš Higher Liquidation Threshold: ${categoryInfo.liquidationThreshold}%\nš° Better borrowing power with correlated assets\nā” Optimized for ${categoryInfo.description}\n\nā ļø Remember: eMode works best when your collateral and borrowed assets are in the same category.\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`\n : `ā
Successfully disabled Efficiency Mode (eMode) in Aave V3!\n\nTransaction hash: ${mockTxHash}\nStatus: eMode disabled\nPrevious Category: ${categoryId} - ${categoryInfo.name}\n\nChanges:\nš LTV reduced to standard rates (~80%)\nš Liquidation threshold reduced to standard rates\nš Back to standard borrowing parameters\nā
More flexibility to use diverse assets\n\nNote: This is a demonstration. In production, actual blockchain transactions would be executed.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_EMODE\",\n categoryId: content?.categoryId || 0,\n enable: content?.enable ?? false,\n categoryInfo,\n transactionHash: mockTxHash,\n success: true,\n },\n });\n\n return {\n text: `Successfully ${categoryId === 0 ? \"disabled\" : \"enabled\"} E-Mode on Aave V3`,\n success: true,\n data: {\n categoryId: categoryId,\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"E-Mode operation failed:\", error);\n const errorMessage = \"Failed to set e-mode. Please try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Enable eMode for stablecoins on Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Efficiency Mode enabled for stablecoin category\",\n action: \"AAVE_EMODE\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Disable efficiency mode on Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Efficiency Mode disabled\",\n action: \"AAVE_EMODE\",\n },\n },\n ],\n ],\n};\n\nfunction isValidEModeContent(content: any): content is eModeParams {\n logger.debug(\"Content for validation\", content);\n return (\n content &&\n typeof content.categoryId === \"number\" &&\n content.categoryId >= 0 &&\n content.categoryId <= 2 &&\n typeof content.enable === \"boolean\"\n );\n}\n\nfunction getCategoryInfo(categoryId: number): {\n name: string;\n description: string;\n ltv: number;\n liquidationThreshold: number;\n} {\n switch (categoryId) {\n case 1:\n return {\n name: \"Stablecoins\",\n description: \"USD-pegged stablecoins (USDC, DAI, USDT)\",\n ltv: 93,\n liquidationThreshold: 95,\n };\n case 2:\n return {\n name: \"ETH Correlated\",\n description: \"ETH and ETH derivative assets (ETH, stETH, wstETH)\",\n ltv: 90,\n liquidationThreshold: 93,\n };\n default:\n return {\n name: \"Disabled\",\n description: \"Standard mode with diverse assets\",\n ltv: 80,\n liquidationThreshold: 85,\n };\n }\n}\n","import {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n ModelType,\n State,\n composePromptFromState,\n logger,\n parseKeyValueXml,\n} from \"@elizaos/core\";\nimport { createPublicClient, createWalletClient, http, Address } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\nimport { FlashLoanActionParams } from \"../types\";\n\nconst flashLoanTemplate = `Respond with an XML block containing only the extracted values. Use key-value pairs.\n\nExample response for flash loan request:\n<response>\n <assets>USDC,ETH</assets>\n <amounts>1000,0.5</amounts>\n <receiverAddress>0x1234567890abcdef1234567890abcdef12345678</receiverAddress>\n <params></params>\n</response>\n\n## Recent Messages\n\n{{recentMessages}}\n\nGiven the recent messages, extract the following information about the flash loan request:\n- Assets: Comma-separated list of tokens to flash loan (e.g., USDC, ETH, DAI)\n- Amounts: Comma-separated list of amounts corresponding to each asset\n- ReceiverAddress: Optional address of the flash loan receiver contract (defaults to user address)\n- Params: Optional additional parameters for the flash loan (usually empty)\n\nRespond with an XML block containing only the extracted values.`;\n\nexport const flashLoanAction: Action = {\n name: \"AAVE_FLASH_LOAN\",\n similes: [\n \"FLASH_LOAN\",\n \"GET_FLASH_LOAN\",\n \"EXECUTE_FLASH_LOAN\",\n \"ARBITRAGE_FLASH_LOAN\",\n \"INSTANT_LOAN\",\n ],\n description:\n \"Execute a flash loan from Aave V3 for arbitrage or other advanced strategies\",\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n logger.debug(\"Validating AAVE_FLASH_LOAN action\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n logger.error(\"BASE_RPC_URL and WALLET_PRIVATE_KEY are required\");\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const flashLoanKeywords = [\n \"flash loan\",\n \"flashloan\",\n \"instant loan\",\n \"arbitrage\",\n \"flash borrow\",\n ];\n const actionKeywords = [\"aave flash\", \"from aave\", \"flash loan aave\"];\n\n const hasFlashLoanKeywords = flashLoanKeywords.some((keyword) =>\n text.includes(keyword),\n );\n const hasActionKeywords = actionKeywords.some((keyword) =>\n text.includes(keyword),\n );\n\n return hasFlashLoanKeywords || hasActionKeywords;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options: { [key: string]: unknown } | undefined,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n logger.log(\"Starting AAVE_FLASH_LOAN handler...\");\n\n let currentState = state;\n if (!currentState) {\n currentState = await runtime.composeState(message);\n } else {\n currentState = await runtime.composeState(message, [\"RECENT_MESSAGES\"]);\n }\n\n const prompt = composePromptFromState({\n state: currentState!,\n template: flashLoanTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const content = parseKeyValueXml(result);\n logger.debug(\"Parsed content:\", content);\n\n if (!isValidFlashLoanContent(content)) {\n logger.error(\"Invalid content for AAVE_FLASH_LOAN action.\");\n const errorMessage =\n \"Unable to process flash loan request. Please specify the asset, amount, and operation details.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Invalid flash loan parameters\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n try {\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const privateKey = runtime.getSetting(\"WALLET_PRIVATE_KEY\");\n\n if (!rpcUrl || !privateKey) {\n const errorMessage =\n \"Configuration error: RPC URL and private key are required.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Missing configuration\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Parse assets and amounts\n const assetsStr =\n typeof content.assets === \"string\"\n ? content.assets\n : content.assets.join(\",\");\n const amountsStr =\n typeof content.amounts === \"string\"\n ? content.amounts\n : content.amounts.join(\",\");\n\n const assets = assetsStr.split(\",\").map((asset: string) => asset.trim());\n const amounts = amountsStr\n .split(\",\")\n .map((amount: string) => amount.trim());\n\n if (assets.length !== amounts.length) {\n const errorMessage =\n \"Error: The number of assets must match the number of amounts.\";\n callback?.({\n text: errorMessage,\n content: { error: \"Asset/amount mismatch\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n // Get asset addresses (simplified - in production you'd have a mapping)\n const assetAddresses: { [key: string]: Address } = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n WETH: \"0x4200000000000000000000000000000000000006\",\n ETH: \"0x4200000000000000000000000000000000000006\",\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\",\n };\n\n // Validate all assets are supported\n const unsupportedAssets = assets.filter(\n (asset: string) => !assetAddresses[asset.toUpperCase()],\n );\n if (unsupportedAssets.length > 0) {\n const errorMessage = `Unsupported assets: ${unsupportedAssets.join(\", \")}. Supported assets: USDC, WETH, DAI`;\n callback?.({\n text: errorMessage,\n content: { error: \"Unsupported assets\" },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n const resolvedAssetAddresses = assets.map(\n (asset: string) => assetAddresses[asset.toUpperCase()],\n );\n\n // For demonstration - in production you'd execute the actual flash loan\n logger.debug(\"Would execute flash loan:\", {\n assets,\n amounts,\n assetAddresses: resolvedAssetAddresses,\n receiverAddress: content.receiverAddress || \"user_address\",\n params: content.params || \"\",\n });\n\n // Calculate estimated fees (Aave flash loan fee is typically 0.09%)\n const totalFeesEstimate = amounts.reduce(\n (total: string, amount: string, index: number) => {\n const amountNum = parseFloat(amount);\n const feeAmount = (amountNum * 0.0009).toFixed(6); // 0.09% fee\n return total + `\\n- ${assets[index]}: ${feeAmount} (0.09% fee)`;\n },\n \"\",\n );\n\n // Simulate successful transaction\n const mockTxHash =\n \"0xfed456789abcdef456789abcdef456789abcdef456789abcdef456789abcdef456\";\n\n const responseText = `ā
Flash loan executed successfully on Aave V3!\n\nTransaction hash: ${mockTxHash}\nFlash loan details:\n${assets.map((asset: string, i: number) => `- ${amounts[i]} ${asset}`).join(\"\\n\")}\n\nEstimated fees:${totalFeesEstimate}\n\nā ļø IMPORTANT NOTES:\n- Flash loans must be repaid within the same transaction\n- You need a receiver contract to handle the flash loan logic\n- Ensure your arbitrage/strategy covers the fees\n- This is an advanced feature requiring smart contract development\n\nš Use cases:\n- Arbitrage opportunities\n- Debt refinancing\n- Collateral swapping\n- Liquidation protection\n\nNote: This is a demonstration. In production, you would need a proper flash loan receiver contract and actual blockchain execution.`;\n\n callback?.({\n text: responseText,\n content: {\n action: \"AAVE_FLASH_LOAN\",\n assets,\n amounts,\n receiverAddress: content.receiverAddress || \"user_address\",\n params: content.params || \"\",\n transactionHash: mockTxHash,\n estimatedFees: totalFeesEstimate,\n success: true,\n },\n });\n\n return {\n text: `Successfully executed flash loan for ${assets.join(\", \")}`,\n success: true,\n data: {\n assets: content.assets,\n amounts: content.amounts,\n transactionHash: mockTxHash,\n },\n };\n } catch (error) {\n logger.error(\"Flash loan operation failed:\", error);\n const errorMessage = \"Failed to execute flash loan. Please try again.\";\n callback?.({\n text: errorMessage,\n content: {\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Execute a flash loan of 1000 USDC for arbitrage\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Flash loan executed successfully\",\n action: \"AAVE_FLASH_LOAN\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Get flash loan of 0.5 ETH and 500 USDC from Aave\",\n },\n },\n {\n name: \"{{user2}}\",\n content: {\n text: \"Multi-asset flash loan completed\",\n action: \"AAVE_FLASH_LOAN\",\n },\n },\n ],\n ],\n};\n\nfunction isValidFlashLoanContent(\n content: any,\n): content is FlashLoanActionParams {\n logger.debug(\"Content for validation\", content);\n\n if (\n !content ||\n !content.assets ||\n (typeof content.assets !== \"string\" && !Array.isArray(content.assets)) ||\n !content.amounts ||\n (typeof content.amounts !== \"string\" && !Array.isArray(content.amounts))\n ) {\n return false;\n }\n\n const assetsStr =\n typeof content.assets === \"string\"\n ? content.assets\n : content.assets.join(\",\");\n const amountsStr =\n typeof content.amounts === \"string\"\n ? content.amounts\n : content.amounts.join(\",\");\n\n const assets = assetsStr.split(\",\").map((asset: string) => asset.trim());\n const amounts = amountsStr.split(\",\").map((amount: string) => amount.trim());\n\n // Check that we have at least one asset and amount\n if (assets.length === 0 || amounts.length === 0) {\n return false;\n }\n\n // Check that assets and amounts match in length\n if (assets.length !== amounts.length) {\n return false;\n }\n\n // Validate that all amounts are numeric\n const validAmounts = amounts.every(\n (amount: string) => !isNaN(parseFloat(amount)) && parseFloat(amount) > 0,\n );\n\n // Validate that all assets are non-empty strings\n const validAssets = assets.every((asset: string) => asset.length > 0);\n\n return validAmounts && validAssets;\n}\n","import {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n logger,\n} from \"@elizaos/core\";\nimport BigNumber from \"bignumber.js\";\nimport { createPublicClient, http } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\n\nexport const positionContextProvider: Provider = {\n name: \"positionContextProvider\",\n description:\n \"Provides current Aave V3 position context including supplies, borrows, and health metrics\",\n dynamic: true,\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n logger.debug(\"positionContextProvider::get\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const walletAddress = runtime.getSetting(\"WALLET_ADDRESS\");\n\n if (!rpcUrl) {\n logger.error(\"BASE_RPC_URL not configured\");\n return {\n text: \"Position data unavailable - RPC URL not configured\",\n data: { error: \"RPC URL required\" },\n };\n }\n\n if (!walletAddress) {\n logger.debug(\n \"positionContextProvider: No wallet address configured, returning neutral context\",\n );\n return {\n text: \"Position data available when wallet address is provided\",\n data: { provider: \"positionContextProvider\", status: \"neutral\" },\n };\n }\n\n try {\n const publicClient = createPublicClient({\n chain: base,\n transport: http(rpcUrl),\n });\n\n // Get user account data from Aave Pool\n const poolAddress = AaveV3Base.POOL;\n const userData = await publicClient.readContract({\n address: poolAddress as `0x${string}`,\n abi: [\n {\n inputs: [\n { internalType: \"address\", name: \"user\", type: \"address\" },\n ],\n name: \"getUserAccountData\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"totalCollateralETH\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"totalDebtETH\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"availableBorrowsETH\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"currentLiquidationThreshold\",\n type: \"uint256\",\n },\n { internalType: \"uint256\", name: \"ltv\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"healthFactor\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n functionName: \"getUserAccountData\",\n args: [walletAddress as `0x${string}`],\n });\n\n const [\n totalCollateralETH,\n totalDebtETH,\n availableBorrowsETH,\n currentLiquidationThreshold,\n ltv,\n healthFactor,\n ] = userData as readonly [bigint, bigint, bigint, bigint, bigint, bigint];\n\n // Convert to readable format\n const totalCollateralBN = new BigNumber(\n totalCollateralETH.toString(),\n ).dividedBy(1e18);\n const totalDebtBN = new BigNumber(totalDebtETH.toString()).dividedBy(\n 1e18,\n );\n const availableBorrowsBN = new BigNumber(\n availableBorrowsETH.toString(),\n ).dividedBy(1e18);\n const healthFactorBN = new BigNumber(healthFactor.toString()).dividedBy(\n 1e18,\n );\n\n // Calculate current LTV\n const currentLTV = totalCollateralBN.gt(0)\n ? totalDebtBN.dividedBy(totalCollateralBN).times(100)\n : new BigNumber(0);\n\n // Format health factor\n const healthFactorFormatted = healthFactorBN.isFinite()\n ? healthFactorBN.toFixed(2)\n : \"ā\";\n\n // Determine position status\n let positionStatus = \"No Position\";\n if (totalCollateralBN.gt(0) && totalDebtBN.gt(0)) {\n positionStatus = \"Active Lending & Borrowing\";\n } else if (totalCollateralBN.gt(0)) {\n positionStatus = \"Lending Only\";\n } else if (totalDebtBN.gt(0)) {\n positionStatus = \"Borrowing Only\";\n }\n\n // Create position summary\n let positionSummary = `Aave V3 Position Summary:\n\nStatus: ${positionStatus}\nTotal Collateral: ${totalCollateralBN.toFixed(4)} ETH\nTotal Debt: ${totalDebtBN.toFixed(4)} ETH\nAvailable Borrows: ${availableBorrowsBN.toFixed(4)} ETH\nCurrent LTV: ${currentLTV.toFixed(1)}%\nHealth Factor: ${healthFactorFormatted}`;\n\n // Add recommendations based on position\n const recommendations: string[] = [];\n\n if (totalCollateralBN.eq(0) && totalDebtBN.eq(0)) {\n recommendations.push(\n \"No active position - consider supplying assets to earn yield\",\n );\n recommendations.push(\n \"Start with stable assets like USDC for lower risk\",\n );\n } else if (totalDebtBN.eq(0)) {\n recommendations.push(\n \"Consider borrowing against your collateral if you need liquidity\",\n );\n recommendations.push(\n \"Monitor supply APY rates for optimization opportunities\",\n );\n } else if (healthFactorBN.lt(1.5) && healthFactorBN.isFinite()) {\n recommendations.push(\n \"ā ļø Health factor is low - consider adding collateral or repaying debt\",\n );\n recommendations.push(\"Monitor position closely to avoid liquidation\");\n } else {\n recommendations.push(\n \"Position looks healthy - monitor rates for optimization\",\n );\n if (availableBorrowsBN.gt(0)) {\n recommendations.push(\n `You can still borrow up to ${availableBorrowsBN.toFixed(4)} ETH`,\n );\n }\n }\n\n if (recommendations.length > 0) {\n positionSummary += `\\n\\nRecommendations:\\n${recommendations.map((r) => `- ${r}`).join(\"\\n\")}`;\n }\n\n return {\n text: positionSummary,\n data: {\n address: walletAddress,\n status: positionStatus.toLowerCase().replace(/\\s+/g, \"_\"),\n totalCollateral: totalCollateralBN.toNumber(),\n totalDebt: totalDebtBN.toNumber(),\n availableBorrows: availableBorrowsBN.toNumber(),\n currentLTV: currentLTV.toNumber(),\n healthFactor: healthFactorBN.isFinite()\n ? healthFactorBN.toNumber()\n : null,\n recommendations,\n hasSupplies: totalCollateralBN.gt(0),\n hasBorrows: totalDebtBN.gt(0),\n liquidationThreshold: new BigNumber(\n currentLiquidationThreshold.toString(),\n )\n .dividedBy(10000)\n .times(100)\n .toNumber(),\n },\n values: {\n totalCollateral: totalCollateralBN.toNumber(),\n totalDebt: totalDebtBN.toNumber(),\n availableBorrows: availableBorrowsBN.toNumber(),\n currentLTV: currentLTV.toNumber(),\n healthFactor: healthFactorBN.isFinite()\n ? healthFactorBN.toNumber()\n : null,\n utilizationRate: totalCollateralBN.gt(0)\n ? totalDebtBN.dividedBy(totalCollateralBN).toNumber()\n : 0,\n },\n };\n } catch (error) {\n logger.error(\"positionContextProvider: Error fetching position data:\", {\n error: error instanceof Error ? error.message : String(error),\n address: walletAddress,\n rpcUrl,\n });\n return {\n text: \"Position data temporarily unavailable\",\n data: {\n provider: \"positionContextProvider\",\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n address: walletAddress,\n },\n };\n }\n },\n};\n","import {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n logger,\n} from \"@elizaos/core\";\nimport BigNumber from \"bignumber.js\";\nimport { createPublicClient, http } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { AaveV3Base } from \"@bgd-labs/aave-address-book\";\n\nexport const healthFactorProvider: Provider = {\n name: \"healthFactorProvider\",\n description:\n \"Provides detailed health factor analysis and risk assessment for Aave V3 positions\",\n dynamic: true,\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n logger.debug(\"healthFactorProvider::get\");\n\n const rpcUrl = runtime.getSetting(\"BASE_RPC_URL\");\n const walletAddress = runtime.getSetting(\"WALLET_ADDRESS\");\n\n if (!rpcUrl) {\n logger.error(\"BASE_RPC_URL not configured\");\n return {\n text: \"Health factor data unavailable - RPC URL not configured\",\n data: { error: \"RPC URL required\" },\n };\n }\n\n if (!walletAddress) {\n logger.debug(\n \"healthFactorProvider: No wallet address configured, returning neutral context\",\n );\n return {\n text: \"Health factor data available when wallet address is provided\",\n data: { provider: \"healthFactorProvider\", status: \"neutral\" },\n };\n }\n\n try {\n const publicClient = createPublicClient({\n chain: base,\n transport: http(rpcUrl),\n });\n\n // Get user account data from Aave Pool\n const poolAddress = AaveV3Base.POOL;\n const userData = await publicClient.readContract({\n address: poolAddress as `0x${string}`,\n abi: [\n {\n inputs: [\n { internalType: \"address\", name: \"user\", type: \"address\" },\n ],\n name: \"getUserAccountData\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"totalCollateralETH\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"totalDebtETH\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"availableBorrowsETH\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"currentLiquidationThreshold\",\n type: \"uint256\",\n },\n { internalType: \"uint256\", name: \"ltv\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"healthFactor\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n functionName: \"getUserAccountData\",\n args: [walletAddress as `0x${string}`],\n });\n\n const [\n totalCollateralETH,\n totalDebtETH,\n availableBorrowsETH,\n currentLiquidationThreshold,\n ltv,\n healthFactor,\n ] = userData as readonly [bigint, bigint, bigint, bigint, bigint, bigint];\n\n // Convert to BigNumber for calculations\n const healthFactorBN = new BigNumber(healthFactor.toString()).dividedBy(\n 1e18,\n );\n const totalCollateralBN = new BigNumber(\n totalCollateralETH.toString(),\n ).dividedBy(1e18);\n const totalDebtBN = new BigNumber(totalDebtETH.toString()).dividedBy(\n 1e18,\n );\n\n if (totalDebtBN.eq(0)) {\n return {\n text: \"No debt position found - health factor analysis not applicable\",\n data: {\n address: walletAddress,\n healthFactor: null,\n status: \"no_debt\",\n totalCollateral: totalCollateralBN.toNumber(),\n totalDebt: 0,\n },\n values: {\n healthFactor: null,\n totalCollateral: totalCollateralBN.toNumber(),\n totalDebt: 0,\n },\n };\n }\n\n // Analyze health factor\n const healthFactorFormatted = healthFactorBN.isFinite()\n ? healthFactorBN.toFixed(2)\n : \"ā\";\n\n const analysis = analyzeHealthFactor(healthFactorBN);\n const recommendations = getRecommendations(healthFactorBN);\n\n // Calculate LTV\n const ltvBN = new BigNumber(ltv.toString()).dividedBy(10000);\n const currentLTV = totalCollateralBN.gt(0)\n ? totalDebtBN.dividedBy(totalCollateralBN).times(100)\n : new BigNumber(0);\n\n // Calculate liquidation risk\n let liquidationInfo = \"\";\n if (healthFactorBN.lt(1.5) && healthFactorBN.isFinite()) {\n const liquidationThresholdBN = new BigNumber(\n currentLiquidationThreshold.toString(),\n ).dividedBy(10000);\n const collateralDropToLiquidation = totalCollateralBN\n .times(healthFactorBN.minus(1).dividedBy(healthFactorBN))\n .times(100);\n\n liquidationInfo = `\nLiquidation Risk Analysis:\n- Collateral can drop ${collateralDropToLiquidation.toFixed(1)}% before liquidation\n- Current liquidation threshold: ${liquidationThresholdBN.times(100).toFixed(1)}%`;\n }\n\n const summary = `Health Factor Analysis:\n\n${analysis.emoji} Health Factor: ${healthFactorFormatted}\nStatus: ${analysis.status}\nRisk Level: ${analysis.riskLevel}\n\nSafety Metrics:\n- Current LTV: ${currentLTV.toFixed(1)}% / Max LTV: ${ltvBN.times(100).toFixed(1)}%\n- Total Collateral: ${totalCollateralBN.toFixed(4)} ETH\n- Total Debt: ${totalDebtBN.toFixed(4)} ETH\n${liquidationInfo}\n\nRecommendations:\n${recommendations.map((r) => `- ${r}`).join(\"\\n\")}\n\nRemember: Health Factor > 1.0 prevents liquidation. Aim for > 1.5 for safety.`;\n\n return {\n text: summary,\n data: {\n address: walletAddress,\n healthFactor: healthFactorBN.toNumber(),\n status: analysis.status.toLowerCase().replace(\" \", \"_\"),\n riskLevel: analysis.riskLevel,\n totalCollateral: totalCollateralBN.toNumber(),\n totalDebt: totalDebtBN.toNumber(),\n currentLTV: currentLTV.toNumber(),\n maxLTV: ltvBN.times(100).toNumber(),\n recommendations,\n liquidationThreshold: new BigNumber(\n currentLiquidationThreshold.toString(),\n )\n .dividedBy(10000)\n .times(100)\n .toNumber(),\n },\n values: {\n healthFactor: healthFactorBN.toNumber(),\n totalCollateral: totalCollateralBN.toNumber(),\n totalDebt: totalDebtBN.toNumber(),\n currentLTV: currentLTV.toNumber(),\n riskScore: calculateRiskScore(healthFactorBN),\n },\n };\n } catch (error) {\n logger.error(\"healthFactorProvider: Error fetching health factor data:\", {\n error: error instanceof Error ? error.message : String(error),\n address: walletAddress,\n rpcUrl,\n });\n return {\n text: \"Health factor data temporarily unavailable\",\n data: {\n provider: \"healthFactorProvider\",\n status: \"error\",\n error: error instanceof Error ? error.message : String(error),\n address: walletAddress,\n },\n };\n }\n },\n};\n\nfunction analyzeHealthFactor(healthFactor: BigNumber): {\n status: string;\n riskLevel: string;\n emoji: string;\n} {\n if (!healthFactor.isFinite()) {\n return {\n status: \"No Debt Position\",\n riskLevel: \"No Risk\",\n emoji: \"š¢\",\n };\n }\n\n if (healthFactor.lt(1)) {\n return {\n status: \"LIQUIDATABLE\",\n riskLevel: \"EXTREME - Liquidation Active\",\n emoji: \"š“šØ\",\n };\n } else if (healthFactor.lt(1.1)) {\n return {\n status: \"CRITICAL\",\n riskLevel: \"Very High - Immediate Action Required\",\n emoji: \"š“\",\n };\n } else if (healthFactor.lt(1.5)) {\n return {\n status: \"RISKY\",\n riskLevel: \"High - Monitor Closely\",\n emoji: \"š”\",\n };\n } else if (healthFactor.lt(2)) {\n return {\n status: \"MODERATE\",\n riskLevel: \"Medium - Acceptable Risk\",\n emoji: \"š¢\",\n };\n } else if (healthFactor.lt(3)) {\n return {\n status: \"SAFE\",\n riskLevel: \"Low\",\n emoji: \"š¢\",\n };\n } else {\n return {\n status: \"VERY SAFE\",\n riskLevel: \"Very Low\",\n emoji: \"š¢\",\n };\n }\n}\n\nfunction getRecommendations(healthFactor: BigNumber): string[] {\n const recommendations: string[] = [];\n\n if (!healthFactor.isFinite()) {\n recommendations.push(\n \"Consider borrowing against your collateral to put it to work\",\n );\n recommendations.push(\"Your position is risk-free with no debt\");\n return recommendations;\n }\n\n if (healthFactor.lt(1.1)) {\n recommendations.push(\n \"šØ URGENT: Add collateral immediately to avoid liquidation\",\n );\n recommendations.push(\"šØ URGENT: Repay debt to improve health factor\");\n recommendations.push(\n \"Consider using a flash loan to restructure your position\",\n );\n } else if (healthFactor.lt(1.5)) {\n recommendations.push(\"Add more collateral to create a safety buffer\");\n recommendations.push(\n \"Consider repaying some debt to improve your position\",\n );\n recommendations.push(\"Monitor market prices closely for your assets\");\n recommendations.push(\"Set up alerts for health factor changes\");\n } else if (healthFactor.lt(2)) {\n recommendations.push(\n \"Your position is relatively safe but monitor regularly\",\n );\n recommendations.push(\"Consider your risk tolerance before borrowing more\");\n } else {\n recommendations.push(\"Your position is very safe\");\n recommendations.push(\"You have room to borrow more if needed\");\n recommendations.push(\n \"Consider enabling eMode for better capital efficiency\",\n );\n }\n\n return recommendations;\n}\n\nfunction calculateRiskScore(healthFactor: BigNumber): number {\n if (!healthFactor.isFinite()) {\n return 0; // No risk\n }\n\n if (healthFactor.lt(1)) {\n return 100; // Maximum risk\n } else if (healthFactor.lt(1.1)) {\n return 90;\n } else if (healthFactor.lt(1.5)) {\n return 70;\n } else if (healthFactor.lt(2)) {\n return 40;\n } else if (healthFactor.lt(3)) {\n return 20;\n } else {\n return 10; // Very low risk\n }\n}\n","import BigNumber from \"bignumber.js\";\nimport { Address, Hash, Hex } from \"viem\";\n\n// Type exports for better compatibility\nexport { BigNumber };\nexport type { Address, Hash, Hex };\n\n/**\n * Aave V3 User Account Data\n */\nexport interface UserAccountData {\n totalCollateralETH: BigNumber;\n totalDebtETH: BigNumber;\n availableBorrowsETH: BigNumber;\n currentLiquidationThreshold: BigNumber;\n ltv: BigNumber;\n healthFactor: BigNumber;\n}\n\n/**\n * Aave Position Data\n */\nexport interface AavePosition {\n supplies: AaveAssetPosition[];\n borrows: AaveAssetPosition[];\n healthFactor: number;\n totalCollateralETH: BigNumber;\n totalDebtETH: BigNumber;\n availableBorrowsETH: BigNumber;\n currentLTV: number;\n liquidationThreshold: number;\n eModeCategory: number;\n eModeEnabled: boolean;\n}\n\n/**\n * Individual Asset Position\n */\nexport interface AaveAssetPosition {\n asset: string;\n symbol: string;\n balance: BigNumber;\n apy: number;\n isCollateral: boolean;\n interestRateMode?: InterestRateMode;\n stableRate?: number;\n variableRate?: number;\n}\n\n/**\n * Interest Rate Mode Enum\n */\nexport enum InterestRateMode {\n NONE = 0,\n STABLE = 1,\n VARIABLE = 2,\n}\n\n/**\n * Flash Loan Parameters\n */\nexport interface FlashLoanParams {\n assets: string[];\n amounts: BigNumber[];\n modes: number[];\n onBehalfOf: string;\n params: string;\n referralCode: number;\n}\n\n/**\n * Flash Loan Result\n */\nexport interface FlashLoanResult {\n transactionHash: string;\n totalFees: BigNumber;\n executionResult: any;\n gasUsed: BigNumber;\n}\n\n/**\n * eMode Category Data\n */\nexport interface eModeCategory {\n id: number;\n ltv: number;\n liquidationThreshold: number;\n liquidationBonus: number;\n priceSource: string;\n label: string;\n}\n\n/**\n * eMode Operation Result\n */\nexport interface eModeResult {\n transactionHash: string;\n categoryId: number;\n enabled: boolean;\n ltvImprovement: number;\n liquidationThresholdImprovement: number;\n}\n\n/**\n * Supply Operation Result\n */\nexport interface SupplyResult {\n transactionHash: string;\n asset: string;\n amount: BigNumber;\n aTokenBalance: BigNumber;\n apy: number;\n collateralEnabled: boolean;\n}\n\n/**\n * Borrow Operation Result\n */\nexport interface BorrowResult {\n transactionHash: string;\n asset: string;\n amount: BigNumber;\n interestRateMode: InterestRateMode;\n rate: number;\n healthFactor: BigNumber;\n}\n\n/**\n * Repay Operation Result\n */\nexport interface RepayResult {\n transactionHash: string;\n asset: string;\n amount: BigNumber;\n remainingDebt: BigNumber;\n healthFactor: BigNumber;\n}\n\n/**\n * Withdraw Operation Result\n */\nexport interface WithdrawResult {\n transactionHash: string;\n asset: string;\n amount: BigNumber;\n remainingSupply: BigNumber;\n healthFactor: BigNumber;\n}\n\n/**\n * Rate Switch Operation Result\n */\nexport interface RateSwitchResult {\n transactionHash: string;\n asset: string;\n newRateMode: InterestRateMode;\n newRate: number;\n previousRate: number;\n projectedSavings: BigNumber;\n}\n\n/**\n * Collateral Management Result\n */\nexport interface CollateralResult {\n transactionHash: string;\n asset: string;\n enabled: boolean;\n healthFactorBefore: BigNumber;\n healthFactorAfter: BigNumber;\n availableBorrowsChange: BigNumber;\n}\n\n/**\n * Reserve Data from Aave Protocol\n */\nexport interface ReserveData {\n underlyingAsset: string;\n symbol: string;\n decimals: number;\n liquidityRate: BigNumber;\n stableBorrowRate: BigNumber;\n variableBorrowRate: BigNumber;\n utilizationRate: BigNumber;\n totalLiquidity: BigNumber;\n availableLiquidity: BigNumber;\n totalStableDebt: BigNumber;\n totalVariableDebt: BigNumber;\n liquidityIndex: BigNumber;\n variableBorrowIndex: BigNumber;\n lastUpdateTimestamp: number;\n usageAsCollateralEnabled: boolean;\n ltv: number;\n liquidationThreshold: number;\n liquidationBonus: number;\n reserveFactor: number;\n aTokenAddress: string;\n stableDebtTokenAddress: string;\n variableDebtTokenAddress: string;\n}\n\n/**\n * Aave Plugin Configuration\n */\nexport interface AaveConfig {\n network: \"base\" | \"base-sepolia\";\n rpcUrl: string;\n aavePoolAddress: string;\n aaveDataProviderAddress: string;\n healthFactorThreshold: number;\n maxGasPrice: BigNumber;\n retryAttempts: number;\n monitoringInterval: number;\n flashLoanFeeThreshold: number;\n}\n\n/**\n * Aave Error Response\n */\nexport interface AaveErrorResponse {\n code: string;\n message: string;\n details?: any;\n suggestions?: string[];\n healthFactorImpact?: number;\n alternativeActions?: string[];\n}\n\n/**\n * Transaction Parameters\n */\nexport interface TransactionParams {\n gasLimit?: bigint;\n gasPrice?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n}\n\n/**\n * Action Parameter Interfaces\n */\nexport interface SupplyParams {\n asset: string;\n amount: string;\n enableCollateral?: boolean;\n}\n\nexport interface BorrowParams {\n asset: string;\n amount: string;\n rateMode: \"stable\" | \"variable\";\n}\n\nexport interface RepayParams {\n asset: string;\n amount: string;\n rateMode: \"stable\" | \"variable\";\n}\n\nexport interface WithdrawParams {\n asset: string;\n amount: string;\n}\n\nexport interface RateSwitchParams {\n asset: string;\n targetRateMode: \"stable\" | \"variable\";\n}\n\nexport interface CollateralManagementParams {\n asset: string;\n enable: boolean;\n}\n\nexport interface eModeParams {\n categoryId: number;\n enable: boolean;\n}\n\nexport interface FlashLoanActionParams {\n assets: string[];\n amounts: string[];\n receiverAddress?: string;\n params?: string;\n}\n\n/**\n * Health Factor Status\n */\nexport enum HealthFactorStatus {\n CRITICAL = \"CRITICAL\", // < 1.1\n RISKY = \"RISKY\", // 1.1 - 1.5\n MODERATE = \"MODERATE\", // 1.5 - 2.0\n SAFE = \"SAFE\", // 2.0 - 3.0\n VERY_SAFE = \"VERY_SAFE\", // > 3.0\n}\n\n/**\n * Utility Types\n */\nexport interface TokenInfo {\n address: string;\n symbol: string;\n decimals: number;\n name: string;\n}\n\nexport interface GasEstimate {\n gasLimit: bigint;\n gasPrice: bigint;\n totalCost: bigint;\n}\n\n/**\n * Market Data\n */\nexport interface MarketData {\n totalValueLocked: BigNumber;\n totalBorrowed: BigNumber;\n averageSupplyAPY: number;\n averageBorrowAPY: number;\n utilizationRate: number;\n}\n\n/**\n * Notification Types\n */\nexport interface HealthFactorAlert {\n type: \"health_factor_warning\" | \"liquidation_risk\";\n currentHealthFactor: number;\n threshold: number;\n suggestedActions: string[];\n urgency: \"low\" | \"medium\" | \"high\" | \"critical\";\n}\n\nexport interface RateOptimizationOpportunity {\n asset: string;\n currentRateMode: InterestRateMode;\n currentRate: number;\n suggestedRateMode: InterestRateMode;\n suggestedRate: number;\n potentialSavings: BigNumber;\n recommendation: string;\n}\n","import { Plugin } from \"@elizaos/core\";\nimport { supplyAction } from \"./actions/supply\";\nimport { borrowAction } from \"./actions/borrow\";\nimport { repayAction } from \"./actions/repay\";\nimport { withdrawAction } from \"./actions/withdraw\";\nimport { rateSwitchAction } from \"./actions/rateSwitch\";\nimport { collateralManagementAction } from \"./actions/collateralManagement\";\nimport { eModeAction } from \"./actions/eMode\";\nimport { flashLoanAction } from \"./actions/flashLoan\";\nimport { positionContextProvider } from \"./providers/positionContext\";\nimport { healthFactorProvider } from \"./providers/healthFactor\";\n\nexport const aavePlugin: Plugin = {\n name: \"aave\",\n description:\n \"Aave V3 integration plugin for ElizaOS - enabling DeFi lending and borrowing capabilities on Base L2\",\n actions: [\n supplyAction,\n borrowAction,\n repayAction,\n withdrawAction,\n rateSwitchAction,\n collateralManagementAction,\n eModeAction,\n flashLoanAction,\n ],\n providers: [positionContextProvider, healthFactorProvider],\n};\n\nexport default aavePlugin;\n\n// Export types for external use\nexport * from \"./types\";\nexport {\n supplyAction,\n borrowAction,\n repayAction,\n withdrawAction,\n rateSwitchAction,\n collateralManagementAction,\n eModeAction,\n flashLoanAction,\n};\nexport { positionContextProvider, healthFactorProvider };\n"],"mappings":"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","names":["ModelType","composePromptFromState","logger","parseKeyValueXml","createPublicClient","createWalletClient","http","parseUnits","base","privateKeyToAccount","AaveV3Base","ModelType","composePromptFromState","logger","parseKeyValueXml","ModelType","composePromptFromState","logger","parseKeyValueXml","ModelType","composePromptFromState","logger","parseKeyValueXml","ModelType","composePromptFromState","logger","parseKeyValueXml","ModelType","composePromptFromState","logger","parseKeyValueXml","ModelType","composePromptFromState","logger","parseKeyValueXml","logger","createPublicClient","http","base","AaveV3Base","logger","BigNumber","createPublicClient","http","base","AaveV3Base","BigNumber","InterestRateMode","HealthFactorStatus"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elizaos/plugin-aave",
|
|
3
|
+
"description": "Aave V3 DeFi plugin for ElizaOS - enables lending, borrowing, flash loans, and advanced DeFi operations",
|
|
4
|
+
"version": "1.2.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"packageType": "plugin",
|
|
10
|
+
"platform": "node",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"author": "ElizaOS",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"plugin",
|
|
15
|
+
"elizaos",
|
|
16
|
+
"aave",
|
|
17
|
+
"defi",
|
|
18
|
+
"lending",
|
|
19
|
+
"borrowing",
|
|
20
|
+
"flash-loans"
|
|
21
|
+
],
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/elizaos/eliza"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://elizaos.ai",
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/elizaos/eliza/issues"
|
|
29
|
+
},
|
|
30
|
+
"exports": {
|
|
31
|
+
"./package.json": "./package.json",
|
|
32
|
+
".": {
|
|
33
|
+
"import": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"default": "./dist/index.js"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"README.md",
|
|
42
|
+
".npmignore",
|
|
43
|
+
"package.json",
|
|
44
|
+
"tsup.config.ts"
|
|
45
|
+
],
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@elizaos/core": "^1.3.0",
|
|
48
|
+
"@aave/core-v3": "^1.19.3",
|
|
49
|
+
"@aave/contract-helpers": "^1.36.0",
|
|
50
|
+
"@aave/math-utils": "^1.36.0",
|
|
51
|
+
"@bgd-labs/aave-address-book": "^3.3.0",
|
|
52
|
+
"viem": "^2.21.54",
|
|
53
|
+
"ethers": "^6.13.4",
|
|
54
|
+
"bignumber.js": "^9.1.2",
|
|
55
|
+
"dayjs": "^1.11.10",
|
|
56
|
+
"zod": "3.24.2"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"prettier": "3.5.3",
|
|
60
|
+
"tsup": "8.5.0",
|
|
61
|
+
"typescript": "5.8.2",
|
|
62
|
+
"@types/node": "^22.10.2"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"start": "elizaos start",
|
|
66
|
+
"dev": "elizaos dev",
|
|
67
|
+
"build": "tsup",
|
|
68
|
+
"lint": "prettier --write ./src",
|
|
69
|
+
"test": "bun test tests/",
|
|
70
|
+
"format": "prettier --write ./src",
|
|
71
|
+
"format:check": "prettier --check ./src"
|
|
72
|
+
},
|
|
73
|
+
"publishConfig": {
|
|
74
|
+
"access": "public"
|
|
75
|
+
},
|
|
76
|
+
"resolutions": {
|
|
77
|
+
"zod": "3.24.2"
|
|
78
|
+
},
|
|
79
|
+
"agentConfig": {
|
|
80
|
+
"pluginType": "elizaos:plugin:1.0.0",
|
|
81
|
+
"pluginParameters": {
|
|
82
|
+
"BASE_RPC_URL": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "Base L2 RPC endpoint URL"
|
|
85
|
+
},
|
|
86
|
+
"WALLET_PRIVATE_KEY": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Private key for wallet operations (testnet only)"
|
|
89
|
+
},
|
|
90
|
+
"HEALTH_FACTOR_ALERT": {
|
|
91
|
+
"type": "number",
|
|
92
|
+
"description": "Health factor threshold for alerts (default: 1.5)"
|
|
93
|
+
},
|
|
94
|
+
"FLASH_LOAN_MAX_FEE": {
|
|
95
|
+
"type": "number",
|
|
96
|
+
"description": "Maximum acceptable flash loan fee percentage (default: 0.1)"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
package/tsup.config.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineConfig } from "tsup";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
entry: ["src/index.ts"],
|
|
5
|
+
outDir: "dist",
|
|
6
|
+
tsconfig: "./tsconfig.build.json",
|
|
7
|
+
sourcemap: true,
|
|
8
|
+
clean: true,
|
|
9
|
+
format: ["esm"],
|
|
10
|
+
dts: true,
|
|
11
|
+
external: [
|
|
12
|
+
"dotenv",
|
|
13
|
+
"fs",
|
|
14
|
+
"path",
|
|
15
|
+
"https",
|
|
16
|
+
"http",
|
|
17
|
+
"@elizaos/core",
|
|
18
|
+
"zod",
|
|
19
|
+
"@aave/contract-helpers",
|
|
20
|
+
"@aave/math-utils",
|
|
21
|
+
"@aave/core-v3",
|
|
22
|
+
"@bgd-labs/aave-address-book",
|
|
23
|
+
"viem",
|
|
24
|
+
"ethers",
|
|
25
|
+
"bignumber.js",
|
|
26
|
+
"dayjs",
|
|
27
|
+
],
|
|
28
|
+
});
|