@strkfarm/sdk 2.0.0-dev.2 → 2.0.0-dev.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strkfarm/sdk",
3
- "version": "2.0.0-dev.2",
3
+ "version": "2.0.0-dev.21",
4
4
  "description": "STRKFarm TS SDK (Meant for our internal use, but feel free to use it)",
5
5
  "typings": "dist/index.d.ts",
6
6
  "types": "dist/index.d.ts",
@@ -237,7 +237,7 @@ export interface Market {
237
237
 
238
238
  // Asset operation types
239
239
  export interface AssetOperation {
240
- id: number;
240
+ id: string;
241
241
  type: AssetOperationType;
242
242
  status: AssetOperationStatus;
243
243
  amount: string;
@@ -76,8 +76,33 @@ export class ExtendedWrapper {
76
76
  }`
77
77
  );
78
78
  }
79
-
80
- const data = await response.json();
79
+
80
+ const text = await response.text();
81
+
82
+ // Replace large integers (greater than MAX_SAFE_INTEGER) with quoted strings
83
+ // This regex finds numbers that are likely to be large integers in the "data" field
84
+ const MAX_SAFE_INTEGER_STR = '9007199254740991';
85
+ const largeIntegerRegex = /"data"\s*:\s*(\d{16,})/g;
86
+
87
+ const modifiedText = text.replace(largeIntegerRegex, (match, largeInt) => {
88
+ // Compare as strings to avoid precision loss
89
+ if (largeInt.length > MAX_SAFE_INTEGER_STR.length ||
90
+ (largeInt.length === MAX_SAFE_INTEGER_STR.length && largeInt > MAX_SAFE_INTEGER_STR)) {
91
+ // Replace the number with a quoted string to preserve precision
92
+ return `"data":"${largeInt}"`;
93
+ }
94
+ return match; // Keep original if it's a safe integer
95
+ });
96
+
97
+ const data = JSON.parse(modifiedText);
98
+
99
+ if (data && typeof data.data === 'string' && /^\d+$/.test(data.data)) {
100
+ const numValue = Number(data.data);
101
+ if (Number.isSafeInteger(numValue)) {
102
+ data.data = numValue;
103
+ }
104
+ }
105
+
81
106
  return data;
82
107
  } catch (error) {
83
108
  lastError = error as Error;
@@ -159,11 +184,12 @@ export class ExtendedWrapper {
159
184
 
160
185
  /**
161
186
  * Initiate a withdrawal from Extended Exchange
187
+ * Returns data as number | string to preserve precision for large integers
162
188
  */
163
189
  async withdraw(
164
190
  request: WithdrawRequest
165
- ): Promise<ExtendedApiResponse<number>> {
166
- return this.makeRequest<number>("/api/v1/withdraw", {
191
+ ): Promise<ExtendedApiResponse<number | string>> {
192
+ return this.makeRequest<number | string>("/api/v1/withdraw", {
167
193
  method: "POST",
168
194
  body: JSON.stringify(request),
169
195
  });
@@ -369,8 +395,9 @@ export class ExtendedWrapper {
369
395
 
370
396
  /**
371
397
  * Withdraw USDC (convenience method)
398
+ * Returns data as number | string to preserve precision for large integers
372
399
  */
373
- async withdrawUSDC(amount: string): Promise<ExtendedApiResponse<number>> {
400
+ async withdrawUSDC(amount: string): Promise<ExtendedApiResponse<number | string>> {
374
401
  return this.withdraw({ amount, asset: "USDC" });
375
402
  }
376
403
 
@@ -381,15 +408,19 @@ export class ExtendedWrapper {
381
408
  */
382
409
  async getFundingRates(
383
410
  marketName: string,
384
- side: string
411
+ side: string,
412
+ startTime: number,
413
+ endTime?: number,
414
+ // in epoch milliseconds
385
415
  ): Promise<ExtendedApiResponse<FundingRate[]>> {
416
+ const endTimeParam = endTime !== undefined ? `&end_time=${endTime}` : '';
417
+ const startTimeParam = startTime !== undefined ? `&start_time=${startTime}` : '';
386
418
  return this.makeRequest<FundingRate[]>(
387
419
  `/api/v1/markets/funding-rates?market_name=${encodeURIComponent(
388
420
  marketName
389
- )}&side=${encodeURIComponent(side)}`
421
+ )}&side=${encodeURIComponent(side)}${startTimeParam}${endTimeParam}`
390
422
  );
391
423
  }
392
-
393
424
  }
394
425
 
395
426
  export default ExtendedWrapper;
