Contract 0x73903fec691a80ec47bc830bf3f0bad127a06e30 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xab132f5c574365cb3c336d103b50e636010be42cbc96fcf8ca39153b41020074Set Prices57457992023-09-26 2:39:3913 secs ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000044206471
0xb2759774c097630f61d246a2b0376925db610794d259f0178bd3303148464247Set Prices57457592023-09-26 2:36:493 mins ago0x804f813be88d36e2388b0edf317a721067c656dc IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000047579172
0x557fcb4c6e0d7f368719fdf6690a252380a4a0af1bf296666d97121ad4400732Set Prices57457262023-09-26 2:34:175 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.00004289686
0x904ce561abc6b8269ecfb82a9cdfbe215afa7ceb33a62c2bbfac1e1ea3e1d591Set Prices57456802023-09-26 2:31:368 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000042046941
0xa90a29757dd90c5dad47a8ccec8d40ec3d44b3db538b18ef3db638e7df4b2f35Set Prices57456542023-09-26 2:28:5510 mins ago0x804f813be88d36e2388b0edf317a721067c656dc IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.0000451755
0x2a8812a77899348b3b8eb9bb440509bc1ed3fda2bbb68079c95e6492a9bbe184Set Prices57456182023-09-26 2:26:1613 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000041802396
0x14dccf92656601f06f9d67c45751b60c34a3e31b6aa41747960750b5a0a4865fSet Prices57455912023-09-26 2:23:3516 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000045421864
0x0a878e44e220dc40bcc725513c5c72fdc896f0411bb6493746034622e7f62e8aSet Prices57455592023-09-26 2:20:5818 mins ago0x804f813be88d36e2388b0edf317a721067c656dc IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000048551949
0x61729f6c8f1d4fb1067e832f73a29835ef977ce69b0ca60edcb2fdf0bbe90941Set Prices57455212023-09-26 2:18:2621 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000047651234
0xc736101ce3201b737047b7db3f30f61fd85fee85bf9cf49f122d70a4e06b550bSet Prices57454652023-09-26 2:15:4424 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000048834036
0x71e376facfd29b28752af011bdf2d7b75e6316f5cbd637909432099a47077455Set Prices57454202023-09-26 2:13:0026 mins ago0x804f813be88d36e2388b0edf317a721067c656dc IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000039383618
0xb6bc15ab12831bd753cc8762c703e095645b0238c42fd33db8c0fe6e42e40e52Set Prices57453832023-09-26 2:10:2529 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000040843533
0x5128d4130b7b4a9a6587e54befd382e55d57cdc7f75e702217ff8e4a3dee9b75Set Prices57453472023-09-26 2:07:4132 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000041431084
0x5da4de68106d5123e83960d72c11316f029186089fbcf9928d92a0b2a364d9b9Set Prices57452932023-09-26 2:05:0034 mins ago0x804f813be88d36e2388b0edf317a721067c656dc IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000041681928
0x1d5385dd71b270358c7dc8642f3035f51ce55c64b90c42a72ab17ffb82552cf5Set Prices57452392023-09-26 2:02:1937 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000042530287
0xe53861e1cac42858eecf868f3c241ac802f14914bd19e7da1ef80869f75633afSet Prices57451892023-09-26 1:59:3840 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000039629234
0x601e582984c2416bb67bd8d63d0466263bd35c77adcb964a456dcadd0cf829feSet Prices With ...57451472023-09-26 1:56:5542 mins ago0x4dfcedda40fbd2fc691268cabea074d1f4facd6f IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.00018883308
0xf56f3d74573862979494db86cc104b2d5a49ee14aedd5d714178ab7900b915f4Set Prices57451272023-09-26 1:55:2144 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000042270789
0x01d68e15ac12c29f29adfc6eb801f15cf37041770ea97be72d45080d65892a83Set Prices57450992023-09-26 1:53:2246 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000041676945
0x22b602951720ac690105e3b8014d7eb5fbaa3ce58cf4aab724356bd39cf4091fSet Prices With ...57450592023-09-26 1:50:4149 mins ago0x63f1e568e2d6c44f0f557adfa963707f0cb3c26a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.00024841645
0x1cd42b400a923bcdd44db94b7dafbb44f2122b2d171da22abfe2d86c5391738cSet Prices57450312023-09-26 1:48:4251 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000038884636
0x18b557f9a39bef81df22a05b85e8705013509766ef5921dbd46648db9f9fb37cSet Prices57450092023-09-26 1:45:5953 mins ago0x804f813be88d36e2388b0edf317a721067c656dc IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000040275244
0x3a9aca03239142438bf1013c610cfa7c64b4473461ef2cf91fc42364f7fa86c1Set Prices57449692023-09-26 1:43:1656 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000042881481
0x26b4f42f430d4c17a36e7daebd056618b8e2ddfd13e96a86e502458258919024Set Prices57449322023-09-26 1:40:4359 mins ago0x1ac344ee9bf132ddabc53b5ce2e7f1ec36f76b9a IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000043483749
0x32748b363490f488b049deeec3ddafcc056a627a9e6d75bc7f5a28861937a4b0Set Prices57448932023-09-26 1:37:581 hr 1 min ago0x804f813be88d36e2388b0edf317a721067c656dc IN  0x73903fec691a80ec47bc830bf3f0bad127a06e300 ETH0.000043358112
[ 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 : 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 2 of 8 : IPositionRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IPositionRouter {
    function increasePositionRequestKeysStart() external view returns (uint256);
    function decreasePositionRequestKeysStart() external view returns (uint256);
    function increasePositionRequestKeys(uint256 index) external view returns (bytes32);
    function decreasePositionRequestKeys(uint256 index) external view returns (bytes32);
    function executeIncreasePositions(uint256 _count, address payable _executionFeeReceiver) external;
    function executeDecreasePositions(uint256 _count, address payable _executionFeeReceiver) external;
    function getRequestQueueLengths() external view returns (uint256, uint256, uint256, uint256);
    function getIncreasePositionRequestPath(bytes32 _key) external view returns (address[] memory);
    function getDecreasePositionRequestPath(bytes32 _key) external view returns (address[] memory);
}

File 3 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 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 getPrimaryPrice(address _token, bool _maximise)
        external
        view
        returns (uint256);

    function setTokenConfig(
        address _token,
        address _priceFeed,
        uint256 _priceDecimals,
        bool _isStrictStable
    ) external;

    function getLatestPrimaryPrice(address _token) external view returns (uint256);


}

