Contract 0x7baadbcf1428fb217dec3e5e917c126a5258d4dc

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x180f763e3bc11ff16d77dbac8976f53e8dd8783860fdd91f94761361963fb95dSet Prices With ...(pending)2023-12-06 11:39:049 secs ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN 0x7baadbcf1428fb217dec3e5e917c126a5258d4dc0 GLMR(Pending)
0x76efec1654c44aaf37e0588974813c693c3122597d06424a679306c1eb9dcf5fSet Prices With ...50223062023-12-06 11:38:3637 secs ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.110825833215
0x44bf682c53acf7ea7194819f8a1d1ae7ca9f619bec682c268750e7ae13de91a4Set Prices With ...50223032023-12-06 11:38:001 min ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.110995847509
0x442d9f31130c8ce58e3fecd40aa5a9596705c6645e4b0edd4c7ac0743c1612efSet Prices With ...50223002023-12-06 11:37:241 min ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.110817476141
0xe5aab47e444f73d69e220da4f85e62a871f5fadb22f95e469264580a2885f052Set Prices With ...50222972023-12-06 11:36:482 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.110483622883
0x4552bea3c7c2152083e759a9850dbb2ea671258a89a4ea3ba40140f07989f48aSet Prices With ...50222962023-12-06 11:36:362 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.110489214683
0x832b4656d38de0505685d55c7c225bda290c03af1b38fe6a610715539b6fbc37Set Prices With ...50222932023-12-06 11:35:483 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.109959159446
0x1005a5319e5b65f8faacaf3c4155d6899dd8c92506f972cdfb8e5a6adeffde46Set Prices With ...50222922023-12-06 11:35:363 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.109876195886
0x3e1e6c6dbf7ed1996c6a9d158213c59480c0a323df791c64f02cc5e1b5078136Set Prices With ...50222872023-12-06 11:34:364 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.109799348291
0x96e9cce999aeb030b2eaa9b62db8e76719ed46b15598e02bfb70871f02019bc0Set Prices With ...50222842023-12-06 11:34:005 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.109879656745
0x589fe764102bad09d7effd387947b820f6388986cc7aad3e2fc4f90e0f774b74Set Prices With ...50222812023-12-06 11:33:245 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.110036151152
0xbfd9325d833992f0b66bd97567ffbd72664b64c78f6bdd91fe7c8afefd03861dSet Prices With ...50222782023-12-06 11:32:486 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.110002916052
0x7855f0898351c31013f5b96f8ff131c620e04ad6c63a4751f9a4c2f031a3f2a4Set Prices With ...50222762023-12-06 11:32:246 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0xe85a8c400b87ceeeca6ece85b951e5c8fb25fb25508805681132d0a3a4a3562bSet Prices With ...50222732023-12-06 11:31:427 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0x6d85f7f64ebca96e14ae7999e289838f53bc60602029a63ce8e13df2d5f2e751Set Prices With ...50222702023-12-06 11:31:068 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1096909
0x365ed4351650082f0217ff7f4afbf0661ec2bbc0f79377f5017d7d9febf075aaSet Prices With ...50222682023-12-06 11:30:428 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0x889267be5aa1917922eff131da8d8583e571e78cc7981c8ec4e4009b8cf1ea9eSet Prices With ...50222652023-12-06 11:30:069 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.109882307149
0x1db0c627a4f3b5d79be46961d8fda7533f2d734dd34be6090dd62a1d5c67a75aSet Prices With ...50222622023-12-06 11:29:309 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0x5353469a56ebc49c62a16686ec7f5e11ca3a2f4b12a15446a5307e5f370d6b60Set Prices With ...50222602023-12-06 11:29:0610 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0x502ff5e05aef0bbede090a525f0f81ff38cbc4f13529d1f1ad5aa75a9417deacSet Prices With ...50222572023-12-06 11:28:3010 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0x6dca504648cdba917c2855ad803d91191d96c2323df9b4a8b40acc67bb2c0ad2Set Prices With ...50222542023-12-06 11:27:5411 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1099461
0x8b53a1e1e1d1519b478ea0ee2bd112a0ccbbd4066f6b19f1dc8bc62f8be8a9eaSet Prices With ...50222512023-12-06 11:27:1811 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0xdda77c410d9ca0e04fbcab083bd2937d44ef622bc26e4b821d709e912dda0d72Set Prices With ...50222492023-12-06 11:26:5412 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1099461
0x3b6b8962be5ca530839bacdcee3561a7911b0f9a5f5127cbd8a9f56ebad0f57dSet Prices With ...50222462023-12-06 11:26:1812 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.1098823
0xcbfbe2e55cf84ace1ff299883f354da0d71c5f466aefe98520b182c2f6f83c45Set Prices With ...50222432023-12-06 11:25:4213 mins ago0x7206ee7beb0489c688914ccef39f1aa7fa9a988f IN  Beamswap: Fast Price Feed V10 GLMR0.10985904341
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FastPriceFeed

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion
File 1 of 8 : FastPriceFeed.sol
// SPDX-License-Identifier: MIT

import "../libraries/math/SafeMath.sol";

import "./interfaces/ISecondaryPriceFeed.sol";
import "./interfaces/IFastPriceFeed.sol";
import "./interfaces/IFastPriceEvents.sol";
import "../core/interfaces/IVaultPriceFeed.sol";
import "../core/interfaces/IPositionRouter.sol";
import "../access/Governable.sol";

pragma solidity 0.6.12;

