@lit-protocol/vincent-ability-morpho 0.0.7-mma
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +90 -0
- package/README.md +136 -0
- package/dist/CONTRIBUTING.md +90 -0
- package/dist/README.md +136 -0
- package/dist/package.json +34 -0
- package/dist/src/generated/lit-action.js +9 -0
- package/dist/src/generated/vincent-ability-metadata.json +3 -0
- package/dist/src/generated/vincent-bundled-ability.d.ts +98 -0
- package/dist/src/generated/vincent-bundled-ability.d.ts.map +1 -0
- package/dist/src/generated/vincent-bundled-ability.js +15 -0
- package/dist/src/generated/vincent-bundled-ability.js.map +1 -0
- package/dist/src/generated/vincent-bundled-ability.ts +13 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/helpers/index.d.ts +561 -0
- package/dist/src/lib/helpers/index.d.ts.map +1 -0
- package/dist/src/lib/helpers/index.js +1123 -0
- package/dist/src/lib/helpers/index.js.map +1 -0
- package/dist/src/lib/lit-action.d.ts +2 -0
- package/dist/src/lib/lit-action.d.ts.map +1 -0
- package/dist/src/lib/lit-action.js +16 -0
- package/dist/src/lib/lit-action.js.map +1 -0
- package/dist/src/lib/schemas.d.ts +125 -0
- package/dist/src/lib/schemas.d.ts.map +1 -0
- package/dist/src/lib/schemas.js +109 -0
- package/dist/src/lib/schemas.js.map +1 -0
- package/dist/src/lib/vincent-ability.d.ts +96 -0
- package/dist/src/lib/vincent-ability.d.ts.map +1 -0
- package/dist/src/lib/vincent-ability.js +378 -0
- package/dist/src/lib/vincent-ability.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { MorphoOperation } from '../schemas';
|
|
3
|
+
/**
|
|
4
|
+
* Well-known token addresses across different chains
|
|
5
|
+
* Using official Circle USDC and canonical WETH addresses
|
|
6
|
+
*/
|
|
7
|
+
export declare const WELL_KNOWN_TOKENS: {
|
|
8
|
+
readonly 1: {
|
|
9
|
+
readonly USDC: "0xA0b86991c6218A36c1D19D4a2e9Eb0cE3606eB48";
|
|
10
|
+
readonly WETH: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
|
|
11
|
+
readonly USDT: "0xdAC17F958D2ee523a2206206994597C13D831ec7";
|
|
12
|
+
};
|
|
13
|
+
readonly 8453: {
|
|
14
|
+
readonly USDC: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
15
|
+
readonly WETH: "0x4200000000000000000000000000000000000006";
|
|
16
|
+
readonly USDT: "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2";
|
|
17
|
+
};
|
|
18
|
+
readonly 42161: {
|
|
19
|
+
readonly USDC: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831";
|
|
20
|
+
readonly WETH: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
|
|
21
|
+
readonly USDT: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9";
|
|
22
|
+
};
|
|
23
|
+
readonly 10: {
|
|
24
|
+
readonly USDC: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85";
|
|
25
|
+
readonly WETH: "0x4200000000000000000000000000000000000006";
|
|
26
|
+
readonly USDT: "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58";
|
|
27
|
+
};
|
|
28
|
+
readonly 137: {
|
|
29
|
+
readonly USDC: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359";
|
|
30
|
+
readonly WETH: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
|
|
31
|
+
readonly USDT: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F";
|
|
32
|
+
};
|
|
33
|
+
readonly 11155111: {
|
|
34
|
+
readonly USDC: "0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8";
|
|
35
|
+
readonly WETH: "0xC558DBdd856501FCd9aaF1E62eae57A9F0629a3c";
|
|
36
|
+
readonly USDT: "0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0";
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Supported chain IDs and their names
|
|
41
|
+
*/
|
|
42
|
+
export declare const SUPPORTED_CHAINS: {
|
|
43
|
+
readonly 1: "ethereum";
|
|
44
|
+
readonly 8453: "base";
|
|
45
|
+
readonly 42161: "arbitrum";
|
|
46
|
+
readonly 10: "optimism";
|
|
47
|
+
readonly 137: "polygon";
|
|
48
|
+
readonly 11155111: "sepolia";
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Chain names to IDs mapping for backwards compatibility
|
|
52
|
+
*/
|
|
53
|
+
export declare const CHAIN_IDS: {
|
|
54
|
+
readonly ethereum: 1;
|
|
55
|
+
readonly base: 8453;
|
|
56
|
+
readonly arbitrum: 42161;
|
|
57
|
+
readonly optimism: 10;
|
|
58
|
+
readonly polygon: 137;
|
|
59
|
+
readonly sepolia: 11155111;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* ERC4626 Vault ABI - Essential methods for Morpho vaults
|
|
63
|
+
*/
|
|
64
|
+
export declare const ERC4626_VAULT_ABI: any[];
|
|
65
|
+
/**
|
|
66
|
+
* Morpho Market ABI - Essential methods for supply and withdraw operations
|
|
67
|
+
*/
|
|
68
|
+
export declare const MORPHO_MARKET_ABI: any[];
|
|
69
|
+
/**
|
|
70
|
+
* ERC20 Token ABI - Essential methods only
|
|
71
|
+
*/
|
|
72
|
+
export declare const ERC20_ABI: readonly [{
|
|
73
|
+
readonly inputs: readonly [{
|
|
74
|
+
readonly internalType: "address";
|
|
75
|
+
readonly name: "account";
|
|
76
|
+
readonly type: "address";
|
|
77
|
+
}];
|
|
78
|
+
readonly name: "balanceOf";
|
|
79
|
+
readonly outputs: readonly [{
|
|
80
|
+
readonly internalType: "uint256";
|
|
81
|
+
readonly name: "";
|
|
82
|
+
readonly type: "uint256";
|
|
83
|
+
}];
|
|
84
|
+
readonly stateMutability: "view";
|
|
85
|
+
readonly type: "function";
|
|
86
|
+
}, {
|
|
87
|
+
readonly inputs: readonly [{
|
|
88
|
+
readonly internalType: "address";
|
|
89
|
+
readonly name: "owner";
|
|
90
|
+
readonly type: "address";
|
|
91
|
+
}, {
|
|
92
|
+
readonly internalType: "address";
|
|
93
|
+
readonly name: "spender";
|
|
94
|
+
readonly type: "address";
|
|
95
|
+
}];
|
|
96
|
+
readonly name: "allowance";
|
|
97
|
+
readonly outputs: readonly [{
|
|
98
|
+
readonly internalType: "uint256";
|
|
99
|
+
readonly name: "";
|
|
100
|
+
readonly type: "uint256";
|
|
101
|
+
}];
|
|
102
|
+
readonly stateMutability: "view";
|
|
103
|
+
readonly type: "function";
|
|
104
|
+
}, {
|
|
105
|
+
readonly inputs: readonly [{
|
|
106
|
+
readonly internalType: "address";
|
|
107
|
+
readonly name: "spender";
|
|
108
|
+
readonly type: "address";
|
|
109
|
+
}, {
|
|
110
|
+
readonly internalType: "uint256";
|
|
111
|
+
readonly name: "amount";
|
|
112
|
+
readonly type: "uint256";
|
|
113
|
+
}];
|
|
114
|
+
readonly name: "approve";
|
|
115
|
+
readonly outputs: readonly [{
|
|
116
|
+
readonly internalType: "bool";
|
|
117
|
+
readonly name: "";
|
|
118
|
+
readonly type: "bool";
|
|
119
|
+
}];
|
|
120
|
+
readonly stateMutability: "nonpayable";
|
|
121
|
+
readonly type: "function";
|
|
122
|
+
}, {
|
|
123
|
+
readonly inputs: readonly [];
|
|
124
|
+
readonly name: "decimals";
|
|
125
|
+
readonly outputs: readonly [{
|
|
126
|
+
readonly internalType: "uint8";
|
|
127
|
+
readonly name: "";
|
|
128
|
+
readonly type: "uint8";
|
|
129
|
+
}];
|
|
130
|
+
readonly stateMutability: "view";
|
|
131
|
+
readonly type: "function";
|
|
132
|
+
}];
|
|
133
|
+
/**
|
|
134
|
+
* Supported chain type
|
|
135
|
+
*/
|
|
136
|
+
export type SupportedChainId = keyof typeof WELL_KNOWN_TOKENS;
|
|
137
|
+
export type SupportedChainName = keyof typeof CHAIN_IDS;
|
|
138
|
+
/**
|
|
139
|
+
* Supported token symbols for vault filtering
|
|
140
|
+
*/
|
|
141
|
+
export type TokenSymbol = 'USDC' | 'WETH' | 'USDT';
|
|
142
|
+
/**
|
|
143
|
+
* Supported sorting fields for vault queries
|
|
144
|
+
*/
|
|
145
|
+
export type VaultSortBy = 'netApy' | 'totalAssets' | 'totalAssetsUsd' | 'creationTimestamp';
|
|
146
|
+
/**
|
|
147
|
+
* Sort order options
|
|
148
|
+
*/
|
|
149
|
+
export type SortOrder = 'asc' | 'desc';
|
|
150
|
+
/**
|
|
151
|
+
* Chain identifier (can be chain ID number or chain name string)
|
|
152
|
+
*/
|
|
153
|
+
export type ChainIdentifier = number | string;
|
|
154
|
+
/**
|
|
155
|
+
* Common vault filtering presets for quick searches
|
|
156
|
+
*/
|
|
157
|
+
export type VaultFilterPresets = {
|
|
158
|
+
/** Find high-yield vaults across all chains */
|
|
159
|
+
highYield: VaultFilterOptions;
|
|
160
|
+
/** Find stable, low-risk vaults */
|
|
161
|
+
stable: VaultFilterOptions;
|
|
162
|
+
/** Find vaults with high TVL */
|
|
163
|
+
highTvl: VaultFilterOptions;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Pre-configured filter presets for common use cases
|
|
167
|
+
*/
|
|
168
|
+
export declare const VAULT_FILTER_PRESETS: VaultFilterPresets;
|
|
169
|
+
/**
|
|
170
|
+
* Get well-known token addresses for a specific chain
|
|
171
|
+
*/
|
|
172
|
+
export declare function getTokenAddresses(chainId: number): {
|
|
173
|
+
readonly USDC: "0xA0b86991c6218A36c1D19D4a2e9Eb0cE3606eB48";
|
|
174
|
+
readonly WETH: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
|
|
175
|
+
readonly USDT: "0xdAC17F958D2ee523a2206206994597C13D831ec7";
|
|
176
|
+
} | {
|
|
177
|
+
readonly USDC: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
178
|
+
readonly WETH: "0x4200000000000000000000000000000000000006";
|
|
179
|
+
readonly USDT: "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2";
|
|
180
|
+
} | {
|
|
181
|
+
readonly USDC: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831";
|
|
182
|
+
readonly WETH: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
|
|
183
|
+
readonly USDT: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9";
|
|
184
|
+
} | {
|
|
185
|
+
readonly USDC: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85";
|
|
186
|
+
readonly WETH: "0x4200000000000000000000000000000000000006";
|
|
187
|
+
readonly USDT: "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58";
|
|
188
|
+
} | {
|
|
189
|
+
readonly USDC: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359";
|
|
190
|
+
readonly WETH: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
|
|
191
|
+
readonly USDT: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F";
|
|
192
|
+
} | {
|
|
193
|
+
readonly USDC: "0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8";
|
|
194
|
+
readonly WETH: "0xC558DBdd856501FCd9aaF1E62eae57A9F0629a3c";
|
|
195
|
+
readonly USDT: "0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0";
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Get token address for a specific token symbol and chain
|
|
199
|
+
*/
|
|
200
|
+
export declare function getTokenAddress(symbol: string, chainId: number): string;
|
|
201
|
+
/**
|
|
202
|
+
* Check if a chain is supported by Morpho
|
|
203
|
+
*/
|
|
204
|
+
export declare function isSupportedChain(chainId: number): boolean;
|
|
205
|
+
/**
|
|
206
|
+
* Get all supported chain IDs
|
|
207
|
+
*/
|
|
208
|
+
export declare function getSupportedChainIds(): number[];
|
|
209
|
+
/**
|
|
210
|
+
* Get chain name from chain ID
|
|
211
|
+
*/
|
|
212
|
+
export declare function getChainName(chainId: number): string;
|
|
213
|
+
/**
|
|
214
|
+
* Utility function to validate Ethereum address
|
|
215
|
+
*/
|
|
216
|
+
export declare function isValidAddress(address: string): boolean;
|
|
217
|
+
/**
|
|
218
|
+
* Utility function to parse amount with decimals
|
|
219
|
+
*/
|
|
220
|
+
export declare function parseAmount(amount: string, decimals?: number): string;
|
|
221
|
+
/**
|
|
222
|
+
* Utility function to format amount from wei
|
|
223
|
+
*/
|
|
224
|
+
export declare function formatAmount(amount: string, decimals?: number): string;
|
|
225
|
+
/**
|
|
226
|
+
* Validate operation-specific requirements for Morpho vaults and markets
|
|
227
|
+
*/
|
|
228
|
+
export declare function validateOperationRequirements(operation: MorphoOperation, userBalance: string, allowance: string, vaultShares: string, convertedAmount: string, collateralBalance?: string): Promise<{
|
|
229
|
+
valid: boolean;
|
|
230
|
+
error?: string;
|
|
231
|
+
}>;
|
|
232
|
+
/**
|
|
233
|
+
* Comprehensive Morpho Vault Information
|
|
234
|
+
*
|
|
235
|
+
* Contains all vault details including address, asset info, chain data,
|
|
236
|
+
* performance metrics, and status information.
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* const vaults = await getVaults({ limit: 1 });
|
|
241
|
+
* const vault = vaults[0];
|
|
242
|
+
*
|
|
243
|
+
* console.log(`Vault: ${vault.name}`);
|
|
244
|
+
* console.log(`Asset: ${vault.asset.symbol}`);
|
|
245
|
+
* console.log(`Chain: ${vault.chain.network}`);
|
|
246
|
+
* console.log(`Net APY: ${vault.metrics.netApy}%`);
|
|
247
|
+
* console.log(`TVL: $${vault.metrics.totalAssetsUsd.toLocaleString()}`);
|
|
248
|
+
* ```
|
|
249
|
+
*/
|
|
250
|
+
export interface MorphoVaultInfo {
|
|
251
|
+
/** Vault contract address (0x format) */
|
|
252
|
+
address: string;
|
|
253
|
+
/** Human-readable vault name */
|
|
254
|
+
name: string;
|
|
255
|
+
/** Vault token symbol */
|
|
256
|
+
symbol: string;
|
|
257
|
+
/** Underlying asset information */
|
|
258
|
+
asset: {
|
|
259
|
+
/** Asset contract address */
|
|
260
|
+
address: string;
|
|
261
|
+
/** Asset symbol (e.g., "USDC", "WETH") */
|
|
262
|
+
symbol: string;
|
|
263
|
+
/** Full asset name */
|
|
264
|
+
name: string;
|
|
265
|
+
/** Token decimals */
|
|
266
|
+
decimals: number;
|
|
267
|
+
};
|
|
268
|
+
/** Blockchain information */
|
|
269
|
+
chain: {
|
|
270
|
+
/** Chain ID (1=Ethereum, 8453=Base, etc.) */
|
|
271
|
+
id: number;
|
|
272
|
+
/** Chain name ("ethereum", "base", etc.) */
|
|
273
|
+
network: string;
|
|
274
|
+
};
|
|
275
|
+
/** Performance and financial metrics */
|
|
276
|
+
metrics: {
|
|
277
|
+
/** Gross APY percentage (before fees) */
|
|
278
|
+
apy: number;
|
|
279
|
+
/** Net APY percentage (after fees) - most accurate for users */
|
|
280
|
+
netApy: number;
|
|
281
|
+
/** Total assets in vault (in token units as string) */
|
|
282
|
+
totalAssets: string;
|
|
283
|
+
/** Total Value Locked in USD */
|
|
284
|
+
totalAssetsUsd: number;
|
|
285
|
+
/** Vault fee percentage */
|
|
286
|
+
fee: number;
|
|
287
|
+
/** Additional reward tokens and APRs */
|
|
288
|
+
rewards?: Array<{
|
|
289
|
+
/** Reward token address */
|
|
290
|
+
asset: string;
|
|
291
|
+
/** Supply APR for this reward */
|
|
292
|
+
supplyApr: number;
|
|
293
|
+
/** Yearly supply tokens amount */
|
|
294
|
+
yearlySupplyTokens: string;
|
|
295
|
+
}>;
|
|
296
|
+
};
|
|
297
|
+
/** Whether vault is whitelisted by Morpho */
|
|
298
|
+
whitelisted: boolean;
|
|
299
|
+
/** Vault creation timestamp */
|
|
300
|
+
creationTimestamp: number;
|
|
301
|
+
/** Whether vault has low activity (< $100 TVL) */
|
|
302
|
+
isIdle?: boolean;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Unified Vault Filter Options for the getVaults() function
|
|
306
|
+
*
|
|
307
|
+
* Supports comprehensive filtering by asset, chain, performance metrics, and more.
|
|
308
|
+
* All filters use server-side GraphQL queries for optimal performance.
|
|
309
|
+
*
|
|
310
|
+
* @example
|
|
311
|
+
* ```typescript
|
|
312
|
+
* // Find high-yield USDC vaults on Base
|
|
313
|
+
* const vaults = await getVaults({
|
|
314
|
+
* assetSymbol: "USDC",
|
|
315
|
+
* chainId: 8453,
|
|
316
|
+
* minNetApy: 0.05,
|
|
317
|
+
* sortBy: "netApy",
|
|
318
|
+
* sortOrder: "desc",
|
|
319
|
+
* limit: 10
|
|
320
|
+
* });
|
|
321
|
+
* ```
|
|
322
|
+
*/
|
|
323
|
+
export interface VaultFilterOptions {
|
|
324
|
+
/** Filter by token symbol (e.g., "USDC", "WETH", "USDT") */
|
|
325
|
+
assetSymbol?: TokenSymbol | string;
|
|
326
|
+
/** Filter by specific token contract address */
|
|
327
|
+
assetAddress?: string;
|
|
328
|
+
/** Chain identifier - supports chain name or ID */
|
|
329
|
+
chain?: string | number;
|
|
330
|
+
/** Specific chain ID (1=Ethereum, 8453=Base, 42161=Arbitrum, etc.) */
|
|
331
|
+
chainId?: number;
|
|
332
|
+
/** Minimum Net APY percentage (after fees) */
|
|
333
|
+
minNetApy?: number;
|
|
334
|
+
/** Maximum Net APY percentage (after fees) */
|
|
335
|
+
maxNetApy?: number;
|
|
336
|
+
/** Minimum total assets in vault (in token units) */
|
|
337
|
+
minTotalAssets?: number;
|
|
338
|
+
/** Maximum total assets in vault (in token units) */
|
|
339
|
+
maxTotalAssets?: number;
|
|
340
|
+
/** Minimum Total Value Locked in USD */
|
|
341
|
+
minTvl?: number;
|
|
342
|
+
/** Maximum Total Value Locked in USD */
|
|
343
|
+
maxTvl?: number;
|
|
344
|
+
/** Only include whitelisted vaults */
|
|
345
|
+
whitelistedOnly?: boolean;
|
|
346
|
+
/** Exclude low-activity vaults (< $100 TVL) */
|
|
347
|
+
excludeIdle?: boolean;
|
|
348
|
+
/** Field to sort results by */
|
|
349
|
+
sortBy?: VaultSortBy;
|
|
350
|
+
/** Sort order: ascending or descending */
|
|
351
|
+
sortOrder?: SortOrder;
|
|
352
|
+
/** Maximum number of results to return */
|
|
353
|
+
limit?: number;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Vault Search Options
|
|
357
|
+
*/
|
|
358
|
+
export interface VaultSearchOptions {
|
|
359
|
+
query?: string;
|
|
360
|
+
chains?: Array<string | number>;
|
|
361
|
+
limit?: number;
|
|
362
|
+
offset?: number;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Morpho GraphQL API Client
|
|
366
|
+
*/
|
|
367
|
+
export declare class MorphoVaultClient {
|
|
368
|
+
private readonly apiUrl;
|
|
369
|
+
/**
|
|
370
|
+
* Fetch vault data from Morpho GraphQL API
|
|
371
|
+
*/
|
|
372
|
+
private fetchVaultData;
|
|
373
|
+
/**
|
|
374
|
+
* Get all vaults with comprehensive information
|
|
375
|
+
* Now uses proper server-side filtering via GraphQL VaultFilters
|
|
376
|
+
*/
|
|
377
|
+
getAllVaults(options?: VaultFilterOptions): Promise<MorphoVaultInfo[]>;
|
|
378
|
+
/**
|
|
379
|
+
* Unified function to get vaults with flexible filtering
|
|
380
|
+
* Supports filtering by asset, chain, and all other options
|
|
381
|
+
*/
|
|
382
|
+
getVaults(options?: VaultFilterOptions): Promise<MorphoVaultInfo[]>;
|
|
383
|
+
/**
|
|
384
|
+
* Get top vaults by APY
|
|
385
|
+
*/
|
|
386
|
+
getTopVaultsByNetApy(limit?: number, minTvl?: number): Promise<MorphoVaultInfo[]>;
|
|
387
|
+
/**
|
|
388
|
+
* Get top vaults by TVL
|
|
389
|
+
*/
|
|
390
|
+
getTopVaultsByTvl(limit?: number): Promise<MorphoVaultInfo[]>;
|
|
391
|
+
/**
|
|
392
|
+
* Search vaults by name, symbol, or asset
|
|
393
|
+
*/
|
|
394
|
+
searchVaults(searchOptions: VaultSearchOptions): Promise<MorphoVaultInfo[]>;
|
|
395
|
+
/**
|
|
396
|
+
* Get vault details by address
|
|
397
|
+
*/
|
|
398
|
+
getVaultByAddress(address: string, chainId: number): Promise<MorphoVaultInfo | null>;
|
|
399
|
+
/**
|
|
400
|
+
* Get best vaults for a specific asset
|
|
401
|
+
*/
|
|
402
|
+
getBestVaultsForAsset(assetSymbol: string, limit?: number): Promise<MorphoVaultInfo[]>;
|
|
403
|
+
/**
|
|
404
|
+
* Map vault data from GraphQL response
|
|
405
|
+
*/
|
|
406
|
+
private mapVaultData;
|
|
407
|
+
/**
|
|
408
|
+
* Build GraphQL VaultFilters from filter options
|
|
409
|
+
* Uses proper server-side filtering for better performance
|
|
410
|
+
*/
|
|
411
|
+
private buildVaultFilters;
|
|
412
|
+
/**
|
|
413
|
+
* Apply remaining client-side filters not supported by GraphQL
|
|
414
|
+
* Only handles computed properties like isIdle
|
|
415
|
+
*/
|
|
416
|
+
private applyRemainingClientFilters;
|
|
417
|
+
/**
|
|
418
|
+
* Map sortBy option to GraphQL enum
|
|
419
|
+
*/
|
|
420
|
+
private mapSortBy;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Create a singleton instance of MorphoVaultClient
|
|
424
|
+
*/
|
|
425
|
+
export declare const morphoVaultClient: MorphoVaultClient;
|
|
426
|
+
/**
|
|
427
|
+
* Helper function to get best vaults for a specific asset
|
|
428
|
+
*/
|
|
429
|
+
export declare function getBestVaultsForAsset(assetSymbol: string, limit?: number): Promise<MorphoVaultInfo[]>;
|
|
430
|
+
/**
|
|
431
|
+
* Helper function to get top vaults by APY
|
|
432
|
+
*/
|
|
433
|
+
export declare function getTopVaultsByNetApy(limit?: number, minTvl?: number): Promise<MorphoVaultInfo[]>;
|
|
434
|
+
/**
|
|
435
|
+
* Helper function to get top vaults by TVL
|
|
436
|
+
*/
|
|
437
|
+
export declare function getTopVaultsByTvl(limit?: number): Promise<MorphoVaultInfo[]>;
|
|
438
|
+
/**
|
|
439
|
+
* Helper function to search vaults
|
|
440
|
+
*/
|
|
441
|
+
export declare function searchVaults(query: string, limit?: number): Promise<MorphoVaultInfo[]>;
|
|
442
|
+
/**
|
|
443
|
+
* 🚀 **Quick Vault Search with Presets**
|
|
444
|
+
*
|
|
445
|
+
* Get vaults using pre-configured filter presets for common use cases.
|
|
446
|
+
*
|
|
447
|
+
* @param preset - Pre-configured filter preset
|
|
448
|
+
* @param overrides - Additional options to override preset defaults
|
|
449
|
+
* @returns Promise resolving to array of vault information
|
|
450
|
+
*
|
|
451
|
+
* @example
|
|
452
|
+
* ```typescript
|
|
453
|
+
* // Find high-yield vaults
|
|
454
|
+
* const highYieldVaults = await getVaultsByPreset("highYield");
|
|
455
|
+
*
|
|
456
|
+
* // Find high-yield USDC vaults specifically
|
|
457
|
+
* const usdcHighYield = await getVaultsByPreset("highYield", {
|
|
458
|
+
* assetSymbol: "USDC"
|
|
459
|
+
* });
|
|
460
|
+
*
|
|
461
|
+
* // Find stable vaults on Base chain
|
|
462
|
+
* const stableBaseVaults = await getVaultsByPreset("stable", {
|
|
463
|
+
* chainId: 8453
|
|
464
|
+
* });
|
|
465
|
+
* ```
|
|
466
|
+
*/
|
|
467
|
+
export declare function getVaultsByPreset(preset: keyof VaultFilterPresets, overrides?: Partial<VaultFilterOptions>): Promise<MorphoVaultInfo[]>;
|
|
468
|
+
/**
|
|
469
|
+
* 🔍 **Primary Vault Discovery Function**
|
|
470
|
+
*
|
|
471
|
+
* Get Morpho vaults with comprehensive filtering and sorting options.
|
|
472
|
+
* Uses server-side GraphQL queries for optimal performance.
|
|
473
|
+
*
|
|
474
|
+
* @param options - Vault filtering and sorting options
|
|
475
|
+
* @returns Promise resolving to array of vault information
|
|
476
|
+
*
|
|
477
|
+
* @example
|
|
478
|
+
* ```typescript
|
|
479
|
+
* // Find best USDC vaults across all chains
|
|
480
|
+
* const topVaults = await getVaults({
|
|
481
|
+
* assetSymbol: "USDC",
|
|
482
|
+
* minNetApy: 0.05,
|
|
483
|
+
* minTvl: 1000000,
|
|
484
|
+
* sortBy: "netApy",
|
|
485
|
+
* sortOrder: "desc",
|
|
486
|
+
* limit: 5
|
|
487
|
+
* });
|
|
488
|
+
*
|
|
489
|
+
* // Filter by specific chain
|
|
490
|
+
* const baseVaults = await getVaults({
|
|
491
|
+
* chainId: 8453, // Base
|
|
492
|
+
* excludeIdle: true,
|
|
493
|
+
* sortBy: "totalAssetsUsd"
|
|
494
|
+
* });
|
|
495
|
+
*
|
|
496
|
+
* // Search with multiple criteria
|
|
497
|
+
* const premiumVaults = await getVaults({
|
|
498
|
+
* minNetApy: 10.0,
|
|
499
|
+
* minTvl: 5000000,
|
|
500
|
+
* whitelistedOnly: true,
|
|
501
|
+
* sortBy: "netApy",
|
|
502
|
+
* limit: 3
|
|
503
|
+
* });
|
|
504
|
+
* ```
|
|
505
|
+
*/
|
|
506
|
+
export declare function getVaults(options?: VaultFilterOptions): Promise<MorphoVaultInfo[]>;
|
|
507
|
+
/**
|
|
508
|
+
* Get supported chains with active vaults
|
|
509
|
+
*/
|
|
510
|
+
export declare function getSupportedChainsWithVaults(): Promise<{
|
|
511
|
+
chainId: number;
|
|
512
|
+
name: string;
|
|
513
|
+
vaultCount: number;
|
|
514
|
+
}[]>;
|
|
515
|
+
/**
|
|
516
|
+
* Get vault discovery summary for a chain
|
|
517
|
+
*/
|
|
518
|
+
export declare function getVaultDiscoverySummary(chainId: number): Promise<{
|
|
519
|
+
chainId: number;
|
|
520
|
+
chainName: string;
|
|
521
|
+
totalVaults: number;
|
|
522
|
+
totalTvl: number;
|
|
523
|
+
topVaultsByTvl: MorphoVaultInfo[];
|
|
524
|
+
topVaultsByNetApy: MorphoVaultInfo[];
|
|
525
|
+
assetBreakdown: {
|
|
526
|
+
count: number;
|
|
527
|
+
totalTvl: number;
|
|
528
|
+
maxNetApy: number;
|
|
529
|
+
symbol: string;
|
|
530
|
+
}[];
|
|
531
|
+
}>;
|
|
532
|
+
/**
|
|
533
|
+
* Execute Morpho market operations (supply/withdrawCollateral)
|
|
534
|
+
*/
|
|
535
|
+
export declare function executeMorphoMarketOperation({ provider, pkpPublicKey, marketAddress, marketId, functionName, args, chainId, alchemyGasSponsor, alchemyGasSponsorApiKey, alchemyGasSponsorPolicyId, }: {
|
|
536
|
+
provider?: ethers.providers.JsonRpcProvider;
|
|
537
|
+
pkpPublicKey: string;
|
|
538
|
+
marketAddress: string;
|
|
539
|
+
marketId: string;
|
|
540
|
+
functionName: string;
|
|
541
|
+
args: any[];
|
|
542
|
+
chainId: number;
|
|
543
|
+
alchemyGasSponsor?: boolean;
|
|
544
|
+
alchemyGasSponsorApiKey?: string;
|
|
545
|
+
alchemyGasSponsorPolicyId?: string;
|
|
546
|
+
}): Promise<string>;
|
|
547
|
+
/**
|
|
548
|
+
* Generic function to execute any Morpho Vault operation, with optional gas sponsorship
|
|
549
|
+
*/
|
|
550
|
+
export declare function executeMorphoVaultOperation({ provider, pkpPublicKey, vaultAddress, functionName, args, chainId, alchemyGasSponsor, alchemyGasSponsorApiKey, alchemyGasSponsorPolicyId, }: {
|
|
551
|
+
provider?: ethers.providers.JsonRpcProvider;
|
|
552
|
+
pkpPublicKey: string;
|
|
553
|
+
vaultAddress: string;
|
|
554
|
+
functionName: string;
|
|
555
|
+
args: any[];
|
|
556
|
+
chainId: number;
|
|
557
|
+
alchemyGasSponsor?: boolean;
|
|
558
|
+
alchemyGasSponsorApiKey?: string;
|
|
559
|
+
alchemyGasSponsorPolicyId?: string;
|
|
560
|
+
}): Promise<string>;
|
|
561
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/helpers/index.ts"],"names":[],"mappings":"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"}
|