1
0
forked from mico/idle_moloch
idle_moloch/lib/swap-router-contracts/contracts/test/MockObservations.sol

78 lines
2.3 KiB
Solidity

// SPDX-License-Identifier: UNLICENSED
pragma solidity =0.7.6;
import '@uniswap/v3-core/contracts/libraries/Oracle.sol';
contract MockObservations {
using Oracle for Oracle.Observation[65535];
// slot0
int24 private slot0Tick;
uint16 private slot0ObservationCardinality;
uint16 private slot0ObservationIndex;
// observations
Oracle.Observation[65535] public observations;
// block timestamps always monotonic increasing from 0, cumulative ticks are calculated automatically
constructor(
uint32[3] memory blockTimestamps,
int24[3] memory ticks,
bool mockLowObservationCardinality
) {
require(blockTimestamps[0] == 0, '0');
require(blockTimestamps[1] > 0, '1');
require(blockTimestamps[2] > blockTimestamps[1], '2');
int56 tickCumulative = 0;
for (uint256 i = 0; i < blockTimestamps.length; i++) {
if (i != 0) {
int24 tick = ticks[i - 1];
uint32 delta = blockTimestamps[i] - blockTimestamps[i - 1];
tickCumulative += int56(tick) * delta;
}
observations[i] = Oracle.Observation({
blockTimestamp: blockTimestamps[i],
tickCumulative: tickCumulative,
secondsPerLiquidityCumulativeX128: uint160(i),
initialized: true
});
}
slot0Tick = ticks[2];
slot0ObservationCardinality = mockLowObservationCardinality ? 1 : 3;
slot0ObservationIndex = 2;
}
function slot0()
external
view
returns (
uint160,
int24,
uint16,
uint16,
uint16,
uint8,
bool
)
{
return (0, slot0Tick, slot0ObservationIndex, slot0ObservationCardinality, 0, 0, false);
}
function observe(uint32[] calldata secondsAgos)
external
view
returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s)
{
return
observations.observe(
observations[2].blockTimestamp,
secondsAgos,
slot0Tick,
slot0ObservationIndex,
0,
slot0ObservationCardinality
);
}
}