@strkfarm/sdk 2.0.0-dev.9 → 2.0.0-staging.2

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 (64) hide show
  1. package/dist/index.browser.global.js +111371 -93151
  2. package/dist/index.browser.mjs +27815 -32690
  3. package/dist/index.d.ts +1095 -2011
  4. package/dist/index.js +27425 -32309
  5. package/dist/index.mjs +27590 -32452
  6. package/package.json +6 -5
  7. package/src/data/ekubo-price-fethcer.abi.json +265 -0
  8. package/src/data/universal-vault.abi.json +20 -135
  9. package/src/dataTypes/address.ts +0 -7
  10. package/src/dataTypes/index.ts +3 -2
  11. package/src/dataTypes/mynumber.ts +141 -0
  12. package/src/global.ts +296 -288
  13. package/src/index.browser.ts +6 -5
  14. package/src/interfaces/common.tsx +324 -184
  15. package/src/modules/apollo-client-config.ts +28 -0
  16. package/src/modules/avnu.ts +4 -17
  17. package/src/modules/ekubo-pricer.ts +79 -0
  18. package/src/modules/ekubo-quoter.ts +11 -88
  19. package/src/modules/erc20.ts +21 -67
  20. package/src/modules/harvests.ts +26 -15
  21. package/src/modules/index.ts +11 -13
  22. package/src/modules/lst-apr.ts +0 -36
  23. package/src/modules/pragma.ts +23 -8
  24. package/src/modules/pricer-from-api.ts +150 -14
  25. package/src/modules/pricer.ts +2 -1
  26. package/src/modules/pricerBase.ts +2 -1
  27. package/src/node/deployer.ts +36 -1
  28. package/src/node/pricer-redis.ts +2 -1
  29. package/src/strategies/autoCompounderStrk.ts +1 -1
  30. package/src/strategies/base-strategy.ts +5 -22
  31. package/src/strategies/ekubo-cl-vault.tsx +2904 -2175
  32. package/src/strategies/factory.ts +165 -0
  33. package/src/strategies/index.ts +10 -11
  34. package/src/strategies/registry.ts +268 -0
  35. package/src/strategies/sensei.ts +416 -292
  36. package/src/strategies/universal-adapters/adapter-utils.ts +1 -5
  37. package/src/strategies/universal-adapters/baseAdapter.ts +153 -181
  38. package/src/strategies/universal-adapters/common-adapter.ts +77 -98
  39. package/src/strategies/universal-adapters/index.ts +1 -5
  40. package/src/strategies/universal-adapters/vesu-adapter.ts +218 -220
  41. package/src/strategies/universal-adapters/vesu-supply-only-adapter.ts +51 -58
  42. package/src/strategies/universal-lst-muliplier-strategy.tsx +1952 -992
  43. package/src/strategies/universal-strategy.tsx +1713 -1150
  44. package/src/strategies/vesu-rebalance.tsx +1189 -986
  45. package/src/utils/health-factor-math.ts +5 -11
  46. package/src/utils/index.ts +8 -9
  47. package/src/utils/strategy-utils.ts +57 -0
  48. package/src/data/extended-deposit.abi.json +0 -3613
  49. package/src/modules/ExtendedWrapperSDk/index.ts +0 -62
  50. package/src/modules/ExtendedWrapperSDk/types.ts +0 -311
  51. package/src/modules/ExtendedWrapperSDk/wrapper.ts +0 -395
  52. package/src/modules/midas.ts +0 -159
  53. package/src/modules/token-market-data.ts +0 -202
  54. package/src/strategies/svk-strategy.ts +0 -247
  55. package/src/strategies/universal-adapters/adapter-optimizer.ts +0 -65
  56. package/src/strategies/universal-adapters/avnu-adapter.ts +0 -413
  57. package/src/strategies/universal-adapters/extended-adapter.ts +0 -972
  58. package/src/strategies/universal-adapters/unused-balance-adapter.ts +0 -109
  59. package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +0 -1306
  60. package/src/strategies/vesu-extended-strategy/services/operationService.ts +0 -34
  61. package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +0 -77
  62. package/src/strategies/vesu-extended-strategy/utils/constants.ts +0 -49
  63. package/src/strategies/vesu-extended-strategy/utils/helper.ts +0 -370
  64. package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +0 -1379
