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
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:1
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).
2
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.3
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.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)
1
Open the Aave faucet
Go to app.aave.com/faucet.
2
Select Base Sepolia
Switch the network selector to testnet mode and pick Base Sepolia.
3
Connect your wallet
Connect the wallet you will use to sign Pods transactions.
4
Mint USDC
Click Faucet on USDC — it mints a fixed batch of test USDC to your wallet (repeatable).
Confirm the transaction.
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:1
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.2
Open the contract on BaseScan
Open it on sepolia.basescan.org →
Contract → Write Contract → Connect.
3
Call mint
Call
mint(address token, address to, uint256 amount) with token = the faucet USDC,
to = your wallet, amount = base units (6 decimals — 100000000 = 100 USDC).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
Example request:
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
Because aTokens are 1:1 with the underlying,
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
9. End-to-end testnet run
A full smoke test from a clean wallet:1
Fund the wallet
Mint faucet USDC (§1) and grab a little Base Sepolia ETH for gas. Verify both balances on
BaseScan.
2
Resolve the strategy
Confirm
availableActions includes lend and withdraw (§3).3
Lend a small amount (e.g. 10 USDC)
bytecode leg (chainId 84532) on Base Sepolia.4
Confirm the position
currentPosition.value should reflect ≈ 10 USDC in base units (minus entry fee, if configured):5
Withdraw
bytecode on Base Sepolia.6
Confirm the exit
Refresh the position —
currentPosition.value drops back toward 0 and the USDC returns to the
wallet (minus any performance fee).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:
There is no dedicated insufficient-balance error code: lending more USDC than the wallet holds
(or withdrawing more than the position) surfaces as
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