TypeScript
Get started with AaveKit TypeScript
AaveKit TypeScript for Aave v4 provides a type-safe, low-level API client for interacting with Aave Protocol v4. It offers a lightweight abstraction over the GraphQL API and is ideal for server-to-server communication.
Built with a modular, functional approach inspired by the viem client-actions architecture, the SDK structures functionality into distinct, reusable actions focused on specific protocol features like lending, borrowing, and data retrieval.
Getting Started
To get started, follow the steps below.
Then, create an AaveClient instance that will be used to interact with the protocol.
client.ts
import { AaveClient } from "@aave/client";
export const client = AaveClient.create();That's it—you can now start using the @aave/client/actions to interact with the Aave Protocol. Here's a basic example to query supported chains:
example.ts
import { AaveClient, evmAddress, chainId } from "@aave/client";import { chains } from "@aave/client/actions";
import { client } from "./client.ts";
// Fetch all chains supported by Aaveconst result = await chains(client);
if (result.isOk()) { console.log("Chains:", result.value);} else { console.error("Error:", result.error);}Result Objects
AaveKit uses a functional approach to error handling, it's based on Result<T, E> that represents one of two states:
Ok<T>: A successful result containing a value of type T
Err<E>: A failure containing an error of type E
Example
import { ok, err, Result } from "@aave/client";
function parseId(s: string): Result<number, Error> { if (/^\d+$/.test(s)) { return ok(Number(s)); } return err(new Error("ID must be a number"));}With a Result<T, E>, you can use the convenient isOk() and isErr() methods to check the outcome and narrow the type.
const result: Result<number, Error> = parseId("123");
if (result.isOk()) { console.log(result.value); // 123} else { console.error(result.error); // Error}This approach avoids reliance on try/catch blocks and promotes predictable, type-safe code by ensuring errors are handled explicitly.
AaveKit uses the NeverThrow library as underlying implementation for the Result object.
ResultAsync<T, E> is the async, thenable variant of Result<T, E>. Awaiting it resolves to a Result<T, E>.
import { ResultAsync } from "@aave/client";
function fetchUser(id: number): ResultAsync<{ name: string }, Error> { return ResultAsync.fromPromise( fetch(`/api/users/${id}`).then((r) => r.json()), () => new Error("Not found") );}
const result = await fetchUser(1);
if (result.isOk()) { console.log(result.value); // { name: "John" }} else { console.error(result.error); // Error}Result objects can be chained:
Chaining
function divide(a: number, b: number): Result<number, string> { return b === 0 ? err("Division by zero") : ok(a / b);}
const result = parseNumber("42").andThen((num) => divide(num, 2));
if (result.isOk()) { console.log("Result:", result.value);} else { console.error("Error:", result.error);}You can also provide a default value if the result is an error:
Default Value
const value = parseNumber("invalid").unwrapOr(0); // 0NeverThrow also provides a ResultAsync type for handling asynchronous operations. This is a thenable object that can be awaited, and/or chained with other operations:
Async
const result = await ResultAsync.fromPromise( fetch("https://api.example.com/data")) .map((response) => response.json()) .mapErr((error) => `Failed to fetch data: ${error}`);
if (result.isOk()) { console.log("Data:", result.value);} else { console.error("Error:", result.error);}See the NeverThrow documentation for more information.
Integrations
AaveKit TypeScript includes first-class support for viem, ethers v6, Privy, and thirdweb wallets.
- Viem
- Ethers
- Privy
- thirdweb
Ensure you have viem package installed in your project.
Send Aave Transactions
Among the actions provided by AaveKit TypeScript, some are specifically designed to handle protocol interactions such as supplying, borrowing, withdrawing, repaying, and more.
There are two main types of transaction actions:
Simple transactions – single-step transactions that can be sent directly to the wallet.
Complex transactions – transactions that may require prior approvals before they can be executed.
To send transactions, follow the steps below.
First, import the sendWith helper function for the wallet library of your choice.
- Viem
- Ethers
- Privy
- Dynamic
- thirdweb
Import the sendWith helper from the @aave/client/viem entry point.
Viem
import { sendWith } from "@aave/client/viem";Then, use the sendWith helper to send the transaction.
To demonstrate how this helper works, assume we have a transaction action named foobar.
To send the transaction, chain the action with sendWith for your wallet library, then use client.waitForTransaction to wait until it's confirmed and indexed by AaveKit API.
Finally, handle the result of the operation.
if (result.isErr()) { switch (result.error.name) { case "CancelError": // The user cancelled the operation return;
case "SigningError": // Most likely the user rejected the transaction 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 "ValidationError": console.error( `Insufficient balance: ${result.error.cause.required.value} required.` ); break;
case "UnexpectedError": console.error(result.error.message); break; } return;} else { console.log(result.value); // TxHash}That'it—you've sent the transaction.
Sign ERC-20 Permits
Some Aave operations support permit functionality using EIP-2612 signatures to authorize ERC-20 token transfers within the same transaction. The permit approach has a few benefits:
Single Transaction: Execute operations without separate approval transactions
Exact Amounts: Sign permissions for specific amounts instead of infinite approvals
Time Limited: Permits have deadlines for enhanced security
Permit is available for ERC-20 tokens that implement EIP-2612.
As with sendWith, import the provider-specific signERC20PermitWith helper to sign ERC-20 permits.
- Viem
- Ethers
- Privy
- thirdweb
Import the signERC20PermitWith helper from the @aave/client/viem entry point.
Viem
import { signERC20PermitWith } from "@aave/client/viem";Then, use it as described in the specific operation guide.