@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
@@ -1,413 +0,0 @@
1
- import {
2
- BaseAdapter,
3
- DepositParams,
4
- WithdrawParams,
5
- BaseAdapterConfig,
6
- } from "./baseAdapter";
7
- import { toBigInt } from "./adapter-utils";
8
- import { Protocols } from "@/interfaces";
9
- import { MAX_DELAY } from "../vesu-extended-strategy/utils/constants";
10
- import { SupportedPosition } from "./baseAdapter";
11
- import { PositionAPY, APYType, PositionAmount } from "./baseAdapter";
12
- import { Web3Number } from "@/dataTypes";
13
- import { PositionInfo } from "./baseAdapter";
14
- import { ManageCall } from "./baseAdapter";
15
- import { ContractAddr } from "@/dataTypes";
16
- import { AVNU_EXCHANGE } from "./adapter-utils";
17
- import { MAX_RETRIES } from "../vesu-extended-strategy/utils/constants";
18
- import { Quote } from "@avnu/avnu-sdk";
19
- import { hash, uint256 } from "starknet";
20
- import { AvnuWrapper } from "@/modules/avnu";
21
- import axios from "axios";
22
- import {SIMPLE_SANITIZER } from "./adapter-utils";
23
- import { returnFormattedAmount } from "../vesu-extended-strategy/utils/helper";
24
- import { logger } from "@/utils";
25
- export interface AvnuAdapterConfig extends BaseAdapterConfig {
26
- baseUrl: string;
27
- avnuContract: ContractAddr; //0x04270219d365d6b017231b52e92b3fb5d7c8378b05e9abc97724537a80e93b0f
28
- slippage: number;
29
- }
30
-
31
- export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
32
- readonly config: AvnuAdapterConfig;
33
- protected avnuWrapper: AvnuWrapper;
34
-
35
- constructor(config: AvnuAdapterConfig) {
36
- super(config, AvnuAdapter.name, Protocols.AVNU);
37
- this.config = config as AvnuAdapterConfig;
38
- this.avnuWrapper = new AvnuWrapper();
39
- }
40
- //abstract means the method has no implementation in this class; instead, child classes must implement it.
41
- protected async getAPY(
42
- supportedPosition: SupportedPosition
43
- ): Promise<PositionAPY> {
44
- return Promise.resolve({ apy: 0, type: APYType.BASE });
45
- }
46
-
47
- protected async getPosition(
48
- supportedPosition: SupportedPosition
49
- ): Promise<PositionAmount> {
50
- return Promise.resolve({ amount: new Web3Number(0, 0), remarks: "" });
51
- }
52
-
53
- async maxDeposit(amount?: Web3Number): Promise<PositionInfo> {
54
- return Promise.resolve({
55
- tokenInfo: this.config.baseToken,
56
- amount: new Web3Number(0, 0),
57
- usdValue: 0,
58
- apy: { apy: 0, type: APYType.BASE },
59
- protocol: Protocols.AVNU,
60
- remarks: "",
61
- });
62
- }
63
-
64
- async maxWithdraw(): Promise<PositionInfo> {
65
- return Promise.resolve({
66
- tokenInfo: this.config.baseToken,
67
- amount: new Web3Number(0, 0),
68
- usdValue: 0,
69
- apy: { apy: 0, type: APYType.BASE },
70
- protocol: Protocols.AVNU,
71
- remarks: "",
72
- });
73
- }
74
-
75
- protected _getDepositLeaf(): {
76
- // considering deposit is converting usdc to wbtc
77
- target: ContractAddr;
78
- method: string;
79
- packedArguments: bigint[];
80
- sanitizer: ContractAddr;
81
- id: string;
82
- }[] {
83
- const vaultAllocator = ContractAddr.from(
84
- this.config.vaultAllocator.address
85
- );
86
- return [
87
- {
88
- target: this.config.supportedPositions[0].asset.address,
89
- method: "approve",
90
- packedArguments: [
91
- AVNU_EXCHANGE.toBigInt(),
92
- ],
93
- sanitizer: SIMPLE_SANITIZER,
94
- id: `approve_${this.config.supportedPositions[0].asset.symbol}`,
95
- },
96
- {
97
- target: AVNU_EXCHANGE,
98
- method: "multi_route_swap",
99
- packedArguments: [
100
- this.config.supportedPositions[0].asset.address.toBigInt(), //usdc
101
- this.config.supportedPositions[1].asset.address.toBigInt(), //wbtc
102
- vaultAllocator.toBigInt(),
103
- ],
104
- sanitizer: SIMPLE_SANITIZER,
105
- id: `asutb_${this.config.supportedPositions[0].asset.symbol}_${this.config.supportedPositions[1].asset.symbol}`,
106
- },
107
- ];
108
- }
109
-
110
- protected _getWithdrawLeaf(): {
111
- target: ContractAddr;
112
- method: string;
113
- packedArguments: bigint[];
114
- sanitizer: ContractAddr;
115
- id: string;
116
- }[] {
117
- const vaultAllocator = ContractAddr.from(
118
- this.config.vaultAllocator.address
119
- );
120
- const toToken = this.config.supportedPositions[0].asset;
121
- const fromToken = this.config.supportedPositions[1].asset;
122
- return [
123
- {
124
- target: fromToken.address,
125
- method: "approve",
126
- packedArguments: [
127
- AVNU_EXCHANGE.toBigInt(),
128
- ],
129
- sanitizer: SIMPLE_SANITIZER,
130
- id: `approve_${fromToken.symbol}`,
131
- },
132
- {
133
- target: AVNU_EXCHANGE,
134
- method: "multi_route_swap",
135
- packedArguments: [
136
- fromToken.address.toBigInt(), //wbtc
137
- toToken.address.toBigInt(), //usdc
138
- vaultAllocator.toBigInt(),
139
- ],
140
- sanitizer: SIMPLE_SANITIZER,
141
- id: `asbtu_${fromToken.symbol}_${fromToken.symbol}`,
142
- },
143
- ];
144
- }
145
-
146
- protected _getLegacySwapLeaf(): {
147
- target: ContractAddr;
148
- method: string;
149
- packedArguments: bigint[];
150
- sanitizer: ContractAddr;
151
- id: string;
152
- }[] {
153
- return [];
154
- }
155
-
156
- async getDepositCall(params: DepositParams): Promise<ManageCall[]> {
157
- try {
158
- const fromToken = this.config.supportedPositions[0].asset; //usdc
159
- const toToken = this.config.supportedPositions[1].asset; //wbtc
160
- const vaultAllocator = ContractAddr.from(
161
- this.config.vaultAllocator.address
162
- );
163
- const quote = await this.getQuotesAvnu(
164
- fromToken.address.toString(),
165
- toToken.address.toString(),
166
- params.amount.toNumber(),
167
- vaultAllocator.address.toString(),
168
- toToken.decimals,
169
- true
170
- )
171
- //console.log(`${AvnuAdapter.name}::getDepositCall quote: ${JSON.stringify(quote)}`);
172
- if (!quote) {
173
- logger.error("error getting quote from avnu");
174
- return [];
175
- }
176
-
177
- const getCalldata = await this.avnuWrapper.getSwapCallData(
178
- quote,
179
- vaultAllocator.address
180
- );
181
- const swapCallData = getCalldata[0];
182
-
183
- // const approveCallData = getCalldata[0];
184
- const amount = uint256.bnToUint256(quote.sellAmountInUsd*10**7)
185
- return [
186
- {
187
- sanitizer: SIMPLE_SANITIZER,
188
- call: {
189
- contractAddress: fromToken.address,
190
- selector: hash.getSelectorFromName("approve"),
191
- calldata:[
192
- AVNU_EXCHANGE.toBigInt(),
193
- toBigInt(amount.low.toString()), // amount low
194
- toBigInt(amount.high.toString()), // amount high
195
- ] ,
196
- },
197
- },
198
- {
199
- sanitizer: SIMPLE_SANITIZER,
200
- call: {
201
- contractAddress: AVNU_EXCHANGE,
202
- selector: hash.getSelectorFromName("multi_route_swap"),
203
- calldata: swapCallData,
204
- },
205
- },
206
- ];
207
- } catch (error) {
208
- logger.error(`Error getting Avnu quote: ${error}`);
209
- return [];
210
- }
211
- }
212
-
213
- //Swap wbtc to usdc
214
- async getWithdrawCall(params: WithdrawParams): Promise<ManageCall[]> {
215
- try {
216
- const toToken = this.config.supportedPositions[0].asset;
217
- const fromToken = this.config.supportedPositions[1].asset;
218
- const vaultAllocator = ContractAddr.from(
219
- this.config.vaultAllocator.address
220
- );
221
- const quote = await this.getQuotesAvnu(
222
- fromToken.address.toString(),
223
- toToken.address.toString(),
224
- params.amount.toNumber(),
225
- vaultAllocator.address.toString(),
226
- fromToken.decimals,
227
- false
228
- );
229
- if (!quote) {
230
- logger.error("No quotes available for this swap, error in quotes avnu");
231
- return [];
232
- }
233
- const getCalldata = await this.avnuWrapper.getSwapCallData(
234
- quote,
235
- vaultAllocator.address
236
- );
237
- const swapCallData = getCalldata[0];
238
- const amount = uint256.bnToUint256(params.amount.toWei())
239
- return [
240
- {
241
- sanitizer: SIMPLE_SANITIZER,
242
- call: {
243
- contractAddress:fromToken.address,
244
- selector: hash.getSelectorFromName("approve"),
245
- calldata: [
246
- AVNU_EXCHANGE.toBigInt(),
247
- toBigInt(amount.low.toString()), // amount low
248
- toBigInt(amount.high.toString()), // amount high
249
- ],
250
- },
251
- },
252
- {
253
- sanitizer: SIMPLE_SANITIZER,
254
- call: {
255
- contractAddress: AVNU_EXCHANGE,
256
- selector: hash.getSelectorFromName("multi_route_swap"),
257
- calldata: swapCallData,
258
- },
259
- },
260
- ];
261
- } catch (error) {
262
- logger.error(`Error getting Avnu quote: ${error}`);
263
- return [];
264
- }
265
- }
266
-
267
- async getSwapCallData(quote: Quote): Promise<bigint[][]> {
268
- return await this.avnuWrapper.getSwapCallData(quote, this.config.vaultAllocator.address);
269
- }
270
-
271
- async getHealthFactor(): Promise<number> {
272
- return Promise.resolve(1);
273
- }
274
-
275
- async fetchQuoteWithRetry(
276
- params: Record<string, any>,
277
- retries: number = 5
278
- ): Promise<any> {
279
- for (let attempt = 0; attempt < retries; attempt++) {
280
- try {
281
- const response = await axios.get(this.config.baseUrl, { params });
282
- if (response.data && response.data.length > 0) {
283
- return response;
284
- }
285
- throw new Error("Empty response data");
286
- } catch (err) {
287
- logger.error(`Error fetching quote with retry: ${err}`);
288
- if (attempt === retries - 1) {
289
- throw err;
290
- }
291
- await new Promise((resolve) => setTimeout(resolve, MAX_DELAY));
292
- }
293
- }
294
- throw new Error("Failed to fetch quote after retries");
295
- }
296
-
297
- async getQuotesAvnu (
298
- from_token_address: string,
299
- to_token_address: string,
300
- amount: number, //amount in btc units
301
- takerAddress: string,
302
- toTokenDecimals: number,
303
- usdcToBtc: boolean,
304
- maxIterations: number = 5,
305
- tolerance: number = 5000
306
- ): Promise<Quote | null>{
307
- try {
308
- const fromToken = this.config.supportedPositions[0].asset;
309
- const toToken = this.config.supportedPositions[1].asset;
310
- if(!usdcToBtc) {
311
- const sellAmount = returnFormattedAmount(amount, toTokenDecimals);
312
- const params: Record<string, any> = {
313
- sellTokenAddress: from_token_address,
314
- buyTokenAddress: to_token_address,
315
- takerAddress,
316
- sellAmount:sellAmount,
317
- };
318
- const finalQuote = await this.fetchQuoteWithRetry(params);
319
- if (!finalQuote.data.length) {
320
- logger.error("No quotes available for this swap, error in quotes avnu");
321
- return null;
322
- }
323
- const dataObject: Quote = finalQuote.data[0];
324
- return dataObject;
325
- }
326
- const btcPrice = await this.getPriceOfToken(toToken.address.toString());
327
- if (!btcPrice) {
328
- logger.error(`error getting btc price: ${btcPrice}`);
329
- return null;
330
- }
331
- const estimatedUsdcAmount = Math.floor(amount * btcPrice);
332
- const targetBtcBig = BigInt(returnFormattedAmount(amount, toTokenDecimals));
333
- let low = BigInt(
334
- Math.floor(
335
- (estimatedUsdcAmount * 10 ** fromToken.decimals) * 0.9
336
- )
337
- );
338
- let high = BigInt(
339
- Math.floor(
340
- (estimatedUsdcAmount * 10 ** fromToken.decimals) * 1.1
341
- )
342
- );
343
- let mid = 0n;
344
- for (let i = 0; i < maxIterations; i++) {
345
- mid = (low + high) / 2n;
346
- const sellAmount = returnFormattedAmount(Number(mid), 0);
347
- const quote = await this.fetchQuoteWithRetry({
348
- sellTokenAddress: from_token_address,
349
- buyTokenAddress: to_token_address,
350
- takerAddress,
351
- sellAmount,
352
- });
353
-
354
- const gotBtc = BigInt(quote.data[0].buyAmount);
355
- if (gotBtc === targetBtcBig) return quote.data[0];
356
-
357
- if (gotBtc > targetBtcBig) {
358
- high = mid;
359
- } else {
360
- low = mid;
361
- }
362
-
363
- if (
364
- gotBtc >= targetBtcBig &&
365
- gotBtc <= targetBtcBig + BigInt(tolerance)
366
- ) {
367
- return quote.data[0];
368
- }
369
- }
370
- let sellAmount = returnFormattedAmount(
371
- Number(mid),
372
- 0
373
- );
374
- const params: Record<string, any> = {
375
- sellTokenAddress: from_token_address,
376
- buyTokenAddress: to_token_address,
377
- takerAddress,
378
- sellAmount: sellAmount,
379
- };
380
- const finalQuote = await this.fetchQuoteWithRetry(params);
381
- if (!finalQuote.data.length) {
382
- logger.error("No quotes available for this swap, error in quotes avnu");
383
- return null;
384
- }
385
- const dataObject: Quote = finalQuote.data[0];
386
- return dataObject;
387
- } catch (err) {
388
- logger.error(`No quotes available for this swap: ${err}`);
389
- return null;
390
- }
391
- };
392
-
393
- async getPriceOfToken (
394
- tokenAddress: string,
395
- retries: number = MAX_RETRIES
396
- ): Promise<number | null> {
397
- try {
398
- const url = `https://starknet.impulse.avnu.fi/v1/tokens/${tokenAddress}/prices/line`;
399
- const response = await axios.get(url);
400
- const length = response.data.length;
401
- return response.data[length - 1].value;
402
- } catch (err) {
403
- if (retries > 0) {
404
- await new Promise((resolve) => setTimeout(resolve, MAX_DELAY));
405
- return this.getPriceOfToken(tokenAddress, retries - 1);
406
- } else {
407
- logger.error(`Failed to fetch price for ${tokenAddress} after ${MAX_RETRIES} attempts`);
408
- return null;
409
- }
410
- }
411
- };
412
-
413
- }