{"version":3,"file":"lending-service.mjs","names":[],"sources":["../../../src/services/lending-service.ts"],"sourcesContent":["/**\n * Lending Service — Aave V3 lending protocol integration on Base.\n *\n * Supports supply, borrow, repay, withdraw operations on Base via direct\n * contract calls (no SDK dependency — just ABI + contract addresses).\n *\n * Protocols supported:\n * - Aave V3 on Base (Pool contract)\n *\n * Health factor monitoring via heartbeat integration.\n */\n\nimport type { Address } from 'viem';\nimport { AAVE, MORPHO, CBETH, TOKENS } from '../lib/contract-registry.js';\n\n// ── Contract Addresses (Base Mainnet) — sourced from contract-registry ───\n\nexport const LENDING_CONTRACTS = {\n  aave: {\n    pool: AAVE.pool,\n    poolDataProvider: AAVE.poolDataProvider,\n    oracle: AAVE.oracle,\n    chain: 8453,\n    name: 'Aave V3 Base',\n  },\n  morpho: {\n    core: MORPHO.core,\n    chain: 8453,\n    name: 'Morpho Base',\n  },\n} as const;\n\n// ── Supported Assets ─────────────────────────────────────────────────────\n\nexport interface LendingAsset {\n  symbol: string;\n  address: Address;\n  decimals: number;\n  /** Aave aToken address (interest-bearing) */\n  aToken?: Address;\n  /** Aave variable debt token address */\n  variableDebtToken?: Address;\n}\n\nexport const LENDING_ASSETS: Record<string, LendingAsset> = {\n  ETH: {\n    symbol: 'ETH',\n    address: TOKENS.base.WETH,\n    decimals: 18,\n    aToken: AAVE.aTokens.WETH.aToken,\n    variableDebtToken: AAVE.aTokens.WETH.debtToken,\n  },\n  USDC: {\n    symbol: 'USDC',\n    address: TOKENS.base.USDC,\n    decimals: 6,\n    aToken: AAVE.aTokens.USDC.aToken,\n    variableDebtToken: AAVE.aTokens.USDC.debtToken,\n  },\n  cbETH: {\n    symbol: 'cbETH',\n    address: CBETH.base,\n    decimals: 18,\n    aToken: AAVE.aTokens.cbETH.aToken,\n    variableDebtToken: AAVE.aTokens.cbETH.debtToken,\n  },\n  USDbC: {\n    symbol: 'USDbC',\n    address: TOKENS.base.USDbC,\n    decimals: 6,\n    aToken: AAVE.aTokens.USDbC.aToken,\n    variableDebtToken: AAVE.aTokens.USDbC.debtToken,\n  },\n};\n\n// ── ABIs (minimal — only the functions we call) ──────────────────────────\n\nexport const AAVE_POOL_ABI = [\n  {\n    name: 'supply',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'asset', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n      { name: 'onBehalfOf', type: 'address' },\n      { name: 'referralCode', type: 'uint16' },\n    ],\n    outputs: [],\n  },\n  {\n    name: 'borrow',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'asset', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n      { name: 'interestRateMode', type: 'uint256' },\n      { name: 'referralCode', type: 'uint16' },\n      { name: 'onBehalfOf', type: 'address' },\n    ],\n    outputs: [],\n  },\n  {\n    name: 'repay',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'asset', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n      { name: 'interestRateMode', type: 'uint256' },\n      { name: 'onBehalfOf', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'withdraw',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'asset', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n      { name: 'to', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'getUserAccountData',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ name: 'user', type: 'address' }],\n    outputs: [\n      { name: 'totalCollateralBase', type: 'uint256' },\n      { name: 'totalDebtBase', type: 'uint256' },\n      { name: 'availableBorrowsBase', type: 'uint256' },\n      { name: 'currentLiquidationThreshold', type: 'uint256' },\n      { name: 'ltv', type: 'uint256' },\n      { name: 'healthFactor', type: 'uint256' },\n    ],\n  },\n] as const;\n\nexport const ERC20_APPROVE_ABI = [\n  {\n    name: 'approve',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'spender', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool' }],\n  },\n  {\n    name: 'allowance',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'owner', type: 'address' },\n      { name: 'spender', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n] as const;\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport interface UserAccountData {\n  totalCollateralUsd: number;\n  totalDebtUsd: number;\n  availableBorrowsUsd: number;\n  liquidationThreshold: number;\n  ltv: number;\n  healthFactor: number;\n}\n\nexport interface LendingPosition {\n  protocol: 'aave' | 'morpho';\n  asset: string;\n  type: 'supply' | 'borrow';\n  amount: string;\n  amountUsd?: number;\n  apy?: number;\n}\n\nexport type LendingProtocol = 'aave' | 'morpho';\n\n// ── Service ──────────────────────────────────────────────────────────────\n\nexport class LendingService {\n  /**\n   * Resolve asset symbol to lending asset info.\n   */\n  resolveAsset(symbolOrAddress: string): LendingAsset | null {\n    // Try by symbol first\n    const upper = symbolOrAddress.toUpperCase();\n    if (LENDING_ASSETS[upper]) return LENDING_ASSETS[upper]!;\n\n    // Try by address\n    const lower = symbolOrAddress.toLowerCase();\n    for (const asset of Object.values(LENDING_ASSETS)) {\n      if (asset.address.toLowerCase() === lower) return asset;\n    }\n\n    return null;\n  }\n\n  /**\n   * Get user account data from Aave V3 (health factor, collateral, debt).\n   */\n  async getUserAccountData(\n    userAddress: Address,\n    publicClient: any,\n  ): Promise<UserAccountData> {\n    const result = await publicClient.readContract({\n      address: LENDING_CONTRACTS.aave.pool,\n      abi: AAVE_POOL_ABI,\n      functionName: 'getUserAccountData',\n      args: [userAddress],\n    });\n\n    // Aave returns values in BASE_CURRENCY (USD with 8 decimals)\n    const [totalCollateral, totalDebt, availableBorrows, liqThreshold, ltv, healthFactor] =\n      result as [bigint, bigint, bigint, bigint, bigint, bigint];\n\n    return {\n      totalCollateralUsd: Number(totalCollateral) / 1e8,\n      totalDebtUsd: Number(totalDebt) / 1e8,\n      availableBorrowsUsd: Number(availableBorrows) / 1e8,\n      liquidationThreshold: Number(liqThreshold) / 100, // basis points → percentage\n      ltv: Number(ltv) / 100,\n      // Health factor has 18 decimals; max uint256 means no debt\n      healthFactor: healthFactor >= BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')\n        ? Infinity\n        : Number(healthFactor) / 1e18,\n    };\n  }\n\n  /**\n   * Supply an asset to Aave V3.\n   * Returns the confirmed transaction hash.\n   */\n  async supply(\n    asset: LendingAsset,\n    amount: bigint,\n    userAddress: Address,\n    walletClient: any,\n    publicClient: any,\n  ): Promise<{ hash: string; action: 'supply'; asset: string; amount: string }> {\n    // Check and set approval if needed (waits for confirmation internally)\n    await this.ensureApproval(\n      asset.address, LENDING_CONTRACTS.aave.pool, amount, userAddress, walletClient, publicClient,\n    );\n\n    const hash = await walletClient.writeContract({\n      address: LENDING_CONTRACTS.aave.pool,\n      abi: AAVE_POOL_ABI,\n      functionName: 'supply',\n      args: [asset.address, amount, userAddress, 0],\n    });\n\n    // Wait for on-chain confirmation\n    await publicClient.waitForTransactionReceipt({ hash });\n\n    return { hash, action: 'supply', asset: asset.symbol, amount: amount.toString() };\n  }\n\n  /**\n   * Borrow an asset from Aave V3 (variable rate).\n   */\n  async borrow(\n    asset: LendingAsset,\n    amount: bigint,\n    userAddress: Address,\n    walletClient: any,\n    publicClient?: any,\n  ): Promise<{ hash: string; action: 'borrow'; asset: string; amount: string }> {\n    const hash = await walletClient.writeContract({\n      address: LENDING_CONTRACTS.aave.pool,\n      abi: AAVE_POOL_ABI,\n      functionName: 'borrow',\n      args: [asset.address, amount, BigInt(2), 0, userAddress], // 2 = variable rate\n    });\n\n    // Wait for on-chain confirmation if publicClient available\n    if (publicClient) {\n      await publicClient.waitForTransactionReceipt({ hash });\n    }\n\n    return { hash, action: 'borrow', asset: asset.symbol, amount: amount.toString() };\n  }\n\n  /**\n   * Repay a borrowed asset on Aave V3.\n   * Use amount = MaxUint256 to repay entire debt.\n   *\n   * When skipApproval is true, the caller has already handled approval\n   * (e.g. for max repay with bounded approval instead of MaxUint256).\n   */\n  async repay(\n    asset: LendingAsset,\n    amount: bigint,\n    userAddress: Address,\n    walletClient: any,\n    publicClient: any,\n    skipApproval = false,\n  ): Promise<{ hash: string; action: 'repay'; asset: string; amount: string }> {\n    if (!skipApproval) {\n      await this.ensureApproval(\n        asset.address, LENDING_CONTRACTS.aave.pool, amount, userAddress, walletClient, publicClient,\n      );\n    }\n\n    const hash = await walletClient.writeContract({\n      address: LENDING_CONTRACTS.aave.pool,\n      abi: AAVE_POOL_ABI,\n      functionName: 'repay',\n      args: [asset.address, amount, BigInt(2), userAddress],\n    });\n\n    // Wait for on-chain confirmation\n    await publicClient.waitForTransactionReceipt({ hash });\n\n    return { hash, action: 'repay', asset: asset.symbol, amount: amount.toString() };\n  }\n\n  /**\n   * Withdraw a supplied asset from Aave V3.\n   * Use amount = MaxUint256 to withdraw entire balance.\n   */\n  async withdraw(\n    asset: LendingAsset,\n    amount: bigint,\n    userAddress: Address,\n    walletClient: any,\n    publicClient?: any,\n  ): Promise<{ hash: string; action: 'withdraw'; asset: string; amount: string }> {\n    const hash = await walletClient.writeContract({\n      address: LENDING_CONTRACTS.aave.pool,\n      abi: AAVE_POOL_ABI,\n      functionName: 'withdraw',\n      args: [asset.address, amount, userAddress],\n    });\n\n    // Wait for on-chain confirmation if publicClient available\n    if (publicClient) {\n      await publicClient.waitForTransactionReceipt({ hash });\n    }\n\n    return { hash, action: 'withdraw', asset: asset.symbol, amount: amount.toString() };\n  }\n\n  /**\n   * Get list of supported lending assets.\n   */\n  getSupportedAssets(): LendingAsset[] {\n    return Object.values(LENDING_ASSETS);\n  }\n\n  /**\n   * Get supported protocols.\n   * Note: Morpho contract address is defined in LENDING_CONTRACTS for future use,\n   * but is not yet implemented. Only Aave V3 is currently supported.\n   */\n  getSupportedProtocols(): Array<{ id: LendingProtocol; name: string; chain: number }> {\n    return [\n      { id: 'aave', name: LENDING_CONTRACTS.aave.name, chain: LENDING_CONTRACTS.aave.chain },\n    ];\n  }\n\n  /**\n   * Get the current variable debt balance for an asset.\n   * Useful for calculating exact repay amounts instead of MaxUint256 approvals.\n   */\n  async getDebtBalance(\n    asset: LendingAsset,\n    userAddress: Address,\n    publicClient: any,\n  ): Promise<bigint> {\n    if (!asset.variableDebtToken) return 0n;\n\n    const { erc20Abi } = await import('viem');\n    const balance = await publicClient.readContract({\n      address: asset.variableDebtToken,\n      abi: erc20Abi,\n      functionName: 'balanceOf',\n      args: [userAddress],\n    }) as bigint;\n\n    return balance;\n  }\n\n  /**\n   * Public wrapper for ensureApproval — used when the caller needs to\n   * control the approval amount separately (e.g. max repay with bounded approval).\n   */\n  async ensureApprovalPublic(\n    tokenAddress: Address,\n    amount: bigint,\n    owner: Address,\n    walletClient: any,\n    publicClient: any,\n  ): Promise<void> {\n    await this.ensureApproval(\n      tokenAddress, LENDING_CONTRACTS.aave.pool, amount, owner, walletClient, publicClient,\n    );\n  }\n\n  // ── Internal ──────────────────────────────────────────────────────────\n\n  private async ensureApproval(\n    tokenAddress: Address,\n    spender: Address,\n    amount: bigint,\n    owner: Address,\n    walletClient: any,\n    publicClient: any,\n  ): Promise<void> {\n    const currentAllowance = await publicClient.readContract({\n      address: tokenAddress,\n      abi: ERC20_APPROVE_ABI,\n      functionName: 'allowance',\n      args: [owner, spender],\n    }) as bigint;\n\n    if (currentAllowance < amount) {\n      const approveHash = await walletClient.writeContract({\n        address: tokenAddress,\n        abi: ERC20_APPROVE_ABI,\n        functionName: 'approve',\n        args: [spender, amount],\n      });\n      // Wait for approval to be mined before proceeding — prevents race condition\n      // where the next tx is sent before the approval is confirmed on-chain.\n      await publicClient.waitForTransactionReceipt({ hash: approveHash });\n    }\n  }\n}\n\n// ── Singleton ────────────────────────────────────────────────────────────\n\nlet _instance: LendingService | null = null;\n\nexport function getLendingService(): LendingService {\n  if (!_instance) {\n    _instance = new LendingService();\n  }\n  return _instance;\n}\n\nexport function resetLendingService(): void {\n  _instance = null;\n}\n"],"mappings":"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"}