@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.
Files changed (60) hide show
  1. package/dist/cjs/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list-core.js +66 -0
  2. package/dist/cjs/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list.js +7 -18
  3. package/dist/cjs/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers.js +4 -6
  4. package/dist/cjs/common-utils/utils/strategies/credit-managers/index.js +2 -0
  5. package/dist/cjs/common-utils/utils/strategies/lists/get-released-strategies-list-core.js +61 -0
  6. package/dist/cjs/common-utils/utils/strategies/lists/get-released-strategies-list.js +9 -31
  7. package/dist/cjs/common-utils/utils/strategies/lists/index.js +3 -1
  8. package/dist/cjs/common-utils/utils/strategies/strategy-info/get-strategy-info-core.js +104 -0
  9. package/dist/cjs/common-utils/utils/strategies/strategy-info/get-strategy-info.js +35 -59
  10. package/dist/cjs/common-utils/utils/strategies/strategy-info/index.js +2 -0
  11. package/dist/cjs/common-utils/utils/strategies/strategy-state/is-strategy-disabled.js +3 -1
  12. package/dist/cjs/common-utils/utils/strategies/types/index.js +4 -0
  13. package/dist/cjs/common-utils/utils/strategies/types/legacy-strategy-data-source.js +62 -0
  14. package/dist/cjs/common-utils/utils/strategies/types/strategy-data-source.js +16 -0
  15. package/dist/cjs/plugins/apy/ApyPlugin.js +65 -0
  16. package/dist/cjs/plugins/apy/strategy-data-source.js +176 -0
  17. package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list-core.js +42 -0
  18. package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list.js +7 -18
  19. package/dist/esm/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers.js +4 -6
  20. package/dist/esm/common-utils/utils/strategies/credit-managers/index.js +1 -0
  21. package/dist/esm/common-utils/utils/strategies/lists/get-released-strategies-list-core.js +37 -0
  22. package/dist/esm/common-utils/utils/strategies/lists/get-released-strategies-list.js +9 -31
  23. package/dist/esm/common-utils/utils/strategies/lists/index.js +1 -0
  24. package/dist/esm/common-utils/utils/strategies/strategy-info/get-strategy-info-core.js +80 -0
  25. package/dist/esm/common-utils/utils/strategies/strategy-info/get-strategy-info.js +35 -59
  26. package/dist/esm/common-utils/utils/strategies/strategy-info/index.js +1 -0
  27. package/dist/esm/common-utils/utils/strategies/strategy-state/is-strategy-disabled.js +3 -1
  28. package/dist/esm/common-utils/utils/strategies/types/index.js +2 -0
  29. package/dist/esm/common-utils/utils/strategies/types/legacy-strategy-data-source.js +38 -0
  30. package/dist/esm/common-utils/utils/strategies/types/strategy-data-source.js +0 -0
  31. package/dist/esm/plugins/apy/ApyPlugin.js +70 -0
  32. package/dist/esm/plugins/apy/strategy-data-source.js +159 -0
  33. package/dist/types/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list-core.d.ts +7 -0
  34. package/dist/types/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers-list.d.ts +2 -2
  35. package/dist/types/common-utils/utils/strategies/credit-managers/get-strategy-credit-managers.d.ts +3 -3
  36. package/dist/types/common-utils/utils/strategies/credit-managers/index.d.ts +1 -0
  37. package/dist/types/common-utils/utils/strategies/credit-managers/is-credit-manager-usable.d.ts +2 -2
  38. package/dist/types/common-utils/utils/strategies/eligibility/is-strategy-eligible.d.ts +2 -2
  39. package/dist/types/common-utils/utils/strategies/lists/get-available-and-disabled-strategies.d.ts +2 -2
  40. package/dist/types/common-utils/utils/strategies/lists/get-available-strategies.d.ts +2 -2
  41. package/dist/types/common-utils/utils/strategies/lists/get-disabled-strategies.d.ts +2 -2
  42. package/dist/types/common-utils/utils/strategies/lists/get-released-strategies-list-core.d.ts +9 -0
  43. package/dist/types/common-utils/utils/strategies/lists/get-released-strategies-list.d.ts +2 -2
  44. package/dist/types/common-utils/utils/strategies/lists/index.d.ts +1 -0
  45. package/dist/types/common-utils/utils/strategies/strategy-info/get-strategy-info-core.d.ts +12 -0
  46. package/dist/types/common-utils/utils/strategies/strategy-info/index.d.ts +1 -0
  47. package/dist/types/common-utils/utils/strategies/strategy-state/is-strategy-disabled.d.ts +2 -2
  48. package/dist/types/common-utils/utils/strategies/tokens/is-activated-token.d.ts +2 -2
  49. package/dist/types/common-utils/utils/strategies/tokens/is-forbidden-token.d.ts +2 -2
  50. package/dist/types/common-utils/utils/strategies/types/credit-manager-data-legacy.d.ts +3 -7
  51. package/dist/types/common-utils/utils/strategies/types/index.d.ts +2 -0
  52. package/dist/types/common-utils/utils/strategies/types/legacy-strategy-data-source.d.ts +4 -0
  53. package/dist/types/common-utils/utils/strategies/types/sdk-state.d.ts +5 -4
  54. package/dist/types/common-utils/utils/strategies/types/strategies-cm-list.d.ts +2 -2
  55. package/dist/types/common-utils/utils/strategies/types/strategy-data-source.d.ts +19 -0
  56. package/dist/types/common-utils/utils/strategies/types/targetable.d.ts +2 -2
  57. package/dist/types/plugins/apy/ApyPlugin.d.ts +8 -1
  58. package/dist/types/plugins/apy/strategy-data-source.d.ts +16 -0
  59. package/dist/types/plugins/apy/types.d.ts +18 -1
  60. 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
