{
  "axon_version": "1.0.0",
  "protocol": {
    "name": "Aave",
    "slug": "aave-v3-arbitrum",
    "version": "v3",
    "description": "Decentralized non-custodial liquidity protocol on Arbitrum One. Offers significantly lower gas costs than Ethereum mainnet with the full Aave V3 feature set and deep liquidity.",
    "category": "lending",
    "chain": {
      "id": 42161,
      "name": "arbitrum",
      "network": "mainnet"
    },
    "contracts": {
      "pool": {
        "address": "0x794a61358D6845594F94dc1DB02A252b5b4814aD",
        "label": "Pool (LendingPool V3)",
        "verified": true
      },
      "pool_addresses_provider": {
        "address": "0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb",
        "label": "PoolAddressesProvider",
        "verified": true
      },
      "oracle": {
        "address": "0xb56c2F0B653B2e0b10C9b928C8580Ac5Df02C7C2",
        "label": "AaveOracle",
        "verified": true
      },
      "pool_data_provider": {
        "address": "0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654",
        "label": "PoolDataProvider (AaveProtocolDataProvider)",
        "verified": true
      },
      "a_token_impl": {
        "address": "0xa5ba6E5EC19a1Bf23C857991c857dB62b2Aa187B",
        "label": "AToken Implementation",
        "verified": true
      },
      "variable_debt_token_impl": {
        "address": "0x81387c40EB75acB02757C1Ae55D5936E7c3bC3dC",
        "label": "VariableDebtToken Implementation",
        "verified": true
      },
      "stable_debt_token_impl": {
        "address": "0x52A1CeB68Ee6b7B5D13E0376A1E0E4423A8cE26e",
        "label": "StableDebtToken Implementation",
        "verified": true
      }
    },
    "links": {
      "website": "https://aave.com",
      "docs": "https://docs.aave.com/developers",
      "github": "https://github.com/aave/aave-v3-core",
      "governance": "https://governance.aave.com"
    }
  },
  "actions": [
    {
      "id": "supply",
      "name": "Supply Asset",
      "description": "Supply (deposit) an ERC20 asset to the Aave V3 lending pool on Arbitrum to earn interest. The depositor receives aTokens 1:1 which accrue interest in real-time.",
      "type": "supply",
      "parameters": [
        {
          "name": "asset",
          "type": "address",
          "required": true,
          "description": "Address of the ERC20 token to supply on Arbitrum"
        },
        {
          "name": "amount",
          "type": "uint256",
          "required": true,
          "description": "Amount to supply in the asset's smallest unit (wei). Use type(uint256).max to supply full wallet balance.",
          "constraints": {
            "min": "1"
          }
        },
        {
          "name": "onBehalfOf",
          "type": "address",
          "required": true,
          "description": "Address that will receive the aTokens. Use msg.sender for self."
        },
        {
          "name": "referralCode",
          "type": "uint16",
          "required": false,
          "description": "Referral code for integrator tracking. Use 0 for no referral.",
          "default": "0"
        }
      ],
      "constraints": {
        "min_amount": "1",
        "supported_tokens": "aave_arbitrum_listed_assets",
        "requires_position": false
      },
      "approvals": [
        {
          "type": "erc20_approve",
          "token": "asset",
          "spender": "pool",
          "amount": "exact_or_max"
        }
      ],
      "transaction_flow": [
        {
          "step": 1,
          "action": "check_reserve",
          "description": "Verify the asset is listed, active, and not paused on Aave Arbitrum",
          "contract": "pool_data_provider",
          "method": "getReserveConfigurationData(address)",
          "conditional": "always",
          "returns": ["ltv", "liquidationThreshold", "liquidationBonus", "reserveFactor", "usageAsCollateralEnabled", "borrowingEnabled", "isActive", "isFrozen"]
        },
        {
          "step": 2,
          "action": "check_supply_cap",
          "description": "Verify supply amount does not exceed the reserve's supply cap",
          "contract": "pool_data_provider",
          "method": "getReserveCaps(address)",
          "conditional": "always",
          "returns": ["borrowCap", "supplyCap"]
        },
        {
          "step": 3,
          "action": "check_allowance",
          "description": "Check if the Pool contract has sufficient allowance to transfer the supply token",
          "contract": "asset",
          "method": "allowance(address,address)",
          "conditional": "always",
          "returns": ["allowance"]
        },
        {
          "step": 4,
          "action": "approve",
          "description": "Approve the Pool contract to spend the supply token",
          "contract": "asset",
          "method": "approve(address,uint256)",
          "conditional": "if_allowance_insufficient"
        },
        {
          "step": 5,
          "action": "execute",
          "description": "Supply the asset to the lending pool on Arbitrum",
          "contract": "pool",
          "method": "supply(address,uint256,address,uint16)",
          "returns": ["aTokensMinted"]
        }
      ],
      "risk_warnings": [
        "Supplied assets can be borrowed by others — smart contract risk",
        "Interest rates are variable and can change based on utilization",
        "Arbitrum is an L2 — bridge risk and sequencer uptime risk apply",
        "Arbitrum sequencer downtime can prevent Chainlink oracle updates, affecting liquidation"
      ]
    },
    {
      "id": "withdraw",
      "name": "Withdraw Asset",
      "description": "Withdraw a previously supplied asset from the Aave V3 lending pool on Arbitrum. Burns aTokens and returns the underlying asset.",
      "type": "withdraw",
      "parameters": [
        {
          "name": "asset",
          "type": "address",
          "required": true,
          "description": "Address of the underlying ERC20 token to withdraw"
        },
        {
          "name": "amount",
          "type": "uint256",
          "required": true,
          "description": "Amount to withdraw. Use type(uint256).max to withdraw full balance including accrued interest.",
          "constraints": {
            "min": "1"
          }
        },
        {
          "name": "to",
          "type": "address",
          "required": true,
          "description": "Address that will receive the withdrawn tokens. Use msg.sender for self."
        }
      ],
      "constraints": {
        "min_amount": "1",
        "supported_tokens": "aave_arbitrum_listed_assets",
        "requires_position": true
      },
      "approvals": [],
      "transaction_flow": [
        {
          "step": 1,
          "action": "check_balance",
          "description": "Check the user's aToken balance on Arbitrum",
          "contract": "pool_data_provider",
          "method": "getUserReserveData(address,address)",
          "conditional": "always",
          "returns": ["currentATokenBalance", "currentStableDebt", "currentVariableDebt", "principalStableDebt", "scaledVariableDebt", "stableBorrowRate", "liquidityRate"]
        },
        {
          "step": 2,
          "action": "check_health_factor",
          "description": "If asset is collateral, verify withdrawal keeps health factor above 1.0",
          "contract": "pool",
          "method": "getUserAccountData(address)",
          "conditional": "if_used_as_collateral",
          "returns": ["totalCollateralBase", "totalDebtBase", "availableBorrowsBase", "currentLiquidationThreshold", "ltv", "healthFactor"]
        },
        {
          "step": 3,
          "action": "execute",
          "description": "Withdraw the asset from the lending pool on Arbitrum",
          "contract": "pool",
          "method": "withdraw(address,uint256,address)",
          "returns": ["amountWithdrawn"]
        }
      ],
      "risk_warnings": [
        "Withdrawing collateral reduces health factor — may trigger liquidation",
        "Withdrawal may fail if pool liquidity is insufficient",
        "Arbitrum sequencer downtime can delay withdrawal execution"
      ]
    },
    {
      "id": "borrow",
      "name": "Borrow Asset",
      "description": "Borrow an ERC20 asset from the Aave V3 lending pool on Arbitrum against supplied collateral. Arbitrum has deep Aave liquidity and low gas costs.",
      "type": "borrow",
      "parameters": [
        {
          "name": "asset",
          "type": "address",
          "required": true,
          "description": "Address of the ERC20 token to borrow on Arbitrum"
        },
        {
          "name": "amount",
          "type": "uint256",
          "required": true,
          "description": "Amount to borrow in the asset's smallest unit",
          "constraints": {
            "min": "1"
          }
        },
        {
          "name": "interestRateMode",
          "type": "uint256",
          "required": true,
          "description": "Interest rate mode: 1 for Stable, 2 for Variable. Variable is recommended.",
          "constraints": {
            "enum": [1, 2]
          }
        },
        {
          "name": "referralCode",
          "type": "uint16",
          "required": false,
          "description": "Referral code. Use 0 for no referral.",
          "default": "0"
        },
        {
          "name": "onBehalfOf",
          "type": "address",
          "required": true,
          "description": "Address that will receive borrowed tokens and accrue debt"
        }
      ],
      "constraints": {
        "min_amount": "1",
        "supported_tokens": "aave_arbitrum_listed_borrowable_assets",
        "requires_position": true
      },
      "approvals": [],
      "transaction_flow": [
        {
          "step": 1,
          "action": "check_health_factor",
          "description": "Verify borrowing power on Arbitrum supports the requested amount",
          "contract": "pool",
          "method": "getUserAccountData(address)",
          "conditional": "always",
          "returns": ["totalCollateralBase", "totalDebtBase", "availableBorrowsBase", "currentLiquidationThreshold", "ltv", "healthFactor"]
        },
        {
          "step": 2,
          "action": "check_borrow_cap",
          "description": "Ensure borrow amount doesn't exceed the reserve's borrow cap on Arbitrum",
          "contract": "pool_data_provider",
          "method": "getReserveCaps(address)",
          "conditional": "always",
          "returns": ["borrowCap", "supplyCap"]
        },
        {
          "step": 3,
          "action": "check_reserve_borrowable",
          "description": "Verify asset is enabled for borrowing on Arbitrum",
          "contract": "pool_data_provider",
          "method": "getReserveConfigurationData(address)",
          "conditional": "always",
          "returns": ["borrowingEnabled", "stableBorrowRateEnabled", "isActive", "isFrozen"]
        },
        {
          "step": 4,
          "action": "execute",
          "description": "Execute the borrow on Arbitrum",
          "contract": "pool",
          "method": "borrow(address,uint256,uint256,uint16,address)",
          "returns": ["debtTokensMinted"]
        }
      ],
      "risk_warnings": [
        "Borrowing reduces health factor — liquidation occurs below 1.0",
        "Variable interest rates fluctuate with pool utilization",
        "Arbitrum sequencer downtime can prevent timely debt management and liquidation",
        "Aave on Arbitrum has a Chainlink sequencer uptime feed — liquidations pause during downtime with a grace period after recovery"
      ]
    },
    {
      "id": "repay",
      "name": "Repay Borrowed Asset",
      "description": "Repay a borrowed asset to the Aave V3 lending pool on Arbitrum. Burns debt tokens and improves health factor.",
      "type": "repay",
      "parameters": [
        {
          "name": "asset",
          "type": "address",
          "required": true,
          "description": "Address of the borrowed ERC20 token to repay"
        },
        {
          "name": "amount",
          "type": "uint256",
          "required": true,
          "description": "Amount to repay. Use type(uint256).max to repay entire debt including interest.",
          "constraints": {
            "min": "1"
          }
        },
        {
          "name": "interestRateMode",
          "type": "uint256",
          "required": true,
          "description": "Interest rate mode of the debt to repay: 1 for Stable, 2 for Variable",
          "constraints": {
            "enum": [1, 2]
          }
        },
        {
          "name": "onBehalfOf",
          "type": "address",
          "required": true,
          "description": "Address of the user whose debt is being repaid"
        }
      ],
      "constraints": {
        "min_amount": "1",
        "supported_tokens": "aave_arbitrum_listed_borrowable_assets",
        "requires_position": true
      },
      "approvals": [
        {
          "type": "erc20_approve",
          "token": "asset",
          "spender": "pool",
          "amount": "exact_or_max"
        }
      ],
      "transaction_flow": [
        {
          "step": 1,
          "action": "check_debt",
          "description": "Check current debt balance on Arbitrum",
          "contract": "pool_data_provider",
          "method": "getUserReserveData(address,address)",
          "conditional": "always",
          "returns": ["currentATokenBalance", "currentStableDebt", "currentVariableDebt"]
        },
        {
          "step": 2,
          "action": "check_allowance",
          "description": "Check Pool allowance for repayment token",
          "contract": "asset",
          "method": "allowance(address,address)",
          "conditional": "always",
          "returns": ["allowance"]
        },
        {
          "step": 3,
          "action": "approve",
          "description": "Approve the Pool to spend the repayment token on Arbitrum",
          "contract": "asset",
          "method": "approve(address,uint256)",
          "conditional": "if_allowance_insufficient"
        },
        {
          "step": 4,
          "action": "execute",
          "description": "Repay the borrowed asset on Arbitrum",
          "contract": "pool",
          "method": "repay(address,uint256,uint256,address)",
          "returns": ["amountRepaid"]
        }
      ],
      "risk_warnings": [
        "When repaying max, ensure sufficient balance to cover accrued interest",
        "Interest accrues between approval and repay — approve slightly more",
        "Arbitrum sequencer downtime may delay repayment execution"
      ]
    },
    {
      "id": "flash_loan",
      "name": "Flash Loan",
      "description": "Execute an atomic flash loan from Aave V3 on Arbitrum. Borrow without collateral, execute logic, repay principal + 0.05% fee in same transaction. Very low gas costs on Arbitrum.",
      "type": "supply",
      "parameters": [
        {
          "name": "receiverAddress",
          "type": "address",
          "required": true,
          "description": "Contract implementing IFlashLoanReceiver with executeOperation()"
        },
        {
          "name": "assets",
          "type": "address",
          "required": true,
          "description": "Array of ERC20 token addresses to flash borrow on Arbitrum"
        },
        {
          "name": "amounts",
          "type": "uint256",
          "required": true,
          "description": "Array of amounts to flash borrow for each asset"
        },
        {
          "name": "interestRateModes",
          "type": "uint256",
          "required": true,
          "description": "Array of rate modes. 0 = repay in same tx, 1 = stable debt, 2 = variable debt.",
          "constraints": {
            "enum": [0, 1, 2]
          }
        },
        {
          "name": "onBehalfOf",
          "type": "address",
          "required": true,
          "description": "Address for debt if interestRateMode != 0"
        },
        {
          "name": "params",
          "type": "bytes",
          "required": true,
          "description": "Arbitrary bytes passed to receiver's executeOperation()"
        },
        {
          "name": "referralCode",
          "type": "uint16",
          "required": false,
          "description": "Referral code. Use 0 for no referral.",
          "default": "0"
        }
      ],
      "constraints": {
        "min_amount": "1",
        "supported_tokens": "aave_arbitrum_listed_assets",
        "requires_position": false
      },
      "approvals": [
        {
          "type": "erc20_approve",
          "token": "assets",
          "spender": "pool",
          "amount": "exact_or_max"
        }
      ],
      "transaction_flow": [
        {
          "step": 1,
          "action": "check_flash_loan_availability",
          "description": "Verify assets are available for flash loans on Arbitrum",
          "contract": "pool_data_provider",
          "method": "getFlashLoanEnabled(address)",
          "conditional": "always",
          "returns": ["flashLoanEnabled"]
        },
        {
          "step": 2,
          "action": "check_receiver_contract",
          "description": "Verify receiver implements IFlashLoanReceiver",
          "contract": "receiverAddress",
          "method": "ADDRESSES_PROVIDER()",
          "conditional": "always",
          "returns": ["addressesProvider"]
        },
        {
          "step": 3,
          "action": "approve_repayment",
          "description": "Receiver must approve Pool to pull back loaned amount + 0.05% fee inside executeOperation()",
          "contract": "assets",
          "method": "approve(address,uint256)",
          "conditional": "inside_receiver_contract"
        },
        {
          "step": 4,
          "action": "execute",
          "description": "Execute the flash loan on Arbitrum. Reverts if not repaid.",
          "contract": "pool",
          "method": "flashLoan(address,address[],uint256[],uint256[],address,bytes,uint16)",
          "returns": ["success"]
        }
      ],
      "risk_warnings": [
        "Flash loans require a smart contract receiver — cannot be called from an EOA",
        "Entire transaction reverts if loan + fee not repaid",
        "Flash loan fee is 0.05% of borrowed amount",
        "Arbitrum has deep Aave liquidity but verify available amounts for large flash loans"
      ]
    }
  ],
  "risk": {
    "audit_status": {
      "audited": true,
      "auditors": [
        "Trail of Bits",
        "SigmaPrime",
        "ABDK Consulting",
        "Certora (formal verification)",
        "PeckShield",
        "OpenZeppelin"
      ],
      "last_audit_date": "2022-12-01",
      "audit_reports": [
        "https://github.com/aave/aave-v3-core/tree/master/audits"
      ]
    },
    "tvl": {
      "current_usd": 2800000000,
      "source": "defillama",
      "last_updated": "2026-03-07T00:00:00Z"
    },
    "incidents": [
      {
        "date": "2022-11-22",
        "severity": "medium",
        "title": "CRV market freeze (Ethereum only)",
        "description": "Aave governance froze CRV market on Ethereum. Arbitrum deployment was not directly affected. Demonstrates cross-chain governance coordination.",
        "resolved": true,
        "post_mortem": "https://governance.aave.com"
      },
      {
        "date": "2023-06-07",
        "severity": "low",
        "title": "Arbitrum sequencer downtime considerations",
        "description": "Aave on Arbitrum uses a Chainlink L2 Sequencer Uptime Feed as a safeguard. During sequencer outages, liquidations are paused with a grace period after recovery to protect borrowers.",
        "resolved": true,
        "post_mortem": "https://docs.aave.com/developers/getting-started/v3-overview"
      }
    ],
    "risk_score": {
      "overall": "A",
      "smart_contract": "A+",
      "centralization": "B+",
      "oracle_dependence": "B+",
      "liquidity": "A"
    }
  },
  "fees": {
    "model": "interest_rate",
    "tiers": [
      {
        "name": "supply_yield",
        "fee_bps": null,
        "description": "Suppliers earn variable yield based on pool utilization on Arbitrum.",
        "conditions": "Earned on all supplied assets"
      },
      {
        "name": "variable_borrow",
        "fee_bps": null,
        "description": "Variable borrow rate based on utilization curve. Typically 2-10% APY.",
        "conditions": "interestRateMode = 2"
      },
      {
        "name": "stable_borrow",
        "fee_bps": null,
        "description": "Stable borrow rate — may not be available for all Arbitrum assets.",
        "conditions": "interestRateMode = 1 (limited availability)"
      },
      {
        "name": "flash_loan_fee",
        "fee_bps": 5,
        "description": "0.05% flat fee on flash loan principal",
        "conditions": "Flash loan operations only"
      },
      {
        "name": "reserve_factor",
        "fee_bps": null,
        "description": "Percentage of borrow interest going to Aave DAO treasury (typically 10-20%)",
        "conditions": "Applied automatically to all borrow interest"
      }
    ],
    "gas_estimates": {
      "supply": "180000",
      "withdraw": "190000",
      "borrow": "240000",
      "repay": "200000",
      "flash_loan": "400000",
      "approve": "46000"
    }
  }
}