Skip to content

Commit a0f3f76

Browse files
committed
feat: useHealth, useUsdExchangeRates, useUserMarketStats, useVault, useVaults, useUserVaults hooks
1 parent deedc17 commit a0f3f76

File tree

4 files changed

+339
-1
lines changed

4 files changed

+339
-1
lines changed

packages/react/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ export * from './misc';
55
export * from './reserves';
66
export * from './transactions';
77
export * from './user';
8+
export * from './vaults';

packages/react/src/misc.ts

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { type Chain, ChainsQuery } from '@aave/graphql';
1+
import {
2+
type Chain,
3+
ChainsQuery,
4+
HealthQuery,
5+
type UsdExchangeRate,
6+
UsdExchangeRatesQuery,
7+
type UsdExchangeRatesRequest,
8+
} from '@aave/graphql';
29
import type {
310
ReadResult,
411
Suspendable,
@@ -40,3 +47,89 @@ export function useAaveChains({
4047
suspense,
4148
});
4249
}
50+
51+
/**
52+
* Health check query.
53+
*
54+
* This signature supports React Suspense:
55+
*
56+
* ```tsx
57+
* const { data } = useHealth({
58+
* suspense: true,
59+
* });
60+
* ```
61+
*/
62+
export function useHealth(args: Suspendable): SuspenseResult<boolean>;
63+
64+
/**
65+
* Health check query.
66+
*
67+
* ```tsx
68+
* const { data, loading } = useHealth();
69+
* ```
70+
*/
71+
export function useHealth(): ReadResult<boolean>;
72+
73+
export function useHealth({
74+
suspense = false,
75+
}: {
76+
suspense?: boolean;
77+
} = {}): SuspendableResult<boolean> {
78+
return useSuspendableQuery({
79+
document: HealthQuery,
80+
variables: {},
81+
suspense,
82+
});
83+
}
84+
85+
export type UseUsdExchangeRatesArgs = UsdExchangeRatesRequest;
86+
87+
/**
88+
* Fetch USD exchange rates for different tokens on a given market.
89+
*
90+
* This signature supports React Suspense:
91+
*
92+
* ```tsx
93+
* const { data } = useUsdExchangeRates({
94+
* market: evmAddress('0x1234…'),
95+
* underlyingTokens: [evmAddress('0x5678…'), evmAddress('0x90ab…')],
96+
* chainId: chainId(1),
97+
* suspense: true,
98+
* });
99+
* ```
100+
*/
101+
export function useUsdExchangeRates(
102+
args: UseUsdExchangeRatesArgs & Suspendable,
103+
): SuspenseResult<UsdExchangeRate[]>;
104+
105+
/**
106+
* Fetch USD exchange rates for different tokens on a given market.
107+
*
108+
* ```tsx
109+
* const { data, loading } = useUsdExchangeRates({
110+
* market: evmAddress('0x1234…'),
111+
* underlyingTokens: [evmAddress('0x5678…'), evmAddress('0x90ab…')],
112+
* chainId: chainId(1),
113+
* });
114+
* ```
115+
*/
116+
export function useUsdExchangeRates(
117+
args: UseUsdExchangeRatesArgs,
118+
): ReadResult<UsdExchangeRate[]>;
119+
120+
export function useUsdExchangeRates({
121+
suspense = false,
122+
market,
123+
underlyingTokens,
124+
chainId,
125+
}: UseUsdExchangeRatesArgs & {
126+
suspense?: boolean;
127+
}): SuspendableResult<UsdExchangeRate[]> {
128+
return useSuspendableQuery({
129+
document: UsdExchangeRatesQuery,
130+
variables: {
131+
request: { market, underlyingTokens, chainId },
132+
},
133+
suspense,
134+
});
135+
}

