@gainsnetwork/sdk 0.0.0-v10.rc16 → 0.0.0-v10.rc18

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.
@@ -187,7 +187,7 @@ const convertTrade = (trade, collaterals) => {
187
187
  tp: parseFloat(trade.tp) / 1e10,
188
188
  isCounterTrade: trade.isCounterTrade,
189
189
  positionSizeToken: trade.positionSizeToken
190
- ? parseFloat(trade.positionSizeToken) / Math.pow(10, decimals)
190
+ ? parseFloat(trade.positionSizeToken) / 1e18
191
191
  : undefined,
192
192
  };
193
193
  };
@@ -7,3 +7,4 @@ export * from "./oi";
7
7
  export * from "./collateral";
8
8
  export * from "./price";
9
9
  export * from "./holdingFees";
10
+ export * from "./leverage";
@@ -23,3 +23,4 @@ __exportStar(require("./oi"), exports);
23
23
  __exportStar(require("./collateral"), exports);
24
24
  __exportStar(require("./price"), exports);
25
25
  __exportStar(require("./holdingFees"), exports);
26
+ __exportStar(require("./leverage"), exports);
@@ -0,0 +1,12 @@
1
+ import { GlobalTradingVariablesType } from "../../backend/tradingVariables/types";
2
+ import { GetMarketLeverageRestrictionsContext } from "./types";
3
+ /**
4
+ * Builds the context needed for getMarketLeverageRestrictions from global trading variables
5
+ * @param globalTradingVariables Global trading variables containing pairs, groups, etc.
6
+ * @param pairIndex The index of the trading pair
7
+ * @param pairMaxLeverages Map of pair-specific max leverage overrides
8
+ * @returns Context for leverage restrictions calculation
9
+ */
10
+ export declare const buildMarketLeverageRestrictionsContext: (globalTradingVariables: GlobalTradingVariablesType, pairIndex: number, pairMaxLeverages?: {
11
+ [key: number]: number;
12
+ } | undefined) => GetMarketLeverageRestrictionsContext;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildMarketLeverageRestrictionsContext = void 0;
4
+ /**
5
+ * Builds the context needed for getMarketLeverageRestrictions from global trading variables
6
+ * @param globalTradingVariables Global trading variables containing pairs, groups, etc.
7
+ * @param pairIndex The index of the trading pair
8
+ * @param pairMaxLeverages Map of pair-specific max leverage overrides
9
+ * @returns Context for leverage restrictions calculation
10
+ */
11
+ const buildMarketLeverageRestrictionsContext = (globalTradingVariables, pairIndex, pairMaxLeverages) => {
12
+ const { pairs, groups, counterTradeSettings } = globalTradingVariables;
13
+ if (!pairs || !groups || !pairs[pairIndex]) {
14
+ throw new Error("Invalid global trading variables or pair index");
15
+ }
16
+ const pair = pairs[pairIndex];
17
+ const group = groups[pair.groupIndex];
18
+ return {
19
+ groupMinLeverage: group.minLeverage,
20
+ groupMaxLeverage: group.maxLeverage,
21
+ pairMaxLeverage: pairMaxLeverages === null || pairMaxLeverages === void 0 ? void 0 : pairMaxLeverages[pairIndex],
22
+ counterTradeSettings: counterTradeSettings === null || counterTradeSettings === void 0 ? void 0 : counterTradeSettings[pairIndex],
23
+ };
24
+ };
25
+ exports.buildMarketLeverageRestrictionsContext = buildMarketLeverageRestrictionsContext;
@@ -0,0 +1,7 @@
1
+ import { GetMarketLeverageRestrictionsContext, MarketLeverageRestrictions } from "./types";
2
+ /**
3
+ * Gets the leverage restrictions for a trading pair, including both regular and counter trade limits
4
+ * @param context Context containing group limits, pair overrides, and counter trade settings
5
+ * @returns Object with regular and counter trade leverage restrictions
6
+ */
7
+ export declare const getMarketLeverageRestrictions: (context: GetMarketLeverageRestrictionsContext) => MarketLeverageRestrictions;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMarketLeverageRestrictions = void 0;
4
+ /**
5
+ * Gets the leverage restrictions for a trading pair, including both regular and counter trade limits
6
+ * @param context Context containing group limits, pair overrides, and counter trade settings
7
+ * @returns Object with regular and counter trade leverage restrictions
8
+ */
9
+ const getMarketLeverageRestrictions = (context) => {
10
+ const { groupMinLeverage, groupMaxLeverage, pairMaxLeverage, counterTradeSettings, } = context;
11
+ // Calculate regular trade leverage limits
12
+ let regularMin = groupMinLeverage;
13
+ let regularMax = pairMaxLeverage === undefined || pairMaxLeverage === 0
14
+ ? groupMaxLeverage
15
+ : pairMaxLeverage;
16
+ // If max is less than min, set both to 0 (pair is effectively disabled)
17
+ if (regularMax < regularMin) {
18
+ regularMin = 0;
19
+ regularMax = 0;
20
+ }
21
+ // Calculate counter trade leverage limits if settings exist
22
+ let counterTradeLimits = null;
23
+ if (counterTradeSettings) {
24
+ // Counter trades use the group's min leverage but have their own max leverage
25
+ counterTradeLimits = {
26
+ min: groupMinLeverage,
27
+ max: counterTradeSettings.maxLeverage,
28
+ };
29
+ }
30
+ return {
31
+ regular: {
32
+ min: regularMin,
33
+ max: regularMax,
34
+ },
35
+ counterTrade: counterTradeLimits,
36
+ };
37
+ };
38
+ exports.getMarketLeverageRestrictions = getMarketLeverageRestrictions;
@@ -0,0 +1,3 @@
1
+ export * from "./types";
2
+ export * from "./getMarketLeverageRestrictions";
3
+ export * from "./builder";
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./getMarketLeverageRestrictions"), exports);
19
+ __exportStar(require("./builder"), exports);
@@ -0,0 +1,15 @@
1
+ import { CounterTradeSettings } from "../../trade/types";
2
+ export type LeverageRestrictions = {
3
+ min: number;
4
+ max: number;
5
+ };
6
+ export type MarketLeverageRestrictions = {
7
+ regular: LeverageRestrictions;
8
+ counterTrade: LeverageRestrictions | null;
9
+ };
10
+ export type GetMarketLeverageRestrictionsContext = {
11
+ groupMinLeverage: number;
12
+ groupMaxLeverage: number;
13
+ pairMaxLeverage?: number;
14
+ counterTradeSettings?: CounterTradeSettings;
15
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,23 @@
1
+ import { GlobalTradingVariablesType } from "../../backend/tradingVariables/types";
2
+ import { TradeInfo } from "..";
3
+ import { TradeEffectiveLeverageContext } from "./types";
4
+ /**
5
+ * @dev Builds a complete context for effective leverage calculations
6
+ * @dev Uses the closing price impact context builder as a sub-context
7
+ * @param globalTradingVariables The transformed global trading variables from backend
8
+ * @param collateralIndex The collateral index (1-based)
9
+ * @param pairIndex The pair index
10
+ * @param tradeInfo Trade information including createdBlock
11
+ * @param additionalParams Additional parameters for price impact calculations
12
+ * @returns Complete context ready for getTradeNewEffectiveLeverage
13
+ */
14
+ export declare const buildTradeEffectiveLeverageContext: (globalTradingVariables: GlobalTradingVariablesType, collateralIndex: number, pairIndex: number, tradeInfo: TradeInfo, additionalParams: {
15
+ currentBlock: number;
16
+ contractsVersion?: number;
17
+ isPnlPositive?: boolean;
18
+ userPriceImpact?: {
19
+ cumulVolPriceImpactMultiplier: number;
20
+ fixedSpreadP: number;
21
+ };
22
+ protectionCloseFactorWhitelist?: boolean;
23
+ }) => TradeEffectiveLeverageContext | undefined;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildTradeEffectiveLeverageContext = void 0;
4
+ const __1 = require("..");
5
+ /**
6
+ * @dev Builds a complete context for effective leverage calculations
7
+ * @dev Uses the closing price impact context builder as a sub-context
8
+ * @param globalTradingVariables The transformed global trading variables from backend
9
+ * @param collateralIndex The collateral index (1-based)
10
+ * @param pairIndex The pair index
11
+ * @param tradeInfo Trade information including createdBlock
12
+ * @param additionalParams Additional parameters for price impact calculations
13
+ * @returns Complete context ready for getTradeNewEffectiveLeverage
14
+ */
15
+ const buildTradeEffectiveLeverageContext = (globalTradingVariables, collateralIndex, pairIndex, tradeInfo, additionalParams) => {
16
+ var _a;
17
+ // Build the closing price impact context which we'll use for PnL calculations
18
+ const closingPriceImpactContext = (0, __1.buildTradeClosingPriceImpactContext)(globalTradingVariables, collateralIndex, pairIndex, tradeInfo, additionalParams);
19
+ if (!closingPriceImpactContext) {
20
+ return undefined;
21
+ }
22
+ // Extract base spread from pairs data
23
+ const pairs = globalTradingVariables.pairs;
24
+ const baseSpreadP = ((_a = pairs === null || pairs === void 0 ? void 0 : pairs[pairIndex]) === null || _a === void 0 ? void 0 : _a.spreadP) || 0;
25
+ return {
26
+ closingPriceImpactContext,
27
+ baseSpreadP,
28
+ };
29
+ };
30
+ exports.buildTradeEffectiveLeverageContext = buildTradeEffectiveLeverageContext;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @dev Trade effective leverage calculations
3
+ * @dev Mirrors contract's TradingCommonUtils.getTradeNewEffectiveLeverage
4
+ */
5
+ import { TradeEffectiveLeverageInput, TradeEffectiveLeverageContext, TradeEffectiveLeverageResult } from "./types";
6
+ export type { TradeEffectiveLeverageInput, TradeEffectiveLeverageContext, TradeEffectiveLeverageResult, };
7
+ export { buildTradeEffectiveLeverageContext } from "./builder";
8
+ /**
9
+ * @dev Calculates the effective leverage of a trade accounting for unrealized PnL
10
+ * @dev Effective leverage increases when PnL is negative and decreases when positive
11
+ * @dev Mirrors contract's getTradeNewEffectiveLeverage function
12
+ * @param input Trade parameters including new position values
13
+ * @param context Combined context for calculations
14
+ * @returns Effective leverage and related values
15
+ */
16
+ export declare const getTradeNewEffectiveLeverage: (input: TradeEffectiveLeverageInput, context: TradeEffectiveLeverageContext) => TradeEffectiveLeverageResult;
17
+ /**
18
+ * @dev Simplified version for existing positions (no opening fees)
19
+ * @param input Trade parameters
20
+ * @param context Combined context
21
+ * @returns Effective leverage and related values
22
+ */
23
+ export declare const getTradeEffectiveLeverage: (input: Omit<TradeEffectiveLeverageInput, "openingFeesCollateral">, context: TradeEffectiveLeverageContext) => TradeEffectiveLeverageResult;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTradeEffectiveLeverage = exports.getTradeNewEffectiveLeverage = exports.buildTradeEffectiveLeverageContext = void 0;
4
+ const __1 = require("..");
5
+ var builder_1 = require("./builder");
6
+ Object.defineProperty(exports, "buildTradeEffectiveLeverageContext", { enumerable: true, get: function () { return builder_1.buildTradeEffectiveLeverageContext; } });
7
+ /**
8
+ * @dev Calculates the effective leverage of a trade accounting for unrealized PnL
9
+ * @dev Effective leverage increases when PnL is negative and decreases when positive
10
+ * @dev Mirrors contract's getTradeNewEffectiveLeverage function
11
+ * @param input Trade parameters including new position values
12
+ * @param context Combined context for calculations
13
+ * @returns Effective leverage and related values
14
+ */
15
+ const getTradeNewEffectiveLeverage = (input, context) => {
16
+ const { trade, newOpenPrice, newCollateralAmount, newLeverage, currentPairPrice, openingFeesCollateral, } = input;
17
+ const { closingPriceImpactContext } = context;
18
+ // Calculate new position size
19
+ const newPositionSize = newCollateralAmount * newLeverage;
20
+ // Calculate price impact for closing at current price
21
+ const closingPriceImpact = (0, __1.getTradeClosingPriceImpact)({
22
+ trade: Object.assign(Object.assign({}, trade), { openPrice: newOpenPrice, collateralAmount: newCollateralAmount, leverage: newLeverage }),
23
+ oraclePrice: currentPairPrice,
24
+ positionSizeCollateral: newPositionSize,
25
+ currentPairPrice: currentPairPrice,
26
+ useCumulativeVolPriceImpact: true,
27
+ collateralIndex: trade.collateralIndex,
28
+ pairIndex: trade.pairIndex,
29
+ pairSpreadP: context.baseSpreadP,
30
+ contractsVersion: closingPriceImpactContext.tradeInfo.contractsVersion,
31
+ }, closingPriceImpactContext);
32
+ // Calculate unrealized PnL
33
+ // For longs: (exitPrice - entryPrice) * positionSizeToken
34
+ // For shorts: (entryPrice - exitPrice) * positionSizeToken
35
+ const priceDiff = trade.long
36
+ ? closingPriceImpact.priceAfterImpact - newOpenPrice
37
+ : newOpenPrice - closingPriceImpact.priceAfterImpact;
38
+ const unrealizedPnl = priceDiff * closingPriceImpact.positionSizeToken;
39
+ // Calculate effective collateral (collateral + PnL - fees)
40
+ // Note: fees are subtracted because they reduce the effective collateral
41
+ const effectiveCollateral = newCollateralAmount + unrealizedPnl - openingFeesCollateral;
42
+ // Calculate effective leverage
43
+ // If effective collateral is <= 0, leverage is effectively infinite
44
+ const effectiveLeverage = effectiveCollateral > 0
45
+ ? newPositionSize / effectiveCollateral
46
+ : Number.MAX_SAFE_INTEGER;
47
+ return {
48
+ effectiveLeverage,
49
+ unrealizedPnl,
50
+ effectiveCollateral,
51
+ positionSize: newPositionSize,
52
+ };
53
+ };
54
+ exports.getTradeNewEffectiveLeverage = getTradeNewEffectiveLeverage;
55
+ /**
56
+ * @dev Simplified version for existing positions (no opening fees)
57
+ * @param input Trade parameters
58
+ * @param context Combined context
59
+ * @returns Effective leverage and related values
60
+ */
61
+ const getTradeEffectiveLeverage = (input, context) => {
62
+ return (0, exports.getTradeNewEffectiveLeverage)(Object.assign(Object.assign({}, input), { openingFeesCollateral: 0 }), context);
63
+ };
64
+ exports.getTradeEffectiveLeverage = getTradeEffectiveLeverage;
@@ -0,0 +1,3 @@
1
+ export * from "./types";
2
+ export * from "./builder";
3
+ export { getTradeNewEffectiveLeverage, getTradeEffectiveLeverage, } from "./getTradeNewEffectiveLeverage";
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.getTradeEffectiveLeverage = exports.getTradeNewEffectiveLeverage = void 0;
18
+ __exportStar(require("./types"), exports);
19
+ __exportStar(require("./builder"), exports);
20
+ var getTradeNewEffectiveLeverage_1 = require("./getTradeNewEffectiveLeverage");
21
+ Object.defineProperty(exports, "getTradeNewEffectiveLeverage", { enumerable: true, get: function () { return getTradeNewEffectiveLeverage_1.getTradeNewEffectiveLeverage; } });
22
+ Object.defineProperty(exports, "getTradeEffectiveLeverage", { enumerable: true, get: function () { return getTradeNewEffectiveLeverage_1.getTradeEffectiveLeverage; } });
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @dev Types for trade effective leverage calculations
3
+ */
4
+ import { Trade, TradeClosingPriceImpactContext } from "..";
5
+ /**
6
+ * @dev Input parameters for effective leverage calculation
7
+ * @dev Mirrors contract's parameters for getTradeNewEffectiveLeverage
8
+ */
9
+ export type TradeEffectiveLeverageInput = {
10
+ trade: Trade;
11
+ newOpenPrice: number;
12
+ newCollateralAmount: number;
13
+ newLeverage: number;
14
+ currentPairPrice: number;
15
+ openingFeesCollateral: number;
16
+ };
17
+ /**
18
+ * @dev Context for effective leverage calculation
19
+ * Includes closing price impact context for PnL calculations
20
+ */
21
+ export type TradeEffectiveLeverageContext = {
22
+ closingPriceImpactContext: TradeClosingPriceImpactContext;
23
+ baseSpreadP: number;
24
+ };
25
+ /**
26
+ * @dev Result of effective leverage calculation
27
+ */
28
+ export type TradeEffectiveLeverageResult = {
29
+ effectiveLeverage: number;
30
+ unrealizedPnl: number;
31
+ effectiveCollateral: number;
32
+ positionSize: number;
33
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -6,3 +6,4 @@ export * from "./types";
6
6
  export * from "./oiWindows";
7
7
  export * from "./priceImpact";
8
8
  export * from "./utils";
9
+ export * from "./effectiveLeverage";
@@ -22,3 +22,4 @@ __exportStar(require("./types"), exports);
22
22
  __exportStar(require("./oiWindows"), exports);
23
23
  __exportStar(require("./priceImpact"), exports);
24
24
  __exportStar(require("./utils"), exports);
25
+ __exportStar(require("./effectiveLeverage"), exports);
@@ -53,6 +53,11 @@ const getTradeClosingPriceImpact = (input, context) => {
53
53
  const positionSizeToken = input.trade.positionSizeToken
54
54
  ? calculateClosingPositionSizeToken(input.positionSizeCollateral, input.trade.positionSizeToken, input.trade.collateralAmount, input.trade.leverage)
55
55
  : 0;
56
+ console.log("positionSizeToken", positionSizeToken);
57
+ console.log("input.positionSizeCollateral", input.positionSizeCollateral);
58
+ console.log("input.trade.positionSizeToken", input.trade.positionSizeToken);
59
+ console.log("input.trade.collateralAmount", input.trade.collateralAmount);
60
+ console.log("input.trade.leverage", input.trade.leverage);
56
61
  // Calculate fixed spread (reversed for closing)
57
62
  const fixedSpreadP = (0, cumulVol_1.getFixedSpreadP)(input.pairSpreadP, input.trade.long, false // closing
58
63
  );
@@ -74,7 +79,6 @@ const getTradeClosingPriceImpact = (input, context) => {
74
79
  );
75
80
  // Determine actual PnL from the calculated percentage
76
81
  const isPnlPositive = pnlPercent > 0;
77
- console.log("isPnlPositive", isPnlPositive);
78
82
  // Second pass: Recalculate with actual PnL if positive
79
83
  if (isPnlPositive) {
80
84
  cumulVolPriceImpactP = (0, cumulVol_1.getTradeCumulVolPriceImpactP)(input.trade.user, input.pairIndex, input.trade.long, positionSizeUsd, true, // Positive PnL
@@ -43,13 +43,6 @@ const isProtectionCloseFactorActive = (context) => {
43
43
  context.protectionCloseFactor === undefined) {
44
44
  return undefined;
45
45
  }
46
- console.log("context.isPnlPositive", context.isPnlPositive);
47
- console.log("context.isOpen", context.isOpen);
48
- console.log("context.protectionCloseFactor", context.protectionCloseFactor);
49
- console.log("context.currentBlock", context.currentBlock);
50
- console.log("context.createdBlock", context.createdBlock);
51
- console.log("context.protectionCloseFactorBlocks", context.protectionCloseFactorBlocks);
52
- console.log("context.protectionCloseFactorWhitelist", context.protectionCloseFactorWhitelist);
53
46
  return (context.isPnlPositive === true &&
54
47
  context.isOpen === false &&
55
48
  context.protectionCloseFactor > 0 &&
@@ -135,12 +128,6 @@ const getTradeCumulVolPriceImpactP = (trader, pairIndex, long, tradeOpenInterest
135
128
  onePercentDepth /
136
129
  (0, exports.getLegacyFactor)(updatedContext)) *
137
130
  (0, exports.getProtectionCloseFactor)(updatedContext);
138
- console.log("signedActiveOi", signedActiveOi);
139
- console.log("getCumulativeFactor", (0, exports.getCumulativeFactor)(updatedContext));
140
- console.log("signedTradeOi", signedTradeOi);
141
- console.log("onePercentDepth", onePercentDepth);
142
- console.log("getLegacyFactor", (0, exports.getLegacyFactor)(updatedContext));
143
- console.log("getProtectionCloseFactor", (0, exports.getProtectionCloseFactor)(updatedContext));
144
131
  return finalPriceImpactP;
145
132
  };
146
133
  exports.getTradeCumulVolPriceImpactP = getTradeCumulVolPriceImpactP;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gainsnetwork/sdk",
3
- "version": "0.0.0-v10.rc16",
3
+ "version": "0.0.0-v10.rc18",
4
4
  "description": "Gains Network SDK",
5
5
  "main": "./lib/index.js",
6
6
  "files": [