# GNSPriceImpact

*Facet #4: Price impact OI windows*

## constructor

```solidity
constructor() public
```

## initializePriceImpact

```solidity
function initializePriceImpact(uint48 _windowsDuration, uint48 _windowsCount) external
```

*Initializes price impact facet*

### Parameters

| Name              | Type   | Description                |
| ----------------- | ------ | -------------------------- |
| \_windowsDuration | uint48 | windows duration (seconds) |
| \_windowsCount    | uint48 | windows count              |

## initializeNegPnlCumulVolMultiplier

```solidity
function initializeNegPnlCumulVolMultiplier(uint40 _negPnlCumulVolMultiplier) external
```

*Initializes negative pnl cumulative volume multiplier*

### Parameters

| Name                       | Type   | Description      |
| -------------------------- | ------ | ---------------- |
| \_negPnlCumulVolMultiplier | uint40 | new value (1e10) |

## initializePairFactors

```solidity
function initializePairFactors(uint16[] _pairIndices, uint40[] _protectionCloseFactors, uint32[] _protectionCloseFactorBlocks, uint40[] _cumulativeFactors) external
```

*Initializes pair factors*

### Parameters

| Name                          | Type      | Description                     |
| ----------------------------- | --------- | ------------------------------- |
| \_pairIndices                 | uint16\[] | pair indices to initialize      |
| \_protectionCloseFactors      | uint40\[] | protection close factors (1e10) |
| \_protectionCloseFactorBlocks | uint32\[] | protection close factor blocks  |
| \_cumulativeFactors           | uint40\[] | cumulative factors (1e10)       |

## setPriceImpactWindowsCount

```solidity
function setPriceImpactWindowsCount(uint48 _newWindowsCount) external
```

*Updates price impact windows count*

### Parameters

| Name              | Type   | Description       |
| ----------------- | ------ | ----------------- |
| \_newWindowsCount | uint48 | new windows count |

## setPriceImpactWindowsDuration

```solidity
function setPriceImpactWindowsDuration(uint48 _newWindowsDuration) external
```

*Updates price impact windows duration*

### Parameters

| Name                 | Type   | Description                    |
| -------------------- | ------ | ------------------------------ |
| \_newWindowsDuration | uint48 | new windows duration (seconds) |

## setNegPnlCumulVolMultiplier

```solidity
function setNegPnlCumulVolMultiplier(uint40 _negPnlCumulVolMultiplier) external
```

*Updates negative pnl cumulative volume multiplier*

### Parameters

| Name                       | Type   | Description      |
| -------------------------- | ------ | ---------------- |
| \_negPnlCumulVolMultiplier | uint40 | new value (1e10) |

## setProtectionCloseFactorWhitelist

```solidity
function setProtectionCloseFactorWhitelist(address[] _traders, bool[] _whitelisted) external
```

*Whitelists/unwhitelists traders from protection close factor*

### Parameters

| Name          | Type       | Description       |
| ------------- | ---------- | ----------------- |
| \_traders     | address\[] | traders addresses |
| \_whitelisted | bool\[]    | values            |

## setPairDepths

```solidity
function setPairDepths(uint256[] _indices, uint128[] _depthsAboveUsd, uint128[] _depthsBelowUsd) external
```

*Updates pairs 1% depths above and below*

### Parameters

| Name             | Type       | Description                   |
| ---------------- | ---------- | ----------------------------- |
| \_indices        | uint256\[] | indices of pairs              |
| \_depthsAboveUsd | uint128\[] | depths above the price in USD |
| \_depthsBelowUsd | uint128\[] | depths below the price in USD |

## setProtectionCloseFactors

```solidity
function setProtectionCloseFactors(uint16[] _pairIndices, uint40[] _protectionCloseFactors) external
```

*Sets protection close factors for pairs*

### Parameters

| Name                     | Type      | Description                         |
| ------------------------ | --------- | ----------------------------------- |
| \_pairIndices            | uint16\[] | pair indices to update              |
| \_protectionCloseFactors | uint40\[] | new protection close factors (1e10) |

## setProtectionCloseFactorBlocks

```solidity
function setProtectionCloseFactorBlocks(uint16[] _pairIndices, uint32[] _protectionCloseFactorBlocks) external
```

*Sets protection close factor blocks duration for pairs*

### Parameters

| Name                          | Type      | Description                        |
| ----------------------------- | --------- | ---------------------------------- |
| \_pairIndices                 | uint16\[] | pair indices to update             |
| \_protectionCloseFactorBlocks | uint32\[] | new protection close factor blocks |

## setCumulativeFactors

```solidity
function setCumulativeFactors(uint16[] _pairIndices, uint40[] _cumulativeFactors) external
```

*Sets cumulative factors for pairs*

### Parameters

| Name                | Type      | Description                   |
| ------------------- | --------- | ----------------------------- |
| \_pairIndices       | uint16\[] | pair indices to update        |
| \_cumulativeFactors | uint40\[] | new cumulative factors (1e10) |

## setExemptOnOpen

```solidity
function setExemptOnOpen(uint16[] _pairIndices, bool[] _exemptOnOpen) external
```

*Sets whether pairs are exempt from price impact on open*

### Parameters

| Name           | Type      | Description            |
| -------------- | --------- | ---------------------- |
| \_pairIndices  | uint16\[] | pair indices to update |
| \_exemptOnOpen | bool\[]   | new values             |

## setExemptAfterProtectionCloseFactor

```solidity
function setExemptAfterProtectionCloseFactor(uint16[] _pairIndices, bool[] _exemptAfterProtectionCloseFactor) external
```

*Sets whether pairs are exempt from price impact on close once protection close factor has expired*