packages/react/src/user.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import {
2+
type MarketUserStats,
23
UserBorrowsQuery,
34
type UserBorrowsRequest,
5+
UserMarketStatsQuery,
6+
type UserMarketStatsRequest,
47
type UserReserveBorrowPosition,
58
type UserReserveSupplyPosition,
69
UserSuppliesQuery,
@@ -117,3 +120,55 @@ export function useUserBorrows({
117120
suspense,
118121
});
119122
}
123+
124+
export type UseUserMarketStatsArgs = UserMarketStatsRequest;
125+
126+
/**
127+
* Fetch user account market data across all reserves.
128+
*
129+
* This signature supports React Suspense:
130+
*
131+
* ```tsx
132+
* const { data } = useUserMarketStats({
133+
* market: evmAddress('0x1234…'),
134+
* user: evmAddress('0x5678…'),
135+
* chainId: chainId(1),
136+
* suspense: true,
137+
* });
138+
* ```
139+
*/
140+
export function useUserMarketStats(
141+
args: UseUserMarketStatsArgs & Suspendable,
142+
): SuspenseResult<MarketUserStats>;
143+
144+
/**
145+
* Fetch user account market data across all reserves.
146+
*
147+
* ```tsx
148+
* const { data, loading } = useUserMarketStats({
149+
* market: evmAddress('0x1234…'),
150+
* user: evmAddress('0x5678…'),
151+
* chainId: chainId(1),
152+
* });
153+
* ```
154+
*/
155+
export function useUserMarketStats(
156+
args: UseUserMarketStatsArgs,
157+
): ReadResult<MarketUserStats>;
158+
159+
export function useUserMarketStats({
160+
suspense = false,
161+
market,
162+
user,
163+
chainId,
164+
}: UseUserMarketStatsArgs & {
165+
suspense?: boolean;
166+
}): SuspendableResult<MarketUserStats> {
167+
return useSuspendableQuery({
168+
document: UserMarketStatsQuery,
169+
variables: {
170+
request: { market, user, chainId },
171+
},
172+
suspense,
173+
});
174+
}

