@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 +1 -0
- package/index.js +1 -0
- package/lib/strategyOwnerCap.d.ts +1 -1
- package/lib/strategyOwnerCap.js +9 -3
- package/package.json +1 -1
- package/strategies.d.ts +263 -0
- package/strategies.js +397 -0
package/index.d.ts
CHANGED
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>;
|
package/lib/strategyOwnerCap.js
CHANGED
|
@@ -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(
|
|
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 } =
|
|
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.
|
|
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"}}
|
package/strategies.d.ts
ADDED
|
@@ -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}×tamps=${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
|