@gainsnetwork/sdk 1.5.0-rc2 → 1.5.0-rc3

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 (85) hide show
  1. package/lib/contracts/types/generated/GFarmTradingStorageV5.d.ts +1911 -0
  2. package/lib/contracts/types/generated/GFarmTradingStorageV5.js +2 -0
  3. package/lib/contracts/types/generated/GNSBorrowingFees.d.ts +1067 -0
  4. package/lib/contracts/types/generated/GNSBorrowingFees.js +2 -0
  5. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.d.ts +979 -0
  6. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.js +2 -0
  7. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.d.ts +1058 -0
  8. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.js +2 -0
  9. package/lib/contracts/types/generated/GNSNftRewardsV6.d.ts +533 -0
  10. package/lib/contracts/types/generated/GNSNftRewardsV6.js +2 -0
  11. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.d.ts +613 -0
  12. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.js +2 -0
  13. package/lib/contracts/types/generated/GNSPairInfosV6_1.d.ts +911 -0
  14. package/lib/contracts/types/generated/GNSPairInfosV6_1.js +2 -0
  15. package/lib/contracts/types/generated/GNSPairsStorageV6.d.ts +660 -0
  16. package/lib/contracts/types/generated/GNSPairsStorageV6.js +2 -0
  17. package/lib/contracts/types/generated/GNSTrading.d.ts +758 -0
  18. package/lib/contracts/types/generated/GNSTrading.js +2 -0
  19. package/lib/contracts/types/generated/GNSTradingCallbacks.d.ts +875 -0
  20. package/lib/contracts/types/generated/GNSTradingCallbacks.js +2 -0
  21. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.d.ts +806 -0
  22. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.js +2 -0
  23. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.d.ts +821 -0
  24. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.js +2 -0
  25. package/lib/contracts/types/generated/GNSTradingStorage.d.ts +1387 -0
  26. package/lib/contracts/types/generated/GNSTradingStorage.js +2 -0
  27. package/lib/contracts/types/generated/GTokenV6_3_2.d.ts +1838 -0
  28. package/lib/contracts/types/generated/GTokenV6_3_2.js +2 -0
  29. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.d.ts +83 -0
  30. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.js +2691 -0
  31. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.d.ts +88 -0
  32. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.js +1654 -0
  33. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.d.ts +113 -0
  34. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.js +1742 -0
  35. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.d.ts +124 -0
  36. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.js +1784 -0
  37. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.d.ts +100 -0
  38. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.js +1116 -0
  39. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.d.ts +100 -0
  40. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.js +1003 -0
  41. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.d.ts +98 -0
  42. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.js +1485 -0
  43. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.d.ts +117 -0
  44. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.js +1265 -0
  45. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.d.ts +82 -0
  46. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.js +1273 -0
  47. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.d.ts +82 -0
  48. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.js +1326 -0
  49. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.d.ts +113 -0
  50. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.js +1428 -0
  51. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.d.ts +96 -0
  52. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.js +2241 -0
  53. package/lib/contracts/types/generated/factories/GNSTrading__factory.d.ts +95 -0
  54. package/lib/contracts/types/generated/factories/GNSTrading__factory.js +1071 -0
  55. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.d.ts +110 -0
  56. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.js +2682 -0
  57. package/lib/markets/oi/fetcher.d.ts +58 -0
  58. package/lib/markets/oi/fetcher.js +181 -0
  59. package/lib/markets/oi/validation.d.ts +80 -0
  60. package/lib/markets/oi/validation.js +172 -0
  61. package/lib/pricing/depthBands/converter.d.ts +65 -0
  62. package/lib/pricing/depthBands/converter.js +155 -0
  63. package/lib/pricing/depthBands/decoder.d.ts +32 -0
  64. package/lib/pricing/depthBands/decoder.js +109 -0
  65. package/lib/pricing/depthBands/encoder.d.ts +19 -0
  66. package/lib/pricing/depthBands/encoder.js +105 -0
  67. package/lib/pricing/depthBands/index.d.ts +8 -0
  68. package/lib/pricing/depthBands/index.js +26 -0
  69. package/lib/pricing/depthBands/types.d.ts +49 -0
  70. package/lib/pricing/depthBands/types.js +10 -0
  71. package/lib/pricing/depthBands/validator.d.ts +22 -0
  72. package/lib/pricing/depthBands/validator.js +113 -0
  73. package/lib/trade/effectiveLeverage/builder.d.ts +23 -0
  74. package/lib/trade/effectiveLeverage/builder.js +30 -0
  75. package/lib/trade/fees/borrowingV2/fetcher.d.ts +0 -1
  76. package/lib/trade/fees/holdingFees/index.d.ts +46 -0
  77. package/lib/trade/fees/holdingFees/index.js +105 -0
  78. package/lib/trade/fees/holdingFees/types.d.ts +23 -0
  79. package/lib/trade/fees/holdingFees/types.js +5 -0
  80. package/lib/trade/fees/trading/holdingFees.d.ts +28 -0
  81. package/lib/trade/fees/trading/holdingFees.js +66 -0
  82. package/lib/trade/fees/trading/holdingFeesStructured.d.ts +28 -0
  83. package/lib/trade/fees/trading/holdingFeesStructured.js +66 -0
  84. package/lib/trade/priceImpact/cumulVol/index.js +0 -27
  85. package/package.json +1 -1
