> For the complete documentation index, see [llms.txt](https://docs.algebra.finance/algebra-integral-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.algebra.finance/algebra-integral-documentation/algebra-v1-technical-reference/contracts/api-reference-v1.9-directional-fees/v1.9-directional-fees-core/idatastorageoperator.md).

# IDataStorageOperator

## Events

### FeeConfiguration

`event FeeConfiguration(bool zto, struct AdaptiveFee.Configuration feeConfig)`

| Name      | Type                             | Description |
| --------- | -------------------------------- | ----------- |
| zto       | bool                             |             |
| feeConfig | struct AdaptiveFee.Configuration |             |

## Functions

### timepoints

`function timepoints(uint256 index) external view returns (bool initialized, uint32 blockTimestamp, int56 tickCumulative, uint160 secondsPerLiquidityCumulative, uint88 volatilityCumulative, int24 averageTick, uint144 volumePerLiquidityCumulative)` view external

Returns data belonging to a certain timepoint *Developer note: There is more convenient function to fetch a timepoint: getTimepoints(). Which requires not an index but seconds*

| Name  | Type    | Description                         |
| ----- | ------- | ----------------------------------- |
| index | uint256 | The index of timepoint in the array |

**Returns:**

| Name                                                                                                                     | Type    | Description                                                                |
| ------------------------------------------------------------------------------------------------------------------------ | ------- | -------------------------------------------------------------------------- |
| initialized                                                                                                              | bool    | Whether the timepoint has been initialized and the values are safe to use, |
| blockTimestamp The timestamp of the observation,                                                                         |         |                                                                            |
| tickCumulative The tick multiplied by seconds elapsed for the life of the pool as of the timepoint timestamp,            |         |                                                                            |
| secondsPerLiquidityCumulative The seconds per in range liquidity for the life of the pool as of the timepoint timestamp, |         |                                                                            |
| volatilityCumulative Cumulative standard deviation for the life of the pool as of the timepoint timestamp,               |         |                                                                            |
| averageTick Time-weighted average tick,                                                                                  |         |                                                                            |
| volumePerLiquidityCumulative Cumulative swap volume per liquidity for the life of the pool as of the timepoint timestamp |         |                                                                            |
| blockTimestamp                                                                                                           | uint32  |                                                                            |
| tickCumulative                                                                                                           | int56   |                                                                            |
| secondsPerLiquidityCumulative                                                                                            | uint160 |                                                                            |
| volatilityCumulative                                                                                                     | uint88  |                                                                            |
| averageTick                                                                                                              | int24   |                                                                            |
| volumePerLiquidityCumulative                                                                                             | uint144 |                                                                            |

### initialize

`function initialize(uint32 time, int24 tick) external` external

Initialize the dataStorage array by writing the first slot. Called once for the lifecycle of the timepoints array

| Name | Type   | Description                                                                         |
| ---- | ------ | ----------------------------------------------------------------------------------- |
| time | uint32 | The time of the dataStorage initialization, via block.timestamp truncated to uint32 |
| tick | int24  | Initial tick                                                                        |

### getSingleTimepoint

`function getSingleTimepoint(uint32 time, uint32 secondsAgo, int24 tick, uint16 index, uint128 liquidity) external view returns (int56 tickCumulative, uint160 secondsPerLiquidityCumulative, uint112 volatilityCumulative, uint256 volumePerAvgLiquidity)` view external

*Developer note: Reverts if an timepoint at or before the desired timepoint timestamp does not exist. 0 may be passed as \`secondsAgo' to return the current cumulative values. If called with a timestamp falling between two timepoints, returns the counterfactual accumulator values at exactly the timestamp between the two timepoints.*

| Name       | Type    | Description                                                                        |
| ---------- | ------- | ---------------------------------------------------------------------------------- |
| time       | uint32  | The current block timestamp                                                        |
| secondsAgo | uint32  | The amount of time to look back, in seconds, at which point to return an timepoint |
| tick       | int24   | The current tick                                                                   |
| index      | uint16  | The index of the timepoint that was most recently written to the timepoints array  |
| liquidity  | uint128 | The current in-range pool liquidity                                                |

**Returns:**

| Name                          | Type    | Description                                                                                           |
| ----------------------------- | ------- | ----------------------------------------------------------------------------------------------------- |
| tickCumulative                | int56   | The cumulative tick since the pool was first initialized, as of \`secondsAgo\`                        |
| secondsPerLiquidityCumulative | uint160 | The cumulative seconds / max(1, liquidity) since the pool was first initialized, as of \`secondsAgo\` |
| volatilityCumulative          | uint112 | The cumulative volatility value since the pool was first initialized, as of \`secondsAgo\`            |
| volumePerAvgLiquidity         | uint256 | The cumulative volume per liquidity value since the pool was first initialized, as of \`secondsAgo\`  |

### getTimepoints

`function getTimepoints(uint32 time, uint32[] secondsAgos, int24 tick, uint16 index, uint128 liquidity) external view returns (int56[] tickCumulatives, uint160[] secondsPerLiquidityCumulatives, uint112[] volatilityCumulatives, uint256[] volumePerAvgLiquiditys)` view external

Returns the accumulator values as of each time seconds ago from the given time in the array of \`secondsAgos\` *Developer note: Reverts if \`secondsAgos\` > oldest timepoint*

| Name        | Type      | Description                                                                         |
| ----------- | --------- | ----------------------------------------------------------------------------------- |
| time        | uint32    | The current block.timestamp                                                         |
| secondsAgos | uint32\[] | Each amount of time to look back, in seconds, at which point to return an timepoint |
| tick        | int24     | The current tick                                                                    |
| index       | uint16    | The index of the timepoint that was most recently written to the timepoints array   |
| liquidity   | uint128   | The current in-range pool liquidity                                                 |

**Returns:**

| Name                           | Type       | Description                                                                                                |
| ------------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------- |
| tickCumulatives                | int56\[]   | The cumulative tick since the pool was first initialized, as of each \`secondsAgo\`                        |
| secondsPerLiquidityCumulatives | uint160\[] | The cumulative seconds / max(1, liquidity) since the pool was first initialized, as of each \`secondsAgo\` |
| volatilityCumulatives          | uint112\[] | The cumulative volatility values since the pool was first initialized, as of each \`secondsAgo\`           |
| volumePerAvgLiquiditys         | uint256\[] | The cumulative volume per liquidity values since the pool was first initialized, as of each \`secondsAgo\` |

### getAverages

`function getAverages(uint32 time, int24 tick, uint16 index, uint128 liquidity) external view returns (uint112 TWVolatilityAverage, uint256 TWVolumePerLiqAverage)` view external

Returns average volatility in the range from time-WINDOW to time

| Name      | Type    | Description                                                                       |
| --------- | ------- | --------------------------------------------------------------------------------- |
| time      | uint32  | The current block.timestamp                                                       |
| tick      | int24   | The current tick                                                                  |
| index     | uint16  | The index of the timepoint that was most recently written to the timepoints array |
| liquidity | uint128 | The current in-range pool liquidity                                               |

**Returns:**

| Name                  | Type    | Description                                          |
| --------------------- | ------- | ---------------------------------------------------- |
| TWVolatilityAverage   | uint112 | The average volatility in the recent range           |
| TWVolumePerLiqAverage | uint256 | The average volume per liquidity in the recent range |

### write

`function write(uint16 index, uint32 blockTimestamp, int24 tick, uint128 liquidity, uint128 volumePerLiquidity) external returns (uint16 indexUpdated)` external

Writes an dataStorage timepoint to the array *Developer note: Writable at most once per block. Index represents the most recently written element. index must be tracked externally.*

| Name               | Type    | Description                                                                       |
| ------------------ | ------- | --------------------------------------------------------------------------------- |
| index              | uint16  | The index of the timepoint that was most recently written to the timepoints array |
| blockTimestamp     | uint32  | The timestamp of the new timepoint                                                |
| tick               | int24   | The active tick at the time of the new timepoint                                  |
| liquidity          | uint128 | The total in-range liquidity at the time of the new timepoint                     |
| volumePerLiquidity | uint128 | The gmean(volumes)/liquidity at the time of the new timepoint                     |

**Returns:**

| Name         | Type   | Description                                                                 |
| ------------ | ------ | --------------------------------------------------------------------------- |
| indexUpdated | uint16 | The new index of the most recently written element in the dataStorage array |

### changeFeeConfiguration

`function changeFeeConfiguration(bool zto, struct AdaptiveFee.Configuration feeConfig) external` external

Changes fee configuration for the pool

| Name      | Type                             | Description |
| --------- | -------------------------------- | ----------- |
| zto       | bool                             |             |
| feeConfig | struct AdaptiveFee.Configuration |             |

### calculateVolumePerLiquidity

`function calculateVolumePerLiquidity(uint128 liquidity, int256 amount0, int256 amount1) external pure returns (uint128 volumePerLiquidity)` pure external

Calculates gmean(volume/liquidity) for block

| Name      | Type    | Description                         |
| --------- | ------- | ----------------------------------- |
| liquidity | uint128 | The current in-range pool liquidity |
| amount0   | int256  | Total amount of swapped token0      |
| amount1   | int256  | Total amount of swapped token1      |

**Returns:**

| Name               | Type    | Description                                    |
| ------------------ | ------- | ---------------------------------------------- |
| volumePerLiquidity | uint128 | gmean(volume/liquidity) capped by 100000 << 64 |

### window

`function window() external view returns (uint32 windowLength)` view external

**Returns:**

| Name         | Type   | Description                                 |
| ------------ | ------ | ------------------------------------------- |
| windowLength | uint32 | Length of window used to calculate averages |

### getFees

`function getFees(uint32 time, int24 tick, uint16 index, uint128 liquidity) external view returns (uint16 feeZto, uint16 feeOtz)` view external

Calculates fee based on combination of sigmoids

| Name      | Type    | Description                                                                       |
| --------- | ------- | --------------------------------------------------------------------------------- |
| time      | uint32  | The current block.timestamp                                                       |
| tick      | int24   | The current tick                                                                  |
| index     | uint16  | The index of the timepoint that was most recently written to the timepoints array |
| liquidity | uint128 | The current in-range pool liquidity                                               |

**Returns:**

| Name   | Type   | Description                                             |
| ------ | ------ | ------------------------------------------------------- |
| feeZto | uint16 | The fee for ZtO swaps in hundredths of a bip, i.e. 1e-6 |
| feeOtz | uint16 | The fee for OtZ swaps in hundredths of a bip, i.e. 1e-6 |
