@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 +9 -0
- package/client.js +63 -42
- package/lib/initialize.d.ts +269 -6
- package/lib/initialize.js +92 -56
- package/package.json +1 -1
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
|
-
|
|
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
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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`);
|
package/lib/initialize.d.ts
CHANGED
|
@@ -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?:
|
|
63
|
-
export declare const priceTemporaryPythFeedReservesAll: (reservesByMarket: Reserve<string>[][], fetchPrices?:
|
|
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
|
|
146
|
+
export type FetchPrices = (coinTypes: string[]) => Promise<Record<string, number | undefined>>;
|
|
147
|
+
type InitializeSuilendMarket = {
|
|
146
148
|
suilendClient: SuilendClient;
|
|
147
149
|
lendingMarketMetadata?: LendingMarketMetadata;
|
|
148
|
-
}
|
|
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?:
|
|
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?:
|
|
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
|
-
|
|
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
|
|
264
|
-
const
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
324
|
-
uniqueReserveCoinTypes,
|
|
325
|
-
uniqueRewardCoinTypes,
|
|
326
|
-
uniqueActiveRewardsCoinTypes,
|
|
362
|
+
...coinTypesByMarket[index],
|
|
327
363
|
};
|
|
328
364
|
});
|
|
329
|
-
const
|
|
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 =
|
|
373
|
-
|
|
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
|
-
|
|
383
|
-
|
|
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.
|
|
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"}
|