@@ -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;
@@ -1,4 +1,3 @@
1
- /// <reference types="mocha" />
2
1
  import type { GNSMultiCollatDiamond } from "../../../contracts/types/generated";
3
2
  import { BorrowingFeeV2 } from ".";
4
3
  /**
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @dev Holding fees calculation utilities for v10+ markets
3
+ * @dev Combines funding fees and borrowing v2 fees
4
+ */
5
+ import { FundingFeeParams, PairFundingFeeData, PairOiAfterV10 } from "../fundingFees/types";
6
+ import { BorrowingFeeParams, PairBorrowingFeeData } from "../borrowingV2/types";
7
+ export type HoldingFeeRates = {
8
+ longHourlyRate: number;
9
+ shortHourlyRate: number;
10
+ fundingFeeLongHourlyRate: number;
11
+ fundingFeeShortHourlyRate: number;
12
+ borrowingFeeHourlyRate: number;
13
+ currentFundingRatePerSecondP: number;
14
+ currentBorrowingRatePerSecondP: number;
15
+ };
16
+ export type GetPairHoldingFeeRatesInput = {
17
+ fundingParams: FundingFeeParams;
18
+ fundingData: PairFundingFeeData;
19
+ pairOiToken: PairOiAfterV10;
20
+ netExposureToken: number;
21
+ netExposureUsd: number;
22
+ borrowingParams: BorrowingFeeParams | null;
23
+ borrowingData: PairBorrowingFeeData | null;
24
+ currentPairPrice: number;
25
+ currentTimestamp: number;
26
+ };
27
+ /**
28
+ * @dev Calculates current holding fee rates per hour for display
29
+ * @param input Input parameters for calculation
30
+ * @returns Holding fee rates per hour with breakdown
31
+ */
32
+ export declare const getPairHoldingFeeRates: (input: GetPairHoldingFeeRatesInput) => HoldingFeeRates;
33
+ /**
34
+ * @dev Converts a per-second rate to annual percentage rate (APR)
35
+ * @param ratePerSecond Rate per second
36
+ * @returns Annual percentage rate
37
+ */
38
+ export declare const convertRatePerSecondToAPR: (ratePerSecond: number) => number;
39
+ /**
40
+ * @dev Formats a holding fee rate for display
41
+ * @param rate Hourly rate (can be negative)
42
+ * @param decimals Number of decimal places
43
+ * @returns Formatted string with sign
44
+ */
45
+ export declare const formatHoldingFeeRate: (rate: number, decimals?: number) => string;
46
+ export * as HoldingFees from "./types";
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Holding fees calculation utilities for v10+ markets
4
+ * @dev Combines funding fees and borrowing v2 fees
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.HoldingFees = exports.formatHoldingFeeRate = exports.convertRatePerSecondToAPR = exports.getPairHoldingFeeRates = void 0;
31
+ const fundingFees_1 = require("../fundingFees");
32
+ const SECONDS_PER_HOUR = 3600;
33
+ const SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
34
+ const PERCENTAGE_PRECISION = 100;
35
+ /**
36
+ * @dev Calculates current holding fee rates per hour for display
37
+ * @param input Input parameters for calculation
38
+ * @returns Holding fee rates per hour with breakdown
39
+ */
40
+ const getPairHoldingFeeRates = (input) => {
41
+ const { fundingParams, fundingData, pairOiToken, netExposureToken, netExposureUsd, borrowingParams, borrowingData, currentPairPrice, currentTimestamp, } = input;
42
+ // Calculate funding fee rates
43
+ let fundingFeeLongHourlyRate = 0;
44
+ let fundingFeeShortHourlyRate = 0;
45
+ let currentFundingRatePerSecondP = 0;
46
+ if (fundingParams.fundingFeesEnabled) {
47
+ // Get current funding rate
48
+ const pendingFunding = (0, fundingFees_1.getPairPendingAccFundingFees)(fundingParams, fundingData, currentPairPrice, pairOiToken, netExposureToken, netExposureUsd, currentTimestamp);
49
+ currentFundingRatePerSecondP = pendingFunding.currentFundingRatePerSecondP;
50
+ // Get APR multipliers
51
+ const { longAprMultiplier, shortAprMultiplier } = (0, fundingFees_1.getLongShortAprMultiplier)(currentFundingRatePerSecondP, pairOiToken.oiLongToken, pairOiToken.oiShortToken, fundingParams.aprMultiplierEnabled);
52
+ // Calculate hourly rates
53
+ // Funding rate * seconds per hour * current price * APR multiplier / 100
54
+ const baseHourlyRate = (currentFundingRatePerSecondP * SECONDS_PER_HOUR * currentPairPrice) /
55
+ PERCENTAGE_PRECISION;
56
+ // Long side pays when rate is positive, earns when negative
57
+ fundingFeeLongHourlyRate = baseHourlyRate * longAprMultiplier;
58
+ // Short side is opposite
59
+ fundingFeeShortHourlyRate = -baseHourlyRate * shortAprMultiplier;
60
+ }
61
+ // Calculate borrowing v2 rates
62
+ let borrowingFeeHourlyRate = 0;
63
+ let currentBorrowingRatePerSecondP = 0;
64
+ if (borrowingParams && borrowingData) {
65
+ currentBorrowingRatePerSecondP = borrowingParams.borrowingRatePerSecondP;
66
+ // Borrowing rate * seconds per hour * current price / 100
67
+ borrowingFeeHourlyRate =
68
+ (currentBorrowingRatePerSecondP * SECONDS_PER_HOUR * currentPairPrice) /
69
+ PERCENTAGE_PRECISION;
70
+ }
71
+ // Total holding fees (funding can be negative/positive, borrowing always positive cost)
72
+ const longHourlyRate = fundingFeeLongHourlyRate + borrowingFeeHourlyRate;
73
+ const shortHourlyRate = fundingFeeShortHourlyRate + borrowingFeeHourlyRate;
74
+ return {
75
+ longHourlyRate,
76
+ shortHourlyRate,
77
+ fundingFeeLongHourlyRate,
78
+ fundingFeeShortHourlyRate,
79
+ borrowingFeeHourlyRate,
80
+ currentFundingRatePerSecondP,
81
+ currentBorrowingRatePerSecondP,
82
+ };
83
+ };
84
+ exports.getPairHoldingFeeRates = getPairHoldingFeeRates;
85
+ /**
86
+ * @dev Converts a per-second rate to annual percentage rate (APR)
87
+ * @param ratePerSecond Rate per second
88
+ * @returns Annual percentage rate
89
+ */
90
+ const convertRatePerSecondToAPR = (ratePerSecond) => {
91
+ return ratePerSecond * SECONDS_PER_YEAR * PERCENTAGE_PRECISION;
92
+ };
93
+ exports.convertRatePerSecondToAPR = convertRatePerSecondToAPR;
94
+ /**
95
+ * @dev Formats a holding fee rate for display
96
+ * @param rate Hourly rate (can be negative)
97
+ * @param decimals Number of decimal places
98
+ * @returns Formatted string with sign
99
+ */
100
+ const formatHoldingFeeRate = (rate, decimals = 4) => {
101
+ const sign = rate > 0 ? "+" : "";
102
+ return `${sign}${rate.toFixed(decimals)}%`;
103
+ };
104
+ exports.formatHoldingFeeRate = formatHoldingFeeRate;
105
+ exports.HoldingFees = __importStar(require("./types"));
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @dev Type definitions for holding fees (funding + borrowing v2)
3
+ */
4
+ export interface HoldingFeeRates {
5
+ longHourlyRate: number;
6
+ shortHourlyRate: number;
7
+ fundingFeeLongHourlyRate: number;
8
+ fundingFeeShortHourlyRate: number;
9
+ borrowingFeeHourlyRate: number;
10
+ currentFundingRatePerSecondP: number;
11
+ currentBorrowingRatePerSecondP: number;
12
+ }
13
+ export interface GetPairHoldingFeeRatesInput {
14
+ fundingParams: import("../fundingFees/types").FundingFeeParams;
15
+ fundingData: import("../fundingFees/types").PairFundingFeeData;
16
+ pairOiToken: import("../fundingFees/types").PairOiAfterV10;
17
+ netExposureToken: number;
18
+ netExposureUsd: number;
19
+ borrowingParams: import("../borrowingV2/types").BorrowingFeeParams | null;
20
+ borrowingData: import("../borrowingV2/types").PairBorrowingFeeData | null;
21
+ currentPairPrice: number;
22
+ currentTimestamp: number;
23
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Type definitions for holding fees (funding + borrowing v2)
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @dev Holding fees calculation for structured contexts
3
+ */
4
+ import { Trade, TradeInfo, TradeFeesData } from "../../types";
5
+ import { TradeHoldingFees } from "./types";
6
+ import { ContractsVersion } from "../../../contracts/types";
7
+ import type { BorrowingV1SubContext, BorrowingV2SubContext, FundingFeesSubContext } from "../../pnl";
8
+ /**
9
+ * @dev Context for holding fees calculation with structured sub-contexts
10
+ */
11
+ export type GetStructuredHoldingFeesContext = {
12
+ contractsVersion: ContractsVersion;
13
+ currentTimestamp: number;
14
+ collateralPriceUsd: number;
15
+ borrowingV1?: BorrowingV1SubContext;
16
+ borrowingV2?: BorrowingV2SubContext;
17
+ funding?: FundingFeesSubContext;
18
+ };
19
+ /**
20
+ * @dev Calculates total holding fees using structured context
21
+ * @param trade The trade to calculate fees for
22
+ * @param tradeInfo Trade info containing contracts version
23
+ * @param tradeFeesData Trade fees data containing initial acc fees
24
+ * @param currentPairPrice Current pair price
25
+ * @param context Structured context with sub-contexts for each fee type
26
+ * @returns Object containing all holding fee components
27
+ */
28
+ export declare const getTradePendingHoldingFeesCollateralStructured: (trade: Trade, tradeInfo: TradeInfo, tradeFeesData: TradeFeesData, currentPairPrice: number, context: GetStructuredHoldingFeesContext) => TradeHoldingFees;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Holding fees calculation for structured contexts
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTradePendingHoldingFeesCollateralStructured = void 0;
7
+ const types_1 = require("../../../contracts/types");
8
+ const borrowing_1 = require("../borrowing");
9
+ const borrowingV2_1 = require("../borrowingV2");
10
+ const pairContext_1 = require("../fundingFees/pairContext");
11
+ /**
12
+ * @dev Calculates total holding fees using structured context
13
+ * @param trade The trade to calculate fees for
14
+ * @param tradeInfo Trade info containing contracts version
15
+ * @param tradeFeesData Trade fees data containing initial acc fees
16
+ * @param currentPairPrice Current pair price
17
+ * @param context Structured context with sub-contexts for each fee type
18
+ * @returns Object containing all holding fee components
19
+ */
20
+ const getTradePendingHoldingFeesCollateralStructured = (trade, tradeInfo, tradeFeesData, currentPairPrice, context) => {
21
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
22
+ // Calculate funding fees (v10+ only)
23
+ let fundingFeeCollateral = 0;
24
+ if (context.contractsVersion >= types_1.ContractsVersion.V10 &&
25
+ context.funding &&
26
+ tradeFeesData.initialAccFundingFeeP !== undefined) {
27
+ fundingFeeCollateral = (0, pairContext_1.getPairTradeFundingFeesCollateral)({
28
+ positionSizeCollateral,
29
+ openPrice: trade.openPrice,
30
+ long: trade.long,
31
+ currentPairPrice,
32
+ initialAccFundingFeeP: tradeFeesData.initialAccFundingFeeP,
33
+ }, context.funding // TODO: Fix types once funding types are properly imported
34
+ );
35
+ }
36
+ // Calculate borrowing fees v2
37
+ let borrowingFeeCollateral = 0;
38
+ if (context.borrowingV2 && tradeFeesData.initialAccBorrowingFeeP !== undefined) {
39
+ borrowingFeeCollateral = (0, borrowingV2_1.getPairTradeBorrowingFeesCollateral)({
40
+ positionSizeCollateral,
41
+ openPrice: trade.openPrice,
42
+ currentPairPrice,
43
+ initialAccBorrowingFeeP: tradeFeesData.initialAccBorrowingFeeP,
44
+ currentTimestamp: context.currentTimestamp,
45
+ }, context.borrowingV2);
46
+ }
47
+ // Calculate v1 borrowing fees (some markets use v1 indefinitely)
48
+ let borrowingFeeCollateral_old = 0;
49
+ if (context.borrowingV1) {
50
+ borrowingFeeCollateral_old = (0, borrowing_1.getPairBorrowingFee)(positionSizeCollateral, trade.long, context.borrowingV1.initialAccFees || { accPairFee: 0, accGroupFee: 0, block: 0 }, {
51
+ currentBlock: context.borrowingV1.currentBlock,
52
+ group: context.borrowingV1.group,
53
+ pair: context.borrowingV1.pair,
54
+ collateralPriceUsd: context.collateralPriceUsd,
55
+ });
56
+ }
57
+ return {
58
+ fundingFeeCollateral,
59
+ borrowingFeeCollateral,
60
+ borrowingFeeCollateral_old,
61
+ totalFeeCollateral: fundingFeeCollateral +
62
+ borrowingFeeCollateral +
63
+ borrowingFeeCollateral_old,
64
+ };
65
+ };
66
+ exports.getTradePendingHoldingFeesCollateralStructured = getTradePendingHoldingFeesCollateralStructured;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @dev Holding fees calculation for structured contexts
3
+ */
4
+ import { Trade, TradeInfo, TradeFeesData } from "../../types";
5
+ import { TradeHoldingFees } from "./types";
6
+ import { ContractsVersion } from "../../../contracts/types";
7
+ import type { BorrowingV1SubContext, BorrowingV2SubContext, FundingFeesSubContext } from "../../pnl";
8
+ /**
9
+ * @dev Context for holding fees calculation with structured sub-contexts
10
+ */
11
+ export type GetStructuredHoldingFeesContext = {
12
+ contractsVersion: ContractsVersion;
13
+ currentTimestamp: number;
14
+ collateralPriceUsd: number;
15
+ borrowingV1?: BorrowingV1SubContext;
16
+ borrowingV2?: BorrowingV2SubContext;
17
+ funding?: FundingFeesSubContext;
18
+ };
19
+ /**
20
+ * @dev Calculates total holding fees using structured context
21
+ * @param trade The trade to calculate fees for
22
+ * @param tradeInfo Trade info containing contracts version
23
+ * @param tradeFeesData Trade fees data containing initial acc fees
24
+ * @param currentPairPrice Current pair price
25
+ * @param context Structured context with sub-contexts for each fee type
26
+ * @returns Object containing all holding fee components
27
+ */
28
+ export declare const getTradePendingHoldingFeesCollateralStructured: (trade: Trade, tradeInfo: TradeInfo, tradeFeesData: TradeFeesData, currentPairPrice: number, context: GetStructuredHoldingFeesContext) => TradeHoldingFees;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Holding fees calculation for structured contexts
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTradePendingHoldingFeesCollateralStructured = void 0;
7
+ const types_1 = require("../../../contracts/types");
8
+ const borrowing_1 = require("../borrowing");
9
+ const borrowingV2_1 = require("../borrowingV2");
10
+ const fundingFees_1 = require("../fundingFees");
11
+ /**
12
+ * @dev Calculates total holding fees using structured context
13
+ * @param trade The trade to calculate fees for
14
+ * @param tradeInfo Trade info containing contracts version
15
+ * @param tradeFeesData Trade fees data containing initial acc fees
16
+ * @param currentPairPrice Current pair price
17
+ * @param context Structured context with sub-contexts for each fee type
18
+ * @returns Object containing all holding fee components
19
+ */
20
+ const getTradePendingHoldingFeesCollateralStructured = (trade, tradeInfo, tradeFeesData, currentPairPrice, context) => {
21
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
22
+ // Calculate funding fees (v10+ only)
23
+ let fundingFeeCollateral = 0;
24
+ if (context.contractsVersion >= types_1.ContractsVersion.V10 &&
25
+ context.funding &&
26
+ tradeFeesData.initialAccFundingFeeP !== undefined) {
27
+ fundingFeeCollateral = (0, fundingFees_1.getTradeFundingFeesCollateral)(trade, tradeInfo, tradeFeesData, currentPairPrice, Object.assign(Object.assign({}, context.funding), { currentTimestamp: context.currentTimestamp }) // TODO: Fix types once funding types are properly imported
28
+ );
29
+ }
30
+ // Calculate borrowing fees v2
31
+ let borrowingFeeCollateral = 0;
32
+ if (context.borrowingV2 &&
33
+ tradeFeesData.initialAccBorrowingFeeP !== undefined) {
34
+ borrowingFeeCollateral = (0, borrowingV2_1.getTradeBorrowingFeesCollateral)({
35
+ positionSizeCollateral,
36
+ openPrice: trade.openPrice,
37
+ currentPairPrice,
38
+ initialAccBorrowingFeeP: tradeFeesData.initialAccBorrowingFeeP,
39
+ currentTimestamp: context.currentTimestamp,
40
+ }, context.borrowingV2);
41
+ }
42
+ // Calculate v1 borrowing fees (some markets use v1 indefinitely)
43
+ let borrowingFeeCollateral_old = 0;
44
+ if (context.borrowingV1) {
45
+ borrowingFeeCollateral_old = (0, borrowing_1.getBorrowingFee)(positionSizeCollateral, undefined, // pairIndex not needed for pair-specific context
46
+ trade.long, context.borrowingV1.initialAccFees || {
47
+ accPairFee: 0,
48
+ accGroupFee: 0,
49
+ block: 0,
50
+ }, {
51
+ currentBlock: context.borrowingV1.currentBlock,
52
+ group: context.borrowingV1.group,
53
+ pair: context.borrowingV1.pair,
54
+ collateralPriceUsd: context.collateralPriceUsd,
55
+ });
56
+ }
57
+ return {
58
+ fundingFeeCollateral,
59
+ borrowingFeeCollateral,
60
+ borrowingFeeCollateral_old,
61
+ totalFeeCollateral: fundingFeeCollateral +
62
+ borrowingFeeCollateral +
63
+ borrowingFeeCollateral_old,
64
+ };
65
+ };
66
+ exports.getTradePendingHoldingFeesCollateralStructured = getTradePendingHoldingFeesCollateralStructured;
@@ -80,8 +80,6 @@ exports.getLegacyFactor = getLegacyFactor;
80
80
  * @returns Price impact percentage
81
81
  */
82
82
  const _calculateDepthBandsPriceImpact = (tradeSizeUsd, depthBandParams) => {
83
- console.log("tradeSizeUsd", tradeSizeUsd);
84
- console.log("depthBandParams", depthBandParams);
85
83
  const totalDepthUsd = depthBandParams.depthBands.totalDepthUsd;
86
84
  if (totalDepthUsd === 0 || tradeSizeUsd === 0)
87
85
  return 0;
@@ -93,51 +91,38 @@ const _calculateDepthBandsPriceImpact = (tradeSizeUsd, depthBandParams) => {
93
91
  const bandLiquidityPercentageBps = depthBandParams.depthBands.bands[i]; // Already in 0-1 format
94
92
  const topOfBandOffsetPpm = depthBandParams.depthBandsMapping.bands[i]; // Already in 0-1 format
95
93
  const bandDepthUsd = bandLiquidityPercentageBps * totalDepthUsd;
96
- console.log("bandDepthUsd", bandDepthUsd);
97
94
  // Skip if band has same depth as previous (would cause division by zero)
98
95
  if (bandDepthUsd <= prevBandDepthUsd) {
99
- console.log("Skipping band");
100
96
  prevBandDepthUsd = bandDepthUsd;
101
97
  topOfPrevBandOffsetPpm = topOfBandOffsetPpm;
102
98
  continue;
103
99
  }
104
100
  // Since bandDepthUsd represents liquidity from mid price to top of band, we need to subtract previous band depth
105
101
  const bandAvailableDepthUsd = bandDepthUsd - prevBandDepthUsd;
106
- console.log("bandAvailableDepthUsd", bandAvailableDepthUsd);
107
102
  let depthConsumedUsd;
108
103
  // At 100% band always consume all remaining size, even if more than band available depth
109
104
  if (bandLiquidityPercentageBps === 1 ||
110
105
  remainingSizeUsd <= bandAvailableDepthUsd) {
111
106
  depthConsumedUsd = remainingSizeUsd;
112
107
  remainingSizeUsd = 0;
113
- console.log("Consumed all remaining size");
114
108
  }
115
109
  else {
116
110
  // Normal case: consume entire band and continue to next
117
111
  depthConsumedUsd = bandAvailableDepthUsd;
118
112
  remainingSizeUsd -= bandAvailableDepthUsd;
119
- console.log("Consumed entire band");
120
113
  }
121
114
  // Calculate impact contribution from this band using trapezoidal rule
122
115
  // Low = previous band's price offset, High = current band's price offset
123
116
  const lowOffsetP = topOfPrevBandOffsetPpm;
124
117
  const offsetRangeP = topOfBandOffsetPpm - topOfPrevBandOffsetPpm;
125
- console.log("lowOffsetP", lowOffsetP);
126
- console.log("offsetRangeP", offsetRangeP);
127
- console.log("depthConsumedUsd", depthConsumedUsd);
128
- console.log("bandAvailableDepthUsd", bandAvailableDepthUsd);
129
118
  // Calculate average impact using trapezoidal rule: low + (range * fraction / 2)
130
119
  const avgImpactP = lowOffsetP +
131
120
  (offsetRangeP * depthConsumedUsd) / bandAvailableDepthUsd / 2;
132
- console.log("avgImpactP", avgImpactP);
133
121
  totalWeightedPriceImpactP += avgImpactP * depthConsumedUsd;
134
- console.log("totalWeightedPriceImpactP", totalWeightedPriceImpactP);
135
122
  // Update previous values for next iteration
136
123
  topOfPrevBandOffsetPpm = topOfBandOffsetPpm;
137
124
  prevBandDepthUsd = bandDepthUsd;
138
125
  }
139
- console.log("totalWeightedPriceImpactP", totalWeightedPriceImpactP);
140
- console.log("tradeSizeUsd", tradeSizeUsd);
141
126
  return totalWeightedPriceImpactP / tradeSizeUsd;
142
127
  };
143
128
  /**
@@ -164,12 +149,8 @@ const _getDepthBandsPriceImpactP = (cumulativeVolumeUsd, tradeSizeUsd, depthBand
164
149
  const totalSizeLookupUsdUint = isNegative
165
150
  ? -totalSizeLookupUsd
166
151
  : totalSizeLookupUsd;
167
- console.log("effectiveCumulativeVolumeUsdUint", effectiveCumulativeVolumeUsdUint);
168
- console.log("totalSizeLookupUsdUint", totalSizeLookupUsdUint);
169
152
  const cumulativeVolPriceImpactP = _calculateDepthBandsPriceImpact(effectiveCumulativeVolumeUsdUint, depthBandParams);
170
153
  const totalSizePriceImpactP = _calculateDepthBandsPriceImpact(totalSizeLookupUsdUint, depthBandParams);
171
- console.log("cumulativeVolPriceImpactP", cumulativeVolPriceImpactP);
172
- console.log("totalSizePriceImpactP", totalSizePriceImpactP);
173
154
  const unscaledPriceImpactP = cumulativeVolPriceImpactP +
174
155
  (totalSizePriceImpactP - cumulativeVolPriceImpactP) / 2;
175
156
  const scaledPriceImpactP = unscaledPriceImpactP * priceImpactFactor;
@@ -208,15 +189,11 @@ long, tradeOpenInterestUsd, isPnlPositive, open, lastPosIncreaseBlock, context)
208
189
  (!open &&
209
190
  context?.exemptAfterProtectionCloseFactor === true &&
210
191
  (0, exports.isProtectionCloseFactorActive)(updatedContext) !== true)) {
211
- console.log("No price impact, protection close factor");
212
192
  return 0;
213
193
  }
214
194
  const tradePositiveSkew = (long && open) || (!long && !open);
215
195
  const tradeSkewMultiplier = tradePositiveSkew ? 1 : -1;
216
- console.log("bands", context.pairDepthBands);
217
- console.log("mapping", context.depthBandsMapping);
218
196
  if (!context.pairDepthBands || !context.depthBandsMapping) {
219
- console.log("No price impact, bands");
220
197
  return 0;
221
198
  }
222
199
  // Select depth bands based on trade direction
@@ -225,7 +202,6 @@ long, tradeOpenInterestUsd, isPnlPositive, open, lastPosIncreaseBlock, context)
225
202
  : context.pairDepthBands.below;
226
203
  // Return 0 if no depth bands configured (matching contract lines 588-590)
227
204
  if (!depthBands || depthBands.totalDepthUsd === 0) {
228
- console.log("No price impact, depth bands");
229
205
  return 0;
230
206
  }
231
207
  // Get active OI for cumulative volume calculation
@@ -234,11 +210,8 @@ long, tradeOpenInterestUsd, isPnlPositive, open, lastPosIncreaseBlock, context)
234
210
  activeOi =
235
211
  (0, oiWindows_1.getActiveOi)((0, oiWindows_1.getCurrentOiWindowId)(context.oiWindowsSettings), context.oiWindowsSettings.windowsCount, context.oiWindows, open ? long : !long) || 0;
236
212
  }
237
- console.log("activeOi", activeOi);
238
213
  const signedActiveOi = activeOi * tradeSkewMultiplier;
239
214
  const signedTradeOi = tradeOpenInterestUsd * tradeSkewMultiplier;
240
- console.log("signedActiveOi", signedActiveOi);
241
- console.log("signedTradeOi", signedTradeOi);
242
215
  // Calculate price impact using depth bands
243
216
  const priceImpactP = _getDepthBandsPriceImpactP(signedActiveOi, signedTradeOi, {
244
217
  depthBands: depthBands,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gainsnetwork/sdk",
3
- "version": "1.5.0-rc2",
3
+ "version": "1.5.0-rc3",
4
4
  "description": "Gains Network SDK",
5
5
  "main": "./lib/index.js",
6
6
  "files": [