@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.
- package/dist/index.browser.global.js +222 -198
- package/dist/index.browser.mjs +59 -45
- package/dist/index.d.ts +8 -4
- package/dist/index.js +59 -45
- package/dist/index.mjs +59 -45
- package/package.json +1 -1
- package/src/modules/ExtendedWrapperSDk/wrapper.ts +7 -3
- package/src/strategies/universal-adapters/extended-adapter.ts +63 -49
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +9 -9
|
@@ -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
|
-
|
|
41
|
-
|
|
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.
|
|
66
|
-
apiKey:
|
|
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.
|
|
83
|
-
|
|
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
|
-
|
|
326
|
-
|
|
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
|
-
|
|
527
|
-
|
|
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.
|
|
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
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
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
|
-
|
|
603
|
-
|
|
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
|
-
|
|
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
|
-
|
|
878
|
-
|
|
879
|
-
|
|
891
|
+
postOnly: false,
|
|
892
|
+
timeInForce: TimeInForce.IOC,
|
|
893
|
+
})
|
|
880
894
|
: await client.createBuyOrder(marketName, amount, price, {
|
|
881
|
-
|
|
882
|
-
|
|
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
|
|
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
|
-
|
|
1338
|
-
|
|
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
|
-
|
|
1385
|
-
|
|
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 = (
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|