File 4 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 5 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;

    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
    ) public {
        require(_priceDuration <= MAX_PRICE_DURATION, "FastPriceFeed: invalid _priceDuration");
        priceDuration = _priceDuration;
        maxPriceUpdateDelay = _maxPriceUpdateDelay;
        minBlockInterval = _minBlockInterval;
        maxDeviationBasisPoints = _maxDeviationBasisPoints;
        fastPriceEvents = _fastPriceEvents;
        tokenManager = _tokenManager;
    }

    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(
        address _positionRouter,
        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 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 : 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);
}

Settings
{
  "metadata": {
    "bytecodeHash": "none",
    "useLiteralContent": true
  },
  "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"}],"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":[{"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":"address","name":"_positionRouter","type":"address"},{"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"}]

60806040526000805460ff60a81b19168155600f5534801561002057600080fd5b5060405162002ecc38038062002ecc833981810160405260c081101561004557600080fd5b508051602082015160408301516060840151608085015160a090950151600080546001600160a01b0319163317905593949293919290916107088611156100be5760405162461bcd60e51b815260040180806020018281038252602581526020018062002ea76025913960400191505060405180910390fd5b600695909555600793909355600a91909155600d55600280546001600160a01b039283166001600160a01b03199182161790915560038054929093169116179055612d98806200010f6000396000f3fe608060405234801561001057600080fd5b50600436106102d55760003560e01c806303b04936146102da57806303cd25711461031457806303f4d7dc1461032e5780630604ddea146103d35780630e9272ea146103db578063126082cf146103ff57806312d43a511461040757806314dd2dce1461040f578063162ac4e01461042c57806317835d1c146104525780631a15339114610475578063238aafb7146104a3578063287800c9146104c95780632a709b14146104d15780632e9cd94b146104d957806331cb6105146104f657806332e5f9fa14610524578063392e53cd1461056e5780633aa08f861461057657806344c231931461057e5780634bd66c1c146103d35780634c0e31c81461059b5780634d11fb4a146106be5780634f64b2be146106db5780634fdfb086146106f857806354aea1271461071e578063668d3d6514610726578063695d41841461072e5780636c56fd05146107365780636ccd47c41461075c578063715c75361461076457806372279ba11461076c57806374bfed89146107b8578063776d16c1146107c0578063782661bc146107dd5780637cb2b79c146109025780637df73e27146109285780637fbc79c61461094e5780637fece36814610a78578063807c9782146103d357806382553aad14610aac5780638b7677f414610ac957806395082d2514610ae6578063a2b47c1614610aee578063a374242514610af6578063a6eca89614610b1c578063b0a2566614610b24578063b3606b5614610b2c578063b70c7b7014610b34578063c8390a4814610b51578063c84a912414610c74578063cab44b7614610c7c578063ce98dfa814610cda578063cfad57a214610cf9578063cfed246b14610d1f578063d6a153f114610d45578063d925351a14610d62578063de0d1b9414610d7f578063dfb481c914610d9c578063e64559ad14610da4578063e68a22c014610dac578063eeaa783a14610db4578063f90ce5ba14610dbc575b600080fd5b610300600480360360208110156102f057600080fd5b50356001600160a01b0316610dc4565b604080519115158252519081900360200190f35b61031c610dd9565b60408051918252519081900360200190f35b6103d16004803603604081101561034457600080fd5b810190602081018135600160201b81111561035e57600080fd5b82018360208201111561037057600080fd5b803590602001918460208302840111600160201b8311171561039157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610ddf915050565b005b61031c610f56565b6103e3610f5e565b604080516001600160a01b039092168252519081900360200190f35b61031c610f6d565b6103e3610f73565b6103d16004803603602081101561042557600080fd5b5035610f82565b6103d16004803603602081101561044257600080fd5b50356001600160a01b0316610fd4565b6103d16004803603604081101561046857600080fd5b5080359060200135611043565b6103d16004803603604081101561048b57600080fd5b506001600160a01b038135169060200135151561109f565b6103d1600480360360208110156104b957600080fd5b50356001600160a01b0316611117565b61031c611186565b6103e361118c565b6103d1600480360360208110156104ef57600080fd5b503561119b565b6103d16004803603604081101561050c57600080fd5b506001600160a01b03813516906020013515156111ed565b6103d1600480360360e081101561053a57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c00135611265565b610300611469565b61031c611479565b6103d16004803603602081101561059457600080fd5b503561147f565b6103d1600480360360408110156105b157600080fd5b810190602081018135600160201b8111156105cb57600080fd5b8201836020820111156105dd57600080fd5b803590602001918460208302840111600160201b831117156105fe57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561064d57600080fd5b82018360208201111561065f57600080fd5b803590602001918460208302840111600160201b8311171561068057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611512945050505050565b61031c600480360360208110156106d457600080fd5b50356115bd565b6103e3600480360360208110156106f157600080fd5b50356115db565b6103006004803603602081101561070e57600080fd5b50356001600160a01b0316611602565b61031c611617565b61031c61161d565b610300611623565b6103006004803603602081101561074c57600080fd5b50356001600160a01b0316611633565b6103d16116be565b61031c6117d1565b6107926004803603602081101561078257600080fd5b50356001600160a01b03166117d7565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61031c611855565b6103d1600480360360208110156107d657600080fd5b503561185b565b6103d1600480360360608110156107f357600080fd5b810190602081018135600160201b81111561080d57600080fd5b82018360208201111561081f57600080fd5b803590602001918460208302840111600160201b8311171561084057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561088f57600080fd5b8201836020820111156108a157600080fd5b803590602001918460208302840111600160201b831117156108c257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506118ad915050565b6103d16004803603602081101561091857600080fd5b50356001600160a01b031661197b565b6103006004803603602081101561093e57600080fd5b50356001600160a01b03166119ea565b6103d16004803603606081101561096457600080fd5b81359190810190604081016020820135600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0757600080fd5b820183602082011115610a1957600080fd5b803590602001918460208302840111600160201b83111715610a3a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506119ff945050505050565b61031c60048036036060811015610a8e57600080fd5b506001600160a01b0381351690602081013590604001351515611b58565b6103d160048036036020811015610ac257600080fd5b5035611cde565b6103d160048036036020811015610adf57600080fd5b5035611d30565b61031c611d82565b61031c611d92565b61031c60048036036020811015610b0c57600080fd5b50356001600160a01b0316611d99565b61031c611dab565b61031c611db1565b61031c611db7565b6103d160048036036020811015610b4a57600080fd5b5035611dbd565b6103d160048036036040811015610b6757600080fd5b810190602081018135600160201b811115610b8157600080fd5b820183602082011115610b9357600080fd5b803590602001918460208302840111600160201b83111715610bb457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c0357600080fd5b820183602082011115610c1557600080fd5b803590602001918460208302840111600160201b83111715610c3657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e0f945050505050565b6103d1611ed9565b610ca260048036036020811015610c9257600080fd5b50356001600160a01b0316611ff0565b604080516001600160a01b03909516855263ffffffff9384166020860152918316848301529091166060830152519081900360800190f35b6103d160048036036020811015610cf057600080fd5b5035151561202f565b6103d160048036036020811015610d0f57600080fd5b50356001600160a01b031661209a565b61031c60048036036020811015610d3557600080fd5b50356001600160a01b0316612109565b6103d160048036036020811015610d5b57600080fd5b503561211b565b6103d160048036036020811015610d7857600080fd5b503561216d565b6103d160048036036020811015610d9557600080fd5b50356121bf565b61031c612211565b61031c612217565b61031c61221d565b6103e3612228565b61031c612237565b60156020526000908152604090205460ff1681565b60065481565b3360009081526010602052604090205460ff16610e31576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b6000610e3c8261223d565b90508015610f50576002546001546001600160a01b03918216911660005b8551811015610f4c576000868281518110610e7157fe5b6020026020010151905060005b6008811015610f4257601654600884028201908110610ea35750505050505050610f52565b60168054602084029185831c63ffffffff169160009190600889028701908110610ec957fe5b6000918252602082200154601780546001600160a01b0390921693509060088a028801908110610ef557fe5b60009182526020822001549150610f2282610f1c8668327cb2734119d3b7a9601e1b612349565b906123ab565b9050610f3083828c8e6123ea565b505060019094019350610e7e92505050565b5050600101610e5a565b5050505b505b5050565b63ffffffff81565b6002546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b03163314610fcf576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600455565b6000546001600160a01b03163314611021576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526010602052604090205460ff16611095576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b610f52828261267f565b6000546001600160a01b031633146110ec576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611164576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600e5481565b6003546001600160a01b031681565b6003546001600160a01b031633146111e8576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b600c55565b6000546001600160a01b0316331461123a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b3360009081526010602052604090205460ff166112b7576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b6112c1868661267f565b6000879050600061133784836001600160a01b0316639b5786206040518163ffffffff1660e01b815260040160206040518083038186803b15801561130557600080fd5b505afa158015611319573d6000803e3d6000fd5b505050506040513d602081101561132f57600080fd5b505190612755565b9050600061137884846001600160a01b0316631bca8cf06040518163ffffffff1660e01b815260040160206040518083038186803b15801561130557600080fd5b905081871115611386578196505b80861115611392578095505b60408051629a208160e81b81526004810189905233602482015290516001600160a01b03851691639a20810091604480830192600092919082900301818387803b1580156113df57600080fd5b505af11580156113f3573d6000803e3d6000fd5b50506040805163f3883d8b60e01b8152600481018a905233602482015290516001600160a01b038716935063f3883d8b9250604480830192600092919082900301818387803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b5050505050505050505050505050565b600054600160a01b900460ff1681565b600b5481565b6000546001600160a01b031633146114cc576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b61070881111561150d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c076025913960400191505060405180910390fd5b600655565b6003546001600160a01b0316331461155f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b60005b8251811015610f5057600083828151811061157957fe5b6020026020010151905082828151811061158f57fe5b6020908102919091018101516001600160a01b03909216600090815260139091526040902055600101611562565b601781815481106115ca57fe5b600091825260209091200154905081565b601681815481106115e857fe5b6000918252602090912001546001600160a01b0316905081565b60106020526000908152604090205460ff1681565b60045481565b61070881565b600054600160a81b900460ff1681565b60008054600160a81b900460ff161561164e575060006116b9565b600e54600f5410611661575060006116b9565b60008061166d846117d7565b93509350505081811180156116a257506001600160a01b0384166000908152601360205260409020546116a082846127ad565b115b156116b2576000925050506116b9565b6001925050505b919050565b3360009081526014602052604090205460ff16611710576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b3360009081526015602052604090205460ff16611774576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601560205260409020805460ff19169055600f546117999060016127ad565b600f556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600d5481565b6000806000806117e5612aff565b505050506001600160a01b039182166000908152601260209081526040918290208251608081018452905494851680825263ffffffff600160a01b87048116938301849052600160c01b87048116948301859052600160e01b909604909516606090910181905293949093919250565b60085481565b6000546001600160a01b031633146118a8576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600b55565b3360009081526010602052604090205460ff166118ff576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b600061190a8261223d565b90508015611975576002546001546001600160a01b03918216911660005b865181101561197157600087828151811061193f57fe5b602002602001015190506119688188848151811061195957fe5b602002602001015185876123ea565b50600101611928565b5050505b50505050565b6003546001600160a01b031633146119c8576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60146020526000908152604090205460ff1681565b6000546001600160a01b03163314611a4c576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1615611a955760405162461bcd60e51b8152600401808060200182810382526022815260200180612d6a6022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600e8490555b8251811015611b01576000838281518110611ac557fe5b6020908102919091018101516001600160a01b03166000908152601490915260409020805460ff19166001908117909155919091019050611aae565b5060005b8151811015611975576000828281518110611b1c57fe5b6020908102919091018101516001600160a01b03166000908152601090915260409020805460ff19166001908117909155919091019050611b05565b6000611b7160075460045461275590919063ffffffff16565b421115611bcc578115611bac57611ba5612710610f1c611b9e60095461271061275590919063ffffffff16565b8690612349565b9050611cd7565b611ba5612710610f1c611b9e6009546127106127ad90919063ffffffff16565b600654600454611bdb91612755565b421115611c28578115611c0857611ba5612710610f1c611b9e60085461271061275590919063ffffffff16565b611ba5612710610f1c611b9e6008546127106127ad90919063ffffffff16565b6001600160a01b03841660009081526011602052604090205480611c4f5783915050611cd7565b6000818511611c6757611c6282866127ad565b611c71565b611c7185836127ad565b9050611c8385610f1c83612710612349565b90506000611c9087611633565b1580611c9d5750600d5482115b90508015611cd1578415611cc457828611611cb85782611cba565b855b9350505050611cd7565b828610611cb85782611cba565b50909150505b9392505050565b6003546001600160a01b03163314611d2b576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b600d55565b6000546001600160a01b03163314611d7d576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600755565b68327cb2734119d3b7a9601e1b81565b6298968081565b60136020526000908152604090205481565b60095481565b600f5481565b600a5481565b6000546001600160a01b03163314611e0a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600855565b6000546001600160a01b03163314611e5c576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b8051825114611eb2576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611ec5906016906020850190612b26565b508051610f50906017906020840190612b8b565b3360009081526014602052604090205460ff16611f2b576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b3360009081526015602052604090205460ff1615611f8f576040805162461bcd60e51b815260206004820152601c60248201527b11985cdd141c9a58d9519959590e88185b1c9958591e481d9bdd195960221b604482015290519081900360640190fd5b336000908152601560205260409020805460ff19166001908117909155600f54611fb891612755565b600f556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6012602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b6000546001600160a01b0316331461207c576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b031633146120e7576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60116020526000908152604090205481565b6000546001600160a01b03163314612168576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600a55565b6003546001600160a01b031633146121ba576040805162461bcd60e51b81526020600482015260186024820152600080516020612c76833981519152604482015290519081900360640190fd5b600e55565b6000546001600160a01b0316331461220c576040805162461bcd60e51b81526020600482015260156024820152600080516020612c56833981519152604482015290519081900360640190fd5b600955565b600c5481565b60075481565b6001600160a01b0381565b6001546001600160a01b031681565b60055481565b600a546000901561229657600a546005546122599043906127ad565b10156122965760405162461bcd60e51b815260040180806020018281038252602e815260200180612d13602e913960400191505060405180910390fd5b600b546122a342826127ad565b83116122e05760405162461bcd60e51b815260040180806020018281038252602d815260200180612ce6602d913960400191505060405180910390fd5b6122ea4282612755565b83106123275760405162461bcd60e51b815260040180806020018281038252602f815260200180612c96602f913960400191505060405180910390fd5b60045483101561233b5760009150506116b9565b505060045543600555600190565b600082612358575060006123a5565b8282028284828161236557fe5b04146123a25760405162461bcd60e51b8152600401808060200182810382526021815260200180612cc56021913960400191505060405180910390fd5b90505b92915050565b60006123a283836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b8152506127ef565b6001600160a01b03821615612659576000826001600160a01b03166356bf9de4866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561244857600080fd5b505afa15801561245c573d6000803e3d6000fd5b505050506040513d602081101561247257600080fd5b50516001600160a01b03861660009081526011602052604081205491925080808061249c8a6117d7565b935093509350935060008411156125635760008487116124c5576124c085886127ad565b6124cf565b6124cf87866127ad565b905060008a87116124e9576124e48b886127ad565b6124f3565b6124f3878c6127ad565b905061250a600c54426123ab90919063ffffffff16565b600c546125189087906123ab565b146125265760009350600092505b61254161253a87610f1c8562989680612349565b8590612755565b935061255e61255788610f1c8462989680612349565b8490612755565b925050505b818111801561259257506001600160a01b038a1660009081526013602052604090205461259082846127ad565b115b156125ef57604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517fe582322b389ad06b2bbf619cd6da3f16a288ec873ea0fa6df4d72f3d9480b4479181900360a00190a15b6125fb8a878484612891565b604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517f23b9387f81fca646aac1dc4487ede045c65f5f7445482906565f01e05afdb3a89181900360a00190a15050505050505b6001600160a01b0384166000908152601160205260409020839055611975818585612a27565b600061268a8261223d565b90508015610f50576002546001546001600160a01b03918216911660005b6008811015610f4c57601654819081106126c6575050505050610f52565b60168054602084029189831c63ffffffff169160009190869081106126e757fe5b6000918252602082200154601780546001600160a01b039092169350908790811061270e57fe5b6000918252602082200154915061273582610f1c8668327cb2734119d3b7a9601e1b612349565b905061274383828a8c6123ea565b5050600190940193506126a892505050565b6000828201838110156123a2576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60006123a283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612aa5565b6000818361287b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612840578181015183820152602001612828565b50505050905090810190601f16801561286d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161288757fe5b0495945050505050565b6001600160a01b0383106128ec576040805162461bcd60e51b815260206004820152601f60248201527f466173745072696365466565643a20696e76616c696420726566507269636500604482015290519081900360640190fd5b63ffffffff821061292e5760405162461bcd60e51b8152600401808060200182810382526029815260200180612d416029913960400191505060405180910390fd5b63ffffffff81106129705760405162461bcd60e51b815260040180806020018281038252602a815260200180612c2c602a913960400191505060405180910390fd5b604080516080810182526001600160a01b03948516815263ffffffff4281166020808401918252958216838501908152948216606084019081529787166000908152601290965292909420905181549251935196518516600160e01b026001600160e01b03978616600160c01b0263ffffffff60c01b1995909616600160a01b0263ffffffff60a01b19929097166001600160a01b0319909416939093171694909417919091169190911792909216919091179055565b6001600160a01b038316612a3a57610f50565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612a9157600080fd5b505af1158015611971573d6000803e3d6000fd5b60008184841115612af75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612840578181015183820152602001612828565b505050900390565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054828255906000526020600020908101928215612b7b579160200282015b82811115612b7b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b46565b50612b87929150612bd2565b5090565b828054828255906000526020600020908101928215612bc6579160200282015b82811115612bc6578251825591602001919060010190612bab565b50612b87929150612bf1565b5b80821115612b875780546001600160a01b0319168155600101612bd3565b5b80821115612b875760008155600101612bf256fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e466173745072696365466565643a20696e76616c69642063756d756c61746976654661737444656c7461476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20696e76616c69642063756d756c617469766552656644656c7461466173745072696365466565643a20616c726561647920696e697469616c697a6564a164736f6c634300060c000a466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000008bc8ef0b71238055f9ee6bbc90869d8d0dbdcca00000000000000000000000026c2710e3c232461159a4564677a24a80ab2253c

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

000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000008bc8ef0b71238055f9ee6bbc90869d8d0dbdcca00000000000000000000000026c2710e3c232461159a4564677a24a80ab2253c

-----Decoded View---------------
Arg [0] : _priceDuration (uint256): 300
Arg [1] : _maxPriceUpdateDelay (uint256): 3600
Arg [2] : _minBlockInterval (uint256): 0
Arg [3] : _maxDeviationBasisPoints (uint256): 100
Arg [4] : _fastPriceEvents (address): 0x08bc8ef0b71238055f9ee6bbc90869d8d0dbdcca
Arg [5] : _tokenManager (address): 0x26c2710e3c232461159a4564677a24a80ab2253c

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 00000000000000000000000008bc8ef0b71238055f9ee6bbc90869d8d0dbdcca
Arg [5] : 00000000000000000000000026c2710e3c232461159a4564677a24a80ab2253c


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