@strkfarm/sdk 1.1.70 → 2.0.0-dev.1

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 (53) hide show
  1. package/dist/cli.js +2 -2
  2. package/dist/cli.mjs +2 -2
  3. package/dist/index.browser.global.js +66861 -59746
  4. package/dist/index.browser.mjs +24970 -18579
  5. package/dist/index.d.ts +1969 -776
  6. package/dist/index.js +25264 -18850
  7. package/dist/index.mjs +25463 -19089
  8. package/package.json +80 -76
  9. package/src/data/extended-deposit.abi.json +3613 -0
  10. package/src/data/universal-vault.abi.json +135 -20
  11. package/src/dataTypes/address.ts +8 -1
  12. package/src/global.ts +240 -193
  13. package/src/interfaces/common.tsx +26 -2
  14. package/src/modules/ExtendedWrapperSDk/index.ts +62 -0
  15. package/src/modules/ExtendedWrapperSDk/types.ts +311 -0
  16. package/src/modules/ExtendedWrapperSDk/wrapper.ts +395 -0
  17. package/src/modules/avnu.ts +17 -4
  18. package/src/modules/ekubo-quoter.ts +98 -10
  19. package/src/modules/erc20.ts +67 -21
  20. package/src/modules/harvests.ts +16 -29
  21. package/src/modules/index.ts +5 -1
  22. package/src/modules/lst-apr.ts +36 -0
  23. package/src/modules/midas.ts +159 -0
  24. package/src/modules/pricer-from-api.ts +2 -2
  25. package/src/modules/pricer-lst.ts +1 -1
  26. package/src/modules/pricer.ts +3 -38
  27. package/src/modules/token-market-data.ts +202 -0
  28. package/src/node/deployer.ts +1 -36
  29. package/src/strategies/autoCompounderStrk.ts +1 -1
  30. package/src/strategies/base-strategy.ts +20 -3
  31. package/src/strategies/ekubo-cl-vault.tsx +123 -306
  32. package/src/strategies/index.ts +4 -1
  33. package/src/strategies/svk-strategy.ts +247 -0
  34. package/src/strategies/universal-adapters/adapter-optimizer.ts +65 -0
  35. package/src/strategies/universal-adapters/adapter-utils.ts +5 -1
  36. package/src/strategies/universal-adapters/avnu-adapter.ts +418 -0
  37. package/src/strategies/universal-adapters/baseAdapter.ts +181 -153
  38. package/src/strategies/universal-adapters/common-adapter.ts +98 -77
  39. package/src/strategies/universal-adapters/extended-adapter.ts +544 -0
  40. package/src/strategies/universal-adapters/index.ts +5 -1
  41. package/src/strategies/universal-adapters/unused-balance-adapter.ts +109 -0
  42. package/src/strategies/universal-adapters/vesu-adapter.ts +220 -218
  43. package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +924 -0
  44. package/src/strategies/universal-adapters/vesu-supply-only-adapter.ts +58 -51
  45. package/src/strategies/universal-lst-muliplier-strategy.tsx +707 -774
  46. package/src/strategies/universal-strategy.tsx +1098 -1180
  47. package/src/strategies/vesu-extended-strategy/services/operationService.ts +28 -0
  48. package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +77 -0
  49. package/src/strategies/vesu-extended-strategy/utils/constants.ts +48 -0
  50. package/src/strategies/vesu-extended-strategy/utils/helper.ts +374 -0
  51. package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +992 -0
  52. package/src/strategies/vesu-rebalance.tsx +16 -19
  53. package/src/utils/health-factor-math.ts +11 -5
@@ -1,30 +1,27 @@
1
1
  import { ContractAddr, Web3Number } from "@/dataTypes";
2
- import { IConfig, TokenInfo } from "@/interfaces";
2
+ import { IConfig, Protocols, TokenInfo } from "@/interfaces";
3
3
  import { PricerBase } from "@/modules/pricerBase";
4
- import { BaseAdapter, BaseAdapterConfig, SupportedPosition, PositionInfo, PositionAPY, APYType, ManageCall, AdapterLeafType, GenerateCallFn } from "./baseAdapter";
4
+ import { BaseAdapter, BaseAdapterConfig, SupportedPosition, PositionInfo, PositionAPY, APYType, ManageCall, AdapterLeafType, GenerateCallFn, DepositParams, WithdrawParams, PositionAmount } from "./baseAdapter";
5
5
  import { SIMPLE_SANITIZER, toBigInt } from "./adapter-utils";
6
6
  import { hash, uint256, Contract } from "starknet";
7
7
  import { VesuAdapter } from "./vesu-adapter";
8
8
  import { logger } from "@/utils";
9
+ import ERC4626Abi from "@/data/erc4626.abi.json";
10
+ import { TokenMarketData } from "@/modules";
9
11
 
10
12
  export interface VesuSupplyOnlyAdapterConfig extends BaseAdapterConfig {
11
13
  vTokenContract: ContractAddr;
12
14
  }
13
15
 
14
- export interface DepositParams {
15
- amount: Web3Number;
16
- }
17
-
18
- export interface WithdrawParams {
19
- amount: Web3Number;
20
- }
21
16
 