packages/react/src/vaults.ts

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import type { VaultRequest, VaultsRequest } from '@aave/client/actions';
2+
import {
3+
type PaginatedVaultsResult,
4+
UserVaultsQuery,
5+
type UserVaultsRequest,
6+
type Vault,
7+
VaultQuery,
8+
VaultsQuery,
9+
} from '@aave/graphql';
10+
import type {
11+
ReadResult,
12+
Suspendable,
13+
SuspendableResult,
14+
SuspenseResult,
15+
} from './helpers';
16+
import { useSuspendableQuery } from './helpers';
17+
18+
export type UseVaultArgs = VaultRequest;
19+
20+
/**
21+
* Fetch a single vault by address and chain ID.
22+
*
23+
* This signature supports React Suspense:
24+
*
25+
* ```tsx
26+
* const { data } = useVault({
27+
* address: evmAddress('0x1234…'),
28+
* chainId: chainId(1),
29+
* user: evmAddress('0x5678…'),
30+
* suspense: true,
31+
* });
32+
* ```
33+
*/
34+
export function useVault(
35+
args: UseVaultArgs & Suspendable,
36+
): SuspenseResult<Vault | null>;
37+
38+
/**
39+
* Fetch a single vault by address and chain ID.
40+
*
41+
* ```tsx
42+
* const { data, loading } = useVault({
43+
* address: evmAddress('0x1234…'),
44+
* chainId: chainId(1),
45+
* user: evmAddress('0x5678…'),
46+
* });
47+
* ```
48+
*/
49+
export function useVault(args: UseVaultArgs): ReadResult<Vault | null>;
50+
51+
export function useVault({
52+
suspense = false,
53+
address,
54+
chainId,
55+
user,
56+
}: UseVaultArgs & {
57+
suspense?: boolean;
58+
}): SuspendableResult<Vault | null> {
59+
return useSuspendableQuery({
60+
document: VaultQuery,
61+
variables: {
62+
request: { address, chainId },
63+
includeUserShares: !!user,
64+
userAddress: user ?? '0x0000000000000000000000000000000000000000',
65+
},
66+
suspense,
67+
});
68+
}
69+
70+
export type UseVaultsArgs = VaultsRequest;
71+
72+
/**
73+
* Fetch vaults based on filter criteria.
74+
*
75+
* This signature supports React Suspense:
76+
*
77+
* ```tsx
78+
* const { data } = useVaults({
79+
* criteria: {
80+
* ownedBy: [evmAddress('0x1234…')]
81+
* },
82+
* pageSize: PageSize.Ten,
83+
* user: evmAddress('0x5678…'),
84+
* suspense: true,
85+
* });
86+
* ```
87+
*/
88+
export function useVaults(
89+
args: UseVaultsArgs & Suspendable,
90+
): SuspenseResult<PaginatedVaultsResult>;
91+
92+
/**
93+
* Fetch vaults based on filter criteria.
94+
*
95+
* ```tsx
96+
* const { data, loading } = useVaults({
97+
* criteria: {
98+
* ownedBy: [evmAddress('0x1234…')]
99+
* },
100+
* pageSize: PageSize.Ten,
101+
* user: evmAddress('0x5678…'),
102+
* });
103+
* ```
104+
*/
105+
export function useVaults(
106+
args: UseVaultsArgs,
107+
): ReadResult<PaginatedVaultsResult>;
108+
109+
export function useVaults({
110+
suspense = false,
111+
criteria,
112+
pageSize,
113+
cursor,
114+
user,
115+
}: UseVaultsArgs & {
116+
suspense?: boolean;
117+
}): SuspendableResult<PaginatedVaultsResult> {
118+
return useSuspendableQuery({
119+
document: VaultsQuery,
120+
variables: {
121+
request: { criteria, pageSize, cursor },
122+
includeUserShares: !!user,
123+
userAddress: user ?? '0x0000000000000000000000000000000000000000',
124+
},
125+
suspense,
126+
});
127+
}
128+
129+
export type UseUserVaultsArgs = UserVaultsRequest;
130+
131+
/**
132+
* Fetch vaults that a user has shares in.
133+
*
134+
* This signature supports React Suspense:
135+
*
136+
* ```tsx
137+
* const { data } = useUserVaults({
138+
* user: evmAddress('0x1234…'),
139+
* filters: {
140+
* markets: [evmAddress('0x5678…')]
141+
* },
142+
* orderBy: { shares: OrderDirection.Desc },
143+
* pageSize: PageSize.Fifty,
144+
* suspense: true,
145+
* });
146+
* ```
147+
*/
148+
export function useUserVaults(
149+
args: UseUserVaultsArgs & Suspendable,
150+
): SuspenseResult<PaginatedVaultsResult>;
151+
152+
/**
153+
* Fetch vaults that a user has shares in.
154+
*
155+
* ```tsx
156+
* const { data, loading } = useUserVaults({
157+
* user: evmAddress('0x1234…'),
158+
* filters: {
159+
* markets: [evmAddress('0x5678…')]
160+
* },
161+
* orderBy: { shares: OrderDirection.Desc },
162+
* pageSize: PageSize.Fifty,
163+
* });
164+
* ```
165+
*/
166+
export function useUserVaults(
167+
args: UseUserVaultsArgs,
168+
): ReadResult<PaginatedVaultsResult>;
169+
170+
export function useUserVaults({
171+
suspense = false,
172+
user,
173+
filters,
174+
orderBy,
175+
pageSize,
176+
cursor,
177+
}: UseUserVaultsArgs & {
178+
suspense?: boolean;
179+
}): SuspendableResult<PaginatedVaultsResult> {
180+
return useSuspendableQuery({
181+
document: UserVaultsQuery,
182+
variables: {
183+
request: { user, filters, orderBy, pageSize, cursor },
184+
includeUserShares: true,
185+
userAddress: user,
186+
},
187+
suspense,
188+
});
189+
}

0 commit comments

Comments
 (0)