$ npm install @tetherto/wdk-protocol-lending-aave-evmNote: This package is in beta. Please test in a dev setup first.
A simple way to use Aave V3 lending with EVM wallet accounts. You can add and take out tokens, borrow, pay back, and read your account data. It works with normal EVM accounts and ERC-4337 smart accounts.
This is part of WDK (Wallet Development Kit). WDK helps you build safe, nonโcustody wallets. Read more at https://docs.wallet.tether.io.
npm install @tetherto/wdk-protocol-lending-aave-evm
import AaveProtocolEvm from '@tetherto/wdk-protocol-lending-aave-evm'
import { WalletAccountEvm } from '@tetherto/wdk-wallet-evm'
const seed = 'your twelve word seed goes here'
// Create account at path m/44'/60'/0'/0/0
const account = new WalletAccountEvm(seed, "0'/0/0", {
provider: 'https://ethereum-rpc.publicnode.com'
})
// Create protocol
const aave = new AaveProtocolEvm(account)
// Supply
await aave.supply({ token: 'TOKEN_ADDRESS', amount: 1000000n })
// Withdraw
await aave.withdraw({ token: 'TOKEN_ADDRESS', amount: 1000000n })
// Borrow
await aave.borrow({ token: 'TOKEN_ADDRESS', amount: 1000000n })
// Repay
await aave.repay({ token: 'TOKEN_ADDRESS', amount: 1000000n })
// Get account data
const data = await aave.getAccountData()
// Supply quote
const supplyQuote = await aave.quoteSupply({ token: 'TOKEN_ADDRESS', amount: 1000000n })
// Withdraw quote
const withdrawQuote = await aave.quoteWithdraw({ token: 'TOKEN_ADDRESS', amount: 1000000n })
// Borrow quote
const borrowQuote = await aave.quoteBorrow({ token: 'TOKEN_ADDRESS', amount: 1000000n })
// Repay quote
const repayQuote = await aave.quoteRepay({ token: 'TOKEN_ADDRESS', amount: 1000000n })
import AaveProtocolEvm from '@tetherto/wdk-protocol-lending-aave-evm'
import { WalletAccountEvmErc4337 } from '@tetherto/wdk-wallet-evm-erc-4337'
const smart = new WalletAccountEvmErc4337(seed, "0'/0/0", {
provider: 'https://arb1.arbitrum.io/rpc',
bundlerUrl: 'YOUR_BUNDLER',
paymasterUrl: 'YOUR_PAYMASTER'
})
const aave4337 = new AaveProtocolEvm(smart)
// Supply with smart account
const result = await aave4337.supply({ token: 'TOKEN_ADDRESS', amount: 1000000n }, {
paymasterToken: 'USDT'
})
Main class for Aave V3 lending on EVM.
new AaveProtocolEvm(account)
Parameters:
account (WalletAccountEvm | WalletAccountEvmErc4337 | WalletAccountReadOnlyEvm | WalletAccountReadOnlyEvmErc4337)Example:
const aave = new AaveProtocolEvm(account)
| Method | Description | Returns |
|---|---|---|
supply(options, config?) | Add tokens to the pool | Promise<{hash: string, fee: bigint, ...}> |
quoteSupply(options, config?) | Get cost to add tokens | Promise<{fee: bigint}> |
withdraw(options, config?) | Take tokens from the pool | Promise<{hash: string, fee: bigint}> |
quoteWithdraw(options, config?) | Get cost to take tokens | Promise<{fee: bigint}> |
borrow(options, config?) | Borrow tokens from the pool | Promise<{hash: string, fee: bigint}> |
quoteBorrow(options, config?) | Get cost to borrow | Promise<{fee: bigint}> |
repay(options, config?) | Pay back what you borrowed | Promise<{hash: string, fee: bigint}> |
quoteRepay(options, config?) | Get cost to pay back | Promise<{fee: bigint}> |
setUseReserveAsCollateral(token, use, config?) | Turn use as collateral on or off | Promise<{hash: string, fee: bigint}> |
setUserEMode(categoryId, config?) | Set eMode for the user | Promise<{hash: string, fee: bigint}> |
getAccountData(account?) | Read account stats | Promise<{...}> |
supply(options, config?)Add tokens to the pool.
Options:
token (string): token addressamount (bigint): amount in base unitonBehalfOf (string, optional)Example:
const result = await aave.supply({ token: 'TOKEN_ADDRESS', amount: 1000000n })
Notes:
approveHash and resetAllowanceHash (for USDT on main net).hash and fee are returned.quoteSupply(options, config?)Get the fee to add tokens.
const quote = await aave.quoteSupply({ token: 'TOKEN_ADDRESS', amount: 1000000n })
withdraw(options, config?)Take tokens from the pool.
Options:
token (string)amount (bigint)to (string, optional)const tx = await aave.withdraw({ token: 'TOKEN_ADDRESS', amount: 1000000n })
quoteWithdraw(options, config?)Get the fee to take tokens.
const quote = await aave.quoteWithdraw({ token: 'TOKEN_ADDRESS', amount: 1000000n })
borrow(options, config?)Borrow tokens from the pool.
Options:
token (string)amount (bigint)onBehalfOf (string, optional)const tx = await aave.borrow({ token: 'TOKEN_ADDRESS', amount: 1000000n })
quoteBorrow(options, config?)Get the fee to borrow.
const quote = await aave.quoteBorrow({ token: 'TOKEN_ADDRESS', amount: 1000000n })
repay(options, config?)Pay back what you borrowed.
Options:
token (string)amount (bigint)onBehalfOf (string, optional)const tx = await aave.repay({ token: 'TOKEN_ADDRESS', amount: 1000000n })
Notes:
approveHash and resetAllowanceHash (USDT on main net).hash and fee are returned.quoteRepay(options, config?)Get the fee to pay back.
const quote = await aave.quoteRepay({ token: 'TOKEN_ADDRESS', amount: 1000000n })
setUseReserveAsCollateral(token, use, config?)Turn use as collateral on or off for a token.
const tx = await aave.setUseReserveAsCollateral('TOKEN_ADDRESS', true)
setUserEMode(categoryId, config?)Set eMode for the user.
const tx = await aave.setUserEMode(1)
getAccountData(account?)Read account stats like total collateral, debt, and health.
const data = await aave.getAccountData()
Returns:
{
totalCollateralBase: bigint,
totalDebtBase: bigint,
availableBorrowsBase: bigint,
currentLiquidationThreshold: bigint,
ltv: bigint,
healthFactor: bigint
}
paymasterToken (string): token to pay gas.token must be a valid address (not zero address).amount must be greater than 0.onBehalfOf and to (if set) must be valid and not zero address.Notes:
amount is in the token base unit (use BigInt like 1000000n).0 and then set it again.Works on Aave V3 chains. You need a working RPC and the right token address.
Supported chains:
# Install dependencies
npm install
# Build TypeScript definitions
npm run build:types
# Lint code
npm run lint
# Fix linting issues
npm run lint:fix
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
For support, please open an issue on the GitHub repository.