protocol: "Aave", network: base-sepolia)
running entirely on the Base Sepolia testnet (chain 84532). Use it to integrate and test the
Pods lend / withdraw flow end-to-end before pointing your client at a mainnet Aave strategy.
You lend faucet USDC into the Aave v3 pool and receive an interest-bearing aToken position;
withdrawing redeems it back to USDC. Everything is same-chain and synchronous — there is no
bridge leg and no async order fill.
Testnet only. Funds have no real value. USD / TVL figures for this strategy are not
meaningful — the faucet USDC has no price feed. Drive your test assertions off raw underlying
balances and the on-chain aToken balance, not USD values.
Overview
| Item | Value |
|---|---|
| Strategy ID | aave-aBasSepUSDC-base-sepolia |
| Protocol | Aave |
| Network | Base Sepolia (84532) |
| Strategy asset | aBasSepUSDC aToken — 0x10F1A9D11CDf50041f3f8cB7191CBE2f31750ACC (6 decimals) |
| Underlying asset | Faucet USDC — 0xba50Cd2A20f6DA35D788639E581bca8d0B5d4D5f (6 decimals) |
| Actions | lend (deposit) / withdraw (redeem) |
| Settlement | Synchronous, single chain (no bridge, no async fill) |
GET /strategies/:id/bytecode returns bytecode[] (to execute on-chain) plus tracking fields
(id, feeCharged, chainIdIn, chainIdOut, crossChain). For a direct same-chain
lend/withdraw the quote field is null — it is only populated when an extra swap or bridge
leg is involved. aTokens are 1:1 with the underlying at any instant — 1 USDC lent ≈ 1
aBasSepUSDC share.Initial setup
Before your first request, the signing wallet must be funded on Base Sepolia:Have funds of the underlying asset (faucet USDC)
There is no point buying it — it has no value. Mint it from the Aave faucet (see
Get the faucet below).
Have Base Sepolia ETH for gas
Your wallet signs and broadcasts the
lend / withdraw transaction, so it needs native ETH to
pay gas. Grab some from any Base Sepolia faucet.Have a Pods API key
Every request is authenticated with the
x-api-key header. See
Authentication.1. Get the faucet (USDC)
The underlying is a mock USDC deployed by Aave for Base Sepolia. You acquire it by minting from the Aave testnet faucet — you cannot buy it and it carries no value.| Token | Address | Decimals | Chain |
|---|---|---|---|
| Faucet USDC | 0xba50Cd2A20f6DA35D788639E581bca8d0B5d4D5f | 6 | 84532 |
| aBasSepUSDC | 0x10F1A9D11CDf50041f3f8cB7191CBE2f31750ACC | 6 | 84532 |
You only ever mint USDC (the underlying). The
aBasSepUSDC aToken is minted by the Aave
pool when you lend — never mint or transfer it directly.Option A — Aave faucet UI (recommended)
Open the Aave faucet
Go to app.aave.com/faucet.
0xba50Cd2A20f6DA35D788639E581bca8d0B5d4D5f) shows up in your
wallet balance. Import the token address if it doesn’t appear automatically.
Option B — mint directly via BaseScan
The Aave faucet is an on-chain contract; you can mint without the UI:Find the Faucet address
Get the Faucet address for the Aave v3 Base Sepolia market from the Aave
address-book (testnet markets), or read it
from the Aave UI transaction in Option A.Open the contract on BaseScan
Open it on sepolia.basescan.org →
Contract → Write Contract → Connect.
Base Sepolia ETH for gas
You also need a small amount of native ETH on Base Sepolia to pay gas. A fraction of an ETH covers many test transactions. Public faucets (these are the ones we used):- Alchemy — Base Sepolia faucet
- Chainlink — Base Sepolia faucet
- Coinbase Developer Platform / QuickNode Base Sepolia faucets
- Or bridge Sepolia ETH → Base Sepolia via the official Base bridge
2. Integration flow
3. Resolve the strategy ID
The strategy ID is fixed (aave-aBasSepUSDC-base-sepolia), but you can also discover it:
{ data: [...], pagination }. Pick the strategy where asset matches the aToken
(0x10F1A9D11CDf50041f3f8cB7191CBE2f31750ACC) and networkId === 84532. Use actions lend and
withdraw from availableActions.
4. Lend — lend
| Parameter | Required | Description |
|---|---|---|
action | yes | lend |
wallet | yes | Address that signs on Base Sepolia and holds the position |
amount | yes | Faucet USDC in base units (6 decimals — 1000000 = 1 USDC) |
output | no | bytecode (default) / userOperation / fireblocks / instructions |
bytecode legs are on chainId 84532 (Base Sepolia). Sign and broadcast them on Base Sepolia;
the position is live as soon as the transaction confirms.
An entry fee may be deducted from the deposited amount (configured per customer). The amount
charged is reported in the top-level
feeCharged field, and the aToken shares you receive
correspond to the amount after the fee.5. Withdraw — withdraw
| Parameter | Required | Description |
|---|---|---|
action | yes | withdraw |
wallet | yes | Address on Base Sepolia that holds the position |
amount | yes | Underlying USDC to redeem, in base units (6 decimals) |
output | no | bytecode (default) / userOperation / fireblocks / instructions |
amount is denominated in USDC base units (not a
separate share unit). To exit the full position, use the current position value (see
Position). The response shape matches lend (feeCharged, chainIdIn, chainIdOut,
id, crossChain, quote: null, bytecode); all legs are on chainId 84532.
A performance fee may be charged on profit at withdraw time and transferred out as part of the
bytecode — the redeemed amount reflects the amount after that fee.
6. Position
Thewallet is the same EVM address used for signing (always on Base Sepolia for this strategy).
Pass wallet to get position fields; omit it to get only APY fields.
Single strategy position:
GET /v2/wallets/:address/strategies/:strategyId (same shape).
Wallet snapshot (all positions): GET /v2/wallets/:address?include=all — Aave positions appear
under earn.positions where strategy.protocol === "Aave".
Position shape (with wallet). Balance fields are AssetAmount objects
({ value, decimals, symbol, displaySymbol }), where value is the raw integer string:
wallet, spotPosition contains only apy, grossAPY, netAPY, inceptionApy, avgApy
(and optionally performanceFee) — no balance fields.
7. Track the transaction
Settlement is synchronous: once the Base Sepolia transaction confirms, the lend / withdraw is complete — there is no separate async order to await.- Wait for the on-chain receipt (
status === 1) onchainId 84532. - Refresh the position endpoints after confirmation.
- History is available via
GET /wallets/:wallet/history/:strategyId. IgnoreINITIALstatus (a quote artifact). Optionally subscribe towss://<api-host>/updatesand the wallet channel foraction_updateevents.
8. Network & addresses
| Item | Value |
|---|---|
| Network | Base Sepolia |
| Chain ID | 84532 |
| Explorer | https://sepolia.basescan.org |
| Native gas asset | ETH |
| Aave Pool | 0x8bAB6d1b75f19e9eD9fCe8b9BD338844fF79aE27 |
| Aave DataProvider | 0x3cB7B00B6C09B71998124196691e8bF2694De863 |
| Faucet USDC (underlying) | 0xba50Cd2A20f6DA35D788639E581bca8d0B5d4D5f (6 decimals) |
| aBasSepUSDC (aToken) | 0x10F1A9D11CDf50041f3f8cB7191CBE2f31750ACC (6 decimals) |
9. End-to-end testnet run
A full smoke test from a clean wallet:Fund the wallet
Mint faucet USDC (§1) and grab a little Base Sepolia ETH for gas. Verify both balances on
BaseScan.
Confirm the position
currentPosition.value should reflect ≈ 10 USDC in base units (minus entry fee, if configured):10. Errors
The amount-specific errors (LEND_AMOUNT_TOO_SMALL, WITHDRAW_AMOUNT_TOO_SMALL,
WITHDRAW_AMOUNT_REQUIRED, REQUEST_LEND_AMOUNT_TOO_LOW) are Ondo-stock specific and do not
apply to this Aave strategy. The ones you can actually hit here:
| Code | HTTP | When |
|---|---|---|
NO_API_KEY / INVALID_API_KEY | 401 | Missing or invalid x-api-key |
QUOTE_NOT_FOUND | 404 | Quote no longer available — re-request the bytecode |
QUOTE_EXPIRED | 400 | Quote expired — re-request the bytecode |
BYTECODE_GENERATION_FAILED | 500 | Bytecode could not be built (e.g. wallet has no USDC / no position to withdraw) |
INTERNAL_SERVER_ERROR | 500 | Unexpected server error |
BYTECODE_GENERATION_FAILED, or the on-chain
transaction reverts. See Error Codes for the full list, and preserve error.code
in your UI for user-friendly messages.
Integration notes
- Use the generic actions:
lend(deposit) andwithdraw(redeem). There is norequest-lend/request-withdrawhere — settlement is synchronous and same-chain. - Sign on Base Sepolia (
84532) for every leg; the position lives on the same wallet/chain. - Amounts are in USDC base units (6 decimals) for both lend and withdraw — aTokens are 1:1 with the underlying, so there is no separate share unit to convert.
- Fees: an entry fee may reduce the lent amount (reported as top-level
feeCharged); a performance fee may be taken on profit at withdraw. - Testnet caveats: USD / TVL values are unreliable (no price feed) — assert on raw balances.
- Smart accounts: pass
output=userOperation, oroutput=fireblockswithaccountId.
Next Steps
Deposit to Yield
The full deposit reference (same-chain & cross-chain) for mainnet strategies
Check Positions
Monitor your open yield positions