Aave Safety Module
Reports an account's stake in the legacy Aave V3 Safety Module across a hardcoded set of stake tokens.
Reports an account's stake in the legacy Aave V3 Safety Module across a hardcoded set of stake tokens. For each stake token it splits the staking principal into a locked and an (optionally present) unlocked leg by isLocked, plus a claimable-rewards leg. The stake-token set is small and slow-moving and Aave publishes no on-chain registry, so the addresses are pinned as compile-time constants.
Type: Plain adapter
protocolSubId:
keccak256("aave-v3-safety-module")(brandaave, ecosystemaave-v3)
Mainnet only. The legacy Safety Module is an Ethereum-mainnet protocol. Adding a new SM stake token is a source-code change (new constant + record), not an admin transaction.
Hardcoded stake tokens
stkAAVE
0x4da27a545c0c5B758a6BA100e3a049001de870f5
AAVE
AAVE
stkABPT (Balancer V1 BPT)
0xa1116930326D21fB917d5A27F1E9943A9595fb47
ABPT 0x41A08648C3766F9F9d85598fF102a08f4ef84F84
AAVE
stkABPTv2 (Balancer V2 AAVE/wstETH BPT)
0x9eDA81C21C273a82BE9Bbc19B6A6182212068101
ABPT_V2 0x3de27EFa2F1AA663Ae5D458857e731c129069F29
AAVE
stkGHO
0x1a88Df1cFe15Af22B3c4c783D4e6F7F9e0C1885d
GHO 0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f
AAVE
AAVE = 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9. Reward token is AAVE for every entry.
Positions returned
Up to three legs per stake token (whose staked/reward asset is registered on NAVCalculator):
Locked staking
Staking
false
true
Staked-token amount that is not withdrawable right now — active stake plus any cooldown that is still cooling or whose claim window has already passed. amount = previewRedeem(lockedShares)
Unlocked staking
Staking
false
false
Staked-token amount that is withdrawable right now. amount = previewRedeem(unlockedShares). Present only when there is an active cooldown whose period has elapsed and is still inside the UNSTAKE_WINDOW
Rewards
Rewards
false
false
Total claimable (accrued, unclaimed) reward tokens. amount = getTotalRewardsBalance(account), denominated in AAVE
Zero-amount legs are skipped. For stkAAVE all legs are denominated in AAVE and are told apart by PositionKind (rewards vs. staking) and by isLocked (locked vs. unlocked staking).
Balance calculation
Per stake token, the balance is split into a locked and an unlocked staking leg by reading the account's cooldown:
If the cooldown reads fail, or there is no active cooldown, the whole balance is treated as locked and no unlocked leg is emitted.
Identity
positionId:
abi.encode(address stakeToken)— the same value for all three legs of a stake token; there is no discriminator in thepositionIdpositionKind:
Staking·Rewards
The two staking legs share the same positionId and positionKind; since isLocked is a mutable per-leg attribute and not part of the key, they reconcile into one coordinate and sum to the total staked (read isLocked per leg — true locked, false unlocked — for the breakdown). The rewards leg shares the same positionId but is told apart from staking by its positionKind (Rewards). There is no labels field on the position; the adapter implements positionLabels(positionId), which returns ["Safety Module"] (the category is itself the leaf), surfaced only by the verbose reads.
Constructor
navCalculator
NAVCalculator address (non-zero, must be a contract); used to resolve registered-asset metadata
No stake-token addresses are passed — they are baked into bytecode.
Registration
Registered as a plain adapter with addBalanceAdapters([adapter]) (MANAGER-gated); removed with removeBalanceAdapters.
Last updated