Contract 0x1a0ad27350cccd6f7f168e052100b4960efdb774

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc7b5c1eb0fe451a32b03f7fcc99d64d0ec0975ef5164861cf81b5e02ed9d07d9Set Prices With ...129586242022-05-26 0:59:041 min ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000177163033 ETH
0x885320132a031f17131999db27afce97f0fa40a573284a2ea1cd0bef71d00790Set Prices With ...129585952022-05-26 0:58:022 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000176652109 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32Set Prices With ...129585932022-05-26 0:58:022 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000325869858 ETH
0x1d0a8f01434dfd775153db4845e16c70986bd962c986229e72c95650f3750e13Set Prices With ...129585582022-05-26 0:56:544 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000331662544 ETH
0xe9fb649858f06b3377ecfd1530177f81295e479ccefca699621fd26049753183Set Prices With ...129585202022-05-26 0:54:416 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000176141186 ETH
0x863960de577f69c86ab46f74e4e7801ecad68c2bca56395ac4ea625ee04127a9Set Prices With ...129584932022-05-26 0:54:296 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000177163033 ETH
0x5cf34632e5510b08271a5b7b655f8794becaf68284033aaba01b28375ceb0212Set Prices With ...129584822022-05-26 0:54:296 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000321711386 ETH
0x333eb494a7346da08ff5a87243684afc190786315d94c6171fe1284d8a930649Set Prices With ...129584582022-05-26 0:53:207 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.00021152818 ETH
0xcdef3cafc4c505184fb3b56e1a88ee0b6f2603e23cf2a304e3d7b2958b06fcbeSet Prices With ...129584372022-05-26 0:50:1710 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000213016522 ETH
0xae59ecee8c1c45f1d0db457a03c46fc2809159f7bee6af84fb131874e97a5c34Set Prices With ...129584202022-05-26 0:50:1710 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000321160107 ETH
0xe42520cb57ca75071cc3a20ad3771f15a318aa819beaf0d8d5bb1ced133b33b2Set Prices With ...129584112022-05-26 0:50:1710 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000177163033 ETH
0x67e251ed3a3a0b4fa93e73f884f622f1e221ee43b477c4723f56c4bca49d73d6Set Prices With ...129583752022-05-26 0:49:0611 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000228584874 ETH
0x5904c058721e953e3d69b4de0bfc7189f96ad70e85189a67bc89aae9d66297ebSet Prices With ...129583572022-05-26 0:49:0611 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000321835785 ETH
0x2a3689c872ed253c0f198533229594d7b36aa4f4c3c5e80dd6871e30f4be73d5Set Prices With ...129583292022-05-26 0:47:5613 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000177163033 ETH
0xe86ce0fa1faf554e6dc028ae69f42742b0de21f01a01e4fcbcbc571cf016a348Set Prices With ...129583032022-05-26 0:47:5613 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000176652109 ETH
0xd350c811a518d0335daec9af4bcc6d14e7d76de8bbcece2ad9cb566b815fb892Set Prices With ...129582092022-05-26 0:44:0616 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000177163033 ETH
0xab3d90ff6c0f6d2c5a5f3a9e04ee71bae624847b26a67d9bc2ad2e2e1f521ddaSet Prices With ...129581932022-05-26 0:44:0616 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000332798052 ETH
0xa9978539133311ad77b0186db4bb7267db19dfaae285ac6767dba63927a92864Set Prices With ...129581772022-05-26 0:42:1818 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000211580383 ETH
0xa93feb8143c4211e5f495a8a47e43731f120f5dc9affa6fa3105a5d18d5a75afSet Prices With ...129581672022-05-26 0:42:1818 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000211441545 ETH
0xd37337ce9753e783fb33cf0734f3103f0163fc5362963422de66b6242de200d0Set Prices With ...129581402022-05-26 0:41:2719 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000177163033 ETH
0x04e93eb5c5e14c2d3b2c27afbd7a1e3bff8cf543222967ef5647fd9f30325794Set Prices With ...129581172022-05-26 0:40:2620 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000213907675 ETH
0xad0c91294df86eec36f679fce501267b02a74366de433bb98b5f621ec27b3343Set Prices With ...129581092022-05-26 0:40:2620 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000176652109 ETH
0xf34cbab1c6d537e0e5956c6080100607fc4c51f3e0b32e8eac86a4cad44c9b05Set Prices With ...129581072022-05-26 0:39:0821 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000211464129 ETH
0x53978fd83cd44695e792c129d2d22f7e5e218185d07a7fefdcc0e93f164598beSet Prices With ...129580902022-05-26 0:39:0821 mins ago0xef9092d35fda3e5b6e2dd3fac5b580aefc346faf IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000211461167 ETH
0xcae60f9d40ca3eb28f96243fb9362aafc8655f1b053a3cacf2af0947a586580eSet Prices With ...129580252022-05-26 0:36:5124 mins ago0x1e359eae31f5815ac3d5b337b26771bc8adbdfa3 IN  0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH0.000176652109 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc7b5c1eb0fe451a32b03f7fcc99d64d0ec0975ef5164861cf81b5e02ed9d07d9129586242022-05-26 0:59:041 min ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0xc7b5c1eb0fe451a32b03f7fcc99d64d0ec0975ef5164861cf81b5e02ed9d07d9129586242022-05-26 0:59:041 min ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0xc7b5c1eb0fe451a32b03f7fcc99d64d0ec0975ef5164861cf81b5e02ed9d07d9129586242022-05-26 0:59:041 min ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0xc7b5c1eb0fe451a32b03f7fcc99d64d0ec0975ef5164861cf81b5e02ed9d07d9129586242022-05-26 0:59:041 min ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x885320132a031f17131999db27afce97f0fa40a573284a2ea1cd0bef71d00790129585952022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x885320132a031f17131999db27afce97f0fa40a573284a2ea1cd0bef71d00790129585952022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x885320132a031f17131999db27afce97f0fa40a573284a2ea1cd0bef71d00790129585952022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x885320132a031f17131999db27afce97f0fa40a573284a2ea1cd0bef71d00790129585952022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb7740x3d6ba331e3d9702c5e8a8d254e5d8a285f223aba0 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb7740x3d6ba331e3d9702c5e8a8d254e5d8a285f223aba0 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x912a0debf0c2b766de75a5d47279607b2cc54f2aca3b32dd4482831649912f32129585932022-05-26 0:58:022 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb774 0x4530b7de1958270a2376be192a24175d795e1b070 ETH
0x1d0a8f01434dfd775153db4845e16c70986bd962c986229e72c95650f3750e13129585582022-05-26 0:56:544 mins ago 0x1a0ad27350cccd6f7f168e052100b4960efdb7740x3d6ba331e3d9702c5e8a8d254e5d8a285f223aba0 ETH
0x1d0a8f01434dfd775153db4845e16c70986bd962c986229e72c95650f3750e13129585582022-05-26 0:56:544 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x1d0a8f01434dfd775153db4845e16c70986bd962c986229e72c95650f3750e13129585582022-05-26 0:56:544 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
0x1d0a8f01434dfd775153db4845e16c70986bd962c986229e72c95650f3750e13129585582022-05-26 0:56:544 mins ago 0xa18bb1003686d0854ef989bb936211c59eb6e363 0x1a0ad27350cccd6f7f168e052100b4960efdb7740 ETH
[ Download CSV Export 
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

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : 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/IPositionRouter.sol";
import "../access/Governable.sol";

pragma solidity 0.6.12;

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

    uint256 public constant PRICE_PRECISION = 10 ** 30;

    // 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 PRICE_BITMASK = 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 fastPriceEvents;

    address public tokenManager;

    address public positionRouter;

    uint256 public override lastUpdatedAt;
    uint256 public override lastUpdatedBlock;

    uint256 public priceDuration;
    uint256 public minBlockInterval;
    uint256 public maxTimeDeviation;

    // volatility basis points
    uint256 public volBasisPoints;
    // max 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 => 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);

    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 _minBlockInterval,
      uint256 _maxDeviationBasisPoints,
      address _fastPriceEvents,
      address _tokenManager,
      address _positionRouter
    ) public {
        require(_priceDuration <= MAX_PRICE_DURATION, "FastPriceFeed: invalid _priceDuration");
        priceDuration = _priceDuration;
        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 setTokenManager(address _tokenManager) external onlyGov {
        tokenManager = _tokenManager;
    }

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

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

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

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

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

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

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

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

    function setVolBasisPoints(uint256 _volBasisPoints) external onlyGov {
        volBasisPoints = _volBasisPoints;
    }

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

    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;

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

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

        if (shouldUpdate) {
            address _fastPriceEvents = fastPriceEvents;

            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) & PRICE_BITMASK;

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

                    _emitPriceEvent(_fastPriceEvents, token, adjustedPrice);
                }
            }
        }
    }

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

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

        IPositionRouter _positionRouter = IPositionRouter(positionRouter);
        _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);
    }

    function getPrice(address _token, uint256 _refPrice, bool _maximise) external override view returns (uint256) {
        if (block.timestamp > lastUpdatedAt.add(priceDuration)) { return _refPrice; }

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

        uint256 maxPrice = _refPrice.mul(BASIS_POINTS_DIVISOR.add(maxDeviationBasisPoints)).div(BASIS_POINTS_DIVISOR);
        uint256 minPrice = _refPrice.mul(BASIS_POINTS_DIVISOR.sub(maxDeviationBasisPoints)).div(BASIS_POINTS_DIVISOR);

        if (favorFastPrice()) {
            if (fastPrice >= minPrice && fastPrice <= maxPrice) {
                if (_maximise) {
                    if (_refPrice > fastPrice) {
                        uint256 volPrice = fastPrice.mul(BASIS_POINTS_DIVISOR.add(volBasisPoints)).div(BASIS_POINTS_DIVISOR);
                        // the volPrice should not be more than _refPrice
                        return volPrice > _refPrice ? _refPrice : volPrice;
                    }
                    return fastPrice;
                }

                if (_refPrice < fastPrice) {
                    uint256 volPrice = fastPrice.mul(BASIS_POINTS_DIVISOR.sub(volBasisPoints)).div(BASIS_POINTS_DIVISOR);
                    // the volPrice should not be less than _refPrice
                    return volPrice < _refPrice ? _refPrice : volPrice;
                }

                return fastPrice;
            }
        }

        if (_maximise) {
            if (_refPrice > fastPrice) { return _refPrice; }
            return fastPrice > maxPrice ? maxPrice : fastPrice;
        }

        if (_refPrice < fastPrice) { return _refPrice; }
        return fastPrice < minPrice ? minPrice : fastPrice;
    }

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

        if (disableFastPriceVoteCount >= minAuthorizations) {
            return false;
        }

        return true;
    }

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

        if (shouldUpdate) {
            address _fastPriceEvents = fastPriceEvents;

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

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

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

                _emitPriceEvent(_fastPriceEvents, token, adjustedPrice);
            }
        }
    }

    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");
        }

        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 7 : 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 7 : 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 7 : 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);
}