22
- export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
17
+ export class VesuSupplyOnlyAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
23
18
  readonly config: VesuSupplyOnlyAdapterConfig;
19
+ readonly tokenMarketData: TokenMarketData;
24
20
 
25
21
  constructor(config: VesuSupplyOnlyAdapterConfig) {
26
- super(config);
22
+ super(config, VesuSupplyOnlyAdapter.name, Protocols.VESU);
27
23
  this.config = config;
24
+ this.tokenMarketData = new TokenMarketData(this.config.pricer, this.config.networkConfig);
28
25
  }
29
26
 
30
27
  protected async getAPY(supportedPosition: SupportedPosition): Promise<PositionAPY> {
@@ -71,14 +68,14 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
71
68
  const supplyApy = Number(assetStats.supplyApy?.value || 0) / 1e18;
72
69
 
73
70
  // Get LST APR if applicable (for LST tokens)
74
- let lstAPY = 0;
75
- if (baseToken.symbol === 'STRK' || baseToken.symbol === 'ETH') {
76
- // This would need to be implemented based on your LST APR service
77
- // For now, using a placeholder
78
- lstAPY = 0;
79
- }
71
+ const isSupported = this.tokenMarketData.isAPYSupported(baseToken);
72
+ const lstAPY = isSupported ? await this.tokenMarketData.getAPY(baseToken) : 0;
80
73
 
81
- const totalAPY = supplyApy + lstAPY;
74
+ const rewardAPY = Number(assetStats.defiSpringSupplyApr?.value || "0") / 1e18;
75
+
76
+ // only account lstAPY if rewardAPY is positive
77
+ // bcz, without rewards, no point in simply depositing LST in vesu
78
+ const totalAPY = rewardAPY > 0 ? rewardAPY + supplyApy + lstAPY : supplyApy;
82
79
 
83
80
  const result = {
84
81
  apy: totalAPY,
@@ -89,16 +86,13 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
89
86
  return result;
90
87
  } catch (error) {
91
88
  logger.error(`VesuSupplyOnlyAdapter: Error getting APY for ${supportedPosition.asset.symbol}:`, error);
92
- return {
93
- apy: 0,
94
- type: APYType.BASE
95
- };
89
+ throw error;
96
90
  }
97
91
  }
98
92
 
