Incentive Programs#
Learn how to discover and claim incentive rewards on Aave v4.
Aave v4 reserves may offer additional incentives beyond base lending rates. These incentives are distributed through Merkl, a decentralized incentive distribution platform, or through Points programs that reward users with points multipliers.
Reward Types#
Potential rewards are available in the rewards array of the Reserve Summary.
Supply Rewards#
Supply rewards can be present on suppliable reserves.
Merkl Supply Rewards#
Merkl supply rewards represent an extra APY on top of the base reserve supply APY. The accrued extra interest is paid in the specified payout token when the incentive campaign reaches its maturity.
Where:
extraApy- The additional APY earned on top of the base supply APYpayoutToken- The token used to pay the extra interest accrued from the rewardcriteria- Eligibility requirements for earning the reward
Points Supply Rewards#
Some reserves participate in Points programs. Users who supply into these reserves accrue points over time proportional to their position size.
Where:
program- The Points program issuing the rewardmultiplier- Boost factor on the base points accrual ratecriteria- Eligibility requirements for earning the reward
Borrow Rewards#
Borrow rewards can be present on borrowable reserves.
Merkl Borrow Rewards#
Merkl borrow rewards represent an APY discount on the user's borrow rate (which includes their Risk Premium). The accrued interest discount is paid in the specified payout token when the incentive campaign reaches its maturity.
Where:
discountApy- The APY discount applied to the user's borrow ratepayoutToken- The token used to pay the rewardcriteria- Eligibility requirements for earning the reward
Points Borrow Rewards#
Similarly, borrowing from certain reserves can accrue points in a Points program.
Where:
program- The Points program issuing the rewardmultiplier- Boost factor on the base points accrual ratecriteria- Eligibility requirements for earning the reward
Points Program#
A PointsProgram represents a loyalty or incentive system. Users accumulate points over time based on their supply or borrow position. The externalUrl links to the program's website where users can view their accumulated points.
Eligibility Criteria#
Each reward may have eligibility criteria that users must meet. Both Merkl and Points criteria share the same shape (id, text, userPassed) but use distinct GraphQL types.
Matured Rewards#
Rewards become claimable when their incentive campaign reaches maturity. Campaigns are often renewed upon reaching their end date, so users should check for new reward opportunities periodically.
Claimable Rewards#
Fetch the user's matured rewards that are ready to claim.
- React
- TypeScript
- GraphQL
Use the useUserClaimableRewards hook (or the imperative useUserClaimableRewardsAction variant) to fetch all rewards the user can claim.
useUserClaimableRewardsAction hook does not watch for updates. Use
it when you need on-demand, fresh data (e.g., in an event handler).The UserMerklClaimableReward type contains details about each claimable reward:
Where:
id- Unique identifier for the reward (used when claiming)claimable- The claimable token amountstartDate- When the reward period startedendDate- When the reward period endedclaimUntil- Deadline to claim the reward
Claim Rewards#
Once you have claimable rewards, collect them individually or all at once in a single transaction.
- React
- TypeScript
- GraphQL
To claim rewards with AaveKit React, follow these steps.
1
Configure Wallet Integration#
First, instantiate the useSendTransaction hook for the wallet library of your choice.
Viem
import { useWalletClient } from "wagmi";import { useSendTransaction } from "@aave/react/viem";
// …
const { data: wallet } = useWalletClient();const [sendTransaction] = useSendTransaction(wallet);2
Define the Claim Flow#
Then, use the useClaimRewards hook to prepare the claim operation.
3
Execute the Claim Operation#
Then, execute the claim operation with the reward IDs from the claimable rewards.
Claim Rewards
import { chainId, useUserClaimableRewards, rewardId, evmAddress,} from "@aave/react";
const { data: claimableRewards } = useUserClaimableRewards({ user: evmAddress(wallet.account.address), chainId: chainId(1), suspense: true,});
const execute = async () => { if (claimableRewards.length > 0) { const result = await claim({ ids: claimableRewards.map((reward) => rewardId(reward.id)), user: evmAddress(wallet.account.address), chainId: chainId(1), });
// … }};4
Handle the Result#
Finally, handle the result.
Example
const execute = async () => { const result = await claim(/* … */);
if (result.isErr()) { switch (result.error.name) { case "CancelError": // The user cancelled the operation return;
case "SigningError": console.error( `Failed to sign the transaction: ${result.error.message}`, ); break;
case "TimeoutError": console.error(`Transaction timed out: ${result.error.message}`); break;
case "TransactionError": console.error(`Transaction failed: ${result.error.message}`); break;
case "UnexpectedError": console.error(result.error.message); break; } return; }
console.log("Rewards claimed successfully with hash:", result.value.txHash);};