File 5 of 7 : IFastPriceEvents.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

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

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

pragma solidity 0.6.12;

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

File 7 of 7 : 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;
    }
}

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":"_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"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","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":"PRICE_BITMASK","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":[],"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":[],"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":[],"name":"maxDeviationBasisPoints","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":[],"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":"uint256","name":"_maxDeviationBasisPoints","type":"uint256"}],"name":"setMaxDeviationBasisPoints","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":"_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"}],"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":"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":"uint256","name":"_volBasisPoints","type":"uint256"}],"name":"setVolBasisPoints","outputs":[],"stateMutability":"nonpayable","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":"volBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526000805460ff60a81b19168155600c5534801561002057600080fd5b5060405161235a38038061235a833981810160405260c081101561004357600080fd5b508051602082015160408301516060840151608085015160a090950151600080546001600160a01b0319163317905593949293919290916107088611156100bb5760405162461bcd60e51b81526004018080602001828103825260258152602001806123356025913960400191505060405180910390fd5b600695909555600793909355600a91909155600180546001600160a01b039283166001600160a01b03199182161790915560028054938316938216939093179092556003805491909316911617905561221c806101196000396000f3fe608060405234801561001057600080fd5b50600436106102305760003560e01c806303b049361461023557806303cd25711461026f57806303f4d7dc146102895780630e9272ea1461032e578063114fbeb314610352578063126082cf1461035a57806312d43a51146103625780631389a3cc1461036a57806314dd2dce14610399578063162ac4e0146103b657806317835d1c146103dc5780631a153391146103ff578063287800c91461042d5780632a709b141461043557806331cb61051461043d578063392e53cd1461046b5780633aa08f861461047357806344c231931461047b5780634d11fb4a146104985780634f64b2be146104b55780634fdfb086146104d257806354aea127146104f857806361ef161f14610500578063668d3d6514610508578063695d4184146105105780636ccd47c414610518578063715c753614610520578063776d16c114610528578063782661bc146105455780637cb2b79c1461066a5780637df73e27146106905780637fbc79c6146106b65780637fece368146107e057806382553aad1461081457806395082d25146108315780639e4de0e314610839578063b0a2566614610856578063b3606b561461085e578063c0e4de8e14610866578063c8390a481461086e578063c84a912414610991578063ce98dfa814610999578063cfad57a2146109b8578063cfed246b146109de578063d6a153f114610a04578063d925351a14610a21578063f67e3bf014610a3e578063f90ce5ba14610a46575b600080fd5b61025b6004803603602081101561024b57600080fd5b50356001600160a01b0316610a4e565b604080519115158252519081900360200190f35b610277610a63565b60408051918252519081900360200190f35b61032c6004803603604081101561029f57600080fd5b810190602081018135600160201b8111156102b957600080fd5b8201836020820111156102cb57600080fd5b803590602001918460208302840111600160201b831117156102ec57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610a69915050565b005b610336610bf1565b604080516001600160a01b039092168252519081900360200190f35b610277610c00565b610277610c06565b610336610c0c565b61032c6004803603608081101561038057600080fd5b5080359060208101359060408101359060600135610c1b565b61032c600480360360208110156103af57600080fd5b5035610d4f565b61032c600480360360208110156103cc57600080fd5b50356001600160a01b0316610da1565b61032c600480360360408110156103f257600080fd5b5080359060200135610e10565b61032c6004803603604081101561041557600080fd5b506001600160a01b0381351690602001351515610e6c565b610277610ee4565b610336610eea565b61032c6004803603604081101561045357600080fd5b506001600160a01b0381351690602001351515610ef9565b61025b610f71565b610277610f81565b61032c6004803603602081101561049157600080fd5b5035610f87565b610277600480360360208110156104ae57600080fd5b503561101a565b610336600480360360208110156104cb57600080fd5b5035611038565b61025b600480360360208110156104e857600080fd5b50356001600160a01b031661105f565b610277611074565b61033661107a565b610277611089565b61025b61108f565b61032c61109f565b6102776111b2565b61032c6004803603602081101561053e57600080fd5b50356111b8565b61032c6004803603606081101561055b57600080fd5b810190602081018135600160201b81111561057557600080fd5b82018360208201111561058757600080fd5b803590602001918460208302840111600160201b831117156105a857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105f757600080fd5b82018360208201111561060957600080fd5b803590602001918460208302840111600160201b8311171561062a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061120a915050565b61032c6004803603602081101561068057600080fd5b50356001600160a01b031661130c565b61025b600480360360208110156106a657600080fd5b50356001600160a01b031661137b565b61032c600480360360608110156106cc57600080fd5b81359190810190604081016020820135600160201b8111156106ed57600080fd5b8201836020820111156106ff57600080fd5b803590602001918460208302840111600160201b8311171561072057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561076f57600080fd5b82018360208201111561078157600080fd5b803590602001918460208302840111600160201b831117156107a257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611390945050505050565b610277600480360360608110156107f657600080fd5b506001600160a01b03813516906020810135906040013515156114e9565b61032c6004803603602081101561082a57600080fd5b50356116a7565b6102776116f9565b61032c6004803603602081101561084f57600080fd5b5035611709565b61027761175b565b610277611761565b61025b611767565b61032c6004803603604081101561088457600080fd5b810190602081018135600160201b81111561089e57600080fd5b8201836020820111156108b057600080fd5b803590602001918460208302840111600160201b831117156108d157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561092057600080fd5b82018360208201111561093257600080fd5b803590602001918460208302840111600160201b8311171561095357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061179c945050505050565b61032c611866565b61032c600480360360208110156109af57600080fd5b5035151561197d565b61032c600480360360208110156109ce57600080fd5b50356001600160a01b03166119e8565b610277600480360360208110156109f457600080fd5b50356001600160a01b0316611a57565b61032c60048036036020811015610a1a57600080fd5b5035611a69565b61032c60048036036020811015610a3757600080fd5b5035611abb565b610277611b0d565b610277611b15565b60106020526000908152604090205460ff1681565b60065481565b336000908152600d602052604090205460ff16610abb576040805162461bcd60e51b815260206004820152601860248201526000805160206120fa833981519152604482015290519081900360640190fd5b6000610ac682611b1b565b90508015610beb576001546001600160a01b031660005b8451811015610be8576000858281518110610af457fe5b6020026020010151905060005b6008811015610bde57601154600884028201908110610b2557505050505050610bed565b60118054602084029185831c63ffffffff169160009190600889028701908110610b4b57fe5b6000918252602082200154601280546001600160a01b0390921693509060088a028801908110610b7757fe5b60009182526020822001549150610ba482610b9e8668327cb2734119d3b7a9601e1b611c2e565b90611c90565b6001600160a01b0384166000908152600e602052604090208190559050610bcc8a8483611ccf565b505060019094019350610b0192505050565b5050600101610add565b50505b505b5050565b6001546001600160a01b031681565b60095481565b61271081565b6000546001600160a01b031681565b336000908152600d602052604090205460ff16610c6d576040805162461bcd60e51b815260206004820152601860248201526000805160206120fa833981519152604482015290519081900360640190fd5b610c778484611d56565b60035460408051629a208160e81b81526004810185905233602482015290516001600160a01b03909216918291639a20810091604480830192600092919082900301818387803b158015610cca57600080fd5b505af1158015610cde573d6000803e3d6000fd5b50506040805163f3883d8b60e01b81526004810186905233602482015290516001600160a01b038516935063f3883d8b9250604480830192600092919082900301818387803b158015610d3057600080fd5b505af1158015610d44573d6000803e3d6000fd5b505050505050505050565b6000546001600160a01b03163314610d9c576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600455565b6000546001600160a01b03163314610dee576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600d602052604090205460ff16610e62576040805162461bcd60e51b815260206004820152601860248201526000805160206120fa833981519152604482015290519081900360640190fd5b610bed8282611d56565b6000546001600160a01b03163314610eb9576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b600b5481565b6002546001600160a01b031681565b6000546001600160a01b03163314610f46576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b600054600160a01b900460ff1681565b60085481565b6000546001600160a01b03163314610fd4576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b6107088111156110155760405162461bcd60e51b81526004018080602001828103825260258152602001806120b56025913960400191505060405180910390fd5b600655565b6012818154811061102757fe5b600091825260209091200154905081565b6011818154811061104557fe5b6000918252602090912001546001600160a01b0316905081565b600d6020526000908152604090205460ff1681565b60045481565b6003546001600160a01b031681565b61070881565b600054600160a81b900460ff1681565b336000908152600f602052604090205460ff166110f1576040805162461bcd60e51b815260206004820152601860248201526000805160206120fa833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16611155576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601060205260409020805460ff19169055600c5461117a906001611e3e565b600c556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600a5481565b6000546001600160a01b03163314611205576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600855565b336000908152600d602052604090205460ff1661125c576040805162461bcd60e51b815260206004820152601860248201526000805160206120fa833981519152604482015290519081900360640190fd5b600061126782611b1b565b90508015611306576001546001600160a01b031660005b855181101561130357600086828151811061129557fe5b602002602001015190508582815181106112ab57fe5b6020026020010151600e6000836001600160a01b03166001600160a01b03168152602001908152602001600020819055506112fa83828885815181106112ed57fe5b6020026020010151611ccf565b5060010161127e565b50505b50505050565b6000546001600160a01b03163314611359576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600f6020526000908152604090205460ff1681565b6000546001600160a01b031633146113dd576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600054600160a01b900460ff16156114265760405162461bcd60e51b81526004018080602001828103825260228152602001806121c56022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600b8490555b825181101561149257600083828151811061145657fe5b6020908102919091018101516001600160a01b03166000908152600f90915260409020805460ff1916600190811790915591909101905061143f565b5060005b81518110156113065760008282815181106114ad57fe5b6020908102919091018101516001600160a01b03166000908152600d90915260409020805460ff19166001908117909155919091019050611496565b6000611502600654600454611e8090919063ffffffff16565b4211156115105750816116a0565b6001600160a01b0384166000908152600e60205260409020548061153757839150506116a0565b6000611560612710610b9e611559600a54612710611e8090919063ffffffff16565b8890611c2e565b9050600061158b612710610b9e611584600a54612710611e3e90919063ffffffff16565b8990611c2e565b9050611595611767565b15611646578083101580156115aa5750818311155b1561164657841561160d57828611156116025760006115e6612710610b9e6115df600954612710611e8090919063ffffffff16565b8790611c2e565b90508681116115f557806115f7565b865b9450505050506116a0565b8293505050506116a0565b82861015611602576000611637612710610b9e6115df600954612710611e3e90919063ffffffff16565b90508681106115f557806115f7565b8415611678578286111561165f578593505050506116a0565b81831161166c578261166e565b815b93505050506116a0565b8286101561168b578593505050506116a0565b808310611698578261169a565b805b93505050505b9392505050565b6000546001600160a01b031633146116f4576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600a55565b68327cb2734119d3b7a9601e1b81565b6000546001600160a01b03163314611756576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600955565b600c5481565b60075481565b60008054600160a81b900460ff161561178257506000611799565b600b54600c541061179557506000611799565b5060015b90565b6000546001600160a01b031633146117e9576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b805182511461183f576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611852906011906020850190611fd4565b508051610beb906012906020840190612039565b336000908152600f602052604090205460ff166118b8576040805162461bcd60e51b815260206004820152601860248201526000805160206120fa833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff161561191c576040805162461bcd60e51b815260206004820152601c60248201527b11985cdd141c9a58d9519959590e88185b1c9958591e481d9bdd195960221b604482015290519081900360640190fd5b336000908152601060205260409020805460ff19166001908117909155600c5461194591611e80565b600c556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6000546001600160a01b031633146119ca576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314611a35576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600e6020526000908152604090205481565b6000546001600160a01b03163314611ab6576040805162461bcd60e51b815260206004820152601560248201526000805160206120da833981519152604482015290519081900360640190fd5b600755565b6002546001600160a01b03163314611b08576040805162461bcd60e51b815260206004820152601860248201526000805160206120fa833981519152604482015290519081900360640190fd5b600b55565b63ffffffff81565b60055481565b60075460009015611b7457600754600554611b37904390611e3e565b1015611b745760405162461bcd60e51b815260040180806020018281038252602e815260200180612197602e913960400191505060405180910390fd5b600854611b82904290611e3e565b8211611bbf5760405162461bcd60e51b815260040180806020018281038252602d81526020018061216a602d913960400191505060405180910390fd5b600854611bcd904290611e80565b8210611c0a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061211a602f913960400191505060405180910390fd5b600454821015611c1c57506000611c29565b5060048190554360055560015b919050565b600082611c3d57506000611c8a565b82820282848281611c4a57fe5b0414611c875760405162461bcd60e51b81526004018080602001828103825260218152602001806121496021913960400191505060405180910390fd5b90505b92915050565b6000611c8783836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250611ed8565b6001600160a01b038316611ce257610beb565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611d3957600080fd5b505af1158015611d4d573d6000803e3d6000fd5b50505050505050565b6000611d6182611b1b565b90508015610beb576001546001600160a01b031660005b6008811015610be85760115481908110611d955750505050610bed565b60118054602084029188831c63ffffffff16916000919086908110611db657fe5b6000918252602082200154601280546001600160a01b0390921693509087908110611ddd57fe5b60009182526020822001549150611e0482610b9e8668327cb2734119d3b7a9601e1b611c2e565b6001600160a01b0384166000908152600e602052604090208190559050611e2c888483611ccf565b505060019094019350611d7892505050565b6000611c8783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f7a565b600082820183811015611c87576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60008183611f645760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f29578181015183820152602001611f11565b50505050905090810190601f168015611f565780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f7057fe5b0495945050505050565b60008184841115611fcc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f29578181015183820152602001611f11565b505050900390565b828054828255906000526020600020908101928215612029579160200282015b8281111561202957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611ff4565b50612035929150612080565b5090565b828054828255906000526020600020908101928215612074579160200282015b82811115612074578251825591602001919060010190612059565b5061203592915061209f565b5b808211156120355780546001600160a01b0319168155600101612081565b5b8082111561203557600081556001016120a056fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20616c726561647920696e697469616c697a6564a2646970667358221220d8de10e4e5e8633d06e2468d8ecd2688b7a4c4b4bba4ac3e145ba7c1b3585ad264736f6c634300060c0033466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000001b27de2815b7903b64961e8c6a992e013dd983e60000000000000000000000001ef8156b46e6f5a1973bff4975177fd13275ad590000000000000000000000003d6ba331e3d9702c5e8a8d254e5d8a285f223aba

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

000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000001b27de2815b7903b64961e8c6a992e013dd983e60000000000000000000000001ef8156b46e6f5a1973bff4975177fd13275ad590000000000000000000000003d6ba331e3d9702c5e8a8d254e5d8a285f223aba

-----Decoded View---------------
Arg [0] : _priceDuration (uint256): 300
Arg [1] : _minBlockInterval (uint256): 1
Arg [2] : _maxDeviationBasisPoints (uint256): 250
Arg [3] : _fastPriceEvents (address): 0x1b27de2815b7903b64961e8c6a992e013dd983e6
Arg [4] : _tokenManager (address): 0x1ef8156b46e6f5a1973bff4975177fd13275ad59
Arg [5] : _positionRouter (address): 0x3d6ba331e3d9702c5e8a8d254e5d8a285f223aba

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [3] : 0000000000000000000000001b27de2815b7903b64961e8c6a992e013dd983e6
Arg [4] : 0000000000000000000000001ef8156b46e6f5a1973bff4975177fd13275ad59
Arg [5] : 0000000000000000000000003d6ba331e3d9702c5e8a8d254e5d8a285f223aba


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.