@strkfarm/sdk 2.0.0-dev.19 → 2.0.0-dev.20

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.
@@ -408,15 +408,19 @@ export class ExtendedWrapper {
408
408
  */
409
409
  async getFundingRates(
410
410
  marketName: string,
411
- side: string
411
+ side: string,
412
+ startTime: number,
413
+ endTime?: number,
414
+ // in epoch milliseconds
412
415
  ): Promise<ExtendedApiResponse<FundingRate[]>> {
416
+ const endTimeParam = endTime !== undefined ? `&end_time=${endTime}` : '';
417
+ const startTimeParam = startTime !== undefined ? `&start_time=${startTime}` : '';
413
418
  return this.makeRequest<FundingRate[]>(
414
419
  `/api/v1/markets/funding-rates?market_name=${encodeURIComponent(
415
420
  marketName
416
- )}&side=${encodeURIComponent(side)}`
421
+ )}&side=${encodeURIComponent(side)}${startTimeParam}${endTimeParam}`
417
422
  );
418
423
  }
419
-
420
424
  }
421
425
 
422
426
  export default ExtendedWrapper;
@@ -8,6 +8,7 @@ import { Protocols } from "@/interfaces";
8
8
  import { SupportedPosition } from "./baseAdapter";
9
9
  import { PositionAPY, APYType, PositionAmount } from "./baseAdapter";
10
10
  import { Web3Number } from "@/dataTypes";
11
+ import { ApiResponse } from "@/modules/ExtendedWrapperSDk";
11
12
  import { PositionInfo } from "./baseAdapter";
12
13
  import { ManageCall } from "./baseAdapter";
13
14
  import { ContractAddr } from "@/dataTypes";
@@ -34,11 +35,13 @@ import { Balance, OpenOrder, OrderStatus } from "@/modules/ExtendedWrapperSDk";
34
35
  import axios from "axios";
35
36
  import { AvnuAdapter } from "./avnu-adapter";
36
37
  import { logger } from "@/utils";
38
+
39
+
37
40
  export interface ExtendedAdapterConfig extends BaseAdapterConfig {
38
41
  vaultIdExtended: number;
39
42
  extendedContract: ContractAddr; //0x04270219d365d6b017231b52e92b3fb5d7c8378b05e9abc97724537a80e93b0f
40
- extendedBackendUrl: string;
41
- extendedApiKey: string;
43
+ extendedBackendReadUrl: string;
44
+ extendedBackendWriteUrl: string;
42
45
  extendedTimeout: number;
43
46
  extendedRetries: number;
44
47
  extendedBaseUrl: string;
@@ -62,8 +65,8 @@ export class ExtendedAdapter extends BaseAdapter<
62
65
  super(config, ExtendedAdapter.name, Protocols.EXTENDED);
63
66
  this.config = config as ExtendedAdapterConfig;
64
67
  const client = new ExtendedWrapper({
65
- baseUrl: this.config.extendedBackendUrl,
66
- apiKey: this.config.extendedApiKey,
68
+ baseUrl: this.config.extendedBackendWriteUrl,
69
+ apiKey: "",
67
70
  timeout: this.config.extendedTimeout,
68
71
  retries: this.config.extendedRetries,
69
72
  });
@@ -79,11 +82,8 @@ export class ExtendedAdapter extends BaseAdapter<
79
82
  ): Promise<PositionAPY> {
80
83
  /** Considering supportedPosiiton.isDebt as side parameter to get the funding rates */
81
84
  const side = supportedPosition.isDebt ? "LONG" : "SHORT";
82
- const fundingRates = await this.client.getFundingRates(
83
- this.config.extendedMarketName,
84
- side
85
- );
86
- if (fundingRates.status !== "OK") {
85
+ const fundingRates = await this.getFundingRates(side);
86
+ if (!fundingRates.success) {
87
87
  logger.error("error getting funding rates", fundingRates);
88
88
  return { apy: 0, type: APYType.BASE };
89
89
  }
@@ -92,12 +92,29 @@ export class ExtendedAdapter extends BaseAdapter<
92
92
  return { apy: apy, type: APYType.BASE };
93
93
  }
94
94
 
95
+ public async getFundingRates(side: string, startTime?: number, endTime?: number): Promise<{ success: boolean, data: FundingRate[] }> {
96
+ try {
97
+ const response = await axios.get<ApiResponse<FundingRate[]>>(`${this.config.extendedBackendReadUrl}/fundingRates/${this.config.extendedMarketName}/${side}`, {
98
+ params: {
99
+ startTime: startTime ? startTime.toString() : undefined,
100
+ endTime: endTime ? endTime.toString() : undefined,
101
+ }
102
+ });
103
+ if (!response.data.success) {
104
+ logger.error("error getting funding rates", response.data);
105
+ return { success: false, data: [] };
106
+ }
107
+ logger.info("success getting funding rates", response.data.data);
108
+ return { success: true, data: response.data.data };
109
+ } catch (err) {
110
+ logger.error("error getting funding rates", err);
111
+ return { success: false, data: [] };
112
+ }
113
+ }
114
+
95
115
  protected async getPosition(
96
116
  supportedPosition: SupportedPosition
97
117
  ): Promise<PositionAmount> {
98
- if (!this.client) {
99
- throw new Error("Client not initialized");
100
- }
101
118
  const holdings = await this.getExtendedDepositAmount()
102
119
  if (!holdings) {
103
120
  throw new Error("No position found");
@@ -322,8 +339,8 @@ export class ExtendedAdapter extends BaseAdapter<
322
339
  getProofsForFromLegacySwap<T>(tree: StandardMerkleTree): {
323
340
  proofs: string[][];
324
341
  callConstructor:
325
- | GenerateCallFn<DepositParams>
326
- | GenerateCallFn<WithdrawParams>;
342
+ | GenerateCallFn<DepositParams>
343
+ | GenerateCallFn<WithdrawParams>;
327
344
  } {
328
345
  let proofGroups: string[][] = [];
329
346
 
@@ -523,25 +540,20 @@ export class ExtendedAdapter extends BaseAdapter<
523
540
 
524
541
  async getExtendedDepositAmount(): Promise<Balance | undefined> {
525
542
  try {
526
- if (this.client === null) {
527
- logger.error("error initializing client - client is null");
528
- return undefined; // Error: client not initialized
529
- }
530
-
531
- const result = await this.client.getHoldings();
532
- if (!result) {
543
+ const result = await axios.get<ApiResponse<Balance>>(`${this.config.extendedBackendReadUrl}/holdings`);
544
+ if (!result.data) {
533
545
  logger.error("error getting holdings - API returned null/undefined");
534
546
  return undefined;
535
547
  }
536
548
 
537
- if (result.status && result.status !== "OK") {
549
+ if (!result.data.success) {
538
550
  logger.error(
539
551
  `error getting holdings - API returned status: ${result.status}`
540
552
  );
541
553
  return undefined;
542
554
  }
543
555
 
544
- const holdings = result.data;
556
+ const holdings = result.data.data;
545
557
  if (!holdings) {
546
558
  logger.warn(
547
559
  "holdings data is null/undefined - treating as zero balance"
@@ -581,30 +593,33 @@ export class ExtendedAdapter extends BaseAdapter<
581
593
  }
582
594
 
583
595
  async getAllOpenPositions(): Promise<Position[] | null> {
584
- if (this.client === null) {
585
- logger.error("error initializing client");
586
- return null;
587
- }
588
- const response = await this.client.getPositionsForMarket(
589
- this.config.extendedMarketName
590
- );
591
- if (response.status === "OK") {
592
- if (response.data.length === 0) {
593
- return [];
594
- } else {
595
- return response.data;
596
+ try {
597
+ const response = await axios.get<ApiResponse<Position[]>>(`${this.config.extendedBackendReadUrl}/positions`);
598
+ if (response.data.success) {
599
+ if (response.data.data.length === 0) {
600
+ return [];
601
+ } else {
602
+ return response.data.data;
603
+ }
596
604
  }
605
+ return null;
606
+ } catch (err) {
607
+ logger.error("error getting all open positions", err);
608
+ return null;
597
609
  }
598
- return null;
599
610
  }
600
611
 
601
612
  async getOrderHistory(marketName: string): Promise<OpenOrder[] | null> {
602
- if (this.client === null) {
603
- logger.error("error initializing client");
613
+ try {
614
+ const result = await axios.get<ApiResponse<OpenOrder[]>>(`${this.config.extendedBackendReadUrl}/marketOrders/${marketName}`);
615
+ if (!result.data.success) {
616
+ return null;
617
+ }
618
+ return result.data.data;
619
+ } catch (err) {
620
+ logger.error("error getting order history", err);
604
621
  return null;
605
622
  }
606
- const result = await this.client.getOrderHistory(marketName);
607
- return result.data;
608
623
  }
609
624
 
610
625
  async getOrderStatus(
@@ -744,8 +759,7 @@ export class ExtendedAdapter extends BaseAdapter<
744
759
  }
745
760
 
746
761
  logger.info(
747
- `createOrder attempt ${attempt}/${maxAttempts}: side=${side}, midPrice=${midPrice.toNumber()}, adjustedPrice=${price.toNumber()}, adjustment=${
748
- priceAdjustmentMultiplier * 100
762
+ `createOrder attempt ${attempt}/${maxAttempts}: side=${side}, midPrice=${midPrice.toNumber()}, adjustedPrice=${price.toNumber()}, adjustment=${priceAdjustmentMultiplier * 100
749
763
  }%`
750
764
  );
751
765
 
@@ -833,7 +847,7 @@ export class ExtendedAdapter extends BaseAdapter<
833
847
  );