@@ -0,0 +1,165 @@
1
+ /**
2
+ * SDK Strategy Factory
3
+ *
4
+ * Creates SDK strategy instances from metadata.
5
+ */
6
+
7
+ import { IConfig, IStrategyMetadata } from "@/interfaces";
8
+ import { PricerBase } from "@/modules/pricerBase";
9
+ import {
10
+ UniversalStrategy,
11
+ UniversalStrategySettings
12
+ } from "./universal-strategy";
13
+ import { EkuboCLVault, CLVaultStrategySettings } from "./ekubo-cl-vault";
14
+ import {
15
+ UniversalLstMultiplierStrategy,
16
+ HyperLSTStrategySettings
17
+ } from "./universal-lst-muliplier-strategy";
18
+ import { VesuRebalance, VesuRebalanceSettings } from "./vesu-rebalance";
19
+ import { SenseiVault, SenseiVaultSettings } from "./sensei";
20
+
21
+ export enum FactoryStrategyType {
22
+ UNIVERSAL = "UNIVERSAL",
23
+ EKUBO_CL = "EKUBO_CL",
24
+ HYPER_LST = "HYPER_LST",
25
+ VESU_REBALANCE = "VESU_REBALANCE",
26
+ SENSEI = "SENSEI"
27
+ }
28
+
29
+ export function createUniversalStrategy(
30
+ config: IConfig,
31
+ pricer: PricerBase,
32
+ metadata: IStrategyMetadata<UniversalStrategySettings>
33
+ ): UniversalStrategy<UniversalStrategySettings> {
34
+ return new UniversalStrategy(config, pricer, metadata);
35
+ }
36
+
37
+ export function createEkuboCLStrategy(
38
+ config: IConfig,
39
+ pricer: PricerBase,
40
+ metadata: IStrategyMetadata<CLVaultStrategySettings>
41
+ ): EkuboCLVault {
42
+ return new EkuboCLVault(config, pricer, metadata);
43
+ }
44
+
45
+ export function createHyperLSTStrategy(
46
+ config: IConfig,
47
+ pricer: PricerBase,
48
+ metadata: IStrategyMetadata<HyperLSTStrategySettings>
49
+ ): UniversalLstMultiplierStrategy {
50
+ return new UniversalLstMultiplierStrategy(config, pricer, metadata);
51
+ }
52
+
53
+ export function createVesuRebalanceStrategy(
54
+ config: IConfig,
55
+ pricer: PricerBase,
56
+ metadata: IStrategyMetadata<VesuRebalanceSettings>
57
+ ): VesuRebalance {
58
+ return new VesuRebalance(config, pricer, metadata);
59
+ }
60
+
61
+ export function createSenseiStrategy(
62
+ config: IConfig,
63
+ pricer: PricerBase,
64
+ metadata: IStrategyMetadata<SenseiVaultSettings>
65
+ ): SenseiVault {
66
+ return new SenseiVault(config, pricer, metadata);
67
+ }
68
+
69
+ /**
70
+ * Determines the strategy type from metadata by inspecting the additionalInfo structure
71
+ */
72
+ export function getStrategyTypeFromMetadata(
73
+ metadata: IStrategyMetadata<any>
74
+ ): FactoryStrategyType {
75
+ const info = metadata.additionalInfo;
76
+
77
+ // Check for HyperLST (extends UniversalStrategySettings with borrowable_assets and underlyingToken)
78
+ if (info && "borrowable_assets" in info && "underlyingToken" in info) {
79
+ return FactoryStrategyType.HYPER_LST;
80
+ }
81
+
82
+ // Check for EkuboCL (has newBounds, rebalanceConditions, quoteAsset)
83
+ if (
84
+ info &&
85
+ ("newBounds" in info || typeof info.newBounds !== "undefined") &&
86
+ "rebalanceConditions" in info &&
87
+ "quoteAsset" in info
88
+ ) {
89
+ return FactoryStrategyType.EKUBO_CL;
90
+ }
91
+
92
+ // Check for Sensei (has mainToken, secondaryToken, targetHfBps)
93
+ if (
94
+ info &&
95
+ "mainToken" in info &&
96
+ "secondaryToken" in info &&
97
+ "targetHfBps" in info
98
+ ) {
99
+ return FactoryStrategyType.SENSEI;
100
+ }
101
+
102
+ // Check for VesuRebalance (has feeBps, but simpler structure)
103
+ if (info && "feeBps" in info && Object.keys(info).length <= 2) {
104
+ return FactoryStrategyType.VESU_REBALANCE;
105
+ }
106
+
107
+ // Check for Universal (has vaultAddress, manager, vaultAllocator, etc.)
108
+ if (
109
+ info &&
110
+ "vaultAddress" in info &&
111
+ "manager" in info &&
112
+ "vaultAllocator" in info
113
+ ) {
114
+ return FactoryStrategyType.UNIVERSAL;
115
+ }
116
+
117
+ throw new Error(
118
+ `Unable to determine strategy type from metadata: ${metadata.id}`
119
+ );
120
+ }
121
+
122
+ /**
123
+ * Generic factory function that creates SDK strategy instances based on type
124
+ */
125
+ export function createStrategy(
126
+ type: FactoryStrategyType,
127
+ config: IConfig,
128
+ pricer: PricerBase,
129
+ metadata: IStrategyMetadata<any>
130
+ ) {
131
+ switch (type) {
132
+ case FactoryStrategyType.UNIVERSAL:
133
+ return createUniversalStrategy(
134
+ config,
135
+ pricer,
136
+ metadata as IStrategyMetadata<UniversalStrategySettings>
137
+ );
138
+ case FactoryStrategyType.EKUBO_CL:
139
+ return createEkuboCLStrategy(
140
+ config,
141
+ pricer,
142
+ metadata as IStrategyMetadata<CLVaultStrategySettings>
143
+ );
144
+ case FactoryStrategyType.HYPER_LST:
145
+ return createHyperLSTStrategy(
146
+ config,
147
+ pricer,
148
+ metadata as IStrategyMetadata<HyperLSTStrategySettings>
149
+ );
150
+ case FactoryStrategyType.VESU_REBALANCE:
151
+ return createVesuRebalanceStrategy(
152
+ config,
153
+ pricer,
154
+ metadata as IStrategyMetadata<VesuRebalanceSettings>
155
+ );
156
+ case FactoryStrategyType.SENSEI:
157
+ return createSenseiStrategy(
158
+ config,
159
+ pricer,
160
+ metadata as IStrategyMetadata<SenseiVaultSettings>
161
+ );
162
+ default:
163
+ throw new Error(`Unknown strategy type: ${type}`);
164
+ }
165
+ }
@@ -1,11 +1,10 @@
1
- export * from './autoCompounderStrk';
2
- export * from './vesu-rebalance';
3
- export * from './ekubo-cl-vault';
4
- export * from './base-strategy';
5
- export * from './sensei';
6
- export * from './universal-adapters';
7
- export * from './universal-strategy';
8
- export * from './universal-lst-muliplier-strategy';
9
- export * from './vesu-extended-strategy/vesu-extended-strategy';
10
- export * from './vesu-extended-strategy/utils/config.runtime';
11
- export * from './vesu-extended-strategy/utils/helper';
1
+ export * from "./autoCompounderStrk";
2
+ export * from "./vesu-rebalance";
3
+ export * from "./ekubo-cl-vault";
4
+ export * from "./base-strategy";
5
+ export * from "./sensei";
6
+ export * from "./universal-adapters";
7
+ export * from "./universal-strategy";
8
+ export * from "./universal-lst-muliplier-strategy";
9
+ export * from "./registry";
10
+ export * from "./factory";
@@ -0,0 +1,268 @@
1
+ import { IStrategyMetadata } from "@/interfaces";
2
+ import {
3
+ EkuboCLVaultStrategies,
4
+ CLVaultStrategySettings
5
+ } from "./ekubo-cl-vault";
6
+ import {
7
+ HyperLSTStrategies,
8
+ HyperLSTStrategySettings
9
+ } from "./universal-lst-muliplier-strategy";
10
+ import { UniversalStrategies } from "./universal-strategy";
11
+ import { VesuRebalanceStrategies } from "./vesu-rebalance";
12
+ import { SenseiStrategies } from "./sensei";
13
+
14
+ /**
15
+ * Filter option definition
16
+ */
17
+ export interface FilterOption {
18
+ id: string;
19
+ label: string;
20
+ icon?: string;
21
+ }
22
+
23
+ /**
24
+ * Strategy filter metadata - defines what filters are available
25
+ */
26
+ export interface StrategyFilterMetadata {
27
+ assets: FilterOption[];
28
+ protocols: FilterOption[];
29
+ categories: FilterOption[];
30
+ quickFilters: FilterOption[];
31
+ }
32
+
33
+ /**
34
+ * Strategy type enum
35
+ */
36
+ export enum StrategyType {
37
+ EKUBO_CL = "ekubo",
38
+ UNIVERSAL = "universal",
39
+ HYPER_LST = "hyper-lst",
40
+ VESU_REBALANCE = "vesu-rebalance",
41
+ SENSEI = "sensei"
42
+ }
43
+
44
+ /**
45
+ * Strategy metadata extracted from IStrategyMetadata
46
+ */
47
+ export interface StrategyMetadata {
48
+ id: string;
49
+ name: string;
50
+ type: StrategyType;
51
+ assets: string[]; // Token symbols (e.g., ["STRK", "USDC"])
52
+ protocols: string[]; // Protocol names (e.g., ["Ekubo"])
53
+ category: string; // Category (e.g., "BTC", "Meta Vaults")
54
+ tags: string[];
55
+ curator?: { name: string; logo: string };
56
+ isRetired: boolean;
57
+ }
58
+
59
+ /**
60
+ * Strategy registry entry
61
+ */
62
+ export interface StrategyRegistryEntry<T = any> {
63
+ metadata: IStrategyMetadata<T>;
64
+ type: StrategyType;
65
+ }
66
+
67
+ /**
68
+ * Extract assets from strategy metadata
69
+ */
70
+ function extractAssets(metadata: IStrategyMetadata<any>): string[] {
71
+ const assets: string[] = [];
72
+ if (metadata.depositTokens) {
73
+ metadata.depositTokens.forEach((token) => {
74
+ const symbol = token.symbol?.toLowerCase() || "";
75
+ if (symbol) {
76
+ assets.push(symbol);
77
+ }
78
+ });
79
+ }
80
+ return assets;
81
+ }
82
+
83
+ /**
84
+ * Check if strategy is retired
85
+ */
86
+ function isRetired(metadata: IStrategyMetadata<any>): boolean {
87
+ // Check liveStatus if available
88
+ const liveStatus = (metadata as any).liveStatus?.toLowerCase() || "";
89
+ return liveStatus === "retired" || liveStatus === "coming soon";
90
+ }
91
+
92
+ /**
93
+ * Build strategy registry from SDK strategies
94
+ */
95
+ export function buildStrategyRegistry(): StrategyRegistryEntry[] {
96
+ const registry: StrategyRegistryEntry[] = [];
97
+
98
+ // Register Ekubo CL Vault strategies
99
+ if (EkuboCLVaultStrategies && Array.isArray(EkuboCLVaultStrategies)) {
100
+ EkuboCLVaultStrategies.forEach((metadata) => {
101
+ registry.push({
102
+ metadata,
103
+ type: StrategyType.EKUBO_CL
104
+ });
105
+ });
106
+ }
107
+
108
+ // Register Universal strategies
109
+ if (UniversalStrategies && Array.isArray(UniversalStrategies)) {
110
+ UniversalStrategies.forEach((metadata) => {
111
+ registry.push({
112
+ metadata,
113
+ type: StrategyType.UNIVERSAL
114
+ });
115
+ });
116
+ }
117
+
118
+ // Register Hyper LST strategies
119
+ if (HyperLSTStrategies && Array.isArray(HyperLSTStrategies)) {
120
+ HyperLSTStrategies.forEach((metadata) => {
121
+ registry.push({
122
+ metadata,
123
+ type: StrategyType.HYPER_LST
124
+ });
125
+ });
126
+ }
127
+
128
+ // Register Vesu Rebalance strategies
129
+ if (VesuRebalanceStrategies && Array.isArray(VesuRebalanceStrategies)) {
130
+ VesuRebalanceStrategies.forEach((metadata) => {
131
+ registry.push({
132
+ metadata: metadata as any, // Type cast for compatibility
133
+ type: StrategyType.VESU_REBALANCE
134
+ });
135
+ });
136
+ }
137
+
138
+ // Register Sensei strategies
139
+ if (SenseiStrategies && Array.isArray(SenseiStrategies)) {
140
+ SenseiStrategies.forEach((metadata) => {
141
+ registry.push({
142
+ metadata: metadata as any,
143
+ type: StrategyType.SENSEI
144
+ });
145
+ });
146
+ }
147
+
148
+ return registry;
149
+ }
150
+
151
+ /**
152
+ * Get all strategy metadata from registry
153
+ */
154
+ export function getAllStrategyMetadata(): StrategyMetadata[] {
155
+ const registry = buildStrategyRegistry();
156
+ return registry.map((entry) => {
157
+ const metadataAny = entry.metadata as any;
158
+ return {
159
+ id: metadataAny.id || entry.metadata.name || "unknown",
160
+ name: entry.metadata.name || "Unknown Strategy",
161
+ type: entry.type,
162
+ assets: extractAssets(entry.metadata),
163
+ protocols: entry.metadata.protocols.map((p) =>
164
+ p.name.toLowerCase()
165
+ ),
166
+ category: entry.metadata.category || "",
167
+ tags: entry.metadata.tags || [],
168
+ curator: entry.metadata.curator,
169
+ isRetired: isRetired(entry.metadata)
170
+ };
171
+ });
172
+ }
173
+
174
+ /**
175
+ * Get filter metadata - defines available filters and their options
176
+ */
177
+ export function getFilterMetadata(): StrategyFilterMetadata {
178
+ const allMetadata = getAllStrategyMetadata();
179
+
180
+ // Extract unique assets
181
+ const assetSet = new Set<string>();
182
+ allMetadata.forEach((meta) => {
183
+ meta.assets.forEach((asset) => assetSet.add(asset));
184
+ });
185
+
186
+ const allowedAssets = new Set(["eth", "btc", "strk", "usdt", "usdc"]);
187
+ const assets: FilterOption[] = Array.from(assetSet)
188
+ .filter((asset) => allowedAssets.has(asset.toLowerCase()))
189
+ .sort((a, b) => {
190
+ // Sort in specific order: ETH, BTC, STRK, USDT, USDC
191
+ const order = ["eth", "btc", "strk", "usdt", "usdc"];
192
+ const aIndex = order.indexOf(a.toLowerCase());
193
+ const bIndex = order.indexOf(b.toLowerCase());
194
+ if (aIndex === -1 && bIndex === -1) return 0;
195
+ if (aIndex === -1) return 1;
196
+ if (bIndex === -1) return -1;
197
+ return aIndex - bIndex;
198
+ })
199
+ .map((id) => ({
200
+ id,
201
+ label: id.toUpperCase()
202
+ }));
203
+
204
+ // Extract unique protocols
205
+ const protocolSet = new Set<string>();
206
+ allMetadata.forEach((meta) => {
207
+ meta.protocols.forEach((protocol) => protocolSet.add(protocol));
208
+ });
209
+ const protocols: FilterOption[] = Array.from(protocolSet)
210
+ .sort()
211
+ .map((id) => ({
212
+ id,
213
+ label:
214
+ id === "meta-vaults"
215
+ ? "Meta Vaults"
216
+ : id.charAt(0).toUpperCase() + id.slice(1)
217
+ }));
218
+
219
+ // Extract unique categories
220
+ const categorySet = new Set<string>();
221
+ allMetadata.forEach((meta) => {
222
+ if (meta.category) categorySet.add(meta.category);
223
+ });
224
+ const categories: FilterOption[] = Array.from(categorySet)
225
+ .sort()
226
+ .map((id) => ({
227
+ id,
228
+ label:
229
+ id === "btc"
230
+ ? "BTC"
231
+ : id === "meta-vaults"
232
+ ? "Meta Vaults"
233
+ : "All"
234
+ }));
235
+
236
+ const quickFilters: FilterOption[] = [
237
+ { id: "all", label: "All Strategies" },
238
+ { id: "btc", label: "BTC" },
239
+ { id: "ekubo", label: "Ekubo" },
240
+ { id: "endur", label: "Endur" },
241
+ { id: "meta-vaults", label: "Meta Vaults" }
242
+ ];
243
+
244
+ return {
245
+ assets,
246
+ protocols,
247
+ categories,
248
+ quickFilters
249
+ };
250
+ }
251
+
252
+ /**
253
+ * Get live strategies (filter out retired)
254
+ */
255
+ export function getLiveStrategies(): StrategyRegistryEntry[] {
256
+ const registry = buildStrategyRegistry();
257
+ return registry.filter((entry) => !isRetired(entry.metadata));
258
+ }
259
+
260
+ /**
261
+ * Get strategies by type
262
+ */
263
+ export function getStrategiesByType(
264
+ type: StrategyType
265
+ ): StrategyRegistryEntry[] {
266
+ const registry = buildStrategyRegistry();
267
+ return registry.filter((entry) => entry.type === type);
268
+ }