@suilend/sdk 1.1.83 → 1.1.84

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/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./api";
2
2
  export * from "./lib";
3
3
  export * from "./parsers";
4
+ export * from "./strategies";
4
5
  export * from "./swap";
5
6
  export * from "./utils";
6
7
  export * from "./client";
package/index.js CHANGED
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./api"), exports);
18
18
  __exportStar(require("./lib"), exports);
19
19
  __exportStar(require("./parsers"), exports);
20
+ __exportStar(require("./strategies"), exports);
20
21
  __exportStar(require("./swap"), exports);
21
22
  __exportStar(require("./utils"), exports);
22
23
  __exportStar(require("./client"), exports);
@@ -29,7 +29,7 @@ export declare const STRATEGY_TYPE_INFO_MAP: Record<StrategyType, {
29
29
  export declare const strategyDeposit: (coin: TransactionObjectInput, coinType: string, strategyOwnerCap: TransactionObjectInput, reserveArrayIndex: bigint, transaction: Transaction) => TransactionResult;
30
30
  export declare const strategyBorrow: (coinType: string, strategyOwnerCap: TransactionObjectInput, reserveArrayIndex: bigint, value: bigint, transaction: Transaction) => TransactionResult;
31
31
  export declare const strategyWithdraw: (coinType: string, strategyOwnerCap: TransactionObjectInput, reserveArrayIndex: bigint, value: bigint, transaction: Transaction) => TransactionResult;
32
- export declare const strategyClaimRewardsAndSwapForCoinType: (address: string, cetusSdk: CetusSdk, cetusPartnerId: string, rewardsMap: RewardsMap, depositReserve: ParsedReserve, strategyOwnerCap: TransactionObjectInput, isDepositing: boolean, transaction: Transaction) => Promise<void>;
32
+ export declare const strategyClaimRewardsAndSwapForCoinType: (address: string, cetusSdk: CetusSdk, cetusPartnerId: string, rewardsMap: RewardsMap, rewardPriceMap: Record<string, BigNumber | undefined>, depositReserve: ParsedReserve, strategyOwnerCap: TransactionObjectInput, isDepositing: boolean, transaction: Transaction) => Promise<void>;
33
33
  export declare const strategySwapSomeDepositsForCoinType: (strategyType: StrategyType, cetusSdk: CetusSdk, cetusPartnerId: string, obligation: ParsedObligation, noSwapCoinTypes: string[], // coinTypes to not swap for depositReserve.coinType
34
34
  swapPercent: BigNumber, // percent of deposit to swap for depositReserve.coinType (0-100)
35
35
  depositReserve: ParsedReserve, strategyOwnerCap: TransactionObjectInput, transaction: Transaction) => Promise<void>;
@@ -204,9 +204,15 @@ const strategyClaimRewardsAndMergeCoins = (rewardsMap, strategyOwnerCap, transac
204
204
  }
205
205
  return mergedCoinsMap;
206
206
  };
