Contract 0x198634d01a8e1646fae8676904343c33b1d2c6b9 1

 

Contract Overview

Balance:
0 FTM

FTM Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x23072de868248cf737847380cdd7fc598ea05fd8b5eeed9d3d69b9cfb4e6cdf5Set Prices With ...580454012023-03-21 9:40:573 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.041932861199
0xb8fcd16502a60d03db9c3b49da7bffaebbcf7d1aaa067e4649f3855cc795e16fSet Prices With ...580453732023-03-21 9:40:143 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.046647611989
0x36157189d13dfc727476bf249a676aa0ecaf0e64f4ebff6073c51ba863389e82Set Prices With ...580452522023-03-21 9:37:123 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.011630260309
0xbf3ce5cc6ded57393199c8cd73b9c6e5f218a24f15601a344b075cd34c3f0f19Set Prices With ...580451992023-03-21 9:35:563 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.011428451614
0x5cfdc80ebd790deaf473f411a7eac8b6078a0d8abdf2f9f3096eae010da176faSet Prices With ...580450662023-03-21 9:33:223 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.011368446034
0x1ead5155374474a053d1f7597e2fbb005f4a64f47f1391ef4e600725469a11e7Set Prices With ...580449102023-03-21 9:30:223 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.047195784142
0x5305ce13af80b086d41fb06e3cadf0da97d52c9f5b6556fe6a53f1fd028a193eSet Prices With ...580448852023-03-21 9:29:543 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.050920322726
0x66cd4ca7b91a75bf8b420955e5568ae54404e728eb23094e476fb6f602357ffbSet Prices With ...580448032023-03-21 9:28:303 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.047098603529
0xc75373a8c6ab2820f5db974f4aec476197dea0ad44875b89b25b3ef394918826Set Prices With ...580447692023-03-21 9:27:563 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.047096112745
0x9116e93a162714d3ed34d42f4397a4b4b85d03624d4fbd0576daf8b5c6328494Set Prices With ...580447552023-03-21 9:27:383 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.049521168136
0x1d4e511b6ac222113cf4fc26de2a2cae9005bffc1aa2f8f6ef1bc9e0cad3bb66Set Prices With ...580447102023-03-21 9:26:493 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.050327887844
0x4489a86cc7be940cfdeccc5113b8c009d9d7e996e4a423aad3c5764d76f42ad2Set Prices With ...580446882023-03-21 9:26:273 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.0117119963
0x68c7d4963cf0be7c66a381d0711b1c32464ba2ee16982617e902a6e83afc6ddbSet Prices With ...580445222023-03-21 9:23:253 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.051796475517
0xea56184061ec08c9ca780da81c7d0df81eb2b2d4c3547273a9c4fc4c863185ecSet Prices With ...580444782023-03-21 9:22:253 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.01346311179
0x65971e62b511d6224b2c179716abb8ef7d00f2a58080ba0bcf280d28b187283eSet Prices With ...580444732023-03-21 9:22:223 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.108934189521
0x0852d14f440b95fb27defd0986ac20a385279eb8b9abf5552d9ba2f0ad486bbaSet Prices With ...580444102023-03-21 9:21:183 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.043013260881
0xcfb9d8788221b095e6627014bb4e74486370c4462d5e733432845cf6c1064efbSet Prices With ...580444012023-03-21 9:21:103 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.104470968033
0x998e57131d8d5bc5123b3ca901697818a3a3fbc13612ae886e38ab33bccdf175Set Prices With ...580443822023-03-21 9:20:483 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.012112343801
0x2d09f4c1bee8265f061d19d2a491b554310886b568a99ffe342891f1075c3d46Set Prices With ...580442192023-03-21 9:17:483 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.048101537711
0x8bae6658c83d52426ed546ed093ecec8c6782084573c365691d695179d8e9a95Set Prices With ...580441442023-03-21 9:16:313 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.012125570833
0xf3ceb8cd020c19d954b9e7eb5d99ababd621d255d55325da4bff2e7adfb6b017Set Prices With ...580441092023-03-21 9:15:593 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.012169177598
0xbe3f54f9973ce7e56e7ad174a5cf74fc67b6687bb3c1637dd674857b9b097989Set Prices With ...580440552023-03-21 9:14:543 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.011991028692
0xa2a81b5865cd6deea9d94f29d5fc51063fbe307f76db5d0b2d6a5186c6aa2e55Set Prices With ...580438962023-03-21 9:11:523 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.012045915175
0x97947fc903aebc54942650d21005918e0456ed58138466279440845d4571a66cSet Prices With ...580437312023-03-21 9:08:573 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.028646338167
0x864b121e77695e27cce5c5049625764e3038a5375ded65f3ada54650a1d62e1bSet Prices With ...580436702023-03-21 9:07:283 days 16 hrs ago0x53b9ad09b82a313ec07040f6d8cb07bb6fd6e7ce IN  0x198634d01a8e1646fae8676904343c33b1d2c6b90 FTM0.103520613273
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xf58c00042731a54a3c325d8018a590b4d2e096a6b7b36caea24e820625f4fa1d517100762022-12-01 10:00:08113 days 15 hrs ago Mummy Finance: Deployer  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FastPriceFeed

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 8 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-12-05
*/

// 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;
    }
}


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


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


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


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


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


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


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

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

    uint256 public constant PRICE_PRECISION = 10 ** 30;

    uint256 public constant CUMULATIVE_DELTA_PRECISION = 10 * 1000 * 1000;

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

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

    uint256 public constant BASIS_POINTS_DIVISOR = 10000;

    uint256 public constant MAX_PRICE_DURATION = 30 minutes;

    bool public isInitialized;
    bool public isSpreadEnabled = false;

    address public vaultPriceFeed;
    address public fastPriceEvents;

    address public tokenManager;

    address public positionRouter;

    uint256 public override lastUpdatedAt;
    uint256 public override lastUpdatedBlock;

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

    uint256 public priceDataInterval;

    // allowed deviation from primary price
    uint256 public maxDeviationBasisPoints;

    uint256 public minAuthorizations;
    uint256 public disableFastPriceVoteCount = 0;

    mapping (address => bool) public isUpdater;

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

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

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

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

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

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

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

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

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

        minAuthorizations = _minAuthorizations;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit DisableFastPrice(msg.sender);
    }

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

        emit EnableFastPrice(msg.sender);
    }

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

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

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

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

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

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

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

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

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

        return fastPrice;
    }

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

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

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

        return true;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        lastUpdatedAt = _timestamp;
        lastUpdatedBlock = block.number;

        return true;
    }
}

Contract Security Audit

Contract ABI

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