@@ -70,21 +70,14 @@ export class EkuboQuoter {
70
70
  async getDexPrice(baseToken: TokenInfo, quoteToken: TokenInfo, amount: Web3Number) {
71
71
  const lstTokenInfo = baseToken;
72
72
  const lstUnderlyingTokenInfo = quoteToken;
73
- console.log("lstTokenInfo", lstTokenInfo);
74
- console.log("lstUnderlyingTokenInfo", lstUnderlyingTokenInfo);
75
- console.log("amount", amount);
76
73
  const quote = await this.getQuote(
77
74
  lstTokenInfo.address.address,
78
75
  lstUnderlyingTokenInfo.address.address,
79
76
  amount
80
77
  );
81
- console.log("quote", quote);
82
78
  // in Underlying
83
79
  const outputAmount = Web3Number.fromWei(quote.total_calculated, lstUnderlyingTokenInfo.decimals);
84
- console.log("outputAmount", outputAmount);
85
- console.log("amount", amount);
86
80
  const price = outputAmount.toNumber() / amount.toNumber();
87
- console.log("price", price);
88
81
  logger.verbose(`${EkuboQuoter.name}:: LST Dex Price: ${price}`);
89
82
  return price;
90
83
  }
@@ -105,7 +98,6 @@ export class EkuboQuoter {
105
98
  // debt collateral
106
99
  async getSwapLimitAmount(fromToken: TokenInfo, toToken: TokenInfo, amount: Web3Number, max_slippage: number = 0.002): Promise<Web3Number> {
107
100
  const isExactAmountIn = amount.greaterThanOrEqualTo(0);
108
- console.log("isExactAmountIn", isExactAmountIn);
109
101
  logger.verbose(`${EkuboQuoter.name}::getSwapLimitAmount isExactAmountIn: ${isExactAmountIn}, fromToken: ${fromToken.symbol}, toToken: ${toToken.symbol}, amount: ${amount}`);
110
102
  const isYieldToken = this.tokenMarketData.isAPYSupported(toToken);
111
103
  console.log("isYieldToken", isYieldToken);
@@ -114,13 +106,10 @@ export class EkuboQuoter {
114
106
  // wbtc
115
107
  const baseToken = isExactAmountIn ? toToken : fromToken; // fromToken -> wbtc,
116
108
  const quoteToken = isExactAmountIn ? fromToken : toToken; // toToken -> usdc,
117
- console.log("baseToken", baseToken);
118
- console.log("quoteToken", quoteToken);
119
109
  // need dex price of from token in toToken
120
110
  // from baseToken to underlying token
121
111
  // for withdraw, usdc to btc with amount negative
122
112
  const dexPrice = await this.getDexPrice(baseToken, quoteToken, amount);
123
- console.log("dexPrice", dexPrice);
124
113
  const trueExchangeRate = isYieldToken ? await this.tokenMarketData.getTruePrice(baseToken) : dexPrice;
125
114
  console.log("trueExchangeRate", trueExchangeRate);
126
115
  if (isExactAmountIn) {
@@ -155,7 +144,6 @@ export class EkuboQuoter {
155
144
 
156
145
  const isNegativeAmount = BigInt(split.amount_specified) <= 0n;
157
146
  const token = isNegativeAmount ? toTokenInfo : fromTokenInfo;
158
- console.log("token for withdrawal", token, isNegativeAmount);
159
147
  return {
160
148
  route: split.route.map(_route => ({
161
149
  pool_key: {
@@ -8,4 +8,5 @@ export * from './universal-strategy';
8
8
  export * from './universal-lst-muliplier-strategy';
9
9
  export * from './vesu-extended-strategy/vesu-extended-strategy';
10
10
  export * from './vesu-extended-strategy/utils/config.runtime';
11
- export * from './vesu-extended-strategy/utils/helper';
11
+ export * from './vesu-extended-strategy/utils/helper';
12
+ export * from './vesu-extended-strategy/types/transaction-metadata';
@@ -4,7 +4,7 @@ import {
4
4
  WithdrawParams,
5
5
  BaseAdapterConfig,
6
6
  } from "./baseAdapter";
7
- import { SIMPLE_SANITIZER_V2, toBigInt } from "./adapter-utils";
7
+ import { toBigInt } from "./adapter-utils";
8
8
  import { Protocols } from "@/interfaces";
9
9
  import { MAX_DELAY } from "../vesu-extended-strategy/utils/constants";
10
10
  import { SupportedPosition } from "./baseAdapter";
@@ -13,20 +13,21 @@ import { Web3Number } from "@/dataTypes";
13
13
  import { PositionInfo } from "./baseAdapter";
14
14
  import { ManageCall } from "./baseAdapter";
15
15
  import { ContractAddr } from "@/dataTypes";
16
- import { TokenInfo } from "@/interfaces";
17
16
  import { AVNU_EXCHANGE } from "./adapter-utils";
18
17
  import { MAX_RETRIES } from "../vesu-extended-strategy/utils/constants";
19
18
  import { Quote } from "@avnu/avnu-sdk";
20
19
  import { hash, uint256 } from "starknet";
21
20
  import { AvnuWrapper } from "@/modules/avnu";
22
21
  import axios from "axios";
23
- import { AVNU_MIDDLEWARE, SIMPLE_SANITIZER } from "./adapter-utils";
22
+ import {SIMPLE_SANITIZER } from "./adapter-utils";
24
23
  import { returnFormattedAmount } from "../vesu-extended-strategy/utils/helper";
25
24
  import { logger } from "@/utils";
26
25
  export interface AvnuAdapterConfig extends BaseAdapterConfig {
27
26
  baseUrl: string;
28
27
  avnuContract: ContractAddr; //0x04270219d365d6b017231b52e92b3fb5d7c8378b05e9abc97724537a80e93b0f
29
28
  slippage: number;
29
+ minimumExtendedPriceDifferenceForSwapOpen: number;
30
+ maximumExtendedPriceDifferenceForSwapClosing: number;
30
31
  }
31
32
 
32
33
  export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
@@ -48,7 +49,7 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
48
49
  protected async getPosition(
49
50
  supportedPosition: SupportedPosition
50
51
  ): Promise<PositionAmount> {
51
- return Promise.resolve({ amount: new Web3Number(0, 0), remarks: "" });
52
+ return Promise.resolve({ amount: new Web3Number(0, 0), remarks: "Avnu Positions" });
52
53
  }
53
54
 
54
55
  async maxDeposit(amount?: Web3Number): Promise<PositionInfo> {
@@ -156,8 +157,8 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
156
157
 
157
158
  async getDepositCall(params: DepositParams): Promise<ManageCall[]> {
158
159
  try {
159
- const fromToken = this.config.supportedPositions[0].asset;
160
- const toToken = this.config.supportedPositions[1].asset;
160
+ const fromToken = this.config.supportedPositions[0].asset; //usdc
161
+ const toToken = this.config.supportedPositions[1].asset; //wbtc
161
162
  const vaultAllocator = ContractAddr.from(
162
163
  this.config.vaultAllocator.address
163
164
  );
@@ -169,15 +170,18 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
169
170
  toToken.decimals,
170
171
  true
171
172
  )
173
+ //console.log(`${AvnuAdapter.name}::getDepositCall quote: ${JSON.stringify(quote)}`);
172
174
  if (!quote) {
173
175
  logger.error("error getting quote from avnu");
174
176
  return [];
175
177
  }
178
+
176
179
  const getCalldata = await this.avnuWrapper.getSwapCallData(
177
180
  quote,
178
181
  vaultAllocator.address
179
182
  );
180
183
  const swapCallData = getCalldata[0];
184
+
181
185
  // const approveCallData = getCalldata[0];
182
186
  const amount = uint256.bnToUint256(quote.sellAmountInUsd*10**7)
183
187
  return [
@@ -300,11 +304,11 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
300
304
  toTokenDecimals: number,
301
305
  usdcToBtc: boolean,
302
306
  maxIterations: number = 5,
303
- tolerance: number = 10000
307
+ tolerance: number = 5000
304
308
  ): Promise<Quote | null>{
305
309
  try {
306
- const fromToken = this.config.supportedPositions[0].asset;
307
- const toToken = this.config.supportedPositions[1].asset;
310
+ const fromToken = this.config.supportedPositions[0].asset; //usdc
311
+ const toToken = this.config.supportedPositions[1].asset; //wbtc
308
312
  if(!usdcToBtc) {
309
313
  const sellAmount = returnFormattedAmount(amount, toTokenDecimals);
310
314
  const params: Record<string, any> = {
@@ -327,7 +331,9 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
327
331
  return null;
328
332
  }
329
333
  const estimatedUsdcAmount = Math.floor(amount * btcPrice);
334
+ logger.info(`${AvnuAdapter.name}::getQuotesAvnu estimatedUsdcAmount: ${estimatedUsdcAmount}`);
330
335
  const targetBtcBig = BigInt(returnFormattedAmount(amount, toTokenDecimals));
336
+ logger.info(`${AvnuAdapter.name}::getQuotesAvnu targetBtcBig: ${targetBtcBig}`);
331
337
  let low = BigInt(
332
338
  Math.floor(
333
339
  (estimatedUsdcAmount * 10 ** fromToken.decimals) * 0.9
@@ -381,6 +387,8 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
381
387
  return null;
382
388
  }
383
389
  const dataObject: Quote = finalQuote.data[0];
390
+ const wbtcAmountOut = parseInt(dataObject.buyAmount.toString(), 16);
391
+ logger.info(`${AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${wbtcAmountOut} ${dataObject.buyAmount} ${dataObject.sellAmount.toString()} ${dataObject.sellAmount.toString()}`);
384
392
  return dataObject;
385
393
  } catch (err) {
386
394
  logger.error(`No quotes available for this swap: ${err}`);