### Parameters

| Name                               | Type      | Description            |
| ---------------------------------- | --------- | ---------------------- |
| \_pairIndices                      | uint16\[] | pair indices to update |
| \_exemptAfterProtectionCloseFactor | bool\[]   | new values             |

## addPriceImpactOpenInterest

```solidity
function addPriceImpactOpenInterest(address _trader, uint32 _index, uint256 _oiDeltaCollateral, bool _open, bool _isPnlPositive) external virtual
```

*Adds open interest to current window*

### Parameters

| Name                | Type    | Description                                                                        |
| ------------------- | ------- | ---------------------------------------------------------------------------------- |
| \_trader            | address | trader address                                                                     |
| \_index             | uint32  | trade index                                                                        |
| \_oiDeltaCollateral | uint256 | open interest to add (collateral precision)                                        |
| \_open              | bool    | whether it corresponds to opening or closing a trade                               |
| \_isPnlPositive     | bool    | whether it corresponds to a positive pnl trade (only relevant when \_open = false) |

## getPriceImpactOi

```solidity
function getPriceImpactOi(uint256 _pairIndex, bool _long) external view returns (uint256 activeOi)
```

*Returns active open interest used in price impact calculation for a pair and side (long/short)*

### Parameters

| Name        | Type    | Description                    |
| ----------- | ------- | ------------------------------ |
| \_pairIndex | uint256 | index of pair                  |
| \_long      | bool    | true for long, false for short |

## getTradePriceImpact

```solidity
function getTradePriceImpact(address _trader, uint256 _marketPrice, uint256 _pairIndex, bool _long, uint256 _tradeOpenInterestUsd, bool _isPnlPositive, bool _open, uint256 _lastPosIncreaseBlock, enum ITradingStorage.ContractsVersion _contractsVersion) external view returns (uint256 priceImpactP, uint256 priceAfterImpact)
```

*Returns price impact % (1e10 precision) and price after impact (1e10 precision) for a trade*

### Parameters

| Name                   | Type                                  | Description                                                                           |
| ---------------------- | ------------------------------------- | ------------------------------------------------------------------------------------- |
| \_trader               | address                               | trader address (to check if whitelisted from protection close factor)                 |
| \_marketPrice          | uint256                               | market price (1e10 precision)                                                         |
| \_pairIndex            | uint256                               | index of pair                                                                         |
| \_long                 | bool                                  | true for long, false for short                                                        |
| \_tradeOpenInterestUsd | uint256                               | open interest of trade in USD (1e18 precision)                                        |
| \_isPnlPositive        | bool                                  | true if positive pnl, false if negative pnl (only relevant when \_open = false)       |
| \_open                 | bool                                  | true on open, false on close                                                          |
| \_lastPosIncreaseBlock | uint256                               | block when trade position size was last increased (only relevant when \_open = false) |
| \_contractsVersion     | enum ITradingStorage.ContractsVersion | trade contracts version                                                               |

## getPairDepth

```solidity
function getPairDepth(uint256 _pairIndex) external view returns (struct IPriceImpact.PairDepth)
```

*Returns a pair's depths above and below the price*

### Parameters

| Name        | Type    | Description   |
| ----------- | ------- | ------------- |
| \_pairIndex | uint256 | index of pair |

## getOiWindowsSettings

```solidity
function getOiWindowsSettings() external view returns (struct IPriceImpact.OiWindowsSettings)
```

*Returns current price impact windows settings*

## getOiWindow

```solidity
function getOiWindow(uint48 _windowsDuration, uint256 _pairIndex, uint256 _windowId) external view returns (struct IPriceImpact.PairOi)
```

*Returns OI window details (long/short OI)*

### Parameters

| Name              | Type    | Description                |
| ----------------- | ------- | -------------------------- |
| \_windowsDuration | uint48  | windows duration (seconds) |
| \_pairIndex       | uint256 | index of pair              |
| \_windowId        | uint256 | id of window               |

## getOiWindows

```solidity
function getOiWindows(uint48 _windowsDuration, uint256 _pairIndex, uint256[] _windowIds) external view returns (struct IPriceImpact.PairOi[])
```

*Returns multiple OI windows details (long/short OI)*

### Parameters

| Name              | Type       | Description                |
| ----------------- | ---------- | -------------------------- |
| \_windowsDuration | uint48     | windows duration (seconds) |
| \_pairIndex       | uint256    | index of pair              |
| \_windowIds       | uint256\[] | ids of windows             |

## getPairDepths

```solidity
function getPairDepths(uint256[] _indices) external view returns (struct IPriceImpact.PairDepth[])
```

*Returns depths above and below the price for multiple pairs*

### Parameters

| Name      | Type       | Description      |
| --------- | ---------- | ---------------- |
| \_indices | uint256\[] | indices of pairs |

## getPairFactors

```solidity
function getPairFactors(uint256[] _indices) external view returns (struct IPriceImpact.PairFactors[])
```

*Returns factors for a set of pairs (1e10)*

### Parameters

| Name      | Type       | Description      |
| --------- | ---------- | ---------------- |
| \_indices | uint256\[] | indices of pairs |

## getNegPnlCumulVolMultiplier

```solidity
function getNegPnlCumulVolMultiplier() external view returns (uint48)
```

*Returns negative pnl cumulative volume multiplier*

## getProtectionCloseFactorWhitelist

```solidity
function getProtectionCloseFactorWhitelist(address _trader) external view returns (bool)
```

*Returns whether a trader is whitelisted from protection close factor*


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.gains.trade/developer/technical-reference/contracts/core/facets/gnspriceimpact.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