207
- const strategyClaimRewardsAndSwapForCoinType = (address, cetusSdk, cetusPartnerId, rewardsMap, depositReserve, strategyOwnerCap, isDepositing, transaction) => __awaiter(void 0, void 0, void 0, function* () {
207
+ const strategyClaimRewardsAndSwapForCoinType = (address, cetusSdk, cetusPartnerId, rewardsMap, rewardPriceMap, depositReserve, strategyOwnerCap, isDepositing, transaction) => __awaiter(void 0, void 0, void 0, function* () {
208
+ const filteredRewardsMap = Object.fromEntries(Object.entries(rewardsMap).filter(([coinType]) => {
209
+ var _a;
210
+ return ((_a = rewardPriceMap[coinType]) !== null && _a !== void 0 ? _a : new bignumber_js_1.default(0))
211
+ .times(rewardsMap[coinType].amount)
212
+ .gte(0.01);
213
+ }));
208
214
  // 1) Claim rewards and merge coins
209
- const mergedCoinsMap = strategyClaimRewardsAndMergeCoins(rewardsMap, strategyOwnerCap, transaction);
215
+ const mergedCoinsMap = strategyClaimRewardsAndMergeCoins(filteredRewardsMap, strategyOwnerCap, transaction);
210
216
  // 2) Prepare
211
217
  const nonSwappedCoinTypes = Object.keys(mergedCoinsMap).filter((coinType) => coinType === depositReserve.coinType);
212
218
  const swappedCoinTypes = Object.keys(mergedCoinsMap).filter((coinType) => coinType !== depositReserve.coinType);
@@ -224,7 +230,7 @@ const strategyClaimRewardsAndSwapForCoinType = (address, cetusSdk, cetusPartnerI
224
230
  .filter(([coinType]) => swappedCoinTypes.includes(coinType))
225
231
  .map(([coinType, coin]) => (() => __awaiter(void 0, void 0, void 0, function* () {
226
232
  // Get amount
227
- const { rawAmount: amount } = rewardsMap[coinType]; // Use underestimate (rewards keep accruing)
233
+ const { rawAmount: amount } = filteredRewardsMap[coinType]; // Use underestimate (rewards keep accruing)
228
234
  // Get routes
229
235
  const routers = yield cetusSdk.findRouters({
230
236
  from: coinType,
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@suilend/sdk","version":"1.1.83","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/strategyOwnerCap":"./lib/strategyOwnerCap.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","./swap":"./swap/index.js","./swap/quote":"./swap/quote.js","./swap/transaction":"./swap/transaction.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/suilend/suilend-fe-public.git"},"bugs":{"url":"https://github.com/suilend/suilend-fe-public/issues"},"dependencies":{"@7kprotocol/sdk-ts":"^3.4.1","@cetusprotocol/aggregator-sdk":"^1.2.1","@flowx-finance/sdk":"^1.13.4","@pythnetwork/pyth-sui-js":"^2.2.0","aftermath-ts-sdk":"^1.3.22","bignumber.js":"^9.1.2","bn.js":"^5.2.2","crypto-js":"^4.2.0","lodash":"^4.17.21","p-limit":"3.1.0","uuid":"^11.0.3"},"devDependencies":{"@types/bn.js":"^5.2.0","@types/lodash":"^4.17.20","ts-node":"^10.9.2"},"peerDependencies":{"@mysten/bcs":"1.6.0","@mysten/sui":"1.28.2","@suilend/sui-fe":"^0.3.29"},"overrides":{"chalk":"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}}
1
+ {"name":"@suilend/sdk","version":"1.1.84","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","./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/strategyOwnerCap":"./lib/strategyOwnerCap.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","./swap":"./swap/index.js","./swap/quote":"./swap/quote.js","./swap/transaction":"./swap/transaction.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/suilend/suilend-fe-public.git"},"bugs":{"url":"https://github.com/suilend/suilend-fe-public/issues"},"dependencies":{"@7kprotocol/sdk-ts":"^3.4.1","@cetusprotocol/aggregator-sdk":"^1.2.1","@flowx-finance/sdk":"^1.13.4","@pythnetwork/pyth-sui-js":"^2.2.0","@suilend/springsui-sdk":"^1.0.26","aftermath-ts-sdk":"^1.3.22","bignumber.js":"^9.1.2","bn.js":"^5.2.2","crypto-js":"^4.2.0","lodash":"^4.17.21","p-limit":"3.1.0","uuid":"^11.0.3"},"devDependencies":{"@types/bn.js":"^5.2.0","@types/lodash":"^4.17.20","ts-node":"^10.9.2"},"peerDependencies":{"@mysten/bcs":"1.6.0","@mysten/sui":"1.28.2","@suilend/sui-fe":"^0.3.29"},"overrides":{"chalk":"5.3.0","strip-ansi":"7.1.0","color-convert":"2.0.1","color-name":"1.1.4","is-core-module":"2.13.1","error-ex":"1.3.2","has-ansi":"5.0.1"}}
@@ -0,0 +1,263 @@
1
+ import { CoinMetadata, SuiClient } from "@mysten/sui/client";
2
+ import BigNumber from "bignumber.js";
3
+ import { LstClient } from "@suilend/springsui-sdk";
4
+ import { LiquidStakingInfo } from "@suilend/springsui-sdk/_generated/liquid_staking/liquid-staking/structs";
5
+ import { RewardMap } from "./lib/liquidityMining";
6
+ import { StrategyType } from "./lib/strategyOwnerCap";
7
+ import { ParsedObligation, ParsedReserve } from "./parsers";
8
+ export declare const STRATEGY_E: number;
9
+ export declare const LST_DECIMALS = 9;
10
+ export type StrategyDeposit = {
11
+ coinType: string;
12
+ depositedAmount: BigNumber;
13
+ };
14
+ export type StrategyWithdraw = {
15
+ coinType: string;
16
+ withdrawnAmount: BigNumber;
17
+ };
18
+ export declare const addOrInsertStrategyDeposit: (_deposits: StrategyDeposit[], deposit: StrategyDeposit) => StrategyDeposit[];
19
+ export declare const hasStrategyPosition: (obligation: ParsedObligation) => boolean;
20
+ export declare const getStrategySuiReserve: (reserveMap: Record<string, ParsedReserve>) => {
21
+ config: {
22
+ $typeName: string;
23
+ openLtvPct: number;
24
+ closeLtvPct: number;
25
+ maxCloseLtvPct: number;
26
+ borrowWeightBps: BigNumber;
27
+ depositLimit: BigNumber;
28
+ borrowLimit: BigNumber;
29
+ liquidationBonusBps: number;
30
+ maxLiquidationBonusBps: number;
31
+ depositLimitUsd: BigNumber;
32
+ borrowLimitUsd: BigNumber;
33
+ borrowFeeBps: number;
34
+ spreadFeeBps: number;
35
+ protocolLiquidationFeeBps: number;
36
+ isolated: boolean;
37
+ openAttributedBorrowLimitUsd: number;
38
+ closeAttributedBorrowLimitUsd: number;
39
+ interestRate: {
40
+ id: string;
41
+ utilPercent: BigNumber;
42
+ aprPercent: BigNumber;
43
+ }[];
44
+ };
45
+ $typeName: string;
46
+ id: string;
47
+ arrayIndex: bigint;
48
+ coinType: string;
49
+ mintDecimals: number;
50
+ priceIdentifier: string;
51
+ price: BigNumber;
52
+ smoothedPrice: BigNumber;
53
+ minPrice: BigNumber;
54
+ maxPrice: BigNumber;
55
+ priceLastUpdateTimestampS: bigint;
56
+ availableAmount: BigNumber;
57
+ ctokenSupply: BigNumber;
58
+ borrowedAmount: BigNumber;
59
+ cumulativeBorrowRate: BigNumber;
60
+ interestLastUpdateTimestampS: bigint;
61
+ unclaimedSpreadFees: BigNumber;
62
+ attributedBorrowValue: BigNumber;
63
+ depositsPoolRewardManager: {
64
+ $typeName: string;
65
+ id: string;
66
+ totalShares: bigint;
67
+ poolRewards: {
68
+ $typeName: string;
69
+ id: string;
70
+ poolRewardManagerId: string;
71
+ coinType: string;
72
+ startTimeMs: number;
73
+ endTimeMs: number;
74
+ totalRewards: BigNumber;
75
+ allocatedRewards: BigNumber;
76
+ cumulativeRewardsPerShare: BigNumber;
77
+ numUserRewardManagers: bigint;
78
+ rewardIndex: number;
79
+ symbol: string;
80
+ mintDecimals: number;
81
+ }[];
82
+ lastUpdateTimeMs: bigint;
83
+ };
84
+ borrowsPoolRewardManager: {
85
+ $typeName: string;
86
+ id: string;
87
+ totalShares: bigint;
88
+ poolRewards: {
89
+ $typeName: string;
90
+ id: string;
91
+ poolRewardManagerId: string;
92
+ coinType: string;
93
+ startTimeMs: number;
94
+ endTimeMs: number;
95
+ totalRewards: BigNumber;
96
+ allocatedRewards: BigNumber;
97
+ cumulativeRewardsPerShare: BigNumber;
98
+ numUserRewardManagers: bigint;
99
+ rewardIndex: number;
100
+ symbol: string;
101
+ mintDecimals: number;
102
+ }[];
103
+ lastUpdateTimeMs: bigint;
104
+ };
105
+ availableAmountUsd: BigNumber;
106
+ borrowedAmountUsd: BigNumber;
107
+ depositedAmount: BigNumber;
108
+ depositedAmountUsd: BigNumber;
109
+ cTokenExchangeRate: BigNumber;
110
+ borrowAprPercent: BigNumber;
111
+ depositAprPercent: BigNumber;
112
+ utilizationPercent: BigNumber;
113
+ token: {
114
+ decimals: number;
115
+ description: string;
116
+ iconUrl?: string | null;
117
+ id?: string | null;
118
+ name: string;
119
+ symbol: string;
120
+ coinType: string;
121
+ };
122
+ symbol: string;
123
+ name: string;
124
+ iconUrl: string | null | undefined;
125
+ description: string;
126
+ totalDeposits: BigNumber;
127
+ };
128
+ export type StrategyLstMap = Record<string, {
129
+ client: LstClient;
130
+ liquidStakingInfo: LiquidStakingInfo<string>;
131
+ mintFeePercent: BigNumber;
132
+ redeemFeePercent: BigNumber;
133
+ suiToLstExchangeRate: BigNumber;
134
+ lstToSuiExchangeRate: BigNumber;
135
+ }>;
136
+ export declare const fetchStrategyLstMap: (suiClient: SuiClient) => Promise<StrategyLstMap | undefined>;
137
+ export declare const getStrategyLstMintFee: (lstMap: StrategyLstMap, lstCoinType: string, suiAmount: BigNumber) => BigNumber;
138
+ export declare const getStrategyLstRedeemFee: (lstMap: StrategyLstMap, lstCoinType: string, lstAmount: BigNumber) => BigNumber;
139
+ export declare const STRATEGY_TYPE_EXPOSURE_MAP: Record<StrategyType, {
140
+ min: BigNumber;
141
+ max: BigNumber;
142
+ default: BigNumber;
143
+ }>;
144
+ export declare const getStrategyDepositReserves: (reserveMap: Record<string, ParsedReserve>, strategyType: StrategyType) => {
145
+ base?: ParsedReserve;
146
+ lst?: ParsedReserve;
147
+ };
148
+ export declare const getStrategyBorrowReserve: (reserveMap: Record<string, ParsedReserve>, strategyType: StrategyType) => ParsedReserve;
149
+ export declare const getStrategyDefaultCurrencyReserve: (reserveMap: Record<string, ParsedReserve>, strategyType: StrategyType) => {
150
+ config: {
151
+ $typeName: string;
152
+ openLtvPct: number;
153
+ closeLtvPct: number;
154
+ maxCloseLtvPct: number;
155
+ borrowWeightBps: BigNumber;
156
+ depositLimit: BigNumber;
157
+ borrowLimit: BigNumber;
158
+ liquidationBonusBps: number;
159
+ maxLiquidationBonusBps: number;
160
+ depositLimitUsd: BigNumber;
161
+ borrowLimitUsd: BigNumber;
162
+ borrowFeeBps: number;
163
+ spreadFeeBps: number;
164
+ protocolLiquidationFeeBps: number;
165
+ isolated: boolean;
166
+ openAttributedBorrowLimitUsd: number;
167
+ closeAttributedBorrowLimitUsd: number;
168
+ interestRate: {
169
+ id: string;
170
+ utilPercent: BigNumber;
171
+ aprPercent: BigNumber;
172
+ }[];
173
+ };
174
+ $typeName: string;
175
+ id: string;
176
+ arrayIndex: bigint;
177
+ coinType: string;
178
+ mintDecimals: number;
179
+ priceIdentifier: string;
180
+ price: BigNumber;
181
+ smoothedPrice: BigNumber;
182
+ minPrice: BigNumber;
183
+ maxPrice: BigNumber;
184
+ priceLastUpdateTimestampS: bigint;
185
+ availableAmount: BigNumber;
186
+ ctokenSupply: BigNumber;
187
+ borrowedAmount: BigNumber;
188
+ cumulativeBorrowRate: BigNumber;
189
+ interestLastUpdateTimestampS: bigint;
190
+ unclaimedSpreadFees: BigNumber;
191
+ attributedBorrowValue: BigNumber;
192
+ depositsPoolRewardManager: {
193
+ $typeName: string;
194
+ id: string;
195
+ totalShares: bigint;
196
+ poolRewards: {
197
+ $typeName: string;
198
+ id: string;
199
+ poolRewardManagerId: string;
200
+ coinType: string;
201
+ startTimeMs: number;
202
+ endTimeMs: number;
203
+ totalRewards: BigNumber;
204
+ allocatedRewards: BigNumber;
205
+ cumulativeRewardsPerShare: BigNumber;
206
+ numUserRewardManagers: bigint;
207
+ rewardIndex: number;
208
+ symbol: string;
209
+ mintDecimals: number;
210
+ }[];
211
+ lastUpdateTimeMs: bigint;
212
+ };
213
+ borrowsPoolRewardManager: {
214
+ $typeName: string;
215
+ id: string;
216
+ totalShares: bigint;
217
+ poolRewards: {
218
+ $typeName: string;
219
+ id: string;
220
+ poolRewardManagerId: string;
221
+ coinType: string;
222
+ startTimeMs: number;
223
+ endTimeMs: number;
224
+ totalRewards: BigNumber;
225
+ allocatedRewards: BigNumber;
226
+ cumulativeRewardsPerShare: BigNumber;
227
+ numUserRewardManagers: bigint;
228
+ rewardIndex: number;
229
+ symbol: string;
230
+ mintDecimals: number;
231
+ }[];
232
+ lastUpdateTimeMs: bigint;
233
+ };
234
+ availableAmountUsd: BigNumber;
235
+ borrowedAmountUsd: BigNumber;
236
+ depositedAmount: BigNumber;
237
+ depositedAmountUsd: BigNumber;
238
+ cTokenExchangeRate: BigNumber;
239
+ borrowAprPercent: BigNumber;
240
+ depositAprPercent: BigNumber;
241
+ utilizationPercent: BigNumber;
242
+ token: {
243
+ decimals: number;
244
+ description: string;
245
+ iconUrl?: string | null;
246
+ id?: string | null;
247
+ name: string;
248
+ symbol: string;
249
+ coinType: string;
250
+ };
251
+ symbol: string;
252
+ name: string;
253
+ iconUrl: string | null | undefined;
254
+ description: string;
255
+ totalDeposits: BigNumber;
256
+ };
257
+ export declare const getStrategySimulatedObligation: (reserveMap: Record<string, ParsedReserve>, lstMap: StrategyLstMap, strategyType: StrategyType, deposits: StrategyDeposit[], _borrowedAmount: BigNumber) => ParsedObligation;
258
+ export declare const getStrategyDepositedAmount: (reserveMap: Record<string, ParsedReserve>, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber;
259
+ export declare const getStrategyBorrowedAmount: (reserveMap: Record<string, ParsedReserve>, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber;
260
+ export declare const getStrategyTvlAmount: (reserveMap: Record<string, ParsedReserve>, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber;
261
+ export declare const getStrategyExposure: (reserveMap: Record<string, ParsedReserve>, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber;
262
+ export declare const fetchStrategyGlobalTvlAmountUsdMap: () => Promise<Record<StrategyType, BigNumber | null> | undefined>;
263
+ export declare const getStrategyUnclaimedRewardsAmount: (reserveMap: Record<string, ParsedReserve>, rewardPriceMap: Record<string, BigNumber | undefined>, rewardCoinMetadataMap: Record<string, CoinMetadata>, rewardMap: RewardMap, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber;
package/strategies.js ADDED
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getStrategyUnclaimedRewardsAmount = exports.fetchStrategyGlobalTvlAmountUsdMap = exports.getStrategyExposure = exports.getStrategyTvlAmount = exports.getStrategyBorrowedAmount = exports.getStrategyDepositedAmount = exports.getStrategySimulatedObligation = exports.getStrategyDefaultCurrencyReserve = exports.getStrategyBorrowReserve = exports.getStrategyDepositReserves = exports.STRATEGY_TYPE_EXPOSURE_MAP = exports.getStrategyLstRedeemFee = exports.getStrategyLstMintFee = exports.fetchStrategyLstMap = exports.getStrategySuiReserve = exports.hasStrategyPosition = exports.addOrInsertStrategyDeposit = exports.LST_DECIMALS = exports.STRATEGY_E = void 0;
16
+ const utils_1 = require("@mysten/sui/utils");
17
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
18
+ const lodash_1 = require("lodash");
19
+ const springsui_sdk_1 = require("@suilend/springsui-sdk");
20
+ const sui_fe_1 = require("@suilend/sui-fe");
21
+ const liquidityMining_1 = require("./lib/liquidityMining");
22
+ const strategyOwnerCap_1 = require("./lib/strategyOwnerCap");
23
+ exports.STRATEGY_E = 10 ** -7;
24
+ exports.LST_DECIMALS = 9;
25
+ const addOrInsertStrategyDeposit = (_deposits, deposit) => {
26
+ const deposits = (0, lodash_1.cloneDeep)(_deposits);
27
+ const existingDeposit = deposits.find((d) => d.coinType === deposit.coinType);
28
+ if (existingDeposit)
29
+ existingDeposit.depositedAmount = existingDeposit.depositedAmount.plus(deposit.depositedAmount);
30
+ else
31
+ deposits.push(deposit);
32
+ return deposits;
33
+ };
34
+ exports.addOrInsertStrategyDeposit = addOrInsertStrategyDeposit;
35
+ // Obligations
36
+ const hasStrategyPosition = (obligation) => obligation.deposits.length > 0;
37
+ exports.hasStrategyPosition = hasStrategyPosition;
38
+ // SUI
39
+ const getStrategySuiReserve = (
40
+ // AppContext
41
+ reserveMap) => reserveMap[sui_fe_1.NORMALIZED_SUI_COINTYPE];
42
+ exports.getStrategySuiReserve = getStrategySuiReserve;
43
+ const fetchStrategyLstMap = (suiClient) => __awaiter(void 0, void 0, void 0, function* () {
44
+ try {
45
+ const lstCoinTypes = Array.from(new Set([
46
+ ...Object.values(strategyOwnerCap_1.STRATEGY_TYPE_INFO_MAP)
47
+ .map(({ depositLstCoinType }) => depositLstCoinType)
48
+ .filter(Boolean),
49
+ // LSTs that will be/are/have been used as rewards
50
+ sui_fe_1.NORMALIZED_sSUI_COINTYPE,
51
+ ]));
52
+ const publishedAt = yield (0, springsui_sdk_1.getLatestPackageId)(suiClient, springsui_sdk_1.SPRING_SUI_UPGRADE_CAP_ID);
53
+ const lstInfoUrl = `${sui_fe_1.API_URL}/springsui/lst-info?${new URLSearchParams({
54
+ coinTypes: lstCoinTypes.join(","),
55
+ })}`;
56
+ const lstInfoRes = yield fetch(lstInfoUrl);
57
+ const lstInfoJson = yield lstInfoRes.json();
58
+ if ((lstInfoRes === null || lstInfoRes === void 0 ? void 0 : lstInfoRes.statusCode) === 500)
59
+ throw new Error("Failed to fetch LST info");
60
+ const lstInfoMap = Object.fromEntries(Object.entries(lstInfoJson).map(([lstCoinType, lstInfo]) => {
61
+ return [lstCoinType, lstInfo];
62
+ }));
63
+ const result = Object.fromEntries(yield Promise.all(lstCoinTypes.map((lstCoinType) => __awaiter(void 0, void 0, void 0, function* () {
64
+ var _a, _b, _c, _d;
65
+ const lstInfo = lstInfoMap[lstCoinType];
66
+ const lstClient = yield springsui_sdk_1.LstClient.initialize(suiClient, lstInfo.LIQUID_STAKING_INFO, publishedAt);
67
+ const mintFeePercent = new bignumber_js_1.default((_b = (_a = lstInfo.liquidStakingInfo.feeConfig.element) === null || _a === void 0 ? void 0 : _a.suiMintFeeBps.toString()) !== null && _b !== void 0 ? _b : 0).div(100);
68
+ const redeemFeePercent = new bignumber_js_1.default((_d = (_c = lstInfo.liquidStakingInfo.feeConfig.element) === null || _c === void 0 ? void 0 : _c.redeemFeeBps.toString()) !== null && _d !== void 0 ? _d : 0).div(100);
69
+ const res = yield fetch(`${sui_fe_1.API_URL}/springsui/historical-rates?coinType=${lstCoinType}&timestamps=${Math.floor(Date.now() / 1000)}`);
70
+ const json = yield res.json();
71
+ if ((json === null || json === void 0 ? void 0 : json.statusCode) === 500)
72
+ throw new Error(`Failed to fetch historical LST to SUI exchange rates for ${lstCoinType}`);
73
+ const suiToLstExchangeRate = !new bignumber_js_1.default(json[0].value).eq(0)
74
+ ? new bignumber_js_1.default(1).div(new bignumber_js_1.default(json[0].value))
75
+ : new bignumber_js_1.default(1);
76
+ const lstToSuiExchangeRate = new bignumber_js_1.default(json[0].value);
77
+ return [
78
+ lstCoinType,
79
+ {
80
+ client: lstClient,
81
+ liquidStakingInfo: lstInfo.liquidStakingInfo,
82
+ mintFeePercent,
83
+ redeemFeePercent,
84
+ suiToLstExchangeRate,
85
+ lstToSuiExchangeRate,
86
+ },
87
+ ];
88
+ }))));
89
+ return result;
90
+ }
91
+ catch (err) {
92
+ console.error(err);
93
+ }
94
+ });
95
+ exports.fetchStrategyLstMap = fetchStrategyLstMap;
96
+ const getStrategyLstMintFee = (
97
+ // Strategy
98
+ lstMap, lstCoinType, suiAmount) => {
99
+ var _a, _b;
100
+ const mintFeePercent = (_b = (_a = lstMap === null || lstMap === void 0 ? void 0 : lstMap[lstCoinType]) === null || _a === void 0 ? void 0 : _a.mintFeePercent) !== null && _b !== void 0 ? _b : new bignumber_js_1.default(0);
101
+ return suiAmount
102
+ .times(mintFeePercent.div(100))
103
+ .decimalPlaces(utils_1.SUI_DECIMALS, bignumber_js_1.default.ROUND_UP);
104
+ };
105
+ exports.getStrategyLstMintFee = getStrategyLstMintFee;
106
+ const getStrategyLstRedeemFee = (
107
+ // Strategy
108
+ lstMap, lstCoinType, lstAmount) => {
109
+ var _a, _b, _c, _d;
110
+ const lstToSuiExchangeRate = (_b = (_a = lstMap === null || lstMap === void 0 ? void 0 : lstMap[lstCoinType]) === null || _a === void 0 ? void 0 : _a.lstToSuiExchangeRate) !== null && _b !== void 0 ? _b : new bignumber_js_1.default(1);
111
+ const redeemFeePercent = (_d = (_c = lstMap === null || lstMap === void 0 ? void 0 : lstMap[lstCoinType]) === null || _c === void 0 ? void 0 : _c.redeemFeePercent) !== null && _d !== void 0 ? _d : new bignumber_js_1.default(0);
112
+ const suiAmount = lstAmount.times(lstToSuiExchangeRate);
113
+ return suiAmount
114
+ .times(redeemFeePercent.div(100))
115
+ .decimalPlaces(utils_1.SUI_DECIMALS, bignumber_js_1.default.ROUND_UP);
116
+ };
117
+ exports.getStrategyLstRedeemFee = getStrategyLstRedeemFee;
118
+ // Exposure map
119
+ exports.STRATEGY_TYPE_EXPOSURE_MAP = {
120
+ [strategyOwnerCap_1.StrategyType.sSUI_SUI_LOOPING]: {
121
+ min: new bignumber_js_1.default(1),
122
+ max: new bignumber_js_1.default(3), // Actual max: 1 / (1 - (sSUI Open LTV %)) = 3.333x, where sSUI Open LTV % = 70%
123
+ default: new bignumber_js_1.default(3),
124
+ },
125
+ [strategyOwnerCap_1.StrategyType.stratSUI_SUI_LOOPING]: {
126
+ min: new bignumber_js_1.default(1),
127
+ max: new bignumber_js_1.default(3), // Actual max: 1 / (1 - (sSUI Open LTV %)) = 3.333x, where sSUI Open LTV % = 70%
128
+ default: new bignumber_js_1.default(3),
129
+ },
130
+ [strategyOwnerCap_1.StrategyType.USDC_sSUI_SUI_LOOPING]: {
131
+ min: new bignumber_js_1.default(1),
132
+ max: new bignumber_js_1.default(3), // Actual max: 1 + (USDC Open LTV %) * (1 / (1 - (sSUI Open LTV %))) = 3.5666x, where USDC Open LTV % = 77% and sSUI Open LTV % = 70%
133
+ default: new bignumber_js_1.default(3),
134
+ },
135
+ [strategyOwnerCap_1.StrategyType.AUSD_sSUI_SUI_LOOPING]: {
136
+ min: new bignumber_js_1.default(1),
137
+ max: new bignumber_js_1.default(3), // Actual max: 1 + (AUSD Open LTV %) * (1 / (1 - (sSUI Open LTV %))) = 3.5666x, where AUSD Open LTV % = 77% and sSUI Open LTV % = 70%
138
+ default: new bignumber_js_1.default(3),
139
+ },
140
+ [strategyOwnerCap_1.StrategyType.xBTC_sSUI_SUI_LOOPING]: {
141
+ min: new bignumber_js_1.default(1),
142
+ max: new bignumber_js_1.default(2.5), // Actual max: 1 + (xBTC Open LTV %) * (1 / (1 - (sSUI Open LTV %))) = 3x, where xBTC Open LTV % = 60% and sSUI Open LTV % = 70%
143
+ default: new bignumber_js_1.default(2.5),
144
+ },
145
+ [strategyOwnerCap_1.StrategyType.xBTC_wBTC_LOOPING]: {
146
+ min: new bignumber_js_1.default(1),
147
+ max: new bignumber_js_1.default(2.2), // Actual max: 1 / (1 - (xBTC Open LTV %)) = 2.5x, where xBTC Open LTV % = 60%
148
+ default: new bignumber_js_1.default(2.2),
149
+ },
150
+ };
151
+ // Reserves
152
+ const getStrategyDepositReserves = (
153
+ // AppContext
154
+ reserveMap,
155
+ // Strategy
156
+ strategyType) => {
157
+ const strategyTypeInfo = strategyOwnerCap_1.STRATEGY_TYPE_INFO_MAP[strategyType];
158
+ return {
159
+ base: strategyTypeInfo.depositBaseCoinType
160
+ ? reserveMap[strategyTypeInfo.depositBaseCoinType]
161
+ : undefined,
162
+ lst: strategyTypeInfo.depositLstCoinType
163
+ ? reserveMap[strategyTypeInfo.depositLstCoinType]
164
+ : undefined,
165
+ };
166
+ };
167
+ exports.getStrategyDepositReserves = getStrategyDepositReserves;
168
+ const getStrategyBorrowReserve = (
169
+ // AppContext
170
+ reserveMap,
171
+ // Strategy
172
+ strategyType) => {
173
+ const strategyTypeInfo = strategyOwnerCap_1.STRATEGY_TYPE_INFO_MAP[strategyType];
174
+ return reserveMap[strategyTypeInfo.borrowCoinType];
175
+ };
176
+ exports.getStrategyBorrowReserve = getStrategyBorrowReserve;
177
+ const getStrategyDefaultCurrencyReserve = (
178
+ // AppContext
179
+ reserveMap,
180
+ // Strategy
181
+ strategyType) => {
182
+ const defaultCurrencyCoinType = strategyOwnerCap_1.STRATEGY_TYPE_INFO_MAP[strategyType].defaultCurrencyCoinType;
183
+ return reserveMap[defaultCurrencyCoinType];
184
+ };
185
+ exports.getStrategyDefaultCurrencyReserve = getStrategyDefaultCurrencyReserve;
186
+ // Calculations
187
+ const getStrategySimulatedObligation = (
188
+ // AppContext
189
+ reserveMap,
190
+ // Strategy
191
+ lstMap, strategyType, deposits, _borrowedAmount) => {
192
+ const depositReserves = (0, exports.getStrategyDepositReserves)(reserveMap, strategyType);
193
+ const borrowReserve = (0, exports.getStrategyBorrowReserve)(reserveMap, strategyType);
194
+ const defaultCurrencyReserve = (0, exports.getStrategyDefaultCurrencyReserve)(reserveMap, strategyType);
195
+ //
196
+ const borrowedAmount = bignumber_js_1.default.max(new bignumber_js_1.default(0), _borrowedAmount); // Can't be negative
197
+ const obligation = {
198
+ deposits: deposits.reduce((acc, deposit) => {
199
+ const depositReserve = reserveMap[deposit.coinType];
200
+ return [
201
+ ...acc,
202
+ {
203
+ depositedAmount: deposit.depositedAmount,
204
+ depositedAmountUsd: deposit.depositedAmount.times(depositReserve.price),
205
+ reserve: depositReserve,
206
+ coinType: depositReserve.coinType,
207
+ },
208
+ ];
209
+ }, []),
210
+ borrows: [
211
+ {
212
+ borrowedAmount: borrowedAmount,
213
+ borrowedAmountUsd: borrowedAmount.times(borrowReserve.price),
214
+ reserve: borrowReserve,
215
+ coinType: borrowReserve.coinType,
216
+ },
217
+ ],
218
+ netValueUsd: deposits
219
+ .reduce((acc, deposit) => {
220
+ const depositReserve = reserveMap[deposit.coinType];
221
+ return acc.plus(deposit.depositedAmount.times(depositReserve.price));
222
+ }, new bignumber_js_1.default(0))
223
+ .minus(borrowedAmount.times(borrowReserve.price)),
224
+ weightedBorrowsUsd: new bignumber_js_1.default(borrowedAmount.times(borrowReserve.price)).times(borrowReserve.config.borrowWeightBps.div(10000)),
225
+ maxPriceWeightedBorrowsUsd: new bignumber_js_1.default(borrowedAmount.times(borrowReserve.maxPrice)).times(borrowReserve.config.borrowWeightBps.div(10000)),
226
+ minPriceBorrowLimitUsd: bignumber_js_1.default.min(deposits.reduce((acc, deposit) => {
227
+ const depositReserve = reserveMap[deposit.coinType];
228
+ return acc.plus(deposit.depositedAmount
229
+ .times(depositReserve.minPrice)
230
+ .times(depositReserve.config.openLtvPct / 100));
231
+ }, new bignumber_js_1.default(0)), 30 * 10 ** 6),
232
+ unhealthyBorrowValueUsd: deposits.reduce((acc, deposit) => {
233
+ const depositReserve = reserveMap[deposit.coinType];
234
+ return acc.plus(deposit.depositedAmount
235
+ .times(depositReserve.price)
236
+ .times(depositReserve.config.closeLtvPct / 100));
237
+ }, new bignumber_js_1.default(0)),
238
+ };
239
+ return obligation;
240
+ };
241
+ exports.getStrategySimulatedObligation = getStrategySimulatedObligation;
242
+ const getStrategyDepositedAmount = (
243
+ // AppContext
244
+ reserveMap,
245
+ // Strategy
246
+ lstMap, strategyType, obligation) => {
247
+ var _a, _b;
248
+ const depositReserves = (0, exports.getStrategyDepositReserves)(reserveMap, strategyType);
249
+ const borrowReserve = (0, exports.getStrategyBorrowReserve)(reserveMap, strategyType);
250
+ const defaultCurrencyReserve = (0, exports.getStrategyDefaultCurrencyReserve)(reserveMap, strategyType);
251
+ //
252
+ if (!obligation || !(0, exports.hasStrategyPosition)(obligation))
253
+ return new bignumber_js_1.default(0);
254
+ let resultSui = new bignumber_js_1.default(0);
255
+ for (const deposit of obligation.deposits) {
256
+ if ((0, sui_fe_1.isSui)(deposit.coinType)) {
257
+ resultSui = resultSui.plus(deposit.depositedAmount);
258
+ }
259
+ else if (Object.keys(lstMap).includes(deposit.coinType)) {
260
+ const lstToSuiExchangeRate = (_b = (_a = lstMap === null || lstMap === void 0 ? void 0 : lstMap[deposit.coinType]) === null || _a === void 0 ? void 0 : _a.lstToSuiExchangeRate) !== null && _b !== void 0 ? _b : new bignumber_js_1.default(1);
261
+ // const redeemFeePercent =
262
+ // lstMap?.[deposit.coinType]?.redeemFeePercent ?? new BigNumber(0);
263
+ resultSui = resultSui.plus(deposit.depositedAmount.times(lstToSuiExchangeRate));
264
+ }
265
+ else {
266
+ const depositReserve = reserveMap[deposit.coinType];
267
+ const priceSui = depositReserve.price.div((0, exports.getStrategySuiReserve)(reserveMap).price);
268
+ resultSui = resultSui.plus(deposit.depositedAmount.times(priceSui));
269
+ }
270
+ }
271
+ const resultUsd = resultSui.times((0, exports.getStrategySuiReserve)(reserveMap).price);
272
+ const resultDefaultCurrency = new bignumber_js_1.default(resultUsd.div(defaultCurrencyReserve.price)).decimalPlaces(defaultCurrencyReserve.token.decimals, bignumber_js_1.default.ROUND_DOWN);
273
+ return resultDefaultCurrency;
274
+ };
275
+ exports.getStrategyDepositedAmount = getStrategyDepositedAmount;
276
+ const getStrategyBorrowedAmount = (
277
+ // AppContext
278
+ reserveMap,
279
+ // Strategy
280
+ lstMap, strategyType, obligation) => {
281
+ const depositReserves = (0, exports.getStrategyDepositReserves)(reserveMap, strategyType);
282
+ const borrowReserve = (0, exports.getStrategyBorrowReserve)(reserveMap, strategyType);
283
+ const defaultCurrencyReserve = (0, exports.getStrategyDefaultCurrencyReserve)(reserveMap, strategyType);
284
+ //
285
+ if (!obligation || !(0, exports.hasStrategyPosition)(obligation))
286
+ return new bignumber_js_1.default(0);
287
+ let resultSui = new bignumber_js_1.default(0);
288
+ for (const borrow of obligation.borrows) {
289
+ if ((0, sui_fe_1.isSui)(borrow.coinType)) {
290
+ resultSui = resultSui.plus(borrow.borrowedAmount);
291
+ }
292
+ else if (Object.keys(lstMap).includes(borrow.coinType)) {
293
+ // Can't borrow LSTs
294
+ continue;
295
+ }
296
+ else {
297
+ const priceSui = borrowReserve.price.div((0, exports.getStrategySuiReserve)(reserveMap).price);
298
+ resultSui = resultSui.plus(borrow.borrowedAmount.times(priceSui));
299
+ }
300
+ }
301
+ const resultUsd = resultSui.times((0, exports.getStrategySuiReserve)(reserveMap).price);
302
+ const resultDefaultCurrency = new bignumber_js_1.default(resultUsd.div(defaultCurrencyReserve.price)).decimalPlaces(defaultCurrencyReserve.token.decimals, bignumber_js_1.default.ROUND_DOWN);
303
+ return resultDefaultCurrency;
304
+ };
305
+ exports.getStrategyBorrowedAmount = getStrategyBorrowedAmount;
306
+ const getStrategyTvlAmount = (
307
+ // AppContext
308
+ reserveMap,
309
+ // Strategy
310
+ lstMap, strategyType, obligation) => {
311
+ if (!obligation || !(0, exports.hasStrategyPosition)(obligation))
312
+ return new bignumber_js_1.default(0);
313
+ return (0, exports.getStrategyDepositedAmount)(reserveMap, lstMap, strategyType, obligation).minus((0, exports.getStrategyBorrowedAmount)(reserveMap, lstMap, strategyType, obligation));
314
+ };
315
+ exports.getStrategyTvlAmount = getStrategyTvlAmount;
316
+ const getStrategyExposure = (
317
+ // AppContext
318
+ reserveMap,
319
+ // StrategyContext
320
+ lstMap, strategyType, obligation) => {
321
+ const depositReserves = (0, exports.getStrategyDepositReserves)(reserveMap, strategyType);
322
+ const borrowReserve = (0, exports.getStrategyBorrowReserve)(reserveMap, strategyType);
323
+ const defaultCurrencyReserve = (0, exports.getStrategyDefaultCurrencyReserve)(reserveMap, strategyType);
324
+ //
325
+ if (!obligation || !(0, exports.hasStrategyPosition)(obligation))
326
+ return new bignumber_js_1.default(0);
327
+ const depositedAmountUsd = (0, exports.getStrategyDepositedAmount)(reserveMap, lstMap, strategyType, obligation).times(defaultCurrencyReserve.price);
328
+ const borrowedAmountUsd = (0, exports.getStrategyBorrowedAmount)(reserveMap, lstMap, strategyType, obligation).times(defaultCurrencyReserve.price);
329
+ return depositedAmountUsd.eq(0)
330
+ ? new bignumber_js_1.default(0)
331
+ : depositedAmountUsd.div(depositedAmountUsd.minus(borrowedAmountUsd));
332
+ };
333
+ exports.getStrategyExposure = getStrategyExposure;
334
+ // Simulate
335
+ // Stats
336
+ // Stats - Global TVL
337
+ const fetchStrategyGlobalTvlAmountUsdMap = () => __awaiter(void 0, void 0, void 0, function* () {
338
+ try {
339
+ const url = `${sui_fe_1.API_URL}/strategies/tvl`;
340
+ const res = yield fetch(url);
341
+ const json = yield res.json();
342
+ if ((json === null || json === void 0 ? void 0 : json.statusCode) === 500)
343
+ throw new Error("Failed to fetch Strategies TVL");
344
+ const result = Object.values(strategyOwnerCap_1.StrategyType).reduce((acc, strategyType) => {
345
+ const entry = json.strategies.find((s) => `${s.strategyType}` === strategyType);
346
+ const tvlUsd = entry
347
+ ? new bignumber_js_1.default(entry.tvlUsd)
348
+ : null;
349
+ return Object.assign(Object.assign({}, acc), { [strategyType]: tvlUsd });
350
+ }, {});
351
+ return result;
352
+ }
353
+ catch (err) {
354
+ console.error(err);
355
+ }
356
+ });
357
+ exports.fetchStrategyGlobalTvlAmountUsdMap = fetchStrategyGlobalTvlAmountUsdMap;
358
+ // Stats - Unclaimed rewards
359
+ const getStrategyUnclaimedRewardsAmount = (
360
+ // AppContext
361
+ reserveMap, rewardPriceMap, rewardCoinMetadataMap,
362
+ // UserContext
363
+ rewardMap,
364
+ // Strategy
365
+ lstMap, strategyType, obligation) => {
366
+ const depositReserves = (0, exports.getStrategyDepositReserves)(reserveMap, strategyType);
367
+ const borrowReserve = (0, exports.getStrategyBorrowReserve)(reserveMap, strategyType);
368
+ const defaultCurrencyReserve = (0, exports.getStrategyDefaultCurrencyReserve)(reserveMap, strategyType);
369
+ //
370
+ if (!obligation || !(0, exports.hasStrategyPosition)(obligation))
371
+ return new bignumber_js_1.default(0);
372
+ const rewardsMap = (0, liquidityMining_1.getRewardsMap)(obligation, rewardMap, rewardCoinMetadataMap);
373
+ const resultSui = Object.entries(rewardsMap).reduce((acc, [coinType, { amount }]) => {
374
+ var _a, _b, _c;
375
+ if ((0, sui_fe_1.isSui)(coinType)) {
376
+ return acc.plus(amount);
377
+ }
378
+ else if (Object.keys(lstMap).includes(coinType)) {
379
+ const lstToSuiExchangeRate = (_b = (_a = lstMap === null || lstMap === void 0 ? void 0 : lstMap[coinType]) === null || _a === void 0 ? void 0 : _a.lstToSuiExchangeRate) !== null && _b !== void 0 ? _b : new bignumber_js_1.default(1);
380
+ return acc.plus(amount.times(lstToSuiExchangeRate));
381
+ }
382
+ else {
383
+ const price = (_c = rewardPriceMap[coinType]) !== null && _c !== void 0 ? _c : new bignumber_js_1.default(0);
384
+ const priceSui = price.div((0, exports.getStrategySuiReserve)(reserveMap).price);
385
+ return acc.plus(amount.times(priceSui));
386
+ }
387
+ }, new bignumber_js_1.default(0));
388
+ const resultUsd = resultSui.times((0, exports.getStrategySuiReserve)(reserveMap).price);
389
+ const resultDefaultCurrency = new bignumber_js_1.default(resultUsd.div(defaultCurrencyReserve.price)).decimalPlaces(defaultCurrencyReserve.token.decimals, bignumber_js_1.default.ROUND_DOWN);
390
+ return resultDefaultCurrency;
391
+ };
392
+ exports.getStrategyUnclaimedRewardsAmount = getStrategyUnclaimedRewardsAmount;
393
+ // Stats - History
394
+ // Stats - Historical TVL
395
+ // Stats - APR
396
+ // Stats - Health
397
+ // Stats - Liquidation price