contract FastPriceFeed is ISecondaryPriceFeed, IFastPriceFeed, Governable {
    using SafeMath for uint256;

    // fit data in a uint256 slot to save gas costs
    struct PriceDataItem {
        uint160 refPrice; // Chainlink price
        uint32 refTime; // last updated at time
        uint32 cumulativeRefDelta; // cumulative Chainlink price delta
        uint32 cumulativeFastDelta; // cumulative fast price delta
    }

    uint256 public constant PRICE_PRECISION = 10 ** 30;

    uint256 public constant CUMULATIVE_DELTA_PRECISION = 10 * 1000 * 1000;

    uint256 public constant MAX_REF_PRICE = type(uint160).max;
    uint256 public constant MAX_CUMULATIVE_REF_DELTA = type(uint32).max;
    uint256 public constant MAX_CUMULATIVE_FAST_DELTA = type(uint32).max;

    // uint256(~0) is 256 bits of 1s
    // shift the 1s by (256 - 32) to get (256 - 32) 0s followed by 32 1s
    uint256 constant public BITMASK_32 = uint256(~0) >> (256 - 32);

    uint256 public constant BASIS_POINTS_DIVISOR = 10000;

    uint256 public constant MAX_PRICE_DURATION = 30 minutes;

    bool public isInitialized;
    bool public isSpreadEnabled = false;

    address public vaultPriceFeed;
    address public fastPriceEvents;

    address public tokenManager;

    address public positionRouter;

    uint256 public override lastUpdatedAt;
    uint256 public override lastUpdatedBlock;

    uint256 public priceDuration;
    uint256 public maxPriceUpdateDelay;
    uint256 public spreadBasisPointsIfInactive;
    uint256 public spreadBasisPointsIfChainError;
    uint256 public minBlockInterval;
    uint256 public maxTimeDeviation;

    uint256 public priceDataInterval;

    // allowed deviation from primary price
    uint256 public maxDeviationBasisPoints;

    uint256 public minAuthorizations;
    uint256 public disableFastPriceVoteCount = 0;

    mapping (address => bool) public isUpdater;

    mapping (address => uint256) public prices;
    mapping (address => PriceDataItem) public priceData;
    mapping (address => uint256) public maxCumulativeDeltaDiffs;

    mapping (address => bool) public isSigner;
    mapping (address => bool) public disableFastPriceVotes;

    // array of tokens used in setCompactedPrices, saves L1 calldata gas costs
    address[] public tokens;
    // array of tokenPrecisions used in setCompactedPrices, saves L1 calldata gas costs
    // if the token price will be sent with 3 decimals, then tokenPrecision for that token
    // should be 10 ** 3
    uint256[] public tokenPrecisions;

    event DisableFastPrice(address signer);
    event EnableFastPrice(address signer);
    event PriceData(address token, uint256 refPrice, uint256 fastPrice, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta);
    event MaxCumulativeDeltaDiffExceeded(address token, uint256 refPrice, uint256 fastPrice, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta);

    modifier onlySigner() {
        require(isSigner[msg.sender], "FastPriceFeed: forbidden");
        _;
    }

    modifier onlyUpdater() {
        require(isUpdater[msg.sender], "FastPriceFeed: forbidden");
        _;
    }

    modifier onlyTokenManager() {
        require(msg.sender == tokenManager, "FastPriceFeed: forbidden");
        _;
    }

    constructor(
      uint256 _priceDuration,
      uint256 _maxPriceUpdateDelay,
      uint256 _minBlockInterval,
      uint256 _maxDeviationBasisPoints,
      address _fastPriceEvents,
      address _tokenManager,
      address _positionRouter
    ) public {
        require(_priceDuration <= MAX_PRICE_DURATION, "FastPriceFeed: invalid _priceDuration");
        priceDuration = _priceDuration;
        maxPriceUpdateDelay = _maxPriceUpdateDelay;
        minBlockInterval = _minBlockInterval;
        maxDeviationBasisPoints = _maxDeviationBasisPoints;
        fastPriceEvents = _fastPriceEvents;
        tokenManager = _tokenManager;
        positionRouter = _positionRouter;
    }

    function initialize(uint256 _minAuthorizations, address[] memory _signers, address[] memory _updaters) public onlyGov {
        require(!isInitialized, "FastPriceFeed: already initialized");
        isInitialized = true;

        minAuthorizations = _minAuthorizations;

        for (uint256 i = 0; i < _signers.length; i++) {
            address signer = _signers[i];
            isSigner[signer] = true;
        }

        for (uint256 i = 0; i < _updaters.length; i++) {
            address updater = _updaters[i];
            isUpdater[updater] = true;
        }
    }

    function setSigner(address _account, bool _isActive) external override onlyGov {
        isSigner[_account] = _isActive;
    }

    function setUpdater(address _account, bool _isActive) external override onlyGov {
        isUpdater[_account] = _isActive;
    }

    function setFastPriceEvents(address _fastPriceEvents) external onlyGov {
      fastPriceEvents = _fastPriceEvents;
    }

    function setVaultPriceFeed(address _vaultPriceFeed) external override onlyGov {
      vaultPriceFeed = _vaultPriceFeed;
    }

    function setMaxTimeDeviation(uint256 _maxTimeDeviation) external onlyGov {
        maxTimeDeviation = _maxTimeDeviation;
    }

    function setPriceDuration(uint256 _priceDuration) external override onlyGov {
        require(_priceDuration <= MAX_PRICE_DURATION, "FastPriceFeed: invalid _priceDuration");
        priceDuration = _priceDuration;
    }

    function setMaxPriceUpdateDelay(uint256 _maxPriceUpdateDelay) external override onlyGov {
        maxPriceUpdateDelay = _maxPriceUpdateDelay;
    }

    function setSpreadBasisPointsIfInactive(uint256 _spreadBasisPointsIfInactive) external override onlyGov {
        spreadBasisPointsIfInactive = _spreadBasisPointsIfInactive;
    }

    function setSpreadBasisPointsIfChainError(uint256 _spreadBasisPointsIfChainError) external override onlyGov {
        spreadBasisPointsIfChainError = _spreadBasisPointsIfChainError;
    }

    function setMinBlockInterval(uint256 _minBlockInterval) external override onlyGov {
        minBlockInterval = _minBlockInterval;
    }

    function setIsSpreadEnabled(bool _isSpreadEnabled) external override onlyGov {
        isSpreadEnabled = _isSpreadEnabled;
    }

    function setLastUpdatedAt(uint256 _lastUpdatedAt) external onlyGov {
        lastUpdatedAt = _lastUpdatedAt;
    }

    function setTokenManager(address _tokenManager) external onlyTokenManager {
        tokenManager = _tokenManager;
    }

    function setMaxDeviationBasisPoints(uint256 _maxDeviationBasisPoints) external override onlyTokenManager {
        maxDeviationBasisPoints = _maxDeviationBasisPoints;
    }

    function setMaxCumulativeDeltaDiffs(address[] memory _tokens,  uint256[] memory _maxCumulativeDeltaDiffs) external override onlyTokenManager {
        for (uint256 i = 0; i < _tokens.length; i++) {
            address token = _tokens[i];
            maxCumulativeDeltaDiffs[token] = _maxCumulativeDeltaDiffs[i];
        }
    }

    function setPriceDataInterval(uint256 _priceDataInterval) external override onlyTokenManager {
        priceDataInterval = _priceDataInterval;
    }

    function setMinAuthorizations(uint256 _minAuthorizations) external onlyTokenManager {
        minAuthorizations = _minAuthorizations;
    }

    function setTokens(address[] memory _tokens, uint256[] memory _tokenPrecisions) external onlyGov {
        require(_tokens.length == _tokenPrecisions.length, "FastPriceFeed: invalid lengths");
        tokens = _tokens;
        tokenPrecisions = _tokenPrecisions;
    }

    function setPrices(address[] memory _tokens, uint256[] memory _prices, uint256 _timestamp) external onlyUpdater {
        bool shouldUpdate = _setLastUpdatedValues(_timestamp);

        if (shouldUpdate) {
            address _fastPriceEvents = fastPriceEvents;
            address _vaultPriceFeed = vaultPriceFeed;

            for (uint256 i = 0; i < _tokens.length; i++) {
                address token = _tokens[i];
                _setPrice(token, _prices[i], _vaultPriceFeed, _fastPriceEvents);
            }
        }
    }

    function setCompactedPrices(uint256[] memory _priceBitArray, uint256 _timestamp) external onlyUpdater {
        bool shouldUpdate = _setLastUpdatedValues(_timestamp);

        if (shouldUpdate) {
            address _fastPriceEvents = fastPriceEvents;
            address _vaultPriceFeed = vaultPriceFeed;

            for (uint256 i = 0; i < _priceBitArray.length; i++) {
                uint256 priceBits = _priceBitArray[i];

                for (uint256 j = 0; j < 8; j++) {
                    uint256 index = i * 8 + j;
                    if (index >= tokens.length) { return; }

                    uint256 startBit = 32 * j;
                    uint256 price = (priceBits >> startBit) & BITMASK_32;

                    address token = tokens[i * 8 + j];
                    uint256 tokenPrecision = tokenPrecisions[i * 8 + j];
                    uint256 adjustedPrice = price.mul(PRICE_PRECISION).div(tokenPrecision);

                    _setPrice(token, adjustedPrice, _vaultPriceFeed, _fastPriceEvents);
                }
            }
        }
    }

    function setPricesWithBits(uint256 _priceBits, uint256 _timestamp) external onlyUpdater {
        _setPricesWithBits(_priceBits, _timestamp);
    }

    function setPricesWithBitsAndExecute(
        uint256 _priceBits,
        uint256 _timestamp,
        uint256 _endIndexForIncreasePositions,
        uint256 _endIndexForDecreasePositions,
        uint256 _maxIncreasePositions,
        uint256 _maxDecreasePositions
    ) external onlyUpdater {
        _setPricesWithBits(_priceBits, _timestamp);

        IPositionRouter _positionRouter = IPositionRouter(positionRouter);
        uint256 maxEndIndexForIncrease = _positionRouter.increasePositionRequestKeysStart().add(_maxIncreasePositions);
        uint256 maxEndIndexForDecrease = _positionRouter.decreasePositionRequestKeysStart().add(_maxDecreasePositions);

        if (_endIndexForIncreasePositions > maxEndIndexForIncrease) {
            _endIndexForIncreasePositions = maxEndIndexForIncrease;
        }

        if (_endIndexForDecreasePositions > maxEndIndexForDecrease) {
            _endIndexForDecreasePositions = maxEndIndexForDecrease;
        }

        _positionRouter.executeIncreasePositions(_endIndexForIncreasePositions, payable(msg.sender));
        _positionRouter.executeDecreasePositions(_endIndexForDecreasePositions, payable(msg.sender));
    }

    function disableFastPrice() external onlySigner {
        require(!disableFastPriceVotes[msg.sender], "FastPriceFeed: already voted");
        disableFastPriceVotes[msg.sender] = true;
        disableFastPriceVoteCount = disableFastPriceVoteCount.add(1);

        emit DisableFastPrice(msg.sender);
    }

    function enableFastPrice() external onlySigner {
        require(disableFastPriceVotes[msg.sender], "FastPriceFeed: already enabled");
        disableFastPriceVotes[msg.sender] = false;
        disableFastPriceVoteCount = disableFastPriceVoteCount.sub(1);

        emit EnableFastPrice(msg.sender);
    }

    // under regular operation, the fastPrice (prices[token]) is returned and there is no spread returned from this function,
    // though VaultPriceFeed might apply its own spread
    //
    // if the fastPrice has not been updated within priceDuration then it is ignored and only _refPrice with a spread is used (spread: spreadBasisPointsIfInactive)
    // in case the fastPrice has not been updated for maxPriceUpdateDelay then the _refPrice with a larger spread is used (spread: spreadBasisPointsIfChainError)
    //
    // there will be a spread from the _refPrice to the fastPrice in the following cases:
    // - in case isSpreadEnabled is set to true
    // - in case the maxDeviationBasisPoints between _refPrice and fastPrice is exceeded
    // - in case watchers flag an issue
    // - in case the cumulativeFastDelta exceeds the cumulativeRefDelta by the maxCumulativeDeltaDiff
    function getPrice(address _token, uint256 _refPrice, bool _maximise) external override view returns (uint256) {
        if (block.timestamp > lastUpdatedAt.add(maxPriceUpdateDelay)) {
            if (_maximise) {
                return _refPrice.mul(BASIS_POINTS_DIVISOR.add(spreadBasisPointsIfChainError)).div(BASIS_POINTS_DIVISOR);
            }

            return _refPrice.mul(BASIS_POINTS_DIVISOR.sub(spreadBasisPointsIfChainError)).div(BASIS_POINTS_DIVISOR);
        }

        if (block.timestamp > lastUpdatedAt.add(priceDuration)) {
            if (_maximise) {
                return _refPrice.mul(BASIS_POINTS_DIVISOR.add(spreadBasisPointsIfInactive)).div(BASIS_POINTS_DIVISOR);
            }

            return _refPrice.mul(BASIS_POINTS_DIVISOR.sub(spreadBasisPointsIfInactive)).div(BASIS_POINTS_DIVISOR);
        }

        uint256 fastPrice = prices[_token];
        if (fastPrice == 0) { return _refPrice; }

        uint256 diffBasisPoints = _refPrice > fastPrice ? _refPrice.sub(fastPrice) : fastPrice.sub(_refPrice);
        diffBasisPoints = diffBasisPoints.mul(BASIS_POINTS_DIVISOR).div(_refPrice);

        // create a spread between the _refPrice and the fastPrice if the maxDeviationBasisPoints is exceeded
        // or if watchers have flagged an issue with the fast price
        bool hasSpread = !favorFastPrice(_token) || diffBasisPoints > maxDeviationBasisPoints;

        if (hasSpread) {
            // return the higher of the two prices
            if (_maximise) {
                return _refPrice > fastPrice ? _refPrice : fastPrice;
            }

            // return the lower of the two prices
            return _refPrice < fastPrice ? _refPrice : fastPrice;
        }

        return fastPrice;
    }

    function favorFastPrice(address _token) public view returns (bool) {
        if (isSpreadEnabled) {
            return false;
        }

        if (disableFastPriceVoteCount >= minAuthorizations) {
            // force a spread if watchers have flagged an issue with the fast price
            return false;
        }

        (/* uint256 prevRefPrice */, /* uint256 refTime */, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta) = getPriceData(_token);
        if (cumulativeFastDelta > cumulativeRefDelta && cumulativeFastDelta.sub(cumulativeRefDelta) > maxCumulativeDeltaDiffs[_token]) {
            // force a spread if the cumulative delta for the fast price feed exceeds the cumulative delta
            // for the Chainlink price feed by the maxCumulativeDeltaDiff allowed
            return false;
        }

        return true;
    }

    function getPriceData(address _token) public view returns (uint256, uint256, uint256, uint256) {
        PriceDataItem memory data = priceData[_token];
        return (uint256(data.refPrice), uint256(data.refTime), uint256(data.cumulativeRefDelta), uint256(data.cumulativeFastDelta));
    }

    function _setPricesWithBits(uint256 _priceBits, uint256 _timestamp) private {
        bool shouldUpdate = _setLastUpdatedValues(_timestamp);

        if (shouldUpdate) {
            address _fastPriceEvents = fastPriceEvents;
            address _vaultPriceFeed = vaultPriceFeed;

            for (uint256 j = 0; j < 8; j++) {
                uint256 index = j;
                if (index >= tokens.length) { return; }

                uint256 startBit = 32 * j;
                uint256 price = (_priceBits >> startBit) & BITMASK_32;

                address token = tokens[j];
                uint256 tokenPrecision = tokenPrecisions[j];
                uint256 adjustedPrice = price.mul(PRICE_PRECISION).div(tokenPrecision);

                _setPrice(token, adjustedPrice, _vaultPriceFeed, _fastPriceEvents);
            }
        }
    }

    function _setPrice(address _token, uint256 _price, address _vaultPriceFeed, address _fastPriceEvents) private {
        if (_vaultPriceFeed != address(0)) {
            uint256 refPrice = IVaultPriceFeed(_vaultPriceFeed).getLatestPrimaryPrice(_token);
            uint256 fastPrice = prices[_token];

            (uint256 prevRefPrice, uint256 refTime, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta) = getPriceData(_token);

            if (prevRefPrice > 0) {
                uint256 refDeltaAmount = refPrice > prevRefPrice ? refPrice.sub(prevRefPrice) : prevRefPrice.sub(refPrice);
                uint256 fastDeltaAmount = fastPrice > _price ? fastPrice.sub(_price) : _price.sub(fastPrice);

                // reset cumulative delta values if it is a new time window
                if (refTime.div(priceDataInterval) != block.timestamp.div(priceDataInterval)) {
                    cumulativeRefDelta = 0;
                    cumulativeFastDelta = 0;
                }

                cumulativeRefDelta = cumulativeRefDelta.add(refDeltaAmount.mul(CUMULATIVE_DELTA_PRECISION).div(prevRefPrice));
                cumulativeFastDelta = cumulativeFastDelta.add(fastDeltaAmount.mul(CUMULATIVE_DELTA_PRECISION).div(fastPrice));
            }

            if (cumulativeFastDelta > cumulativeRefDelta && cumulativeFastDelta.sub(cumulativeRefDelta) > maxCumulativeDeltaDiffs[_token]) {
                emit MaxCumulativeDeltaDiffExceeded(_token, refPrice, fastPrice, cumulativeRefDelta, cumulativeFastDelta);
            }

            _setPriceData(_token, refPrice, cumulativeRefDelta, cumulativeFastDelta);
            emit PriceData(_token, refPrice, fastPrice, cumulativeRefDelta, cumulativeFastDelta);
        }

        prices[_token] = _price;
        _emitPriceEvent(_fastPriceEvents, _token, _price);
    }

    function _setPriceData(address _token, uint256 _refPrice, uint256 _cumulativeRefDelta, uint256 _cumulativeFastDelta) private {
        require(_refPrice < MAX_REF_PRICE, "FastPriceFeed: invalid refPrice");
        // skip validation of block.timestamp, it should only be out of range after the year 2100
        require(_cumulativeRefDelta < MAX_CUMULATIVE_REF_DELTA, "FastPriceFeed: invalid cumulativeRefDelta");
        require(_cumulativeFastDelta < MAX_CUMULATIVE_FAST_DELTA, "FastPriceFeed: invalid cumulativeFastDelta");

        priceData[_token] = PriceDataItem(
            uint160(_refPrice),
            uint32(block.timestamp),
            uint32(_cumulativeRefDelta),
            uint32(_cumulativeFastDelta)
        );
    }

    function _emitPriceEvent(address _fastPriceEvents, address _token, uint256 _price) private {
        if (_fastPriceEvents == address(0)) {
            return;
        }

        IFastPriceEvents(_fastPriceEvents).emitPriceEvent(_token, _price);
    }

    function _setLastUpdatedValues(uint256 _timestamp) private returns (bool) {
        if (minBlockInterval > 0) {
            require(block.number.sub(lastUpdatedBlock) >= minBlockInterval, "FastPriceFeed: minBlockInterval not yet passed");
        }

        uint256 _maxTimeDeviation = maxTimeDeviation;
        require(_timestamp > block.timestamp.sub(_maxTimeDeviation), "FastPriceFeed: _timestamp below allowed range");
        require(_timestamp < block.timestamp.add(_maxTimeDeviation), "FastPriceFeed: _timestamp exceeds allowed range");

        // do not update prices if _timestamp is before the current lastUpdatedAt value
        if (_timestamp < lastUpdatedAt) {
            return false;
        }

        lastUpdatedAt = _timestamp;
        lastUpdatedBlock = block.number;

        return true;
    }
}