+ };
@@ -1,23 +1,12 @@
1
- import { TypedObjectUtils } from "../../../../sdk/utils/mappers.js";
2
- import { getStrategyCreditManagers } from "./get-strategy-credit-managers.js";
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
- if (!strategies) return strategies;
6
- const r = strategies.reduce((acc, s) => {
7
- const currentSdkState = sdkStateByChain[s.chainId];
8
- const { creditManagers, tokens } = currentSdkState || {};
9
- const cms = creditManagers && tokens ? getStrategyCreditManagers({
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
@@ -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
- function getStrategyCreditManagers({
4
- strategy,
5
- allCreditManagers
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,
@@ -1,3 +1,4 @@
1
1
  export * from "./get-strategy-credit-managers.js";
2
2
  export * from "./get-strategy-credit-managers-list.js";
3
+ export * from "./get-strategy-credit-managers-list-core.js";
3
4
  export * from "./is-credit-manager-usable.js";
@@ -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 { isStrategyEligible } from "../eligibility/is-strategy-eligible.js";
2
- import { isStrategyReleased } from "../eligibility/is-strategy-released.js";
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
- if (!allowedChains) return void 0;
5
- if (!strategyPayloadsList) return void 0;
6
- const eligibleStrategies = strategyPayloadsList.reduce(
7
- (acc, s) => {
8
- const eligible = isStrategyEligible(
9
- s,
10
- allowedChains,
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
@@ -1,2 +1,3 @@
1
1
  export * from "./get-available-and-disabled-strategies.js";
2
2
  export * from "./get-released-strategies-list.js";
3
+ export * from "./get-released-strategies-list-core.js";
@@ -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 { 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 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
- const strategyCMs = creditManagers?.[strategy.chainId]?.[strategy.id] || {};
18
- const strategyCMsList = Object.values(strategyCMs);
19
- if (strategyCMsList.length === 0) return void 0;
20
- const openableCMsList = strategyCMsList.filter(
21
- (cm) => !isStrategyCMDisabled(cm, cm.quotas[strategy.tokenOutAddress])
22
- );
23
- const currentSdkState = sdkStateByChain?.[strategy.chainId];
24
- const pools = currentSdkState?.pools;
25
- const tokensList = currentSdkState?.tokens?.tokenDataList;
26
- const targetTokenAddress = strategy.tokenOutAddress;
27
- const minCreditManager = sortStrategyCMsByAvailability({
28
- targetToken: targetTokenAddress,
29
- allCreditManagers: openableCMsList.length > 0 ? openableCMsList : strategyCMsList,
30
- apyListByNetwork,
31
- slippage,
32
- quotaReserve,
33
- pools,
34
- leverageLimit: strategy.maxLeverage,
35
- isStrategy: true
36
- })?.[0] || strategyCMsList[0];
37
- const { underlyingToken = EMPTY_ADDRESS, availableToBorrow = 0n } = minCreditManager || {};
38
- const {
39
- bonusAPY,
40
- totalMaxApy = 0,
41
- maxLeverage = 0n,
42
- baseBorrowRate = 0,
43
- quotaRateMin = 0n
44
- } = getStrategyMaxAPY(
45
- targetTokenAddress,
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
- strategy.maxLeverage
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,5 +1,6 @@
1
1
  export * from "./cm-availability-condition.js";
2
2
  export * from "./get-strategy-info.js";
3
+ export * from "./get-strategy-info-core.js";
3
4
  export * from "./get-strategy-max-apy.js";
4
5
  export * from "./is-strategy-cm-disabled.js";
5
6
  export * from "./types.js";
@@ -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[tokenOutAddress];
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";