@pendle/sdk-boros 1.0.10 → 1.0.11-strategies-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 (34) hide show
  1. package/dist/backend/secrettune/BorosCoreSDK.d.ts +376 -3
  2. package/dist/backend/secrettune/BorosCoreSDK.js +170 -1
  3. package/dist/backend/secrettune/BorosCoreSDK.js.map +1 -1
  4. package/dist/backend/secrettune/BorosSendTxsBotSDK.d.ts +18 -11
  5. package/dist/backend/secrettune/BorosSendTxsBotSDK.js +3 -11
  6. package/dist/backend/secrettune/BorosSendTxsBotSDK.js.map +1 -1
  7. package/dist/entities/Calculator/exchangeFees.d.ts +47 -0
  8. package/dist/entities/Calculator/exchangeFees.js +93 -0
  9. package/dist/entities/Calculator/exchangeFees.js.map +1 -0
  10. package/dist/entities/Calculator/index.d.ts +6 -0
  11. package/dist/entities/Calculator/index.js +23 -0
  12. package/dist/entities/Calculator/index.js.map +1 -0
  13. package/dist/entities/Calculator/marginCalculator.d.ts +10 -0
  14. package/dist/entities/Calculator/marginCalculator.js +64 -0
  15. package/dist/entities/Calculator/marginCalculator.js.map +1 -0
  16. package/dist/entities/Calculator/strategyApr.d.ts +30 -0
  17. package/dist/entities/Calculator/strategyApr.js +93 -0
  18. package/dist/entities/Calculator/strategyApr.js.map +1 -0
  19. package/dist/entities/Calculator/strategyExecution.d.ts +28 -0
  20. package/dist/entities/Calculator/strategyExecution.js +130 -0
  21. package/dist/entities/Calculator/strategyExecution.js.map +1 -0
  22. package/dist/entities/Calculator/strategyFinder.d.ts +13 -0
  23. package/dist/entities/Calculator/strategyFinder.js +219 -0
  24. package/dist/entities/Calculator/strategyFinder.js.map +1 -0
  25. package/dist/entities/Calculator/types.d.ts +84 -0
  26. package/dist/entities/Calculator/types.js +3 -0
  27. package/dist/entities/Calculator/types.js.map +1 -0
  28. package/dist/entities/index.d.ts +1 -0
  29. package/dist/entities/index.js +1 -0
  30. package/dist/entities/index.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/backend/secrettune/PendleCoreSDK.d.ts +0 -2220
  33. package/dist/backend/secrettune/PendleCoreSDK.js +0 -939
  34. package/dist/backend/secrettune/PendleCoreSDK.js.map +0 -1
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMarginRequiredFor1YU = getMarginRequiredFor1YU;
4
+ exports.getMarginRequiredFor1YUFixedX18 = getMarginRequiredFor1YUFixedX18;
5
+ exports.getStrategyBorosMargin = getStrategyBorosMargin;
6
+ exports.getStrategyMarginRequirements = getStrategyMarginRequirements;
7
+ const boros_offchain_math_1 = require("@pendle/boros-offchain-math");
8
+ const market_1 = require("../market/market");
9
+ const DEFAULT_MIN_MARGIN_INDEX_RATE = boros_offchain_math_1.FixedX18.fromNumber(0.1);
10
+ const DEFAULT_MIN_MARGIN_INDEX_DURATION_S = 604800;
11
+ const ONE_YU = 10n ** 18n;
12
+ function extractMarketParams(market, leverage) {
13
+ const effectiveLeverage = leverage ?? market.metadata?.maxLeverage ?? 1;
14
+ const marginFactor = market.config.kIM
15
+ ? boros_offchain_math_1.FixedX18.fromRawValue(BigInt(market.config.kIM))
16
+ : boros_offchain_math_1.FixedX18.fromNumber(0.5);
17
+ const minMarginIndexDuration_s = market.config.tThresh ?? DEFAULT_MIN_MARGIN_INDEX_DURATION_S;
18
+ const timeToMaturity = market.data?.timeToMaturity ??
19
+ Math.max(0, market.imData.maturity - Math.floor(Date.now() / 1000));
20
+ const impliedApr = market.data?.ammImpliedApr ?? market.data?.midApr ?? 0;
21
+ const orderRate = boros_offchain_math_1.FixedX18.fromNumber(impliedApr);
22
+ const markRate = boros_offchain_math_1.FixedX18.fromNumber(market.data?.markApr ?? impliedApr);
23
+ return {
24
+ marginFactor,
25
+ markRate,
26
+ minMarginIndexRate: (0, boros_offchain_math_1.getRateAtTick)(BigInt(market.imData.iTickThresh), BigInt(market.imData.tickStep)),
27
+ minMarginIndexDuration_s,
28
+ timeToMaturity,
29
+ leverage: effectiveLeverage,
30
+ orderRate,
31
+ isMarketOrder: true,
32
+ };
33
+ }
34
+ function getMarginRequiredFor1YU(market, leverage) {
35
+ const params = extractMarketParams(market, leverage);
36
+ const marginBigInt = market_1.Market.getInitialMarginByOrderSize({
37
+ ...params,
38
+ orderSize: ONE_YU,
39
+ }, false);
40
+ return Number(marginBigInt) / 1e18;
41
+ }
42
+ function getMarginRequiredFor1YUFixedX18(market, leverage) {
43
+ const params = extractMarketParams(market, leverage);
44
+ const marginBigInt = market_1.Market.getInitialMarginByOrderSize({
45
+ ...params,
46
+ orderSize: ONE_YU,
47
+ }, false);
48
+ return boros_offchain_math_1.FixedX18.fromRawValue(marginBigInt);
49
+ }
50
+ function getStrategyBorosMargin(longMarket, shortMarket, leverage) {
51
+ const marginRequired1 = getMarginRequiredFor1YU(longMarket, leverage);
52
+ const marginRequired2 = getMarginRequiredFor1YU(shortMarket, leverage);
53
+ return marginRequired1 + marginRequired2;
54
+ }
55
+ function getStrategyMarginRequirements(longMarket, shortMarket, leverage) {
56
+ const marginRequired1 = getMarginRequiredFor1YU(longMarket, leverage);
57
+ const marginRequired2 = getMarginRequiredFor1YU(shortMarket, leverage);
58
+ return {
59
+ marginRequired1,
60
+ marginRequired2,
61
+ totalBorosMargin: marginRequired1 + marginRequired2,
62
+ };
63
+ }
64
+ //# sourceMappingURL=marginCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marginCalculator.js","sourceRoot":"","sources":["../../../src/entities/Calculator/marginCalculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { FixedX18 } from '@pendle/boros-offchain-math';
2
+ import type { Strategy, StrategyCalculatorInput, StrategyCalculatorResult, StrategyFixedAprParams } from './types';
3
+ export declare function calculateStrategyFixedApr(params: StrategyFixedAprParams): number;
4
+ export declare function calculateStrategyFixedAprFixedX18(params: {
5
+ perpLeverage: number;
6
+ daysToMaturity: number;
7
+ borosMargin: FixedX18;
8
+ impliedApr1: FixedX18;
9
+ impliedApr2: FixedX18;
10
+ exchangeFee1: FixedX18;
11
+ exchangeFee2: FixedX18;
12
+ borosTradeFee: FixedX18;
13
+ borosSettlementFee: FixedX18;
14
+ }): FixedX18;
15
+ export declare function calculateStrategy(input: StrategyCalculatorInput): StrategyCalculatorResult;
16
+ export declare function calculateStrategyAprFromStrategy(params: {
17
+ strategy: Strategy;
18
+ perpLeverage: number;
19
+ borosMargin: number;
20
+ exchangeFee1?: number;
21
+ exchangeFee2?: number;
22
+ borosTradeFee?: number;
23
+ borosSettlementFee?: number;
24
+ }): number;
25
+ export declare function calculateAprTimesMaxLeverage(strategy: Strategy, borosMargin: number, fees?: {
26
+ exchangeFee1?: number;
27
+ exchangeFee2?: number;
28
+ borosTradeFee?: number;
29
+ borosSettlementFee?: number;
30
+ }): number;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateStrategyFixedApr = calculateStrategyFixedApr;
4
+ exports.calculateStrategyFixedAprFixedX18 = calculateStrategyFixedAprFixedX18;
5
+ exports.calculateStrategy = calculateStrategy;
6
+ exports.calculateStrategyAprFromStrategy = calculateStrategyAprFromStrategy;
7
+ exports.calculateAprTimesMaxLeverage = calculateAprTimesMaxLeverage;
8
+ const boros_offchain_math_1 = require("@pendle/boros-offchain-math");
9
+ function calculateStrategyFixedApr(params) {
10
+ const { perpLeverage, daysToMaturity, borosMargin, impliedApr1, impliedApr2, exchangeFee1, exchangeFee2, borosTradeFee, borosSettlementFee, } = params;
11
+ if (daysToMaturity <= 0) {
12
+ return 0;
13
+ }
14
+ const impliedAprDiff = Math.abs(impliedApr1 - impliedApr2);
15
+ const annualizationFactor = 365 / daysToMaturity;
16
+ const annualizedExchangeFees = annualizationFactor * (exchangeFee1 + exchangeFee2);
17
+ const borosFees = 2 * (borosSettlementFee + borosTradeFee);
18
+ const totalFees = annualizedExchangeFees + borosFees;
19
+ const leverageFactor = 1 / (2 / perpLeverage + borosMargin);
20
+ const fixedApr = leverageFactor * (impliedAprDiff - totalFees);
21
+ return fixedApr;
22
+ }
23
+ function calculateStrategyFixedAprFixedX18(params) {
24
+ const { perpLeverage, daysToMaturity, borosMargin, impliedApr1, impliedApr2, exchangeFee1, exchangeFee2, borosTradeFee, borosSettlementFee, } = params;
25
+ if (daysToMaturity <= 0) {
26
+ return boros_offchain_math_1.FixedX18.ZERO;
27
+ }
28
+ const impliedAprDiff = impliedApr1.sub(impliedApr2).abs();
29
+ const annualizationFactor = boros_offchain_math_1.FixedX18.fromNumber(365 / daysToMaturity);
30
+ const two = boros_offchain_math_1.FixedX18.fromNumber(2);
31
+ const annualizedExchangeFees = exchangeFee1.add(exchangeFee2).mulDown(annualizationFactor);
32
+ const borosFees = borosSettlementFee.add(borosTradeFee).mulDown(two);
33
+ const totalFees = annualizedExchangeFees.add(borosFees);
34
+ const netReturn = impliedAprDiff.sub(totalFees);
35
+ const twoOverPerpLev = boros_offchain_math_1.FixedX18.fromNumber(2 / perpLeverage);
36
+ const denominator = twoOverPerpLev.add(borosMargin);
37
+ const leverageFactor = boros_offchain_math_1.FixedX18.ONE.divDown(denominator);
38
+ const fixedApr = leverageFactor.mulDown(netReturn);
39
+ return fixedApr;
40
+ }
41
+ function calculateStrategy(input) {
42
+ const { totalCapital, daysToMaturity, perpLeverage, borosMargin, impliedApr1, impliedApr2, exchangeFee1, exchangeFee2, borosTradeFee, borosSettlementFee, } = input;
43
+ const params = {
44
+ perpLeverage,
45
+ daysToMaturity,
46
+ borosMargin: borosMargin / 100,
47
+ impliedApr1: impliedApr1 / 100,
48
+ impliedApr2: impliedApr2 / 100,
49
+ exchangeFee1: exchangeFee1 / 100,
50
+ exchangeFee2: exchangeFee2 / 100,
51
+ borosTradeFee: borosTradeFee / 100,
52
+ borosSettlementFee: borosSettlementFee / 100,
53
+ };
54
+ const fixedApr = calculateStrategyFixedApr(params);
55
+ const roi = fixedApr * (daysToMaturity / 365);
56
+ const estimatedEarnings = totalCapital * roi;
57
+ const estimatedEarningsPerYear = totalCapital * fixedApr;
58
+ return {
59
+ fixedApr,
60
+ fixedAprPercentage: fixedApr * 100,
61
+ estimatedEarnings,
62
+ estimatedEarningsPerYear,
63
+ };
64
+ }
65
+ function calculateStrategyAprFromStrategy(params) {
66
+ const { strategy, perpLeverage, borosMargin, exchangeFee1 = 0.0005, exchangeFee2 = 0.0005, borosTradeFee = 0.0005, borosSettlementFee = 0.002, } = params;
67
+ return calculateStrategyFixedApr({
68
+ perpLeverage,
69
+ daysToMaturity: strategy.daysToMaturity,
70
+ borosMargin,
71
+ impliedApr1: strategy.longMarket.impliedApr,
72
+ impliedApr2: strategy.shortMarket.impliedApr,
73
+ exchangeFee1,
74
+ exchangeFee2,
75
+ borosTradeFee,
76
+ borosSettlementFee,
77
+ });
78
+ }
79
+ function calculateAprTimesMaxLeverage(strategy, borosMargin, fees) {
80
+ const { exchangeFee1 = 0.0005, exchangeFee2 = 0.0005, borosTradeFee = 0.0005, borosSettlementFee = 0.002, } = fees ?? {};
81
+ return calculateStrategyFixedApr({
82
+ perpLeverage: strategy.maxPerpLeverage,
83
+ daysToMaturity: strategy.daysToMaturity,
84
+ borosMargin,
85
+ impliedApr1: strategy.longMarket.impliedApr,
86
+ impliedApr2: strategy.shortMarket.impliedApr,
87
+ exchangeFee1,
88
+ exchangeFee2,
89
+ borosTradeFee,
90
+ borosSettlementFee,
91
+ });
92
+ }
93
+ //# sourceMappingURL=strategyApr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategyApr.js","sourceRoot":"","sources":["../../../src/entities/Calculator/strategyApr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Strategy, StrategyExecutionPlan } from './types';
2
+ export type GenerateExecutionPlanParams = {
3
+ strategy: Strategy;
4
+ totalCapital: number;
5
+ perpLeverage: number;
6
+ borosMargin: number;
7
+ };
8
+ export declare function generateExecutionPlan(params: GenerateExecutionPlanParams): StrategyExecutionPlan;
9
+ export declare function getExecutionStepsSummary(plan: StrategyExecutionPlan): string[];
10
+ export declare function formatExecutionStepsForUI(plan: StrategyExecutionPlan): Array<{
11
+ action: 'Long' | 'Short';
12
+ size: string;
13
+ description: string;
14
+ platform: 'perp' | 'boros';
15
+ exchange: string;
16
+ clickable: boolean;
17
+ }>;
18
+ export declare function calculateCapitalAllocation(params: {
19
+ totalCapital: number;
20
+ perpLeverage: number;
21
+ liquidationThreshold: number;
22
+ }): {
23
+ capitalPerPerpLeg: number;
24
+ capitalPerBorosLeg: number;
25
+ totalPerpCapital: number;
26
+ totalBorosCapital: number;
27
+ notionalExposurePerLeg: number;
28
+ };
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateExecutionPlan = generateExecutionPlan;
4
+ exports.getExecutionStepsSummary = getExecutionStepsSummary;
5
+ exports.formatExecutionStepsForUI = formatExecutionStepsForUI;
6
+ exports.calculateCapitalAllocation = calculateCapitalAllocation;
7
+ function generateExecutionPlan(params) {
8
+ const { strategy, totalCapital, perpLeverage, borosMargin } = params;
9
+ const positionSizePerLeg = totalCapital / (2 / perpLeverage + borosMargin);
10
+ const yuSize = positionSizePerLeg;
11
+ const steps = [
12
+ {
13
+ stepNumber: 1,
14
+ action: 'long',
15
+ platform: 'perp',
16
+ exchange: strategy.longMarket.exchange,
17
+ description: `Long ${strategy.asset} on ${strategy.longMarket.exchange} perpetual`,
18
+ details: {
19
+ asset: strategy.asset,
20
+ size: `${positionSizePerLeg} ${strategy.asset}`,
21
+ marketType: 'perpetual',
22
+ },
23
+ },
24
+ {
25
+ stepNumber: 2,
26
+ action: 'short',
27
+ platform: 'perp',
28
+ exchange: strategy.shortMarket.exchange,
29
+ description: `Short ${strategy.asset} on ${strategy.shortMarket.exchange} perpetual`,
30
+ details: {
31
+ asset: strategy.asset,
32
+ size: `${positionSizePerLeg} ${strategy.asset}`,
33
+ marketType: 'perpetual',
34
+ },
35
+ },
36
+ {
37
+ stepNumber: 3,
38
+ action: 'long',
39
+ platform: 'boros',
40
+ exchange: strategy.longMarket.exchange,
41
+ description: `Long ${strategy.asset} YU on Boros ${strategy.longMarket.exchange} market`,
42
+ marketId: strategy.longMarket.marketId,
43
+ ammId: strategy.longMarket.ammId,
44
+ details: {
45
+ asset: strategy.asset,
46
+ size: `${yuSize} YU ${strategy.asset}`,
47
+ marketType: `Boros ${strategy.longMarket.exchange} market`,
48
+ },
49
+ },
50
+ {
51
+ stepNumber: 4,
52
+ action: 'short',
53
+ platform: 'boros',
54
+ exchange: strategy.shortMarket.exchange,
55
+ description: `Short ${strategy.asset} YU on Boros ${strategy.shortMarket.exchange} market`,
56
+ marketId: strategy.shortMarket.marketId,
57
+ ammId: strategy.shortMarket.ammId,
58
+ details: {
59
+ asset: strategy.asset,
60
+ size: `${yuSize} YU ${strategy.asset}`,
61
+ marketType: `Boros ${strategy.shortMarket.exchange} market`,
62
+ },
63
+ },
64
+ ];
65
+ return {
66
+ strategy,
67
+ steps,
68
+ totalCapitalRequired: totalCapital,
69
+ perpLeverage,
70
+ borosMargin,
71
+ };
72
+ }
73
+ function getExecutionStepsSummary(plan) {
74
+ return plan.steps.map((step) => {
75
+ const actionText = step.action === 'long' ? 'Long' : 'Short';
76
+ return `${actionText} ${step.details.size} on ${step.details.marketType}`;
77
+ });
78
+ }
79
+ function formatExecutionStepsForUI(plan) {
80
+ const { strategy, totalCapitalRequired, perpLeverage, borosMargin } = plan;
81
+ const positionSize = totalCapitalRequired / (2 / perpLeverage + borosMargin);
82
+ return [
83
+ {
84
+ action: 'Long',
85
+ size: `${positionSize} ${strategy.asset}`,
86
+ description: `on ${strategy.longMarket.exchange} ${strategy.asset} perpetual`,
87
+ platform: 'perp',
88
+ exchange: strategy.longMarket.exchange,
89
+ clickable: true,
90
+ },
91
+ {
92
+ action: 'Short',
93
+ size: `${positionSize} ${strategy.asset}`,
94
+ description: `on ${strategy.shortMarket.exchange} ${strategy.asset} perpetual`,
95
+ platform: 'perp',
96
+ exchange: strategy.shortMarket.exchange,
97
+ clickable: true,
98
+ },
99
+ {
100
+ action: 'Long',
101
+ size: `${positionSize} YU ${strategy.asset}`,
102
+ description: `on Boros ${strategy.longMarket.exchange} ${strategy.asset} market`,
103
+ platform: 'boros',
104
+ exchange: strategy.longMarket.exchange,
105
+ clickable: true,
106
+ },
107
+ {
108
+ action: 'Short',
109
+ size: `${positionSize} YU ${strategy.asset}`,
110
+ description: `on Boros ${strategy.shortMarket.exchange} ${strategy.asset} market`,
111
+ platform: 'boros',
112
+ exchange: strategy.shortMarket.exchange,
113
+ clickable: true,
114
+ },
115
+ ];
116
+ }
117
+ function calculateCapitalAllocation(params) {
118
+ const { totalCapital, perpLeverage, liquidationThreshold } = params;
119
+ const capitalPerPerpLeg = totalCapital / 2;
120
+ const notionalExposurePerLeg = capitalPerPerpLeg * perpLeverage;
121
+ const capitalPerBorosLeg = 0;
122
+ return {
123
+ capitalPerPerpLeg,
124
+ capitalPerBorosLeg,
125
+ totalPerpCapital: totalCapital,
126
+ totalBorosCapital: 0,
127
+ notionalExposurePerLeg,
128
+ };
129
+ }
130
+ //# sourceMappingURL=strategyExecution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategyExecution.js","sourceRoot":"","sources":["../../../src/entities/Calculator/strategyExecution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { MarketResponse } from '../../backend/secrettune/BorosCoreSDK';
2
+ import type { GetStrategiesParams, GetStrategiesResult, Strategy } from './types';
3
+ export declare function findStrategies(params?: GetStrategiesParams): Promise<GetStrategiesResult>;
4
+ export declare function findStrategiesByAsset(params: GetStrategiesParams & {
5
+ asset: string;
6
+ }): Promise<GetStrategiesResult>;
7
+ export declare function findStrategiesByMaturity(params: GetStrategiesParams & {
8
+ maturity: number;
9
+ }): Promise<GetStrategiesResult>;
10
+ export declare function findStrategiesByExchanges(params: GetStrategiesParams & {
11
+ exchanges: [string, string];
12
+ }): Promise<GetStrategiesResult>;
13
+ export declare function getStrategyByMarketIds(marketId1: number, marketId2: number, markets?: MarketResponse[]): Promise<Strategy | null>;
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findStrategies = findStrategies;
4
+ exports.findStrategiesByAsset = findStrategiesByAsset;
5
+ exports.findStrategiesByMaturity = findStrategiesByMaturity;
6
+ exports.findStrategiesByExchanges = findStrategiesByExchanges;
7
+ exports.getStrategyByMarketIds = getStrategyByMarketIds;
8
+ const module_1 = require("../../backend/secrettune/module");
9
+ const SECONDS_PER_DAY = 86400;
10
+ async function fetchMarkets() {
11
+ const sdk = (0, module_1.getCoreSdk)();
12
+ const { data } = await sdk.markets.marketsControllerGetMarkets({});
13
+ return data.results;
14
+ }
15
+ function toStrategyMarket(market) {
16
+ if (!market.metadata) {
17
+ return null;
18
+ }
19
+ const impliedApr = market.data?.midApr ?? market.data?.markApr ?? market.data?.ammImpliedApr ?? 0;
20
+ return {
21
+ marketId: market.marketId,
22
+ address: market.address,
23
+ exchange: market.metadata.platformName,
24
+ impliedApr,
25
+ maxLeverage: market.metadata.maxLeverage,
26
+ ammId: market.metadata.ammId,
27
+ ammAddress: market.metadata.ammAddress,
28
+ marketName: market.metadata.marketName,
29
+ rawMarket: market,
30
+ };
31
+ }
32
+ function createMarketGroupKey(market) {
33
+ if (!market.metadata?.assetSymbol) {
34
+ return null;
35
+ }
36
+ return `${market.metadata.assetSymbol}-${market.tokenId}-${market.imData.maturity}`;
37
+ }
38
+ function createStrategyId(asset, collateralTokenId, maturity, longExchange, shortExchange) {
39
+ return `${asset}-${collateralTokenId}-${maturity}-${longExchange}-${shortExchange}`;
40
+ }
41
+ async function findStrategies(params) {
42
+ const { markets: providedMarkets, minImpliedAprSpread = 0, excludeDevTest = true } = params ?? {};
43
+ const markets = providedMarkets ?? (await fetchMarkets());
44
+ const validMarkets = markets.filter((market) => {
45
+ if (!market.metadata?.assetSymbol)
46
+ return false;
47
+ if (!market.metadata?.platformName)
48
+ return false;
49
+ if (market.state === 'Paused' || market.state === 'Halted')
50
+ return false;
51
+ if (excludeDevTest && market.metadata.isDevTest)
52
+ return false;
53
+ return true;
54
+ });
55
+ const marketGroups = new Map();
56
+ for (const market of validMarkets) {
57
+ const key = createMarketGroupKey(market);
58
+ if (!key)
59
+ continue;
60
+ const group = marketGroups.get(key) ?? [];
61
+ group.push(market);
62
+ marketGroups.set(key, group);
63
+ }
64
+ const strategies = [];
65
+ for (const [, groupMarkets] of marketGroups) {
66
+ if (groupMarkets.length < 2)
67
+ continue;
68
+ const byExchange = new Map();
69
+ for (const market of groupMarkets) {
70
+ const exchange = market.metadata.platformName;
71
+ const exchangeMarkets = byExchange.get(exchange) ?? [];
72
+ exchangeMarkets.push(market);
73
+ byExchange.set(exchange, exchangeMarkets);
74
+ }
75
+ const exchanges = Array.from(byExchange.keys());
76
+ if (exchanges.length < 2)
77
+ continue;
78
+ for (let i = 0; i < exchanges.length; i++) {
79
+ for (let j = i + 1; j < exchanges.length; j++) {
80
+ const exchange1Markets = byExchange.get(exchanges[i]);
81
+ const exchange2Markets = byExchange.get(exchanges[j]);
82
+ for (const market1 of exchange1Markets) {
83
+ for (const market2 of exchange2Markets) {
84
+ const strategyMarket1 = toStrategyMarket(market1);
85
+ const strategyMarket2 = toStrategyMarket(market2);
86
+ if (!strategyMarket1 || !strategyMarket2)
87
+ continue;
88
+ const impliedAprSpread = Math.abs(strategyMarket1.impliedApr - strategyMarket2.impliedApr);
89
+ if (impliedAprSpread < minImpliedAprSpread)
90
+ continue;
91
+ let longMarket;
92
+ let shortMarket;
93
+ if (strategyMarket1.impliedApr >= strategyMarket2.impliedApr) {
94
+ longMarket = strategyMarket1;
95
+ shortMarket = strategyMarket2;
96
+ }
97
+ else {
98
+ longMarket = strategyMarket2;
99
+ shortMarket = strategyMarket1;
100
+ }
101
+ const asset = market1.metadata.assetSymbol;
102
+ const collateralTokenId = market1.tokenId;
103
+ const maturity = market1.imData.maturity;
104
+ const timeToMaturity = market1.data?.timeToMaturity ?? (maturity - Math.floor(Date.now() / 1000));
105
+ const daysToMaturity = Math.max(0, Math.ceil(timeToMaturity / SECONDS_PER_DAY));
106
+ const strategy = {
107
+ id: createStrategyId(asset, collateralTokenId, maturity, longMarket.exchange, shortMarket.exchange),
108
+ asset,
109
+ collateralTokenId,
110
+ maturity,
111
+ timeToMaturity,
112
+ daysToMaturity,
113
+ longMarket,
114
+ shortMarket,
115
+ impliedAprSpread,
116
+ maxPerpLeverage: Math.min(longMarket.maxLeverage, shortMarket.maxLeverage),
117
+ };
118
+ strategies.push(strategy);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ strategies.sort((a, b) => b.impliedAprSpread - a.impliedAprSpread);
125
+ return {
126
+ strategies,
127
+ totalCount: strategies.length,
128
+ };
129
+ }
130
+ async function findStrategiesByAsset(params) {
131
+ const { asset, ...rest } = params;
132
+ const result = await findStrategies(rest);
133
+ const filtered = result.strategies.filter((s) => s.asset.toUpperCase() === asset.toUpperCase());
134
+ return {
135
+ strategies: filtered,
136
+ totalCount: filtered.length,
137
+ };
138
+ }
139
+ async function findStrategiesByMaturity(params) {
140
+ const { maturity, ...rest } = params;
141
+ const result = await findStrategies(rest);
142
+ const filtered = result.strategies.filter((s) => s.maturity === maturity);
143
+ return {
144
+ strategies: filtered,
145
+ totalCount: filtered.length,
146
+ };
147
+ }
148
+ async function findStrategiesByExchanges(params) {
149
+ const { exchanges, ...rest } = params;
150
+ const [exchange1, exchange2] = exchanges.map((e) => e.toLowerCase());
151
+ const result = await findStrategies(rest);
152
+ const filtered = result.strategies.filter((s) => {
153
+ const longExchange = s.longMarket.exchange.toLowerCase();
154
+ const shortExchange = s.shortMarket.exchange.toLowerCase();
155
+ return ((longExchange === exchange1 && shortExchange === exchange2) ||
156
+ (longExchange === exchange2 && shortExchange === exchange1));
157
+ });
158
+ return {
159
+ strategies: filtered,
160
+ totalCount: filtered.length,
161
+ };
162
+ }
163
+ async function getStrategyByMarketIds(marketId1, marketId2, markets) {
164
+ const allMarkets = markets ?? (await fetchMarkets());
165
+ const market1 = allMarkets.find((m) => m.marketId === marketId1);
166
+ const market2 = allMarkets.find((m) => m.marketId === marketId2);
167
+ if (!market1 || !market2) {
168
+ return null;
169
+ }
170
+ if (!market1.metadata?.assetSymbol || !market2.metadata?.assetSymbol) {
171
+ return null;
172
+ }
173
+ if (!market1.metadata?.platformName || !market2.metadata?.platformName) {
174
+ return null;
175
+ }
176
+ if (market1.metadata.assetSymbol !== market2.metadata.assetSymbol) {
177
+ return null;
178
+ }
179
+ if (market1.tokenId !== market2.tokenId) {
180
+ return null;
181
+ }
182
+ if (market1.imData.maturity !== market2.imData.maturity) {
183
+ return null;
184
+ }
185
+ const strategyMarket1 = toStrategyMarket(market1);
186
+ const strategyMarket2 = toStrategyMarket(market2);
187
+ if (!strategyMarket1 || !strategyMarket2) {
188
+ return null;
189
+ }
190
+ let longMarket;
191
+ let shortMarket;
192
+ if (strategyMarket1.impliedApr >= strategyMarket2.impliedApr) {
193
+ longMarket = strategyMarket1;
194
+ shortMarket = strategyMarket2;
195
+ }
196
+ else {
197
+ longMarket = strategyMarket2;
198
+ shortMarket = strategyMarket1;
199
+ }
200
+ const asset = market1.metadata.assetSymbol;
201
+ const collateralTokenId = market1.tokenId;
202
+ const maturity = market1.imData.maturity;
203
+ const timeToMaturity = market1.data?.timeToMaturity ?? (maturity - Math.floor(Date.now() / 1000));
204
+ const daysToMaturity = Math.max(0, Math.ceil(timeToMaturity / SECONDS_PER_DAY));
205
+ const impliedAprSpread = Math.abs(strategyMarket1.impliedApr - strategyMarket2.impliedApr);
206
+ return {
207
+ id: createStrategyId(asset, collateralTokenId, maturity, longMarket.exchange, shortMarket.exchange),
208
+ asset,
209
+ collateralTokenId,
210
+ maturity,
211
+ timeToMaturity,
212
+ daysToMaturity,
213
+ longMarket,
214
+ shortMarket,
215
+ impliedAprSpread,
216
+ maxPerpLeverage: Math.min(longMarket.maxLeverage, shortMarket.maxLeverage),
217
+ };
218
+ }
219
+ //# sourceMappingURL=strategyFinder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategyFinder.js","sourceRoot":"","sources":["../../../src/entities/Calculator/strategyFinder.ts"],"names":[],"mappings":"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"}