File 2 of 8 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 3 of 8 : ISecondaryPriceFeed.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface ISecondaryPriceFeed {
    function getPrice(address _token, uint256 _referencePrice, bool _maximise) external view returns (uint256);
}

File 4 of 8 : Governable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

contract Governable {
    address public gov;

    constructor() public {
        gov = msg.sender;
    }

    modifier onlyGov() {
        require(msg.sender == gov, "Governable: forbidden");
        _;
    }

    function setGov(address _gov) external onlyGov {
        gov = _gov;
    }
}

File 5 of 8 : IVaultPriceFeed.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IVaultPriceFeed {
    function adjustmentBasisPoints(address _token) external view returns (uint256);
    function isAdjustmentAdditive(address _token) external view returns (bool);
    function setAdjustment(address _token, bool _isAdditive, uint256 _adjustmentBps) external;
    function setUseV2Pricing(bool _useV2Pricing) external;
    function setIsAmmEnabled(bool _isEnabled) external;
    function setIsSecondaryPriceEnabled(bool _isEnabled) external;
    function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints) external;
    function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints) external;
    function setFavorPrimaryPrice(bool _favorPrimaryPrice) external;
    function setPriceSampleSpace(uint256 _priceSampleSpace) external;
    function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation) external;
    function getPrice(address _token, bool _maximise, bool _includeAmmPrice, bool _useSwapPricing) external view returns (uint256);
    function getAmmPrice(address _token) external view returns (uint256);
    function getLatestPrimaryPrice(address _token) external view returns (uint256);
    function getPrimaryPrice(address _token, bool _maximise) external view returns (uint256);
    function setTokenConfig(
        address _token,
        address _priceFeed,
        uint256 _priceDecimals,
        bool _isStrictStable
    ) external;
}

