@gearbox-protocol/sdk 14.6.0-next.4 → 14.6.0-next.5
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/dist/cjs/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list-core.js +66 -0
- package/dist/cjs/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list.js +7 -18
- package/dist/cjs/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers.js +4 -6
- package/dist/cjs/common-utils/utils/strategies/credit-managers/index.js +2 -0
- package/dist/cjs/common-utils/utils/strategies/lists/get-released-strategies-list-core.js +61 -0
- package/dist/cjs/common-utils/utils/strategies/lists/get-released-strategies-list.js +9 -31
- package/dist/cjs/common-utils/utils/strategies/lists/index.js +3 -1
- package/dist/cjs/common-utils/utils/strategies/strategy-info/get-strategy-info-core.js +104 -0
- package/dist/cjs/common-utils/utils/strategies/strategy-info/get-strategy-info.js +35 -59
- package/dist/cjs/common-utils/utils/strategies/strategy-info/index.js +2 -0
- package/dist/cjs/common-utils/utils/strategies/strategy-state/is-strategy-disabled.js +3 -1
- package/dist/cjs/common-utils/utils/strategies/types/index.js +4 -0
- package/dist/cjs/common-utils/utils/strategies/types/legacy-strategy-data-source.js +62 -0
- package/dist/cjs/common-utils/utils/strategies/types/strategy-data-source.js +16 -0
- package/dist/cjs/plugins/apy/ApyPlugin.js +65 -0
- package/dist/cjs/plugins/apy/strategy-data-source.js +176 -0
- package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list-core.js +42 -0
- package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list.js +7 -18
- package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers.js +4 -6
- package/dist/esm/common-utils/utils/strategies/credit-managers/index.js +1 -0
- package/dist/esm/common-utils/utils/strategies/lists/get-released-strategies-list-core.js +37 -0
- package/dist/esm/common-utils/utils/strategies/lists/get-released-strategies-list.js +9 -31
- package/dist/esm/common-utils/utils/strategies/lists/index.js +1 -0
- package/dist/esm/common-utils/utils/strategies/strategy-info/get-strategy-info-core.js +80 -0
- package/dist/esm/common-utils/utils/strategies/strategy-info/get-strategy-info.js +35 -59
- package/dist/esm/common-utils/utils/strategies/strategy-info/index.js +1 -0
- package/dist/esm/common-utils/utils/strategies/strategy-state/is-strategy-disabled.js +3 -1
- package/dist/esm/common-utils/utils/strategies/types/index.js +2 -0
- package/dist/esm/common-utils/utils/strategies/types/legacy-strategy-data-source.js +38 -0
- package/dist/esm/common-utils/utils/strategies/types/strategy-data-source.js +0 -0
- package/dist/esm/plugins/apy/ApyPlugin.js +70 -0
- package/dist/esm/plugins/apy/strategy-data-source.js +159 -0
- package/dist/types/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list-core.d.ts +7 -0
- package/dist/types/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers.d.ts +3 -3
- package/dist/types/common-utils/utils/strategies/credit-managers/index.d.ts +1 -0
- package/dist/types/common-utils/utils/strategies/credit-managers/is-credit-manager-usable.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/eligibility/is-strategy-eligible.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/lists/get-available-and-disabled-strategies.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/lists/get-available-strategies.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/lists/get-disabled-strategies.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/lists/get-released-strategies-list-core.d.ts +9 -0
- package/dist/types/common-utils/utils/strategies/lists/get-released-strategies-list.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/lists/index.d.ts +1 -0
- package/dist/types/common-utils/utils/strategies/strategy-info/get-strategy-info-core.d.ts +12 -0
- package/dist/types/common-utils/utils/strategies/strategy-info/index.d.ts +1 -0
- package/dist/types/common-utils/utils/strategies/strategy-state/is-strategy-disabled.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/tokens/is-activated-token.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/tokens/is-forbidden-token.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/types/credit-manager-data-legacy.d.ts +3 -7
- package/dist/types/common-utils/utils/strategies/types/index.d.ts +2 -0
- package/dist/types/common-utils/utils/strategies/types/legacy-strategy-data-source.d.ts +4 -0
- package/dist/types/common-utils/utils/strategies/types/sdk-state.d.ts +5 -4
- package/dist/types/common-utils/utils/strategies/types/strategies-cm-list.d.ts +2 -2
- package/dist/types/common-utils/utils/strategies/types/strategy-data-source.d.ts +19 -0
- package/dist/types/common-utils/utils/strategies/types/targetable.d.ts +2 -2
- package/dist/types/plugins/apy/ApyPlugin.d.ts +8 -1
- package/dist/types/plugins/apy/strategy-data-source.d.ts +16 -0
- package/dist/types/plugins/apy/types.d.ts +18 -1
- package/package.json +1 -1
|
@@ -22,6 +22,7 @@ __export(ApyPlugin_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(ApyPlugin_exports);
|
|
24
24
|
var import_marketCompressor = require("../../abi/compressors/marketCompressor.js");
|
|
25
|
+
var import_strategies = require("../../common-utils/utils/strategies/index.js");
|
|
25
26
|
var import_extra_apy = require("../../rewards/rewards/extra-apy.js");
|
|
26
27
|
var import_sdk = require("../../sdk/index.js");
|
|
27
28
|
var import_formatter = require("../../sdk/utils/formatter.js");
|
|
@@ -30,6 +31,7 @@ var import_apy_cache = require("./apy-cache.js");
|
|
|
30
31
|
var import_apy_parser = require("./apy-parser.js");
|
|
31
32
|
var import_constants = require("./constants.js");
|
|
32
33
|
var import_pool_apy_utils = require("./pool-apy-utils.js");
|
|
34
|
+
var import_strategy_data_source = require("./strategy-data-source.js");
|
|
33
35
|
const MAP_LABEL = "pools7DAgo";
|
|
34
36
|
class ApyPlugin extends import_sdk.BasePlugin {
|
|
35
37
|
#apyUrl;
|
|
@@ -181,6 +183,69 @@ class ApyPlugin extends import_sdk.BasePlugin {
|
|
|
181
183
|
}
|
|
182
184
|
return { data, data7DAgo, pointsBase: poolPointsBase, points };
|
|
183
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Computes a strategy-info snapshot from the current SDK and APY state.
|
|
188
|
+
*
|
|
189
|
+
* @throws if plugin is not loaded
|
|
190
|
+
*/
|
|
191
|
+
getStrategyInfoSnapshot({
|
|
192
|
+
slippage,
|
|
193
|
+
quotaReserve,
|
|
194
|
+
curatorFilter,
|
|
195
|
+
strategyPayloadsList,
|
|
196
|
+
showHiddenStrategies
|
|
197
|
+
}) {
|
|
198
|
+
if (!this.loaded) {
|
|
199
|
+
throw new Error("apy plugin not loaded");
|
|
200
|
+
}
|
|
201
|
+
const chainId = this.sdk.chainId;
|
|
202
|
+
const network = this.sdk.networkType;
|
|
203
|
+
const allowedChains = { [chainId]: network };
|
|
204
|
+
const source = new import_strategy_data_source.OnchainSdkStrategyDataSource(this.sdk);
|
|
205
|
+
const releasedStrategies = (0, import_strategies.getReleasedStrategiesListCore)({
|
|
206
|
+
strategyPayloadsList,
|
|
207
|
+
allowedChains,
|
|
208
|
+
source,
|
|
209
|
+
curatorFilter,
|
|
210
|
+
showHiddenStrategies
|
|
211
|
+
});
|
|
212
|
+
const cmsOfStrategiesByChain = (0, import_strategies.getStrategyCreditManagersListCore)({
|
|
213
|
+
strategies: releasedStrategies,
|
|
214
|
+
source,
|
|
215
|
+
curatorFilter
|
|
216
|
+
});
|
|
217
|
+
const { available, disabled, availableList, disabledList } = (0, import_strategies.getAvailableAndDisabledStrategies)(
|
|
218
|
+
releasedStrategies,
|
|
219
|
+
cmsOfStrategiesByChain,
|
|
220
|
+
curatorFilter
|
|
221
|
+
);
|
|
222
|
+
const apyListByNetwork = {
|
|
223
|
+
[chainId]: this.apySnapshot.apy
|
|
224
|
+
};
|
|
225
|
+
const strategiesInfo = releasedStrategies?.reduce((acc, strategy) => {
|
|
226
|
+
const info = (0, import_strategies.getStrategyInfoCore)({
|
|
227
|
+
strategy,
|
|
228
|
+
creditManagers: cmsOfStrategiesByChain?.[strategy.chainId]?.[strategy.id],
|
|
229
|
+
source,
|
|
230
|
+
apyListByNetwork,
|
|
231
|
+
quotaReserve,
|
|
232
|
+
slippage
|
|
233
|
+
});
|
|
234
|
+
if (info) {
|
|
235
|
+
acc[strategy.chainId] ??= {};
|
|
236
|
+
acc[strategy.chainId][strategy.id] = info;
|
|
237
|
+
}
|
|
238
|
+
return acc;
|
|
239
|
+
}, {}) ?? {};
|
|
240
|
+
return {
|
|
241
|
+
availableStrategies: available,
|
|
242
|
+
disabledStrategies: disabled,
|
|
243
|
+
availableList,
|
|
244
|
+
disabledList,
|
|
245
|
+
cmsOfStrategiesByChain,
|
|
246
|
+
strategiesInfo
|
|
247
|
+
};
|
|
248
|
+
}
|
|
184
249
|
// ---------------------------------------------------------------------------
|
|
185
250
|
// Plugin lifecycle
|
|
186
251
|
// ---------------------------------------------------------------------------
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var strategy_data_source_exports = {};
|
|
20
|
+
__export(strategy_data_source_exports, {
|
|
21
|
+
OnchainSdkStrategyDataSource: () => OnchainSdkStrategyDataSource
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(strategy_data_source_exports);
|
|
24
|
+
var import_sdk = require("../../sdk/index.js");
|
|
25
|
+
const lc = (address) => address.toLowerCase();
|
|
26
|
+
class OnchainSdkStrategyDataSource {
|
|
27
|
+
constructor(sdk) {
|
|
28
|
+
this.sdk = sdk;
|
|
29
|
+
}
|
|
30
|
+
sdk;
|
|
31
|
+
hasToken(chainId, token) {
|
|
32
|
+
return !!this.getToken(chainId, token);
|
|
33
|
+
}
|
|
34
|
+
getToken(chainId, token) {
|
|
35
|
+
if (chainId !== this.sdk.chainId) return void 0;
|
|
36
|
+
const meta = this.sdk.tokensMeta.get(token);
|
|
37
|
+
if (!meta) return void 0;
|
|
38
|
+
const address = lc(token);
|
|
39
|
+
return { address, decimals: meta.decimals };
|
|
40
|
+
}
|
|
41
|
+
getPool(chainId, pool) {
|
|
42
|
+
if (chainId !== this.sdk.chainId) return void 0;
|
|
43
|
+
const market = this.sdk.marketRegister.markets.find(
|
|
44
|
+
(m) => lc(m.pool.pool.address) === lc(pool)
|
|
45
|
+
);
|
|
46
|
+
if (!market) return void 0;
|
|
47
|
+
return {
|
|
48
|
+
address: lc(market.pool.pool.address),
|
|
49
|
+
totalDebtLimit: market.pool.pool.totalDebtLimit,
|
|
50
|
+
totalBorrowed: market.pool.pool.totalBorrowed
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
getCreditManager(chainId, creditManager) {
|
|
54
|
+
if (chainId !== this.sdk.chainId) return void 0;
|
|
55
|
+
try {
|
|
56
|
+
const found = this.findCreditManager(creditManager);
|
|
57
|
+
if (!found) return void 0;
|
|
58
|
+
return this.toCreditManagerView(found.creditSuite, found.market.pool);
|
|
59
|
+
} catch {
|
|
60
|
+
return void 0;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
getMarketPrices(chainId, pool) {
|
|
64
|
+
if (chainId !== this.sdk.chainId) return {};
|
|
65
|
+
const market = this.sdk.marketRegister.markets.find(
|
|
66
|
+
(m) => lc(m.pool.pool.address) === lc(pool)
|
|
67
|
+
);
|
|
68
|
+
if (!market) return {};
|
|
69
|
+
const marketPrices = Object.fromEntries(
|
|
70
|
+
market.priceOracle.mainPrices.entries().map(([token, mainPrice]) => {
|
|
71
|
+
const tokenLc = lc(token);
|
|
72
|
+
const reservePrice = market.priceOracle.reservePrices?.get(token);
|
|
73
|
+
return [tokenLc, mainPrice?.price || reservePrice?.price || 0n];
|
|
74
|
+
})
|
|
75
|
+
);
|
|
76
|
+
const wrappedNativeToken = this.getWrappedNativeToken();
|
|
77
|
+
const wrappedNativePrice = marketPrices[wrappedNativeToken || import_sdk.ADDRESS_0X0];
|
|
78
|
+
if (wrappedNativePrice !== void 0) {
|
|
79
|
+
marketPrices[lc(import_sdk.NATIVE_ADDRESS)] = wrappedNativePrice;
|
|
80
|
+
}
|
|
81
|
+
return marketPrices;
|
|
82
|
+
}
|
|
83
|
+
getLastSyncTimestamp(chainId) {
|
|
84
|
+
return chainId === this.sdk.chainId ? Number(this.sdk.timestamp) : void 0;
|
|
85
|
+
}
|
|
86
|
+
toCreditManagerView(cs, pool) {
|
|
87
|
+
const cm = cs.creditManager;
|
|
88
|
+
const facade = cs.creditFacade;
|
|
89
|
+
const debtParams = pool.pool.creditManagerDebtParams.get(cm.address);
|
|
90
|
+
const liquidationThresholds = {};
|
|
91
|
+
const supportedTokens = {};
|
|
92
|
+
const forbiddenTokens = {};
|
|
93
|
+
const quotas = {};
|
|
94
|
+
for (const [token, q] of pool.pqk.quotas.entries()) {
|
|
95
|
+
const tokenLc = lc(token);
|
|
96
|
+
quotas[tokenLc] = {
|
|
97
|
+
token: tokenLc,
|
|
98
|
+
rate: BigInt(q.rate) * import_sdk.PERCENTAGE_DECIMALS,
|
|
99
|
+
quotaIncreaseFee: BigInt(q.quotaIncreaseFee),
|
|
100
|
+
totalQuoted: q.totalQuoted,
|
|
101
|
+
limit: q.limit,
|
|
102
|
+
isActive: q.isActive
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
for (const token of cm.collateralTokens) {
|
|
106
|
+
const tokenLc = lc(token);
|
|
107
|
+
const lt = cm.liquidationThresholds.get(token);
|
|
108
|
+
if (lt !== void 0) {
|
|
109
|
+
liquidationThresholds[tokenLc] = BigInt(lt);
|
|
110
|
+
}
|
|
111
|
+
supportedTokens[tokenLc] = true;
|
|
112
|
+
}
|
|
113
|
+
const forbiddenMask = facade.forbiddenTokensMask;
|
|
114
|
+
for (let i = 0; i < cm.collateralTokens.length; i++) {
|
|
115
|
+
const tokenLc = lc(cm.collateralTokens[i]);
|
|
116
|
+
if ((forbiddenMask & 1n << BigInt(i)) !== 0n) {
|
|
117
|
+
forbiddenTokens[tokenLc] = true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const baseBorrowRate = debtParams ? Number(
|
|
121
|
+
pool.pool.baseInterestRate * (BigInt(cm.feeInterest) + import_sdk.PERCENTAGE_FACTOR) * import_sdk.PERCENTAGE_DECIMALS / import_sdk.RAY
|
|
122
|
+
) : 0;
|
|
123
|
+
return {
|
|
124
|
+
address: lc(cm.address),
|
|
125
|
+
underlyingToken: lc(cm.underlying),
|
|
126
|
+
pool: lc(cm.pool),
|
|
127
|
+
chainId: this.sdk.chainId,
|
|
128
|
+
baseBorrowRate,
|
|
129
|
+
feeInterest: cm.feeInterest,
|
|
130
|
+
availableToBorrow: debtParams?.available ?? 0n,
|
|
131
|
+
minDebt: facade.minDebt,
|
|
132
|
+
maxDebt: facade.maxDebt,
|
|
133
|
+
totalDebt: debtParams?.borrowed ?? 0n,
|
|
134
|
+
totalDebtLimit: debtParams?.limit ?? 0n,
|
|
135
|
+
isDegenMode: lc(facade.degenNFT) !== import_sdk.ADDRESS_0X0,
|
|
136
|
+
degenNFT: lc(facade.degenNFT),
|
|
137
|
+
liquidationThresholds,
|
|
138
|
+
quotas,
|
|
139
|
+
collateralTokens: cm.collateralTokens.map(lc),
|
|
140
|
+
version: Number(facade.version),
|
|
141
|
+
isBorrowingForbidden: facade.maxDebtPerBlockMultiplier === 0,
|
|
142
|
+
marketConfigurator: lc(cs.marketConfigurator),
|
|
143
|
+
supportedTokens,
|
|
144
|
+
forbiddenTokens
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
findCreditManager(creditManager) {
|
|
148
|
+
const marketRegister = this.sdk.marketRegister;
|
|
149
|
+
if (marketRegister.findCreditManager && marketRegister.findByCreditManager) {
|
|
150
|
+
const creditSuite = marketRegister.findCreditManager(creditManager);
|
|
151
|
+
const market = marketRegister.findByCreditManager(
|
|
152
|
+
creditSuite.creditManager.address
|
|
153
|
+
);
|
|
154
|
+
return { creditSuite, market };
|
|
155
|
+
}
|
|
156
|
+
const cmLc = lc(creditManager);
|
|
157
|
+
for (const market of marketRegister.markets) {
|
|
158
|
+
const creditSuite = market.creditManagers.find(
|
|
159
|
+
(cs) => lc(cs.creditManager.address) === cmLc
|
|
160
|
+
);
|
|
161
|
+
if (creditSuite) return { creditSuite, market };
|
|
162
|
+
}
|
|
163
|
+
return void 0;
|
|
164
|
+
}
|
|
165
|
+
getWrappedNativeToken() {
|
|
166
|
+
try {
|
|
167
|
+
return this.sdk.addressProvider.getAddress(import_sdk.AP_WETH_TOKEN, 0)?.toLowerCase();
|
|
168
|
+
} catch {
|
|
169
|
+
return void 0;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
174
|
+
0 && (module.exports = {
|
|
175
|
+
OnchainSdkStrategyDataSource
|
|
176
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { TypedObjectUtils } from "../../../../sdk/utils/mappers.js";
|
|
2
|
+
import { isUsableToken } from "../tokens/index.js";
|
|
3
|
+
import { isCreditManagerUsable } from "./is-credit-manager-usable.js";
|
|
4
|
+
const lc = (address) => address.toLowerCase();
|
|
5
|
+
function getStrategyCreditManagersListCore({
|
|
6
|
+
strategies,
|
|
7
|
+
source,
|
|
8
|
+
curatorFilter
|
|
9
|
+
}) {
|
|
10
|
+
if (!strategies) return strategies;
|
|
11
|
+
return strategies.reduce((acc, strategy) => {
|
|
12
|
+
const targetToken = lc(strategy.tokenOutAddress);
|
|
13
|
+
const cms = (strategy.creditManagers || []).reduce(
|
|
14
|
+
(cmAcc, cmAddress) => {
|
|
15
|
+
const cm = source.getCreditManager(strategy.chainId, cmAddress);
|
|
16
|
+
if (!cm || !isCreditManagerUsable(cm)) return cmAcc;
|
|
17
|
+
const usable = isUsableToken({
|
|
18
|
+
address: targetToken,
|
|
19
|
+
creditManager: cm
|
|
20
|
+
});
|
|
21
|
+
const limit = cm.quotas[targetToken]?.limit || 0n;
|
|
22
|
+
const limitZero = targetToken === cm.underlyingToken ? false : limit === 0n;
|
|
23
|
+
if (usable && !cm.isBorrowingForbidden && !limitZero) {
|
|
24
|
+
cmAcc[cm.address] = cm;
|
|
25
|
+
}
|
|
26
|
+
return cmAcc;
|
|
27
|
+
},
|
|
28
|
+
{}
|
|
29
|
+
);
|
|
30
|
+
const cmsAfterCuratorFilter = curatorFilter ? TypedObjectUtils.entries(cms).filter(
|
|
31
|
+
([, cm]) => curatorFilter[cm.marketConfigurator]
|
|
32
|
+
) : TypedObjectUtils.entries(cms);
|
|
33
|
+
if (!acc[strategy.chainId]) acc[strategy.chainId] = {};
|
|
34
|
+
acc[strategy.chainId][strategy.id] = Object.fromEntries(
|
|
35
|
+
cmsAfterCuratorFilter
|
|
36
|
+
);
|
|
37
|
+
return acc;
|
|
38
|
+
}, {});
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
getStrategyCreditManagersListCore
|
|
42
|
+
};
|
package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list.js
CHANGED
|
@@ -1,23 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createLegacyStrategyDataSource } from "../types.js";
|
|
2
|
+
import { getStrategyCreditManagersListCore } from "./get-strategy-credit-managers-list-core.js";
|
|
3
3
|
function getStrategyCreditManagersList(strategies, sdkStateByChain, curatorFilter) {
|
|
4
4
|
if (!sdkStateByChain) return sdkStateByChain;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
strategy: s,
|
|
11
|
-
allCreditManagers: creditManagers
|
|
12
|
-
}) : {};
|
|
13
|
-
const cmsAfterCuratorFilter = curatorFilter ? TypedObjectUtils.entries(cms).filter(
|
|
14
|
-
([, cm]) => curatorFilter[cm.marketConfigurator]
|
|
15
|
-
) : TypedObjectUtils.entries(cms);
|
|
16
|
-
if (!acc[s.chainId]) acc[s.chainId] = {};
|
|
17
|
-
acc[s.chainId][s.id] = Object.fromEntries(cmsAfterCuratorFilter);
|
|
18
|
-
return acc;
|
|
19
|
-
}, {});
|
|
20
|
-
return r;
|
|
5
|
+
return getStrategyCreditManagersListCore({
|
|
6
|
+
strategies,
|
|
7
|
+
source: createLegacyStrategyDataSource(sdkStateByChain),
|
|
8
|
+
curatorFilter
|
|
9
|
+
});
|
|
21
10
|
}
|
|
22
11
|
export {
|
|
23
12
|
getStrategyCreditManagersList
|
package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { isUsableToken } from "../tokens/is-usable-token.js";
|
|
2
2
|
import { isCreditManagerUsable } from "./is-credit-manager-usable.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}) {
|
|
7
|
-
const lpAddress = strategy.tokenOutAddress;
|
|
3
|
+
const lc = (address) => address.toLowerCase();
|
|
4
|
+
function getStrategyCreditManagers({ strategy, allCreditManagers }) {
|
|
5
|
+
const lpAddress = lc(strategy.tokenOutAddress);
|
|
8
6
|
const res = (strategy?.creditManagers || []).reduce(
|
|
9
7
|
(acc, cmAddress) => {
|
|
10
|
-
const cm = allCreditManagers[cmAddress];
|
|
8
|
+
const cm = allCreditManagers[cmAddress] ?? allCreditManagers[lc(cmAddress)];
|
|
11
9
|
if (cm && isCreditManagerUsable(cm)) {
|
|
12
10
|
const usable = isUsableToken({
|
|
13
11
|
address: lpAddress,
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { isStrategyReleased } from "../eligibility/is-strategy-released.js";
|
|
2
|
+
function getReleasedStrategiesListCore({
|
|
3
|
+
strategyPayloadsList,
|
|
4
|
+
allowedChains,
|
|
5
|
+
source,
|
|
6
|
+
curatorFilter,
|
|
7
|
+
showHiddenStrategies
|
|
8
|
+
}) {
|
|
9
|
+
if (!allowedChains) return void 0;
|
|
10
|
+
if (!strategyPayloadsList) return void 0;
|
|
11
|
+
const eligibleStrategies = strategyPayloadsList.reduce(
|
|
12
|
+
(acc, s) => {
|
|
13
|
+
const network = s.chainId !== void 0 ? allowedChains[s.chainId] : void 0;
|
|
14
|
+
const isNetworkCorrect = !!network && network === s.network;
|
|
15
|
+
const isHidden = !showHiddenStrategies && s.hideInProd;
|
|
16
|
+
const showInMainApp = s.showInMainApp ?? true;
|
|
17
|
+
const showCondition = curatorFilter || showInMainApp;
|
|
18
|
+
if (isNetworkCorrect && !isHidden && source.hasToken(s.chainId, s.tokenOutAddress) && showCondition) {
|
|
19
|
+
acc.push({
|
|
20
|
+
...s,
|
|
21
|
+
id: s.tokenOutAddress,
|
|
22
|
+
network
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return acc;
|
|
26
|
+
},
|
|
27
|
+
[]
|
|
28
|
+
);
|
|
29
|
+
return eligibleStrategies.filter((s) => {
|
|
30
|
+
const lastSyncTimestamp = source.getLastSyncTimestamp(s.chainId);
|
|
31
|
+
if (!lastSyncTimestamp) return true;
|
|
32
|
+
return showHiddenStrategies ? true : isStrategyReleased(s.releaseAt, lastSyncTimestamp);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
getReleasedStrategiesListCore
|
|
37
|
+
};
|
|
@@ -1,35 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createLegacyStrategyDataSource } from "../types.js";
|
|
2
|
+
import { getReleasedStrategiesListCore } from "./get-released-strategies-list-core.js";
|
|
3
3
|
function getReleasedStrategiesList(strategyPayloadsList, allowedChains, sdkStateByChain, curatorFilter, showHiddenStrategies) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
showHiddenStrategies,
|
|
12
|
-
sdkStateByChain,
|
|
13
|
-
curatorFilter
|
|
14
|
-
);
|
|
15
|
-
if (eligible.isEligible) {
|
|
16
|
-
acc.push({
|
|
17
|
-
...s,
|
|
18
|
-
id: s.tokenOutAddress,
|
|
19
|
-
network: eligible.network
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
return acc;
|
|
23
|
-
},
|
|
24
|
-
[]
|
|
25
|
-
);
|
|
26
|
-
if (!sdkStateByChain) return eligibleStrategies;
|
|
27
|
-
const releasedStrategies = eligibleStrategies.filter((s) => {
|
|
28
|
-
const lastSyncBlock = sdkStateByChain?.[s.chainId]?.lastSyncBlock;
|
|
29
|
-
if (!lastSyncBlock) return true;
|
|
30
|
-
return showHiddenStrategies ? true : isStrategyReleased(s.releaseAt, lastSyncBlock.blockTimestamp_js);
|
|
31
|
-
}, {});
|
|
32
|
-
return releasedStrategies;
|
|
4
|
+
return getReleasedStrategiesListCore({
|
|
5
|
+
strategyPayloadsList,
|
|
6
|
+
allowedChains,
|
|
7
|
+
source: createLegacyStrategyDataSource(sdkStateByChain),
|
|
8
|
+
curatorFilter,
|
|
9
|
+
showHiddenStrategies
|
|
10
|
+
});
|
|
33
11
|
}
|
|
34
12
|
export {
|
|
35
13
|
getReleasedStrategiesList
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { PriceUtils } from "../../price-math.js";
|
|
2
|
+
import { getFactorFromLeverage } from "../leverage/index.js";
|
|
3
|
+
import { sortStrategyCMsByAvailability } from "../sort-strategy-cms-by-availability/index.js";
|
|
4
|
+
import { getStrategyMaxAPY } from "./get-strategy-max-apy.js";
|
|
5
|
+
import { isStrategyCMDisabled } from "./is-strategy-cm-disabled.js";
|
|
6
|
+
const EMPTY_ADDRESS = "";
|
|
7
|
+
const lc = (address) => address.toLowerCase();
|
|
8
|
+
function getStrategyInfoCore({
|
|
9
|
+
strategy,
|
|
10
|
+
creditManagers,
|
|
11
|
+
source,
|
|
12
|
+
apyListByNetwork,
|
|
13
|
+
quotaReserve,
|
|
14
|
+
slippage
|
|
15
|
+
}) {
|
|
16
|
+
const strategyCMsList = Object.values(creditManagers || {});
|
|
17
|
+
if (strategyCMsList.length === 0) return void 0;
|
|
18
|
+
const targetTokenAddress = lc(strategy.tokenOutAddress);
|
|
19
|
+
const openableCMsList = strategyCMsList.filter(
|
|
20
|
+
(cm) => !isStrategyCMDisabled(cm, cm.quotas[targetTokenAddress])
|
|
21
|
+
);
|
|
22
|
+
const pools = strategyCMsList.reduce(
|
|
23
|
+
(acc, cm) => {
|
|
24
|
+
const pool = source.getPool(cm.chainId, cm.pool);
|
|
25
|
+
if (pool) acc[cm.pool] = pool;
|
|
26
|
+
return acc;
|
|
27
|
+
},
|
|
28
|
+
{}
|
|
29
|
+
);
|
|
30
|
+
const minCreditManager = sortStrategyCMsByAvailability({
|
|
31
|
+
targetToken: targetTokenAddress,
|
|
32
|
+
allCreditManagers: openableCMsList.length > 0 ? openableCMsList : strategyCMsList,
|
|
33
|
+
apyListByNetwork,
|
|
34
|
+
slippage,
|
|
35
|
+
quotaReserve,
|
|
36
|
+
pools,
|
|
37
|
+
leverageLimit: strategy.maxLeverage,
|
|
38
|
+
isStrategy: true
|
|
39
|
+
})?.[0] || strategyCMsList[0];
|
|
40
|
+
const { underlyingToken = EMPTY_ADDRESS, availableToBorrow = 0n } = minCreditManager || {};
|
|
41
|
+
const {
|
|
42
|
+
bonusAPY,
|
|
43
|
+
totalMaxApy = 0,
|
|
44
|
+
maxLeverage = 0n,
|
|
45
|
+
baseBorrowRate = 0,
|
|
46
|
+
quotaRateMin = 0n
|
|
47
|
+
} = getStrategyMaxAPY(
|
|
48
|
+
targetTokenAddress,
|
|
49
|
+
minCreditManager,
|
|
50
|
+
apyListByNetwork,
|
|
51
|
+
slippage,
|
|
52
|
+
quotaReserve,
|
|
53
|
+
strategy.maxLeverage
|
|
54
|
+
) || {};
|
|
55
|
+
const prices = source.getMarketPrices(
|
|
56
|
+
minCreditManager?.chainId ?? strategy.chainId,
|
|
57
|
+
minCreditManager?.pool || EMPTY_ADDRESS
|
|
58
|
+
);
|
|
59
|
+
const underlyingPrice = prices?.[underlyingToken] || 0n;
|
|
60
|
+
const underlyingDecimals = source.getToken(strategy.chainId, underlyingToken)?.decimals || 18;
|
|
61
|
+
const availableToBorrowMoney = PriceUtils.calcTotalPrice(
|
|
62
|
+
underlyingPrice,
|
|
63
|
+
availableToBorrow,
|
|
64
|
+
underlyingDecimals
|
|
65
|
+
);
|
|
66
|
+
const r = BigInt(baseBorrowRate) * getFactorFromLeverage(maxLeverage) / maxLeverage;
|
|
67
|
+
const qr = quotaRateMin;
|
|
68
|
+
const totalBorrowRate = Number(r + qr);
|
|
69
|
+
return {
|
|
70
|
+
maxLeverage,
|
|
71
|
+
maxAPY: totalMaxApy,
|
|
72
|
+
bonusAPY,
|
|
73
|
+
totalBorrowRate,
|
|
74
|
+
availableToBorrowMoney,
|
|
75
|
+
minCreditManager
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
getStrategyInfoCore
|
|
80
|
+
};
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { isStrategyCMDisabled } from "./is-strategy-cm-disabled.js";
|
|
6
|
-
const EMPTY_ADDRESS = "";
|
|
7
|
-
const EMPTY_CHAIN_ID = 0;
|
|
1
|
+
import { getStrategyInfoCore } from "./get-strategy-info-core.js";
|
|
2
|
+
function getByAddress(record, address) {
|
|
3
|
+
return record?.[address] ?? record?.[address.toLowerCase()];
|
|
4
|
+
}
|
|
8
5
|
function getStrategyInfo({
|
|
9
6
|
strategy,
|
|
10
7
|
creditManagers,
|
|
@@ -14,60 +11,39 @@ function getStrategyInfo({
|
|
|
14
11
|
slippage,
|
|
15
12
|
allPricesByChain
|
|
16
13
|
}) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
minCreditManager,
|
|
14
|
+
return getStrategyInfoCore({
|
|
15
|
+
strategy,
|
|
16
|
+
creditManagers: creditManagers?.[strategy.chainId]?.[strategy.id],
|
|
17
|
+
source: {
|
|
18
|
+
hasToken(chainId, token) {
|
|
19
|
+
return !!getByAddress(
|
|
20
|
+
sdkStateByChain?.[chainId]?.tokens?.tokenDataList,
|
|
21
|
+
token
|
|
22
|
+
);
|
|
23
|
+
},
|
|
24
|
+
getToken(chainId, token) {
|
|
25
|
+
return getByAddress(
|
|
26
|
+
sdkStateByChain?.[chainId]?.tokens?.tokenDataList,
|
|
27
|
+
token
|
|
28
|
+
);
|
|
29
|
+
},
|
|
30
|
+
getPool(chainId, pool) {
|
|
31
|
+
return getByAddress(sdkStateByChain?.[chainId]?.pools, pool);
|
|
32
|
+
},
|
|
33
|
+
getCreditManager() {
|
|
34
|
+
return void 0;
|
|
35
|
+
},
|
|
36
|
+
getMarketPrices(chainId, pool) {
|
|
37
|
+
return getByAddress(allPricesByChain?.[chainId]?.prices, pool) || {};
|
|
38
|
+
},
|
|
39
|
+
getLastSyncTimestamp() {
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
},
|
|
47
43
|
apyListByNetwork,
|
|
48
|
-
slippage,
|
|
49
44
|
quotaReserve,
|
|
50
|
-
|
|
51
|
-
)
|
|
52
|
-
const prices = allPricesByChain?.[minCreditManager?.chainId ?? EMPTY_CHAIN_ID]?.prices?.[minCreditManager?.pool || EMPTY_ADDRESS];
|
|
53
|
-
const underlyingPrice = prices?.[underlyingToken] || 0n;
|
|
54
|
-
const underlyingDecimals = tokensList?.[underlyingToken]?.decimals || 18;
|
|
55
|
-
const availableToBorrowMoney = PriceUtils.calcTotalPrice(
|
|
56
|
-
underlyingPrice,
|
|
57
|
-
availableToBorrow,
|
|
58
|
-
underlyingDecimals
|
|
59
|
-
);
|
|
60
|
-
const r = BigInt(baseBorrowRate) * getFactorFromLeverage(maxLeverage) / maxLeverage;
|
|
61
|
-
const qr = quotaRateMin;
|
|
62
|
-
const totalBorrowRate = Number(r + qr);
|
|
63
|
-
return {
|
|
64
|
-
maxLeverage,
|
|
65
|
-
maxAPY: totalMaxApy,
|
|
66
|
-
bonusAPY,
|
|
67
|
-
totalBorrowRate,
|
|
68
|
-
availableToBorrowMoney,
|
|
69
|
-
minCreditManager
|
|
70
|
-
};
|
|
45
|
+
slippage
|
|
46
|
+
});
|
|
71
47
|
}
|
|
72
48
|
export {
|
|
73
49
|
getStrategyInfo
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { isStrategyCMDisabled } from "../strategy-info/is-strategy-cm-disabled.js";
|
|
2
|
+
const lc = (address) => address.toLowerCase();
|
|
2
3
|
function isStrategyDisabled(tokenOutAddress, cms) {
|
|
3
4
|
if (cms.length === 0) return true;
|
|
5
|
+
const targetToken = lc(tokenOutAddress);
|
|
4
6
|
const allCmsUnavailable = cms.every((cm) => {
|
|
5
|
-
const quota = cm.quotas[
|
|
7
|
+
const quota = cm.quotas[targetToken];
|
|
6
8
|
return isStrategyCMDisabled(cm, quota);
|
|
7
9
|
});
|
|
8
10
|
return allCmsUnavailable;
|
|
@@ -2,7 +2,9 @@ export * from "./chains.js";
|
|
|
2
2
|
export * from "./constants.js";
|
|
3
3
|
export * from "./credit-manager-data-legacy.js";
|
|
4
4
|
export * from "./curator-filter.js";
|
|
5
|
+
export * from "./legacy-strategy-data-source.js";
|
|
5
6
|
export * from "./sdk-state.js";
|
|
6
7
|
export * from "./strategies-cm-list.js";
|
|
7
8
|
export * from "./strategy.js";
|
|
9
|
+
export * from "./strategy-data-source.js";
|
|
8
10
|
export * from "./targetable.js";
|