@suilend/sdk 1.1.31 → 1.1.32

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/api/events.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { DownsampledApiReserveAssetDataEvent } from "../types";
1
+ import { DownsampledApiReserveAssetDataEvent } from "../lib/types";
2
2
  /**
3
3
  * Note: This SDK function is experimental and may change or require authentication in the future.
4
4
  */
package/client.d.ts CHANGED
@@ -5,7 +5,7 @@ import { FeeReceivers, LendingMarket, ObligationOwnerCap } from "./_generated/su
5
5
  import { Obligation } from "./_generated/suilend/obligation/structs";
6
6
  import { NewConfigArgs as CreateRateLimiterConfigArgs } from "./_generated/suilend/rate-limiter/functions";
7
7
  import { CreateReserveConfigArgs } from "./_generated/suilend/reserve-config/functions";
8
- import { Side } from "./types";
8
+ import { Side } from "./lib/types";
9
9
  export declare const LENDING_MARKET_ID: string;
10
10
  export declare const LENDING_MARKET_TYPE: string;
11
11
  export type ClaimRewardsReward = {
package/client.js CHANGED
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.SuilendClient = exports.LENDING_MARKET_TYPE = exports.LENDING_MARKET_ID = void 0;
13
13
  const utils_1 = require("@mysten/sui/utils");
14
14
  const pyth_sui_js_1 = require("@pythnetwork/pyth-sui-js");
15
+ const frontend_sui_1 = require("@suilend/frontend-sui");
15
16
  const structs_1 = require("./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-info/structs");
16
17
  const reified_1 = require("./_generated/_framework/reified");
17
18
  const suilend_1 = require("./_generated/suilend");
@@ -22,8 +23,7 @@ const functions_2 = require("./_generated/suilend/lending-market-registry/functi
22
23
  const structs_3 = require("./_generated/suilend/obligation/structs");
23
24
  const functions_3 = require("./_generated/suilend/rate-limiter/functions");
24
25
  const functions_4 = require("./_generated/suilend/reserve-config/functions");
25
- const types_1 = require("./types");
26
- const utils_2 = require("./utils");
26
+ const types_1 = require("./lib/types");
27
27
  const SUI_COINTYPE = "0x2::sui::SUI";
28
28
  const NORMALIZED_SUI_COINTYPE = (0, utils_1.normalizeStructTag)(SUI_COINTYPE);
29
29
  const isSui = (coinType) => (0, utils_1.normalizeStructTag)(coinType) === NORMALIZED_SUI_COINTYPE;
@@ -633,7 +633,7 @@ class SuilendClient {
633
633
  if (mergeCoins.length > 1) {
634
634
  transaction.mergeCoins(transaction.object(mergeCoin.coinObjectId), mergeCoins.map((mc) => transaction.object(mc.coinObjectId)).slice(1));
635
635
  }
636
- const coinType = (0, utils_2.extractCTokenCoinType)(ctokenCoinType);
636
+ const coinType = (0, frontend_sui_1.extractCTokenCoinType)(ctokenCoinType);
637
637
  const [exemption] = transaction.moveCall({
638
638
  target: `0x1::option::none`,
639
639
  typeArguments: [
package/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export * from "./api";
2
+ export * from "./lib";
2
3
  export * from "./parsers";
3
4
  export * from "./utils";
4
5
  export * from "./client";
5
- export * from "./constants";
6
- export * from "./types";
package/index.js CHANGED
@@ -15,8 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./api"), exports);
18
+ __exportStar(require("./lib"), exports);
18
19
  __exportStar(require("./parsers"), exports);
19
20
  __exportStar(require("./utils"), exports);
20
21
  __exportStar(require("./client"), exports);
21
- __exportStar(require("./constants"), exports);
22
- __exportStar(require("./types"), exports);
@@ -1,3 +1,4 @@
1
1
  import BigNumber from "bignumber.js";
2
2
  export declare const maxU64: BigNumber;
3
3
  export declare const WAD: BigNumber;
4
+ export declare const msPerYear = 31556952000;
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.WAD = exports.maxU64 = void 0;
6
+ exports.msPerYear = exports.WAD = exports.maxU64 = void 0;
7
7
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
8
  exports.maxU64 = new bignumber_js_1.default(2).pow(64).minus(1);
9
9
  exports.WAD = new bignumber_js_1.default(10).pow(18);
10
+ exports.msPerYear = 31556952000; // Approx. 1000 * 60 * 60 * 24 * 365;
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./constants";
2
+ export * from "./initialize";
3
+ export * from "./liquidityMining";
4
+ export * from "./transactions";
5
+ export * from "./types";
package/lib/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./constants"), exports);
18
+ __exportStar(require("./initialize"), exports);
19
+ __exportStar(require("./liquidityMining"), exports);
20
+ __exportStar(require("./transactions"), exports);
21
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,517 @@
1
+ import { CoinMetadata, SuiClient } from "@mysten/sui/client";
2
+ import BigNumber from "bignumber.js";
3
+ import { SuilendClient } from "../client";
4
+ import { ParsedObligation, ParsedReserve } from "../parsers";
5
+ export declare const RESERVES_CUSTOM_ORDER: string[];
6
+ export declare const initializeSuilend: (suiClient: SuiClient, suilendClient: SuilendClient, address?: string) => Promise<{
7
+ lendingMarket: {
8
+ id: string;
9
+ version: bigint;
10
+ reserves: {
11
+ config: {
12
+ $typeName: string;
13
+ openLtvPct: number;
14
+ closeLtvPct: number;
15
+ maxCloseLtvPct: number;
16
+ borrowWeightBps: BigNumber;
17
+ depositLimit: BigNumber;
18
+ borrowLimit: BigNumber;
19
+ liquidationBonusBps: number;
20
+ maxLiquidationBonusBps: number;
21
+ depositLimitUsd: BigNumber;
22
+ borrowLimitUsd: BigNumber;
23
+ borrowFeeBps: number;
24
+ spreadFeeBps: number;
25
+ protocolLiquidationFeeBps: number;
26
+ isolated: boolean;
27
+ openAttributedBorrowLimitUsd: number;
28
+ closeAttributedBorrowLimitUsd: number;
29
+ interestRate: {
30
+ id: string;
31
+ utilPercent: BigNumber;
32
+ aprPercent: BigNumber;
33
+ }[];
34
+ };
35
+ $typeName: string;
36
+ id: string;
37
+ arrayIndex: bigint;
38
+ coinType: string;
39
+ mintDecimals: number;
40
+ priceIdentifier: string;
41
+ price: BigNumber;
42
+ smoothedPrice: BigNumber;
43
+ minPrice: BigNumber;
44
+ maxPrice: BigNumber;
45
+ priceLastUpdateTimestampS: bigint;
46
+ availableAmount: BigNumber;
47
+ ctokenSupply: BigNumber;
48
+ borrowedAmount: BigNumber;
49
+ cumulativeBorrowRate: BigNumber;
50
+ interestLastUpdateTimestampS: bigint;
51
+ unclaimedSpreadFees: BigNumber;
52
+ attributedBorrowValue: BigNumber;
53
+ depositsPoolRewardManager: {
54
+ $typeName: string;
55
+ id: string;
56
+ totalShares: bigint;
57
+ poolRewards: {
58
+ $typeName: string;
59
+ id: string;
60
+ poolRewardManagerId: string;
61
+ coinType: string;
62
+ startTimeMs: number;
63
+ endTimeMs: number;
64
+ totalRewards: BigNumber;
65
+ allocatedRewards: BigNumber;
66
+ cumulativeRewardsPerShare: BigNumber;
67
+ numUserRewardManagers: bigint;
68
+ rewardIndex: number;
69
+ symbol: string;
70
+ mintDecimals: number;
71
+ }[];
72
+ lastUpdateTimeMs: bigint;
73
+ };
74
+ borrowsPoolRewardManager: {
75
+ $typeName: string;
76
+ id: string;
77
+ totalShares: bigint;
78
+ poolRewards: {
79
+ $typeName: string;
80
+ id: string;
81
+ poolRewardManagerId: string;
82
+ coinType: string;
83
+ startTimeMs: number;
84
+ endTimeMs: number;
85
+ totalRewards: BigNumber;
86
+ allocatedRewards: BigNumber;
87
+ cumulativeRewardsPerShare: BigNumber;
88
+ numUserRewardManagers: bigint;
89
+ rewardIndex: number;
90
+ symbol: string;
91
+ mintDecimals: number;
92
+ }[];
93
+ lastUpdateTimeMs: bigint;
94
+ };
95
+ availableAmountUsd: BigNumber;
96
+ borrowedAmountUsd: BigNumber;
97
+ depositedAmount: BigNumber;
98
+ depositedAmountUsd: BigNumber;
99
+ cTokenExchangeRate: BigNumber;
100
+ borrowAprPercent: BigNumber;
101
+ depositAprPercent: BigNumber;
102
+ utilizationPercent: BigNumber;
103
+ token: {
104
+ decimals: number;
105
+ description: string;
106
+ iconUrl?: string | null;
107
+ id?: string | null;
108
+ name: string;
109
+ symbol: string;
110
+ coinType: string;
111
+ };
112
+ symbol: string;
113
+ name: string;
114
+ iconUrl: string | null | undefined;
115
+ description: string;
116
+ totalDeposits: BigNumber;
117
+ }[];
118
+ obligations: import("../_generated/_dependencies/source/0x2/object-table/structs").ObjectTable<"0x2::object::ID", `0x1f54a9a2d71799553197e9ea24557797c6398d6a65f2d4d3818c9304b75d5e21::obligation::Obligation<${string}>` | `0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf::obligation::Obligation<${string}>`>;
119
+ rateLimiter: {
120
+ config: {
121
+ windowDuration: bigint;
122
+ maxOutflow: bigint;
123
+ };
124
+ $typeName: string;
125
+ prevQty: bigint;
126
+ windowStart: bigint;
127
+ curQty: bigint;
128
+ remainingOutflow: BigNumber;
129
+ };
130
+ feeReceiver: string;
131
+ badDebtUsd: BigNumber;
132
+ badDebtLimitUsd: BigNumber;
133
+ depositedAmountUsd: BigNumber;
134
+ borrowedAmountUsd: BigNumber;
135
+ tvlUsd: BigNumber;
136
+ totalSupplyUsd: BigNumber;
137
+ totalBorrowUsd: BigNumber;
138
+ };
139
+ refreshedRawReserves: import("../_generated/suilend/reserve/structs").Reserve<string>[];
140
+ reserveMap: Record<string, {
141
+ config: {
142
+ $typeName: string;
143
+ openLtvPct: number;
144
+ closeLtvPct: number;
145
+ maxCloseLtvPct: number;
146
+ borrowWeightBps: BigNumber;
147
+ depositLimit: BigNumber;
148
+ borrowLimit: BigNumber;
149
+ liquidationBonusBps: number;
150
+ maxLiquidationBonusBps: number;
151
+ depositLimitUsd: BigNumber;
152
+ borrowLimitUsd: BigNumber;
153
+ borrowFeeBps: number;
154
+ spreadFeeBps: number;
155
+ protocolLiquidationFeeBps: number;
156
+ isolated: boolean;
157
+ openAttributedBorrowLimitUsd: number;
158
+ closeAttributedBorrowLimitUsd: number;
159
+ interestRate: {
160
+ id: string;
161
+ utilPercent: BigNumber;
162
+ aprPercent: BigNumber;
163
+ }[];
164
+ };
165
+ $typeName: string;
166
+ id: string;
167
+ arrayIndex: bigint;
168
+ coinType: string;
169
+ mintDecimals: number;
170
+ priceIdentifier: string;
171
+ price: BigNumber;
172
+ smoothedPrice: BigNumber;
173
+ minPrice: BigNumber;
174
+ maxPrice: BigNumber;
175
+ priceLastUpdateTimestampS: bigint;
176
+ availableAmount: BigNumber;
177
+ ctokenSupply: BigNumber;
178
+ borrowedAmount: BigNumber;
179
+ cumulativeBorrowRate: BigNumber;
180
+ interestLastUpdateTimestampS: bigint;
181
+ unclaimedSpreadFees: BigNumber;
182
+ attributedBorrowValue: BigNumber;
183
+ depositsPoolRewardManager: {
184
+ $typeName: string;
185
+ id: string;
186
+ totalShares: bigint;
187
+ poolRewards: {
188
+ $typeName: string;
189
+ id: string;
190
+ poolRewardManagerId: string;
191
+ coinType: string;
192
+ startTimeMs: number;
193
+ endTimeMs: number;
194
+ totalRewards: BigNumber;
195
+ allocatedRewards: BigNumber;
196
+ cumulativeRewardsPerShare: BigNumber;
197
+ numUserRewardManagers: bigint;
198
+ rewardIndex: number;
199
+ symbol: string;
200
+ mintDecimals: number;
201
+ }[];
202
+ lastUpdateTimeMs: bigint;
203
+ };
204
+ borrowsPoolRewardManager: {
205
+ $typeName: string;
206
+ id: string;
207
+ totalShares: bigint;
208
+ poolRewards: {
209
+ $typeName: string;
210
+ id: string;
211
+ poolRewardManagerId: string;
212
+ coinType: string;
213
+ startTimeMs: number;
214
+ endTimeMs: number;
215
+ totalRewards: BigNumber;
216
+ allocatedRewards: BigNumber;
217
+ cumulativeRewardsPerShare: BigNumber;
218
+ numUserRewardManagers: bigint;
219
+ rewardIndex: number;
220
+ symbol: string;
221
+ mintDecimals: number;
222
+ }[];
223
+ lastUpdateTimeMs: bigint;
224
+ };
225
+ availableAmountUsd: BigNumber;
226
+ borrowedAmountUsd: BigNumber;
227
+ depositedAmount: BigNumber;
228
+ depositedAmountUsd: BigNumber;
229
+ cTokenExchangeRate: BigNumber;
230
+ borrowAprPercent: BigNumber;
231
+ depositAprPercent: BigNumber;
232
+ utilizationPercent: BigNumber;
233
+ token: {
234
+ decimals: number;
235
+ description: string;
236
+ iconUrl?: string | null;
237
+ id?: string | null;
238
+ name: string;
239
+ symbol: string;
240
+ coinType: string;
241
+ };
242
+ symbol: string;
243
+ name: string;
244
+ iconUrl: string | null | undefined;
245
+ description: string;
246
+ totalDeposits: BigNumber;
247
+ }>;
248
+ reserveCoinTypes: string[];
249
+ rewardCoinTypes: string[];
250
+ reserveCoinMetadataMap: Record<string, CoinMetadata>;
251
+ rewardCoinMetadataMap: Record<string, CoinMetadata>;
252
+ coinMetadataMap: {
253
+ [x: string]: CoinMetadata;
254
+ };
255
+ obligationOwnerCaps: import("../_generated/suilend/lending-market/structs").ObligationOwnerCap<string>[] | undefined;
256
+ obligations: {
257
+ id: string;
258
+ depositedAmountUsd: BigNumber;
259
+ borrowedAmountUsd: BigNumber;
260
+ netValueUsd: BigNumber;
261
+ weightedBorrowsUsd: BigNumber;
262
+ maxPriceWeightedBorrowsUsd: BigNumber;
263
+ borrowLimitUsd: BigNumber;
264
+ minPriceBorrowLimitUsd: BigNumber;
265
+ unhealthyBorrowValueUsd: BigNumber;
266
+ depositPositionCount: number;
267
+ borrowPositionCount: number;
268
+ positionCount: number;
269
+ deposits: {
270
+ coinType: string;
271
+ reserveArrayIndex: bigint;
272
+ userRewardManagerIndex: number;
273
+ userRewardManager: import("../_generated/suilend/liquidity-mining/structs").UserRewardManager;
274
+ depositedAmount: BigNumber;
275
+ depositedAmountUsd: BigNumber;
276
+ depositedCtokenAmount: BigNumber;
277
+ reserve: {
278
+ config: {
279
+ $typeName: string;
280
+ openLtvPct: number;
281
+ closeLtvPct: number;
282
+ maxCloseLtvPct: number;
283
+ borrowWeightBps: BigNumber;
284
+ depositLimit: BigNumber;
285
+ borrowLimit: BigNumber;
286
+ liquidationBonusBps: number;
287
+ maxLiquidationBonusBps: number;
288
+ depositLimitUsd: BigNumber;
289
+ borrowLimitUsd: BigNumber;
290
+ borrowFeeBps: number;
291
+ spreadFeeBps: number;
292
+ protocolLiquidationFeeBps: number;
293
+ isolated: boolean;
294
+ openAttributedBorrowLimitUsd: number;
295
+ closeAttributedBorrowLimitUsd: number;
296
+ interestRate: {
297
+ id: string;
298
+ utilPercent: BigNumber;
299
+ aprPercent: BigNumber;
300
+ }[];
301
+ };
302
+ $typeName: string;
303
+ id: string;
304
+ arrayIndex: bigint;
305
+ coinType: string;
306
+ mintDecimals: number;
307
+ priceIdentifier: string;
308
+ price: BigNumber;
309
+ smoothedPrice: BigNumber;
310
+ minPrice: BigNumber;
311
+ maxPrice: BigNumber;
312
+ priceLastUpdateTimestampS: bigint;
313
+ availableAmount: BigNumber;
314
+ ctokenSupply: BigNumber;
315
+ borrowedAmount: BigNumber;
316
+ cumulativeBorrowRate: BigNumber;
317
+ interestLastUpdateTimestampS: bigint;
318
+ unclaimedSpreadFees: BigNumber;
319
+ attributedBorrowValue: BigNumber;
320
+ depositsPoolRewardManager: {
321
+ $typeName: string;
322
+ id: string;
323
+ totalShares: bigint;
324
+ poolRewards: {
325
+ $typeName: string;
326
+ id: string;
327
+ poolRewardManagerId: string;
328
+ coinType: string;
329
+ startTimeMs: number;
330
+ endTimeMs: number;
331
+ totalRewards: BigNumber;
332
+ allocatedRewards: BigNumber;
333
+ cumulativeRewardsPerShare: BigNumber;
334
+ numUserRewardManagers: bigint;
335
+ rewardIndex: number;
336
+ symbol: string;
337
+ mintDecimals: number;
338
+ }[];
339
+ lastUpdateTimeMs: bigint;
340
+ };
341
+ borrowsPoolRewardManager: {
342
+ $typeName: string;
343
+ id: string;
344
+ totalShares: bigint;
345
+ poolRewards: {
346
+ $typeName: string;
347
+ id: string;
348
+ poolRewardManagerId: string;
349
+ coinType: string;
350
+ startTimeMs: number;
351
+ endTimeMs: number;
352
+ totalRewards: BigNumber;
353
+ allocatedRewards: BigNumber;
354
+ cumulativeRewardsPerShare: BigNumber;
355
+ numUserRewardManagers: bigint;
356
+ rewardIndex: number;
357
+ symbol: string;
358
+ mintDecimals: number;
359
+ }[];
360
+ lastUpdateTimeMs: bigint;
361
+ };
362
+ availableAmountUsd: BigNumber;
363
+ borrowedAmountUsd: BigNumber;
364
+ depositedAmount: BigNumber;
365
+ depositedAmountUsd: BigNumber;
366
+ cTokenExchangeRate: BigNumber;
367
+ borrowAprPercent: BigNumber;
368
+ depositAprPercent: BigNumber;
369
+ utilizationPercent: BigNumber;
370
+ token: {
371
+ decimals: number;
372
+ description: string;
373
+ iconUrl?: string | null;
374
+ id?: string | null;
375
+ name: string;
376
+ symbol: string;
377
+ coinType: string;
378
+ };
379
+ symbol: string;
380
+ name: string;
381
+ iconUrl: string | null | undefined;
382
+ description: string;
383
+ totalDeposits: BigNumber;
384
+ };
385
+ original: import("../_generated/suilend/obligation/structs").Obligation<string>;
386
+ }[];
387
+ borrows: {
388
+ coinType: string;
389
+ reserveArrayIndex: bigint;
390
+ userRewardManagerIndex: number;
391
+ userRewardManager: import("../_generated/suilend/liquidity-mining/structs").UserRewardManager;
392
+ borrowedAmount: BigNumber;
393
+ borrowedAmountUsd: BigNumber;
394
+ reserve: {
395
+ config: {
396
+ $typeName: string;
397
+ openLtvPct: number;
398
+ closeLtvPct: number;
399
+ maxCloseLtvPct: number;
400
+ borrowWeightBps: BigNumber;
401
+ depositLimit: BigNumber;
402
+ borrowLimit: BigNumber;
403
+ liquidationBonusBps: number;
404
+ maxLiquidationBonusBps: number;
405
+ depositLimitUsd: BigNumber;
406
+ borrowLimitUsd: BigNumber;
407
+ borrowFeeBps: number;
408
+ spreadFeeBps: number;
409
+ protocolLiquidationFeeBps: number;
410
+ isolated: boolean;
411
+ openAttributedBorrowLimitUsd: number;
412
+ closeAttributedBorrowLimitUsd: number;
413
+ interestRate: {
414
+ id: string;
415
+ utilPercent: BigNumber;
416
+ aprPercent: BigNumber;
417
+ }[];
418
+ };
419
+ $typeName: string;
420
+ id: string;
421
+ arrayIndex: bigint;
422
+ coinType: string;
423
+ mintDecimals: number;
424
+ priceIdentifier: string;
425
+ price: BigNumber;
426
+ smoothedPrice: BigNumber;
427
+ minPrice: BigNumber;
428
+ maxPrice: BigNumber;
429
+ priceLastUpdateTimestampS: bigint;
430
+ availableAmount: BigNumber;
431
+ ctokenSupply: BigNumber;
432
+ borrowedAmount: BigNumber;
433
+ cumulativeBorrowRate: BigNumber;
434
+ interestLastUpdateTimestampS: bigint;
435
+ unclaimedSpreadFees: BigNumber;
436
+ attributedBorrowValue: BigNumber;
437
+ depositsPoolRewardManager: {
438
+ $typeName: string;
439
+ id: string;
440
+ totalShares: bigint;
441
+ poolRewards: {
442
+ $typeName: string;
443
+ id: string;
444
+ poolRewardManagerId: string;
445
+ coinType: string;
446
+ startTimeMs: number;
447
+ endTimeMs: number;
448
+ totalRewards: BigNumber;
449
+ allocatedRewards: BigNumber;
450
+ cumulativeRewardsPerShare: BigNumber;
451
+ numUserRewardManagers: bigint;
452
+ rewardIndex: number;
453
+ symbol: string;
454
+ mintDecimals: number;
455
+ }[];
456
+ lastUpdateTimeMs: bigint;
457
+ };
458
+ borrowsPoolRewardManager: {
459
+ $typeName: string;
460
+ id: string;
461
+ totalShares: bigint;
462
+ poolRewards: {
463
+ $typeName: string;
464
+ id: string;
465
+ poolRewardManagerId: string;
466
+ coinType: string;
467
+ startTimeMs: number;
468
+ endTimeMs: number;
469
+ totalRewards: BigNumber;
470
+ allocatedRewards: BigNumber;
471
+ cumulativeRewardsPerShare: BigNumber;
472
+ numUserRewardManagers: bigint;
473
+ rewardIndex: number;
474
+ symbol: string;
475
+ mintDecimals: number;
476
+ }[];
477
+ lastUpdateTimeMs: bigint;
478
+ };
479
+ availableAmountUsd: BigNumber;
480
+ borrowedAmountUsd: BigNumber;
481
+ depositedAmount: BigNumber;
482
+ depositedAmountUsd: BigNumber;
483
+ cTokenExchangeRate: BigNumber;
484
+ borrowAprPercent: BigNumber;
485
+ depositAprPercent: BigNumber;
486
+ utilizationPercent: BigNumber;
487
+ token: {
488
+ decimals: number;
489
+ description: string;
490
+ iconUrl?: string | null;
491
+ id?: string | null;
492
+ name: string;
493
+ symbol: string;
494
+ coinType: string;
495
+ };
496
+ symbol: string;
497
+ name: string;
498
+ iconUrl: string | null | undefined;
499
+ description: string;
500
+ totalDeposits: BigNumber;
501
+ };
502
+ original: import("../_generated/suilend/obligation/structs").Obligation<string>;
503
+ }[];
504
+ weightedConservativeBorrowUtilizationPercent: BigNumber;
505
+ original: import("../_generated/suilend/obligation/structs").Obligation<string>;
506
+ totalSupplyUsd: BigNumber;
507
+ totalBorrowUsd: BigNumber;
508
+ totalWeightedBorrowUsd: BigNumber;
509
+ maxPriceTotalWeightedBorrowUsd: BigNumber;
510
+ borrowLimit: BigNumber;
511
+ minPriceBorrowLimit: BigNumber;
512
+ }[] | undefined;
513
+ }>;
514
+ export declare const initializeSuilendRewards: (reserveMap: Record<string, ParsedReserve>, rewardCoinTypes: string[], rewardCoinMetadataMap: Record<string, CoinMetadata>, obligations?: ParsedObligation[]) => Promise<{
515
+ rewardPriceMap: Record<string, BigNumber | undefined>;
516
+ rewardMap: import("./liquidityMining").RewardMap;
517
+ }>;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.initializeSuilendRewards = exports.initializeSuilend = exports.RESERVES_CUSTOM_ORDER = void 0;
49
+ const utils_1 = require("@mysten/sui/utils");
50
+ const pyth_sui_js_1 = require("@pythnetwork/pyth-sui-js");
51
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
52
+ const frontend_sui_1 = require("@suilend/frontend-sui");
53
+ const client_1 = require("../client");
54
+ const parsers_1 = require("../parsers");
55
+ const simulate = __importStar(require("../utils/simulate"));
56
+ const constants_1 = require("./constants");
57
+ const liquidityMining_1 = require("./liquidityMining");
58
+ exports.RESERVES_CUSTOM_ORDER = [
59
+ // Main assets
60
+ frontend_sui_1.NORMALIZED_sSUI_COINTYPE,
61
+ // Main assets - Ecosystem LSTs
62
+ frontend_sui_1.NORMALIZED_mSUI_COINTYPE,
63
+ frontend_sui_1.NORMALIZED_fudSUI_COINTYPE,
64
+ frontend_sui_1.NORMALIZED_kSUI_COINTYPE,
65
+ frontend_sui_1.NORMALIZED_trevinSUI_COINTYPE,
66
+ frontend_sui_1.NORMALIZED_upSUI_COINTYPE,
67
+ frontend_sui_1.NORMALIZED_SUI_COINTYPE,
68
+ frontend_sui_1.NORMALIZED_USDC_COINTYPE,
69
+ frontend_sui_1.NORMALIZED_suiUSDT_COINTYPE,
70
+ frontend_sui_1.NORMALIZED_wUSDT_COINTYPE,
71
+ frontend_sui_1.NORMALIZED_AUSD_COINTYPE,
72
+ frontend_sui_1.NORMALIZED_suiETH_COINTYPE,
73
+ frontend_sui_1.NORMALIZED_SOL_COINTYPE,
74
+ // Isolated assets
75
+ frontend_sui_1.NORMALIZED_SEND_COINTYPE,
76
+ frontend_sui_1.NORMALIZED_DEEP_COINTYPE,
77
+ frontend_sui_1.NORMALIZED_BLUE_COINTYPE, // Not listed
78
+ frontend_sui_1.NORMALIZED_NS_COINTYPE,
79
+ frontend_sui_1.NORMALIZED_BUCK_COINTYPE,
80
+ // Isolated assets - Memecoins
81
+ frontend_sui_1.NORMALIZED_FUD_COINTYPE,
82
+ frontend_sui_1.NORMALIZED_HIPPO_COINTYPE,
83
+ // Deprecated assets
84
+ frontend_sui_1.NORMALIZED_wUSDC_COINTYPE,
85
+ frontend_sui_1.NORMALIZED_WETH_COINTYPE,
86
+ ];
87
+ const initializeSuilend = (suiClient, suilendClient, address) => __awaiter(void 0, void 0, void 0, function* () {
88
+ const now = Math.floor(Date.now() / 1000);
89
+ const refreshedRawReserves = yield simulate.refreshReservePrice(suilendClient.lendingMarket.reserves.map((r) => simulate.compoundReserveInterest(r, now)), new pyth_sui_js_1.SuiPriceServiceConnection("https://hermes.pyth.network"));
90
+ const reserveCoinTypes = [];
91
+ const rewardCoinTypes = [];
92
+ refreshedRawReserves.forEach((r) => {
93
+ reserveCoinTypes.push((0, utils_1.normalizeStructTag)(r.coinType.name));
94
+ [
95
+ ...r.depositsPoolRewardManager.poolRewards,
96
+ ...r.borrowsPoolRewardManager.poolRewards,
97
+ ].forEach((pr) => {
98
+ if (!pr)
99
+ return;
100
+ rewardCoinTypes.push((0, utils_1.normalizeStructTag)(pr.coinType.name));
101
+ });
102
+ });
103
+ const uniqueReservesCoinTypes = Array.from(new Set(reserveCoinTypes));
104
+ const uniqueRewardsCoinTypes = Array.from(new Set(rewardCoinTypes));
105
+ const reserveCoinMetadataMap = yield (0, frontend_sui_1.getCoinMetadataMap)(suiClient, uniqueReservesCoinTypes);
106
+ const rewardCoinMetadataMap = yield (0, frontend_sui_1.getCoinMetadataMap)(suiClient, uniqueRewardsCoinTypes);
107
+ const coinMetadataMap = Object.assign(Object.assign({}, reserveCoinMetadataMap), rewardCoinMetadataMap);
108
+ const reservesWithTemporaryPythPriceFeeds = refreshedRawReserves.filter((r) => frontend_sui_1.TEMPORARY_PYTH_PRICE_FEED_COINTYPES.includes((0, utils_1.normalizeStructTag)(r.coinType.name)));
109
+ for (const reserve of reservesWithTemporaryPythPriceFeeds) {
110
+ const birdeyePrice = yield (0, frontend_sui_1.getPrice)((0, utils_1.normalizeStructTag)(reserve.coinType.name));
111
+ if (birdeyePrice === undefined)
112
+ continue;
113
+ const parsedBirdeyePrice = BigInt(+new bignumber_js_1.default(birdeyePrice)
114
+ .times(constants_1.WAD)
115
+ .integerValue(bignumber_js_1.default.ROUND_DOWN));
116
+ reserve.price.value = parsedBirdeyePrice;
117
+ reserve.smoothedPrice.value = parsedBirdeyePrice;
118
+ }
119
+ const lendingMarket = (0, parsers_1.parseLendingMarket)(suilendClient.lendingMarket, refreshedRawReserves, coinMetadataMap, now);
120
+ lendingMarket.reserves = lendingMarket.reserves.slice().sort((a, b) => {
121
+ const aCustomOrderIndex = exports.RESERVES_CUSTOM_ORDER.indexOf(a.coinType);
122
+ const bCustomOrderIndex = exports.RESERVES_CUSTOM_ORDER.indexOf(b.coinType);
123
+ if (aCustomOrderIndex > -1 && bCustomOrderIndex > -1)
124
+ return aCustomOrderIndex - bCustomOrderIndex;
125
+ else if (aCustomOrderIndex === -1 && bCustomOrderIndex === -1)
126
+ return 0;
127
+ else
128
+ return aCustomOrderIndex > -1 ? -1 : 1;
129
+ });
130
+ const reserveMap = lendingMarket.reserves.reduce((acc, reserve) => (Object.assign(Object.assign({}, acc), { [reserve.coinType]: reserve })), {});
131
+ // Obligations
132
+ let obligationOwnerCaps, obligations;
133
+ if (address) {
134
+ obligationOwnerCaps = yield client_1.SuilendClient.getObligationOwnerCaps(address, suilendClient.lendingMarket.$typeArgs, suiClient);
135
+ obligations = (yield Promise.all(obligationOwnerCaps.map((ownerCap) => client_1.SuilendClient.getObligation(ownerCap.obligationId, suilendClient.lendingMarket.$typeArgs, suiClient))))
136
+ .map((rawObligation) => simulate.refreshObligation(rawObligation, refreshedRawReserves))
137
+ .map((refreshedObligation) => (0, parsers_1.parseObligation)(refreshedObligation, reserveMap))
138
+ .sort((a, b) => +b.netValueUsd.minus(a.netValueUsd));
139
+ }
140
+ return {
141
+ lendingMarket,
142
+ refreshedRawReserves,
143
+ reserveMap,
144
+ reserveCoinTypes: uniqueReservesCoinTypes,
145
+ rewardCoinTypes: uniqueRewardsCoinTypes,
146
+ reserveCoinMetadataMap,
147
+ rewardCoinMetadataMap,
148
+ coinMetadataMap,
149
+ obligationOwnerCaps,
150
+ obligations,
151
+ };
152
+ });
153
+ exports.initializeSuilend = initializeSuilend;
154
+ const initializeSuilendRewards = (reserveMap, rewardCoinTypes, rewardCoinMetadataMap, obligations) => __awaiter(void 0, void 0, void 0, function* () {
155
+ const rewardPriceMap = Object.entries(reserveMap).reduce((acc, [coinType, reserve]) => (Object.assign(Object.assign({}, acc), { [coinType]: reserve.price })), {});
156
+ rewardPriceMap[frontend_sui_1.NORMALIZED_TREATS_COINTYPE] = new bignumber_js_1.default(0.1);
157
+ const reservelessRewardCoinTypes = rewardCoinTypes.filter((coinType) => !((0, frontend_sui_1.isSendPoints)(coinType) || coinType === frontend_sui_1.NORMALIZED_MAYA_COINTYPE) &&
158
+ !rewardPriceMap[coinType]);
159
+ const reservelessRewardBirdeyePrices = yield Promise.all(reservelessRewardCoinTypes.map((coinType) => (0, frontend_sui_1.getPrice)(coinType)));
160
+ for (let i = 0; i < reservelessRewardCoinTypes.length; i++) {
161
+ const birdeyePrice = reservelessRewardBirdeyePrices[i];
162
+ if (birdeyePrice === undefined)
163
+ continue;
164
+ rewardPriceMap[reservelessRewardCoinTypes[i]] = new bignumber_js_1.default(birdeyePrice);
165
+ }
166
+ const rewardMap = (0, liquidityMining_1.formatRewards)(reserveMap, rewardCoinMetadataMap, rewardPriceMap, obligations);
167
+ return { rewardPriceMap, rewardMap };
168
+ });
169
+ exports.initializeSuilendRewards = initializeSuilendRewards;
@@ -0,0 +1,54 @@
1
+ import { CoinMetadata } from "@mysten/sui/client";
2
+ import BigNumber from "bignumber.js";
3
+ import { ParsedObligation, ParsedReserve } from "../parsers";
4
+ import { Side } from "./types";
5
+ export type RewardMap = {
6
+ [coinType: string]: {
7
+ deposit: RewardSummary[];
8
+ borrow: RewardSummary[];
9
+ };
10
+ };
11
+ type ObligationClaim = {
12
+ claimableAmount: BigNumber;
13
+ reserveArrayIndex: bigint;
14
+ };
15
+ export type RewardSummary = {
16
+ stats: {
17
+ id: string;
18
+ isActive: boolean;
19
+ rewardIndex: number;
20
+ reserve: ParsedReserve;
21
+ rewardCoinType: string;
22
+ mintDecimals: number;
23
+ price?: BigNumber;
24
+ symbol: string;
25
+ iconUrl?: string | null;
26
+ aprPercent?: BigNumber;
27
+ perDay?: BigNumber;
28
+ side: Side;
29
+ };
30
+ obligationClaims: {
31
+ [obligationId: string]: ObligationClaim;
32
+ };
33
+ };
34
+ export type AprRewardSummary = Omit<RewardSummary, "stats"> & {
35
+ stats: RewardSummary["stats"] & {
36
+ aprPercent: BigNumber;
37
+ price: BigNumber;
38
+ };
39
+ };
40
+ export type PerDayRewardSummary = Omit<RewardSummary, "stats"> & {
41
+ stats: RewardSummary["stats"] & {
42
+ perDay: BigNumber;
43
+ };
44
+ };
45
+ export declare const getDepositShare: (reserve: ParsedReserve, share: BigNumber) => BigNumber;
46
+ export declare const getBorrowShare: (reserve: ParsedReserve, share: BigNumber) => BigNumber;
47
+ export declare const formatRewards: (parsedReserveMap: Record<string, ParsedReserve>, coinMetadataMap: Record<string, CoinMetadata>, priceMap: Record<string, BigNumber | undefined>, obligations?: ParsedObligation[]) => RewardMap;
48
+ export declare const getFilteredRewards: (rewards: RewardSummary[]) => RewardSummary[];
49
+ export declare const getDedupedAprRewards: (filteredRewards: RewardSummary[]) => AprRewardSummary[];
50
+ export declare const getDedupedPerDayRewards: (filteredRewards: RewardSummary[]) => PerDayRewardSummary[];
51
+ export declare const getStakingYieldAprPercent: (side: Side, reserve: ParsedReserve, lstAprPercentMap: Record<string, BigNumber>) => BigNumber | undefined;
52
+ export declare const getTotalAprPercent: (side: Side, aprPercent: BigNumber, filteredRewards: RewardSummary[], stakingYieldAprPercent?: BigNumber) => BigNumber;
53
+ export declare const getNetAprPercent: (obligation: ParsedObligation, rewardMap: RewardMap, lstAprPercentMap: Record<string, BigNumber>) => BigNumber;
54
+ export {};
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getNetAprPercent = exports.getTotalAprPercent = exports.getStakingYieldAprPercent = exports.getDedupedPerDayRewards = exports.getDedupedAprRewards = exports.getFilteredRewards = exports.formatRewards = exports.getBorrowShare = exports.getDepositShare = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const lodash_1 = require("lodash");
9
+ const constants_1 = require("./constants");
10
+ const types_1 = require("./types");
11
+ const getDepositShare = (reserve, share) => share.div(10 ** reserve.mintDecimals).times(reserve.cTokenExchangeRate);
12
+ exports.getDepositShare = getDepositShare;
13
+ const getDepositShareUsd = (reserve, share) => (0, exports.getDepositShare)(reserve, share).times(reserve.price);
14
+ const getBorrowShare = (reserve, share) => share.div(10 ** reserve.mintDecimals).times(reserve.cumulativeBorrowRate);
15
+ exports.getBorrowShare = getBorrowShare;
16
+ const getBorrowShareUsd = (reserve, share) => (0, exports.getBorrowShare)(reserve, share).times(reserve.price);
17
+ const formatRewards = (parsedReserveMap, coinMetadataMap, priceMap, obligations) => {
18
+ const currentTime = new Date().getTime();
19
+ const rewardMap = {};
20
+ const getRewardSummary = (reserve, poolReward, side) => {
21
+ var _a;
22
+ const rewardCoinMetadata = coinMetadataMap[poolReward.coinType];
23
+ const rewardPrice = priceMap === null || priceMap === void 0 ? void 0 : priceMap[poolReward.coinType];
24
+ const isActive = currentTime >= poolReward.startTimeMs &&
25
+ currentTime < poolReward.endTimeMs;
26
+ const aprPercent = rewardPrice
27
+ ? poolReward.totalRewards
28
+ .times(rewardPrice)
29
+ .times(new bignumber_js_1.default(constants_1.msPerYear).div(poolReward.endTimeMs - poolReward.startTimeMs))
30
+ .div(side === types_1.Side.DEPOSIT
31
+ ? getDepositShareUsd(reserve, new bignumber_js_1.default(reserve.depositsPoolRewardManager.totalShares.toString()))
32
+ : getBorrowShareUsd(reserve, new bignumber_js_1.default(reserve.borrowsPoolRewardManager.totalShares.toString())))
33
+ .times(100)
34
+ : undefined;
35
+ const perDay = rewardPrice
36
+ ? undefined
37
+ : poolReward.totalRewards
38
+ .times(new bignumber_js_1.default(constants_1.msPerYear).div(poolReward.endTimeMs - poolReward.startTimeMs))
39
+ .div(365)
40
+ .div(side === types_1.Side.DEPOSIT
41
+ ? (0, exports.getDepositShare)(reserve, new bignumber_js_1.default(reserve.depositsPoolRewardManager.totalShares.toString()))
42
+ : (0, exports.getBorrowShare)(reserve, new bignumber_js_1.default(reserve.borrowsPoolRewardManager.totalShares.toString())));
43
+ return {
44
+ stats: {
45
+ id: poolReward.id,
46
+ isActive,
47
+ rewardIndex: poolReward.rewardIndex,
48
+ reserve,
49
+ rewardCoinType: poolReward.coinType,
50
+ mintDecimals: poolReward.mintDecimals,
51
+ price: rewardPrice,
52
+ symbol: rewardCoinMetadata.symbol,
53
+ iconUrl: rewardCoinMetadata.iconUrl,
54
+ aprPercent,
55
+ perDay,
56
+ side,
57
+ },
58
+ obligationClaims: Object.fromEntries((_a = obligations === null || obligations === void 0 ? void 0 : obligations.map((ob) => {
59
+ const claim = getObligationClaims(ob, poolReward, side === types_1.Side.DEPOSIT
60
+ ? reserve.depositsPoolRewardManager.id
61
+ : reserve.borrowsPoolRewardManager.id, reserve.arrayIndex);
62
+ if (!claim) {
63
+ return undefined;
64
+ }
65
+ return [ob.id, claim];
66
+ }).filter(Boolean)) !== null && _a !== void 0 ? _a : []),
67
+ };
68
+ };
69
+ Object.values(parsedReserveMap).forEach((reserve) => {
70
+ const depositRewards = reserve.depositsPoolRewardManager.poolRewards.map((poolReward) => getRewardSummary(reserve, poolReward, types_1.Side.DEPOSIT));
71
+ const borrowRewards = reserve.borrowsPoolRewardManager.poolRewards.map((poolReward) => getRewardSummary(reserve, poolReward, types_1.Side.BORROW));
72
+ rewardMap[reserve.coinType] = {
73
+ deposit: depositRewards,
74
+ borrow: borrowRewards,
75
+ };
76
+ });
77
+ return rewardMap;
78
+ };
79
+ exports.formatRewards = formatRewards;
80
+ const getObligationClaims = (obligation, poolReward, reservePoolManagerId, reserveArrayIndex) => {
81
+ const userRewardManager = obligation.original.userRewardManagers.find((urm) => urm.poolRewardManagerId === reservePoolManagerId);
82
+ if (!userRewardManager)
83
+ return;
84
+ const userReward = userRewardManager.rewards[poolReward.rewardIndex];
85
+ if (!userReward)
86
+ return;
87
+ return {
88
+ // TODO: earnedRewards is refreshed via simulate.ts to only show unclaimed rewards.
89
+ // Lifetime earned amount is not available right yet as a result.
90
+ claimableAmount: (userReward === null || userReward === void 0 ? void 0 : userReward.earnedRewards)
91
+ ? new bignumber_js_1.default(userReward.earnedRewards.value.toString())
92
+ .div(constants_1.WAD)
93
+ .div(10 ** poolReward.mintDecimals)
94
+ : new bignumber_js_1.default(0),
95
+ reserveArrayIndex,
96
+ };
97
+ };
98
+ const getFilteredRewards = (rewards) => rewards.filter((r) => r.stats.isActive);
99
+ exports.getFilteredRewards = getFilteredRewards;
100
+ const getDedupedAprRewards = (filteredRewards) => {
101
+ const aprRewards = filteredRewards.filter((r) => r.stats.aprPercent !== undefined);
102
+ const result = [];
103
+ for (const reward of aprRewards) {
104
+ const index = result.findIndex((r) => r.stats.rewardCoinType === reward.stats.rewardCoinType);
105
+ if (index > -1) {
106
+ result[index].stats.aprPercent = result[index].stats.aprPercent.plus(reward.stats.aprPercent);
107
+ }
108
+ else
109
+ result.push((0, lodash_1.cloneDeep)(reward));
110
+ }
111
+ return result;
112
+ };
113
+ exports.getDedupedAprRewards = getDedupedAprRewards;
114
+ const getDedupedPerDayRewards = (filteredRewards) => {
115
+ const perDayRewards = filteredRewards.filter((r) => r.stats.perDay !== undefined);
116
+ const result = [];
117
+ for (const reward of perDayRewards) {
118
+ const index = result.findIndex((r) => r.stats.rewardCoinType === reward.stats.rewardCoinType);
119
+ if (index > -1) {
120
+ result[index].stats.perDay = result[index].stats.perDay.plus(reward.stats.perDay);
121
+ }
122
+ else
123
+ result.push((0, lodash_1.cloneDeep)(reward));
124
+ }
125
+ return result;
126
+ };
127
+ exports.getDedupedPerDayRewards = getDedupedPerDayRewards;
128
+ const getRewardsAprPercent = (side, filteredRewards) => (0, exports.getDedupedAprRewards)(filteredRewards).reduce((acc, reward) => acc.plus(reward.stats.aprPercent.times(side === types_1.Side.DEPOSIT ? 1 : -1)), new bignumber_js_1.default(0));
129
+ const getStakingYieldAprPercent = (side, reserve, lstAprPercentMap) => (side === types_1.Side.DEPOSIT ? lstAprPercentMap[reserve.coinType] : undefined);
130
+ exports.getStakingYieldAprPercent = getStakingYieldAprPercent;
131
+ const getTotalAprPercent = (side, aprPercent, filteredRewards, stakingYieldAprPercent) => aprPercent
132
+ .plus(getRewardsAprPercent(side, filteredRewards))
133
+ .plus(stakingYieldAprPercent !== null && stakingYieldAprPercent !== void 0 ? stakingYieldAprPercent : 0);
134
+ exports.getTotalAprPercent = getTotalAprPercent;
135
+ const getNetAprPercent = (obligation, rewardMap, lstAprPercentMap) => {
136
+ const weightedDepositedAmountUsd_aprPercent = obligation.deposits.reduce((acc, deposit) => {
137
+ var _a;
138
+ const weightedDepositedAmountUsd_baseAprPercent = deposit.reserve.depositAprPercent.times(deposit.depositedAmountUsd);
139
+ const weightedDepositedAmountUsd_stakingYieldAprPercent = new bignumber_js_1.default((_a = (0, exports.getStakingYieldAprPercent)(types_1.Side.DEPOSIT, deposit.reserve, lstAprPercentMap)) !== null && _a !== void 0 ? _a : 0).times(deposit.depositedAmountUsd);
140
+ const weightedDepositedAmountUsd_rewardsAprPercent = getRewardsAprPercent(types_1.Side.DEPOSIT, (0, exports.getFilteredRewards)(rewardMap[deposit.reserve.coinType].deposit)).times(getDepositShareUsd(deposit.reserve, new bignumber_js_1.default(deposit.userRewardManager.share.toString())));
141
+ return acc
142
+ .plus(weightedDepositedAmountUsd_baseAprPercent)
143
+ .plus(weightedDepositedAmountUsd_stakingYieldAprPercent)
144
+ .plus(weightedDepositedAmountUsd_rewardsAprPercent);
145
+ }, new bignumber_js_1.default(0));
146
+ const weightedBorrowedAmountUsd_aprPercent = obligation.borrows.reduce((acc, borrow) => {
147
+ const weightedBorrowedAmountUsd_baseAprPercent = borrow.reserve.borrowAprPercent.times(borrow.borrowedAmountUsd);
148
+ const weightedBorrowedAmountUsd_rewardsAprPercent = getRewardsAprPercent(types_1.Side.BORROW, (0, exports.getFilteredRewards)(rewardMap[borrow.reserve.coinType].borrow)).times(getBorrowShareUsd(borrow.reserve, new bignumber_js_1.default(borrow.userRewardManager.share.toString())));
149
+ return acc
150
+ .plus(weightedBorrowedAmountUsd_baseAprPercent)
151
+ .plus(weightedBorrowedAmountUsd_rewardsAprPercent);
152
+ }, new bignumber_js_1.default(0));
153
+ const aprPercentWeightedNetValueUsd = weightedDepositedAmountUsd_aprPercent.minus(weightedBorrowedAmountUsd_aprPercent);
154
+ return !obligation.netValueUsd.eq(0)
155
+ ? aprPercentWeightedNetValueUsd.div(obligation.netValueUsd)
156
+ : new bignumber_js_1.default(0);
157
+ };
158
+ exports.getNetAprPercent = getNetAprPercent;
@@ -0,0 +1,8 @@
1
+ import { Transaction, TransactionResult } from "@mysten/sui/transactions";
2
+ import { ObligationOwnerCap } from "../_generated/suilend/lending-market/structs";
3
+ import { SuilendClient } from "../client";
4
+ export declare const createObligationIfNoneExists: (suilendClient: SuilendClient, transaction: Transaction, obligationOwnerCap?: ObligationOwnerCap<string>) => {
5
+ obligationOwnerCapId: string | TransactionResult;
6
+ didCreate: boolean;
7
+ };
8
+ export declare const sendObligationToUser: (obligationOwnerCapId: string | TransactionResult, address: string, transaction: Transaction) => void;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendObligationToUser = exports.createObligationIfNoneExists = void 0;
4
+ const createObligationIfNoneExists = (suilendClient, transaction, obligationOwnerCap) => {
5
+ let obligationOwnerCapId;
6
+ let didCreate = false;
7
+ if (obligationOwnerCap)
8
+ obligationOwnerCapId = obligationOwnerCap.id;
9
+ else {
10
+ obligationOwnerCapId = suilendClient.createObligation(transaction);
11
+ didCreate = true;
12
+ }
13
+ return { obligationOwnerCapId, didCreate };
14
+ };
15
+ exports.createObligationIfNoneExists = createObligationIfNoneExists;
16
+ const sendObligationToUser = (obligationOwnerCapId, address, transaction) => {
17
+ transaction.transferObjects([obligationOwnerCapId], transaction.pure.address(address));
18
+ };
19
+ exports.sendObligationToUser = sendObligationToUser;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@suilend/sdk","version":"1.1.31","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","./constants":"./constants.js","./types":"./types.js","./api/events":"./api/events.js","./api":"./api/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","./utils/events":"./utils/events.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","./_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","./_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/i64/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/i64/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-feed/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-feed/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-info/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-info/structs.js"},"types":"./index.js","scripts":{"build":"rm -rf ./dist && bun tsc","eslint":"eslint --fix \"./src/**/*.ts\"","prettier":"prettier --write \"./src/**/*\"","lint":"bun eslint && bun prettier && bun tsc --noEmit","release":"bun run build && bun ts-node ./release.ts && cd ./dist && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/solendprotocol/suilend-public.git"},"bugs":{"url":"https://github.com/solendprotocol/suilend-public/issues"},"dependencies":{"@mysten/bcs":"1.2.1","@mysten/sui":"1.20.0","@pythnetwork/pyth-sui-js":"^2.1.0","bignumber.js":"^9.1.2","p-limit":"3.1.0","uuid":"^11.0.3"},"devDependencies":{"ts-node":"^10.9.2"}}
1
+ {"name":"@suilend/sdk","version":"1.1.32","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","./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/transactions":"./lib/transactions.js","./lib/types":"./lib/types.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","./utils/events":"./utils/events.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","./_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","./_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/i64/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/i64/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-feed/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-feed/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-identifier/structs.js","./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-info/structs":"./_generated/_dependencies/source/0x8d97f1cd6ac663735be08d1d2b6d02a159e711586461306ce60a2b7a6a565a9e/price-info/structs.js"},"types":"./index.js","scripts":{"build":"rm -rf ./dist && bun tsc","eslint":"eslint --fix \"./src/**/*.ts\"","prettier":"prettier --write \"./src/**/*\"","lint":"bun eslint && bun prettier && bun tsc --noEmit","release":"bun run build && bun ts-node ./release.ts && cd ./dist && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/solendprotocol/suilend-public.git"},"bugs":{"url":"https://github.com/solendprotocol/suilend-public/issues"},"dependencies":{"@mysten/bcs":"1.2.1","@mysten/sui":"1.20.0","@pythnetwork/pyth-sui-js":"^2.1.0","@suilend/frontend-sui":"^0.2.32","bignumber.js":"^9.1.2","p-limit":"3.1.0","uuid":"^11.0.3"},"devDependencies":{"ts-node":"^10.9.2"}}
@@ -1,5 +1,5 @@
1
1
  import BigNumber from "bignumber.js";
2
- import { ApiReserveAssetDataEvent, DownsampledApiReserveAssetDataEvent } from "../types";
2
+ import { ApiReserveAssetDataEvent, DownsampledApiReserveAssetDataEvent } from "../lib/types";
3
3
  import { ParsedReserve } from "./reserve";
4
4
  export type ParsedReserveAssetDataEvent = ReturnType<typeof parseReserveAssetDataEvent>;
5
5
  export declare const parseReserveAssetDataEvent: (event: ApiReserveAssetDataEvent, reserve: ParsedReserve) => {
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.parseDownsampledApiReserveAssetDataEvent = exports.parseReserveAssetDataEvent = void 0;
7
7
  const utils_1 = require("@mysten/sui/utils");
8
8
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
- const constants_1 = require("../constants");
9
+ const constants_1 = require("../lib/constants");
10
10
  const parseReserveAssetDataEvent = (event, reserve) => {
11
11
  const availableAmount = new bignumber_js_1.default(event.availableAmount)
12
12
  .div(constants_1.WAD)
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.parseObligation = void 0;
7
7
  const utils_1 = require("@mysten/sui/utils");
8
8
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
- const constants_1 = require("../constants");
9
+ const constants_1 = require("../lib/constants");
10
10
  const parseObligation = (obligation, parsedReserveMap) => {
11
11
  let totalDepositedAmountUsd = new bignumber_js_1.default(0);
12
12
  let totalBorrowedAmountUsd = new bignumber_js_1.default(0);
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.parseRateLimiterConfig = exports.parseRateLimiter = void 0;
7
7
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
- const constants_1 = require("../constants");
8
+ const constants_1 = require("../lib/constants");
9
9
  const parseRateLimiter = (rateLimiter, currentTime) => {
10
10
  const config = (0, exports.parseRateLimiterConfig)(rateLimiter);
11
11
  const $typeName = rateLimiter.$typeName;
@@ -40,7 +40,7 @@ exports.parsePoolReward = exports.parsePoolRewardManager = exports.parseReserveC
40
40
  const utils_1 = require("@mysten/sui/utils");
41
41
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
42
42
  const uuid_1 = require("uuid");
43
- const constants_1 = require("../constants");
43
+ const constants_1 = require("../lib/constants");
44
44
  const utils_2 = require("../utils");
45
45
  const simulate = __importStar(require("../utils/simulate"));
46
46
  const parseReserve = (reserve, coinMetadataMap) => {
package/utils/index.d.ts CHANGED
@@ -6,5 +6,3 @@ export * from "./simulate";
6
6
  export declare const toHexString: (bytes: number[]) => string;
7
7
  export declare const reserveSort: (reserves: ParsedReserve[], aCoinType: string, bCoinType: string) => number;
8
8
  export declare const linearlyInterpolate: (array: any[], xKey: string, yKey: string, _xValue: number | BigNumber) => BigNumber;
9
- export declare const isCTokenCoinType: (coinType: string) => boolean;
10
- export declare const extractCTokenCoinType: (coinType: string) => string;
package/utils/index.js CHANGED
@@ -17,8 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.extractCTokenCoinType = exports.isCTokenCoinType = exports.linearlyInterpolate = exports.reserveSort = exports.toHexString = void 0;
21
- const utils_1 = require("@mysten/sui/utils");
20
+ exports.linearlyInterpolate = exports.reserveSort = exports.toHexString = void 0;
22
21
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
23
22
  __exportStar(require("./events"), exports);
24
23
  __exportStar(require("./obligation"), exports);
@@ -56,11 +55,3 @@ const linearlyInterpolate = (array, xKey, yKey, _xValue) => {
56
55
  return new bignumber_js_1.default(0);
57
56
  };
58
57
  exports.linearlyInterpolate = linearlyInterpolate;
59
- const isCTokenCoinType = (coinType) => coinType.includes("::reserve::CToken<") && coinType.endsWith(">");
60
- exports.isCTokenCoinType = isCTokenCoinType;
61
- const extractCTokenCoinType = (coinType) => {
62
- if (!(0, exports.isCTokenCoinType)(coinType))
63
- throw new Error("Not a CToken");
64
- return (0, utils_1.normalizeStructTag)(coinType.split("::reserve::CToken")[1].split(",")[1].slice(0, -1));
65
- };
66
- exports.extractCTokenCoinType = extractCTokenCoinType;
package/utils/simulate.js CHANGED
@@ -19,7 +19,7 @@ const bignumber_js_1 = __importDefault(require("bignumber.js"));
19
19
  const uuid_1 = require("uuid");
20
20
  const structs_1 = require("../_generated/suilend/decimal/structs");
21
21
  const structs_2 = require("../_generated/suilend/liquidity-mining/structs");
22
- const constants_1 = require("../constants");
22
+ const constants_1 = require("../lib/constants");
23
23
  const utils_2 = require("../utils");
24
24
  /**
25
25
  * @deprecated since version 1.0.8. Use `calculateUtilizationPercent` instead.
File without changes
File without changes