File 6 of 8 : IFastPriceEvents.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IFastPriceEvents {
    function emitPriceEvent(address _token, uint256 _price) external;
}

File 7 of 8 : IFastPriceFeed.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IFastPriceFeed {
    function lastUpdatedAt() external view returns (uint256);
    function lastUpdatedBlock() external view returns (uint256);
    function setSigner(address _account, bool _isActive) external;
    function setUpdater(address _account, bool _isActive) external;
    function setPriceDuration(uint256 _priceDuration) external;
    function setMaxPriceUpdateDelay(uint256 _maxPriceUpdateDelay) external;
    function setSpreadBasisPointsIfInactive(uint256 _spreadBasisPointsIfInactive) external;
    function setSpreadBasisPointsIfChainError(uint256 _spreadBasisPointsIfChainError) external;
    function setMinBlockInterval(uint256 _minBlockInterval) external;
    function setIsSpreadEnabled(bool _isSpreadEnabled) external;
    function setMaxDeviationBasisPoints(uint256 _maxDeviationBasisPoints) external;
    function setMaxCumulativeDeltaDiffs(address[] memory _tokens,  uint256[] memory _maxCumulativeDeltaDiffs) external;
    function setPriceDataInterval(uint256 _priceDataInterval) external;
    function setVaultPriceFeed(address _vaultPriceFeed) external;
}