834
848
  }
835
849
  } else {
836
- logger.warn(
850
+ logger.warn(
837
851
  `Order ${positionId} not found in API after ${maxStatusRetries} status retries (API update delayed ~30s). We got position_id from creation, so order exists. Returning position_id - status will be checked in next loop iteration.`
838
852
  );
839
853
  return {
@@ -874,13 +888,13 @@ export class ExtendedAdapter extends BaseAdapter<
874
888
  const result =
875
889
  side === OrderSide.SELL
876
890
  ? await client.createSellOrder(marketName, amount, price, {
877
- postOnly: false,
878
- timeInForce: TimeInForce.IOC,
879
- })
891
+ postOnly: false,
892
+ timeInForce: TimeInForce.IOC,
893
+ })
880
894
  : await client.createBuyOrder(marketName, amount, price, {
881
- postOnly: false,
882
- timeInForce: TimeInForce.IOC,
883
- });
895
+ postOnly: false,
896
+ timeInForce: TimeInForce.IOC,
897
+ });
884
898
  if (result.data.id) {
885
899
  const position_id = result.data.id.toString();
886
900
  return {
@@ -195,7 +195,7 @@ export class VesuExtendedMultiplierStrategy<
195
195
  WALLET_ADDRESS,
196
196
  usdceToken.decimals
197
197
  );
198
- logger.info(`${VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator walletBalance: ${walletBalance.toNumber()}`);
198
+ logger.info(`${VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator walletBalance: ${walletBalance}`);
199
199
  const amountToBeTransferred = amount.minimum(walletBalance);
200
200
  logger.info(`${VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred: ${amountToBeTransferred.toNumber()}`);
201
201
 
@@ -1334,8 +1334,8 @@ function getLooperSettings(
1334
1334
  underlyingSymbol: string,
1335
1335
  vaultSettings: VesuExtendedStrategySettings,
1336
1336
  pool1: ContractAddr,
1337
- extendedBackendUrl: string,
1338
- extendedApiKey: string,
1337
+ extendedBackendReadUrl: string,
1338
+ extendedBackendWriteUrl: string,
1339
1339
  vaultIdExtended: number,
1340
1340
  minimumExtendedMovementAmount: number,
1341
1341
  minimumVesuMovementAmount: number,
@@ -1381,8 +1381,8 @@ function getLooperSettings(
1381
1381
  ],
1382
1382
  vaultIdExtended: vaultIdExtended,
1383
1383
  extendedContract: EXTENDED_CONTRACT,
1384
- extendedBackendUrl: extendedBackendUrl,
1385
- extendedApiKey: extendedApiKey,
1384
+ extendedBackendWriteUrl: extendedBackendWriteUrl,
1385
+ extendedBackendReadUrl: extendedBackendReadUrl,
1386
1386
  extendedTimeout: 30000,
1387
1387
  extendedRetries: 3,
1388
1388
  extendedBaseUrl: "https://api.starknet.extended.exchange",
@@ -1539,15 +1539,15 @@ const re7UsdcPrimeDevansh: VesuExtendedStrategySettings = {
1539
1539
  walletAddress: WALLET_ADDRESS,
1540
1540
  }
1541
1541
 
1542
- export const VesuExtendedTestStrategies = (extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number, minimumExtendedPriceDifferenceForSwapOpen: number, maximumExtendedPriceDifferenceForSwapClosing: number): IStrategyMetadata<VesuExtendedStrategySettings>[] => {
1542
+ export const VesuExtendedTestStrategies = (extendedBackendReadUrl: string, extendedBackendWriteUrl: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number, minimumExtendedPriceDifferenceForSwapOpen: number, maximumExtendedPriceDifferenceForSwapClosing: number): IStrategyMetadata<VesuExtendedStrategySettings>[] => {
1543
1543
  return [
1544
- getStrategySettingsVesuExtended('WBTC', 'USDC', re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing),
1544
+ getStrategySettingsVesuExtended('WBTC', 'USDC', re7UsdcPrimeDevansh, false, false, extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing),
1545
1545
  ]
1546
1546
  }
1547
1547
 
1548
1548
 
1549
1549
 
1550
- function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: string, addresses: VesuExtendedStrategySettings, isPreview: boolean = false, isLST: boolean, extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number, minimumExtendedPriceDifferenceForSwapOpen: number, maximumExtendedPriceDifferenceForSwapClosing: number): IStrategyMetadata<VesuExtendedStrategySettings> {
1550
+ function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: string, addresses: VesuExtendedStrategySettings, isPreview: boolean = false, isLST: boolean, extendedBackendReadUrl: string, extendedBackendWriteUrl: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number, minimumExtendedPriceDifferenceForSwapOpen: number, maximumExtendedPriceDifferenceForSwapClosing: number): IStrategyMetadata<VesuExtendedStrategySettings> {
1551
1551
  return {
1552
1552
  name: `Extended Test ${underlyingSymbol}`,
1553
1553
  description: getDescription(lstSymbol, underlyingSymbol),
@@ -1555,7 +1555,7 @@ function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: st
1555
1555
  launchBlock: 0,
1556
1556
  type: 'Other',
1557
1557
  depositTokens: [Global.getDefaultTokens().find(token => token.symbol === underlyingSymbol)!],
1558
- additionalInfo: getLooperSettings(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing),
1558
+ additionalInfo: getLooperSettings(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing),
1559
1559
  risk: {
1560
1560
  riskFactor: _riskFactor,
1561
1561
  netRisk: