infrastructure-upgrade/lib/v3-core/contracts/test/OracleTest.sol

101 lines
3.0 KiB
Solidity
Raw Permalink Normal View History

2023-04-08 18:46:18 +00:00
// SPDX-License-Identifier: UNLICENSED
pragma solidity =0.7.6;
pragma abicoder v2;
import '../libraries/Oracle.sol';
contract OracleTest {
using Oracle for Oracle.Observation[65535];
Oracle.Observation[65535] public observations;
uint32 public time;
int24 public tick;
uint128 public liquidity;
uint16 public index;
uint16 public cardinality;
uint16 public cardinalityNext;
struct InitializeParams {
uint32 time;
int24 tick;
uint128 liquidity;
}
function initialize(InitializeParams calldata params) external {
require(cardinality == 0, 'already initialized');
time = params.time;
tick = params.tick;
liquidity = params.liquidity;
(cardinality, cardinalityNext) = observations.initialize(params.time);
}
function advanceTime(uint32 by) public {
time += by;
}
struct UpdateParams {
uint32 advanceTimeBy;
int24 tick;
uint128 liquidity;
}
// write an observation, then change tick and liquidity
function update(UpdateParams calldata params) external {
advanceTime(params.advanceTimeBy);
(index, cardinality) = observations.write(index, time, tick, liquidity, cardinality, cardinalityNext);
tick = params.tick;
liquidity = params.liquidity;
}
function batchUpdate(UpdateParams[] calldata params) external {
// sload everything
int24 _tick = tick;
uint128 _liquidity = liquidity;
uint16 _index = index;
uint16 _cardinality = cardinality;
uint16 _cardinalityNext = cardinalityNext;
uint32 _time = time;
for (uint256 i = 0; i < params.length; i++) {
_time += params[i].advanceTimeBy;
(_index, _cardinality) = observations.write(
_index,
_time,
_tick,
_liquidity,
_cardinality,
_cardinalityNext
);
_tick = params[i].tick;
_liquidity = params[i].liquidity;
}
// sstore everything
tick = _tick;
liquidity = _liquidity;
index = _index;
cardinality = _cardinality;
time = _time;
}
function grow(uint16 _cardinalityNext) external {
cardinalityNext = observations.grow(cardinalityNext, _cardinalityNext);
}
function observe(uint32[] calldata secondsAgos)
external
view
returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s)
{
return observations.observe(time, secondsAgos, tick, index, liquidity, cardinality);
}
function getGasCostOfObserve(uint32[] calldata secondsAgos) external view returns (uint256) {
(uint32 _time, int24 _tick, uint128 _liquidity, uint16 _index) = (time, tick, liquidity, index);
uint256 gasBefore = gasleft();
observations.observe(_time, secondsAgos, _tick, _index, _liquidity, cardinality);
return gasBefore - gasleft();
}
}