File 8 of 8 : IPositionRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IPositionRouter {
    function increasePositionRequestKeysStart() external returns (uint256);
    function decreasePositionRequestKeysStart() external returns (uint256);
    function executeIncreasePositions(uint256 _count, address payable _executionFeeReceiver) external;
    function executeDecreasePositions(uint256 _count, address payable _executionFeeReceiver) external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_priceDuration","type":"uint256"},{"internalType":"uint256","name":"_maxPriceUpdateDelay","type":"uint256"},{"internalType":"uint256","name":"_minBlockInterval","type":"uint256"},{"internalType":"uint256","name":"_maxDeviationBasisPoints","type":"uint256"},{"internalType":"address","name":"_fastPriceEvents","type":"address"},{"internalType":"address","name":"_tokenManager","type":"address"},{"internalType":"address","name":"_positionRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"DisableFastPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"EnableFastPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"refPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fastPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeRefDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeFastDelta","type":"uint256"}],"name":"MaxCumulativeDeltaDiffExceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"refPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fastPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeRefDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeFastDelta","type":"uint256"}],"name":"PriceData","type":"event"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BITMASK_32","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CUMULATIVE_DELTA_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CUMULATIVE_FAST_DELTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CUMULATIVE_REF_DELTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRICE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REF_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableFastPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableFastPriceVoteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"disableFastPriceVotes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableFastPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fastPriceEvents","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"favorFastPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_refPrice","type":"uint256"},{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getPriceData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAuthorizations","type":"uint256"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"address[]","name":"_updaters","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSpreadEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUpdater","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdatedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxCumulativeDeltaDiffs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDeviationBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriceUpdateDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTimeDeviation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAuthorizations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBlockInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceData","outputs":[{"internalType":"uint160","name":"refPrice","type":"uint160"},{"internalType":"uint32","name":"refTime","type":"uint32"},{"internalType":"uint32","name":"cumulativeRefDelta","type":"uint32"},{"internalType":"uint32","name":"cumulativeFastDelta","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceDataInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_priceBitArray","type":"uint256[]"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setCompactedPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fastPriceEvents","type":"address"}],"name":"setFastPriceEvents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSpreadEnabled","type":"bool"}],"name":"setIsSpreadEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastUpdatedAt","type":"uint256"}],"name":"setLastUpdatedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_maxCumulativeDeltaDiffs","type":"uint256[]"}],"name":"setMaxCumulativeDeltaDiffs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDeviationBasisPoints","type":"uint256"}],"name":"setMaxDeviationBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPriceUpdateDelay","type":"uint256"}],"name":"setMaxPriceUpdateDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTimeDeviation","type":"uint256"}],"name":"setMaxTimeDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAuthorizations","type":"uint256"}],"name":"setMinAuthorizations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBlockInterval","type":"uint256"}],"name":"setMinBlockInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceDataInterval","type":"uint256"}],"name":"setPriceDataInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceDuration","type":"uint256"}],"name":"setPriceDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceBits","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPricesWithBits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceBits","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_endIndexForIncreasePositions","type":"uint256"},{"internalType":"uint256","name":"_endIndexForDecreasePositions","type":"uint256"},{"internalType":"uint256","name":"_maxIncreasePositions","type":"uint256"},{"internalType":"uint256","name":"_maxDecreasePositions","type":"uint256"}],"name":"setPricesWithBitsAndExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_spreadBasisPointsIfChainError","type":"uint256"}],"name":"setSpreadBasisPointsIfChainError","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_spreadBasisPointsIfInactive","type":"uint256"}],"name":"setSpreadBasisPointsIfInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenManager","type":"address"}],"name":"setTokenManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_tokenPrecisions","type":"uint256[]"}],"name":"setTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setUpdater","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultPriceFeed","type":"address"}],"name":"setVaultPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spreadBasisPointsIfChainError","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spreadBasisPointsIfInactive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenPrecisions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526000805460ff60a81b1916815560105534801561002057600080fd5b5060405162002f2c38038062002f2c833981810160405260e081101561004557600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151600080546001600160a01b0319163317905594959394929391929091906107088711156100c65760405162461bcd60e51b815260040180806020018281038252602581526020018062002f076025913960400191505060405180910390fd5b600796909655600894909455600b92909255600e55600280546001600160a01b039283166001600160a01b031991821617909155600380549383169382169390931790925560048054919093169116179055612ddf80620001286000396000f3fe608060405234801561001057600080fd5b50600436106102e05760003560e01c806303b04936146102e557806303cd25711461031f57806303f4d7dc146103395780630604ddea146103de5780630e9272ea146103e6578063126082cf1461040a57806312d43a511461041257806314dd2dce1461041a578063162ac4e01461043757806317835d1c1461045d5780631a15339114610480578063238aafb7146104ae578063287800c9146104d45780632a709b14146104dc5780632e9cd94b146104e457806331cb610514610501578063392e53cd1461052f5780633aa08f861461053757806344c231931461053f5780634bd66c1c146103de5780634c0e31c81461055c5780634d11fb4a1461067f5780634f64b2be1461069c5780634fdfb086146106b957806354aea127146106df578063574ec1be146106e757806361ef161f14610722578063668d3d651461072a578063695d4184146107325780636c56fd051461073a5780636ccd47c414610760578063715c75361461076857806372279ba11461077057806374bfed89146107bc578063776d16c1146107c4578063782661bc146107e15780637cb2b79c146109065780637df73e271461092c5780637fbc79c6146109525780637fece36814610a7c578063807c9782146103de57806382553aad14610ab05780638b7677f414610acd57806395082d2514610aea578063a2b47c1614610af2578063a374242514610afa578063a6eca89614610b20578063b0a2566614610b28578063b3606b5614610b30578063b70c7b7014610b38578063c8390a4814610b55578063c84a912414610c78578063cab44b7614610c80578063ce98dfa814610cde578063cfad57a214610cfd578063cfed246b14610d23578063d6a153f114610d49578063d925351a14610d66578063de0d1b9414610d83578063dfb481c914610da0578063e64559ad14610da8578063e68a22c014610db0578063eeaa783a14610db8578063f90ce5ba14610dc0575b600080fd5b61030b600480360360208110156102fb57600080fd5b50356001600160a01b0316610dc8565b604080519115158252519081900360200190f35b610327610ddd565b60408051918252519081900360200190f35b6103dc6004803603604081101561034f57600080fd5b810190602081018135600160201b81111561036957600080fd5b82018360208201111561037b57600080fd5b803590602001918460208302840111600160201b8311171561039c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610de3915050565b005b610327610f5a565b6103ee610f62565b604080516001600160a01b039092168252519081900360200190f35b610327610f71565b6103ee610f77565b6103dc6004803603602081101561043057600080fd5b5035610f86565b6103dc6004803603602081101561044d57600080fd5b50356001600160a01b0316610fd8565b6103dc6004803603604081101561047357600080fd5b5080359060200135611047565b6103dc6004803603604081101561049657600080fd5b506001600160a01b03813516906020013515156110a3565b6103dc600480360360208110156104c457600080fd5b50356001600160a01b031661111b565b61032761118a565b6103ee611190565b6103dc600480360360208110156104fa57600080fd5b503561119f565b6103dc6004803603604081101561051757600080fd5b506001600160a01b03813516906020013515156111f1565b61030b611269565b610327611279565b6103dc6004803603602081101561055557600080fd5b503561127f565b6103dc6004803603604081101561057257600080fd5b810190602081018135600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460208302840111600160201b831117156105bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060e57600080fd5b82018360208201111561062057600080fd5b803590602001918460208302840111600160201b8311171561064157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611312945050505050565b6103276004803603602081101561069557600080fd5b50356113bd565b6103ee600480360360208110156106b257600080fd5b50356113db565b61030b600480360360208110156106cf57600080fd5b50356001600160a01b0316611402565b610327611417565b6103dc600480360360c08110156106fd57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561141d565b6103ee61162c565b61032761163b565b61030b611641565b61030b6004803603602081101561075057600080fd5b50356001600160a01b0316611651565b6103dc6116dc565b6103276117ef565b6107966004803603602081101561078657600080fd5b50356001600160a01b03166117f5565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610327611873565b6103dc600480360360208110156107da57600080fd5b5035611879565b6103dc600480360360608110156107f757600080fd5b810190602081018135600160201b81111561081157600080fd5b82018360208201111561082357600080fd5b803590602001918460208302840111600160201b8311171561084457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561089357600080fd5b8201836020820111156108a557600080fd5b803590602001918460208302840111600160201b831117156108c657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506118cb915050565b6103dc6004803603602081101561091c57600080fd5b50356001600160a01b0316611999565b61030b6004803603602081101561094257600080fd5b50356001600160a01b0316611a08565b6103dc6004803603606081101561096857600080fd5b81359190810190604081016020820135600160201b81111561098957600080fd5b82018360208201111561099b57600080fd5b803590602001918460208302840111600160201b831117156109bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0b57600080fd5b820183602082011115610a1d57600080fd5b803590602001918460208302840111600160201b83111715610a3e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a1d945050505050565b61032760048036036060811015610a9257600080fd5b506001600160a01b0381351690602081013590604001351515611b76565b6103dc60048036036020811015610ac657600080fd5b5035611cfc565b6103dc60048036036020811015610ae357600080fd5b5035611d4e565b610327611da0565b610327611db0565b61032760048036036020811015610b1057600080fd5b50356001600160a01b0316611db7565b610327611dc9565b610327611dcf565b610327611dd5565b6103dc60048036036020811015610b4e57600080fd5b5035611ddb565b6103dc60048036036040811015610b6b57600080fd5b810190602081018135600160201b811115610b8557600080fd5b820183602082011115610b9757600080fd5b803590602001918460208302840111600160201b83111715610bb857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c0757600080fd5b820183602082011115610c1957600080fd5b803590602001918460208302840111600160201b83111715610c3a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e2d945050505050565b6103dc611ef7565b610ca660048036036020811015610c9657600080fd5b50356001600160a01b031661200e565b604080516001600160a01b03909516855263ffffffff9384166020860152918316848301529091166060830152519081900360800190f35b6103dc60048036036020811015610cf457600080fd5b5035151561204d565b6103dc60048036036020811015610d1357600080fd5b50356001600160a01b03166120b8565b61032760048036036020811015610d3957600080fd5b50356001600160a01b0316612127565b6103dc60048036036020811015610d5f57600080fd5b5035612139565b6103dc60048036036020811015610d7c57600080fd5b503561218b565b6103dc60048036036020811015610d9957600080fd5b50356121dd565b61032761222f565b610327612235565b61032761223b565b6103ee612246565b610327612255565b60166020526000908152604090205460ff1681565b60075481565b3360009081526011602052604090205460ff16610e35576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b6000610e408261225b565b90508015610f54576002546001546001600160a01b03918216911660005b8551811015610f50576000868281518110610e7557fe5b6020026020010151905060005b6008811015610f4657601754600884028201908110610ea75750505050505050610f56565b60178054602084029185831c63ffffffff169160009190600889028701908110610ecd57fe5b6000918252602082200154601880546001600160a01b0390921693509060088a028801908110610ef957fe5b60009182526020822001549150610f2682610f208668327cb2734119d3b7a9601e1b612367565b906123c9565b9050610f3483828c8e612408565b505060019094019350610e8292505050565b5050600101610e5e565b5050505b505b5050565b63ffffffff81565b6002546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b03163314610fd3576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600555565b6000546001600160a01b03163314611025576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526011602052604090205460ff16611099576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b610f56828261269d565b6000546001600160a01b031633146110f0576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611168576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b6003546001600160a01b031681565b6003546001600160a01b031633146111ec576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600d55565b6000546001600160a01b0316331461123e576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600054600160a01b900460ff1681565b600c5481565b6000546001600160a01b031633146112cc576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b61070881111561130d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c256025913960400191505060405180910390fd5b600755565b6003546001600160a01b0316331461135f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60005b8251811015610f5457600083828151811061137957fe5b6020026020010151905082828151811061138f57fe5b6020908102919091018101516001600160a01b03909216600090815260149091526040902055600101611362565b601881815481106113ca57fe5b600091825260209091200154905081565b601781815481106113e857fe5b6000918252602090912001546001600160a01b0316905081565b60116020526000908152604090205460ff1681565b60055481565b3360009081526011602052604090205460ff1661146f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b611479868661269d565b60048054604080516304dabc3160e51b815290516001600160a01b03909216926000926114f99287928692639b57862092808301926020929182900301818987803b1580156114c757600080fd5b505af11580156114db573d6000803e3d6000fd5b505050506040513d60208110156114f157600080fd5b505190612773565b9050600061153c84846001600160a01b0316631bca8cf06040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114c757600080fd5b90508187111561154a578196505b80861115611556578095505b60408051629a208160e81b81526004810189905233602482015290516001600160a01b03851691639a20810091604480830192600092919082900301818387803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b50506040805163f3883d8b60e01b8152600481018a905233602482015290516001600160a01b038716935063f3883d8b9250604480830192600092919082900301818387803b15801561160957600080fd5b505af115801561161d573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160a01b031681565b61070881565b600054600160a81b900460ff1681565b60008054600160a81b900460ff161561166c575060006116d7565b600f546010541061167f575060006116d7565b60008061168b846117f5565b93509350505081811180156116c057506001600160a01b0384166000908152601460205260409020546116be82846127cb565b115b156116d0576000925050506116d7565b6001925050505b919050565b3360009081526015602052604090205460ff1661172e576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff16611792576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601660205260409020805460ff191690556010546117b79060016127cb565b6010556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600e5481565b600080600080611803612b1d565b505050506001600160a01b039182166000908152601360209081526040918290208251608081018452905494851680825263ffffffff600160a01b87048116938301849052600160c01b87048116948301859052600160e01b909604909516606090910181905293949093919250565b60095481565b6000546001600160a01b031633146118c6576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600c55565b3360009081526011602052604090205460ff1661191d576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60006119288261225b565b90508015611993576002546001546001600160a01b03918216911660005b865181101561198f57600087828151811061195d57fe5b602002602001015190506119868188848151811061197757fe5b60200260200101518587612408565b50600101611946565b5050505b50505050565b6003546001600160a01b031633146119e6576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6000546001600160a01b03163314611a6a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1615611ab35760405162461bcd60e51b8152600401808060200182810382526022815260200180612d886022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600f8490555b8251811015611b1f576000838281518110611ae357fe5b6020908102919091018101516001600160a01b03166000908152601590915260409020805460ff19166001908117909155919091019050611acc565b5060005b8151811015611993576000828281518110611b3a57fe5b6020908102919091018101516001600160a01b03166000908152601190915260409020805460ff19166001908117909155919091019050611b23565b6000611b8f60085460055461277390919063ffffffff16565b421115611bea578115611bca57611bc3612710610f20611bbc600a5461271061277390919063ffffffff16565b8690612367565b9050611cf5565b611bc3612710610f20611bbc600a546127106127cb90919063ffffffff16565b600754600554611bf991612773565b421115611c46578115611c2657611bc3612710610f20611bbc60095461271061277390919063ffffffff16565b611bc3612710610f20611bbc6009546127106127cb90919063ffffffff16565b6001600160a01b03841660009081526012602052604090205480611c6d5783915050611cf5565b6000818511611c8557611c8082866127cb565b611c8f565b611c8f85836127cb565b9050611ca185610f2083612710612367565b90506000611cae87611651565b1580611cbb5750600e5482115b90508015611cef578415611ce257828611611cd65782611cd8565b855b9350505050611cf5565b828610611cd65782611cd8565b50909150505b9392505050565b6003546001600160a01b03163314611d49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600e55565b6000546001600160a01b03163314611d9b576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600855565b68327cb2734119d3b7a9601e1b81565b6298968081565b60146020526000908152604090205481565b600a5481565b60105481565b600b5481565b6000546001600160a01b03163314611e28576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600955565b6000546001600160a01b03163314611e7a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b8051825114611ed0576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611ee3906017906020850190612b44565b508051610f54906018906020840190612ba9565b3360009081526015602052604090205460ff16611f49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff1615611fad576040805162461bcd60e51b815260206004820152601c60248201527b11985cdd141c9a58d9519959590e88185b1c9958591e481d9bdd195960221b604482015290519081900360640190fd5b336000908152601660205260409020805460ff19166001908117909155601054611fd691612773565b6010556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6013602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b6000546001600160a01b0316331461209a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314612105576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205481565b6000546001600160a01b03163314612186576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600b55565b6003546001600160a01b031633146121d8576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331461222a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600a55565b600d5481565b60085481565b6001600160a01b0381565b6001546001600160a01b031681565b60065481565b600b54600090156122b457600b546006546122779043906127cb565b10156122b45760405162461bcd60e51b815260040180806020018281038252602e815260200180612d31602e913960400191505060405180910390fd5b600c546122c142826127cb565b83116122fe5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d04602d913960400191505060405180910390fd5b6123084282612773565b83106123455760405162461bcd60e51b815260040180806020018281038252602f815260200180612cb4602f913960400191505060405180910390fd5b6005548310156123595760009150506116d7565b505060055543600655600190565b600082612376575060006123c3565b8282028284828161238357fe5b04146123c05760405162461bcd60e51b8152600401808060200182810382526021815260200180612ce36021913960400191505060405180910390fd5b90505b92915050565b60006123c083836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061280d565b6001600160a01b03821615612677576000826001600160a01b03166356bf9de4866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561246657600080fd5b505afa15801561247a573d6000803e3d6000fd5b505050506040513d602081101561249057600080fd5b50516001600160a01b0386166000908152601260205260408120549192508080806124ba8a6117f5565b935093509350935060008411156125815760008487116124e3576124de85886127cb565b6124ed565b6124ed87866127cb565b905060008a8711612507576125028b886127cb565b612511565b612511878c6127cb565b9050612528600d54426123c990919063ffffffff16565b600d546125369087906123c9565b146125445760009350600092505b61255f61255887610f208562989680612367565b8590612773565b935061257c61257588610f208462989680612367565b8490612773565b925050505b81811180156125b057506001600160a01b038a166000908152601460205260409020546125ae82846127cb565b115b1561260d57604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517fe582322b389ad06b2bbf619cd6da3f16a288ec873ea0fa6df4d72f3d9480b4479181900360a00190a15b6126198a8784846128af565b604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517f23b9387f81fca646aac1dc4487ede045c65f5f7445482906565f01e05afdb3a89181900360a00190a15050505050505b6001600160a01b0384166000908152601260205260409020839055611993818585612a45565b60006126a88261225b565b90508015610f54576002546001546001600160a01b03918216911660005b6008811015610f5057601754819081106126e4575050505050610f56565b60178054602084029189831c63ffffffff1691600091908690811061270557fe5b6000918252602082200154601880546001600160a01b039092169350908790811061272c57fe5b6000918252602082200154915061275382610f208668327cb2734119d3b7a9601e1b612367565b905061276183828a8c612408565b5050600190940193506126c692505050565b6000828201838110156123c0576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60006123c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ac3565b600081836128995760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561285e578181015183820152602001612846565b50505050905090810190601f16801561288b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816128a557fe5b0495945050505050565b6001600160a01b03831061290a576040805162461bcd60e51b815260206004820152601f60248201527f466173745072696365466565643a20696e76616c696420726566507269636500604482015290519081900360640190fd5b63ffffffff821061294c5760405162461bcd60e51b8152600401808060200182810382526029815260200180612d5f6029913960400191505060405180910390fd5b63ffffffff811061298e5760405162461bcd60e51b815260040180806020018281038252602a815260200180612c4a602a913960400191505060405180910390fd5b604080516080810182526001600160a01b03948516815263ffffffff4281166020808401918252958216838501908152948216606084019081529787166000908152601390965292909420905181549251935196518516600160e01b026001600160e01b03978616600160c01b0263ffffffff60c01b1995909616600160a01b0263ffffffff60a01b19929097166001600160a01b0319909416939093171694909417919091169190911792909216919091179055565b6001600160a01b038316612a5857610f54565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612aaf57600080fd5b505af115801561198f573d6000803e3d6000fd5b60008184841115612b155760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561285e578181015183820152602001612846565b505050900390565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054828255906000526020600020908101928215612b99579160200282015b82811115612b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b64565b50612ba5929150612bf0565b5090565b828054828255906000526020600020908101928215612be4579160200282015b82811115612be4578251825591602001919060010190612bc9565b50612ba5929150612c0f565b5b80821115612ba55780546001600160a01b0319168155600101612bf1565b5b80821115612ba55760008155600101612c1056fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e466173745072696365466565643a20696e76616c69642063756d756c61746976654661737444656c7461476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20696e76616c69642063756d756c617469766552656644656c7461466173745072696365466565643a20616c726561647920696e697469616c697a6564a2646970667358221220d3110679483ab3acb24dfa1e6bd202506bda4fca5ed6353387fda5a7de366c8664736f6c634300060c0033466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000006e1d2a4c475b8a43b457236a6f1fa002c46973d00000000000000000000000000a68f81fe8c23cf19fd0f90be3734f68ff2ef4510000000000000000000000004e2f6304f8c00e755482206e834af82968ceb804

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000006e1d2a4c475b8a43b457236a6f1fa002c46973d00000000000000000000000000a68f81fe8c23cf19fd0f90be3734f68ff2ef4510000000000000000000000004e2f6304f8c00e755482206e834af82968ceb804

-----Decoded View---------------
Arg [0] : _priceDuration (uint256): 300
Arg [1] : _maxPriceUpdateDelay (uint256): 3600
Arg [2] : _minBlockInterval (uint256): 1
Arg [3] : _maxDeviationBasisPoints (uint256): 250
Arg [4] : _fastPriceEvents (address): 0x6e1d2a4c475b8a43b457236a6f1fa002c46973d0
Arg [5] : _tokenManager (address): 0x0a68f81fe8c23cf19fd0f90be3734f68ff2ef451
Arg [6] : _positionRouter (address): 0x4e2f6304f8c00e755482206e834af82968ceb804

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [4] : 0000000000000000000000006e1d2a4c475b8a43b457236a6f1fa002c46973d0
Arg [5] : 0000000000000000000000000a68f81fe8c23cf19fd0f90be3734f68ff2ef451
Arg [6] : 0000000000000000000000004e2f6304f8c00e755482206e834af82968ceb804


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.