Skip to content

Research notes

Aave Withdrawals: Liquidity vs Collateral Headroom

A 10-token claim, 6.875 tokens of collateral headroom and only 3 tokens of available liquidity show why a healthy account cannot always withdraw its balance.

An ivory reservoir feeds a paper ribbon through a narrow outlet beside a ceramic weight hanging from a lime cord.
Illustration for research notes; examples in this article are educational.

In Aave V3, a withdrawal is limited by your accrued aToken balance, the chosen reserve's available underlying liquidity, and any collateral constraints after withdrawal. A large balance or a health factor above 1 does not establish how much you can take out. Calculate the reserve's liquidity limit and the account's post-withdrawal health limit separately, then check the remaining transaction rules.

This walkthrough uses the EVM implementation of Aave V3 Origin v3.7.0, pinned to release commit cff15de. It does not assume every deployed V3 market runs that implementation. Aave V4 has separate documentation and contracts; its rules are outside this calculation.

Start with three amounts in the same asset

An aToken records a supply claim. In the pinned V3 aToken implementation, the displayed balance incorporates the reserve's normalized income, while redemption transfers actual underlying tokens. A growing claim therefore need not mean an equal quantity is sitting available for withdrawal.

Keep these quantities distinct:

QuantityWhat it limitsUnit
Accrued aToken balanceYour claim on the selected underlyingUnderlying tokens
Available reserve liquidityWhat that reserve can currently transferUnderlying tokens
Collateral headroomWhat can leave without failing the account constraintConvert to the selected underlying

Aave's withdrawal help explicitly identifies both available liquidity and collateral-backed borrowing as constraints. Total deposits, total market value and your wallet's supply balance answer different questions.

For an ordinary positive-LTV collateral position, a useful first estimate is the smallest of those three amounts. That estimate is conditional: the reserve, token and account must also pass the implementation's other checks. A single “available” number should identify which limit it represents.

Liquidity belongs to the selected reserve and deployment. Cash in another asset, another Aave market or another chain cannot simply be added to it. The utilization and borrow-APR guide explains the pool-level denominator; here the question is how many units can leave one reserve.

Build one withdrawal from a fixed snapshot

The following account is entirely illustrative. A, B and D are invented tokens; every price, balance and percentage is a teaching assumption. Use one V3 Pool in ordinary mode, with A and B enabled as collateral and both having positive borrowing LTV. There are no special token restrictions, deficits or intervening transactions.

For transparent arithmetic, ignore index changes and fixed-point rounding during this snapshot. Assume the reserve's recorded virtual liquidity and transferable underlying both equal 3 A. These are assumptions, not observations of a live market.

Account itemQuantityOracle priceLiquidation threshold
Supplied A10 A$20080%
Supplied B2,000 B$175%
Borrowed D2,000 D$1—

The dollar unit represents a common oracle valuation unit, not a promise that D trades or redeems at $1.

A contributes 10 × $200 × 80% = $1,600 of threshold-weighted collateral. B contributes 2,000 × $1 × 75% = $1,500. Their sum is $3,100, against $2,000 of debt, giving an initial health factor of 1.55.

The pinned V3 account logic sums each eligible collateral value with its applicable liquidation threshold before calculating health factor. It uses the protocol oracle and indexed balances. A dashboard's market-price estimate may use different inputs.

Withdrawing one A removes $200 of collateral and $160 of threshold-weighted support. If x A leaves, support becomes $3,100 minus $160 multiplied by x. Debt remains $2,000 under these assumptions.

At health factor 1, the account can lose $1,100 of that support. Dividing $1,100 by $160 gives 6.875 A of mathematical withdrawal headroom.

That is larger than the available 3 A. The illustrative executable upper bound is therefore 3 A, despite the 10 A balance and 6.875 A health limit.

Test liquidity and health independently

Each row below starts from the original snapshot. The health factor is a calculation of the proposed resulting account, including for requests that would fail. It is not evidence that a failed transaction changed the account.

Requested withdrawalModeled health factor afterwardFits 3 A liquidity?Result under the assumptions
2 A1.39YesBoth limits pass
3 A1.31YesLiquidity limit reached
5 A1.15NoLiquidity blocks it
6.875 A1.0000NoLiquidity blocks it
7 A0.99NoBoth limits fail

The 5 A request is the useful diagnostic case. Its modeled health factor remains above 1, yet the reserve cannot fund it. Asking whether the account is healthy cannot answer whether that withdrawal can execute.

The 6.875 A row reaches equality. The pinned health validator accepts a computed health factor greater than or equal to 1. Exact token rounding, fresh interest or an oracle change can move a real transaction across the boundary; a display rounded to “1.00” is insufficient.

