@gainsnetwork/sdk 1.3.0-rc1 → 1.3.0-rc2
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.
|
@@ -10,16 +10,15 @@ exports.buildCumulVolContext = void 0;
|
|
|
10
10
|
* @returns Cumulative volume context ready for getTradeCumulVolPriceImpactP
|
|
11
11
|
*/
|
|
12
12
|
const buildCumulVolContext = (globalTradingVariables, collateralIndex, pairIndex, additionalParams) => {
|
|
13
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
13
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
14
14
|
const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
|
|
15
15
|
if (!collateral) {
|
|
16
16
|
return undefined;
|
|
17
17
|
}
|
|
18
18
|
// Get pair-specific data from global variables
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const oiWindows = (_b = globalTradingVariables.oiWindows) === null || _b === void 0 ? void 0 : _b[pairIndex];
|
|
19
|
+
const pairDepthBands = (_a = globalTradingVariables.pairDepthBands) === null || _a === void 0 ? void 0 : _a[pairIndex];
|
|
20
|
+
const pairFactor = (_b = globalTradingVariables.pairFactors) === null || _b === void 0 ? void 0 : _b[pairIndex];
|
|
21
|
+
const oiWindows = (_c = globalTradingVariables.oiWindows) === null || _c === void 0 ? void 0 : _c[pairIndex];
|
|
23
22
|
// Get OI windows settings (same for all pairs)
|
|
24
23
|
// OI windows settings from global trading variables are already in SDK format
|
|
25
24
|
const oiWindowsSettings = globalTradingVariables.oiWindowsSettings;
|
|
@@ -27,18 +26,18 @@ const buildCumulVolContext = (globalTradingVariables, collateralIndex, pairIndex
|
|
|
27
26
|
const userPriceImpact = additionalParams.userPriceImpact;
|
|
28
27
|
const protectionCloseFactorWhitelist = additionalParams.protectionCloseFactorWhitelist;
|
|
29
28
|
// Get liquidation params - check both pair and group level
|
|
30
|
-
const liquidationParams = ((
|
|
31
|
-
((
|
|
29
|
+
const liquidationParams = ((_e = (_d = globalTradingVariables.liquidationParams) === null || _d === void 0 ? void 0 : _d.pairs) === null || _e === void 0 ? void 0 : _e[pairIndex]) ||
|
|
30
|
+
((_g = (_f = globalTradingVariables.liquidationParams) === null || _f === void 0 ? void 0 : _f.groups) === null || _g === void 0 ? void 0 : _g[0]); // fallback to first group
|
|
32
31
|
return Object.assign({
|
|
33
32
|
// Trade state
|
|
34
33
|
isOpen: additionalParams.isOpen, isPnlPositive: additionalParams.isPnlPositive, createdBlock: additionalParams.createdBlock,
|
|
35
34
|
// Protection factors
|
|
36
35
|
liquidationParams, currentBlock: additionalParams.currentBlock, contractsVersion: additionalParams.contractsVersion, protectionCloseFactorWhitelist,
|
|
37
36
|
// Price impact data
|
|
38
|
-
|
|
37
|
+
pairDepthBands,
|
|
39
38
|
oiWindowsSettings,
|
|
40
39
|
oiWindows,
|
|
41
40
|
// User/collateral specific
|
|
42
|
-
userPriceImpact, collateralPriceUsd: ((
|
|
41
|
+
userPriceImpact, collateralPriceUsd: ((_h = collateral.prices) === null || _h === void 0 ? void 0 : _h.collateralPriceUsd) || 1 }, pairFactor);
|
|
43
42
|
};
|
|
44
43
|
exports.buildCumulVolContext = buildCumulVolContext;
|
|
@@ -13,7 +13,6 @@ export type CumulVolContext = {
|
|
|
13
13
|
currentBlock?: number | undefined;
|
|
14
14
|
contractsVersion?: ContractsVersion | undefined;
|
|
15
15
|
protectionCloseFactorWhitelist?: boolean;
|
|
16
|
-
pairDepth?: PairDepth | undefined;
|
|
17
16
|
oiWindowsSettings?: OiWindowsSettings | undefined;
|
|
18
17
|
oiWindows?: OiWindows | undefined;
|
|
19
18
|
pairDepthBands?: PairDepthBands | undefined;
|
|
@@ -81,7 +81,7 @@ exports.getLegacyFactor = getLegacyFactor;
|
|
|
81
81
|
* @returns Price impact percentage
|
|
82
82
|
*/
|
|
83
83
|
const _calculateDepthBandsPriceImpact = (tradeSizeUsd, depthBandParams) => {
|
|
84
|
-
const totalDepthUsd = depthBandParams.
|
|
84
|
+
const totalDepthUsd = depthBandParams.depthBands.totalDepthUsd;
|
|
85
85
|
if (totalDepthUsd === 0 || tradeSizeUsd === 0)
|
|
86
86
|
return 0;
|
|
87
87
|
let remainingSizeUsd = tradeSizeUsd;
|
|
@@ -89,8 +89,8 @@ const _calculateDepthBandsPriceImpact = (tradeSizeUsd, depthBandParams) => {
|
|
|
89
89
|
let prevBandDepthUsd = 0;
|
|
90
90
|
let topOfPrevBandOffsetPpm = 0;
|
|
91
91
|
for (let i = 0; i < 30 && remainingSizeUsd !== 0; i++) {
|
|
92
|
-
const bandLiquidityPercentageBps = depthBandParams.
|
|
93
|
-
const topOfBandOffsetPpm = depthBandParams.
|
|
92
|
+
const bandLiquidityPercentageBps = depthBandParams.depthBands.bands[i]; // Already in 0-1 format
|
|
93
|
+
const topOfBandOffsetPpm = depthBandParams.depthBandsMapping.bands[i]; // Already in 0-1 format
|
|
94
94
|
const bandDepthUsd = bandLiquidityPercentageBps * totalDepthUsd;
|
|
95
95
|
// Skip if band has same depth as previous (would cause division by zero)
|
|
96
96
|
if (bandDepthUsd <= prevBandDepthUsd) {
|
|
@@ -171,7 +171,6 @@ const _getDepthBandsPriceImpactP = (cumulativeVolumeUsd, tradeSizeUsd, depthBand
|
|
|
171
171
|
* @returns Cumulative volume price impact percentage (not including spread)
|
|
172
172
|
*/
|
|
173
173
|
const getTradeCumulVolPriceImpactP = (trader, pairIndex, long, tradeOpenInterestUsd, isPnlPositive, open, lastPosIncreaseBlock, context) => {
|
|
174
|
-
var _a, _b;
|
|
175
174
|
// Update context with passed parameters
|
|
176
175
|
const updatedContext = Object.assign(Object.assign({}, context), { isOpen: open, isPnlPositive: isPnlPositive, createdBlock: context.createdBlock || lastPosIncreaseBlock });
|
|
177
176
|
if (
|
|
@@ -188,50 +187,31 @@ const getTradeCumulVolPriceImpactP = (trader, pairIndex, long, tradeOpenInterest
|
|
|
188
187
|
}
|
|
189
188
|
const tradePositiveSkew = (long && open) || (!long && !open);
|
|
190
189
|
const tradeSkewMultiplier = tradePositiveSkew ? 1 : -1;
|
|
191
|
-
if (context.pairDepthBands
|
|
192
|
-
// Select depth bands based on trade direction
|
|
193
|
-
const depthBands = tradePositiveSkew
|
|
194
|
-
? context.pairDepthBands.above
|
|
195
|
-
: context.pairDepthBands.below;
|
|
196
|
-
if (depthBands && depthBands.totalDepthUsd > 0) {
|
|
197
|
-
// Get active OI for cumulative volume calculation
|
|
198
|
-
let activeOi = 0;
|
|
199
|
-
if (context.oiWindowsSettings !== undefined) {
|
|
200
|
-
activeOi =
|
|
201
|
-
(0, oiWindows_1.getActiveOi)((0, oiWindows_1.getCurrentOiWindowId)(context.oiWindowsSettings), context.oiWindowsSettings.windowsCount, context.oiWindows, open ? long : !long) || 0;
|
|
202
|
-
}
|
|
203
|
-
const signedActiveOi = activeOi * tradeSkewMultiplier;
|
|
204
|
-
const signedTradeOi = tradeOpenInterestUsd * tradeSkewMultiplier;
|
|
205
|
-
// Calculate price impact using depth bands
|
|
206
|
-
const priceImpactP = _getDepthBandsPriceImpactP(signedActiveOi, signedTradeOi, {
|
|
207
|
-
pairSlot1: depthBands,
|
|
208
|
-
mappingSlot1: context.depthBandsMapping,
|
|
209
|
-
}, (0, exports.getProtectionCloseFactor)(updatedContext), (0, exports.getCumulativeFactor)(updatedContext));
|
|
210
|
-
return priceImpactP;
|
|
211
|
-
}
|
|
190
|
+
if (!context.pairDepthBands || !context.depthBandsMapping) {
|
|
212
191
|
return 0;
|
|
213
192
|
}
|
|
214
|
-
//
|
|
215
|
-
const
|
|
216
|
-
?
|
|
217
|
-
:
|
|
218
|
-
|
|
219
|
-
if (
|
|
220
|
-
activeOi = (0, oiWindows_1.getActiveOi)((0, oiWindows_1.getCurrentOiWindowId)(context.oiWindowsSettings), context.oiWindowsSettings.windowsCount, context.oiWindows, open ? long : !long);
|
|
221
|
-
}
|
|
222
|
-
if (!onePercentDepth || activeOi === undefined) {
|
|
193
|
+
// Select depth bands based on trade direction
|
|
194
|
+
const depthBands = tradePositiveSkew
|
|
195
|
+
? context.pairDepthBands.above
|
|
196
|
+
: context.pairDepthBands.below;
|
|
197
|
+
// Return 0 if no depth bands configured (matching contract lines 588-590)
|
|
198
|
+
if (!depthBands || depthBands.totalDepthUsd === 0) {
|
|
223
199
|
return 0;
|
|
224
200
|
}
|
|
225
|
-
//
|
|
201
|
+
// Get active OI for cumulative volume calculation
|
|
202
|
+
let activeOi = 0;
|
|
203
|
+
if (context.oiWindowsSettings !== undefined) {
|
|
204
|
+
activeOi =
|
|
205
|
+
(0, oiWindows_1.getActiveOi)((0, oiWindows_1.getCurrentOiWindowId)(context.oiWindowsSettings), context.oiWindowsSettings.windowsCount, context.oiWindows, open ? long : !long) || 0;
|
|
206
|
+
}
|
|
226
207
|
const signedActiveOi = activeOi * tradeSkewMultiplier;
|
|
227
208
|
const signedTradeOi = tradeOpenInterestUsd * tradeSkewMultiplier;
|
|
228
|
-
// Calculate impact
|
|
229
|
-
const
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return finalPriceImpactP;
|
|
209
|
+
// Calculate price impact using depth bands
|
|
210
|
+
const priceImpactP = _getDepthBandsPriceImpactP(signedActiveOi, signedTradeOi, {
|
|
211
|
+
depthBands: depthBands,
|
|
212
|
+
depthBandsMapping: context.depthBandsMapping,
|
|
213
|
+
}, (0, exports.getProtectionCloseFactor)(updatedContext), (0, exports.getCumulativeFactor)(updatedContext));
|
|
214
|
+
return priceImpactP;
|
|
235
215
|
};
|
|
236
216
|
exports.getTradeCumulVolPriceImpactP = getTradeCumulVolPriceImpactP;
|
|
237
217
|
/**
|
|
@@ -298,8 +278,7 @@ const getSpreadWithCumulVolPriceImpactP = (pairSpreadP, buy, collateral, leverag
|
|
|
298
278
|
const positionSizeUsd = collateral * leverage * ((context === null || context === void 0 ? void 0 : context.collateralPriceUsd) || 1);
|
|
299
279
|
const cumulVolImpact = (0, exports.getTradeCumulVolPriceImpactP)("", // trader - not used in calculation
|
|
300
280
|
0, // pairIndex - not used in calculation
|
|
301
|
-
buy, positionSizeUsd, (context === null || context === void 0 ? void 0 : context.isPnlPositive) || false, (context === null || context === void 0 ? void 0 : context.isOpen) !== false, (context === null || context === void 0 ? void 0 : context.createdBlock) || 0, Object.assign(Object.assign({}, context), {
|
|
302
|
-
oiWindowsSettings,
|
|
281
|
+
buy, positionSizeUsd, (context === null || context === void 0 ? void 0 : context.isPnlPositive) || false, (context === null || context === void 0 ? void 0 : context.isOpen) !== false, (context === null || context === void 0 ? void 0 : context.createdBlock) || 0, Object.assign(Object.assign({}, context), { oiWindowsSettings,
|
|
303
282
|
oiWindows }));
|
|
304
283
|
// If no depth or OI data, return just half spread
|
|
305
284
|
if (cumulVolImpact === 0 && (!pairDepth || !oiWindowsSettings)) {
|