@suilend/sdk 12.4.1 → 12.5.0

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/client.d.ts CHANGED
@@ -53,6 +53,11 @@ export type ClaimRewardsReward = {
53
53
  export type PatchReserveConfigArgs = Partial<CreateReserveConfigArgs> & {
54
54
  confidenceMultiplierBps?: bigint | TransactionArgument;
55
55
  };
56
+ export type LendingMarketObject = {
57
+ objectId: string;
58
+ type: string;
59
+ content: Uint8Array;
60
+ };
56
61
  export declare class SuilendClient {
57
62
  lendingMarket: LendingMarket<string>;
58
63
  suiGrpcClient: SuiGrpcClient;
@@ -79,6 +84,10 @@ export declare class SuilendClient {
79
84
  id: string;
80
85
  type: string;
81
86
  }[], suiGrpcClient: SuiGrpcClient, logPackageId?: boolean): Promise<SuilendClient[]>;
87
+ static initializeAllFromObjects(lendingMarkets: {
88
+ id: string;
89
+ type: string;
90
+ }[], objects: readonly (LendingMarketObject | Error)[], publishedAt: string, suiGrpcClient: SuiGrpcClient, logPackageId?: boolean): SuilendClient[];
82
91
  static getFeeReceivers(suiGrpcClient: SuiGrpcClient, lendingMarketId: string): Promise<{
83
92
  receivers: string[];
84
93
  weights: string[];
package/client.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { bcs } from "@mysten/sui/bcs";
2
- import { SUI_CLOCK_OBJECT_ID, SUI_SYSTEM_STATE_OBJECT_ID, normalizeStructTag, normalizeSuiObjectId, toHex, } from "@mysten/sui/utils";
2
+ import { SUI_CLOCK_OBJECT_ID, SUI_SYSTEM_STATE_OBJECT_ID, isValidSuiAddress, normalizeStructTag, normalizeSuiObjectId, toHex, } from "@mysten/sui/utils";
3
3
  import { SuiPythClient } from "@pythnetwork/pyth-sui-js";
4
4
  import BigNumber from "bignumber.js";
5
5
  import { extractCTokenCoinType, getAllCoins, getSpendableCoin, } from "@suilend/sui-core";
@@ -237,6 +237,44 @@ async function findBagEntryByTypeSuffix(suiGrpcClient, parentId, typeSuffix) {
237
237
  cursor = response.cursor;
238
238
  }
239
239
  }
240
+ function applyPublishedAt(publishedAt, logPackageId) {
241
+ if (logPackageId)
242
+ console.log("@suilend/sdk | publishedAt:", publishedAt);
243
+ setPublishedAt(publishedAt);
244
+ }
245
+ function clientsFromObjects(lendingMarkets, objects, suiGrpcClient) {
246
+ // Paired by objectId rather than by position: BatchGetObjectsResponse
247
+ // documents no ordering guarantee, and every object here is a
248
+ // LendingMarket, so a type check cannot catch a reordered response — it
249
+ // would silently attach the wrong type arg to a market.
250
+ const objectById = new Map();
251
+ const failures = [];
252
+ for (const object of objects) {
253
+ // The error branch of GetObjectResult carries no objectId, so a failed
254
+ // entry cannot be attributed by id. Rather than fall back to position —
255
+ // which the pairing above deliberately does not trust — failures are
256
+ // identified by which requested ids are missing below.
257
+ if (object instanceof Error)
258
+ failures.push(object);
259
+ else
260
+ objectById.set(normalizeSuiObjectId(object.objectId), object);
261
+ }
262
+ return lendingMarkets.map(({ id, type }) => {
263
+ const object = objectById.get(normalizeSuiObjectId(id));
264
+ if (!object)
265
+ throw new Error(`Failed to fetch lending market ${id}${failures.length > 0 ? `: ${failures[0].message}` : ""}`, failures.length > 0 ? { cause: failures[0] } : undefined);
266
+ // Compares the full parameterized type, not just the struct name: an
267
+ // id/type pair built from two drifted lists would otherwise pass and
268
+ // decode under the wrong phantom type.
269
+ const expectedType = normalizeStructTag(`${PACKAGE_ID}::lending_market::LendingMarket<${type}>`);
270
+ if (normalizeStructTag(object.type) !== expectedType)
271
+ throw new Error(`object at id ${id} is not a LendingMarket<${type}> (got ${object.type})`);
272
+ const lendingMarket = LendingMarket.fromBcs(phantom(type), object.content);
273
+ if (normalizeSuiObjectId(lendingMarket.id) !== normalizeSuiObjectId(id))
274
+ throw new Error(`object at id ${id} decodes to lending market ${lendingMarket.id}`);
275
+ return new SuilendClient(lendingMarket, suiGrpcClient);
276
+ });
277
+ }
240
278
  export class SuilendClient {
241
279
  lendingMarket;
242
280
  suiGrpcClient;
@@ -280,9 +318,7 @@ export class SuilendClient {
280
318
  static async initialize(lendingMarketId, lendingMarketType, suiGrpcClient, logPackageId) {
281
319
  const lendingMarket = await LendingMarket.fetch(suiGrpcClient, phantom(lendingMarketType), lendingMarketId);
282
320
  const publishedAt = await getLatestPackageId(suiGrpcClient, SUILEND_UPGRADE_CAP_ID);
283
- if (logPackageId)
284
- console.log("@suilend/sdk | publishedAt:", publishedAt);
285
- setPublishedAt(publishedAt);
321
+ applyPublishedAt(publishedAt, logPackageId);
286
322
  return new SuilendClient(lendingMarket, suiGrpcClient);
287
323
  }
288
324
  /**
@@ -293,44 +329,29 @@ export class SuilendClient {
293
329
  // Refreshed even for an empty list, so PUBLISHED_AT parity with
294
330
  // initialize() holds for every call — move-call targets are built off that
295
331
  // module global regardless of how many clients came back.
296
- const publishedAt = await getLatestPackageId(suiGrpcClient, SUILEND_UPGRADE_CAP_ID);
297
- if (logPackageId)
298
- console.log("@suilend/sdk | publishedAt:", publishedAt);
299
- setPublishedAt(publishedAt);
300
- if (lendingMarkets.length === 0)
301
- return [];
302
- const { objects } = await suiGrpcClient.getObjects({
303
- objectIds: lendingMarkets.map((lendingMarket) => lendingMarket.id),
304
- include: { content: true },
305
- });
306
- // Paired by objectId rather than by position: BatchGetObjectsResponse
307
- // documents no ordering guarantee, and every object here is a
308
- // LendingMarket, so a type check cannot catch a reordered response — it
309
- // would silently attach the wrong type arg to a market.
310
- const objectById = new Map();
311
- const failures = [];
312
- for (const object of objects) {
313
- // The error branch of GetObjectResult carries no objectId, so a failed
314
- // entry cannot be attributed by id. Rather than fall back to position —
315
- // which the pairing above deliberately does not trust — failures are
316
- // identified by which requested ids are missing below.
317
- if (object instanceof Error)
318
- failures.push(object);
319
- else
320
- objectById.set(normalizeSuiObjectId(object.objectId), object);
321
- }
322
- return lendingMarkets.map(({ id, type }) => {
323
- const object = objectById.get(normalizeSuiObjectId(id));
324
- if (!object)
325
- throw new Error(`Failed to fetch lending market ${id}${failures.length > 0 ? `: ${failures[0].message}` : ""}`, failures.length > 0 ? { cause: failures[0] } : undefined);
326
- // Compares the full parameterized type, not just the struct name: an
327
- // id/type pair built from two drifted lists would otherwise pass and
328
- // decode under the wrong phantom type.
329
- const expectedType = normalizeStructTag(`${PACKAGE_ID}::lending_market::LendingMarket<${type}>`);
330
- if (normalizeStructTag(object.type) !== expectedType)
331
- throw new Error(`object at id ${id} is not a LendingMarket<${type}> (got ${object.type})`);
332
- return new SuilendClient(LendingMarket.fromBcs(phantom(type), object.content), suiGrpcClient);
333
- });
332
+ const [packageId, objects] = await Promise.allSettled([
333
+ getLatestPackageId(suiGrpcClient, SUILEND_UPGRADE_CAP_ID).then((publishedAt) => applyPublishedAt(publishedAt, logPackageId)),
334
+ lendingMarkets.length === 0
335
+ ? []
336
+ : suiGrpcClient
337
+ .getObjects({
338
+ objectIds: lendingMarkets.map((lendingMarket) => lendingMarket.id),
339
+ include: { content: true },
340
+ })
341
+ .then((response) => response.objects),
342
+ ]);
343
+ if (packageId.status === "rejected")
344
+ throw packageId.reason;
345
+ if (objects.status === "rejected")
346
+ throw objects.reason;
347
+ return clientsFromObjects(lendingMarkets, objects.value, suiGrpcClient);
348
+ }
349
+ static initializeAllFromObjects(lendingMarkets, objects, publishedAt, suiGrpcClient, logPackageId) {
350
+ if (!isValidSuiAddress(publishedAt))
351
+ throw new Error(`publishedAt ${publishedAt} is not a Sui package id`);
352
+ const clients = clientsFromObjects(lendingMarkets, objects, suiGrpcClient);
353
+ applyPublishedAt(publishedAt, logPackageId);
354
+ return clients;
334
355
  }
335
356
  static async getFeeReceivers(suiGrpcClient, lendingMarketId) {
336
357
  const json = await fetchDynamicFieldJson(suiGrpcClient, lendingMarketId, `${PKG_V10}::lending_market::FeeReceiversKey`);
@@ -59,8 +59,8 @@ export declare const refreshReservesForInitialize: (reserves: Reserve<string>[],
59
59
  * inline in it cannot be tested, and "is this price real" is not something to
60
60
  * leave unverified.
61
61
  */
62
- export declare const priceTemporaryPythFeedReserves: (reserves: Reserve<string>[], fetchPrices?: (coinTypes: string[]) => Promise<Record<string, number | undefined>>) => Promise<string[]>;
63
- export declare const priceTemporaryPythFeedReservesAll: (reservesByMarket: Reserve<string>[][], fetchPrices?: (coinTypes: string[]) => Promise<Record<string, number | undefined>>) => Promise<string[][]>;
62
+ export declare const priceTemporaryPythFeedReserves: (reserves: Reserve<string>[], fetchPrices?: FetchPrices) => Promise<string[]>;
63
+ export declare const priceTemporaryPythFeedReservesAll: (reservesByMarket: Reserve<string>[][], fetchPrices?: FetchPrices) => Promise<string[][]>;
64
64
  export type InitializeSuilendOptions = {
65
65
  /**
66
66
  * Price connection to use instead of the one this function would build.
@@ -141,11 +141,273 @@ export type InitializeSuilendOptions = {
141
141
  * prices them at literal zero.
142
142
  */
143
143
  tolerateMissingPriceFeeds?: boolean;
144
+ fetchPrices?: FetchPrices;
144
145
  };
145
- export declare const initializeSuilendAll: (suiGrpcClient: SuiGrpcClient, markets: {
146
+ export type FetchPrices = (coinTypes: string[]) => Promise<Record<string, number | undefined>>;
147
+ type InitializeSuilendMarket = {
146
148
  suilendClient: SuilendClient;
147
149
  lendingMarketMetadata?: LendingMarketMetadata;
148
- }[], fallbackPythEndpoint?: string, options?: InitializeSuilendOptions) => Promise<{
150
+ };
151
+ export declare const initializeSuilendAll: (suiGrpcClient: SuiGrpcClient, markets: InitializeSuilendMarket[], fallbackPythEndpoint?: string, options?: InitializeSuilendOptions) => Promise<{
152
+ lendingMarket: {
153
+ version: bigint;
154
+ reserves: {
155
+ config: {
156
+ $typeName: string;
157
+ openLtvPct: number;
158
+ closeLtvPct: number;
159
+ maxCloseLtvPct: number;
160
+ borrowWeightBps: BigNumber;
161
+ depositLimit: BigNumber;
162
+ borrowLimit: BigNumber;
163
+ liquidationBonusBps: number;
164
+ maxLiquidationBonusBps: number;
165
+ depositLimitUsd: BigNumber;
166
+ borrowLimitUsd: BigNumber;
167
+ borrowFeeBps: number;
168
+ spreadFeeBps: number;
169
+ protocolLiquidationFeeBps: number;
170
+ isolated: boolean;
171
+ openAttributedBorrowLimitUsd: number;
172
+ closeAttributedBorrowLimitUsd: number;
173
+ additionalFields: import("../_generated/_dependencies/source/0x2/bag/structs").Bag;
174
+ interestRate: {
175
+ id: string;
176
+ utilPercent: BigNumber;
177
+ aprPercent: BigNumber;
178
+ }[];
179
+ };
180
+ $typeName: string;
181
+ id: string;
182
+ arrayIndex: bigint;
183
+ coinType: string;
184
+ mintDecimals: number;
185
+ priceIdentifier: string;
186
+ price: BigNumber;
187
+ smoothedPrice: BigNumber;
188
+ minPrice: BigNumber;
189
+ maxPrice: BigNumber;
190
+ priceLastUpdateTimestampS: bigint;
191
+ availableAmount: BigNumber;
192
+ ctokenSupply: BigNumber;
193
+ borrowedAmount: BigNumber;
194
+ cumulativeBorrowRate: BigNumber;
195
+ interestLastUpdateTimestampS: bigint;
196
+ unclaimedSpreadFees: BigNumber;
197
+ attributedBorrowValue: BigNumber;
198
+ depositsPoolRewardManager: {
199
+ $typeName: string;
200
+ id: string;
201
+ totalShares: bigint;
202
+ poolRewards: {
203
+ $typeName: string;
204
+ id: string;
205
+ poolRewardManagerId: string;
206
+ coinType: string;
207
+ startTimeMs: number;
208
+ endTimeMs: number;
209
+ totalRewards: BigNumber;
210
+ allocatedRewards: BigNumber;
211
+ cumulativeRewardsPerShare: BigNumber;
212
+ numUserRewardManagers: bigint;
213
+ rewardIndex: number;
214
+ symbol: string;
215
+ mintDecimals: number;
216
+ }[];
217
+ lastUpdateTimeMs: bigint;
218
+ };
219
+ borrowsPoolRewardManager: {
220
+ $typeName: string;
221
+ id: string;
222
+ totalShares: bigint;
223
+ poolRewards: {
224
+ $typeName: string;
225
+ id: string;
226
+ poolRewardManagerId: string;
227
+ coinType: string;
228
+ startTimeMs: number;
229
+ endTimeMs: number;
230
+ totalRewards: BigNumber;
231
+ allocatedRewards: BigNumber;
232
+ cumulativeRewardsPerShare: BigNumber;
233
+ numUserRewardManagers: bigint;
234
+ rewardIndex: number;
235
+ symbol: string;
236
+ mintDecimals: number;
237
+ }[];
238
+ lastUpdateTimeMs: bigint;
239
+ };
240
+ availableAmountUsd: BigNumber;
241
+ borrowedAmountUsd: BigNumber;
242
+ depositedAmount: BigNumber;
243
+ depositedAmountUsd: BigNumber;
244
+ cTokenExchangeRate: BigNumber;
245
+ borrowAprPercent: BigNumber;
246
+ depositAprPercent: BigNumber;
247
+ utilizationPercent: BigNumber;
248
+ token: {
249
+ id: string | null;
250
+ decimals: number;
251
+ name: string;
252
+ symbol: string;
253
+ description: string;
254
+ iconUrl: string | null;
255
+ coinType: string;
256
+ };
257
+ symbol: string;
258
+ name: string;
259
+ iconUrl: string | null;
260
+ description: string;
261
+ totalDeposits: BigNumber;
262
+ }[];
263
+ obligations: import("../_generated/_dependencies/source/0x2/object-table/structs").ObjectTable<"0x2::object::ID", `0x1f54a9a2d71799553197e9ea24557797c6398d6a65f2d4d3818c9304b75d5e21::obligation::Obligation<${string}>` | `0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::obligation::Obligation<${string}>`>;
264
+ rateLimiter: {
265
+ config: {
266
+ windowDuration: bigint;
267
+ maxOutflow: bigint;
268
+ };
269
+ $typeName: string;
270
+ prevQty: bigint;
271
+ windowStart: bigint;
272
+ curQty: bigint;
273
+ remainingOutflow: BigNumber;
274
+ };
275
+ feeReceiver: string;
276
+ badDebtUsd: BigNumber;
277
+ badDebtLimitUsd: BigNumber;
278
+ depositedAmountUsd: BigNumber;
279
+ borrowedAmountUsd: BigNumber;
280
+ tvlUsd: BigNumber;
281
+ id: string;
282
+ type: string;
283
+ ownerCapId: string | undefined;
284
+ name: string;
285
+ isHidden: boolean;
286
+ iconUrl: string | null;
287
+ description: string | null;
288
+ totalSupplyUsd: BigNumber;
289
+ totalBorrowUsd: BigNumber;
290
+ };
291
+ coinMetadataMap: Record<string, import("@suilend/sui-core").Token>;
292
+ refreshedRawReserves: Reserve<string>[];
293
+ unpricedCoinTypes: string[];
294
+ reserveMap: Record<string, {
295
+ config: {
296
+ $typeName: string;
297
+ openLtvPct: number;
298
+ closeLtvPct: number;
299
+ maxCloseLtvPct: number;
300
+ borrowWeightBps: BigNumber;
301
+ depositLimit: BigNumber;
302
+ borrowLimit: BigNumber;
303
+ liquidationBonusBps: number;
304
+ maxLiquidationBonusBps: number;
305
+ depositLimitUsd: BigNumber;
306
+ borrowLimitUsd: BigNumber;
307
+ borrowFeeBps: number;
308
+ spreadFeeBps: number;
309
+ protocolLiquidationFeeBps: number;
310
+ isolated: boolean;
311
+ openAttributedBorrowLimitUsd: number;
312
+ closeAttributedBorrowLimitUsd: number;
313
+ additionalFields: import("../_generated/_dependencies/source/0x2/bag/structs").Bag;
314
+ interestRate: {
315
+ id: string;
316
+ utilPercent: BigNumber;
317
+ aprPercent: BigNumber;
318
+ }[];
319
+ };
320
+ $typeName: string;
321
+ id: string;
322
+ arrayIndex: bigint;
323
+ coinType: string;
324
+ mintDecimals: number;
325
+ priceIdentifier: string;
326
+ price: BigNumber;
327
+ smoothedPrice: BigNumber;
328
+ minPrice: BigNumber;
329
+ maxPrice: BigNumber;
330
+ priceLastUpdateTimestampS: bigint;
331
+ availableAmount: BigNumber;
332
+ ctokenSupply: BigNumber;
333
+ borrowedAmount: BigNumber;
334
+ cumulativeBorrowRate: BigNumber;
335
+ interestLastUpdateTimestampS: bigint;
336
+ unclaimedSpreadFees: BigNumber;
337
+ attributedBorrowValue: BigNumber;
338
+ depositsPoolRewardManager: {
339
+ $typeName: string;
340
+ id: string;
341
+ totalShares: bigint;
342
+ poolRewards: {
343
+ $typeName: string;
344
+ id: string;
345
+ poolRewardManagerId: string;
346
+ coinType: string;
347
+ startTimeMs: number;
348
+ endTimeMs: number;
349
+ totalRewards: BigNumber;
350
+ allocatedRewards: BigNumber;
351
+ cumulativeRewardsPerShare: BigNumber;
352
+ numUserRewardManagers: bigint;
353
+ rewardIndex: number;
354
+ symbol: string;
355
+ mintDecimals: number;
356
+ }[];
357
+ lastUpdateTimeMs: bigint;
358
+ };
359
+ borrowsPoolRewardManager: {
360
+ $typeName: string;
361
+ id: string;
362
+ totalShares: bigint;
363
+ poolRewards: {
364
+ $typeName: string;
365
+ id: string;
366
+ poolRewardManagerId: string;
367
+ coinType: string;
368
+ startTimeMs: number;
369
+ endTimeMs: number;
370
+ totalRewards: BigNumber;
371
+ allocatedRewards: BigNumber;
372
+ cumulativeRewardsPerShare: BigNumber;
373
+ numUserRewardManagers: bigint;
374
+ rewardIndex: number;
375
+ symbol: string;
376
+ mintDecimals: number;
377
+ }[];
378
+ lastUpdateTimeMs: bigint;
379
+ };
380
+ availableAmountUsd: BigNumber;
381
+ borrowedAmountUsd: BigNumber;
382
+ depositedAmount: BigNumber;
383
+ depositedAmountUsd: BigNumber;
384
+ cTokenExchangeRate: BigNumber;
385
+ borrowAprPercent: BigNumber;
386
+ depositAprPercent: BigNumber;
387
+ utilizationPercent: BigNumber;
388
+ token: {
389
+ id: string | null;
390
+ decimals: number;
391
+ name: string;
392
+ symbol: string;
393
+ description: string;
394
+ iconUrl: string | null;
395
+ coinType: string;
396
+ };
397
+ symbol: string;
398
+ name: string;
399
+ iconUrl: string | null;
400
+ description: string;
401
+ totalDeposits: BigNumber;
402
+ }>;
403
+ reserveCoinTypes: string[];
404
+ reserveCoinMetadataMap: Record<string, import("@suilend/sui-core").Token>;
405
+ rewardCoinTypes: string[];
406
+ activeRewardCoinTypes: string[];
407
+ rewardCoinMetadataMap: Record<string, import("@suilend/sui-core").Token>;
408
+ }[]>;
409
+ export declare const initializeSuilendWithRewardsAll: (suiGrpcClient: SuiGrpcClient, markets: InitializeSuilendMarket[], fallbackPythEndpoint?: string, options?: InitializeSuilendOptions) => Promise<{
410
+ rewardPriceMap: Record<string, BigNumber | undefined>;
149
411
  lendingMarket: {
150
412
  version: bigint;
151
413
  reserves: {
@@ -664,10 +926,10 @@ export declare const initializeSuilend: (suiGrpcClient: SuiGrpcClient, suilendCl
664
926
  export declare const initializeSuilendRewardsAll: (markets: {
665
927
  reserveMap: Record<string, ParsedReserve>;
666
928
  activeRewardCoinTypes: string[];
667
- }[], fetchPrices?: (coinTypes: string[]) => Promise<Record<string, number | undefined>>) => Promise<{
929
+ }[], fetchPrices?: FetchPrices) => Promise<{
668
930
  rewardPriceMap: Record<string, BigNumber | undefined>;
669
931
  }[]>;
670
- export declare const initializeSuilendRewards: (reserveMap: Record<string, ParsedReserve>, activeRewardCoinTypes: string[], fetchPrices?: (coinTypes: string[]) => Promise<Record<string, number | undefined>>) => Promise<{
932
+ export declare const initializeSuilendRewards: (reserveMap: Record<string, ParsedReserve>, activeRewardCoinTypes: string[], fetchPrices?: FetchPrices) => Promise<{
671
933
  rewardPriceMap: Record<string, BigNumber | undefined>;
672
934
  }>;
673
935
  export declare const initializeObligations: (suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, refreshedRawReserves: Reserve<string>[], reserveMap: Record<string, ParsedReserve>, address?: string) => Promise<{
@@ -1192,3 +1454,4 @@ export declare const initializeObligations: (suiGrpcClient: SuiGrpcClient, suile
1192
1454
  minPriceBorrowLimit: BigNumber;
1193
1455
  }[];
1194
1456
  }>;
1457
+ export {};
package/lib/initialize.js CHANGED
@@ -243,9 +243,58 @@ export const priceTemporaryPythFeedReservesAll = async (reservesByMarket, fetchP
243
243
  const fabricatedPriceCoinTypes = new Set(await priceTemporaryPythFeedReserves(reservesByMarket.flat(), fetchPrices));
244
244
  return reservesByMarket.map((reserves) => Array.from(new Set(reserves.map((reserve) => normalizeStructTag(reserve.coinType.name)))).filter((coinType) => fabricatedPriceCoinTypes.has(coinType)));
245
245
  };
246
- export const initializeSuilendAll = async (suiGrpcClient, markets, fallbackPythEndpoint, options) => {
246
+ const marketCoinTypes = (reserves, nowMs) => {
247
+ const miscCoinTypes = [
248
+ NORMALIZED_SEND_POINTS_S1_COINTYPE,
249
+ NORMALIZED_SEND_POINTS_S2_COINTYPE,
250
+ NORMALIZED_SEND_COINTYPE,
251
+ ];
252
+ const reserveCoinTypes = [];
253
+ const rewardCoinTypes = [];
254
+ const activeRewardCoinTypes = [];
255
+ reserves.forEach((r) => {
256
+ reserveCoinTypes.push(normalizeStructTag(r.coinType.name));
257
+ [
258
+ ...r.depositsPoolRewardManager.poolRewards,
259
+ ...r.borrowsPoolRewardManager.poolRewards,
260
+ ].forEach((pr) => {
261
+ if (!pr)
262
+ return;
263
+ const isActive = nowMs >= Number(pr.startTimeMs) && nowMs < Number(pr.endTimeMs);
264
+ rewardCoinTypes.push(normalizeStructTag(pr.coinType.name));
265
+ if (isActive)
266
+ activeRewardCoinTypes.push(normalizeStructTag(pr.coinType.name));
267
+ });
268
+ });
269
+ return {
270
+ uniqueMiscCoinTypes: Array.from(new Set(miscCoinTypes)),
271
+ uniqueReserveCoinTypes: Array.from(new Set(reserveCoinTypes)),
272
+ uniqueRewardCoinTypes: Array.from(new Set(rewardCoinTypes)),
273
+ uniqueActiveRewardsCoinTypes: Array.from(new Set(activeRewardCoinTypes)),
274
+ };
275
+ };
276
+ const isUnpricedRewardCoinType = (coinType) => isSendPoints(coinType) ||
277
+ isSteammPoints(coinType) ||
278
+ coinType === NORMALIZED_MAYA_COINTYPE ||
279
+ coinType === NORMALIZED_mPOINTS_COINTYPE;
280
+ const seedRewardPriceMap = (reserveMap) => {
281
+ const rewardPriceMap = Object.entries(reserveMap).reduce((acc, [coinType, reserve]) => ({ ...acc, [coinType]: reserve.price }), {});
282
+ rewardPriceMap[NORMALIZED_TREATS_COINTYPE] = new BigNumber(0.1);
283
+ return rewardPriceMap;
284
+ };
285
+ const fillRewardPriceMap = (rewardPriceMap, reservelessActiveRewardCoinTypes, cachedUsdPrices) => {
286
+ for (const coinType of reservelessActiveRewardCoinTypes) {
287
+ const cachedUsdPrice = cachedUsdPrices[coinType];
288
+ if (cachedUsdPrice === undefined)
289
+ continue;
290
+ rewardPriceMap[coinType] = new BigNumber(cachedUsdPrice);
291
+ }
292
+ return rewardPriceMap;
293
+ };
294
+ const initializeSuilendMarkets = async (markets, fallbackPythEndpoint, options, includeRewards) => {
247
295
  const nowMs = Date.now();
248
296
  const nowS = Math.floor(nowMs / 1000);
297
+ const fetchPrices = options?.fetchPrices ?? getPrices;
249
298
  const reservesByMarket = markets.map(({ suilendClient }) => {
250
299
  const withoutTemporaryPythPriceFeeds = [];
251
300
  const withTemporaryPythPriceFeeds = [];
@@ -260,10 +309,26 @@ export const initializeSuilendAll = async (suiGrpcClient, markets, fallbackPythE
260
309
  }
261
310
  return { withoutTemporaryPythPriceFeeds, withTemporaryPythPriceFeeds };
262
311
  });
263
- const pythConnection = await resolvePythConnection(options?.pythConnection, fallbackPythEndpoint, options?.pythConnectionConfig);
264
- const [refreshedWithoutTemporaryByMarket, fabricatedPriceCoinTypesByMarket] = await Promise.all([
265
- refreshReservesForInitializeAll(reservesByMarket.map((r) => r.withoutTemporaryPythPriceFeeds), pythConnection, options?.tolerateMissingPriceFeeds),
266
- priceTemporaryPythFeedReservesAll(reservesByMarket.map((r) => r.withTemporaryPythPriceFeeds)),
312
+ const coinTypesByMarket = reservesByMarket.map(({ withoutTemporaryPythPriceFeeds, withTemporaryPythPriceFeeds }) => marketCoinTypes([...withoutTemporaryPythPriceFeeds, ...withTemporaryPythPriceFeeds], nowMs));
313
+ const reservelessActiveRewardCoinTypesByMarket = coinTypesByMarket.map(({ uniqueReserveCoinTypes, uniqueActiveRewardsCoinTypes }) => uniqueActiveRewardsCoinTypes.filter((coinType) => !isUnpricedRewardCoinType(coinType) &&
314
+ coinType !== NORMALIZED_TREATS_COINTYPE &&
315
+ !uniqueReserveCoinTypes.includes(coinType)));
316
+ const [[refreshedWithoutTemporaryByMarket, fabricatedPriceCoinTypesByMarket], coinMetadataByMarket, rewardUsdPrices,] = await Promise.all([
317
+ Promise.all([
318
+ resolvePythConnection(options?.pythConnection, fallbackPythEndpoint, options?.pythConnectionConfig).then((pythConnection) => refreshReservesForInitializeAll(reservesByMarket.map((r) => r.withoutTemporaryPythPriceFeeds), pythConnection, options?.tolerateMissingPriceFeeds)),
319
+ priceTemporaryPythFeedReservesAll(reservesByMarket.map((r) => r.withTemporaryPythPriceFeeds), fetchPrices),
320
+ ]),
321
+ resolveCoinMetadataForInitializeAll(coinTypesByMarket.map(({ uniqueMiscCoinTypes, uniqueReserveCoinTypes, uniqueRewardCoinTypes, }) => ({
322
+ miscCoinTypes: uniqueMiscCoinTypes,
323
+ reserveCoinTypes: uniqueReserveCoinTypes,
324
+ rewardCoinTypes: uniqueRewardCoinTypes,
325
+ }))),
326
+ includeRewards
327
+ ? fetchPrices(Array.from(new Set(reservelessActiveRewardCoinTypesByMarket.flat()))).catch((err) => {
328
+ console.error(err);
329
+ return {};
330
+ })
331
+ : Promise.resolve({}),
267
332
  ]);
268
333
  const prepared = markets.map(({ suilendClient, lendingMarketMetadata }, index) => {
269
334
  const refreshedRawReserves = [
@@ -289,49 +354,15 @@ export const initializeSuilendAll = async (suiGrpcClient, markets, fallbackPythE
289
354
  ...refreshedWithoutTemporaryByMarket[index].unpricedCoinTypes,
290
355
  ...fabricatedPriceCoinTypesByMarket[index],
291
356
  ];
292
- const miscCoinTypes = [
293
- NORMALIZED_SEND_POINTS_S1_COINTYPE,
294
- NORMALIZED_SEND_POINTS_S2_COINTYPE,
295
- NORMALIZED_SEND_COINTYPE,
296
- ];
297
- const reserveCoinTypes = [];
298
- const rewardCoinTypes = [];
299
- const activeRewardCoinTypes = [];
300
- refreshedRawReserves.forEach((r) => {
301
- reserveCoinTypes.push(normalizeStructTag(r.coinType.name));
302
- [
303
- ...r.depositsPoolRewardManager.poolRewards,
304
- ...r.borrowsPoolRewardManager.poolRewards,
305
- ].forEach((pr) => {
306
- if (!pr)
307
- return;
308
- const isActive = nowMs >= Number(pr.startTimeMs) && nowMs < Number(pr.endTimeMs);
309
- rewardCoinTypes.push(normalizeStructTag(pr.coinType.name));
310
- if (isActive)
311
- activeRewardCoinTypes.push(normalizeStructTag(pr.coinType.name));
312
- });
313
- });
314
- const uniqueMiscCoinTypes = Array.from(new Set(miscCoinTypes));
315
- const uniqueReserveCoinTypes = Array.from(new Set(reserveCoinTypes));
316
- const uniqueRewardCoinTypes = Array.from(new Set(rewardCoinTypes));
317
- const uniqueActiveRewardsCoinTypes = Array.from(new Set(activeRewardCoinTypes));
318
357
  return {
319
358
  suilendClient,
320
359
  lendingMarketMetadata,
321
360
  refreshedRawReserves,
322
361
  unpricedCoinTypes,
323
- uniqueMiscCoinTypes,
324
- uniqueReserveCoinTypes,
325
- uniqueRewardCoinTypes,
326
- uniqueActiveRewardsCoinTypes,
362
+ ...coinTypesByMarket[index],
327
363
  };
328
364
  });
329
- const coinMetadataByMarket = await resolveCoinMetadataForInitializeAll(prepared.map(({ uniqueMiscCoinTypes, uniqueReserveCoinTypes, uniqueRewardCoinTypes, }) => ({
330
- miscCoinTypes: uniqueMiscCoinTypes,
331
- reserveCoinTypes: uniqueReserveCoinTypes,
332
- rewardCoinTypes: uniqueRewardCoinTypes,
333
- })));
334
- return prepared.map(({ suilendClient, lendingMarketMetadata, refreshedRawReserves, unpricedCoinTypes, uniqueReserveCoinTypes, uniqueRewardCoinTypes, uniqueActiveRewardsCoinTypes, }, index) => {
365
+ const initialized = prepared.map(({ suilendClient, lendingMarketMetadata, refreshedRawReserves, unpricedCoinTypes, uniqueReserveCoinTypes, uniqueRewardCoinTypes, uniqueActiveRewardsCoinTypes, }, index) => {
335
366
  const { coinMetadataMap, reserveCoinMetadataMap, rewardCoinMetadataMap } = coinMetadataByMarket[index];
336
367
  // const walReserve = refreshedRawReserves.find(
337
368
  // (r) => normalizeStructTag(r.coinType.name) === NORMALIZED_WAL_COINTYPE,
@@ -362,6 +393,21 @@ export const initializeSuilendAll = async (suiGrpcClient, markets, fallbackPythE
362
393
  rewardCoinMetadataMap,
363
394
  };
364
395
  });
396
+ const rewardPriceMaps = includeRewards
397
+ ? initialized.map(({ reserveMap }, index) => fillRewardPriceMap(seedRewardPriceMap(reserveMap), reservelessActiveRewardCoinTypesByMarket[index], rewardUsdPrices))
398
+ : [];
399
+ return { initialized, rewardPriceMaps };
400
+ };
401
+ export const initializeSuilendAll = async (suiGrpcClient, markets, fallbackPythEndpoint, options) => {
402
+ const { initialized } = await initializeSuilendMarkets(markets, fallbackPythEndpoint, options, false);
403
+ return initialized;
404
+ };
405
+ export const initializeSuilendWithRewardsAll = async (suiGrpcClient, markets, fallbackPythEndpoint, options) => {
406
+ const { initialized, rewardPriceMaps } = await initializeSuilendMarkets(markets, fallbackPythEndpoint, options, true);
407
+ return initialized.map((market, index) => ({
408
+ ...market,
409
+ rewardPriceMap: rewardPriceMaps[index],
410
+ }));
365
411
  };
366
412
  export const initializeSuilend = async (suiGrpcClient, suilendClient, lendingMarketMetadata, fallbackPythEndpoint, options) => {
367
413
  const [initialized] = await initializeSuilendAll(suiGrpcClient, [{ suilendClient, lendingMarketMetadata }], fallbackPythEndpoint, options);
@@ -369,24 +415,14 @@ export const initializeSuilend = async (suiGrpcClient, suilendClient, lendingMar
369
415
  };
370
416
  export const initializeSuilendRewardsAll = async (markets, fetchPrices = getPrices) => {
371
417
  const seeded = markets.map(({ reserveMap, activeRewardCoinTypes }) => {
372
- const rewardPriceMap = Object.entries(reserveMap).reduce((acc, [coinType, reserve]) => ({ ...acc, [coinType]: reserve.price }), {});
373
- rewardPriceMap[NORMALIZED_TREATS_COINTYPE] = new BigNumber(0.1);
374
- const reservelessActiveRewardCoinTypes = activeRewardCoinTypes.filter((coinType) => !(isSendPoints(coinType) ||
375
- isSteammPoints(coinType) ||
376
- coinType === NORMALIZED_MAYA_COINTYPE ||
377
- coinType === NORMALIZED_mPOINTS_COINTYPE) && !rewardPriceMap[coinType]);
418
+ const rewardPriceMap = seedRewardPriceMap(reserveMap);
419
+ const reservelessActiveRewardCoinTypes = activeRewardCoinTypes.filter((coinType) => !isUnpricedRewardCoinType(coinType) && !rewardPriceMap[coinType]);
378
420
  return { rewardPriceMap, reservelessActiveRewardCoinTypes };
379
421
  });
380
422
  const cachedUsdPrices = await fetchPrices(Array.from(new Set(seeded.flatMap((m) => m.reservelessActiveRewardCoinTypes))));
381
- return seeded.map(({ rewardPriceMap, reservelessActiveRewardCoinTypes }) => {
382
- for (const coinType of reservelessActiveRewardCoinTypes) {
383
- const cachedUsdPrice = cachedUsdPrices[coinType];
384
- if (cachedUsdPrice === undefined)
385
- continue;
386
- rewardPriceMap[coinType] = new BigNumber(cachedUsdPrice);
387
- }
388
- return { rewardPriceMap };
389
- });
423
+ return seeded.map(({ rewardPriceMap, reservelessActiveRewardCoinTypes }) => ({
424
+ rewardPriceMap: fillRewardPriceMap(rewardPriceMap, reservelessActiveRewardCoinTypes, cachedUsdPrices),
425
+ }));
390
426
  };
391
427
  export const initializeSuilendRewards = async (reserveMap, activeRewardCoinTypes, fetchPrices = getPrices) => {
392
428
  const [rewards] = await initializeSuilendRewardsAll([{ reserveMap, activeRewardCoinTypes }], fetchPrices);
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@suilend/sdk","version":"12.4.1","private":false,"description":"A TypeScript SDK for interacting with the Suilend program","author":"Suilend","license":"MIT","main":"./index.js","exports":{".":"./index.js","./client":"./client.js","./mmt":"./mmt.js","./strategies":"./strategies.js","./api/events":"./api/events.js","./api":"./api/index.js","./lib/constants":"./lib/constants.js","./lib":"./lib/index.js","./lib/initialize":"./lib/initialize.js","./lib/liquidityMining":"./lib/liquidityMining.js","./lib/proCompatible":"./lib/proCompatible.js","./lib/pyth":"./lib/pyth.js","./lib/strategyOwnerCap":"./lib/strategyOwnerCap.js","./lib/transactions":"./lib/transactions.js","./lib/types":"./lib/types.js","./margin":"./margin/index.js","./parsers/apiReserveAssetDataEvent":"./parsers/apiReserveAssetDataEvent.js","./parsers":"./parsers/index.js","./parsers/lendingMarket":"./parsers/lendingMarket.js","./parsers/obligation":"./parsers/obligation.js","./parsers/rateLimiter":"./parsers/rateLimiter.js","./parsers/reserve":"./parsers/reserve.js","./swap":"./swap/index.js","./swap/quote":"./swap/quote.js","./swap/transaction":"./swap/transaction.js","./utils/events":"./utils/events.js","./utils/feedId":"./utils/feedId.js","./utils":"./utils/index.js","./utils/obligation":"./utils/obligation.js","./utils/simulate":"./utils/simulate.js","./_generated/_framework/reified":"./_generated/_framework/reified.js","./_generated/_framework/util":"./_generated/_framework/util.js","./_generated/_framework/vector":"./_generated/_framework/vector.js","./_generated/suilend":"./_generated/suilend/index.js","./margin/margin/admin_cap":"./margin/margin/admin_cap.js","./margin/margin/market":"./margin/margin/market.js","./margin/margin/permissions":"./margin/margin/permissions.js","./margin/margin/position":"./margin/margin/position.js","./margin/margin/router":"./margin/margin/router.js","./margin/margin/version":"./margin/margin/version.js","./margin/utils":"./margin/utils/index.js","./_generated/suilend/cell/structs":"./_generated/suilend/cell/structs.js","./_generated/suilend/decimal/structs":"./_generated/suilend/decimal/structs.js","./_generated/suilend/lending-market/functions":"./_generated/suilend/lending-market/functions.js","./_generated/suilend/lending-market/structs":"./_generated/suilend/lending-market/structs.js","./_generated/suilend/lending-market-registry/functions":"./_generated/suilend/lending-market-registry/functions.js","./_generated/suilend/liquidity-mining/structs":"./_generated/suilend/liquidity-mining/structs.js","./_generated/suilend/obligation/structs":"./_generated/suilend/obligation/structs.js","./_generated/suilend/rate-limiter/functions":"./_generated/suilend/rate-limiter/functions.js","./_generated/suilend/rate-limiter/structs":"./_generated/suilend/rate-limiter/structs.js","./_generated/suilend/reserve/structs":"./_generated/suilend/reserve/structs.js","./_generated/suilend/reserve-config/functions":"./_generated/suilend/reserve-config/functions.js","./_generated/suilend/reserve-config/structs":"./_generated/suilend/reserve-config/structs.js","./_generated/_dependencies/source/0x1":"./_generated/_dependencies/source/0x1/index.js","./_generated/_dependencies/source/0x2":"./_generated/_dependencies/source/0x2/index.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/index.js","./margin/margin/deps/std/type_name":"./margin/margin/deps/std/type_name.js","./margin/margin/deps/sui/vec_set":"./margin/margin/deps/sui/vec_set.js","./margin/margin/deps/suilend/lending_market":"./margin/margin/deps/suilend/lending_market.js","./_generated/_dependencies/source/0x1/ascii/structs":"./_generated/_dependencies/source/0x1/ascii/structs.js","./_generated/_dependencies/source/0x1/option/structs":"./_generated/_dependencies/source/0x1/option/structs.js","./_generated/_dependencies/source/0x1/type-name/structs":"./_generated/_dependencies/source/0x1/type-name/structs.js","./_generated/_dependencies/source/0x2/bag/structs":"./_generated/_dependencies/source/0x2/bag/structs.js","./_generated/_dependencies/source/0x2/balance/structs":"./_generated/_dependencies/source/0x2/balance/structs.js","./_generated/_dependencies/source/0x2/object/structs":"./_generated/_dependencies/source/0x2/object/structs.js","./_generated/_dependencies/source/0x2/object-table/structs":"./_generated/_dependencies/source/0x2/object-table/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs.js"},"types":"./index.d.ts","scripts":{"build":"rm -rf ./dist && tsc && node ./fix-esm-imports.js","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test":"vitest run","lint:ci":"yarn run typecheck","prettier":"prettier --write src/ tests/","release":"yarn run build && node ./release.js && cd ./dist && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/fireflyprotocol/lending-mono.git","directory":"ts/sdks/sdk"},"dependencies":{"@bluefin-exchange/bluefin7k-aggregator-sdk":"7.6.3","@cetusprotocol/aggregator-sdk":"1.7.2","@flowx-finance/sdk":"2.1.0","@pythnetwork/hermes-client":"3.1.0","@pythnetwork/pyth-sui-js":"4.0.0","@suilend/springsui-sdk":"4.1.0","bignumber.js":"11.1.5","bn.js":"5.2.5","crypto-js":"4.2.0","lodash":"4.18.1","p-limit":"7.3.2","uuid":"14.0.2"},"devDependencies":{"@mysten/bcs":"2.1.1","@mysten/sui":"2.29.0","@suilend/sui-core":"2.1.0","@tsconfig/recommended":"1.0.13","@types/bn.js":"5.2.0","@types/lodash":"4.17.25","@types/node":"26.5.1","fast-check":"4.10.0","prettier":"3.9.6","ts-node":"10.9.2","typescript":"6.0.3","vite":"8.3.0","vitest":"5.0.0"},"peerDependencies":{"@mysten/bcs":"^2.1.1","@mysten/sui":">=2.22.1 <3","@suilend/sui-core":"^2.0.1"},"type":"module"}
1
+ {"name":"@suilend/sdk","version":"12.5.0","private":false,"description":"A TypeScript SDK for interacting with the Suilend program","author":"Suilend","license":"MIT","main":"./index.js","exports":{".":"./index.js","./client":"./client.js","./mmt":"./mmt.js","./strategies":"./strategies.js","./api/events":"./api/events.js","./api":"./api/index.js","./lib/constants":"./lib/constants.js","./lib":"./lib/index.js","./lib/initialize":"./lib/initialize.js","./lib/liquidityMining":"./lib/liquidityMining.js","./lib/proCompatible":"./lib/proCompatible.js","./lib/pyth":"./lib/pyth.js","./lib/strategyOwnerCap":"./lib/strategyOwnerCap.js","./lib/transactions":"./lib/transactions.js","./lib/types":"./lib/types.js","./margin":"./margin/index.js","./parsers/apiReserveAssetDataEvent":"./parsers/apiReserveAssetDataEvent.js","./parsers":"./parsers/index.js","./parsers/lendingMarket":"./parsers/lendingMarket.js","./parsers/obligation":"./parsers/obligation.js","./parsers/rateLimiter":"./parsers/rateLimiter.js","./parsers/reserve":"./parsers/reserve.js","./swap":"./swap/index.js","./swap/quote":"./swap/quote.js","./swap/transaction":"./swap/transaction.js","./utils/events":"./utils/events.js","./utils/feedId":"./utils/feedId.js","./utils":"./utils/index.js","./utils/obligation":"./utils/obligation.js","./utils/simulate":"./utils/simulate.js","./_generated/_framework/reified":"./_generated/_framework/reified.js","./_generated/_framework/util":"./_generated/_framework/util.js","./_generated/_framework/vector":"./_generated/_framework/vector.js","./_generated/suilend":"./_generated/suilend/index.js","./margin/margin/admin_cap":"./margin/margin/admin_cap.js","./margin/margin/market":"./margin/margin/market.js","./margin/margin/permissions":"./margin/margin/permissions.js","./margin/margin/position":"./margin/margin/position.js","./margin/margin/router":"./margin/margin/router.js","./margin/margin/version":"./margin/margin/version.js","./margin/utils":"./margin/utils/index.js","./_generated/suilend/cell/structs":"./_generated/suilend/cell/structs.js","./_generated/suilend/decimal/structs":"./_generated/suilend/decimal/structs.js","./_generated/suilend/lending-market/functions":"./_generated/suilend/lending-market/functions.js","./_generated/suilend/lending-market/structs":"./_generated/suilend/lending-market/structs.js","./_generated/suilend/lending-market-registry/functions":"./_generated/suilend/lending-market-registry/functions.js","./_generated/suilend/liquidity-mining/structs":"./_generated/suilend/liquidity-mining/structs.js","./_generated/suilend/obligation/structs":"./_generated/suilend/obligation/structs.js","./_generated/suilend/rate-limiter/functions":"./_generated/suilend/rate-limiter/functions.js","./_generated/suilend/rate-limiter/structs":"./_generated/suilend/rate-limiter/structs.js","./_generated/suilend/reserve/structs":"./_generated/suilend/reserve/structs.js","./_generated/suilend/reserve-config/functions":"./_generated/suilend/reserve-config/functions.js","./_generated/suilend/reserve-config/structs":"./_generated/suilend/reserve-config/structs.js","./_generated/_dependencies/source/0x1":"./_generated/_dependencies/source/0x1/index.js","./_generated/_dependencies/source/0x2":"./_generated/_dependencies/source/0x2/index.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/index.js","./margin/margin/deps/std/type_name":"./margin/margin/deps/std/type_name.js","./margin/margin/deps/sui/vec_set":"./margin/margin/deps/sui/vec_set.js","./margin/margin/deps/suilend/lending_market":"./margin/margin/deps/suilend/lending_market.js","./_generated/_dependencies/source/0x1/ascii/structs":"./_generated/_dependencies/source/0x1/ascii/structs.js","./_generated/_dependencies/source/0x1/option/structs":"./_generated/_dependencies/source/0x1/option/structs.js","./_generated/_dependencies/source/0x1/type-name/structs":"./_generated/_dependencies/source/0x1/type-name/structs.js","./_generated/_dependencies/source/0x2/bag/structs":"./_generated/_dependencies/source/0x2/bag/structs.js","./_generated/_dependencies/source/0x2/balance/structs":"./_generated/_dependencies/source/0x2/balance/structs.js","./_generated/_dependencies/source/0x2/object/structs":"./_generated/_dependencies/source/0x2/object/structs.js","./_generated/_dependencies/source/0x2/object-table/structs":"./_generated/_dependencies/source/0x2/object-table/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs.js"},"types":"./index.d.ts","scripts":{"build":"rm -rf ./dist && tsc && node ./fix-esm-imports.js","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test":"vitest run","lint:ci":"yarn run typecheck","prettier":"prettier --write src/ tests/","release":"yarn run build && node ./release.js && cd ./dist && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/fireflyprotocol/lending-mono.git","directory":"ts/sdks/sdk"},"dependencies":{"@bluefin-exchange/bluefin7k-aggregator-sdk":"7.6.3","@cetusprotocol/aggregator-sdk":"1.7.3","@flowx-finance/sdk":"2.1.0","@pythnetwork/hermes-client":"3.1.0","@pythnetwork/pyth-sui-js":"4.0.0","@suilend/springsui-sdk":"4.1.0","bignumber.js":"11.1.5","bn.js":"5.2.5","crypto-js":"4.2.0","lodash":"4.18.1","p-limit":"7.3.3","uuid":"14.0.2"},"devDependencies":{"@mysten/bcs":"2.1.1","@mysten/sui":"2.29.0","@suilend/sui-core":"2.1.0","@tsconfig/recommended":"1.0.13","@types/bn.js":"5.2.0","@types/lodash":"4.17.25","@types/node":"26.5.1","fast-check":"4.10.2","prettier":"3.9.9","ts-node":"10.9.2","typescript":"6.0.3","vite":"8.3.0","vitest":"5.0.1"},"peerDependencies":{"@mysten/bcs":"^2.1.1","@mysten/sui":">=2.22.1 <3","@suilend/sui-core":"^2.0.1"},"type":"module"}