@elizaos/plugin-aave 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/chains.ts","../src/types/index.ts","../src/utils/chain-resolver.ts","../src/utils/simple-validation.ts","../src/utils/error-handler.ts","../src/services/aave-service.ts","../src/actions/supply-action.ts","../src/actions/withdraw-action.ts","../src/actions/borrow-action.ts","../src/actions/repay-action.ts","../src/providers/market-data-provider.ts","../src/providers/position-provider.ts","../src/index.ts"],"names":["SupportedChain","InterestRateMode","AaveErrorCode","BigNumber","num","elizaLogger","extractionTemplate","ModelType"],"mappings":"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","file":"index.js","sourcesContent":["import { BigNumber } from 'bignumber.js';\n\n/**\n * Supported Aave V3 chains with their configurations\n */\nexport interface ChainConfig {\n /** Chain name */\n name: string;\n /** Chain ID for network identification */\n chainId: number;\n /** Native currency symbol */\n nativeCurrency: string;\n /** Wrapped native token symbol */\n wrappedNative: string;\n /** Default RPC URL (can be overridden by user) */\n defaultRpcUrl: string;\n /** Whether this chain is a testnet */\n isTestnet: boolean;\n /** Popular assets on this chain */\n popularAssets: string[];\n}\n\n/**\n * Supported Aave V3 chains\n */\nexport enum SupportedChain {\n ETHEREUM = 'ethereum',\n POLYGON = 'polygon',\n AVALANCHE = 'avalanche',\n ARBITRUM = 'arbitrum',\n OPTIMISM = 'optimism',\n BASE = 'base',\n BNB = 'bnb',\n GNOSIS = 'gnosis',\n METIS = 'metis',\n SCROLL = 'scroll',\n ZKSYNC = 'zksync',\n // Testnets\n SEPOLIA = 'sepolia',\n FUJI = 'fuji',\n ARBITRUM_SEPOLIA = 'arbitrum-sepolia',\n OPTIMISM_SEPOLIA = 'optimism-sepolia',\n BASE_SEPOLIA = 'base-sepolia',\n}\n\n/**\n * Chain configurations for all supported Aave V3 networks\n */\nexport const CHAIN_CONFIGS: Record<SupportedChain, ChainConfig> = {\n [SupportedChain.ETHEREUM]: {\n name: 'Ethereum',\n chainId: 1,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://eth.llamarpc.com',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'DAI', 'WETH', 'WBTC', 'LINK', 'AAVE'],\n },\n [SupportedChain.POLYGON]: {\n name: 'Polygon',\n chainId: 137,\n nativeCurrency: 'MATIC',\n wrappedNative: 'WMATIC',\n defaultRpcUrl: 'https://polygon-rpc.com',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'DAI', 'WMATIC', 'WETH', 'WBTC', 'AAVE'],\n },\n [SupportedChain.AVALANCHE]: {\n name: 'Avalanche',\n chainId: 43114,\n nativeCurrency: 'AVAX',\n wrappedNative: 'WAVAX',\n defaultRpcUrl: 'https://api.avax.network/ext/bc/C/rpc',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'DAI.e', 'WAVAX', 'WETH.e', 'WBTC.e', 'AAVE.e'],\n },\n [SupportedChain.ARBITRUM]: {\n name: 'Arbitrum One',\n chainId: 42161,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://arb1.arbitrum.io/rpc',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'DAI', 'WETH', 'WBTC', 'LINK', 'ARB'],\n },\n [SupportedChain.OPTIMISM]: {\n name: 'Optimism',\n chainId: 10,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://mainnet.optimism.io',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'DAI', 'WETH', 'WBTC', 'LINK', 'OP'],\n },\n [SupportedChain.BASE]: {\n name: 'Base',\n chainId: 8453,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://mainnet.base.org',\n isTestnet: false,\n popularAssets: ['USDC', 'DAI', 'WETH', 'cbETH', 'AERO'],\n },\n [SupportedChain.BNB]: {\n name: 'BNB Chain',\n chainId: 56,\n nativeCurrency: 'BNB',\n wrappedNative: 'WBNB',\n defaultRpcUrl: 'https://bsc-dataseed1.binance.org',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'WBNB', 'BTCB', 'ETH', 'FDUSD'],\n },\n [SupportedChain.GNOSIS]: {\n name: 'Gnosis Chain',\n chainId: 100,\n nativeCurrency: 'xDAI',\n wrappedNative: 'WXDAI',\n defaultRpcUrl: 'https://rpc.gnosischain.com',\n isTestnet: false,\n popularAssets: ['USDC', 'WXDAI', 'WETH', 'GNO'],\n },\n [SupportedChain.METIS]: {\n name: 'Metis',\n chainId: 1088,\n nativeCurrency: 'METIS',\n wrappedNative: 'WMETIS',\n defaultRpcUrl: 'https://andromeda.metis.io/?owner=1088',\n isTestnet: false,\n popularAssets: ['m.USDC', 'm.USDT', 'm.DAI', 'WMETIS', 'METIS'],\n },\n [SupportedChain.SCROLL]: {\n name: 'Scroll',\n chainId: 534352,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://rpc.scroll.io',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'WETH', 'WBTC'],\n },\n [SupportedChain.ZKSYNC]: {\n name: 'zkSync Era',\n chainId: 324,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://mainnet.era.zksync.io',\n isTestnet: false,\n popularAssets: ['USDC', 'USDT', 'WETH', 'WBTC'],\n },\n // Testnets\n [SupportedChain.SEPOLIA]: {\n name: 'Ethereum Sepolia',\n chainId: 11155111,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://sepolia.infura.io/v3/demo',\n isTestnet: true,\n popularAssets: ['USDC', 'USDT', 'DAI', 'WETH', 'LINK', 'AAVE'],\n },\n [SupportedChain.FUJI]: {\n name: 'Avalanche Fuji',\n chainId: 43113,\n nativeCurrency: 'AVAX',\n wrappedNative: 'WAVAX',\n defaultRpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n isTestnet: true,\n popularAssets: ['USDC', 'WAVAX', 'WETH.e'],\n },\n [SupportedChain.ARBITRUM_SEPOLIA]: {\n name: 'Arbitrum Sepolia',\n chainId: 421614,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://sepolia-rollup.arbitrum.io/rpc',\n isTestnet: true,\n popularAssets: ['USDC', 'WETH'],\n },\n [SupportedChain.OPTIMISM_SEPOLIA]: {\n name: 'Optimism Sepolia',\n chainId: 11155420,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://sepolia.optimism.io',\n isTestnet: true,\n popularAssets: ['USDC', 'WETH'],\n },\n [SupportedChain.BASE_SEPOLIA]: {\n name: 'Base Sepolia',\n chainId: 84532,\n nativeCurrency: 'ETH',\n wrappedNative: 'WETH',\n defaultRpcUrl: 'https://sepolia.base.org',\n isTestnet: true,\n popularAssets: ['USDC', 'WETH'],\n },\n};\n\n/**\n * Get chain configuration by name\n */\nexport function getChainConfig(chain: string): ChainConfig | undefined {\n return CHAIN_CONFIGS[chain as SupportedChain];\n}\n\n/**\n * Check if a chain is supported\n */\nexport function isSupportedChain(chain: string): chain is SupportedChain {\n return Object.values(SupportedChain).includes(chain as SupportedChain);\n}\n\n/**\n * Get all mainnet chains\n */\nexport function getMainnetChains(): ChainConfig[] {\n return Object.values(CHAIN_CONFIGS).filter(config => !config.isTestnet);\n}\n\n/**\n * Get all testnet chains\n */\nexport function getTestnetChains(): ChainConfig[] {\n return Object.values(CHAIN_CONFIGS).filter(config => config.isTestnet);\n}","import { BigNumber } from 'bignumber.js';\n\n/**\n * Aave V3 Interest Rate Mode enumeration\n * Defines the type of interest rate for borrowing operations\n */\nexport enum InterestRateMode {\n /** Stable interest rate mode */\n STABLE = 1,\n /** Variable interest rate mode */\n VARIABLE = 2,\n}\n\n/**\n * Aave Error Code enumeration\n * Standardized error codes for Aave operations\n */\nexport enum AaveErrorCode {\n /** Unknown or unhandled error */\n UNKNOWN = 'UNKNOWN',\n /** Insufficient balance for operation */\n INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE',\n /** Insufficient collateral for borrowing */\n INSUFFICIENT_COLLATERAL = 'INSUFFICIENT_COLLATERAL',\n /** Asset not supported by Aave */\n ASSET_NOT_SUPPORTED = 'ASSET_NOT_SUPPORTED',\n /** Borrowing not enabled for asset */\n BORROWING_NOT_ENABLED = 'BORROWING_NOT_ENABLED',\n /** Stable borrowing not enabled for asset */\n STABLE_BORROWING_NOT_ENABLED = 'STABLE_BORROWING_NOT_ENABLED',\n /** Position would be liquidated */\n HEALTH_FACTOR_TOO_LOW = 'HEALTH_FACTOR_TOO_LOW',\n /** Contract interaction failed */\n TRANSACTION_FAILED = 'TRANSACTION_FAILED',\n /** Invalid parameters provided */\n INVALID_PARAMETERS = 'INVALID_PARAMETERS',\n /** User already has stable rate loan */\n USER_HAS_STABLE_RATE_LOAN = 'USER_HAS_STABLE_RATE_LOAN',\n /** Amount exceeds maximum allowed */\n AMOUNT_TOO_HIGH = 'AMOUNT_TOO_HIGH',\n /** Pool is paused */\n POOL_PAUSED = 'POOL_PAUSED',\n /** Reserve is frozen */\n RESERVE_FROZEN = 'RESERVE_FROZEN',\n /** Reserve is not active */\n RESERVE_INACTIVE = 'RESERVE_INACTIVE',\n /** Service initialization failed */\n INITIALIZATION_FAILED = 'INITIALIZATION_FAILED',\n /** Connection to protocol failed */\n CONNECTION_FAILED = 'CONNECTION_FAILED',\n /** Service not initialized */\n SERVICE_NOT_INITIALIZED = 'SERVICE_NOT_INITIALIZED',\n /** Wallet not connected */\n WALLET_NOT_CONNECTED = 'WALLET_NOT_CONNECTED',\n /** Transaction generation failed */\n TRANSACTION_GENERATION_FAILED = 'TRANSACTION_GENERATION_FAILED',\n /** Supply operation failed */\n SUPPLY_FAILED = 'SUPPLY_FAILED',\n /** Withdraw operation failed */\n WITHDRAW_FAILED = 'WITHDRAW_FAILED',\n /** Borrow operation failed */\n BORROW_FAILED = 'BORROW_FAILED',\n /** Repay operation failed */\n REPAY_FAILED = 'REPAY_FAILED',\n /** Data fetch operation failed */\n DATA_FETCH_FAILED = 'DATA_FETCH_FAILED',\n /** Asset not found */\n ASSET_NOT_FOUND = 'ASSET_NOT_FOUND',\n /** Unsupported asset */\n UNSUPPORTED_ASSET = 'UNSUPPORTED_ASSET',\n /** No borrowing capacity */\n NO_BORROW_CAPACITY = 'NO_BORROW_CAPACITY',\n /** Unsupported operation on this chain */\n UNSUPPORTED_OPERATION = 'UNSUPPORTED_OPERATION',\n}\n\n/**\n * Custom error class for Aave operations\n */\nexport class AaveError extends Error {\n /** Error code for programmatic handling */\n public readonly code: AaveErrorCode;\n /** Original error that caused this error */\n public readonly cause?: Error;\n /** Additional context about the error */\n public readonly context?: Record<string, any>;\n\n constructor(\n message: string,\n code: AaveErrorCode = AaveErrorCode.UNKNOWN,\n cause?: Error,\n context?: Record<string, any>\n ) {\n super(message);\n this.name = 'AaveError';\n this.code = code;\n this.cause = cause;\n this.context = context;\n }\n}\n\n/**\n * Configuration for Aave V3 Protocol\n */\nexport interface AaveConfig {\n /** Network name */\n network: string;\n /** RPC URL for blockchain connection */\n rpcUrl: string;\n /** Pool contract address */\n poolAddress: string;\n /** Pool data provider contract address */\n poolDataProviderAddress: string;\n /** UI Pool data provider contract address */\n uiPoolDataProviderAddress: string;\n /** WETH Gateway contract address */\n wethGatewayAddress: string;\n /** Chain ID for the network */\n chainId?: number;\n /** Optional private key for transactions */\n privateKey?: string;\n /** Gas limit multiplier (default: 1.2) */\n gasLimitMultiplier?: number;\n /** Max fee per gas in wei */\n maxFeePerGas?: string;\n /** Max priority fee per gas in wei */\n maxPriorityFeePerGas?: string;\n}\n\n/**\n * Parameters for supply operation\n */\nexport interface SupplyParams {\n /** Asset address to supply */\n asset: string;\n /** Amount to supply (in asset decimals) */\n amount: BigNumber;\n /** User address performing the supply */\n user: string;\n /** Address to receive aTokens (usually same as user) */\n onBehalfOf?: string;\n /** Referral code for supply operation */\n referralCode?: number;\n}\n\n/**\n * Result of a supply operation\n */\nexport interface SupplyResult {\n /** Whether the operation was successful */\n success: boolean;\n /** Transaction hash */\n transactionHash?: string;\n /** Amount supplied */\n suppliedAmount: BigNumber;\n /** aToken amount received */\n aTokenAmount: BigNumber;\n /** New aToken balance after supply */\n newATokenBalance: BigNumber;\n /** Gas used for the transaction */\n gasUsed?: BigNumber;\n /** Error information if operation failed */\n error?: AaveError;\n}\n\n/**\n * Parameters for withdraw operation\n */\nexport interface WithdrawParams {\n /** Asset address to withdraw */\n asset: string;\n /** Amount to withdraw (in asset decimals, use MAX_UINT256 for max) */\n amount: BigNumber;\n /** User address performing the withdraw */\n user: string;\n /** Address to receive withdrawn assets */\n to?: string;\n}\n\n/**\n * Result of a withdraw operation\n */\nexport interface WithdrawResult {\n /** Whether the operation was successful */\n success: boolean;\n /** Transaction hash */\n transactionHash?: string;\n /** Amount withdrawn */\n amountWithdrawn: BigNumber;\n /** Remaining aToken balance after withdraw */\n remainingATokenBalance: BigNumber;\n /** New health factor after withdrawal */\n newHealthFactor?: number;\n /** Gas used for the transaction */\n gasUsed?: BigNumber;\n /** Error information if operation failed */\n error?: AaveError;\n}\n\n/**\n * Parameters for borrow operation\n */\nexport interface BorrowParams {\n /** Asset address to borrow */\n asset: string;\n /** Amount to borrow (in asset decimals) */\n amount: BigNumber;\n /** Interest rate mode (stable or variable) */\n interestRateMode: InterestRateMode;\n /** User address performing the borrow */\n user: string;\n /** Address to receive borrowed assets */\n onBehalfOf?: string;\n /** Referral code for borrow operation */\n referralCode?: number;\n}\n\n/**\n * Result of a borrow operation\n */\nexport interface BorrowResult {\n /** Whether the operation was successful */\n success: boolean;\n /** Transaction hash */\n transactionHash?: string;\n /** Amount borrowed */\n amountBorrowed: BigNumber;\n /** Interest rate mode used */\n interestRateMode: InterestRateMode;\n /** Current borrow APY at time of borrowing */\n currentBorrowAPY: number;\n /** Health factor after borrowing */\n newHealthFactor: number;\n /** Gas used for the transaction */\n gasUsed?: BigNumber;\n /** Error information if operation failed */\n error?: AaveError;\n}\n\n/**\n * Parameters for repay operation\n */\nexport interface RepayParams {\n /** Asset address to repay */\n asset: string;\n /** Amount to repay (in asset decimals, use MAX_UINT256 for full repay) */\n amount: BigNumber;\n /** Interest rate mode of the debt being repaid */\n interestRateMode: InterestRateMode;\n /** User address performing the repay */\n user: string;\n /** Address whose debt is being repaid */\n onBehalfOf?: string;\n}\n\n/**\n * Result of a repay operation\n */\nexport interface RepayResult {\n /** Whether the operation was successful */\n success: boolean;\n /** Transaction hash */\n transactionHash?: string;\n /** Amount repaid */\n amountRepaid: BigNumber;\n /** Interest rate mode of repaid debt */\n interestRateMode: InterestRateMode;\n /** Remaining total debt balance */\n remainingDebt: BigNumber;\n /** Health factor after repaying */\n newHealthFactor: number;\n /** Gas used for the transaction */\n gasUsed?: BigNumber;\n /** Optional approval transaction hash */\n approvalTransactionHash?: string;\n /** Error information if operation failed */\n error?: AaveError;\n}\n\n/**\n * User's position in a specific asset\n */\nexport interface AssetPosition {\n /** Asset address */\n asset: string;\n /** Asset symbol (e.g., USDC, ETH) */\n symbol: string;\n /** Asset name */\n name: string;\n /** Number of decimals for the asset */\n decimals: number;\n /** aToken address for this asset */\n aTokenAddress: string;\n /** Stable debt token address */\n stableDebtTokenAddress: string;\n /** Variable debt token address */\n variableDebtTokenAddress: string;\n \n /** Supply position */\n supplied: {\n /** Amount supplied (in asset decimals) */\n amount: BigNumber;\n /** aToken balance */\n aTokenBalance: BigNumber;\n /** Current supply APY */\n supplyAPY: BigNumber;\n /** Value in USD */\n valueUSD: BigNumber;\n };\n \n /** Borrow position */\n borrowed: {\n /** Stable rate debt amount */\n stableDebt: BigNumber;\n /** Variable rate debt amount */\n variableDebt: BigNumber;\n /** Total debt amount */\n totalDebt: BigNumber;\n /** Current stable borrow APY */\n stableBorrowAPY: BigNumber;\n /** Current variable borrow APY */\n variableBorrowAPY: BigNumber;\n /** Value in USD */\n valueUSD: BigNumber;\n };\n \n /** Collateral status */\n isCollateral: boolean;\n /** Can be used as collateral */\n canBeCollateral: boolean;\n /** Asset can be borrowed */\n canBorrow: boolean;\n /** Stable rate borrowing is enabled */\n stableBorrowEnabled: boolean;\n}\n\n/**\n * Simple asset position for getUserPosition\n */\nexport interface SimplePosition {\n /** Asset symbol */\n asset: string;\n /** Amount supplied */\n suppliedAmount: BigNumber;\n /** Variable debt amount */\n borrowedAmountVariable: BigNumber;\n /** Stable debt amount */\n borrowedAmountStable: BigNumber;\n /** Supply APY */\n supplyAPY: number;\n /** Variable borrow APY */\n variableBorrowAPY: number;\n /** Stable borrow APY */\n stableBorrowAPY: number;\n /** Is used as collateral */\n isCollateral: boolean;\n /** Liquidation threshold */\n liquidationThreshold: number;\n /** Loan to value ratio */\n ltv: number;\n}\n\n/**\n * Complete user position across all assets\n */\nexport interface UserPosition {\n /** User's wallet address */\n userAddress: string;\n /** Total collateral in ETH */\n totalCollateralETH: BigNumber;\n /** Total debt in ETH */\n totalDebtETH: BigNumber;\n /** Available to borrow in ETH */\n availableBorrowsETH: BigNumber;\n /** Current liquidation threshold */\n currentLiquidationThreshold: number;\n /** Loan to value ratio */\n ltv: number;\n /** Health factor */\n healthFactor: BigNumber;\n /** Individual asset positions */\n positions: SimplePosition[];\n /** Last updated timestamp */\n lastUpdated: number;\n}\n\n/**\n * Market data for a specific asset\n */\nexport interface MarketData {\n /** Asset symbol */\n asset: string;\n /** aToken address */\n aTokenAddress: string;\n /** Stable debt token address */\n stableDebtTokenAddress: string;\n /** Variable debt token address */\n variableDebtTokenAddress: string;\n /** Underlying asset address */\n underlyingAsset: string;\n /** Asset decimals */\n decimals: number;\n /** Supply APY */\n supplyAPY: number;\n /** Variable borrow APY */\n variableBorrowAPY: number;\n /** Stable borrow APY */\n stableBorrowAPY: number;\n /** Total supply */\n totalSupply: BigNumber;\n /** Total borrowed */\n totalBorrow: BigNumber;\n /** Utilization rate */\n utilizationRate: number;\n /** Loan to value ratio */\n ltv: number;\n /** Liquidation threshold */\n liquidationThreshold: number;\n /** Liquidation bonus */\n liquidationBonus: number;\n /** Reserve factor */\n reserveFactor: number;\n /** Price in USD */\n priceInUSD: BigNumber;\n /** Is active */\n isActive: boolean;\n /** Is frozen */\n isFrozen: boolean;\n /** Is paused */\n isPaused: boolean;\n /** Supply cap */\n supplyCap: BigNumber;\n /** Borrow cap */\n borrowCap: BigNumber;\n /** Last updated timestamp */\n lastUpdated: number;\n}\n\n/**\n * Aave V3 reserve configuration data\n */\nexport interface ReserveConfigurationData {\n /** Decimals of the underlying asset */\n decimals: BigNumber;\n /** Loan to value ratio */\n ltv: BigNumber;\n /** Liquidation threshold */\n liquidationThreshold: BigNumber;\n /** Liquidation bonus */\n liquidationBonus: BigNumber;\n /** Reserve factor */\n reserveFactor: BigNumber;\n /** Whether the reserve can be used as collateral */\n usageAsCollateralEnabled: boolean;\n /** Whether borrowing is enabled */\n borrowingEnabled: boolean;\n /** Whether stable rate borrowing is enabled */\n stableBorrowRateEnabled: boolean;\n /** Whether the reserve is active */\n isActive: boolean;\n /** Whether the reserve is frozen */\n isFrozen: boolean;\n}\n\n/**\n * Aave V3 reserve data from the protocol\n */\nexport interface ReserveData {\n /** Configuration data */\n configuration: ReserveConfigurationData;\n /** Current liquidity rate */\n liquidityRate: BigNumber;\n /** Current stable borrow rate */\n stableBorrowRate: BigNumber;\n /** Current variable borrow rate */\n variableBorrowRate: BigNumber;\n /** Liquidity index */\n liquidityIndex: BigNumber;\n /** Variable borrow index */\n variableBorrowIndex: BigNumber;\n /** aToken address */\n aTokenAddress: string;\n /** Stable debt token address */\n stableDebtTokenAddress: string;\n /** Variable debt token address */\n variableDebtTokenAddress: string;\n /** Interest rate strategy address */\n interestRateStrategyAddress: string;\n /** Available liquidity */\n availableLiquidity: BigNumber;\n /** Total stable debt */\n totalStableDebt: BigNumber;\n /** Total variable debt */\n totalVariableDebt: BigNumber;\n /** Total principal stable debt */\n principalStableDebt: BigNumber;\n /** Average stable rate */\n averageStableRate: BigNumber;\n /** Last update timestamp */\n lastUpdateTimestamp: BigNumber;\n}\n\n/**\n * User account data from Aave\n */\nexport interface UserAccountData {\n /** Total collateral in ETH */\n totalCollateralETH: BigNumber;\n /** Total debt in ETH */\n totalDebtETH: BigNumber;\n /** Available borrows in ETH */\n availableBorrowsETH: BigNumber;\n /** Current liquidation threshold */\n currentLiquidationThreshold: number;\n /** Loan to value ratio */\n ltv: number;\n /** Health factor */\n healthFactor: BigNumber;\n}\n\n/**\n * Transaction options for Aave operations\n */\nexport interface TransactionOptions {\n /** Gas limit for the transaction */\n gasLimit?: BigNumber;\n /** Gas price in wei */\n gasPrice?: BigNumber;\n /** Max fee per gas for EIP-1559 */\n maxFeePerGas?: BigNumber;\n /** Max priority fee per gas for EIP-1559 */\n maxPriorityFeePerGas?: BigNumber;\n /** Transaction value in wei */\n value?: BigNumber;\n /** Nonce for the transaction */\n nonce?: number;\n}\n\n/**\n * Common constants used in Aave operations\n */\nexport const AAVE_CONSTANTS = {\n /** Maximum uint256 value for unlimited approvals/withdrawals */\n MAX_UINT256: new BigNumber('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'),\n /** Number of seconds in a year for APY calculations */\n SECONDS_PER_YEAR: new BigNumber(31536000),\n /** Number of ray units (1e27) used by Aave for rate calculations */\n RAY: new BigNumber('1000000000000000000000000000'),\n /** Number of wei units (1e18) */\n WAD: new BigNumber('1000000000000000000'),\n /** Percentage multiplier (100 for percentage) */\n PERCENTAGE_FACTOR: new BigNumber(10000),\n} as const;\n\n/**\n * Helper type for operation parameters\n */\nexport type OperationParams = SupplyParams | WithdrawParams | BorrowParams | RepayParams;\n\n/**\n * Helper type for operation results\n */\nexport type OperationResult = SupplyResult | WithdrawResult | BorrowResult | RepayResult;\n\n/**\n * Type guard to check if error is AaveError\n */\nexport function isAaveError(error: any): error is AaveError {\n return error instanceof AaveError;\n}\n\n/**\n * Type guard to check if rate mode is valid\n */\nexport function isValidInterestRateMode(mode: any): mode is InterestRateMode {\n return mode === InterestRateMode.STABLE || mode === InterestRateMode.VARIABLE;\n}","import {\n AaveV3Ethereum,\n AaveV3Polygon,\n AaveV3Avalanche,\n AaveV3Arbitrum,\n AaveV3Optimism,\n AaveV3Base,\n AaveV3BNB,\n AaveV3Gnosis,\n AaveV3Metis,\n AaveV3Scroll,\n AaveV3ZkSync,\n AaveV3Sepolia,\n AaveV3Fuji,\n AaveV3ArbitrumSepolia,\n AaveV3OptimismSepolia,\n AaveV3BaseSepolia,\n} from '@bgd-labs/aave-address-book';\n\nimport { SupportedChain, ChainConfig, CHAIN_CONFIGS } from '../types/chains.js';\nimport { AaveError, AaveErrorCode } from '../types/index.js';\n\n/**\n * Aave V3 contract addresses for a specific chain\n */\nexport interface ChainAddresses {\n POOL: string;\n POOL_ADDRESSES_PROVIDER: string;\n AAVE_PROTOCOL_DATA_PROVIDER: string;\n UI_POOL_DATA_PROVIDER?: string;\n WETH_GATEWAY?: string;\n ACL_MANAGER?: string;\n COLLECTOR?: string;\n ORACLE?: string;\n}\n\n/**\n * Complete chain context with addresses and configuration\n */\nexport interface ChainContext {\n chain: SupportedChain;\n config: ChainConfig;\n addresses: ChainAddresses;\n}\n\n/**\n * Map of chain names to their official Aave V3 address configurations\n * These come directly from @bgd-labs/aave-address-book - all REAL contract addresses\n */\nconst CHAIN_ADDRESS_MAP: Record<SupportedChain, ChainAddresses> = {\n // Mainnets\n [SupportedChain.ETHEREUM]: {\n POOL: AaveV3Ethereum.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Ethereum.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Ethereum.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Ethereum.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Ethereum.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Ethereum.ACL_MANAGER,\n COLLECTOR: AaveV3Ethereum.COLLECTOR,\n ORACLE: AaveV3Ethereum.ORACLE,\n },\n [SupportedChain.POLYGON]: {\n POOL: AaveV3Polygon.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Polygon.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Polygon.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Polygon.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Polygon.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Polygon.ACL_MANAGER,\n COLLECTOR: AaveV3Polygon.COLLECTOR,\n ORACLE: AaveV3Polygon.ORACLE,\n },\n [SupportedChain.AVALANCHE]: {\n POOL: AaveV3Avalanche.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Avalanche.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Avalanche.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Avalanche.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Avalanche.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Avalanche.ACL_MANAGER,\n COLLECTOR: AaveV3Avalanche.COLLECTOR,\n ORACLE: AaveV3Avalanche.ORACLE,\n },\n [SupportedChain.ARBITRUM]: {\n POOL: AaveV3Arbitrum.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Arbitrum.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Arbitrum.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Arbitrum.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Arbitrum.ACL_MANAGER,\n COLLECTOR: AaveV3Arbitrum.COLLECTOR,\n ORACLE: AaveV3Arbitrum.ORACLE,\n },\n [SupportedChain.OPTIMISM]: {\n POOL: AaveV3Optimism.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Optimism.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Optimism.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Optimism.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Optimism.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Optimism.ACL_MANAGER,\n COLLECTOR: AaveV3Optimism.COLLECTOR,\n ORACLE: AaveV3Optimism.ORACLE,\n },\n [SupportedChain.BASE]: {\n POOL: AaveV3Base.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Base.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Base.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Base.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Base.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Base.ACL_MANAGER,\n COLLECTOR: AaveV3Base.COLLECTOR,\n ORACLE: AaveV3Base.ORACLE,\n },\n [SupportedChain.BNB]: {\n POOL: AaveV3BNB.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3BNB.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3BNB.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3BNB.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3BNB.WETH_GATEWAY,\n ACL_MANAGER: AaveV3BNB.ACL_MANAGER,\n COLLECTOR: AaveV3BNB.COLLECTOR,\n ORACLE: AaveV3BNB.ORACLE,\n },\n [SupportedChain.GNOSIS]: {\n POOL: AaveV3Gnosis.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Gnosis.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Gnosis.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Gnosis.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Gnosis.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Gnosis.ACL_MANAGER,\n COLLECTOR: AaveV3Gnosis.COLLECTOR,\n ORACLE: AaveV3Gnosis.ORACLE,\n },\n [SupportedChain.METIS]: {\n POOL: AaveV3Metis.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Metis.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Metis.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Metis.UI_POOL_DATA_PROVIDER,\n // WETH_GATEWAY: Not available on Metis\n ACL_MANAGER: AaveV3Metis.ACL_MANAGER,\n COLLECTOR: AaveV3Metis.COLLECTOR,\n ORACLE: AaveV3Metis.ORACLE,\n },\n [SupportedChain.SCROLL]: {\n POOL: AaveV3Scroll.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Scroll.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Scroll.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Scroll.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Scroll.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Scroll.ACL_MANAGER,\n COLLECTOR: AaveV3Scroll.COLLECTOR,\n ORACLE: AaveV3Scroll.ORACLE,\n },\n [SupportedChain.ZKSYNC]: {\n POOL: AaveV3ZkSync.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3ZkSync.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3ZkSync.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3ZkSync.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3ZkSync.WETH_GATEWAY,\n ACL_MANAGER: AaveV3ZkSync.ACL_MANAGER,\n COLLECTOR: AaveV3ZkSync.COLLECTOR,\n ORACLE: AaveV3ZkSync.ORACLE,\n },\n // Testnets\n [SupportedChain.SEPOLIA]: {\n POOL: AaveV3Sepolia.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Sepolia.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Sepolia.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3Sepolia.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3Sepolia.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Sepolia.ACL_MANAGER,\n COLLECTOR: AaveV3Sepolia.COLLECTOR,\n ORACLE: AaveV3Sepolia.ORACLE,\n },\n [SupportedChain.FUJI]: {\n POOL: AaveV3Fuji.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3Fuji.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3Fuji.AAVE_PROTOCOL_DATA_PROVIDER,\n // UI_POOL_DATA_PROVIDER: Not available on Fuji\n WETH_GATEWAY: AaveV3Fuji.WETH_GATEWAY,\n ACL_MANAGER: AaveV3Fuji.ACL_MANAGER,\n COLLECTOR: AaveV3Fuji.COLLECTOR,\n ORACLE: AaveV3Fuji.ORACLE,\n },\n [SupportedChain.ARBITRUM_SEPOLIA]: {\n POOL: AaveV3ArbitrumSepolia.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3ArbitrumSepolia.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3ArbitrumSepolia.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3ArbitrumSepolia.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3ArbitrumSepolia.WETH_GATEWAY,\n ACL_MANAGER: AaveV3ArbitrumSepolia.ACL_MANAGER,\n COLLECTOR: AaveV3ArbitrumSepolia.COLLECTOR,\n ORACLE: AaveV3ArbitrumSepolia.ORACLE,\n },\n [SupportedChain.OPTIMISM_SEPOLIA]: {\n POOL: AaveV3OptimismSepolia.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3OptimismSepolia.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3OptimismSepolia.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3OptimismSepolia.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3OptimismSepolia.WETH_GATEWAY,\n ACL_MANAGER: AaveV3OptimismSepolia.ACL_MANAGER,\n COLLECTOR: AaveV3OptimismSepolia.COLLECTOR,\n ORACLE: AaveV3OptimismSepolia.ORACLE,\n },\n [SupportedChain.BASE_SEPOLIA]: {\n POOL: AaveV3BaseSepolia.POOL,\n POOL_ADDRESSES_PROVIDER: AaveV3BaseSepolia.POOL_ADDRESSES_PROVIDER,\n AAVE_PROTOCOL_DATA_PROVIDER: AaveV3BaseSepolia.AAVE_PROTOCOL_DATA_PROVIDER,\n UI_POOL_DATA_PROVIDER: AaveV3BaseSepolia.UI_POOL_DATA_PROVIDER,\n WETH_GATEWAY: AaveV3BaseSepolia.WETH_GATEWAY,\n ACL_MANAGER: AaveV3BaseSepolia.ACL_MANAGER,\n COLLECTOR: AaveV3BaseSepolia.COLLECTOR,\n ORACLE: AaveV3BaseSepolia.ORACLE,\n },\n};\n\n/**\n * Resolve chain context including configuration and contract addresses\n */\nexport function resolveChainContext(chainName: string): ChainContext {\n // Normalize chain name\n const normalizedChain = chainName.toLowerCase().trim() as SupportedChain;\n \n // Validate chain is supported\n if (!Object.values(SupportedChain).includes(normalizedChain)) {\n throw new AaveError(\n `Unsupported chain: ${chainName}. Supported chains: ${Object.values(SupportedChain).join(', ')}`,\n AaveErrorCode.INVALID_PARAMETERS\n );\n }\n\n // Get chain configuration\n const config = CHAIN_CONFIGS[normalizedChain];\n if (!config) {\n throw new AaveError(\n `Chain configuration not found for: ${chainName}`,\n AaveErrorCode.INVALID_PARAMETERS\n );\n }\n\n // Get contract addresses\n const addresses = CHAIN_ADDRESS_MAP[normalizedChain];\n if (!addresses) {\n throw new AaveError(\n `Aave V3 contracts not available on chain: ${chainName}`,\n AaveErrorCode.INVALID_PARAMETERS\n );\n }\n\n return {\n chain: normalizedChain,\n config,\n addresses,\n };\n}\n\n/**\n * Get RPC URL for a chain with user override support\n */\nexport function resolveRpcUrl(chainContext: ChainContext, userRpcUrl?: string): string {\n // Use user-provided RPC URL if available\n if (userRpcUrl) {\n return userRpcUrl;\n }\n\n // Use default RPC URL for the chain\n return chainContext.config.defaultRpcUrl;\n}\n\n/**\n * Get all available chains (for CLI/UI display)\n */\nexport function getAllSupportedChains(): Array<{ chain: SupportedChain; config: ChainConfig }> {\n return Object.entries(CHAIN_CONFIGS).map(([chain, config]) => ({\n chain: chain as SupportedChain,\n config,\n }));\n}\n\n/**\n * Get popular assets for a specific chain\n */\nexport function getPopularAssetsForChain(chain: SupportedChain): string[] {\n const config = CHAIN_CONFIGS[chain];\n return config ? config.popularAssets : [];\n}\n\n/**\n * Check if a chain has Aave V3 deployment\n */\nexport function hasAaveV3Deployment(chain: string): boolean {\n const normalizedChain = chain.toLowerCase() as SupportedChain;\n return normalizedChain in CHAIN_ADDRESS_MAP;\n}","/**\n * Simple validation utilities for tests and basic operations\n * These are simpler versions of the complex Zod-based validations\n */\n\nimport BigNumber from 'bignumber.js';\nimport { InterestRateMode } from '../types/index.js';\n\n/**\n * Check if amount represents maximum (all, max, everything, etc.)\n */\nexport function isMaxAmount(amount: string | BigNumber): boolean {\n if (typeof amount === 'string') {\n const normalized = amount.toLowerCase().trim();\n return ['max', 'maximum', 'all', 'everything'].includes(normalized);\n }\n \n // For BigNumber, check if it's NaN (which would happen with string 'max')\n if (amount instanceof BigNumber) {\n return false; // BigNumber instances are never considered \"max\"\n }\n \n return false;\n}\n\n/**\n * Simple amount parsing\n */\nexport function parseAmount(amount: string | number): BigNumber {\n if (amount === null || amount === undefined) {\n throw new Error('Amount cannot be null or undefined');\n }\n \n if (typeof amount === 'string') {\n const trimmed = amount.trim();\n if (!trimmed) {\n throw new Error('Amount cannot be empty');\n }\n \n // Reject obvious invalid values\n if (trimmed === 'NaN' || trimmed === 'Infinity' || trimmed === '-Infinity') {\n throw new Error('Invalid amount format');\n }\n \n const num = new BigNumber(trimmed);\n if (num.isNaN() || !num.isFinite()) {\n throw new Error('Invalid amount format');\n }\n if (num.isLessThanOrEqualTo(0)) {\n throw new Error('Amount must be greater than 0');\n }\n return num;\n }\n \n if (typeof amount === 'number') {\n if (!isFinite(amount) || isNaN(amount)) {\n throw new Error('Amount must be a finite number');\n }\n }\n \n const num = new BigNumber(amount);\n if (num.isNaN() || !num.isFinite() || num.isLessThanOrEqualTo(0)) {\n throw new Error('Amount must be a positive finite number');\n }\n return num;\n}\n\n/**\n * Simple address validation\n */\nexport function validateAddress(address: string): string {\n if (!address || typeof address !== 'string') {\n throw new Error('Address is required');\n }\n \n const trimmed = address.trim();\n if (!trimmed.match(/^0x[a-fA-F0-9]{40}$/i)) { // Case-insensitive\n throw new Error('Invalid address: must be a valid Ethereum address');\n }\n \n return trimmed;\n}\n\n/**\n * Simple supply params validation\n */\nexport function validateSupplyParams(params: any) {\n if (!params.user || !params.asset || !params.amount) {\n throw new Error('Missing required parameters: user, asset, amount');\n }\n \n return {\n user: validateAddress(params.user),\n asset: params.asset.trim(),\n amount: isMaxAmount(params.amount) ? params.amount : parseAmount(params.amount).toString(),\n };\n}\n\n/**\n * Simple withdraw params validation\n */\nexport function validateWithdrawParams(params: any) {\n if (!params.user || !params.asset || !params.amount) {\n throw new Error('Missing required parameters: user, asset, amount');\n }\n \n return {\n user: validateAddress(params.user),\n asset: params.asset.trim(),\n amount: isMaxAmount(params.amount) ? params.amount : parseAmount(params.amount).toString(),\n };\n}\n\n/**\n * Simple borrow params validation\n */\nexport function validateBorrowParams(params: any) {\n if (!params.user || !params.asset || !params.amount) {\n throw new Error('Missing required parameters: user, asset, amount');\n }\n \n // Validate interest rate mode if provided\n if (params.interestRateMode !== undefined) {\n if (params.interestRateMode !== InterestRateMode.STABLE && \n params.interestRateMode !== InterestRateMode.VARIABLE) {\n throw new Error('Invalid interest rate mode: must be 1 (stable) or 2 (variable)');\n }\n }\n \n return {\n user: validateAddress(params.user),\n asset: params.asset.trim(),\n amount: parseAmount(params.amount).toString(),\n interestRateMode: params.interestRateMode || InterestRateMode.VARIABLE,\n };\n}\n\n/**\n * Simple repay params validation\n */\nexport function validateRepayParams(params: any) {\n if (!params.user || !params.asset || !params.amount) {\n throw new Error('Missing required parameters: user, asset, amount');\n }\n \n return {\n user: validateAddress(params.user),\n asset: params.asset.trim(),\n amount: isMaxAmount(params.amount) ? params.amount : parseAmount(params.amount).toString(),\n interestRateMode: params.interestRateMode || InterestRateMode.VARIABLE,\n };\n}\n\n/**\n * Format amount for display (simple version)\n */\nexport function formatAmount(amount: BigNumber): string {\n return amount.toFixed();\n}","import { BigNumber } from 'bignumber.js';\nimport {\n AaveError,\n AaveErrorCode,\n InterestRateMode,\n SupplyParams,\n WithdrawParams,\n BorrowParams,\n RepayParams,\n} from '../types/index.js';\n// Simple error handler - createError function for basic error creation\nfunction createError(\n message: string, \n code: AaveErrorCode = AaveErrorCode.UNKNOWN,\n cause?: Error,\n context?: Record<string, any>\n): AaveError {\n return new AaveError(message, code, cause, context);\n}\n\n// Simple rate mode name function\nfunction getRateModeName(mode: InterestRateMode): string {\n switch (mode) {\n case InterestRateMode.STABLE:\n return 'Stable';\n case InterestRateMode.VARIABLE:\n return 'Variable';\n default:\n return 'Unknown';\n }\n}\n\n// =============================================================================\n// TYPES AND INTERFACES\n// =============================================================================\n\n/**\n * Error context for structured error reporting\n */\nexport interface ErrorContext {\n /** Operation being performed */\n operation?: 'supply' | 'withdraw' | 'borrow' | 'repay' | 'market_data';\n /** Transaction hash if available */\n transactionHash?: string;\n /** Gas used or estimated */\n gasUsed?: string;\n /** Asset involved in the operation */\n asset?: string;\n /** Amount involved in the operation */\n amount?: string;\n /** User address */\n user?: string;\n /** Interest rate mode for borrow/repay operations */\n interestRateMode?: InterestRateMode;\n /** Additional metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Error recovery suggestion\n */\nexport interface ErrorRecovery {\n /** Action user can take to resolve the error */\n action: string;\n /** Additional context or instructions */\n details?: string;\n /** Whether the action requires user intervention */\n requiresUserAction: boolean;\n}\n\n/**\n * Processed error result with user-friendly information\n */\nexport interface ProcessedError {\n /** Original error */\n originalError: Error;\n /** Mapped Aave error */\n aaveError: AaveError;\n /** User-friendly message */\n userMessage: string;\n /** Technical message for logging */\n technicalMessage: string;\n /** Recovery suggestions */\n recovery?: ErrorRecovery;\n /** Error context */\n context: ErrorContext;\n /** Whether error is retryable */\n isRetryable: boolean;\n /** Log level for this error */\n logLevel: 'error' | 'warn' | 'info';\n}\n\n// =============================================================================\n// AAVE V3 CONTRACT ERROR CODES\n// =============================================================================\n\n/**\n * Aave V3 protocol error codes and their descriptions\n * These are the actual error codes from Aave V3 contracts\n */\nexport const AAVE_PROTOCOL_ERRORS: Record<string, { code: AaveErrorCode; description: string; userMessage: string; recovery?: ErrorRecovery }> = {\n // Pool errors (P prefix)\n 'P_INVALID_FLASHLOAN_EXECUTOR_RETURN': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Invalid flashloan executor return',\n userMessage: 'Flash loan execution failed. Please check your flash loan logic.',\n recovery: {\n action: 'Review and fix your flash loan implementation',\n requiresUserAction: true,\n },\n },\n 'P_VT_TRANSFER_NOT_SUPPORTED': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Variable debt token transfer not supported',\n userMessage: 'Cannot transfer debt tokens. Use repay and borrow operations instead.',\n recovery: {\n action: 'Use repay() and borrow() functions for debt management',\n requiresUserAction: true,\n },\n },\n 'P_ASSET_NOT_LISTED': {\n code: AaveErrorCode.ASSET_NOT_SUPPORTED,\n description: 'Asset is not listed in the pool',\n userMessage: 'This asset is not supported by Aave protocol.',\n recovery: {\n action: 'Use a supported asset from the Aave markets',\n requiresUserAction: true,\n },\n },\n 'P_INVALID_AMOUNT': {\n code: AaveErrorCode.INVALID_PARAMETERS,\n description: 'Invalid amount provided',\n userMessage: 'The amount provided is invalid. Please check the amount and try again.',\n recovery: {\n action: 'Ensure amount is positive and within acceptable range',\n requiresUserAction: true,\n },\n },\n\n // Reserve errors (R prefix)\n 'R_LIQUIDITY_INDEX_OVERFLOW': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Liquidity index overflow',\n userMessage: 'Internal calculation error. Please try again later.',\n recovery: {\n action: 'Wait and retry the operation',\n requiresUserAction: false,\n },\n },\n 'R_VARIABLE_BORROW_INDEX_OVERFLOW': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Variable borrow index overflow',\n userMessage: 'Internal calculation error. Please try again later.',\n recovery: {\n action: 'Wait and retry the operation',\n requiresUserAction: false,\n },\n },\n 'R_LIQUIDITY_RATE_OVERFLOW': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Liquidity rate overflow',\n userMessage: 'Interest rate calculation error. Please try again later.',\n recovery: {\n action: 'Wait and retry the operation',\n requiresUserAction: false,\n },\n },\n 'R_VARIABLE_BORROW_RATE_OVERFLOW': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Variable borrow rate overflow',\n userMessage: 'Interest rate calculation error. Please try again later.',\n recovery: {\n action: 'Wait and retry the operation',\n requiresUserAction: false,\n },\n },\n\n // Validation errors (V prefix)\n 'V_INCONSISTENT_FLASHLOAN_PARAMS': {\n code: AaveErrorCode.INVALID_PARAMETERS,\n description: 'Inconsistent flashloan parameters',\n userMessage: 'Flash loan parameters are inconsistent.',\n recovery: {\n action: 'Check flash loan asset and amount parameters',\n requiresUserAction: true,\n },\n },\n 'V_COLLATERAL_BALANCE_IS_ZERO': {\n code: AaveErrorCode.INSUFFICIENT_COLLATERAL,\n description: 'Collateral balance is zero',\n userMessage: 'You have no collateral deposited. Please supply collateral first.',\n recovery: {\n action: 'Supply assets as collateral before borrowing',\n requiresUserAction: true,\n },\n },\n 'V_HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD': {\n code: AaveErrorCode.HEALTH_FACTOR_TOO_LOW,\n description: 'Health factor below liquidation threshold',\n userMessage: 'This operation would put your position at risk of liquidation.',\n recovery: {\n action: 'Supply more collateral or reduce borrowing amount',\n requiresUserAction: true,\n },\n },\n 'V_COLLATERAL_CANNOT_COVER_NEW_BORROW': {\n code: AaveErrorCode.INSUFFICIENT_COLLATERAL,\n description: 'Insufficient collateral for new borrow',\n userMessage: 'You don\\'t have enough collateral to borrow this amount.',\n recovery: {\n action: 'Supply more collateral or reduce borrow amount',\n requiresUserAction: true,\n },\n },\n 'V_STABLE_BORROWING_NOT_ENABLED': {\n code: AaveErrorCode.STABLE_BORROWING_NOT_ENABLED,\n description: 'Stable borrowing not enabled for asset',\n userMessage: 'Stable rate borrowing is not available for this asset.',\n recovery: {\n action: 'Use variable rate borrowing instead',\n requiresUserAction: true,\n },\n },\n 'V_NO_DEBT_OF_SELECTED_TYPE': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'No debt of selected type',\n userMessage: 'You don\\'t have debt in the selected interest rate mode.',\n recovery: {\n action: 'Check your debt positions and select the correct rate mode',\n requiresUserAction: true,\n },\n },\n 'V_NO_STABLE_RATE_LOAN_IN_RESERVE': {\n code: AaveErrorCode.STABLE_BORROWING_NOT_ENABLED,\n description: 'No stable rate loan exists',\n userMessage: 'No stable rate loan exists for this asset.',\n recovery: {\n action: 'Use variable rate borrowing',\n requiresUserAction: true,\n },\n },\n 'V_NO_VARIABLE_RATE_LOAN_IN_RESERVE': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'No variable rate loan exists',\n userMessage: 'No variable rate loan exists for this asset.',\n recovery: {\n action: 'Check your borrow positions',\n requiresUserAction: true,\n },\n },\n 'V_UNDERLYING_BALANCE_ZERO': {\n code: AaveErrorCode.INSUFFICIENT_BALANCE,\n description: 'Underlying balance is zero',\n userMessage: 'You don\\'t have any balance of this asset to supply.',\n recovery: {\n action: 'Acquire the asset first or check your balance',\n requiresUserAction: true,\n },\n },\n 'V_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Interest rate rebalance conditions not met',\n userMessage: 'Cannot rebalance interest rate. Conditions not met.',\n recovery: {\n action: 'Try again later when market conditions change',\n requiresUserAction: false,\n },\n },\n\n // Asset configuration errors (A prefix)\n 'A_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n description: 'Rebalance conditions not met',\n userMessage: 'Cannot rebalance stable rate. Market conditions not suitable.',\n recovery: {\n action: 'Try again when utilization rate changes',\n requiresUserAction: false,\n },\n },\n 'A_NO_MORE_RESERVES_ALLOWED': {\n code: AaveErrorCode.POOL_PAUSED,\n description: 'No more reserves allowed',\n userMessage: 'Maximum number of assets reached in the pool.',\n recovery: {\n action: 'Contact Aave governance to add more reserves',\n requiresUserAction: true,\n },\n },\n\n // Supply/Withdraw specific\n 'S_NOT_ENOUGH_AVAILABLE_USER_BALANCE': {\n code: AaveErrorCode.INSUFFICIENT_BALANCE,\n description: 'Insufficient user balance',\n userMessage: 'You don\\'t have enough balance to complete this operation.',\n recovery: {\n action: 'Check your wallet balance and reduce the amount',\n requiresUserAction: true,\n },\n },\n 'W_NO_ATOKEN_BALANCE': {\n code: AaveErrorCode.INSUFFICIENT_BALANCE,\n description: 'No aToken balance to withdraw',\n userMessage: 'You don\\'t have any supplied balance to withdraw.',\n recovery: {\n action: 'Check your supplied positions',\n requiresUserAction: true,\n },\n },\n\n // Borrow/Repay specific\n 'B_BORROW_CAP_EXCEEDED': {\n code: AaveErrorCode.AMOUNT_TOO_HIGH,\n description: 'Borrow cap exceeded',\n userMessage: 'Borrowing this amount would exceed the protocol\\'s borrow cap.',\n recovery: {\n action: 'Reduce the borrow amount',\n requiresUserAction: true,\n },\n },\n 'B_SUPPLY_CAP_EXCEEDED': {\n code: AaveErrorCode.AMOUNT_TOO_HIGH,\n description: 'Supply cap exceeded',\n userMessage: 'Supplying this amount would exceed the protocol\\'s supply cap.',\n recovery: {\n action: 'Reduce the supply amount',\n requiresUserAction: true,\n },\n },\n\n // Reserve status errors\n 'RESERVE_INACTIVE': {\n code: AaveErrorCode.RESERVE_INACTIVE,\n description: 'Reserve is inactive',\n userMessage: 'This asset is currently inactive in the Aave protocol.',\n recovery: {\n action: 'Choose an active asset or wait for reactivation',\n requiresUserAction: true,\n },\n },\n 'RESERVE_FROZEN': {\n code: AaveErrorCode.RESERVE_FROZEN,\n description: 'Reserve is frozen',\n userMessage: 'This asset is currently frozen. Only repay and withdraw operations are allowed.',\n recovery: {\n action: 'Choose an unfrozen asset or wait for unfreeze',\n requiresUserAction: true,\n },\n },\n 'RESERVE_PAUSED': {\n code: AaveErrorCode.POOL_PAUSED,\n description: 'Reserve is paused',\n userMessage: 'Operations on this asset are temporarily paused.',\n recovery: {\n action: 'Wait for the asset to be unpaused',\n requiresUserAction: false,\n },\n },\n};\n\n// =============================================================================\n// NETWORK AND TRANSACTION ERROR PATTERNS\n// =============================================================================\n\n/**\n * Common network error patterns and their mappings\n */\nexport const NETWORK_ERROR_PATTERNS: Record<string, { code: AaveErrorCode; userMessage: string; isRetryable: boolean }> = {\n // RPC errors\n 'network timeout': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Network connection timed out. Please try again.',\n isRetryable: true,\n },\n 'connection refused': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Unable to connect to the network. Please check your connection.',\n isRetryable: true,\n },\n 'socket hang up': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Network connection interrupted. Please try again.',\n isRetryable: true,\n },\n 'request timeout': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Request timed out. Please try again.',\n isRetryable: true,\n },\n 'rate limit': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Too many requests. Please wait a moment and try again.',\n isRetryable: true,\n },\n 'insufficient funds for gas': {\n code: AaveErrorCode.INSUFFICIENT_BALANCE,\n userMessage: 'Insufficient ETH for gas fees. Please add more ETH to your wallet.',\n isRetryable: false,\n },\n 'gas limit exceeded': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Transaction requires too much gas. Try reducing the amount.',\n isRetryable: false,\n },\n 'replacement transaction underpriced': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Transaction replacement fee too low. Increase gas price.',\n isRetryable: true,\n },\n 'nonce too low': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Transaction nonce is outdated. Please refresh and try again.',\n isRetryable: true,\n },\n 'already known': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Transaction already pending. Please wait for confirmation.',\n isRetryable: false,\n },\n};\n\n/**\n * Gas estimation error patterns\n */\nexport const GAS_ERROR_PATTERNS: Record<string, { code: AaveErrorCode; userMessage: string; recovery: ErrorRecovery }> = {\n 'execution reverted': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Transaction would fail. Please check your parameters.',\n recovery: {\n action: 'Review transaction parameters and account balances',\n requiresUserAction: true,\n },\n },\n 'out of gas': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Transaction ran out of gas. Increase gas limit.',\n recovery: {\n action: 'Increase gas limit or reduce transaction complexity',\n requiresUserAction: true,\n },\n },\n 'invalid opcode': {\n code: AaveErrorCode.TRANSACTION_FAILED,\n userMessage: 'Invalid transaction. Please check your parameters.',\n recovery: {\n action: 'Verify all transaction parameters are correct',\n requiresUserAction: true,\n },\n },\n};\n\n// =============================================================================\n// ERROR MAPPING FUNCTIONS\n// =============================================================================\n\n/**\n * Maps Aave protocol errors to user-friendly messages\n * @param error - Original error\n * @param context - Error context\n * @returns Mapped AaveError\n */\nexport function mapAaveError(error: Error, context: ErrorContext = {}): AaveError {\n const errorMessage = error.message.toLowerCase();\n \n // Check for specific Aave protocol errors first\n for (const [pattern, errorInfo] of Object.entries(AAVE_PROTOCOL_ERRORS)) {\n if (errorMessage.includes(pattern.toLowerCase()) || errorMessage.includes(`execution reverted: ${pattern.toLowerCase()}`)) {\n return new AaveError(\n errorInfo.userMessage,\n errorInfo.code,\n error,\n {\n ...context,\n protocolError: pattern,\n recovery: errorInfo.recovery,\n }\n );\n }\n }\n\n // Check for network errors\n for (const [pattern, errorInfo] of Object.entries(NETWORK_ERROR_PATTERNS)) {\n if (errorMessage.includes(pattern)) {\n return new AaveError(\n errorInfo.userMessage,\n errorInfo.code,\n error,\n {\n ...context,\n networkError: pattern,\n isRetryable: errorInfo.isRetryable,\n }\n );\n }\n }\n\n // Check for gas-related errors\n for (const [pattern, errorInfo] of Object.entries(GAS_ERROR_PATTERNS)) {\n if (errorMessage.includes(pattern)) {\n return new AaveError(\n errorInfo.userMessage,\n errorInfo.code,\n error,\n {\n ...context,\n gasError: pattern,\n recovery: errorInfo.recovery,\n }\n );\n }\n }\n\n // Handle common error patterns with heuristics\n if (errorMessage.includes('insufficient')) {\n if (errorMessage.includes('balance') || errorMessage.includes('funds')) {\n return new AaveError(\n 'Insufficient balance to complete this operation.',\n AaveErrorCode.INSUFFICIENT_BALANCE,\n error,\n context\n );\n }\n if (errorMessage.includes('collateral')) {\n return new AaveError(\n 'Insufficient collateral for this operation.',\n AaveErrorCode.INSUFFICIENT_COLLATERAL,\n error,\n context\n );\n }\n }\n\n if (errorMessage.includes('health factor')) {\n return new AaveError(\n 'This operation would put your position at risk of liquidation.',\n AaveErrorCode.HEALTH_FACTOR_TOO_LOW,\n error,\n context\n );\n }\n\n if (errorMessage.includes('not enabled') && errorMessage.includes('stable')) {\n return new AaveError(\n 'Stable rate borrowing is not enabled for this asset.',\n AaveErrorCode.STABLE_BORROWING_NOT_ENABLED,\n error,\n context\n );\n }\n\n if (errorMessage.includes('paused')) {\n return new AaveError(\n 'The pool or asset is currently paused.',\n AaveErrorCode.POOL_PAUSED,\n error,\n context\n );\n }\n\n if (errorMessage.includes('frozen')) {\n return new AaveError(\n 'The asset is currently frozen.',\n AaveErrorCode.RESERVE_FROZEN,\n error,\n context\n );\n }\n\n // Default to unknown error\n return new AaveError(\n 'An unexpected error occurred. Please try again.',\n AaveErrorCode.UNKNOWN,\n error,\n context\n );\n}\n\n/**\n * Handles contract-specific errors with enhanced context\n * @param error - Contract error\n * @param contractName - Name of the contract\n * @param methodName - Name of the method that failed\n * @param context - Additional context\n * @returns ProcessedError\n */\nexport function handleContractError(\n error: Error,\n contractName: string,\n methodName: string,\n context: ErrorContext = {}\n): ProcessedError {\n const enhancedContext = {\n ...context,\n contractName,\n methodName,\n };\n\n const aaveError = mapAaveError(error, enhancedContext);\n \n return {\n originalError: error,\n aaveError,\n userMessage: aaveError.message,\n technicalMessage: `Contract error in ${contractName}.${methodName}: ${error.message}`,\n context: enhancedContext,\n isRetryable: determineRetryability(aaveError),\n logLevel: determineLogLevel(aaveError),\n recovery: aaveError.context?.recovery,\n };\n}\n\n/**\n * Handles transaction-related errors with gas and network context\n * @param error - Transaction error\n * @param transactionHash - Transaction hash if available\n * @param context - Error context\n * @returns ProcessedError\n */\nexport function handleTransactionError(\n error: Error,\n transactionHash?: string,\n context: ErrorContext = {}\n): ProcessedError {\n const enhancedContext = {\n ...context,\n transactionHash,\n };\n\n const aaveError = mapAaveError(error, enhancedContext);\n \n let userMessage = aaveError.message;\n let technicalMessage = error.message;\n \n // Enhance messages for transaction-specific context\n if (transactionHash) {\n technicalMessage = `Transaction ${transactionHash} failed: ${error.message}`;\n }\n\n // Add specific guidance for common transaction errors\n if (aaveError.code === AaveErrorCode.INSUFFICIENT_BALANCE && context.operation) {\n const operation = context.operation;\n const asset = context.asset || 'the asset';\n \n switch (operation) {\n case 'supply':\n userMessage = `You don't have enough ${asset} to supply this amount.`;\n break;\n case 'borrow':\n userMessage = `You don't have enough collateral to borrow this amount of ${asset}.`;\n break;\n case 'repay':\n userMessage = `You don't have enough ${asset} to repay this amount.`;\n break;\n case 'withdraw':\n userMessage = `You don't have enough supplied ${asset} to withdraw this amount.`;\n break;\n }\n }\n\n return {\n originalError: error,\n aaveError,\n userMessage,\n technicalMessage,\n context: enhancedContext,\n isRetryable: determineRetryability(aaveError),\n logLevel: determineLogLevel(aaveError),\n recovery: generateRecoverySuggestion(aaveError, context),\n };\n}\n\n/**\n * Handles BigNumber and ethers.js specific errors\n * @param error - Error from BigNumber or ethers operations\n * @param context - Error context\n * @returns ProcessedError\n */\nexport function handleBigNumberError(error: Error, context: ErrorContext = {}): ProcessedError {\n const errorMessage = error.message.toLowerCase();\n let aaveError: AaveError;\n let userMessage: string;\n\n if (errorMessage.includes('invalid number') || errorMessage.includes('not a number')) {\n aaveError = new AaveError(\n 'Invalid number format provided.',\n AaveErrorCode.INVALID_PARAMETERS,\n error,\n context\n );\n userMessage = 'Please enter a valid number.';\n } else if (errorMessage.includes('overflow') || errorMessage.includes('too large')) {\n aaveError = new AaveError(\n 'Number is too large to process.',\n AaveErrorCode.AMOUNT_TOO_HIGH,\n error,\n context\n );\n userMessage = 'The amount is too large. Please use a smaller number.';\n } else if (errorMessage.includes('underflow') || errorMessage.includes('negative')) {\n aaveError = new AaveError(\n 'Negative numbers are not allowed.',\n AaveErrorCode.INVALID_PARAMETERS,\n error,\n context\n );\n userMessage = 'Please enter a positive number.';\n } else if (errorMessage.includes('division by zero')) {\n aaveError = new AaveError(\n 'Division by zero error in calculation.',\n AaveErrorCode.TRANSACTION_FAILED,\n error,\n context\n );\n userMessage = 'Internal calculation error. Please try again.';\n } else {\n aaveError = new AaveError(\n 'Number processing error.',\n AaveErrorCode.INVALID_PARAMETERS,\n error,\n context\n );\n userMessage = 'There was an error processing the numbers. Please check your input.';\n }\n\n return {\n originalError: error,\n aaveError,\n userMessage,\n technicalMessage: `BigNumber/ethers error: ${error.message}`,\n context,\n isRetryable: false,\n logLevel: 'warn',\n recovery: {\n action: 'Check input values and try again',\n requiresUserAction: true,\n },\n };\n}\n\n// =============================================================================\n// OPERATION-SPECIFIC ERROR HANDLERS\n// =============================================================================\n\n/**\n * Creates error context for supply operations\n * @param params - Supply parameters\n * @returns Error context\n */\nexport function createSupplyErrorContext(params: Partial<SupplyParams>): ErrorContext {\n return {\n operation: 'supply',\n asset: params.asset,\n amount: params.amount?.toString(),\n user: params.user,\n };\n}\n\n/**\n * Creates error context for withdraw operations\n * @param params - Withdraw parameters\n * @returns Error context\n */\nexport function createWithdrawErrorContext(params: Partial<WithdrawParams>): ErrorContext {\n return {\n operation: 'withdraw',\n asset: params.asset,\n amount: params.amount?.toString(),\n user: params.user,\n };\n}\n\n/**\n * Creates error context for borrow operations\n * @param params - Borrow parameters\n * @returns Error context\n */\nexport function createBorrowErrorContext(params: Partial<BorrowParams>): ErrorContext {\n return {\n operation: 'borrow',\n asset: params.asset,\n amount: params.amount?.toString(),\n user: params.user,\n interestRateMode: params.interestRateMode,\n };\n}\n\n/**\n * Creates error context for repay operations\n * @param params - Repay parameters\n * @returns Error context\n */\nexport function createRepayErrorContext(params: Partial<RepayParams>): ErrorContext {\n return {\n operation: 'repay',\n asset: params.asset,\n amount: params.amount?.toString(),\n user: params.user,\n interestRateMode: params.interestRateMode,\n };\n}\n\n// =============================================================================\n// ERROR ANALYSIS UTILITIES\n// =============================================================================\n\n/**\n * Determines if an error is retryable\n * @param error - AaveError to analyze\n * @returns true if retryable\n */\nexport function determineRetryability(error: AaveError): boolean {\n // Network and temporary errors are generally retryable\n const retryableCodes = [\n AaveErrorCode.UNKNOWN,\n AaveErrorCode.TRANSACTION_FAILED,\n ];\n\n if (retryableCodes.includes(error.code)) {\n // Check context for specific retryability hints\n if (error.context?.isRetryable !== undefined) {\n return error.context.isRetryable as boolean;\n }\n return true;\n }\n\n // Validation and configuration errors are not retryable without changes\n const nonRetryableCodes = [\n AaveErrorCode.INSUFFICIENT_BALANCE,\n AaveErrorCode.INSUFFICIENT_COLLATERAL,\n AaveErrorCode.ASSET_NOT_SUPPORTED,\n AaveErrorCode.INVALID_PARAMETERS,\n AaveErrorCode.HEALTH_FACTOR_TOO_LOW,\n AaveErrorCode.STABLE_BORROWING_NOT_ENABLED,\n AaveErrorCode.AMOUNT_TOO_HIGH,\n ];\n\n return !nonRetryableCodes.includes(error.code);\n}\n\n/**\n * Determines appropriate log level for an error\n * @param error - AaveError to analyze\n * @returns Log level\n */\nexport function determineLogLevel(error: AaveError): 'error' | 'warn' | 'info' {\n switch (error.code) {\n case AaveErrorCode.INVALID_PARAMETERS:\n case AaveErrorCode.ASSET_NOT_SUPPORTED:\n return 'warn';\n \n case AaveErrorCode.INSUFFICIENT_BALANCE:\n case AaveErrorCode.INSUFFICIENT_COLLATERAL:\n case AaveErrorCode.HEALTH_FACTOR_TOO_LOW:\n return 'info';\n \n default:\n return 'error';\n }\n}\n\n/**\n * Generates contextual recovery suggestions\n * @param error - AaveError\n * @param context - Error context\n * @returns Recovery suggestion\n */\nexport function generateRecoverySuggestion(error: AaveError, context: ErrorContext): ErrorRecovery | undefined {\n // Use predefined recovery if available\n if (error.context?.recovery) {\n return error.context.recovery as ErrorRecovery;\n }\n\n const { operation, asset, interestRateMode } = context;\n\n switch (error.code) {\n case AaveErrorCode.INSUFFICIENT_BALANCE:\n if (operation === 'supply' || operation === 'repay') {\n return {\n action: `Acquire more ${asset || 'tokens'} or reduce the amount`,\n requiresUserAction: true,\n };\n }\n return {\n action: 'Check your wallet balance and try a smaller amount',\n requiresUserAction: true,\n };\n\n case AaveErrorCode.INSUFFICIENT_COLLATERAL:\n return {\n action: 'Supply more collateral or reduce the borrow amount',\n details: 'Your collateral is not sufficient for this borrow amount',\n requiresUserAction: true,\n };\n\n case AaveErrorCode.HEALTH_FACTOR_TOO_LOW:\n return {\n action: 'Supply additional collateral or repay some debt first',\n details: 'This operation would put your position at risk of liquidation',\n requiresUserAction: true,\n };\n\n case AaveErrorCode.STABLE_BORROWING_NOT_ENABLED:\n return {\n action: 'Use variable rate borrowing instead',\n details: `Stable rate is not available for ${asset || 'this asset'}`,\n requiresUserAction: true,\n };\n\n case AaveErrorCode.ASSET_NOT_SUPPORTED:\n return {\n action: 'Choose a supported asset from the Aave markets',\n requiresUserAction: true,\n };\n\n case AaveErrorCode.RESERVE_FROZEN:\n return {\n action: 'Only withdraw and repay operations are allowed for frozen assets',\n requiresUserAction: true,\n };\n\n case AaveErrorCode.RESERVE_INACTIVE:\n return {\n action: 'Choose an active asset or wait for this asset to be reactivated',\n requiresUserAction: true,\n };\n\n case AaveErrorCode.POOL_PAUSED:\n return {\n action: 'Wait for the pool to be unpaused and try again',\n requiresUserAction: false,\n };\n\n default:\n return {\n action: 'Review the error details and try again',\n requiresUserAction: true,\n };\n }\n}\n\n// =============================================================================\n// LOGGING INTEGRATION\n// =============================================================================\n\n/**\n * Formats error for structured logging\n * @param processedError - Processed error information\n * @returns Log object\n */\nexport function formatErrorForLogging(processedError: ProcessedError): Record<string, any> {\n return {\n timestamp: new Date().toISOString(),\n level: processedError.logLevel,\n error: {\n type: processedError.aaveError.name,\n code: processedError.aaveError.code,\n message: processedError.technicalMessage,\n userMessage: processedError.userMessage,\n stack: processedError.originalError.stack,\n },\n context: processedError.context,\n recovery: processedError.recovery,\n isRetryable: processedError.isRetryable,\n };\n}\n\n/**\n * Logs error using ElizaOS logging patterns\n * @param processedError - Processed error to log\n * @param logger - Logger instance (optional)\n */\nexport function logError(processedError: ProcessedError, logger?: any): void {\n const logData = formatErrorForLogging(processedError);\n \n if (logger) {\n logger[processedError.logLevel]('Aave operation failed', logData);\n } else {\n // Fallback to console logging with structured format\n const logPrefix = `[${processedError.logLevel.toUpperCase()}] Aave Error:`;\n console[processedError.logLevel === 'error' ? 'error' : 'log'](\n logPrefix,\n JSON.stringify(logData, null, 2)\n );\n }\n}\n\n// =============================================================================\n// HIGH-LEVEL ERROR PROCESSING\n// =============================================================================\n\n/**\n * Processes any error into a user-friendly format with full context\n * @param error - Original error\n * @param operation - Operation that failed\n * @param params - Operation parameters\n * @param transactionHash - Transaction hash if available\n * @returns Processed error with user-friendly information\n */\nexport function processError(\n error: Error,\n operation: 'supply' | 'withdraw' | 'borrow' | 'repay' | 'market_data',\n params?: any,\n transactionHash?: string\n): ProcessedError {\n let context: ErrorContext;\n\n // Create context based on operation type\n switch (operation) {\n case 'supply':\n context = createSupplyErrorContext(params || {});\n break;\n case 'withdraw':\n context = createWithdrawErrorContext(params || {});\n break;\n case 'borrow':\n context = createBorrowErrorContext(params || {});\n break;\n case 'repay':\n context = createRepayErrorContext(params || {});\n break;\n default:\n context = { operation };\n }\n\n if (transactionHash) {\n context.transactionHash = transactionHash;\n }\n\n // Handle specific error types\n if (error.message.includes('BigNumber') || error.message.includes('invalid number')) {\n return handleBigNumberError(error, context);\n }\n\n if (transactionHash || error.message.includes('transaction')) {\n return handleTransactionError(error, transactionHash, context);\n }\n\n // Default contract error handling\n return handleContractError(error, 'AavePool', operation, context);\n}\n\n/**\n * Creates user-friendly error messages for specific operations\n * @param error - Processed error\n * @returns Enhanced user message\n */\nexport function createUserFriendlyMessage(error: ProcessedError): string {\n const { aaveError, context } = error;\n const { operation, asset, amount, interestRateMode } = context;\n\n let baseMessage = aaveError.message;\n let operationContext = '';\n\n // Add operation-specific context\n switch (operation) {\n case 'supply':\n operationContext = `while supplying ${amount ? `${amount} ` : ''}${asset || 'tokens'}`;\n break;\n case 'withdraw':\n operationContext = `while withdrawing ${amount ? `${amount} ` : ''}${asset || 'tokens'}`;\n break;\n case 'borrow':\n const rateType = interestRateMode ? getRateModeName(interestRateMode).toLowerCase() : '';\n operationContext = `while borrowing ${amount ? `${amount} ` : ''}${asset || 'tokens'}${rateType ? ` at ${rateType} rate` : ''}`;\n break;\n case 'repay':\n const repayRateType = interestRateMode ? getRateModeName(interestRateMode).toLowerCase() : '';\n operationContext = `while repaying ${amount ? `${amount} ` : ''}${asset || 'debt'}${repayRateType ? ` (${repayRateType} rate)` : ''}`;\n break;\n }\n\n if (operationContext) {\n baseMessage = `${baseMessage} This error occurred ${operationContext}.`;\n }\n\n // Add recovery suggestion if available\n if (error.recovery) {\n baseMessage += ` ${error.recovery.action}.`;\n if (error.recovery.details) {\n baseMessage += ` ${error.recovery.details}.`;\n }\n }\n\n return baseMessage;\n}\n\n/**\n * Main error handler function - processes and logs errors\n * @param error - Original error\n * @param operation - Operation type\n * @param params - Operation parameters\n * @param transactionHash - Transaction hash if available\n * @param logger - Logger instance\n * @returns Processed error ready for user consumption\n */\nexport function handleError(\n error: Error,\n operation: 'supply' | 'withdraw' | 'borrow' | 'repay' | 'market_data',\n params?: any,\n transactionHash?: string,\n logger?: any\n): ProcessedError {\n const processedError = processError(error, operation, params, transactionHash);\n \n // Enhance user message\n processedError.userMessage = createUserFriendlyMessage(processedError);\n \n // Log the error\n logError(processedError, logger);\n \n return processedError;\n}","import { Service, IAgentRuntime, elizaLogger } from '@elizaos/core';\nimport { Pool, UiPoolDataProvider } from '@aave/contract-helpers';\nimport { \n formatReserves, \n formatUserSummary,\n valueToBigNumber,\n BigNumberValue,\n} from '@aave/math-utils';\nimport { ethers } from 'ethers';\nimport BigNumber from 'bignumber.js';\n\nimport { resolveChainContext, resolveRpcUrl, ChainContext } from '../utils/chain-resolver.js';\nimport { SupportedChain, getChainConfig } from '../types/chains.js';\n\nimport {\n AaveConfig,\n AaveError,\n AaveErrorCode,\n SupplyParams,\n SupplyResult,\n WithdrawParams,\n WithdrawResult,\n BorrowParams,\n BorrowResult,\n RepayParams,\n RepayResult,\n UserPosition,\n MarketData,\n UserAccountData,\n InterestRateMode,\n} from '../types/index.js';\n\nimport {\n validateSupplyParams,\n validateWithdrawParams,\n validateBorrowParams,\n validateRepayParams,\n validateAddress,\n parseAmount,\n isMaxAmount,\n} from '../utils/simple-validation.js';\n\nimport { handleError } from '../utils/error-handler.js';\n\nexport class AaveService extends Service {\n static serviceType = 'aave';\n\n private provider!: ethers.providers.JsonRpcProvider;\n private signer?: ethers.Wallet;\n private poolService?: Pool;\n private uiPoolDataProvider?: UiPoolDataProvider;\n private chainContext!: ChainContext;\n private isInitialized = false;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n // Chain context will be resolved during initialization\n }\n\n get description(): string {\n return 'Aave V3 Protocol service for lending, borrowing, and DeFi operations';\n }\n\n get capabilityDescription(): string {\n const currentChain = this.chainContext?.config?.name || 'Multiple chains';\n return `Supports Aave V3 lending operations on ${currentChain}: supply, withdraw, borrow, repay with aTokens and variable/stable rates`;\n }\n\n async initialize(runtime: IAgentRuntime): Promise<void> {\n try {\n elizaLogger.info('Initializing Aave V3 multi-chain service...');\n\n // Get chain configuration from environment (default to ethereum)\n const targetChain = runtime.getSetting('AAVE_CHAIN') || 'ethereum';\n elizaLogger.info(`Initializing for chain: ${targetChain}`);\n\n // Resolve chain context (config + contract addresses)\n this.chainContext = resolveChainContext(targetChain);\n elizaLogger.info(`Chain context resolved: ${this.chainContext.config.name} (Chain ID: ${this.chainContext.config.chainId})`);\n\n // Get RPC URL with user override support\n const customRpcUrl = runtime.getSetting('AAVE_RPC_URL') || runtime.getSetting('RPC_URL');\n const rpcUrl = resolveRpcUrl(this.chainContext, customRpcUrl);\n elizaLogger.info(`Using RPC URL: ${rpcUrl.replace(/\\/\\/.*@/, '//***@')}`); // Hide API keys in logs\n\n // Get wallet configuration\n const privateKey = runtime.getSetting('WALLET_PRIVATE_KEY');\n\n // Initialize provider for the target chain\n this.provider = new ethers.providers.JsonRpcProvider(rpcUrl);\n\n // Initialize signer if private key provided\n if (privateKey) {\n this.signer = new ethers.Wallet(privateKey, this.provider);\n elizaLogger.info(`Wallet connected: ${this.signer.address} on ${this.chainContext.config.name}`);\n \n // Verify network matches expected chain ID\n const network = await this.provider.getNetwork();\n if (network.chainId !== this.chainContext.config.chainId) {\n elizaLogger.warn(`Network mismatch: RPC reports chain ID ${network.chainId}, expected ${this.chainContext.config.chainId}`);\n }\n }\n\n // Initialize Aave contract helpers with chain-specific addresses\n const poolConfig: any = {\n POOL: this.chainContext.addresses.POOL,\n };\n \n if (this.chainContext.addresses.WETH_GATEWAY) {\n poolConfig.WETH_GATEWAY = this.chainContext.addresses.WETH_GATEWAY;\n }\n \n this.poolService = new Pool(this.provider, poolConfig);\n\n // Only initialize UI pool data provider if address is available\n if (this.chainContext.addresses.UI_POOL_DATA_PROVIDER) {\n this.uiPoolDataProvider = new UiPoolDataProvider({\n uiPoolDataProviderAddress: this.chainContext.addresses.UI_POOL_DATA_PROVIDER,\n provider: this.provider,\n chainId: this.chainContext.config.chainId,\n });\n }\n\n // Verify connection and contract availability\n await this.verifyConnection();\n\n this.isInitialized = true;\n elizaLogger.info(`Aave V3 service initialized successfully on ${this.chainContext.config.name}`);\n elizaLogger.info(`Available assets: ${this.chainContext.config.popularAssets.join(', ')}`);\n\n } catch (error) {\n elizaLogger.error('Failed to initialize Aave service:', error);\n throw new AaveError(\n `Failed to initialize Aave V3 service: ${error instanceof Error ? error.message : String(error)}`,\n AaveErrorCode.INITIALIZATION_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n { \n targetChain: runtime.getSetting('AAVE_CHAIN'),\n originalError: error \n }\n );\n }\n }\n\n private async verifyConnection(): Promise<void> {\n try {\n // Test connection by fetching reserves data using chain-specific addresses\n if (!this.uiPoolDataProvider) {\n elizaLogger.warn(`UI Pool Data Provider not available on ${this.chainContext.config.name} - some features may be limited`);\n return;\n }\n \n const reservesData = await this.uiPoolDataProvider.getReservesHumanized({\n lendingPoolAddressProvider: this.chainContext.addresses.POOL_ADDRESSES_PROVIDER,\n });\n \n if (!reservesData || reservesData.reservesData.length === 0) {\n throw new Error('No reserves data received from Aave V3 contracts');\n }\n\n elizaLogger.info(`Connected to Aave V3 on ${this.chainContext.config.name} - found ${reservesData.reservesData.length} reserves`);\n \n // Log some popular assets if available\n const availableAssets = reservesData.reservesData.map(r => r.symbol).slice(0, 5);\n elizaLogger.info(`Sample available assets: ${availableAssets.join(', ')}`);\n \n } catch (error) {\n elizaLogger.error('Connection verification failed:', error);\n throw new AaveError(\n `Failed to verify Aave V3 connection on ${this.chainContext.config.name}`,\n AaveErrorCode.CONNECTION_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n {\n chain: this.chainContext.config.name,\n chainId: this.chainContext.config.chainId,\n poolAddress: this.chainContext.addresses.POOL\n }\n );\n }\n }\n\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.poolService) {\n throw new AaveError(\n 'Aave service not initialized',\n AaveErrorCode.SERVICE_NOT_INITIALIZED\n );\n }\n }\n\n private ensureSigner(): void {\n if (!this.signer) {\n throw new AaveError(\n 'Wallet not connected - private key required for transactions',\n AaveErrorCode.WALLET_NOT_CONNECTED\n );\n }\n }\n\n async supply(params: SupplyParams): Promise<SupplyResult> {\n try {\n this.ensureInitialized();\n this.ensureSigner();\n\n const validatedParams = validateSupplyParams(params);\n const amount = parseAmount(validatedParams.amount).toString();\n const userAddress = validatedParams.user;\n\n elizaLogger.info(`Supplying ${amount} ${validatedParams.asset} for ${userAddress}`);\n\n // Get asset address from reserves data\n const reserveData = await this.getReserveData(validatedParams.asset);\n \n // Use Pool service to generate supply transaction\n const supplyTxs = await this.poolService!.supply({\n user: userAddress,\n reserve: reserveData.underlyingAsset,\n amount,\n onBehalfOf: userAddress,\n });\n\n if (supplyTxs.length === 0) {\n throw new AaveError(\n 'Failed to generate supply transaction',\n AaveErrorCode.TRANSACTION_GENERATION_FAILED\n );\n }\n\n // Execute transactions (approval + supply)\n let approvalTxHash: string | undefined;\n let supplyTxHash: string;\n\n for (const tx of supplyTxs) {\n // Convert Aave transaction to ethers format\n const ethersTransaction = {\n to: (tx as any).to,\n data: (tx as any).data,\n value: (tx as any).value || '0',\n gasLimit: (tx as any).gasLimit,\n };\n \n const txResponse = await this.signer!.sendTransaction(ethersTransaction);\n const receipt = await txResponse.wait();\n\n if (tx.txType === 'ERC20_APPROVAL') {\n approvalTxHash = receipt!.transactionHash;\n elizaLogger.info(`Token approval completed: ${approvalTxHash}`);\n } else {\n supplyTxHash = receipt!.transactionHash;\n elizaLogger.info(`Supply transaction completed: ${supplyTxHash}`);\n }\n }\n\n // Get updated position data\n const accountData = await this.getUserAccountData(userAddress);\n \n // Calculate aTokens received (approximately equal to amount supplied for most assets)\n const aTokensReceived = new BigNumber(amount);\n\n return {\n success: true,\n transactionHash: supplyTxHash!,\n suppliedAmount: new BigNumber(amount),\n aTokenAmount: aTokensReceived,\n newATokenBalance: aTokensReceived, // Simplified - would need to query actual balance\n gasUsed: new BigNumber('0'), // Would need to calculate from receipt\n };\n\n } catch (error) {\n elizaLogger.error('Supply operation failed:', error);\n const processedError = handleError(error instanceof Error ? error : new Error(String(error)), 'supply', params);\n throw new AaveError(\n processedError.userMessage,\n AaveErrorCode.SUPPLY_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n { operation: 'supply', params }\n );\n }\n }\n\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n try {\n this.ensureInitialized();\n this.ensureSigner();\n\n const validatedParams = validateWithdrawParams(params);\n const userAddress = validatedParams.user;\n\n elizaLogger.info(`Withdrawing ${validatedParams.amount} ${validatedParams.asset} for ${userAddress}`);\n\n // Get asset address from reserves data\n const reserveData = await this.getReserveData(validatedParams.asset);\n \n // Handle max withdrawal\n let amount: string;\n if (isMaxAmount(validatedParams.amount)) {\n amount = '-1'; // Aave helper uses -1 for max\n } else {\n amount = parseAmount(validatedParams.amount).toString();\n }\n\n // Use Pool service to generate withdraw transaction\n const withdrawTxs = await this.poolService!.withdraw({\n user: userAddress,\n reserve: reserveData.underlyingAsset,\n amount,\n onBehalfOf: userAddress,\n });\n\n if (withdrawTxs.length === 0) {\n throw new AaveError(\n 'Failed to generate withdraw transaction',\n AaveErrorCode.TRANSACTION_GENERATION_FAILED\n );\n }\n\n // Execute transaction\n const tx = withdrawTxs[0];\n const ethersTransaction = {\n to: (tx as any).to,\n data: (tx as any).data,\n value: (tx as any).value || '0',\n gasLimit: (tx as any).gasLimit,\n };\n \n const txResponse = await this.signer!.sendTransaction(ethersTransaction);\n const receipt = await txResponse.wait();\n const withdrawTxHash = receipt!.transactionHash;\n\n elizaLogger.info(`Withdraw transaction completed: ${withdrawTxHash}`);\n\n // Get updated position data\n const accountData = await this.getUserAccountData(userAddress);\n \n // For now, return the requested amount (would need to parse logs for exact amount)\n const amountWithdrawn = isMaxAmount(validatedParams.amount) \n ? new BigNumber(amount)\n : parseAmount(validatedParams.amount);\n\n return {\n success: true,\n transactionHash: withdrawTxHash,\n amountWithdrawn,\n remainingATokenBalance: new BigNumber(0), // Would need to query aToken contract\n newHealthFactor: accountData.healthFactor.toNumber(),\n gasUsed: new BigNumber(receipt!.gasUsed.toString()),\n };\n\n } catch (error) {\n elizaLogger.error('Withdraw operation failed:', error);\n const processedError = handleError(error instanceof Error ? error : new Error(String(error)), 'withdraw', params);\n throw new AaveError(\n processedError.userMessage,\n AaveErrorCode.WITHDRAW_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n { operation: 'withdraw', params }\n );\n }\n }\n\n async borrow(params: BorrowParams): Promise<BorrowResult> {\n try {\n this.ensureInitialized();\n this.ensureSigner();\n\n const validatedParams = validateBorrowParams(params);\n const amount = parseAmount(validatedParams.amount).toString();\n const userAddress = validatedParams.user;\n const rateMode = validatedParams.interestRateMode;\n\n elizaLogger.info(`Borrowing ${amount} ${validatedParams.asset} for ${userAddress}`);\n\n // Get asset address from reserves data\n const reserveData = await this.getReserveData(validatedParams.asset);\n\n // Use Pool service to generate borrow transaction\n const borrowTxs = await this.poolService!.borrow({\n user: userAddress,\n reserve: reserveData.underlyingAsset,\n amount,\n interestRateMode: (rateMode === InterestRateMode.STABLE ? 1 : 2) as any,\n onBehalfOf: userAddress,\n });\n\n if (borrowTxs.length === 0) {\n throw new AaveError(\n 'Failed to generate borrow transaction',\n AaveErrorCode.TRANSACTION_GENERATION_FAILED\n );\n }\n\n // Execute transaction\n const tx = borrowTxs[0];\n const ethersTransaction = {\n to: (tx as any).to,\n data: (tx as any).data,\n value: (tx as any).value || '0',\n gasLimit: (tx as any).gasLimit,\n };\n \n const txResponse = await this.signer!.sendTransaction(ethersTransaction);\n const receipt = await txResponse.wait();\n const borrowTxHash = receipt!.transactionHash;\n\n elizaLogger.info(`Borrow transaction completed: ${borrowTxHash}`);\n\n // Get updated position data\n const accountData = await this.getUserAccountData(userAddress);\n \n // Get current borrow APY\n const borrowAPY = rateMode === InterestRateMode.VARIABLE \n ? Number(reserveData.variableBorrowAPY)\n : Number(reserveData.stableBorrowAPY);\n\n return {\n success: true,\n transactionHash: borrowTxHash,\n amountBorrowed: new BigNumber(amount),\n interestRateMode: rateMode,\n currentBorrowAPY: borrowAPY,\n newHealthFactor: accountData.healthFactor.toNumber(),\n gasUsed: new BigNumber(receipt!.gasUsed.toString()),\n };\n\n } catch (error) {\n elizaLogger.error('Borrow operation failed:', error);\n const processedError = handleError(error instanceof Error ? error : new Error(String(error)), 'borrow', params);\n throw new AaveError(\n processedError.userMessage,\n AaveErrorCode.BORROW_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n { operation: 'borrow', params }\n );\n }\n }\n\n async repay(params: RepayParams): Promise<RepayResult> {\n try {\n this.ensureInitialized();\n this.ensureSigner();\n\n const validatedParams = validateRepayParams(params);\n const userAddress = validatedParams.user;\n const rateMode = validatedParams.interestRateMode;\n\n elizaLogger.info(`Repaying ${validatedParams.amount} ${validatedParams.asset} for ${userAddress}`);\n\n // Get asset address from reserves data\n const reserveData = await this.getReserveData(validatedParams.asset);\n \n // Handle max repayment\n let amount: string;\n if (isMaxAmount(validatedParams.amount)) {\n amount = '-1'; // Aave helper uses -1 for max\n } else {\n amount = parseAmount(validatedParams.amount).toString();\n }\n\n // Use Pool service to generate repay transaction\n const repayTxs = await this.poolService!.repay({\n user: userAddress,\n reserve: reserveData.underlyingAsset,\n amount,\n interestRateMode: (rateMode === InterestRateMode.STABLE ? 1 : 2) as any,\n onBehalfOf: userAddress,\n });\n\n if (repayTxs.length === 0) {\n throw new AaveError(\n 'Failed to generate repay transaction',\n AaveErrorCode.TRANSACTION_GENERATION_FAILED\n );\n }\n\n // Execute transactions (approval + repay)\n let approvalTxHash: string | undefined;\n let repayTxHash: string;\n\n for (const tx of repayTxs) {\n // Convert Aave transaction to ethers format\n const ethersTransaction = {\n to: (tx as any).to,\n data: (tx as any).data,\n value: (tx as any).value || '0',\n gasLimit: (tx as any).gasLimit,\n };\n \n const txResponse = await this.signer!.sendTransaction(ethersTransaction);\n const receipt = await txResponse.wait();\n\n if (tx.txType === 'ERC20_APPROVAL') {\n approvalTxHash = receipt!.transactionHash;\n elizaLogger.info(`Token approval completed: ${approvalTxHash}`);\n } else {\n repayTxHash = receipt!.transactionHash;\n elizaLogger.info(`Repay transaction completed: ${repayTxHash}`);\n }\n }\n\n // Get updated position data\n const accountData = await this.getUserAccountData(userAddress);\n \n // For now, return the requested amount (would need to parse logs for exact amount)\n const amountRepaid = isMaxAmount(validatedParams.amount) \n ? new BigNumber(amount === '-1' ? '0' : amount)\n : parseAmount(validatedParams.amount);\n\n return {\n success: true,\n transactionHash: repayTxHash!,\n amountRepaid,\n interestRateMode: rateMode,\n remainingDebt: accountData.totalDebtETH,\n newHealthFactor: accountData.healthFactor.toNumber(),\n gasUsed: new BigNumber('0'), // Would need to calculate from receipt\n approvalTransactionHash: approvalTxHash,\n };\n\n } catch (error) {\n elizaLogger.error('Repay operation failed:', error);\n const processedError = handleError(error instanceof Error ? error : new Error(String(error)), 'repay', params);\n throw new AaveError(\n processedError.userMessage,\n AaveErrorCode.REPAY_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n { operation: 'repay', params }\n );\n }\n }\n\n async getUserPosition(userAddress: string): Promise<UserPosition> {\n try {\n this.ensureInitialized();\n \n if (!this.uiPoolDataProvider) {\n throw new AaveError(\n 'UI Pool Data Provider not available on this chain - cannot fetch user positions',\n AaveErrorCode.UNSUPPORTED_OPERATION\n );\n }\n \n const validatedAddress = validateAddress(userAddress);\n \n // Get user reserves data\n const userReservesData = await this.uiPoolDataProvider.getUserReservesHumanized({\n lendingPoolAddressProvider: this.chainContext.addresses.POOL_ADDRESSES_PROVIDER,\n user: validatedAddress,\n });\n\n const reservesData = await this.uiPoolDataProvider.getReservesHumanized({\n lendingPoolAddressProvider: this.chainContext.addresses.POOL_ADDRESSES_PROVIDER,\n });\n\n // Format the data using Aave's math utils\n const formattedPoolReserves = formatReserves({\n reserves: reservesData.reservesData,\n currentTimestamp: Date.now() / 1000,\n marketReferencePriceInUsd: reservesData.baseCurrencyData.marketReferenceCurrencyPriceInUsd,\n marketReferenceCurrencyDecimals: reservesData.baseCurrencyData.marketReferenceCurrencyDecimals,\n });\n\n const userSummary = formatUserSummary({\n currentTimestamp: Date.now() / 1000,\n marketReferencePriceInUsd: reservesData.baseCurrencyData.marketReferenceCurrencyPriceInUsd,\n marketReferenceCurrencyDecimals: reservesData.baseCurrencyData.marketReferenceCurrencyDecimals,\n userReserves: userReservesData.userReserves,\n formattedReserves: formattedPoolReserves,\n userEmodeCategoryId: userReservesData.userEmodeCategoryId,\n });\n\n // Convert to our format\n const positions = userReservesData.userReserves\n .filter((reserve: any) => \n reserve.scaledATokenBalance !== '0' || \n reserve.scaledVariableDebt !== '0' || \n reserve.principalStableDebt !== '0'\n )\n .map((reserve: any) => {\n const poolReserve = formattedPoolReserves.find(\n (r: any) => r.underlyingAsset.toLowerCase() === reserve.underlyingAsset.toLowerCase()\n );\n\n return {\n asset: poolReserve?.symbol || 'Unknown',\n suppliedAmount: new BigNumber(reserve.scaledATokenBalance || '0'),\n borrowedAmountVariable: new BigNumber(reserve.scaledVariableDebt || '0'),\n borrowedAmountStable: new BigNumber(reserve.principalStableDebt || '0'),\n supplyAPY: Number(poolReserve?.supplyAPY || '0'),\n variableBorrowAPY: Number(poolReserve?.variableBorrowAPY || '0'),\n stableBorrowAPY: Number(poolReserve?.variableBorrowAPY || '0'), // Use variableBorrowAPY since stableBorrowAPY doesn't exist\n isCollateral: reserve.usageAsCollateralEnabled,\n liquidationThreshold: Number(poolReserve?.reserveLiquidationThreshold || '0') / 10000,\n ltv: Number(poolReserve?.baseLTVasCollateral || '0') / 10000,\n };\n });\n\n return {\n userAddress: validatedAddress,\n totalCollateralETH: new BigNumber(userSummary.totalCollateralUSD),\n totalDebtETH: new BigNumber(userSummary.totalBorrowsUSD),\n availableBorrowsETH: new BigNumber(userSummary.availableBorrowsUSD),\n currentLiquidationThreshold: Number(userSummary.currentLiquidationThreshold),\n ltv: Number((userSummary as any).currentLtv || (userSummary as any).totalLTV || 0),\n healthFactor: new BigNumber(userSummary.healthFactor),\n positions,\n lastUpdated: Date.now(),\n };\n\n } catch (error) {\n elizaLogger.error('Failed to get user position:', error);\n throw new AaveError(\n 'Failed to fetch user position',\n AaveErrorCode.DATA_FETCH_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n { userAddress }\n );\n }\n }\n\n async getUserAccountData(userAddress: string): Promise<UserAccountData> {\n try {\n this.ensureInitialized();\n\n // Use the formatted user position data which is more comprehensive\n const position = await this.getUserPosition(userAddress);\n\n return {\n totalCollateralETH: position.totalCollateralETH,\n totalDebtETH: position.totalDebtETH,\n availableBorrowsETH: position.availableBorrowsETH,\n currentLiquidationThreshold: position.currentLiquidationThreshold,\n ltv: position.ltv,\n healthFactor: position.healthFactor,\n };\n\n } catch (error) {\n elizaLogger.error('Failed to get user account data:', error);\n throw new AaveError(\n 'Failed to fetch user account data',\n AaveErrorCode.DATA_FETCH_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n { userAddress }\n );\n }\n }\n\n async getMarketData(): Promise<MarketData[]> {\n this.ensureInitialized();\n try {\n \n if (!this.uiPoolDataProvider) {\n throw new AaveError(\n 'UI Pool Data Provider not available on this chain - cannot fetch market data',\n AaveErrorCode.UNSUPPORTED_OPERATION\n );\n }\n\n const reservesData = await this.uiPoolDataProvider.getReservesHumanized({\n lendingPoolAddressProvider: this.chainContext.addresses.POOL_ADDRESSES_PROVIDER,\n });\n\n const formattedReserves = formatReserves({\n reserves: reservesData.reservesData,\n currentTimestamp: Date.now() / 1000,\n marketReferencePriceInUsd: reservesData.baseCurrencyData.marketReferenceCurrencyPriceInUsd,\n marketReferenceCurrencyDecimals: reservesData.baseCurrencyData.marketReferenceCurrencyDecimals,\n });\n\n return formattedReserves.map((reserve: any) => ({\n asset: reserve.symbol,\n aTokenAddress: reserve.aTokenAddress,\n stableDebtTokenAddress: reserve.stableDebtTokenAddress,\n variableDebtTokenAddress: reserve.variableDebtTokenAddress,\n underlyingAsset: reserve.underlyingAsset,\n decimals: reserve.decimals,\n supplyAPY: Number(reserve.supplyAPY),\n variableBorrowAPY: Number(reserve.variableBorrowAPY), \n stableBorrowAPY: Number(reserve.stableBorrowAPY),\n totalSupply: new BigNumber(reserve.totalLiquidity),\n totalBorrow: new BigNumber(reserve.totalDebt),\n utilizationRate: Number(reserve.utilizationRate),\n ltv: Number(reserve.baseLTVasCollateral) / 100,\n liquidationThreshold: Number(reserve.liquidationThreshold) / 100,\n liquidationBonus: Number(reserve.liquidationBonus) / 100,\n reserveFactor: Number(reserve.reserveFactor) / 100,\n priceInUSD: new BigNumber(reserve.priceInUSD || '0'),\n isActive: reserve.isActive,\n isFrozen: reserve.isFrozen,\n isPaused: reserve.isPaused,\n supplyCap: new BigNumber(reserve.supplyCap || '0'),\n borrowCap: new BigNumber(reserve.borrowCap || '0'),\n lastUpdated: Date.now(),\n }));\n\n } catch (error) {\n elizaLogger.error('Failed to get market data:', error);\n throw new AaveError(\n 'Failed to fetch market data',\n AaveErrorCode.DATA_FETCH_FAILED,\n error instanceof Error ? error : new Error(String(error)),\n {}\n );\n }\n }\n\n private async getReserveData(asset: string): Promise<any> {\n const marketData = await this.getMarketData();\n const assetData = marketData.find(m => \n m.asset.toLowerCase() === asset.toLowerCase() ||\n m.underlyingAsset.toLowerCase() === asset.toLowerCase()\n );\n \n if (!assetData) {\n throw new AaveError(\n `Asset not found in market data: ${asset}`,\n AaveErrorCode.ASSET_NOT_FOUND,\n undefined,\n { asset }\n );\n }\n\n return assetData;\n }\n\n async stop(): Promise<void> {\n elizaLogger.info('Stopping Aave service...');\n this.isInitialized = false;\n }\n}","import {\n Action,\n ActionResult,\n Memory,\n State,\n IAgentRuntime,\n ModelType,\n elizaLogger,\n} from '@elizaos/core';\nimport { AaveService } from '../services/aave-service.js';\nimport { SupplyParams, SupplyResult } from '../types/index.js';\nimport { validateSupplyParams } from '../utils/simple-validation.js';\n\nconst extractionTemplate = `Given the user's request to supply/deposit assets to Aave, extract the required information.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object with the following structure:\n{\n \"asset\": \"asset symbol (e.g., USDC, WETH, DAI) or address\",\n \"amount\": \"amount to supply as string (e.g., '100', '0.5')\",\n \"userAddress\": \"user's ethereum address if mentioned, otherwise null\"\n}\n\nImportant:\n- For ETH mentions, use \"WETH\" as the asset\n- Amount should be the numeric value only (no symbols)\n- If amount is \"all\", \"max\", or \"everything\", use \"max\"\n- Asset should be uppercase symbol if recognizable\n\nReturn only the JSON object, no other text.`;\n\nexport const supplyAction: Action = {\n name: 'SUPPLY_TO_AAVE',\n description: 'Supply assets to Aave V3 to earn yield and receive aTokens',\n similes: ['DEPOSIT_TO_AAVE', 'LEND_TO_AAVE', 'SUPPLY_ASSET', 'DEPOSIT_ASSET'],\n \n examples: [[\n {\n name: 'User',\n content: { text: 'I want to supply 1000 USDC to Aave' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'šŸ¦ Supplying 1000 USDC to Aave V3...\\n\\nāœ… Successfully supplied 1000 USDC\\nšŸ“„ Transaction: 0x123...abc\\nšŸŖ™ Received: 1000 aUSDC (earning yield)\\nšŸ’° Current APY: 3.25%',\n actions: ['SUPPLY_TO_AAVE']\n }\n }\n ], [\n {\n name: 'User',\n content: { text: 'deposit 0.5 ETH to start earning yield' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'šŸ¦ Supplying 0.5 WETH to Aave V3...\\n\\nāœ… Successfully supplied 0.5 WETH\\nšŸ“„ Transaction: 0x456...def\\nšŸŖ™ Received: 0.5 aWETH (earning yield)\\nšŸ’° Current APY: 2.15%',\n actions: ['SUPPLY_TO_AAVE']\n }\n }\n ], [\n {\n name: 'User',\n content: { text: 'supply all my DAI to aave for lending' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'šŸ¦ Supplying all available DAI to Aave V3...\\n\\nāœ… Successfully supplied 2,500 DAI\\nšŸ“„ Transaction: 0x789...ghi\\nšŸŖ™ Received: 2,500 aDAI (earning yield)\\nšŸ’° Current APY: 4.80%',\n actions: ['SUPPLY_TO_AAVE']\n }\n }\n ]],\n\n async validate(runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> {\n try {\n // Check if RPC URL is configured\n const rpcUrl = runtime.getSetting('AAVE_RPC_URL');\n if (!rpcUrl) {\n return false;\n }\n\n // Check if message content is related to supply/deposit operations\n const text = message.content.text?.toLowerCase() || '';\n \n // Must contain supply-related keywords AND have some indication of amount/asset\n const supplyKeywords = [\n 'supply', 'deposit', 'lend', 'provide liquidity'\n ];\n \n const hasSupplyKeyword = supplyKeywords.some(keyword => text.includes(keyword));\n \n // Basic checks for completeness - should have numbers or asset names\n const hasAmount = /\\d+/.test(text) || text.includes('all') || text.includes('max');\n const hasAsset = /(usdc|usdt|dai|eth|weth|btc|wbtc|aave|link)/i.test(text);\n \n return hasSupplyKeyword && (hasAmount || hasAsset);\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: any,\n callback?: Function\n ): Promise<ActionResult> {\n const content = message.content.text;\n if (!content) {\n const errorMessage = 'Please specify the asset and amount to supply to Aave.';\n await callback?.({ text: errorMessage, source: message.content.source });\n return { text: errorMessage, success: false };\n }\n\n let asset: string = '';\n let amount: string = '';\n let userAddress: string | undefined;\n\n try {\n // Get Aave service\n const aaveService = runtime.getService<AaveService>('aave');\n if (!aaveService) {\n throw new Error('Aave service not available');\n }\n\n // Extract parameters using LLM\n const prompt = extractionTemplate.replace('{{userMessage}}', content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, { prompt: prompt });\n\n try {\n // Strip markdown code blocks if present\n const cleanedResponse = response.replace(/^```(?:json)?\\n?/,'').replace(/\\n?```$/,'').trim();\n const parsed = JSON.parse(cleanedResponse);\n \n asset = parsed.asset;\n amount = parsed.amount;\n userAddress = parsed.userAddress;\n\n if (!asset || !amount) {\n throw new Error('Missing required parameters');\n }\n } catch (parseError) {\n elizaLogger.warn('Failed to parse LLM response, falling back to regex:', parseError);\n \n // Fallback regex patterns\n const amountAssetMatch = content.match(/(?:supply|deposit|lend)\\s+([a-zA-Z\\d.,]+)\\s+(\\w+)/i);\n const assetAmountMatch = content.match(/(\\w+)\\s+([a-zA-Z\\d.,]+)/i);\n \n if (amountAssetMatch) {\n amount = amountAssetMatch[1].replace(/,/g, '');\n asset = amountAssetMatch[2].toUpperCase();\n } else if (assetAmountMatch && assetAmountMatch[2].match(/^\\d/)) {\n asset = assetAmountMatch[1].toUpperCase();\n amount = assetAmountMatch[2].replace(/,/g, '');\n } else {\n throw new Error('Could not extract asset and amount from request');\n }\n\n // Convert ETH to WETH\n if (asset === 'ETH') {\n asset = 'WETH';\n }\n }\n\n // Prepare and validate supply parameters\n const supplyParams = validateSupplyParams({\n asset,\n amount: amount as any, // Let validation handle string to BigNumber conversion\n user: userAddress || runtime.getSetting('WALLET_ADDRESS') as string\n });\n\n // Execute supply operation\n const result: SupplyResult = await aaveService.supply(supplyParams);\n\n // Format success response\n const successMessage = `šŸ¦ **Successfully Supplied to Aave V3**\n\nšŸ’° **Amount**: ${result.suppliedAmount.toFixed(4)} ${asset}\nšŸŖ™ **Received**: ${result.aTokenAmount.toFixed(4)} a${asset}\nšŸ“„ **Transaction**: ${result.transactionHash}\nšŸ’° **New aToken Balance**: ${result.newATokenBalance.toFixed(4)} a${asset}\n\nYour a${asset} tokens will automatically earn yield! 🌱`;\n\n await callback?.({ \n text: successMessage,\n source: message.content.source\n });\n\n return {\n text: `Successfully supplied ${result.suppliedAmount.toFixed(4)} ${asset} to Aave`,\n success: true,\n data: {\n action: 'supply',\n asset,\n amount: result.suppliedAmount.toString(),\n aTokensReceived: result.aTokenAmount.toString(),\n newBalance: result.newATokenBalance.toString(),\n transactionHash: result.transactionHash\n }\n };\n\n } catch (error) {\n elizaLogger.error('Supply action failed:', error);\n \n let errorMessage: string;\n if (error instanceof Error) {\n if (error.message.includes('insufficient balance')) {\n errorMessage = `āŒ Insufficient ${asset} balance. Please check your wallet balance and try again.`;\n } else if (error.message.includes('allowance')) {\n errorMessage = `āŒ Token approval required. The transaction will include approval for ${asset}.`;\n } else if (error.message.includes('reserve inactive')) {\n errorMessage = `āŒ ${asset} market is currently inactive on Aave. Please try a different asset.`;\n } else if (error.message.includes('supply cap')) {\n errorMessage = `āŒ ${asset} supply cap reached on Aave. Please try a different asset or smaller amount.`;\n } else {\n errorMessage = `āŒ Supply failed: ${error.message}`;\n }\n } else {\n errorMessage = 'āŒ Supply failed due to an unknown error. Please try again.';\n }\n\n await callback?.({ \n text: errorMessage,\n source: message.content.source\n });\n\n return {\n text: errorMessage,\n success: false,\n data: {\n action: 'supply',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n };\n }\n }\n};","import {\n Action,\n ActionResult,\n Memory,\n State,\n IAgentRuntime,\n ModelType,\n elizaLogger,\n} from '@elizaos/core';\nimport { AaveService } from '../services/aave-service.js';\nimport { WithdrawParams, WithdrawResult } from '../types/index.js';\nimport { validateWithdrawParams } from '../utils/simple-validation.js';\n\nconst extractionTemplate = `Given the user's request to withdraw/redeem assets from Aave, extract the required information.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object with the following structure:\n{\n \"asset\": \"asset symbol (e.g., USDC, WETH, DAI) or address\",\n \"amount\": \"amount to withdraw as string (e.g., '100', '0.5', 'max')\",\n \"userAddress\": \"user's ethereum address if mentioned, otherwise null\"\n}\n\nImportant:\n- For ETH mentions, use \"WETH\" as the asset\n- Amount should be the numeric value only (no symbols)\n- If amount is \"all\", \"max\", \"everything\", or similar, use \"max\"\n- Asset should be uppercase symbol if recognizable\n\nReturn only the JSON object, no other text.`;\n\nexport const withdrawAction: Action = {\n name: 'WITHDRAW_FROM_AAVE',\n description: 'Withdraw supplied assets from Aave V3 by redeeming aTokens',\n similes: ['REDEEM_FROM_AAVE', 'UNSTAKE_FROM_AAVE', 'WITHDRAW_ASSET', 'REDEEM_ATOKEN'],\n \n examples: [[\n {\n name: 'User',\n content: { text: 'I want to withdraw 500 USDC from Aave' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'šŸ’ø Withdrawing 500 USDC from Aave V3...\\n\\nāœ… Successfully withdrew 500 USDC\\nšŸ“„ Transaction: 0x123...abc\\nšŸ”„ Burned: 500 aUSDC\\nšŸ’° Remaining balance: 1,500 aUSDC\\nšŸ“Š Earning: 3.25% APY on remaining balance',\n actions: ['WITHDRAW_FROM_AAVE']\n }\n }\n ], [\n {\n name: 'User',\n content: { text: 'redeem 0.1 ETH from my aave position' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'šŸ’ø Withdrawing 0.1 WETH from Aave V3...\\n\\nāœ… Successfully withdrew 0.1 WETH\\nšŸ“„ Transaction: 0x456...def\\nšŸ”„ Burned: 0.1 aWETH\\nšŸ’° Remaining balance: 0.9 aWETH\\nšŸ“Š Earning: 2.15% APY on remaining balance',\n actions: ['WITHDRAW_FROM_AAVE']\n }\n }\n ], [\n {\n name: 'User',\n content: { text: 'withdraw all my DAI from aave lending' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'šŸ’ø Withdrawing all available DAI from Aave V3...\\n\\nāœ… Successfully withdrew 2,500 DAI\\nšŸ“„ Transaction: 0x789...ghi\\nšŸ”„ Burned: 2,500 aDAI\\nšŸ’° Remaining balance: 0 aDAI\\nšŸŽ‰ Position fully withdrawn!',\n actions: ['WITHDRAW_FROM_AAVE']\n }\n }\n ], [\n {\n name: 'User',\n content: { text: 'can I get my 100 USDT back from aave?' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'šŸ’ø Withdrawing 100 USDT from Aave V3...\\n\\nāœ… Successfully withdrew 100 USDT\\nšŸ“„ Transaction: 0xabc...xyz\\nšŸ”„ Burned: 100 aUSDT\\nšŸ’° Remaining balance: 400 aUSDT\\nšŸ“Š Earning: 4.10% APY on remaining balance',\n actions: ['WITHDRAW_FROM_AAVE']\n }\n }\n ]],\n\n async validate(runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> {\n try {\n // Check if RPC URL is configured\n const rpcUrl = runtime.getSetting('AAVE_RPC_URL');\n if (!rpcUrl) {\n return false;\n }\n\n // Check if message content is related to withdraw/redeem operations\n const text = message.content.text?.toLowerCase() || '';\n const withdrawKeywords = [\n 'withdraw', 'redeem', 'unstake', 'take out', 'get back',\n 'withdraw from aave', 'redeem from aave', 'unstake from aave',\n 'cash out', 'exit position'\n ];\n\n return withdrawKeywords.some(keyword => text.includes(keyword));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: any,\n callback?: Function\n ): Promise<ActionResult> {\n const content = message.content.text;\n if (!content) {\n const errorMessage = 'Please specify the asset and amount to withdraw from Aave.';\n await callback?.({ text: errorMessage, source: message.content.source });\n return { text: errorMessage, success: false };\n }\n\n let asset: string = '';\n let amount: string = '';\n let userAddress: string | undefined;\n\n try {\n // Get Aave service\n const aaveService = runtime.getService<AaveService>('aave');\n if (!aaveService) {\n throw new Error('Aave service not available');\n }\n\n // Extract parameters using LLM\n const prompt = extractionTemplate.replace('{{userMessage}}', content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, { prompt: prompt });\n\n try {\n // Strip markdown code blocks if present\n const cleanedResponse = response.replace(/^```(?:json)?\\n?/,'').replace(/\\n?```$/,'').trim();\n const parsed = JSON.parse(cleanedResponse);\n \n asset = parsed.asset;\n amount = parsed.amount;\n userAddress = parsed.userAddress;\n\n if (!asset || !amount) {\n throw new Error('Missing required parameters');\n }\n } catch (parseError) {\n elizaLogger.warn('Failed to parse LLM response, falling back to regex:', parseError);\n \n // Fallback regex patterns\n const amountAssetMatch = content.match(/(?:withdraw|redeem|get.*back)\\s+([a-zA-Z\\d.,]+)\\s+(\\w+)/i);\n const assetAmountMatch = content.match(/(\\w+)\\s+([a-zA-Z\\d.,]+)/i);\n const maxPatterns = /(?:withdraw|redeem|get).*(?:all|max|everything|full)/i;\n \n if (amountAssetMatch) {\n amount = amountAssetMatch[1].replace(/,/g, '');\n asset = amountAssetMatch[2].toUpperCase();\n } else if (assetAmountMatch && assetAmountMatch[2].match(/^\\d/)) {\n asset = assetAmountMatch[1].toUpperCase();\n amount = assetAmountMatch[2].replace(/,/g, '');\n } else if (maxPatterns.test(content)) {\n // Try to extract asset from context\n const assetMatch = content.match(/(?:withdraw|redeem).*?(USDC|WETH|ETH|DAI|USDT|WBTC|LINK|UNI|AAVE|CRV|COMP)/i);\n if (assetMatch) {\n asset = assetMatch[1].toUpperCase();\n amount = 'max';\n } else {\n throw new Error('Could not extract asset from request');\n }\n } else {\n throw new Error('Could not extract asset and amount from request');\n }\n\n // Convert ETH to WETH\n if (asset === 'ETH') {\n asset = 'WETH';\n }\n }\n\n // Prepare and validate withdraw parameters\n const withdrawParams = validateWithdrawParams({\n asset,\n amount: amount as any, // Let validation handle string to BigNumber conversion\n user: userAddress || runtime.getSetting('WALLET_ADDRESS') as string\n });\n\n // Execute withdraw operation\n const result: WithdrawResult = await aaveService.withdraw(withdrawParams);\n\n // Format success response\n let successMessage: string;\n \n if (result.remainingATokenBalance.isZero()) {\n // Full withdrawal\n successMessage = `šŸ’ø **Successfully Withdrew from Aave V3**\n\nšŸŽ‰ **Full Withdrawal Complete!**\nšŸ’° **Amount**: ${result.amountWithdrawn.toFixed(4)} ${asset}\nšŸ“„ **Transaction**: ${result.transactionHash}\nšŸ’° **Remaining Balance**: 0 a${asset}\n\nYour position has been fully withdrawn! šŸ`;\n } else {\n // Partial withdrawal\n successMessage = `šŸ’ø **Successfully Withdrew from Aave V3**\n\nšŸ’° **Amount**: ${result.amountWithdrawn.toFixed(4)} ${asset}\nšŸ“„ **Transaction**: ${result.transactionHash}\nšŸ’° **Remaining Balance**: ${result.remainingATokenBalance.toFixed(4)} a${asset}\n\nYour remaining a${asset} tokens continue earning yield! 🌱`;\n }\n\n await callback?.({ \n text: successMessage,\n source: message.content.source\n });\n\n return {\n text: `Successfully withdrew ${result.amountWithdrawn.toFixed(4)} ${asset} from Aave`,\n success: true,\n data: {\n action: 'withdraw',\n asset,\n amount: result.amountWithdrawn.toString(),\n remainingBalance: result.remainingATokenBalance.toString(),\n transactionHash: result.transactionHash,\n isFullWithdrawal: result.remainingATokenBalance.isZero()\n }\n };\n\n } catch (error) {\n elizaLogger.error('Withdraw action failed:', error);\n \n let errorMessage: string;\n if (error instanceof Error) {\n if (error.message.includes('insufficient atoken') || error.message.includes('no atoken balance')) {\n errorMessage = `āŒ Insufficient a${asset || 'Token'} balance. You don't have enough supplied to withdraw this amount.`;\n } else if (error.message.includes('exceeds balance')) {\n errorMessage = `āŒ Withdrawal amount exceeds your a${asset || 'Token'} balance. Check your supplied position and try a smaller amount.`;\n } else if (error.message.includes('reserve frozen')) {\n errorMessage = `āŒ ${asset || 'Asset'} withdrawals are currently frozen on Aave. Only emergency withdrawals may be available.`;\n } else if (error.message.includes('reserve paused')) {\n errorMessage = `āŒ ${asset || 'Asset'} operations are temporarily paused on Aave. Please try again later.`;\n } else if (error.message.includes('health factor')) {\n errorMessage = `āŒ Cannot withdraw - would leave position with insufficient collateral. Supply more collateral or reduce borrows first.`;\n } else if (error.message.includes('reserve inactive')) {\n errorMessage = `āŒ ${asset || 'Asset'} market is currently inactive on Aave. Please try a different asset.`;\n } else {\n errorMessage = `āŒ Withdrawal failed: ${error.message}`;\n }\n } else {\n errorMessage = 'āŒ Withdrawal failed due to an unknown error. Please try again.';\n }\n\n await callback?.({ \n text: errorMessage,\n source: message.content.source\n });\n\n return {\n text: errorMessage,\n success: false,\n data: {\n action: 'withdraw',\n error: error instanceof Error ? error.message : 'Unknown error'\n }\n };\n }\n }\n};","import {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n elizaLogger,\n} from '@elizaos/core';\nimport { AaveService } from '../services/aave-service.js';\nimport { InterestRateMode, BorrowParams } from '../types/index.js';\nimport { parseAmount } from '../utils/simple-validation.js';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Template for borrow operation prompts - used by LLM to extract parameters\n */\nexport const borrowTemplate = `Extract the borrowing parameters from the user's request.\n\nExamples:\n- \"borrow 1000 USDC variable rate\" → asset: USDC, amount: 1000, interestRateMode: VARIABLE\n- \"borrow 0.5 ETH stable\" → asset: ETH, amount: 0.5, interestRateMode: STABLE \n- \"take a loan of 500 DAI with variable interest\" → asset: DAI, amount: 500, interestRateMode: VARIABLE\n- \"borrow maximum USDT variable rate\" → asset: USDT, amount: max, interestRateMode: VARIABLE\n\nThe user wants to borrow: {{user_request}}\n\nRespond with a JSON object containing:\n{\n \"asset\": \"asset_symbol_or_address\",\n \"amount\": \"numeric_amount_or_max\",\n \"interestRateMode\": \"STABLE_or_VARIABLE\",\n \"user\": \"user_wallet_address\"\n}\n\nImportant:\n- interestRateMode must be either \"STABLE\" or \"VARIABLE\" \n- For stable rates, use \"STABLE\"\n- For variable rates, use \"VARIABLE\"\n- If not specified, default to \"VARIABLE\"\n- amount should be a number or \"max\" for maximum available`;\n\n/**\n * Action for borrowing assets from Aave V3\n */\nexport const borrowAction: Action = {\n name: 'AAVE_BORROW',\n similes: [\n 'BORROW_FROM_AAVE',\n 'AAVE_LOAN',\n 'TAKE_LOAN',\n 'BORROW_ASSET',\n 'DEFI_BORROW'\n ],\n description: 'Borrow assets from Aave V3 protocol with specified interest rate mode',\n \n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const content = message.content?.text?.toLowerCase();\n if (!content) return false;\n \n // Check for borrow-related keywords\n const borrowKeywords = [\n 'borrow', 'loan', 'take loan', 'get loan',\n 'variable rate', 'stable rate', 'interest rate'\n ];\n \n const hasBorrowKeyword = borrowKeywords.some(keyword => \n content.includes(keyword)\n );\n \n if (!hasBorrowKeyword) return false;\n \n // Check for asset mentions or amounts\n const hasAssetOrAmount = /\\b(usdc|usdt|dai|eth|weth|btc|wbtc|\\d+\\.?\\d*)\\b/i.test(content);\n \n return hasAssetOrAmount;\n },\n\n examples: [[\n {\n name: 'User',\n content: { text: 'I want to borrow 1000 USDC with variable rate from Aave' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll help you borrow 1000 USDC with variable interest rate from Aave V3.',\n actions: ['AAVE_BORROW']\n }\n }\n ], [\n {\n name: 'User',\n content: { text: 'Take a loan of 0.5 ETH with stable rate' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll process your loan of 0.5 ETH with stable interest rate from Aave.',\n actions: ['AAVE_BORROW']\n }\n }\n ]],\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: any,\n options?: any,\n callback?: any\n ): Promise<ActionResult> => {\n try {\n elizaLogger.info('Starting Aave borrow operation...');\n \n // Get Aave service\n const aaveService = runtime.getService<AaveService>('aave');\n if (!aaveService) {\n throw new Error('Aave service not available');\n }\n\n // Extract borrow parameters using regex\n const content = message.content?.text;\n if (!content) {\n throw new Error('No message content provided');\n }\n \n // Parse asset and amount\n let asset: string = '';\n let amount: string = '';\n let rateMode: InterestRateMode = InterestRateMode.VARIABLE; // Default to variable\n \n // Match patterns like \"borrow 1000 USDC\", \"take loan of 0.5 ETH\", etc.\n const amountAssetMatch = content.match(/(?:borrow|loan|take loan|get loan)(?:\\s+of)?\\s+([a-zA-Z\\d.,]+)\\s+(\\w+)/i);\n const assetAmountMatch = content.match(/(\\w+)\\s+([a-zA-Z\\d.,]+)/i);\n \n if (amountAssetMatch) {\n amount = amountAssetMatch[1].replace(/,/g, '');\n asset = amountAssetMatch[2].toUpperCase();\n } else if (assetAmountMatch && assetAmountMatch[2].match(/^\\d/)) {\n asset = assetAmountMatch[1].toUpperCase();\n amount = assetAmountMatch[2].replace(/,/g, '');\n } else {\n throw new Error('Could not extract asset and amount from request. Please specify like \"borrow 1000 USDC\"');\n }\n \n // Determine interest rate mode\n if (content.toLowerCase().includes('stable')) {\n rateMode = InterestRateMode.STABLE;\n }\n \n // Convert ETH to WETH\n if (asset === 'ETH') {\n asset = 'WETH';\n }\n\n // Get user address from runtime settings\n const userAddress = runtime.getSetting('WALLET_ADDRESS');\n if (!userAddress) {\n throw new Error('Wallet address not configured. Please set WALLET_ADDRESS in settings.');\n }\n\n // Parse amount\n const parsedAmount = parseAmount(amount);\n\n elizaLogger.info(`Borrowing ${parsedAmount} ${asset} with ${rateMode === InterestRateMode.STABLE ? 'stable' : 'variable'} rate for ${userAddress}`);\n\n // Create borrow parameters\n const params: BorrowParams = {\n asset,\n amount: parsedAmount,\n interestRateMode: rateMode,\n user: userAddress,\n };\n\n // Execute borrow operation\n const result = await aaveService.borrow(params);\n\n if (!result.success) {\n throw new Error(`Borrow operation failed: ${result.error?.message}`);\n }\n\n // Format success response\n const rateTypeText = rateMode === InterestRateMode.STABLE ? 'stable' : 'variable';\n const successMessage = `šŸ’° **Successfully Borrowed from Aave V3**\n\nšŸŽ‰ **Loan Approved!**\nšŸ’ø **Amount**: ${result.amountBorrowed.toFixed(4)} ${asset}\nšŸ“ˆ **Interest Rate**: ${rateTypeText.charAt(0).toUpperCase() + rateTypeText.slice(1)} (${result.currentBorrowAPY.toFixed(2)}% APY)\nšŸ“„ **Transaction**: ${result.transactionHash}\nšŸ„ **Health Factor**: ${result.newHealthFactor.toFixed(3)}\n\n${result.newHealthFactor < 1.5 ? \n 'āš ļø **Warning**: Your health factor is getting low. Consider adding more collateral!' : \n 'āœ… Your position looks healthy! Monitor your health factor regularly.'\n}`;\n\n await callback?.({ \n text: successMessage,\n source: message.content.source\n });\n\n return {\n text: `Successfully borrowed ${result.amountBorrowed.toFixed(4)} ${asset} from Aave`,\n success: true,\n data: {\n action: 'borrow',\n asset,\n amount: result.amountBorrowed.toString(),\n interestRateMode: rateTypeText,\n currentAPY: result.currentBorrowAPY,\n transactionHash: result.transactionHash,\n healthFactor: result.newHealthFactor\n }\n };\n\n } catch (error) {\n elizaLogger.error('Borrow action failed:', error);\n \n let errorMessage: string;\n if (error instanceof Error) {\n if (error.message.includes('insufficient collateral')) {\n errorMessage = `āŒ **Insufficient Collateral**\n\nYou don't have enough collateral to borrow this amount. \nšŸ’” **Try this:**\n• Supply more assets as collateral first\n• Reduce the borrow amount\n• Check your health factor`;\n } else if (error.message.includes('borrowing not enabled')) {\n errorMessage = `āŒ **Borrowing Not Available**\n\nThis asset cannot be borrowed on Aave V3 currently.\nšŸ’” **Try borrowing a different asset like USDC, USDT, or DAI**`;\n } else if (error.message.includes('health factor')) {\n errorMessage = `āŒ **Health Factor Too Low**\n\nThis borrow would put your position at risk of liquidation.\nšŸ’” **Add more collateral or reduce borrow amount**`;\n } else {\n errorMessage = `āŒ **Borrow Failed**: ${error.message}`;\n }\n } else {\n errorMessage = 'āŒ **Borrow operation failed**. Please try again or check your parameters.';\n }\n\n await callback?.({ \n text: errorMessage,\n error: true\n });\n\n return {\n text: error instanceof Error ? error.message : 'Borrow operation failed',\n success: false,\n error: error instanceof Error ? error : new Error(String(error))\n };\n }\n }\n};","import {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n elizaLogger,\n} from '@elizaos/core';\nimport { AaveService } from '../services/aave-service.js';\nimport { InterestRateMode, RepayParams } from '../types/index.js';\nimport { parseAmount, isMaxAmount } from '../utils/simple-validation.js';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Template for repay operation prompts - used by LLM to extract parameters\n */\nexport const repayTemplate = `Extract the repayment parameters from the user's request.\n\nExamples:\n- \"repay 1000 USDC variable debt\" → asset: USDC, amount: 1000, interestRateMode: VARIABLE\n- \"repay 0.5 ETH stable debt\" → asset: ETH, amount: 0.5, interestRateMode: STABLE\n- \"repay all DAI variable\" → asset: DAI, amount: max, interestRateMode: VARIABLE \n- \"pay back 500 USDT stable rate debt\" → asset: USDT, amount: 500, interestRateMode: STABLE\n- \"repay maximum USDC debt\" → asset: USDC, amount: max, interestRateMode: VARIABLE\n\nThe user wants to repay: {{user_request}}\n\nRespond with a JSON object containing:\n{\n \"asset\": \"asset_symbol_or_address\",\n \"amount\": \"numeric_amount_or_max\",\n \"interestRateMode\": \"STABLE_or_VARIABLE\",\n \"user\": \"user_wallet_address\"\n}\n\nImportant:\n- interestRateMode must be either \"STABLE\" or \"VARIABLE\" based on the debt type being repaid\n- For stable debt repayment, use \"STABLE\"\n- For variable debt repayment, use \"VARIABLE\" \n- If not specified, default to \"VARIABLE\" (most common)\n- amount should be a number or \"max\" for full repayment`;\n\n/**\n * Action for repaying debt to Aave V3\n */\nexport const repayAction: Action = {\n name: 'AAVE_REPAY',\n similes: [\n 'REPAY_TO_AAVE',\n 'AAVE_REPAYMENT',\n 'PAY_BACK',\n 'REPAY_DEBT',\n 'DEFI_REPAY',\n 'PAYBACK_LOAN'\n ],\n description: 'Repay borrowed assets to Aave V3 protocol',\n \n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const content = message.content?.text?.toLowerCase();\n if (!content) return false;\n \n // Check for repay-related keywords\n const repayKeywords = [\n 'repay', 'pay back', 'payback', 'pay off',\n 'repayment', 'debt', 'loan repay', 'close position'\n ];\n \n const hasRepayKeyword = repayKeywords.some(keyword => \n content.includes(keyword)\n );\n \n if (!hasRepayKeyword) return false;\n \n // Check for asset mentions, amounts, or max keywords\n const hasAssetOrAmount = /\\b(usdc|usdt|dai|eth|weth|btc|wbtc|\\d+\\.?\\d*|all|everything|max|maximum)\\b/i.test(content);\n \n return hasAssetOrAmount;\n },\n\n examples: [[\n {\n name: 'User',\n content: { text: 'I want to repay 1000 USDC variable debt to Aave' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll help you repay 1000 USDC variable debt to Aave V3.',\n actions: ['AAVE_REPAY']\n }\n }\n ], [\n {\n name: 'User',\n content: { text: 'Pay back all my ETH debt with stable rate' }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll process the full repayment of your ETH stable debt.',\n actions: ['AAVE_REPAY']\n }\n }\n ]],\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: any,\n options?: any,\n callback?: any\n ): Promise<ActionResult> => {\n // Parse asset and amount outside try block for error handling scope\n let asset: string = '';\n let amount: string = '';\n \n try {\n elizaLogger.info('Starting Aave repay operation...');\n \n // Get Aave service\n const aaveService = runtime.getService<AaveService>('aave');\n if (!aaveService) {\n throw new Error('Aave service not available');\n }\n\n // Extract repay parameters using regex\n const content = message.content?.text;\n if (!content) {\n throw new Error('No message content provided');\n }\n \n // Parse asset and amount\n let rateMode: InterestRateMode = InterestRateMode.VARIABLE; // Default to variable\n \n // Match patterns like \"repay 1000 USDC\", \"pay back 0.5 ETH\", etc.\n const amountAssetMatch = content.match(/(?:repay|pay back|payback|pay off)(?:\\s+(?:all|full|maximum|max))?\\s+([a-zA-Z\\d.,]+)\\s+(\\w+)/i);\n const assetAmountMatch = content.match(/(\\w+)\\s+([a-zA-Z\\d.,]+)/i);\n const maxRepayMatch = content.match(/(?:repay|pay back|payback|pay off)\\s+(?:all|full|maximum|max|everything)(?:\\s+(\\w+))?/i);\n \n if (maxRepayMatch) {\n // Handle \"repay all USDC\" or \"pay back everything\"\n amount = 'max';\n asset = maxRepayMatch[1]?.toUpperCase() || 'USDC'; // Default to USDC if not specified\n } else if (amountAssetMatch) {\n amount = amountAssetMatch[1].replace(/,/g, '');\n asset = amountAssetMatch[2].toUpperCase();\n } else if (assetAmountMatch && assetAmountMatch[2].match(/^\\d/)) {\n asset = assetAmountMatch[1].toUpperCase();\n amount = assetAmountMatch[2].replace(/,/g, '');\n } else {\n throw new Error('Could not extract asset and amount from request. Please specify like \"repay 1000 USDC\"');\n }\n \n // Determine interest rate mode\n if (content.toLowerCase().includes('stable')) {\n rateMode = InterestRateMode.STABLE;\n }\n \n // Convert ETH to WETH\n if (asset === 'ETH') {\n asset = 'WETH';\n }\n\n // Get user address from runtime settings\n const userAddress = runtime.getSetting('WALLET_ADDRESS');\n if (!userAddress) {\n throw new Error('Wallet address not configured. Please set WALLET_ADDRESS in settings.');\n }\n\n // Parse amount\n const parsedAmount = parseAmount(amount);\n const isFullRepayment = isMaxAmount(parsedAmount);\n\n elizaLogger.info(`Repaying ${isFullRepayment ? 'full' : amount} ${asset} ${rateMode === InterestRateMode.STABLE ? 'stable' : 'variable'} debt for ${userAddress}`);\n\n // Create repay parameters\n const params: RepayParams = {\n asset,\n amount: parsedAmount,\n interestRateMode: rateMode,\n user: userAddress,\n };\n\n // Execute repay operation\n const result = await aaveService.repay(params);\n\n if (!result.success) {\n throw new Error(`Repay operation failed: ${result.error?.message}`);\n }\n\n // Format success response\n const rateTypeText = rateMode === InterestRateMode.STABLE ? 'stable' : 'variable';\n let successMessage: string;\n \n if (result.remainingDebt.isZero()) {\n // Full debt repayment\n successMessage = `šŸ’ø **Successfully Repaid Debt to Aave V3**\n\nšŸŽ‰ **Debt Fully Repaid!**\nšŸ’° **Amount**: ${result.amountRepaid.toFixed(4)} ${asset}\nšŸ“ˆ **Debt Type**: ${rateTypeText.charAt(0).toUpperCase() + rateTypeText.slice(1)} rate\nšŸ“„ **Transaction**: ${result.transactionHash}\n${result.approvalTransactionHash ? `šŸ”“ **Approval**: ${result.approvalTransactionHash}` : ''}\nšŸ„ **Health Factor**: ${result.newHealthFactor.toFixed(3)}\nšŸ’° **Remaining Debt**: $0.00\n\nšŸŽŠ Congratulations! You've completely paid off your ${asset} debt!`;\n } else {\n // Partial repayment\n successMessage = `šŸ’ø **Successfully Repaid Debt to Aave V3**\n\nšŸ’° **Amount**: ${result.amountRepaid.toFixed(4)} ${asset}\nšŸ“ˆ **Debt Type**: ${rateTypeText.charAt(0).toUpperCase() + rateTypeText.slice(1)} rate\nšŸ“„ **Transaction**: ${result.transactionHash}\n${result.approvalTransactionHash ? `šŸ”“ **Approval**: ${result.approvalTransactionHash}` : ''}\nšŸ„ **Health Factor**: ${result.newHealthFactor.toFixed(3)}\nšŸ’° **Remaining Debt**: ${result.remainingDebt.toFixed(4)} ETH equivalent\n\nāœ… Your position health has improved!`;\n }\n\n await callback?.({ \n text: successMessage,\n source: message.content.source\n });\n\n return {\n text: `Successfully repaid ${result.amountRepaid.toFixed(4)} ${asset} to Aave`,\n success: true,\n data: {\n action: 'repay',\n asset,\n amount: result.amountRepaid.toString(),\n interestRateMode: rateTypeText,\n transactionHash: result.transactionHash,\n approvalTransactionHash: result.approvalTransactionHash,\n healthFactor: result.newHealthFactor,\n remainingDebt: result.remainingDebt.toString(),\n isFullRepayment: result.remainingDebt.isZero()\n }\n };\n\n } catch (error) {\n elizaLogger.error('Repay action failed:', error);\n \n let errorMessage: string;\n if (error instanceof Error) {\n if (error.message.includes('insufficient balance')) {\n errorMessage = `āŒ **Insufficient Balance**\n\nYou don't have enough ${asset || 'tokens'} to repay this amount.\nšŸ’” **Try this:**\n• Check your wallet balance\n• Reduce the repay amount\n• Get more tokens first`;\n } else if (error.message.includes('no debt')) {\n errorMessage = `āŒ **No Debt Found**\n\nYou don't have any debt for this asset/rate type on Aave V3.\nšŸ’” **Check your position to see current debts**`;\n } else if (error.message.includes('allowance')) {\n errorMessage = `āŒ **Token Approval Failed**\n\nCould not approve tokens for repayment.\nšŸ’” **This might be a temporary issue - please try again**`;\n } else {\n errorMessage = `āŒ **Repay Failed**: ${error.message}`;\n }\n } else {\n errorMessage = 'āŒ **Repayment operation failed**. Please try again or check your parameters.';\n }\n\n await callback?.({ \n text: errorMessage,\n error: true\n });\n\n return {\n text: error instanceof Error ? error.message : 'Repay operation failed',\n success: false,\n error: error instanceof Error ? error : new Error(String(error))\n };\n }\n }\n};","import { Provider, IAgentRuntime, Memory, elizaLogger, State, ProviderResult } from '@elizaos/core';\nimport { AaveService } from '../services/aave-service.js';\nimport { MarketData } from '../types/index.js';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Provider for Aave V3 market data and lending rates\n * Supplies current market conditions to inform user decisions\n */\nexport const marketDataProvider: Provider = {\n name: 'AAVE_MARKET_DATA',\n get: async (runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> => {\n try {\n elizaLogger.info('Fetching Aave V3 market data...');\n\n // Get Aave service\n const aaveService = runtime.getService<AaveService>('aave');\n if (!aaveService) {\n return { text: 'Aave service not available - cannot fetch market data.' };\n }\n\n // Fetch market data\n const marketData: MarketData[] = await aaveService.getMarketData();\n\n if (!marketData || marketData.length === 0) {\n return { text: 'No market data available for Aave V3 at this time.' };\n }\n\n // Filter for major assets and sort by total supply\n const majorAssets = marketData\n .filter(data => ['USDC', 'USDT', 'DAI', 'WETH', 'ETH', 'WBTC', 'BTC'].includes(data.asset))\n .sort((a, b) => {\n const comparison = b.totalSupply.comparedTo(a.totalSupply);\n return comparison === null ? 0 : comparison;\n })\n .slice(0, 8); // Top 8 assets\n\n if (majorAssets.length === 0) {\n return { text: 'Market data not available for major assets.' };\n }\n\n // Format market data\n let marketSummary = `šŸ“Š **Aave V3 Market Overview** (Ethereum)\\n\\n`;\n\n // Add market highlights\n const totalLiquidity = majorAssets.reduce(\n (sum, asset) => sum.plus(asset.totalSupply),\n new BigNumber(0)\n );\n\n const avgSupplyAPY = majorAssets.reduce(\n (sum, asset) => sum + asset.supplyAPY,\n 0\n ) / majorAssets.length;\n\n marketSummary += `šŸ’° **Total Liquidity**: $${formatLargeNumber(totalLiquidity)} across major assets\\n`;\n marketSummary += `šŸ“ˆ **Avg Supply APY**: ${avgSupplyAPY.toFixed(2)}%\\n\\n`;\n\n // Asset details table\n marketSummary += `**šŸ¦ Lending Rates:**\\n`;\n marketSummary += `\\`\\`\\`\\n`;\n marketSummary += `Asset Supply APY Borrow APY Utilization\\n`;\n marketSummary += `────────────────────────────────────────\\n`;\n\n for (const asset of majorAssets) {\n const assetSymbol = asset.asset.padEnd(6);\n const supplyRate = `${asset.supplyAPY.toFixed(2)}%`.padStart(9);\n const borrowRate = `${asset.variableBorrowAPY.toFixed(2)}%`.padStart(9);\n const utilization = `${(asset.utilizationRate * 100).toFixed(1)}%`.padStart(9);\n \n marketSummary += `${assetSymbol} ${supplyRate} ${borrowRate} ${utilization}\\n`;\n }\n marketSummary += `\\`\\`\\`\\n\\n`;\n\n // Market insights\n const highYieldAssets = majorAssets\n .filter(asset => asset.supplyAPY > 3.0)\n .sort((a, b) => b.supplyAPY - a.supplyAPY);\n\n const lowBorrowCostAssets = majorAssets\n .filter(asset => asset.variableBorrowAPY < 5.0)\n .sort((a, b) => a.variableBorrowAPY - b.variableBorrowAPY);\n\n if (highYieldAssets.length > 0) {\n marketSummary += `🌟 **High Yield Opportunities:**\\n`;\n highYieldAssets.slice(0, 3).forEach(asset => {\n marketSummary += `• ${asset.asset}: ${asset.supplyAPY.toFixed(2)}% APY\\n`;\n });\n marketSummary += `\\n`;\n }\n\n if (lowBorrowCostAssets.length > 0) {\n marketSummary += `šŸ’ø **Low Borrow Costs:**\\n`;\n lowBorrowCostAssets.slice(0, 3).forEach(asset => {\n marketSummary += `• ${asset.asset}: ${asset.variableBorrowAPY.toFixed(2)}% APY\\n`;\n });\n marketSummary += `\\n`;\n }\n\n // Risk warnings\n const highUtilAssets = majorAssets.filter(asset => asset.utilizationRate > 0.8);\n if (highUtilAssets.length > 0) {\n marketSummary += `āš ļø **High Utilization Warning:**\\n`;\n highUtilAssets.forEach(asset => {\n marketSummary += `• ${asset.asset}: ${(asset.utilizationRate * 100).toFixed(1)}% utilized\\n`;\n });\n marketSummary += `Higher utilization may impact liquidity and rates.\\n\\n`;\n }\n\n marketSummary += `šŸ“… *Data updated: ${new Date().toLocaleString()}*`;\n\n return { text: marketSummary };\n\n } catch (error) {\n elizaLogger.error('Failed to get market data:', error);\n return { text: 'Unable to fetch current market data from Aave V3. Please try again later.' };\n }\n }\n};\n\n/**\n * Format large numbers in a human-readable way\n */\nfunction formatLargeNumber(num: BigNumber): string {\n if (num.isGreaterThanOrEqualTo(1e9)) {\n return `${num.dividedBy(1e9).toFixed(1)}B`;\n } else if (num.isGreaterThanOrEqualTo(1e6)) {\n return `${num.dividedBy(1e6).toFixed(1)}M`;\n } else if (num.isGreaterThanOrEqualTo(1e3)) {\n return `${num.dividedBy(1e3).toFixed(1)}K`;\n }\n return num.toFixed(2);\n}","import { Provider, IAgentRuntime, Memory, elizaLogger, State, ProviderResult } from '@elizaos/core';\nimport { AaveService } from '../services/aave-service.js';\nimport { UserPosition, SimplePosition } from '../types/index.js';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Provider for user's Aave V3 position data\n * Shows current supply, borrow positions, and health metrics\n */\nexport const positionProvider: Provider = {\n name: 'AAVE_POSITION',\n get: async (runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> => {\n try {\n elizaLogger.info('Fetching user Aave V3 position...');\n\n // Get user address from runtime settings\n const userAddress = runtime.getSetting('WALLET_ADDRESS');\n if (!userAddress) {\n return { text: 'Wallet address not configured. Please set WALLET_ADDRESS to view your position.' };\n }\n\n // Get Aave service\n const aaveService = runtime.getService<AaveService>('aave');\n if (!aaveService) {\n return { text: 'Aave service not available - cannot fetch position data.' };\n }\n\n // Fetch user position\n const position: UserPosition = await aaveService.getUserPosition(userAddress);\n\n if (!position) {\n return { text: 'Unable to fetch your Aave V3 position at this time.' };\n }\n\n // Check if user has any positions\n const hasSupplyPositions = position.positions.some(p => p.suppliedAmount.isGreaterThan(0));\n const hasBorrowPositions = position.positions.some(p => \n p.borrowedAmountVariable.isGreaterThan(0) || p.borrowedAmountStable.isGreaterThan(0)\n );\n\n if (!hasSupplyPositions && !hasBorrowPositions) {\n return { text: `šŸ’¼ **Your Aave V3 Position**\n\nšŸ¦ **No active positions found**\n\nYou don't have any supplies or borrows on Aave V3 yet.\nReady to start your DeFi journey? Try:\n• \"supply 1000 USDC\" to start earning yield\n• Check current \"market rates\" for opportunities` };\n }\n\n // Format position summary\n let positionSummary = `šŸ’¼ **Your Aave V3 Position**\\n\\n`;\n \n // Address (shortened)\n const shortAddress = `${userAddress.slice(0, 6)}...${userAddress.slice(-4)}`;\n positionSummary += `šŸ‘¤ **Address**: ${shortAddress}\\n\\n`;\n\n // Overall health metrics\n positionSummary += `šŸ„ **Health Overview:**\\n`;\n positionSummary += `• Health Factor: ${position.healthFactor.isFinite() ? position.healthFactor.toFixed(3) : 'āˆž'}\\n`;\n positionSummary += `• Total Collateral: $${position.totalCollateralETH.toFixed(2)}\\n`;\n positionSummary += `• Total Debt: $${position.totalDebtETH.toFixed(2)}\\n`;\n \n if (position.totalDebtETH.isGreaterThan(0)) {\n positionSummary += `• Available to Borrow: $${position.availableBorrowsETH.toFixed(2)}\\n`;\n positionSummary += `• LTV Ratio: ${(position.ltv * 100).toFixed(1)}%\\n`;\n }\n positionSummary += `\\n`;\n\n // Health factor warning\n if (position.healthFactor.isFinite() && position.healthFactor.isLessThan(1.5)) {\n positionSummary += `āš ļø **HEALTH FACTOR WARNING**\\n`;\n if (position.healthFactor.isLessThan(1.1)) {\n positionSummary += `🚨 **CRITICAL**: Your position is near liquidation!\\n`;\n } else {\n positionSummary += `⚔ **CAUTION**: Consider adding collateral or reducing debt\\n`;\n }\n positionSummary += `\\n`;\n }\n\n // Supply positions\n const supplies = position.positions.filter(p => p.suppliedAmount.isGreaterThan(0));\n if (supplies.length > 0) {\n positionSummary += `šŸ’° **Supply Positions:**\\n`;\n positionSummary += `\\`\\`\\`\\n`;\n positionSummary += `Asset Amount APY Collateral\\n`;\n positionSummary += `────────────────────────────────\\n`;\n \n for (const supply of supplies) {\n const asset = supply.asset.padEnd(6);\n const amount = formatNumber(supply.suppliedAmount).padStart(10);\n const apy = `${supply.supplyAPY.toFixed(2)}%`.padStart(6);\n const collateral = (supply.isCollateral ? 'āœ…' : 'āŒ').padStart(10);\n \n positionSummary += `${asset} ${amount} ${apy} ${collateral}\\n`;\n }\n positionSummary += `\\`\\`\\`\\n\\n`;\n }\n\n // Borrow positions\n const borrows = position.positions.filter(p => \n p.borrowedAmountVariable.isGreaterThan(0) || p.borrowedAmountStable.isGreaterThan(0)\n );\n \n if (borrows.length > 0) {\n positionSummary += `šŸ’ø **Borrow Positions:**\\n`;\n positionSummary += `\\`\\`\\`\\n`;\n positionSummary += `Asset Amount APY Type\\n`;\n positionSummary += `──────────────────────────────\\n`;\n \n for (const borrow of borrows) {\n // Variable debt\n if (borrow.borrowedAmountVariable.isGreaterThan(0)) {\n const asset = borrow.asset.padEnd(6);\n const amount = formatNumber(borrow.borrowedAmountVariable).padStart(10);\n const apy = `${borrow.variableBorrowAPY.toFixed(2)}%`.padStart(6);\n const type = 'Variable'.padStart(8);\n \n positionSummary += `${asset} ${amount} ${apy} ${type}\\n`;\n }\n \n // Stable debt\n if (borrow.borrowedAmountStable.isGreaterThan(0)) {\n const asset = borrow.asset.padEnd(6);\n const amount = formatNumber(borrow.borrowedAmountStable).padStart(10);\n const apy = `${borrow.stableBorrowAPY.toFixed(2)}%`.padStart(6);\n const type = 'Stable'.padStart(8);\n \n positionSummary += `${asset} ${amount} ${apy} ${type}\\n`;\n }\n }\n positionSummary += `\\`\\`\\`\\n\\n`;\n }\n\n // Position insights and recommendations\n positionSummary += `šŸ’” **Position Insights:**\\n`;\n \n if (hasSupplyPositions && !hasBorrowPositions) {\n positionSummary += `• You're earning yield as a pure lender šŸ¦\\n`;\n positionSummary += `• Consider borrowing stablecoins for leverage or other opportunities\\n`;\n } else if (hasBorrowPositions) {\n if (position.healthFactor.isGreaterThan(2.0)) {\n positionSummary += `• Healthy leveraged position šŸ’Ŗ\\n`;\n positionSummary += `• You have room to borrow more if needed\\n`;\n } else if (position.healthFactor.isGreaterThan(1.5)) {\n positionSummary += `• Moderate risk leveraged position āš–ļø\\n`;\n positionSummary += `• Monitor health factor closely\\n`;\n }\n }\n\n // Non-collateral assets warning\n const nonCollateralAssets = supplies.filter(s => !s.isCollateral);\n if (nonCollateralAssets.length > 0) {\n positionSummary += `• Some assets not used as collateral - enable for more borrowing power\\n`;\n }\n\n positionSummary += `\\nšŸ“… *Position updated: ${new Date().toLocaleString()}*`;\n\n return { text: positionSummary };\n\n } catch (error) {\n elizaLogger.error('Failed to get user position:', error);\n return { text: 'Unable to fetch your current position from Aave V3. Please try again later.' };\n }\n }\n};\n\n/**\n * Format numbers in a compact, readable way\n */\nfunction formatNumber(num: BigNumber): string {\n if (num.isGreaterThanOrEqualTo(1e6)) {\n return `${num.dividedBy(1e6).toFixed(2)}M`;\n } else if (num.isGreaterThanOrEqualTo(1e3)) {\n return `${num.dividedBy(1e3).toFixed(1)}K`;\n } else if (num.isGreaterThanOrEqualTo(1)) {\n return num.toFixed(2);\n } else {\n return num.toFixed(4);\n }\n}","import { Plugin } from '@elizaos/core';\nimport { AaveService } from './services/index.js';\nimport { supplyAction, withdrawAction, borrowAction, repayAction } from './actions/index.js';\nimport { marketDataProvider, positionProvider } from './providers/index.js';\n\nexport const plugin: Plugin = {\n name: 'aave',\n description: 'Aave V3 Protocol integration for lending and borrowing operations',\n \n // Core services\n services: [AaveService],\n \n // User actions\n actions: [supplyAction, withdrawAction, borrowAction, repayAction],\n \n // Context providers\n providers: [marketDataProvider, positionProvider],\n \n // No evaluators for now\n evaluators: [],\n};\n\nexport default plugin;\n\n// Re-export components for external use\nexport { AaveService } from './services/index.js';\nexport { supplyAction, withdrawAction, borrowAction, repayAction } from './actions/index.js';\nexport { marketDataProvider, positionProvider } from './providers/index.js';\nexport * from './types/index.js';"]}