99
- protected async getPosition(supportedPosition: SupportedPosition): Promise<Web3Number> {
93
+ protected async getPosition(supportedPosition: SupportedPosition): Promise<PositionAmount> {
100
94
  const CACHE_KEY = `position_${this.config.vTokenContract.address}`;
101
- const cacheData = this.getCache<Web3Number>(CACHE_KEY);
95
+ const cacheData = this.getCache<PositionAmount>(CACHE_KEY);
102
96
  if (cacheData) {
103
97
  return cacheData;
104
98
  }
@@ -106,69 +100,78 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
106
100
  try {
107
101
  // Create contract instance for the vToken
108
102
  const vTokenContract = new Contract({
109
- abi: [], // We only need basic ERC20 methods
103
+ abi: ERC4626Abi, // We only need basic ERC20 methods
110
104
  address: this.config.vTokenContract.address,
111
105
  providerOrAccount: this.config.networkConfig.provider
112
106
  });
113
107
 
114
108
  // Get the vault allocator's balance (shares) in the vToken contract
115
- const shares = await vTokenContract.balanceOf(this.config.vaultAllocator.address);
109
+ const shares = await vTokenContract.balance_of(this.config.vaultAllocator.address);
116
110
 
117
111
  // Convert shares to assets using convert_to_assets
118
112
  const assets = await vTokenContract.convert_to_assets(
119
113
  uint256.bnToUint256(shares)
120
114
  );
121
115
 
122
- const result = Web3Number.fromWei(
123
- assets.toString(),
124
- supportedPosition.asset.decimals
125
- );
116
+ const result = {
117
+ amount: Web3Number.fromWei(
118
+ assets.toString(),
119
+ supportedPosition.asset.decimals
120
+ ),
121
+ remarks: "Vesu Earn"
122
+ };
126
123
 
127
124
  this.setCache(CACHE_KEY, result, 60000); // Cache for 1 minute
128
125
  return result;
129
126
  } catch (error) {
130
127
  logger.error(`VesuSupplyOnlyAdapter: Error getting position for ${supportedPosition.asset.symbol}:`, error);
131
- return new Web3Number('0', supportedPosition.asset.decimals);
128
+ throw error;
132
129
  }
133
130
  }
134
131
 
135
- protected async maxDeposit(amount?: Web3Number): Promise<PositionInfo[]> {
132
+ async maxDeposit(amount?: Web3Number): Promise<PositionInfo> {
136
133
  const baseToken = this.config.baseToken;
137
134
  // todo for assets with some borrowing on Vesu, the yield wont
138
135
  // remain same as supply increases. So need to account for that.
139
136
 
140
137
  if (!amount) {
141
138
  // Return infinity for max deposit when no amount specified
142
- return [{
139
+ return {
140
+ tokenInfo: baseToken,
143
141
  amount: new Web3Number('999999999999999999999999999', baseToken.decimals),
144
142
  usdValue: 999999999999999999999999999,
145
143
  remarks: "Max deposit (infinity)",
146
- apy: await this.getAPY({ asset: baseToken, isDebt: false })
147
- }];
144
+ apy: await this.getAPY({ asset: baseToken, isDebt: false }),
145
+ protocol: this.protocol
146
+ };
148
147
  }
149
148
 
150
149
  // Return position info based on input amount
151
150
  const usdValue = await this.getUSDValue(baseToken, amount);
152
- return [{
151
+ return {
152
+ tokenInfo: baseToken,
153
153
  amount,
154
154
  usdValue,
155
155
  remarks: "Deposit amount",
156
- apy: await this.getAPY({ asset: baseToken, isDebt: false })
157
- }];
156
+ apy: await this.getAPY({ asset: baseToken, isDebt: false }),
157
+ protocol: this.protocol
158
+ };
158
159
  }
159
160
 
160
- protected async maxWithdraw(): Promise<PositionInfo[]> {
161
+ async maxWithdraw(): Promise<PositionInfo> {
161
162
  const baseToken = this.config.baseToken;
162
163
  const currentPosition = await this.getPosition({ asset: baseToken, isDebt: false });
163
164
 
164
165
  // Return the current position as max withdraw
165
- const usdValue = await this.getUSDValue(baseToken, currentPosition);
166
- return [{
167
- amount: currentPosition,
166
+ const usdValue = await this.getUSDValue(baseToken, currentPosition.amount);
167
+ return {
168
+ tokenInfo: baseToken,
169
+ amount: currentPosition.amount,
168
170
  usdValue,
169
171
  remarks: "Max withdraw",
170
- apy: await this.getAPY({ asset: baseToken, isDebt: false })
171
- }];
172
+ apy: await this.getAPY({ asset: baseToken, isDebt: false }),
173
+ protocol: this.protocol
174
+ };
172
175
  }
173
176
 
174
177
  protected _getDepositLeaf(): {
@@ -190,7 +193,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
190
193
  vTokenContract.toBigInt(), // spender
191
194
  ],
192
195
  sanitizer: SIMPLE_SANITIZER,
193
- id: `approve_deposit_vtoken_${this.config.vTokenContract.address}`
196
+ id: `appr_dep_vtkn_${this.config.vTokenContract.shortString()}`
194
197
  },
195
198
  // Deposit step
196
199
  {
@@ -200,7 +203,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
200
203
  this.config.vaultAllocator.toBigInt(),
201
204
  ],
202
205
  sanitizer: SIMPLE_SANITIZER,
203
- id: `deposit_vtoken_${this.config.vTokenContract.address}`
206
+ id: `deposit_vtoken_${this.config.vTokenContract.shortString()}`
204
207
  }
205
208
  ];
206
209
  }
@@ -224,7 +227,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
224
227
  this.config.vaultAllocator.toBigInt(),
225
228
  ],
226
229
  sanitizer: SIMPLE_SANITIZER,
227
- id: `withdraw_vtoken_${this.config.vTokenContract.address}`
230
+ id: `withdraw_vtoken_${this.config.vTokenContract.shortString()}`
228
231
  }
229
232
  ];
230
233
  }
@@ -241,7 +244,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
241
244
  }, sanitizer);
242
245
  return leaf;
243
246
  });
244
- return { leaves, callConstructor: this.createDepositCall.bind(this) as unknown as GenerateCallFn<DepositParams> };
247
+ return { leaves, callConstructor: this.getDepositCall.bind(this) as unknown as GenerateCallFn<DepositParams> };
245
248
  }
246
249
 
247
250
  getWithdrawAdapter(): AdapterLeafType<WithdrawParams> {
@@ -256,10 +259,10 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
256
259
  }, sanitizer);
257
260
  return leaf;
258
261
  });
259
- return { leaves, callConstructor: this.createWithdrawCall.bind(this) as unknown as GenerateCallFn<WithdrawParams> };
262
+ return { leaves, callConstructor: this.getWithdrawCall.bind(this) as unknown as GenerateCallFn<WithdrawParams> };
260
263
  }
261
264
 
262
- private createDepositCall(params: DepositParams): ManageCall[] {
265
+ async getDepositCall(params: DepositParams): Promise<ManageCall[]> {
263
266
  const baseToken = this.config.baseToken;
264
267
  const vTokenContract = this.config.vTokenContract;
265
268
 
@@ -296,7 +299,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
296
299
  ];
297
300
  }
298
301
 
299
- private createWithdrawCall(params: WithdrawParams): ManageCall[] {
302
+ async getWithdrawCall(params: WithdrawParams): Promise<ManageCall[]> {
300
303
  const vTokenContract = this.config.vTokenContract;
301
304
 
302
305
  const amount = params.amount;
@@ -319,4 +322,8 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
319
322
  }
320
323
  ];
321
324
  }
325
+
326
+ getHealthFactor(): Promise<number> {
327
+ return Promise.resolve(10);
328
+ }
322
329
  }