60806040526000805460ff60a81b1916815560105534801561002057600080fd5b5060405162002f2c38038062002f2c833981810160405260e081101561004557600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151600080546001600160a01b0319163317905594959394929391929091906107088711156100c65760405162461bcd60e51b815260040180806020018281038252602581526020018062002f076025913960400191505060405180910390fd5b600796909655600894909455600b92909255600e55600280546001600160a01b039283166001600160a01b031991821617909155600380549383169382169390931790925560048054919093169116179055612ddf80620001286000396000f3fe608060405234801561001057600080fd5b50600436106102e05760003560e01c806303b04936146102e557806303cd25711461031f57806303f4d7dc146103395780630604ddea146103de5780630e9272ea146103e6578063126082cf1461040a57806312d43a511461041257806314dd2dce1461041a578063162ac4e01461043757806317835d1c1461045d5780631a15339114610480578063238aafb7146104ae578063287800c9146104d45780632a709b14146104dc5780632e9cd94b146104e457806331cb610514610501578063392e53cd1461052f5780633aa08f861461053757806344c231931461053f5780634bd66c1c146103de5780634c0e31c81461055c5780634d11fb4a1461067f5780634f64b2be1461069c5780634fdfb086146106b957806354aea127146106df578063574ec1be146106e757806361ef161f14610722578063668d3d651461072a578063695d4184146107325780636c56fd051461073a5780636ccd47c414610760578063715c75361461076857806372279ba11461077057806374bfed89146107bc578063776d16c1146107c4578063782661bc146107e15780637cb2b79c146109065780637df73e271461092c5780637fbc79c6146109525780637fece36814610a7c578063807c9782146103de57806382553aad14610ab05780638b7677f414610acd57806395082d2514610aea578063a2b47c1614610af2578063a374242514610afa578063a6eca89614610b20578063b0a2566614610b28578063b3606b5614610b30578063b70c7b7014610b38578063c8390a4814610b55578063c84a912414610c78578063cab44b7614610c80578063ce98dfa814610cde578063cfad57a214610cfd578063cfed246b14610d23578063d6a153f114610d49578063d925351a14610d66578063de0d1b9414610d83578063dfb481c914610da0578063e64559ad14610da8578063e68a22c014610db0578063eeaa783a14610db8578063f90ce5ba14610dc0575b600080fd5b61030b600480360360208110156102fb57600080fd5b50356001600160a01b0316610dc8565b604080519115158252519081900360200190f35b610327610ddd565b60408051918252519081900360200190f35b6103dc6004803603604081101561034f57600080fd5b810190602081018135600160201b81111561036957600080fd5b82018360208201111561037b57600080fd5b803590602001918460208302840111600160201b8311171561039c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610de3915050565b005b610327610f5a565b6103ee610f62565b604080516001600160a01b039092168252519081900360200190f35b610327610f71565b6103ee610f77565b6103dc6004803603602081101561043057600080fd5b5035610f86565b6103dc6004803603602081101561044d57600080fd5b50356001600160a01b0316610fd8565b6103dc6004803603604081101561047357600080fd5b5080359060200135611047565b6103dc6004803603604081101561049657600080fd5b506001600160a01b03813516906020013515156110a3565b6103dc600480360360208110156104c457600080fd5b50356001600160a01b031661111b565b61032761118a565b6103ee611190565b6103dc600480360360208110156104fa57600080fd5b503561119f565b6103dc6004803603604081101561051757600080fd5b506001600160a01b03813516906020013515156111f1565b61030b611269565b610327611279565b6103dc6004803603602081101561055557600080fd5b503561127f565b6103dc6004803603604081101561057257600080fd5b810190602081018135600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460208302840111600160201b831117156105bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060e57600080fd5b82018360208201111561062057600080fd5b803590602001918460208302840111600160201b8311171561064157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611312945050505050565b6103276004803603602081101561069557600080fd5b50356113bd565b6103ee600480360360208110156106b257600080fd5b50356113db565b61030b600480360360208110156106cf57600080fd5b50356001600160a01b0316611402565b610327611417565b6103dc600480360360c08110156106fd57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561141d565b6103ee61162c565b61032761163b565b61030b611641565b61030b6004803603602081101561075057600080fd5b50356001600160a01b0316611651565b6103dc6116dc565b6103276117ef565b6107966004803603602081101561078657600080fd5b50356001600160a01b03166117f5565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610327611873565b6103dc600480360360208110156107da57600080fd5b5035611879565b6103dc600480360360608110156107f757600080fd5b810190602081018135600160201b81111561081157600080fd5b82018360208201111561082357600080fd5b803590602001918460208302840111600160201b8311171561084457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561089357600080fd5b8201836020820111156108a557600080fd5b803590602001918460208302840111600160201b831117156108c657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506118cb915050565b6103dc6004803603602081101561091c57600080fd5b50356001600160a01b0316611999565b61030b6004803603602081101561094257600080fd5b50356001600160a01b0316611a08565b6103dc6004803603606081101561096857600080fd5b81359190810190604081016020820135600160201b81111561098957600080fd5b82018360208201111561099b57600080fd5b803590602001918460208302840111600160201b831117156109bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0b57600080fd5b820183602082011115610a1d57600080fd5b803590602001918460208302840111600160201b83111715610a3e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a1d945050505050565b61032760048036036060811015610a9257600080fd5b506001600160a01b0381351690602081013590604001351515611b76565b6103dc60048036036020811015610ac657600080fd5b5035611cfc565b6103dc60048036036020811015610ae357600080fd5b5035611d4e565b610327611da0565b610327611db0565b61032760048036036020811015610b1057600080fd5b50356001600160a01b0316611db7565b610327611dc9565b610327611dcf565b610327611dd5565b6103dc60048036036020811015610b4e57600080fd5b5035611ddb565b6103dc60048036036040811015610b6b57600080fd5b810190602081018135600160201b811115610b8557600080fd5b820183602082011115610b9757600080fd5b803590602001918460208302840111600160201b83111715610bb857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c0757600080fd5b820183602082011115610c1957600080fd5b803590602001918460208302840111600160201b83111715610c3a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e2d945050505050565b6103dc611ef7565b610ca660048036036020811015610c9657600080fd5b50356001600160a01b031661200e565b604080516001600160a01b03909516855263ffffffff9384166020860152918316848301529091166060830152519081900360800190f35b6103dc60048036036020811015610cf457600080fd5b5035151561204d565b6103dc60048036036020811015610d1357600080fd5b50356001600160a01b03166120b8565b61032760048036036020811015610d3957600080fd5b50356001600160a01b0316612127565b6103dc60048036036020811015610d5f57600080fd5b5035612139565b6103dc60048036036020811015610d7c57600080fd5b503561218b565b6103dc60048036036020811015610d9957600080fd5b50356121dd565b61032761222f565b610327612235565b61032761223b565b6103ee612246565b610327612255565b60166020526000908152604090205460ff1681565b60075481565b3360009081526011602052604090205460ff16610e35576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b6000610e408261225b565b90508015610f54576002546001546001600160a01b03918216911660005b8551811015610f50576000868281518110610e7557fe5b6020026020010151905060005b6008811015610f4657601754600884028201908110610ea75750505050505050610f56565b60178054602084029185831c63ffffffff169160009190600889028701908110610ecd57fe5b6000918252602082200154601880546001600160a01b0390921693509060088a028801908110610ef957fe5b60009182526020822001549150610f2682610f208668327cb2734119d3b7a9601e1b612367565b906123c9565b9050610f3483828c8e612408565b505060019094019350610e8292505050565b5050600101610e5e565b5050505b505b5050565b63ffffffff81565b6002546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b03163314610fd3576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600555565b6000546001600160a01b03163314611025576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526011602052604090205460ff16611099576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b610f56828261269d565b6000546001600160a01b031633146110f0576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611168576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b6003546001600160a01b031681565b6003546001600160a01b031633146111ec576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600d55565b6000546001600160a01b0316331461123e576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600054600160a01b900460ff1681565b600c5481565b6000546001600160a01b031633146112cc576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b61070881111561130d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c256025913960400191505060405180910390fd5b600755565b6003546001600160a01b0316331461135f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60005b8251811015610f5457600083828151811061137957fe5b6020026020010151905082828151811061138f57fe5b6020908102919091018101516001600160a01b03909216600090815260149091526040902055600101611362565b601881815481106113ca57fe5b600091825260209091200154905081565b601781815481106113e857fe5b6000918252602090912001546001600160a01b0316905081565b60116020526000908152604090205460ff1681565b60055481565b3360009081526011602052604090205460ff1661146f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b611479868661269d565b60048054604080516304dabc3160e51b815290516001600160a01b03909216926000926114f99287928692639b57862092808301926020929182900301818987803b1580156114c757600080fd5b505af11580156114db573d6000803e3d6000fd5b505050506040513d60208110156114f157600080fd5b505190612773565b9050600061153c84846001600160a01b0316631bca8cf06040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114c757600080fd5b90508187111561154a578196505b80861115611556578095505b60408051629a208160e81b81526004810189905233602482015290516001600160a01b03851691639a20810091604480830192600092919082900301818387803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b50506040805163f3883d8b60e01b8152600481018a905233602482015290516001600160a01b038716935063f3883d8b9250604480830192600092919082900301818387803b15801561160957600080fd5b505af115801561161d573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160a01b031681565b61070881565b600054600160a81b900460ff1681565b60008054600160a81b900460ff161561166c575060006116d7565b600f546010541061167f575060006116d7565b60008061168b846117f5565b93509350505081811180156116c057506001600160a01b0384166000908152601460205260409020546116be82846127cb565b115b156116d0576000925050506116d7565b6001925050505b919050565b3360009081526015602052604090205460ff1661172e576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff16611792576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601660205260409020805460ff191690556010546117b79060016127cb565b6010556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600e5481565b600080600080611803612b1d565b505050506001600160a01b039182166000908152601360209081526040918290208251608081018452905494851680825263ffffffff600160a01b87048116938301849052600160c01b87048116948301859052600160e01b909604909516606090910181905293949093919250565b60095481565b6000546001600160a01b031633146118c6576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600c55565b3360009081526011602052604090205460ff1661191d576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60006119288261225b565b90508015611993576002546001546001600160a01b03918216911660005b865181101561198f57600087828151811061195d57fe5b602002602001015190506119868188848151811061197757fe5b60200260200101518587612408565b50600101611946565b5050505b50505050565b6003546001600160a01b031633146119e6576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6000546001600160a01b03163314611a6a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1615611ab35760405162461bcd60e51b8152600401808060200182810382526022815260200180612d886022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600f8490555b8251811015611b1f576000838281518110611ae357fe5b6020908102919091018101516001600160a01b03166000908152601590915260409020805460ff19166001908117909155919091019050611acc565b5060005b8151811015611993576000828281518110611b3a57fe5b6020908102919091018101516001600160a01b03166000908152601190915260409020805460ff19166001908117909155919091019050611b23565b6000611b8f60085460055461277390919063ffffffff16565b421115611bea578115611bca57611bc3612710610f20611bbc600a5461271061277390919063ffffffff16565b8690612367565b9050611cf5565b611bc3612710610f20611bbc600a546127106127cb90919063ffffffff16565b600754600554611bf991612773565b421115611c46578115611c2657611bc3612710610f20611bbc60095461271061277390919063ffffffff16565b611bc3612710610f20611bbc6009546127106127cb90919063ffffffff16565b6001600160a01b03841660009081526012602052604090205480611c6d5783915050611cf5565b6000818511611c8557611c8082866127cb565b611c8f565b611c8f85836127cb565b9050611ca185610f2083612710612367565b90506000611cae87611651565b1580611cbb5750600e5482115b90508015611cef578415611ce257828611611cd65782611cd8565b855b9350505050611cf5565b828610611cd65782611cd8565b50909150505b9392505050565b6003546001600160a01b03163314611d49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600e55565b6000546001600160a01b03163314611d9b576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600855565b68327cb2734119d3b7a9601e1b81565b6298968081565b60146020526000908152604090205481565b600a5481565b60105481565b600b5481565b6000546001600160a01b03163314611e28576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600955565b6000546001600160a01b03163314611e7a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b8051825114611ed0576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611ee3906017906020850190612b44565b508051610f54906018906020840190612ba9565b3360009081526015602052604090205460ff16611f49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff1615611fad576040805162461bcd60e51b815260206004820152601c60248201527b11985cdd141c9a58d9519959590e88185b1c9958591e481d9bdd195960221b604482015290519081900360640190fd5b336000908152601660205260409020805460ff19166001908117909155601054611fd691612773565b6010556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6013602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b6000546001600160a01b0316331461209a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314612105576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205481565b6000546001600160a01b03163314612186576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600b55565b6003546001600160a01b031633146121d8576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331461222a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600a55565b600d5481565b60085481565b6001600160a01b0381565b6001546001600160a01b031681565b60065481565b600b54600090156122b457600b546006546122779043906127cb565b10156122b45760405162461bcd60e51b815260040180806020018281038252602e815260200180612d31602e913960400191505060405180910390fd5b600c546122c142826127cb565b83116122fe5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d04602d913960400191505060405180910390fd5b6123084282612773565b83106123455760405162461bcd60e51b815260040180806020018281038252602f815260200180612cb4602f913960400191505060405180910390fd5b6005548310156123595760009150506116d7565b505060055543600655600190565b600082612376575060006123c3565b8282028284828161238357fe5b04146123c05760405162461bcd60e51b8152600401808060200182810382526021815260200180612ce36021913960400191505060405180910390fd5b90505b92915050565b60006123c083836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061280d565b6001600160a01b03821615612677576000826001600160a01b03166356bf9de4866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561246657600080fd5b505afa15801561247a573d6000803e3d6000fd5b505050506040513d602081101561249057600080fd5b50516001600160a01b0386166000908152601260205260408120549192508080806124ba8a6117f5565b935093509350935060008411156125815760008487116124e3576124de85886127cb565b6124ed565b6124ed87866127cb565b905060008a8711612507576125028b886127cb565b612511565b612511878c6127cb565b9050612528600d54426123c990919063ffffffff16565b600d546125369087906123c9565b146125445760009350600092505b61255f61255887610f208562989680612367565b8590612773565b935061257c61257588610f208462989680612367565b8490612773565b925050505b81811180156125b057506001600160a01b038a166000908152601460205260409020546125ae82846127cb565b115b1561260d57604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517fe582322b389ad06b2bbf619cd6da3f16a288ec873ea0fa6df4d72f3d9480b4479181900360a00190a15b6126198a8784846128af565b604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517f23b9387f81fca646aac1dc4487ede045c65f5f7445482906565f01e05afdb3a89181900360a00190a15050505050505b6001600160a01b0384166000908152601260205260409020839055611993818585612a45565b60006126a88261225b565b90508015610f54576002546001546001600160a01b03918216911660005b6008811015610f5057601754819081106126e4575050505050610f56565b60178054602084029189831c63ffffffff1691600091908690811061270557fe5b6000918252602082200154601880546001600160a01b039092169350908790811061272c57fe5b6000918252602082200154915061275382610f208668327cb2734119d3b7a9601e1b612367565b905061276183828a8c612408565b5050600190940193506126c692505050565b6000828201838110156123c0576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60006123c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ac3565b600081836128995760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561285e578181015183820152602001612846565b50505050905090810190601f16801561288b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816128a557fe5b0495945050505050565b6001600160a01b03831061290a576040805162461bcd60e51b815260206004820152601f60248201527f466173745072696365466565643a20696e76616c696420726566507269636500604482015290519081900360640190fd5b63ffffffff821061294c5760405162461bcd60e51b8152600401808060200182810382526029815260200180612d5f6029913960400191505060405180910390fd5b63ffffffff811061298e5760405162461bcd60e51b815260040180806020018281038252602a815260200180612c4a602a913960400191505060405180910390fd5b604080516080810182526001600160a01b03948516815263ffffffff4281166020808401918252958216838501908152948216606084019081529787166000908152601390965292909420905181549251935196518516600160e01b026001600160e01b03978616600160c01b0263ffffffff60c01b1995909616600160a01b0263ffffffff60a01b19929097166001600160a01b0319909416939093171694909417919091169190911792909216919091179055565b6001600160a01b038316612a5857610f54565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612aaf57600080fd5b505af115801561198f573d6000803e3d6000fd5b60008184841115612b155760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561285e578181015183820152602001612846565b505050900390565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054828255906000526020600020908101928215612b99579160200282015b82811115612b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b64565b50612ba5929150612bf0565b5090565b828054828255906000526020600020908101928215612be4579160200282015b82811115612be4578251825591602001919060010190612bc9565b50612ba5929150612c0f565b5b80821115612ba55780546001600160a01b0319168155600101612bf1565b5b80821115612ba55760008155600101612c1056fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e466173745072696365466565643a20696e76616c69642063756d756c61746976654661737444656c7461476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20696e76616c69642063756d756c617469766552656644656c7461466173745072696365466565643a20616c726561647920696e697469616c697a6564a2646970667358221220d75eadb6661d9b73682efc3275a329d669995d6d1dc6ffba90d510741f74757264736f6c634300060c0033466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000001e9b35785ef3f7ef2677c371442976bd550f32000000000000000000000000030b12942912cee5a719edec2dd147224fcc373a00000000000000000000000002d270f66fee6ac9e27ff6551af5a8cfb5c8a7493

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