Borrowing headroom is another distinct number. Give A a hypothetical maximum borrowing LTV of 70% and B 65%. Borrowing capacity is $2,700, leaving $700 available to borrow. Dividing $700 by A's $200 price gives 3.5 A, which is neither the liquidity limit nor the 6.875 A health limit. The LTV versus liquidation-threshold guide explains why those parameters serve different tests.

More liquidity and less debt solve different problems

Consider two alternative changes to the original snapshot. They are independent scenarios, with no withdrawals already completed.

First, another participant supplies 5 A. Assume that adds 5 A to both recorded virtual liquidity and transferable cash. Liquidity rises to 8 A, while this account's collateral and debt stay unchanged. Its 6.875 A health limit now binds.

Second, the account repays 200 D using D already held outside the Pool. Debt falls to $1,800. Health headroom rises to ($3,100 − $1,800) ÷ $160 = 8.125 A. But repayment added D to D's reserve, not A to A's reserve. Available A remains 3.

Separate snapshotAvailable AHealth limit in ASmaller limit
Original account36.8753
Another participant supplies 5 A86.8756.875
Account repays 200 D externally38.1253

“Repay first” may improve the account constraint without fixing the withdrawal's cash constraint. Likewise, waiting for A liquidity does not improve collateral support per token. Identify the binding limit before assessing a proposed change.

A personal operating buffer is separate again. Suppose an illustrative policy requires health factor at least 1.25 after withdrawal. This is an arbitrary teaching threshold, not an Aave requirement or a recommended risk setting. The original account must retain $2,500 of threshold-weighted support, leaving room to remove $600, or 3.75 A. With 8 A liquidity, that policy would permit less than the protocol-boundary calculation.

The limit also ages. If accrued D debt becomes 2,020 D at the same assumed price, the health-factor-1 limit falls to 6.75 A. Recompute the account after changes instead of storing one withdrawal allowance indefinitely. The multi-asset health-factor walkthrough expands the basket calculation when several collateral and debt prices move.

“Max” requests the full balance

The V3 Pool's withdraw reference defines the special maximum integer amount as a request to withdraw the entire aToken balance. It is not a command to search for whichever smaller amount passes every constraint.

In the pinned withdrawal implementation, that sentinel resolves to the user's full accrued balance. The function then follows its validation and withdrawal path; it contains no partial-fill search.

Here, asking for the full 10 A fails the illustrative limits. Even with abundant cash, removing all A would leave only B's $1,500 of support against $2,000 debt: health factor 0.75. A frontend can calculate its own suggested maximum, so distinguish that interface estimate from the contract argument actually submitted.

Reserve liquidity also requires implementation-aware evidence. The pinned reserve logic deducts withdrawals from virtual underlying liquidity. The aToken must also transfer the underlying. An unexplained raw token balance is not a complete substitute for those checks.

Keep a reproducible withdrawal record

Before submitting, retain the fields needed to explain the amount:

RecordCheck
Market identityChain, Pool proxy, implementation and token addresses
ObservationOne block number and timestamp for the snapshot
Supply claimAccrued aToken balance and underlying decimals
Reserve liquidityRecorded virtual liquidity and transferable underlying
Account supportEnabled collateral, effective thresholds and oracle prices
DebtEvery accrued debt balance in the same valuation unit
Proposed resultWithdrawal amount, resulting health factor and chosen buffer
Execution evidenceExact transaction, outcome and resulting balances

Two implementation details can invalidate an otherwise correct minimum. In the pinned withdrawal and collateral validators, withdrawals require an active, unpaused reserve; a frozen flag alone is not the same restriction. Also, if zero-LTV collateral remains in the account, the withdrawal validation can require withdrawing the zero-LTV asset first. A health factor above 1 does not clear that rule.

For an actual transaction, reconcile the selected Pool's account data and configuration, then simulate the exact call with its caller, asset, amount and recipient. Simulation describes its observed state; another borrow, withdrawal, price update or interest accrual can alter the state before inclusion.

Finally, a rejected withdrawal does not establish that liquidation occurred. The close-factor and liquidation-bonus guide covers the separate liquidation mechanism. For a withdrawal, verify the confirmed outcome and re-read the balances.

The useful handoff is a number with its limiting reason: “3 A, limited by this reserve's liquidity at this block,” followed by the resulting account calculation. That record tells you what must change before a larger withdrawal becomes possible.

Keep the context with the example.

Each worked example is illustrative, with its sources and assumptions in the article. Read our editorial standards for authorship, verification and corrections.