000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000001e9b35785ef3f7ef2677c371442976bd550f32000000000000000000000000030b12942912cee5a719edec2dd147224fcc373a00000000000000000000000002d270f66fee6ac9e27ff6551af5a8cfb5c8a7493

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

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [4] : 00000000000000000000000001e9b35785ef3f7ef2677c371442976bd550f320
Arg [5] : 00000000000000000000000030b12942912cee5a719edec2dd147224fcc373a0
Arg [6] : 0000000000000000000000002d270f66fee6ac9e27ff6551af5a8cfb5c8a7493


Deployed ByteCode Sourcemap

8894:19835:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11066:54;;;;;;;;;;;;;;;;-1:-1:-1;11066:54:0;-1:-1:-1;;;;;11066:54:0;;:::i;:::-;;;;;;;;;;;;;;;;;;10313:28;;;:::i;:::-;;;;;;;;;;;;;;;;17173:1090;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17173:1090:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17173:1090:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17173:1090:0;;-1:-1:-1;;17173:1090:0;;;-1:-1:-1;17173:1090:0;;-1:-1:-1;;17173:1090:0:i;:::-;;9536:67;;;:::i;10107:30::-;;;:::i;:::-;;;;-1:-1:-1;;;;;10107:30:0;;;;;;;;;;;;;;9870:52;;;:::i;8609:18::-;;;:::i;15261:116::-;;;;;;;;;;;;;;;;-1:-1:-1;15261:116:0;;:::i;13804:122::-;;;;;;;;;;;;;;;;-1:-1:-1;13804:122:0;-1:-1:-1;;;;;13804:122:0;;:::i;18271:149::-;;;;;;;;;;;;;;;;-1:-1:-1;18271:149:0;;;;;;;:::i;13666:130::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13666:130:0;;;;;;;;;;:::i;13934:127::-;;;;;;;;;;;;;;;;-1:-1:-1;13934:127:0;-1:-1:-1;;;;;13934:127:0;;:::i;10700:32::-;;;:::i;10146:27::-;;;:::i;16036:150::-;;;;;;;;;;;;;;;;-1:-1:-1;16036:150:0;;:::i;13530:128::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13530:128:0;;;;;;;;;;:::i;9995:25::-;;;:::i;10527:31::-;;;:::i;14205:222::-;;;;;;;;;;;;;;;;-1:-1:-1;14205:222:0;;:::i;15696:332::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15696:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15696:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15696:332:0;;;;;;;;-1:-1:-1;15696:332:0;;-1:-1:-1;;;;;15696:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15696:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15696:332:0;;-1:-1:-1;15696:332:0;;-1:-1:-1;;;;;15696:332:0:i;11446:32::-;;;;;;;;;;;;;;;;-1:-1:-1;11446:32:0;;:::i;11209:23::-;;;;;;;;;;;;;;;;-1:-1:-1;11209:23:0;;:::i;10792:42::-;;;;;;;;;;;;;;;;-1:-1:-1;10792:42:0;-1:-1:-1;;;;;10792:42:0;;:::i;10220:37::-;;;:::i;18428:1194::-;;;;;;;;;;;;;;;;-1:-1:-1;18428:1194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10182:29::-;;;:::i;9931:55::-;;;:::i;10027:35::-;;;:::i;22959:868::-;;;;;;;;;;;;;;;;-1:-1:-1;22959:868:0;-1:-1:-1;;;;;22959:868:0;;:::i;19948:310::-;;;:::i;10653:38::-;;;:::i;23835:293::-;;;;;;;;;;;;;;;;-1:-1:-1;23835:293:0;-1:-1:-1;;;;;23835:293:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10389:42;;;:::i;14069:128::-;;;;;;;;;;;;;;;;-1:-1:-1;14069:128:0;;:::i;16623:542::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16623:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16623:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16623:542:0;;;;;;;;-1:-1:-1;16623:542:0;;-1:-1:-1;;;;;16623:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16623:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16623:542:0;;-1:-1:-1;;16623:542:0;;;-1:-1:-1;16623:542:0;;-1:-1:-1;;16623:542:0:i;15385:121::-;;;;;;;;;;;;;;;;-1:-1:-1;15385:121:0;-1:-1:-1;;;;;15385:121:0;;:::i;11018:41::-;;;;;;;;;;;;;;;;-1:-1:-1;11018:41:0;-1:-1:-1;;;;;11018:41:0;;:::i;12935:587::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12935:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12935:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12935:587:0;;;;;;;;-1:-1:-1;12935:587:0;;-1:-1:-1;;;;;12935:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12935:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12935:587:0;;-1:-1:-1;12935:587:0;;-1:-1:-1;;;;;12935:587:0:i;21168:1783::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21168:1783:0;;;;;;;;;;;;;;;:::i;15514:174::-;;;;;;;;;;;;;;;;-1:-1:-1;15514:174:0;;:::i;14435:149::-;;;;;;;;;;;;;;;;-1:-1:-1;14435:149:0;;:::i;9335:50::-;;;:::i;9394:69::-;;;:::i;10950:59::-;;;;;;;;;;;;;;;;-1:-1:-1;10950:59:0;-1:-1:-1;;;;;10950:59:0;;:::i;10438:44::-;;;:::i;10739:::-;;;:::i;10489:31::-;;;:::i;14592:181::-;;;;;;;;;;;;;;;;-1:-1:-1;14592:181:0;;:::i;16343:272::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16343:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16343:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16343:272:0;;;;;;;;-1:-1:-1;16343:272:0;;-1:-1:-1;;;;;16343:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16343:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16343:272:0;;-1:-1:-1;16343:272:0;;-1:-1:-1;;;;;16343:272:0:i;19630:310::-;;;:::i;10892:51::-;;;;;;;;;;;;;;;;-1:-1:-1;10892:51:0;-1:-1:-1;;;;;10892:51:0;;:::i;:::-;;;;-1:-1:-1;;;;;10892:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15123:130;;;;;;;;;;;;;;;;-1:-1:-1;15123:130:0;;;;:::i;8809:76::-;;;;;;;;;;;;;;;;-1:-1:-1;8809:76:0;-1:-1:-1;;;;;8809:76:0;;:::i;10843:42::-;;;;;;;;;;;;;;;;-1:-1:-1;10843:42:0;-1:-1:-1;;;;;10843:42:0;;:::i;14978:137::-;;;;;;;;;;;;;;;;-1:-1:-1;14978:137:0;;:::i;16194:141::-;;;;;;;;;;;;;;;;-1:-1:-1;16194:141:0;;:::i;14781:189::-;;;;;;;;;;;;;;;;-1:-1:-1;14781:189:0;;:::i;10567:32::-;;;:::i;10348:34::-;;;:::i;9472:57::-;;;:::i;10071:29::-;;;:::i;10264:40::-;;;:::i;11066:54::-;;;;;;;;;;;;;;;:::o;10313:28::-;;;;:::o;17173:1090::-;12031:10;12021:21;;;;:9;:21;;;;;;;;12013:58;;;;;-1:-1:-1;;;12013:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12013:58:0;;;;;;;;;;;;;;;17286:17:::1;17306:33;17328:10;17306:21;:33::i;:::-;17286:53;;17356:12;17352:904;;;17412:15;::::0;;17468:14;-1:-1:-1;;;;;17412:15:0;;::::1;::::0;17468:14:::1;17385:24;17499:746;17523:14;:21;17519:1;:25;17499:746;;;17570:17;17590:14;17605:1;17590:17;;;;;;;;;;;;;;17570:37;;17633:9;17628:602;17652:1;17648;:5;17628:602;;;17744:6;:13:::0;17703:1:::1;17699:5:::0;::::1;:9:::0;::::1;::::0;17735:22;::::1;17731:39;;17761:7;;;;;;;;;17731:39;17935:6;:17:::0;;17813:2:::1;:6:::0;::::1;::::0;17859:21;;::::1;9836:25:::0;17858:36:::1;::::0;17794:16:::1;::::0;17935:6;17946:1:::1;17942:5:::0;::::1;:9:::0;::::1;::::0;17935:17;::::1;;;;;;::::0;;;::::1;::::0;;::::1;::::0;18000:15:::1;:26:::0;;-1:-1:-1;;;;;17935:17:0;;::::1;::::0;-1:-1:-1;18000:15:0;18020:1:::1;18016:5:::0;::::1;:9:::0;::::1;::::0;18000:26;::::1;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;18073:46:0::1;18000:26:::0;18073::::1;:5:::0;-1:-1:-1;;;18073:9:0::1;:26::i;:::-;:30:::0;::::1;:46::i;:::-;18049:70;;18144:66;18154:5;18161:13;18176:15;18193:16;18144:9;:66::i;:::-;-1:-1:-1::0;;17655:3:0::1;::::0;;::::1;::::0;-1:-1:-1;17628:602:0::1;::::0;-1:-1:-1;;;17628:602:0::1;;-1:-1:-1::0;;17546:3:0::1;;17499:746;;;;17352:904;;;12082:1;;17173:1090:::0;;:::o;9536:67::-;9587:16;9536:67;:::o;10107:30::-;;;-1:-1:-1;;;;;10107:30:0;;:::o;9870:52::-;9917:5;9870:52;:::o;8609:18::-;;;-1:-1:-1;;;;;8609:18:0;;:::o;15261:116::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;15339:13:::1;:30:::0;15261:116::o;13804:122::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;13884:15:::1;:34:::0;;-1:-1:-1;;;;;;13884:34:0::1;-1:-1:-1::0;;;;;13884:34:0;;;::::1;::::0;;;::::1;::::0;;13804:122::o;18271:149::-;12031:10;12021:21;;;;:9;:21;;;;;;;;12013:58;;;;;-1:-1:-1;;;12013:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12013:58:0;;;;;;;;;;;;;;;18370:42:::1;18389:10;18401;18370:18;:42::i;13666:130::-:0;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;13757:19:0;;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:31;;-1:-1:-1;;13757:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13666:130::o;13934:127::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;14021:14:::1;:32:::0;;-1:-1:-1;;;;;;14021:32:0::1;-1:-1:-1::0;;;;;14021:32:0;;;::::1;::::0;;;::::1;::::0;;13934:127::o;10700:32::-;;;;:::o;10146:27::-;;;-1:-1:-1;;;;;10146:27:0;;:::o;16036:150::-;12160:12;;-1:-1:-1;;;;;12160:12:0;12146:10;:26;12138:63;;;;;-1:-1:-1;;;12138:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12138:63:0;;;;;;;;;;;;;;;16140:17:::1;:38:::0;16036:150::o;13530:128::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;13620:18:0;;;::::1;;::::0;;;:8:::1;:18;::::0;;;;:30;;-1:-1:-1;;13620:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13530:128::o;9995:25::-;;;-1:-1:-1;;;9995:25:0;;;;;:::o;10527:31::-;;;;:::o;14205:222::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;9976:10:::1;14300:14;:36;;14292:86;;;;-1:-1:-1::0;;;14292:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14389:13;:30:::0;14205:222::o;15696:332::-;12160:12;;-1:-1:-1;;;;;12160:12:0;12146:10;:26;12138:63;;;;;-1:-1:-1;;;12138:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12138:63:0;;;;;;;;;;;;;;;15853:9:::1;15848:173;15872:7;:14;15868:1;:18;15848:173;;;15908:13;15924:7;15932:1;15924:10;;;;;;;;;;;;;;15908:26;;15982:24;16007:1;15982:27;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;15949:30:0;;::::1;;::::0;;;:23:::1;:30:::0;;;;;;:60;15888:3:::1;;15848:173;;11446:32:::0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11446:32:0;:::o;11209:23::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11209:23:0;;-1:-1:-1;11209:23:0;:::o;10792:42::-;;;;;;;;;;;;;;;:::o;10220:37::-;;;;:::o;18428:1194::-;12031:10;12021:21;;;;:9;:21;;;;;;;;12013:58;;;;;-1:-1:-1;;;12013:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12013:58:0;;;;;;;;;;;;;;;18738:42:::1;18757:10;18769;18738:18;:42::i;:::-;18843:14;::::0;;18902:50:::1;::::0;;-1:-1:-1;;;18902:50:0;;;;-1:-1:-1;;;;;18843:14:0;;::::1;::::0;18793:31:::1;::::0;18902:77:::1;::::0;18957:21;;18843:14;;18902:48:::1;::::0;:50;;::::1;::::0;::::1;::::0;;;;;;;18793:31;18843:14;18902:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18902:50:0;;:54:::1;:77::i;:::-;18869:110;;18990:30;19023:77;19078:21;19023:15;-1:-1:-1::0;;;;;19023:48:0::1;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:77;18990:110;;19149:22;19117:29;:54;19113:141;;;19220:22;19188:54;;19113:141;19302:22;19270:29;:54;19266:141;;;19373:22;19341:54;;19266:141;19419:92;::::0;;-1:-1:-1;;;19419:92:0;;::::1;::::0;::::1;::::0;;;19499:10:::1;19419:92:::0;;;;;;-1:-1:-1;;;;;19419:40:0;::::1;::::0;::::1;::::0;:92;;;;;-1:-1:-1;;19419:92:0;;;;;;;-1:-1:-1;19419:40:0;:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;19522:92:0::1;::::0;;-1:-1:-1;;;19522:92:0;;::::1;::::0;::::1;::::0;;;19602:10:::1;19522:92:::0;;;;;;-1:-1:-1;;;;;19522:40:0;::::1;::::0;-1:-1:-1;19522:40:0::1;::::0;-1:-1:-1;19522:92:0;;;;;-1:-1:-1;;19522:92:0;;;;;;;-1:-1:-1;19522:40:0;:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12082:1;;;18428:1194:::0;;;;;;:::o;10182:29::-;;;-1:-1:-1;;;;;10182:29:0;;:::o;9931:55::-;9976:10;9931:55;:::o;10027:35::-;;;-1:-1:-1;;;10027:35:0;;;;;:::o;22959:868::-;23020:4;23041:15;;-1:-1:-1;;;23041:15:0;;;;23037:60;;;-1:-1:-1;23080:5:0;23073:12;;23037:60;23142:17;;23113:25;;:46;23109:176;;-1:-1:-1;23268:5:0;23261:12;;23109:176;23349:26;23377:27;23408:20;23421:6;23408:12;:20::i;:::-;23297:131;;;;;;23465:18;23443:19;:40;:121;;;;-1:-1:-1;;;;;;23533:31:0;;;;;;:23;:31;;;;;;23487:43;:19;23511:18;23487:23;:43::i;:::-;:77;23443:121;23439:357;;;23779:5;23772:12;;;;;;23439:357;23815:4;23808:11;;;;22959:868;;;;:::o;19948:310::-;11911:10;11902:20;;;;:8;:20;;;;;;;;11894:57;;;;;-1:-1:-1;;;11894:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11894:57:0;;;;;;;;;;;;;;;20036:10:::1;20014:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;20006:76;;;::::0;;-1:-1:-1;;;20006:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;20115:10;20129:5;20093:33:::0;;;:21:::1;:33;::::0;;;;:41;;-1:-1:-1;;20093:41:0::1;::::0;;20173:25:::1;::::0;:32:::1;::::0;20093:41;20173:29:::1;:32::i;:::-;20145:25;:60:::0;20223:27:::1;::::0;;20239:10:::1;20223:27:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;19948:310::o:0;10653:38::-;;;;:::o;23835:293::-;23894:7;23903;23912;23921;23941:25;;:::i;:::-;-1:-1:-1;;;;;;;;;23969:17:0;;;;;;;:9;:17;;;;;;;;;23941:45;;;;;;;;;;;;;;;;-1:-1:-1;;;23941:45:0;;;;;;;;;;-1:-1:-1;;;23941:45:0;;;;;;;;;;-1:-1:-1;;;23941:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23835:293:0:o;10389:42::-;;;;:::o;14069:128::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;14153:16:::1;:36:::0;14069:128::o;16623:542::-;12031:10;12021:21;;;;:9;:21;;;;;;;;12013:58;;;;;-1:-1:-1;;;12013:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12013:58:0;;;;;;;;;;;;;;;16746:17:::1;16766:33;16788:10;16766:21;:33::i;:::-;16746:53;;16816:12;16812:346;;;16872:15;::::0;;16928:14;-1:-1:-1;;;;;16872:15:0;;::::1;::::0;16928:14:::1;16845:24;16959:188;16983:7;:14;16979:1;:18;16959:188;;;17023:13;17039:7;17047:1;17039:10;;;;;;;;;;;;;;17023:26;;17068:63;17078:5;17085:7;17093:1;17085:10;;;;;;;;;;;;;;17097:15;17114:16;17068:9;:63::i;:::-;-1:-1:-1::0;16999:3:0::1;;16959:188;;;;16812:346;;;12082:1;16623:542:::0;;;:::o;15385:121::-;12160:12;;-1:-1:-1;;;;;12160:12:0;12146:10;:26;12138:63;;;;;-1:-1:-1;;;12138:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12138:63:0;;;;;;;;;;;;;;;15470:12:::1;:28:::0;;-1:-1:-1;;;;;;15470:28:0::1;-1:-1:-1::0;;;;;15470:28:0;;;::::1;::::0;;;::::1;::::0;;15385:121::o;11018:41::-;;;;;;;;;;;;;;;:::o;12935:587::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;13073:13:::1;::::0;-1:-1:-1;;;13073:13:0;::::1;;;13072:14;13064:61;;;;-1:-1:-1::0;;;13064:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13136:13;:20:::0;;-1:-1:-1;;;;13136:20:0::1;-1:-1:-1::0;;;13136:20:0::1;::::0;;13169:17:::1;:38:::0;;;13220:139:::1;13244:8;:15;13240:1;:19;13220:139;;;13281:14;13298:8;13307:1;13298:11;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;13324:16:0::1;;::::0;;;:8:::1;:16:::0;;;;;;:23;;-1:-1:-1;;13324:23:0::1;13343:4;13324:23:::0;;::::1;::::0;;;13261:3;;;::::1;::::0;-1:-1:-1;13220:139:0::1;;;;13376:9;13371:144;13395:9;:16;13391:1;:20;13371:144;;;13433:15;13451:9;13461:1;13451:12;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;13478:18:0::1;;::::0;;;:9:::1;:18:::0;;;;;;:25;;-1:-1:-1;;13478:25:0::1;13499:4;13478:25:::0;;::::1;::::0;;;13413:3;;;::::1;::::0;-1:-1:-1;13371:144:0::1;;21168:1783:::0;21269:7;21311:38;21329:19;;21311:13;;:17;;:38;;;;:::i;:::-;21293:15;:56;21289:361;;;21370:9;21366:153;;;21407:96;9917:5;21407:70;21421:55;21446:29;;9917:5;21421:24;;:55;;;;:::i;:::-;21407:9;;:13;:70::i;:96::-;21400:103;;;;21366:153;21542:96;9917:5;21542:70;21556:55;21581:29;;9917:5;21556:24;;:55;;;;:::i;21289:361::-;21702:13;;21684;;:32;;:17;:32::i;:::-;21666:15;:50;21662:351;;;21737:9;21733:151;;;21774:94;9917:5;21774:68;21788:53;21813:27;;9917:5;21788:24;;:53;;;;:::i;21733:151::-;21907:94;9917:5;21907:68;21921:53;21946:27;;9917:5;21921:24;;:53;;;;:::i;21662:351::-;-1:-1:-1;;;;;22045:14:0;;22025:17;22045:14;;;:6;:14;;;;;;22074;22070:41;;22099:9;22092:16;;;;;22070:41;22123:23;22161:9;22149;:21;:75;;22200:24;:9;22214;22200:13;:24::i;:::-;22149:75;;;22173:24;:9;22187;22173:13;:24::i;:::-;22123:101;-1:-1:-1;22253:56:0;22299:9;22253:41;22123:101;9917:5;22253:19;:41::i;:56::-;22235:74;;22502:14;22520:22;22535:6;22520:14;:22::i;:::-;22519:23;:68;;;;22564:23;;22546:15;:41;22519:68;22502:85;;22604:9;22600:315;;;22686:9;22682:102;;;22735:9;22723;:21;:45;;22759:9;22723:45;;;22747:9;22723:45;22716:52;;;;;;;22682:102;22870:9;22858;:21;:45;;22894:9;22858:45;;22600:315;-1:-1:-1;22934:9:0;;-1:-1:-1;;21168:1783:0;;;;;;:::o;15514:174::-;12160:12;;-1:-1:-1;;;;;12160:12:0;12146:10;:26;12138:63;;;;;-1:-1:-1;;;12138:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12138:63:0;;;;;;;;;;;;;;;15630:23:::1;:50:::0;15514:174::o;14435:149::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;14534:19:::1;:42:::0;14435:149::o;9335:50::-;-1:-1:-1;;;9335:50:0;:::o;9394:69::-;9447:16;9394:69;:::o;10950:59::-;;;;;;;;;;;;;:::o;10438:44::-;;;;:::o;10739:::-;;;;:::o;10489:31::-;;;;:::o;14592:181::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;14707:27:::1;:58:::0;14592:181::o;16343:272::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;16477:16:::1;:23;16459:7;:14;:41;16451:84;;;::::0;;-1:-1:-1;;;16451:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;16546:16:::0;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16573:34:0;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;19630:310::-:0;11911:10;11902:20;;;;:8;:20;;;;;;;;11894:57;;;;;-1:-1:-1;;;11894:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11894:57:0;;;;;;;;;;;;;;;19720:10:::1;19698:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;19697:34;19689:75;;;::::0;;-1:-1:-1;;;19689:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19689:75:0;;;;;;;;;;;;;::::1;;19797:10;19775:33;::::0;;;:21:::1;:33;::::0;;;;:40;;-1:-1:-1;;19775:40:0::1;19811:4;19775:40:::0;;::::1;::::0;;;19854:25:::1;::::0;:32:::1;::::0;:29:::1;:32::i;:::-;19826:25;:60:::0;19904:28:::1;::::0;;19921:10:::1;19904:28:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;19630:310::o:0;10892:51::-;;;;;;;;;;;;-1:-1:-1;;;;;10892:51:0;;;;-1:-1:-1;;;10892:51:0;;;;;-1:-1:-1;;;10892:51:0;;;;;-1:-1:-1;;;10892:51:0;;;;;:::o;15123:130::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;15211:15:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;15211:34:0::1;-1:-1:-1::0;;;;15211:34:0;;::::1;::::0;;;::::1;::::0;;15123:130::o;8809:76::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;8867:3:::1;:10:::0;;-1:-1:-1;;;;;;8867:10:0::1;-1:-1:-1::0;;;;;8867:10:0;;;::::1;::::0;;;::::1;::::0;;8809:76::o;10843:42::-;;;;;;;;;;;;;:::o;14978:137::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;15071:16:::1;:36:::0;14978:137::o;16194:141::-;12160:12;;-1:-1:-1;;;;;12160:12:0;12146:10;:26;12138:63;;;;;-1:-1:-1;;;12138:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12138:63:0;;;;;;;;;;;;;;;16289:17:::1;:38:::0;16194:141::o;14781:189::-;8752:3;;-1:-1:-1;;;;;8752:3:0;8738:10;:17;8730:51;;;;;-1:-1:-1;;;8730:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8730:51:0;;;;;;;;;;;;;;;14900:29:::1;:62:::0;14781:189::o;10567:32::-;;;;:::o;10348:34::-;;;;:::o;9472:57::-;-1:-1:-1;;;;;9472:57:0;:::o;10071:29::-;;;-1:-1:-1;;;;;10071:29:0;;:::o;10264:40::-;;;;:::o;27892:834::-;27981:16;;27960:4;;27981:20;27977:166;;28064:16;;28043;;28026:34;;:12;;:16;:34::i;:::-;:54;;28018:113;;;;-1:-1:-1;;;28018:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28183:16;;28231:38;:15;28183:16;28231:19;:38::i;:::-;28218:10;:51;28210:109;;;;-1:-1:-1;;;28210:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28351:38;:15;28371:17;28351:19;:38::i;:::-;28338:10;:51;28330:111;;;;-1:-1:-1;;;28330:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28560:13;;28547:10;:26;28543:71;;;28597:5;28590:12;;;;;28543:71;-1:-1:-1;;28626:13:0;:26;28682:12;28663:16;:31;28714:4;;27892:834::o;2258:471::-;2316:7;2561:6;2557:47;;-1:-1:-1;2591:1:0;2584:8;;2557:47;2628:5;;;2632:1;2628;:5;:1;2652:5;;;;;:10;2644:56;;;;-1:-1:-1;;;2644:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2720:1;-1:-1:-1;2258:471:0;;;;;:::o;3205:132::-;3263:7;3290:39;3294:1;3297;3290:39;;;;;;;;;;;;;-1:-1:-1;;;3290:39:0;;;:3;:39::i;25005:1857::-;-1:-1:-1;;;;;25130:29:0;;;25126:1633;;25176:16;25211:15;-1:-1:-1;;;;;25195:54:0;;25250:6;25195:62;;;;;;;;;;;;;-1:-1:-1;;;;;25195:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25195:62:0;-1:-1:-1;;;;;25292:14:0;;25272:17;25292:14;;;:6;25195:62;25292:14;;;;;25195:62;;-1:-1:-1;25272:17:0;;;25422:20;25299:6;25422:12;:20::i;:::-;25323:119;;;;;;;;25478:1;25463:12;:16;25459:818;;;25500:22;25536:12;25525:8;:23;:81;;25580:26;:12;25597:8;25580:16;:26::i;:::-;25525:81;;;25551:26;:8;25564:12;25551;:26::i;:::-;25500:106;;25625:23;25663:6;25651:9;:18;:66;;25696:21;:6;25707:9;25696:10;:21::i;:::-;25651:66;;;25672:21;:9;25686:6;25672:13;:21::i;:::-;25625:92;;25853:38;25873:17;;25853:15;:19;;:38;;;;:::i;:::-;25831:17;;25819:30;;:7;;:11;:30::i;:::-;:72;25815:189;;25937:1;25916:22;;25983:1;25961:23;;25815:189;26045:88;26068:64;26119:12;26068:46;:14;9447:16;26068:18;:46::i;:64::-;26045:18;;:22;:88::i;:::-;26024:109;-1:-1:-1;26174:87:0;26198:62;26250:9;26198:47;:15;9447:16;26198:19;:47::i;:62::-;26174:19;;:23;:87::i;:::-;26152:109;;25459:818;;;26319:18;26297:19;:40;:121;;;;-1:-1:-1;;;;;;26387:31:0;;;;;;:23;:31;;;;;;26341:43;:19;26365:18;26341:23;:43::i;:::-;:77;26297:121;26293:267;;;26444:100;;;-1:-1:-1;;;;;26444:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26293:267;26576:72;26590:6;26598:8;26608:18;26628:19;26576:13;:72::i;:::-;26668:79;;;-1:-1:-1;;;;;26668:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25126:1633;;;;;;;-1:-1:-1;;;;;26771:14:0;;;;;;:6;:14;;;;;:23;;;26805:49;26821:16;26778:6;26788;26805:15;:49::i;24136:861::-;24223:17;24243:33;24265:10;24243:21;:33::i;:::-;24223:53;;24293:12;24289:701;;;24349:15;;;24405:14;-1:-1:-1;;;;;24349:15:0;;;;24405:14;24322:24;24436:543;24460:1;24456;:5;24436:543;;;24536:6;:13;24503:1;;24527:22;;24523:39;;24553:7;;;;;;;24523:39;24716:6;:9;;24601:2;:6;;;24643:22;;;9836:25;24642:37;;24582:16;;24716:6;24606:1;;24716:9;;;;;;;;;;;;;;;24769:15;:18;;-1:-1:-1;;;;;24716:9:0;;;;-1:-1:-1;24769:15:0;24785:1;;24769:18;;;;;;;;;;;;;;;;-1:-1:-1;24830:46:0;24769:18;24830:26;:5;-1:-1:-1;;;24830:9:0;:26::i;:46::-;24806:70;;24897:66;24907:5;24914:13;24929:15;24946:16;24897:9;:66::i;:::-;-1:-1:-1;;24463:3:0;;;;;-1:-1:-1;24436:543:0;;-1:-1:-1;;;24436:543:0;904:181;962:7;994:5;;;1018:6;;;;1010:46;;;;;-1:-1:-1;;;1010:46:0;;;;;;;;;;;;-1:-1:-1;;;1010:46:0;;;;;;;;;;;;;;1368:136;1426:7;1453:43;1457:1;1460;1453:43;;;;;;;;;;;;;;;;;:3;:43::i;3833:278::-;3919:7;3954:12;3947:5;3939:28;;;;-1:-1:-1;;;3939:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3978:9;3994:1;3990;:5;;;;;;;3833:278;-1:-1:-1;;;;;3833:278:0:o;26870:750::-;-1:-1:-1;;;;;27014:25:0;;27006:69;;;;;-1:-1:-1;;;27006:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9587:16;27193:46;;27185:100;;;;-1:-1:-1;;;27185:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9662:16;27304:48;;27296:103;;;;-1:-1:-1;;;27296:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27432:180;;;;;;;;-1:-1:-1;;;;;27432:180:0;;;;;;27500:15;27432:180;;;;;;;;;;;;;;;;;;;;;;;;;;;27412:17;;;-1:-1:-1;27412:17:0;;;:9;:17;;;;;;;:200;;;;;;;;;;;;-1:-1:-1;;;27412:200:0;-1:-1:-1;;;;;27412:200:0;;;-1:-1:-1;;;27412:200:0;-1:-1:-1;;;;27412:200:0;;;;-1:-1:-1;;;27412:200:0;-1:-1:-1;;;;27412:200:0;;;;-1:-1:-1;;;;;;27412:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26870:750::o;27628:256::-;-1:-1:-1;;;;;27734:30:0;;27730:69;;27781:7;;27730:69;27828:16;-1:-1:-1;;;;;27811:49:0;;27861:6;27869;27811:65;;;;;;;;;;;;;-1:-1:-1;;;;;27811:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1807:192;1893:7;1929:12;1921:6;;;;1913:29;;;;-1:-1:-1;;;1913:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1965:5:0;;;1807:192::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://d75eadb6661d9b73682efc3275a329d669995d6d1dc6ffba90d510741f747572
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.