Contract 0x89be4cf89c425f74b2d0691a268a9a421e9dce7b 1

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0d278d70f1fbdc4c6eed9c51d3e91352cabf3c112e8ae3473525677e9a9d2542Set Prices With ...635212682023-06-03 9:14:2421 secs ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013615959778
0xffdd019b1130acb71d7a1d957d3f2d95825605fb75e54ff54ebd633536df0e39Set Prices With ...635212602023-06-03 9:14:0342 secs ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013650020588
0xc59633a670bd25b8fc251f9e4706588a5a62cb0e47b14029b1807586c25e7cffSet Prices With ...635212512023-06-03 9:13:421 min ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013664103153
0x11eb9d660dadc7ec92269e0f2515e926ad7f37e146127d9b8873189957f5192aSet Prices With ...635212422023-06-03 9:13:251 min ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013133895058
0x6c5e4bb04e09b1c5d9fcf5698745c1e903bf0149038cbbee75af434f9d5db743Set Prices With ...635212392023-06-03 9:13:171 min ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013659821582
0xa5bcb8e365c7a70b0dce5986724735ba63b89f0e237792526fba4c5d990bafc8Set Prices With ...635212292023-06-03 9:12:551 min ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013693376885
0xcc04e6725906ff11f27ff5249a61759f81c94b515bb26f578a2569acdfe7b2a5Set Prices With ...635212202023-06-03 9:12:312 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013696291218
0x71b0d6fed2eb1ef7785deaf2d77efdfa5d67108ba649a455594e0718c6200771Set Prices With ...635212112023-06-03 9:12:082 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013651985383
0x8d71d8ccc4b1042d7c0e1ec8b65330168369b15fe6d8b5cd0e5eea38ed8ee8f6Set Prices With ...635211992023-06-03 9:11:443 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013486689588
0x56544a0465c32f81f960d65cbaf780766d0dea185ecb81aecd6b888f4d2bf1dcSet Prices With ...635211902023-06-03 9:11:243 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013458180415
0x80e1dbbe3b791a47c4a75f93c69f55b4c07828ef8f3d9f6aa5c87c2156dc1258Set Prices With ...635211812023-06-03 9:11:033 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013471210458
0x558332d66b5b4cd85831628fe0c3efb94df566538ab5b7b4af29e0c64e051d29Set Prices With ...635211732023-06-03 9:10:434 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013430873898
0xb24119f6130864a3376918e399e2cc2e5f012d7941ff8a821b2f5e7df19c5ac8Set Prices With ...635211632023-06-03 9:10:214 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013628642903
0x4aef876dfd455ebcfa94512afa2b7e7805bb8593caff71705096f2fb80c83fb2Set Prices With ...635211522023-06-03 9:10:014 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013561997315
0x4acc95d2a50b46f5d4c8e585506d5141aa6b94adbaacc73a8717696e4f93e424Set Prices With ...635211422023-06-03 9:09:405 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.014592006429
0x891dd6974d534f3afbc0da7f0e32c6eb4b86e88e7fbca733714baf97550a59a6Set Prices With ...635211352023-06-03 9:09:225 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.0138159324
0x627fa9a85b7735125533d2c1759f6fd4ddd67dbc4d7023f75d9e5e908828d9e8Set Prices With ...635211312023-06-03 9:09:175 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013484201196
0x07b7a73d9d63a861a031fe3e3cdd404a82e10f0236c25a972db09ecd7c2ec362Set Prices With ...635211232023-06-03 9:08:515 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.015482504034
0x19a7f19be58b762a10676c2af5df6bc0dbfae60f7761494c4bd3ed8222db8a22Set Prices With ...635210802023-06-03 9:07:197 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.01512895888
0x323a6a11c16c049489ecf3208c05282791fd1f9d50105ed5e50bbeb8ba5ec425Set Prices With ...635210102023-06-03 9:04:599 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013368240168
0x3bf683dbbf8a39837f8060a0f7b80eb711a32114b2ae3530c73691cbd5f6d56cSet Prices With ...635209592023-06-03 9:02:4312 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013556935206
0xc3c9a1d90ec60e583b2913281f969ae1d0f82b6cec671f14ebc95c0bfca5f9a0Set Prices With ...635209002023-06-03 9:00:2714 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.014071959063
0xa9f036000ed9b95538ac73cf83170aebf5c2fd3ffcb3ce72bb9738d6ae571951Set Prices With ...635208982023-06-03 9:00:2114 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.012880466019
0xa77219dd002b4d8840de027b66e31d04061ffdecaca3857de6558b42832a8e1eSet Prices With ...635208942023-06-03 9:00:0914 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013252129245
0x845b6427695765aa293cd39005374b115b57179369b93d306401754aa8f931c1Set Prices With ...635208882023-06-03 8:59:5414 mins ago0xa058b1a0ba31590d1e14a1f157f4ff7d41c78077 IN  0x89be4cf89c425f74b2d0691a268a9a421e9dce7b0 FTM0.013220217983
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x3da24dfe9293eecfa8ce476b6bd1e8da66da27aa2cfca24a8282562b6b511a3e569869792023-03-05 8:08:1090 days 1 hr ago Morphex: Deployer  Contract Creation0 FTM
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x2657e1ecc2188540c4ea61417b3b3815788be742

Contract Name:
FastPriceFeed

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2023-02-09
*/

// Sources flattened with hardhat v2.12.6 https://hardhat.org

// File contracts/access/Governable.sol

//  

pragma solidity 0.6.12;

contract Governable {
    address public gov;

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

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

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


// File contracts/core/interfaces/IPositionRouter.sol

//  

pragma solidity 0.6.12;

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


// File contracts/core/interfaces/IVaultPriceFeed.sol

//  

pragma solidity 0.6.12;

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


// File contracts/libraries/math/SafeMath.sol

//  

pragma solidity 0.6.12;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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


// File contracts/oracle/interfaces/IFastPriceEvents.sol

//  

pragma solidity 0.6.12;

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


// File contracts/oracle/interfaces/IFastPriceFeed.sol

//  

pragma solidity 0.6.12;

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


// File contracts/oracle/interfaces/ISecondaryPriceFeed.sol

//  

pragma solidity 0.6.12;

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


// File contracts/oracle/FastPriceFeed.sol

//  






pragma solidity 0.6.12;

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

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

    uint256 public constant PRICE_PRECISION = 10 ** 30;

    uint256 public constant CUMULATIVE_DELTA_PRECISION = 10 * 1000 * 1000;

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

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

    uint256 public constant BASIS_POINTS_DIVISOR = 10000;

    uint256 public constant MAX_PRICE_DURATION = 30 minutes;

    bool public isInitialized;
    bool public isSpreadEnabled = false;

    address public vaultPriceFeed;
    address public fastPriceEvents;

    address public tokenManager;

    address public positionRouter;

    uint256 public override lastUpdatedAt;
    uint256 public override lastUpdatedBlock;

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

    uint256 public priceDataInterval;

    // allowed deviation from primary price
    uint256 public maxDeviationBasisPoints;

    uint256 public minAuthorizations;
    uint256 public disableFastPriceVoteCount = 0;

    mapping (address => bool) public isUpdater;

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

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

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

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

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

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

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

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

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

        minAuthorizations = _minAuthorizations;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit DisableFastPrice(msg.sender);
    }

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

        emit EnableFastPrice(msg.sender);
    }

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

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

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

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

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

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

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

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

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

        return fastPrice;
    }

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

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

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

        return true;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        lastUpdatedAt = _timestamp;
        lastUpdatedBlock = block.number;

        return true;
    }
}

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"}]

60806040526000805460ff60a81b1916815560105534801561002057600080fd5b5060405162002f2c38038062002f2c833981810160405260e081101561004557600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151600080546001600160a01b0319163317905594959394929391929091906107088711156100c65760405162461bcd60e51b815260040180806020018281038252602581526020018062002f076025913960400191505060405180910390fd5b600796909655600894909455600b92909255600e55600280546001600160a01b039283166001600160a01b031991821617909155600380549383169382169390931790925560048054919093169116179055612ddf80620001286000396000f3fe608060405234801561001057600080fd5b50600436106102e05760003560e01c806303b04936146102e557806303cd25711461031f57806303f4d7dc146103395780630604ddea146103de5780630e9272ea146103e6578063126082cf1461040a57806312d43a511461041257806314dd2dce1461041a578063162ac4e01461043757806317835d1c1461045d5780631a15339114610480578063238aafb7146104ae578063287800c9146104d45780632a709b14146104dc5780632e9cd94b146104e457806331cb610514610501578063392e53cd1461052f5780633aa08f861461053757806344c231931461053f5780634bd66c1c146103de5780634c0e31c81461055c5780634d11fb4a1461067f5780634f64b2be1461069c5780634fdfb086146106b957806354aea127146106df578063574ec1be146106e757806361ef161f14610722578063668d3d651461072a578063695d4184146107325780636c56fd051461073a5780636ccd47c414610760578063715c75361461076857806372279ba11461077057806374bfed89146107bc578063776d16c1146107c4578063782661bc146107e15780637cb2b79c146109065780637df73e271461092c5780637fbc79c6146109525780637fece36814610a7c578063807c9782146103de57806382553aad14610ab05780638b7677f414610acd57806395082d2514610aea578063a2b47c1614610af2578063a374242514610afa578063a6eca89614610b20578063b0a2566614610b28578063b3606b5614610b30578063b70c7b7014610b38578063c8390a4814610b55578063c84a912414610c78578063cab44b7614610c80578063ce98dfa814610cde578063cfad57a214610cfd578063cfed246b14610d23578063d6a153f114610d49578063d925351a14610d66578063de0d1b9414610d83578063dfb481c914610da0578063e64559ad14610da8578063e68a22c014610db0578063eeaa783a14610db8578063f90ce5ba14610dc0575b600080fd5b61030b600480360360208110156102fb57600080fd5b50356001600160a01b0316610dc8565b604080519115158252519081900360200190f35b610327610ddd565b60408051918252519081900360200190f35b6103dc6004803603604081101561034f57600080fd5b810190602081018135600160201b81111561036957600080fd5b82018360208201111561037b57600080fd5b803590602001918460208302840111600160201b8311171561039c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610de3915050565b005b610327610f5a565b6103ee610f62565b604080516001600160a01b039092168252519081900360200190f35b610327610f71565b6103ee610f77565b6103dc6004803603602081101561043057600080fd5b5035610f86565b6103dc6004803603602081101561044d57600080fd5b50356001600160a01b0316610fd8565b6103dc6004803603604081101561047357600080fd5b5080359060200135611047565b6103dc6004803603604081101561049657600080fd5b506001600160a01b03813516906020013515156110a3565b6103dc600480360360208110156104c457600080fd5b50356001600160a01b031661111b565b61032761118a565b6103ee611190565b6103dc600480360360208110156104fa57600080fd5b503561119f565b6103dc6004803603604081101561051757600080fd5b506001600160a01b03813516906020013515156111f1565b61030b611269565b610327611279565b6103dc6004803603602081101561055557600080fd5b503561127f565b6103dc6004803603604081101561057257600080fd5b810190602081018135600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460208302840111600160201b831117156105bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060e57600080fd5b82018360208201111561062057600080fd5b803590602001918460208302840111600160201b8311171561064157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611312945050505050565b6103276004803603602081101561069557600080fd5b50356113bd565b6103ee600480360360208110156106b257600080fd5b50356113db565b61030b600480360360208110156106cf57600080fd5b50356001600160a01b0316611402565b610327611417565b6103dc600480360360c08110156106fd57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561141d565b6103ee61162c565b61032761163b565b61030b611641565b61030b6004803603602081101561075057600080fd5b50356001600160a01b0316611651565b6103dc6116dc565b6103276117ef565b6107966004803603602081101561078657600080fd5b50356001600160a01b03166117f5565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610327611873565b6103dc600480360360208110156107da57600080fd5b5035611879565b6103dc600480360360608110156107f757600080fd5b810190602081018135600160201b81111561081157600080fd5b82018360208201111561082357600080fd5b803590602001918460208302840111600160201b8311171561084457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561089357600080fd5b8201836020820111156108a557600080fd5b803590602001918460208302840111600160201b831117156108c657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506118cb915050565b6103dc6004803603602081101561091c57600080fd5b50356001600160a01b0316611999565b61030b6004803603602081101561094257600080fd5b50356001600160a01b0316611a08565b6103dc6004803603606081101561096857600080fd5b81359190810190604081016020820135600160201b81111561098957600080fd5b82018360208201111561099b57600080fd5b803590602001918460208302840111600160201b831117156109bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0b57600080fd5b820183602082011115610a1d57600080fd5b803590602001918460208302840111600160201b83111715610a3e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a1d945050505050565b61032760048036036060811015610a9257600080fd5b506001600160a01b0381351690602081013590604001351515611b76565b6103dc60048036036020811015610ac657600080fd5b5035611cfc565b6103dc60048036036020811015610ae357600080fd5b5035611d4e565b610327611da0565b610327611db0565b61032760048036036020811015610b1057600080fd5b50356001600160a01b0316611db7565b610327611dc9565b610327611dcf565b610327611dd5565b6103dc60048036036020811015610b4e57600080fd5b5035611ddb565b6103dc60048036036040811015610b6b57600080fd5b810190602081018135600160201b811115610b8557600080fd5b820183602082011115610b9757600080fd5b803590602001918460208302840111600160201b83111715610bb857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c0757600080fd5b820183602082011115610c1957600080fd5b803590602001918460208302840111600160201b83111715610c3a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e2d945050505050565b6103dc611ef7565b610ca660048036036020811015610c9657600080fd5b50356001600160a01b031661200e565b604080516001600160a01b03909516855263ffffffff9384166020860152918316848301529091166060830152519081900360800190f35b6103dc60048036036020811015610cf457600080fd5b5035151561204d565b6103dc60048036036020811015610d1357600080fd5b50356001600160a01b03166120b8565b61032760048036036020811015610d3957600080fd5b50356001600160a01b0316612127565b6103dc60048036036020811015610d5f57600080fd5b5035612139565b6103dc60048036036020811015610d7c57600080fd5b503561218b565b6103dc60048036036020811015610d9957600080fd5b50356121dd565b61032761222f565b610327612235565b61032761223b565b6103ee612246565b610327612255565b60166020526000908152604090205460ff1681565b60075481565b3360009081526011602052604090205460ff16610e35576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b6000610e408261225b565b90508015610f54576002546001546001600160a01b03918216911660005b8551811015610f50576000868281518110610e7557fe5b6020026020010151905060005b6008811015610f4657601754600884028201908110610ea75750505050505050610f56565b60178054602084029185831c63ffffffff169160009190600889028701908110610ecd57fe5b6000918252602082200154601880546001600160a01b0390921693509060088a028801908110610ef957fe5b60009182526020822001549150610f2682610f208668327cb2734119d3b7a9601e1b612367565b906123c9565b9050610f3483828c8e612408565b505060019094019350610e8292505050565b5050600101610e5e565b5050505b505b5050565b63ffffffff81565b6002546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b03163314610fd3576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600555565b6000546001600160a01b03163314611025576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526011602052604090205460ff16611099576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b610f56828261269d565b6000546001600160a01b031633146110f0576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611168576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b6003546001600160a01b031681565b6003546001600160a01b031633146111ec576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600d55565b6000546001600160a01b0316331461123e576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600054600160a01b900460ff1681565b600c5481565b6000546001600160a01b031633146112cc576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b61070881111561130d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c256025913960400191505060405180910390fd5b600755565b6003546001600160a01b0316331461135f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60005b8251811015610f5457600083828151811061137957fe5b6020026020010151905082828151811061138f57fe5b6020908102919091018101516001600160a01b03909216600090815260149091526040902055600101611362565b601881815481106113ca57fe5b600091825260209091200154905081565b601781815481106113e857fe5b6000918252602090912001546001600160a01b0316905081565b60116020526000908152604090205460ff1681565b60055481565b3360009081526011602052604090205460ff1661146f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b611479868661269d565b60048054604080516304dabc3160e51b815290516001600160a01b03909216926000926114f99287928692639b57862092808301926020929182900301818987803b1580156114c757600080fd5b505af11580156114db573d6000803e3d6000fd5b505050506040513d60208110156114f157600080fd5b505190612773565b9050600061153c84846001600160a01b0316631bca8cf06040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114c757600080fd5b90508187111561154a578196505b80861115611556578095505b60408051629a208160e81b81526004810189905233602482015290516001600160a01b03851691639a20810091604480830192600092919082900301818387803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b50506040805163f3883d8b60e01b8152600481018a905233602482015290516001600160a01b038716935063f3883d8b9250604480830192600092919082900301818387803b15801561160957600080fd5b505af115801561161d573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160a01b031681565b61070881565b600054600160a81b900460ff1681565b60008054600160a81b900460ff161561166c575060006116d7565b600f546010541061167f575060006116d7565b60008061168b846117f5565b93509350505081811180156116c057506001600160a01b0384166000908152601460205260409020546116be82846127cb565b115b156116d0576000925050506116d7565b6001925050505b919050565b3360009081526015602052604090205460ff1661172e576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff16611792576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601660205260409020805460ff191690556010546117b79060016127cb565b6010556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600e5481565b600080600080611803612b1d565b505050506001600160a01b039182166000908152601360209081526040918290208251608081018452905494851680825263ffffffff600160a01b87048116938301849052600160c01b87048116948301859052600160e01b909604909516606090910181905293949093919250565b60095481565b6000546001600160a01b031633146118c6576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600c55565b3360009081526011602052604090205460ff1661191d576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60006119288261225b565b90508015611993576002546001546001600160a01b03918216911660005b865181101561198f57600087828151811061195d57fe5b602002602001015190506119868188848151811061197757fe5b60200260200101518587612408565b50600101611946565b5050505b50505050565b6003546001600160a01b031633146119e6576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6000546001600160a01b03163314611a6a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1615611ab35760405162461bcd60e51b8152600401808060200182810382526022815260200180612d886022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600f8490555b8251811015611b1f576000838281518110611ae357fe5b6020908102919091018101516001600160a01b03166000908152601590915260409020805460ff19166001908117909155919091019050611acc565b5060005b8151811015611993576000828281518110611b3a57fe5b6020908102919091018101516001600160a01b03166000908152601190915260409020805460ff19166001908117909155919091019050611b23565b6000611b8f60085460055461277390919063ffffffff16565b421115611bea578115611bca57611bc3612710610f20611bbc600a5461271061277390919063ffffffff16565b8690612367565b9050611cf5565b611bc3612710610f20611bbc600a546127106127cb90919063ffffffff16565b600754600554611bf991612773565b421115611c46578115611c2657611bc3612710610f20611bbc60095461271061277390919063ffffffff16565b611bc3612710610f20611bbc6009546127106127cb90919063ffffffff16565b6001600160a01b03841660009081526012602052604090205480611c6d5783915050611cf5565b6000818511611c8557611c8082866127cb565b611c8f565b611c8f85836127cb565b9050611ca185610f2083612710612367565b90506000611cae87611651565b1580611cbb5750600e5482115b90508015611cef578415611ce257828611611cd65782611cd8565b855b9350505050611cf5565b828610611cd65782611cd8565b50909150505b9392505050565b6003546001600160a01b03163314611d49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600e55565b6000546001600160a01b03163314611d9b576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600855565b68327cb2734119d3b7a9601e1b81565b6298968081565b60146020526000908152604090205481565b600a5481565b60105481565b600b5481565b6000546001600160a01b03163314611e28576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600955565b6000546001600160a01b03163314611e7a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b8051825114611ed0576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611ee3906017906020850190612b44565b508051610f54906018906020840190612ba9565b3360009081526015602052604090205460ff16611f49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff1615611fad576040805162461bcd60e51b815260206004820152601c60248201527b11985cdd141c9a58d9519959590e88185b1c9958591e481d9bdd195960221b604482015290519081900360640190fd5b336000908152601660205260409020805460ff19166001908117909155601054611fd691612773565b6010556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6013602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b6000546001600160a01b0316331461209a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314612105576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205481565b6000546001600160a01b03163314612186576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600b55565b6003546001600160a01b031633146121d8576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331461222a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600a55565b600d5481565b60085481565b6001600160a01b0381565b6001546001600160a01b031681565b60065481565b600b54600090156122b457600b546006546122779043906127cb565b10156122b45760405162461bcd60e51b815260040180806020018281038252602e815260200180612d31602e913960400191505060405180910390fd5b600c546122c142826127cb565b83116122fe5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d04602d913960400191505060405180910390fd5b6123084282612773565b83106123455760405162461bcd60e51b815260040180806020018281038252602f815260200180612cb4602f913960400191505060405180910390fd5b6005548310156123595760009150506116d7565b505060055543600655600190565b600082612376575060006123c3565b8282028284828161238357fe5b04146123c05760405162461bcd60e51b8152600401808060200182810382526021815260200180612ce36021913960400191505060405180910390fd5b90505b92915050565b60006123c083836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061280d565b6001600160a01b03821615612677576000826001600160a01b03166356bf9de4866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561246657600080fd5b505afa15801561247a573d6000803e3d6000fd5b505050506040513d602081101561249057600080fd5b50516001600160a01b0386166000908152601260205260408120549192508080806124ba8a6117f5565b935093509350935060008411156125815760008487116124e3576124de85886127cb565b6124ed565b6124ed87866127cb565b905060008a8711612507576125028b886127cb565b612511565b612511878c6127cb565b9050612528600d54426123c990919063ffffffff16565b600d546125369087906123c9565b146125445760009350600092505b61255f61255887610f208562989680612367565b8590612773565b935061257c61257588610f208462989680612367565b8490612773565b925050505b81811180156125b057506001600160a01b038a166000908152601460205260409020546125ae82846127cb565b115b1561260d57604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517fe582322b389ad06b2bbf619cd6da3f16a288ec873ea0fa6df4d72f3d9480b4479181900360a00190a15b6126198a8784846128af565b604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517f23b9387f81fca646aac1dc4487ede045c65f5f7445482906565f01e05afdb3a89181900360a00190a15050505050505b6001600160a01b0384166000908152601260205260409020839055611993818585612a45565b60006126a88261225b565b90508015610f54576002546001546001600160a01b03918216911660005b6008811015610f5057601754819081106126e4575050505050610f56565b60178054602084029189831c63ffffffff1691600091908690811061270557fe5b6000918252602082200154601880546001600160a01b039092169350908790811061272c57fe5b6000918252602082200154915061275382610f208668327cb2734119d3b7a9601e1b612367565b905061276183828a8c612408565b5050600190940193506126c692505050565b6000828201838110156123c0576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60006123c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ac3565b600081836128995760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561285e578181015183820152602001612846565b50505050905090810190601f16801561288b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816128a557fe5b0495945050505050565b6001600160a01b03831061290a576040805162461bcd60e51b815260206004820152601f60248201527f466173745072696365466565643a20696e76616c696420726566507269636500604482015290519081900360640190fd5b63ffffffff821061294c5760405162461bcd60e51b8152600401808060200182810382526029815260200180612d5f6029913960400191505060405180910390fd5b63ffffffff811061298e5760405162461bcd60e51b815260040180806020018281038252602a815260200180612c4a602a913960400191505060405180910390fd5b604080516080810182526001600160a01b03948516815263ffffffff4281166020808401918252958216838501908152948216606084019081529787166000908152601390965292909420905181549251935196518516600160e01b026001600160e01b03978616600160c01b0263ffffffff60c01b1995909616600160a01b0263ffffffff60a01b19929097166001600160a01b0319909416939093171694909417919091169190911792909216919091179055565b6001600160a01b038316612a5857610f54565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612aaf57600080fd5b505af115801561198f573d6000803e3d6000fd5b60008184841115612b155760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561285e578181015183820152602001612846565b505050900390565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054828255906000526020600020908101928215612b99579160200282015b82811115612b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b64565b50612ba5929150612bf0565b5090565b828054828255906000526020600020908101928215612be4579160200282015b82811115612be4578251825591602001919060010190612bc9565b50612ba5929150612c0f565b5b80821115612ba55780546001600160a01b0319168155600101612bf1565b5b80821115612ba55760008155600101612c1056fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e466173745072696365466565643a20696e76616c69642063756d756c61746976654661737444656c7461476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20696e76616c69642063756d756c617469766552656644656c7461466173745072696365466565643a20616c726561647920696e697469616c697a6564a264697066735822122025d5f4b0e6fbb97cb9af698f316b1ac1a25d930dcf96f60dd1a1043e18a4b19d64736f6c634300060c0033466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000007564ee094c6e9fbc91d32f2253d3a7a46a12530f000000000000000000000000f1864c19d06fc678189e6cb2796e30485c2ba275000000000000000000000000f68fc0ef48859a3f4380ca756f7360969ed09376

Deployed ByteCode Sourcemap

9618:19835:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11790:54;;;;;;;;;;;;;;;;-1:-1:-1;11790:54:0;-1:-1:-1;;;;;11790:54:0;;:::i;:::-;;;;;;;;;;;;;;;;;;11037:28;;;:::i;:::-;;;;;;;;;;;;;;;;17897:1090;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17897:1090:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17897:1090:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17897:1090:0;;-1:-1:-1;;17897:1090:0;;;-1:-1:-1;17897:1090:0;;-1:-1:-1;;17897:1090:0:i;:::-;;10260:67;;;:::i;10831:30::-;;;:::i;:::-;;;;-1:-1:-1;;;;;10831:30:0;;;;;;;;;;;;;;10594:52;;;:::i;170:18::-;;;:::i;15985:116::-;;;;;;;;;;;;;;;;-1:-1:-1;15985:116:0;;:::i;14528:122::-;;;;;;;;;;;;;;;;-1:-1:-1;14528:122:0;-1:-1:-1;;;;;14528:122:0;;:::i;18995:149::-;;;;;;;;;;;;;;;;-1:-1:-1;18995:149:0;;;;;;;:::i;14390:130::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14390:130:0;;;;;;;;;;:::i;14658:127::-;;;;;;;;;;;;;;;;-1:-1:-1;14658:127:0;-1:-1:-1;;;;;14658:127:0;;:::i;11424:32::-;;;:::i;10870:27::-;;;:::i;16760:150::-;;;;;;;;;;;;;;;;-1:-1:-1;16760:150:0;;:::i;14254:128::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14254:128:0;;;;;;;;;;:::i;10719:25::-;;;:::i;11251:31::-;;;:::i;14929:222::-;;;;;;;;;;;;;;;;-1:-1:-1;14929:222:0;;:::i;16420:332::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16420:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16420:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16420:332:0;;;;;;;;-1:-1:-1;16420:332:0;;-1:-1:-1;;;;;16420:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16420:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16420:332:0;;-1:-1:-1;16420:332:0;;-1:-1:-1;;;;;16420:332:0:i;12170:32::-;;;;;;;;;;;;;;;;-1:-1:-1;12170:32:0;;:::i;11933:23::-;;;;;;;;;;;;;;;;-1:-1:-1;11933:23:0;;:::i;11516:42::-;;;;;;;;;;;;;;;;-1:-1:-1;11516:42:0;-1:-1:-1;;;;;11516:42:0;;:::i;10944:37::-;;;:::i;19152:1194::-;;;;;;;;;;;;;;;;-1:-1:-1;19152:1194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10906:29::-;;;:::i;10655:55::-;;;:::i;10751:35::-;;;:::i;23683:868::-;;;;;;;;;;;;;;;;-1:-1:-1;23683:868:0;-1:-1:-1;;;;;23683:868:0;;:::i;20672:310::-;;;:::i;11377:38::-;;;:::i;24559:293::-;;;;;;;;;;;;;;;;-1:-1:-1;24559:293:0;-1:-1:-1;;;;;24559:293:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11113:42;;;:::i;14793:128::-;;;;;;;;;;;;;;;;-1:-1:-1;14793:128:0;;:::i;17347:542::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17347:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17347:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17347:542:0;;;;;;;;-1:-1:-1;17347:542:0;;-1:-1:-1;;;;;17347:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17347:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17347:542:0;;-1:-1:-1;;17347:542:0;;;-1:-1:-1;17347:542:0;;-1:-1:-1;;17347:542:0:i;16109:121::-;;;;;;;;;;;;;;;;-1:-1:-1;16109:121:0;-1:-1:-1;;;;;16109:121:0;;:::i;11742:41::-;;;;;;;;;;;;;;;;-1:-1:-1;11742:41:0;-1:-1:-1;;;;;11742:41:0;;:::i;13659:587::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13659:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13659:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13659:587:0;;;;;;;;-1:-1:-1;13659:587:0;;-1:-1:-1;;;;;13659:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13659:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13659:587:0;;-1:-1:-1;13659:587:0;;-1:-1:-1;;;;;13659:587:0:i;21892:1783::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21892:1783:0;;;;;;;;;;;;;;;:::i;16238:174::-;;;;;;;;;;;;;;;;-1:-1:-1;16238:174:0;;:::i;15159:149::-;;;;;;;;;;;;;;;;-1:-1:-1;15159:149:0;;:::i;10059:50::-;;;:::i;10118:69::-;;;:::i;11674:59::-;;;;;;;;;;;;;;;;-1:-1:-1;11674:59:0;-1:-1:-1;;;;;11674:59:0;;:::i;11162:44::-;;;:::i;11463:::-;;;:::i;11213:31::-;;;:::i;15316:181::-;;;;;;;;;;;;;;;;-1:-1:-1;15316:181:0;;:::i;17067:272::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17067:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17067:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17067:272:0;;;;;;;;-1:-1:-1;17067:272:0;;-1:-1:-1;;;;;17067:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17067:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17067:272:0;;-1:-1:-1;17067:272:0;;-1:-1:-1;;;;;17067:272:0:i;20354:310::-;;;:::i;11616:51::-;;;;;;;;;;;;;;;;-1:-1:-1;11616:51:0;-1:-1:-1;;;;;11616:51:0;;:::i;:::-;;;;-1:-1:-1;;;;;11616:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15847:130;;;;;;;;;;;;;;;;-1:-1:-1;15847:130:0;;;;:::i;370:76::-;;;;;;;;;;;;;;;;-1:-1:-1;370:76:0;-1:-1:-1;;;;;370:76:0;;:::i;11567:42::-;;;;;;;;;;;;;;;;-1:-1:-1;11567:42:0;-1:-1:-1;;;;;11567:42:0;;:::i;15702:137::-;;;;;;;;;;;;;;;;-1:-1:-1;15702:137:0;;:::i;16918:141::-;;;;;;;;;;;;;;;;-1:-1:-1;16918:141:0;;:::i;15505:189::-;;;;;;;;;;;;;;;;-1:-1:-1;15505:189:0;;:::i;11291:32::-;;;:::i;11072:34::-;;;:::i;10196:57::-;;;:::i;10795:29::-;;;:::i;10988:40::-;;;:::i;11790:54::-;;;;;;;;;;;;;;;:::o;11037:28::-;;;;:::o;17897:1090::-;12755:10;12745:21;;;;:9;:21;;;;;;;;12737:58;;;;;-1:-1:-1;;;12737:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12737:58:0;;;;;;;;;;;;;;;18010:17:::1;18030:33;18052:10;18030:21;:33::i;:::-;18010:53;;18080:12;18076:904;;;18136:15;::::0;;18192:14;-1:-1:-1;;;;;18136:15:0;;::::1;::::0;18192:14:::1;18109:24;18223:746;18247:14;:21;18243:1;:25;18223:746;;;18294:17;18314:14;18329:1;18314:17;;;;;;;;;;;;;;18294:37;;18357:9;18352:602;18376:1;18372;:5;18352:602;;;18468:6;:13:::0;18427:1:::1;18423:5:::0;::::1;:9:::0;::::1;::::0;18459:22;::::1;18455:39;;18485:7;;;;;;;;;18455:39;18659:6;:17:::0;;18537:2:::1;:6:::0;::::1;::::0;18583:21;;::::1;10560:25:::0;18582:36:::1;::::0;18518:16:::1;::::0;18659:6;18670:1:::1;18666:5:::0;::::1;:9:::0;::::1;::::0;18659:17;::::1;;;;;;::::0;;;::::1;::::0;;::::1;::::0;18724:15:::1;:26:::0;;-1:-1:-1;;;;;18659:17:0;;::::1;::::0;-1:-1:-1;18724:15:0;18744:1:::1;18740:5:::0;::::1;:9:::0;::::1;::::0;18724:26;::::1;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;18797:46:0::1;18724:26:::0;18797::::1;:5:::0;-1:-1:-1;;;18797:9:0::1;:26::i;:::-;:30:::0;::::1;:46::i;:::-;18773:70;;18868:66;18878:5;18885:13;18900:15;18917:16;18868:9;:66::i;:::-;-1:-1:-1::0;;18379:3:0::1;::::0;;::::1;::::0;-1:-1:-1;18352:602:0::1;::::0;-1:-1:-1;;;18352:602:0::1;;-1:-1:-1::0;;18270:3:0::1;;18223:746;;;;18076:904;;;12806:1;;17897:1090:::0;;:::o;10260:67::-;10311:16;10260:67;:::o;10831:30::-;;;-1:-1:-1;;;;;10831:30:0;;:::o;10594:52::-;10641:5;10594:52;:::o;170:18::-;;;-1:-1:-1;;;;;170:18:0;;:::o;15985:116::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;16063:13:::1;:30:::0;15985:116::o;14528:122::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;14608:15:::1;:34:::0;;-1:-1:-1;;;;;;14608:34:0::1;-1:-1:-1::0;;;;;14608:34:0;;;::::1;::::0;;;::::1;::::0;;14528:122::o;18995:149::-;12755:10;12745:21;;;;:9;:21;;;;;;;;12737:58;;;;;-1:-1:-1;;;12737:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12737:58:0;;;;;;;;;;;;;;;19094:42:::1;19113:10;19125;19094:18;:42::i;14390:130::-:0;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14481:19:0;;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:31;;-1:-1:-1;;14481:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14390:130::o;14658:127::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;14745:14:::1;:32:::0;;-1:-1:-1;;;;;;14745:32:0::1;-1:-1:-1::0;;;;;14745:32:0;;;::::1;::::0;;;::::1;::::0;;14658:127::o;11424:32::-;;;;:::o;10870:27::-;;;-1:-1:-1;;;;;10870:27:0;;:::o;16760:150::-;12884:12;;-1:-1:-1;;;;;12884:12:0;12870:10;:26;12862:63;;;;;-1:-1:-1;;;12862:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12862:63:0;;;;;;;;;;;;;;;16864:17:::1;:38:::0;16760:150::o;14254:128::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14344:18:0;;;::::1;;::::0;;;:8:::1;:18;::::0;;;;:30;;-1:-1:-1;;14344:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14254:128::o;10719:25::-;;;-1:-1:-1;;;10719:25:0;;;;;:::o;11251:31::-;;;;:::o;14929:222::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;10700:10:::1;15024:14;:36;;15016:86;;;;-1:-1:-1::0;;;15016:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15113:13;:30:::0;14929:222::o;16420:332::-;12884:12;;-1:-1:-1;;;;;12884:12:0;12870:10;:26;12862:63;;;;;-1:-1:-1;;;12862:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12862:63:0;;;;;;;;;;;;;;;16577:9:::1;16572:173;16596:7;:14;16592:1;:18;16572:173;;;16632:13;16648:7;16656:1;16648:10;;;;;;;;;;;;;;16632:26;;16706:24;16731:1;16706:27;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;16673:30:0;;::::1;;::::0;;;:23:::1;:30:::0;;;;;;:60;16612:3:::1;;16572:173;;12170:32:::0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12170:32:0;:::o;11933:23::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11933:23:0;;-1:-1:-1;11933:23:0;:::o;11516:42::-;;;;;;;;;;;;;;;:::o;10944:37::-;;;;:::o;19152:1194::-;12755:10;12745:21;;;;:9;:21;;;;;;;;12737:58;;;;;-1:-1:-1;;;12737:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12737:58:0;;;;;;;;;;;;;;;19462:42:::1;19481:10;19493;19462:18;:42::i;:::-;19567:14;::::0;;19626:50:::1;::::0;;-1:-1:-1;;;19626:50:0;;;;-1:-1:-1;;;;;19567:14:0;;::::1;::::0;19517:31:::1;::::0;19626:77:::1;::::0;19681:21;;19567:14;;19626:48:::1;::::0;:50;;::::1;::::0;::::1;::::0;;;;;;;19517:31;19567:14;19626:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19626:50:0;;:54:::1;:77::i;:::-;19593:110;;19714:30;19747:77;19802:21;19747:15;-1:-1:-1::0;;;;;19747:48:0::1;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:77;19714:110;;19873:22;19841:29;:54;19837:141;;;19944:22;19912:54;;19837:141;20026:22;19994:29;:54;19990:141;;;20097:22;20065:54;;19990:141;20143:92;::::0;;-1:-1:-1;;;20143:92:0;;::::1;::::0;::::1;::::0;;;20223:10:::1;20143:92:::0;;;;;;-1:-1:-1;;;;;20143:40:0;::::1;::::0;::::1;::::0;:92;;;;;-1:-1:-1;;20143:92:0;;;;;;;-1:-1:-1;20143:40:0;:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20246:92:0::1;::::0;;-1:-1:-1;;;20246:92:0;;::::1;::::0;::::1;::::0;;;20326:10:::1;20246:92:::0;;;;;;-1:-1:-1;;;;;20246:40:0;::::1;::::0;-1:-1:-1;20246:40:0::1;::::0;-1:-1:-1;20246:92:0;;;;;-1:-1:-1;;20246:92:0;;;;;;;-1:-1:-1;20246:40:0;:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12806:1;;;19152:1194:::0;;;;;;:::o;10906:29::-;;;-1:-1:-1;;;;;10906:29:0;;:::o;10655:55::-;10700:10;10655:55;:::o;10751:35::-;;;-1:-1:-1;;;10751:35:0;;;;;:::o;23683:868::-;23744:4;23765:15;;-1:-1:-1;;;23765:15:0;;;;23761:60;;;-1:-1:-1;23804:5:0;23797:12;;23761:60;23866:17;;23837:25;;:46;23833:176;;-1:-1:-1;23992:5:0;23985:12;;23833:176;24073:26;24101:27;24132:20;24145:6;24132:12;:20::i;:::-;24021:131;;;;;;24189:18;24167:19;:40;:121;;;;-1:-1:-1;;;;;;24257:31:0;;;;;;:23;:31;;;;;;24211:43;:19;24235:18;24211:23;:43::i;:::-;:77;24167:121;24163:357;;;24503:5;24496:12;;;;;;24163:357;24539:4;24532:11;;;;23683:868;;;;:::o;20672:310::-;12635:10;12626:20;;;;:8;:20;;;;;;;;12618:57;;;;;-1:-1:-1;;;12618:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12618:57:0;;;;;;;;;;;;;;;20760:10:::1;20738:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;20730:76;;;::::0;;-1:-1:-1;;;20730:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;20839:10;20853:5;20817:33:::0;;;:21:::1;:33;::::0;;;;:41;;-1:-1:-1;;20817:41:0::1;::::0;;20897:25:::1;::::0;:32:::1;::::0;20817:41;20897:29:::1;:32::i;:::-;20869:25;:60:::0;20947:27:::1;::::0;;20963:10:::1;20947:27:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;20672:310::o:0;11377:38::-;;;;:::o;24559:293::-;24618:7;24627;24636;24645;24665:25;;:::i;:::-;-1:-1:-1;;;;;;;;;24693:17:0;;;;;;;:9;:17;;;;;;;;;24665:45;;;;;;;;;;;;;;;;-1:-1:-1;;;24665:45:0;;;;;;;;;;-1:-1:-1;;;24665:45:0;;;;;;;;;;-1:-1:-1;;;24665:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;24559:293:0:o;11113:42::-;;;;:::o;14793:128::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;14877:16:::1;:36:::0;14793:128::o;17347:542::-;12755:10;12745:21;;;;:9;:21;;;;;;;;12737:58;;;;;-1:-1:-1;;;12737:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12737:58:0;;;;;;;;;;;;;;;17470:17:::1;17490:33;17512:10;17490:21;:33::i;:::-;17470:53;;17540:12;17536:346;;;17596:15;::::0;;17652:14;-1:-1:-1;;;;;17596:15:0;;::::1;::::0;17652:14:::1;17569:24;17683:188;17707:7;:14;17703:1;:18;17683:188;;;17747:13;17763:7;17771:1;17763:10;;;;;;;;;;;;;;17747:26;;17792:63;17802:5;17809:7;17817:1;17809:10;;;;;;;;;;;;;;17821:15;17838:16;17792:9;:63::i;:::-;-1:-1:-1::0;17723:3:0::1;;17683:188;;;;17536:346;;;12806:1;17347:542:::0;;;:::o;16109:121::-;12884:12;;-1:-1:-1;;;;;12884:12:0;12870:10;:26;12862:63;;;;;-1:-1:-1;;;12862:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12862:63:0;;;;;;;;;;;;;;;16194:12:::1;:28:::0;;-1:-1:-1;;;;;;16194:28:0::1;-1:-1:-1::0;;;;;16194:28:0;;;::::1;::::0;;;::::1;::::0;;16109:121::o;11742:41::-;;;;;;;;;;;;;;;:::o;13659:587::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;13797:13:::1;::::0;-1:-1:-1;;;13797:13:0;::::1;;;13796:14;13788:61;;;;-1:-1:-1::0;;;13788:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13860:13;:20:::0;;-1:-1:-1;;;;13860:20:0::1;-1:-1:-1::0;;;13860:20:0::1;::::0;;13893:17:::1;:38:::0;;;13944:139:::1;13968:8;:15;13964:1;:19;13944:139;;;14005:14;14022:8;14031:1;14022:11;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14048:16:0::1;;::::0;;;:8:::1;:16:::0;;;;;;:23;;-1:-1:-1;;14048:23:0::1;14067:4;14048:23:::0;;::::1;::::0;;;13985:3;;;::::1;::::0;-1:-1:-1;13944:139:0::1;;;;14100:9;14095:144;14119:9;:16;14115:1;:20;14095:144;;;14157:15;14175:9;14185:1;14175:12;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14202:18:0::1;;::::0;;;:9:::1;:18:::0;;;;;;:25;;-1:-1:-1;;14202:25:0::1;14223:4;14202:25:::0;;::::1;::::0;;;14137:3;;;::::1;::::0;-1:-1:-1;14095:144:0::1;;21892:1783:::0;21993:7;22035:38;22053:19;;22035:13;;:17;;:38;;;;:::i;:::-;22017:15;:56;22013:361;;;22094:9;22090:153;;;22131:96;10641:5;22131:70;22145:55;22170:29;;10641:5;22145:24;;:55;;;;:::i;:::-;22131:9;;:13;:70::i;:96::-;22124:103;;;;22090:153;22266:96;10641:5;22266:70;22280:55;22305:29;;10641:5;22280:24;;:55;;;;:::i;22013:361::-;22426:13;;22408;;:32;;:17;:32::i;:::-;22390:15;:50;22386:351;;;22461:9;22457:151;;;22498:94;10641:5;22498:68;22512:53;22537:27;;10641:5;22512:24;;:53;;;;:::i;22457:151::-;22631:94;10641:5;22631:68;22645:53;22670:27;;10641:5;22645:24;;:53;;;;:::i;22386:351::-;-1:-1:-1;;;;;22769:14:0;;22749:17;22769:14;;;:6;:14;;;;;;22798;22794:41;;22823:9;22816:16;;;;;22794:41;22847:23;22885:9;22873;:21;:75;;22924:24;:9;22938;22924:13;:24::i;:::-;22873:75;;;22897:24;:9;22911;22897:13;:24::i;:::-;22847:101;-1:-1:-1;22977:56:0;23023:9;22977:41;22847:101;10641:5;22977:19;:41::i;:56::-;22959:74;;23226:14;23244:22;23259:6;23244:14;:22::i;:::-;23243:23;:68;;;;23288:23;;23270:15;:41;23243:68;23226:85;;23328:9;23324:315;;;23410:9;23406:102;;;23459:9;23447;:21;:45;;23483:9;23447:45;;;23471:9;23447:45;23440:52;;;;;;;23406:102;23594:9;23582;:21;:45;;23618:9;23582:45;;23324:315;-1:-1:-1;23658:9:0;;-1:-1:-1;;21892:1783:0;;;;;;:::o;16238:174::-;12884:12;;-1:-1:-1;;;;;12884:12:0;12870:10;:26;12862:63;;;;;-1:-1:-1;;;12862:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12862:63:0;;;;;;;;;;;;;;;16354:23:::1;:50:::0;16238:174::o;15159:149::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;15258:19:::1;:42:::0;15159:149::o;10059:50::-;-1:-1:-1;;;10059:50:0;:::o;10118:69::-;10171:16;10118:69;:::o;11674:59::-;;;;;;;;;;;;;:::o;11162:44::-;;;;:::o;11463:::-;;;;:::o;11213:31::-;;;;:::o;15316:181::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;15431:27:::1;:58:::0;15316:181::o;17067:272::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;17201:16:::1;:23;17183:7;:14;:41;17175:84;;;::::0;;-1:-1:-1;;;17175:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17270:16:::0;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;17297:34:0;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;20354:310::-:0;12635:10;12626:20;;;;:8;:20;;;;;;;;12618:57;;;;;-1:-1:-1;;;12618:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12618:57:0;;;;;;;;;;;;;;;20444:10:::1;20422:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;20421:34;20413:75;;;::::0;;-1:-1:-1;;;20413:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20413:75:0;;;;;;;;;;;;;::::1;;20521:10;20499:33;::::0;;;:21:::1;:33;::::0;;;;:40;;-1:-1:-1;;20499:40:0::1;20535:4;20499:40:::0;;::::1;::::0;;;20578:25:::1;::::0;:32:::1;::::0;:29:::1;:32::i;:::-;20550:25;:60:::0;20628:28:::1;::::0;;20645:10:::1;20628:28:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;20354:310::o:0;11616:51::-;;;;;;;;;;;;-1:-1:-1;;;;;11616:51:0;;;;-1:-1:-1;;;11616:51:0;;;;;-1:-1:-1;;;11616:51:0;;;;;-1:-1:-1;;;11616:51:0;;;;;:::o;15847:130::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;15935:15:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;15935:34:0::1;-1:-1:-1::0;;;;15935:34:0;;::::1;::::0;;;::::1;::::0;;15847:130::o;370:76::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;428:3:::1;:10:::0;;-1:-1:-1;;;;;;428:10:0::1;-1:-1:-1::0;;;;;428:10:0;;;::::1;::::0;;;::::1;::::0;;370:76::o;11567:42::-;;;;;;;;;;;;;:::o;15702:137::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;15795:16:::1;:36:::0;15702:137::o;16918:141::-;12884:12;;-1:-1:-1;;;;;12884:12:0;12870:10;:26;12862:63;;;;;-1:-1:-1;;;12862:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12862:63:0;;;;;;;;;;;;;;;17013:17:::1;:38:::0;16918:141::o;15505:189::-;313:3;;-1:-1:-1;;;;;313:3:0;299:10;:17;291:51;;;;;-1:-1:-1;;;291:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;291:51:0;;;;;;;;;;;;;;;15624:29:::1;:62:::0;15505:189::o;11291:32::-;;;;:::o;11072:34::-;;;;:::o;10196:57::-;-1:-1:-1;;;;;10196:57:0;:::o;10795:29::-;;;-1:-1:-1;;;;;10795:29:0;;:::o;10988:40::-;;;;:::o;28616:834::-;28705:16;;28684:4;;28705:20;28701:166;;28788:16;;28767;;28750:34;;:12;;:16;:34::i;:::-;:54;;28742:113;;;;-1:-1:-1;;;28742:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28907:16;;28955:38;:15;28907:16;28955:19;:38::i;:::-;28942:10;:51;28934:109;;;;-1:-1:-1;;;28934:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29075:38;:15;29095:17;29075:19;:38::i;:::-;29062:10;:51;29054:111;;;;-1:-1:-1;;;29054:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29284:13;;29271:10;:26;29267:71;;;29321:5;29314:12;;;;;29267:71;-1:-1:-1;;29350:13:0;:26;29406:12;29387:16;:31;29438:4;;28616:834::o;4756:471::-;4814:7;5059:6;5055:47;;-1:-1:-1;5089:1:0;5082:8;;5055:47;5126:5;;;5130:1;5126;:5;:1;5150:5;;;;;:10;5142:56;;;;-1:-1:-1;;;5142:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5218:1;-1:-1:-1;4756:471:0;;;;;:::o;5703:132::-;5761:7;5788:39;5792:1;5795;5788:39;;;;;;;;;;;;;-1:-1:-1;;;5788:39:0;;;:3;:39::i;25729:1857::-;-1:-1:-1;;;;;25854:29:0;;;25850:1633;;25900:16;25935:15;-1:-1:-1;;;;;25919:54:0;;25974:6;25919:62;;;;;;;;;;;;;-1:-1:-1;;;;;25919:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25919:62:0;-1:-1:-1;;;;;26016:14:0;;25996:17;26016:14;;;:6;25919:62;26016:14;;;;;25919:62;;-1:-1:-1;25996:17:0;;;26146:20;26023:6;26146:12;:20::i;:::-;26047:119;;;;;;;;26202:1;26187:12;:16;26183:818;;;26224:22;26260:12;26249:8;:23;:81;;26304:26;:12;26321:8;26304:16;:26::i;:::-;26249:81;;;26275:26;:8;26288:12;26275;:26::i;:::-;26224:106;;26349:23;26387:6;26375:9;:18;:66;;26420:21;:6;26431:9;26420:10;:21::i;:::-;26375:66;;;26396:21;:9;26410:6;26396:13;:21::i;:::-;26349:92;;26577:38;26597:17;;26577:15;:19;;:38;;;;:::i;:::-;26555:17;;26543:30;;:7;;:11;:30::i;:::-;:72;26539:189;;26661:1;26640:22;;26707:1;26685:23;;26539:189;26769:88;26792:64;26843:12;26792:46;:14;10171:16;26792:18;:46::i;:64::-;26769:18;;:22;:88::i;:::-;26748:109;-1:-1:-1;26898:87:0;26922:62;26974:9;26922:47;:15;10171:16;26922:19;:47::i;:62::-;26898:19;;:23;:87::i;:::-;26876:109;;26183:818;;;27043:18;27021:19;:40;:121;;;;-1:-1:-1;;;;;;27111:31:0;;;;;;:23;:31;;;;;;27065:43;:19;27089:18;27065:23;:43::i;:::-;:77;27021:121;27017:267;;;27168:100;;;-1:-1:-1;;;;;27168:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27017:267;27300:72;27314:6;27322:8;27332:18;27352:19;27300:13;:72::i;:::-;27392:79;;;-1:-1:-1;;;;;27392:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25850:1633;;;;;;;-1:-1:-1;;;;;27495:14:0;;;;;;:6;:14;;;;;:23;;;27529:49;27545:16;27502:6;27512;27529:15;:49::i;24860:861::-;24947:17;24967:33;24989:10;24967:21;:33::i;:::-;24947:53;;25017:12;25013:701;;;25073:15;;;25129:14;-1:-1:-1;;;;;25073:15:0;;;;25129:14;25046:24;25160:543;25184:1;25180;:5;25160:543;;;25260:6;:13;25227:1;;25251:22;;25247:39;;25277:7;;;;;;;25247:39;25440:6;:9;;25325:2;:6;;;25367:22;;;10560:25;25366:37;;25306:16;;25440:6;25330:1;;25440:9;;;;;;;;;;;;;;;25493:15;:18;;-1:-1:-1;;;;;25440:9:0;;;;-1:-1:-1;25493:15:0;25509:1;;25493:18;;;;;;;;;;;;;;;;-1:-1:-1;25554:46:0;25493:18;25554:26;:5;-1:-1:-1;;;25554:9:0;:26::i;:46::-;25530:70;;25621:66;25631:5;25638:13;25653:15;25670:16;25621:9;:66::i;:::-;-1:-1:-1;;25187:3:0;;;;;-1:-1:-1;25160:543:0;;-1:-1:-1;;;25160:543:0;3402:181;3460:7;3492:5;;;3516:6;;;;3508:46;;;;;-1:-1:-1;;;3508:46:0;;;;;;;;;;;;-1:-1:-1;;;3508:46:0;;;;;;;;;;;;;;3866:136;3924:7;3951:43;3955:1;3958;3951:43;;;;;;;;;;;;;;;;;:3;:43::i;6331:278::-;6417:7;6452:12;6445:5;6437:28;;;;-1:-1:-1;;;6437:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6476:9;6492:1;6488;:5;;;;;;;6331:278;-1:-1:-1;;;;;6331:278:0:o;27594:750::-;-1:-1:-1;;;;;27738:25:0;;27730:69;;;;;-1:-1:-1;;;27730:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10311:16;27917:46;;27909:100;;;;-1:-1:-1;;;27909:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10386:16;28028:48;;28020:103;;;;-1:-1:-1;;;28020:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28156:180;;;;;;;;-1:-1:-1;;;;;28156:180:0;;;;;;28224:15;28156:180;;;;;;;;;;;;;;;;;;;;;;;;;;;28136:17;;;-1:-1:-1;28136:17:0;;;:9;:17;;;;;;;:200;;;;;;;;;;;;-1:-1:-1;;;28136:200:0;-1:-1:-1;;;;;28136:200:0;;;-1:-1:-1;;;28136:200:0;-1:-1:-1;;;;28136:200:0;;;;-1:-1:-1;;;28136:200:0;-1:-1:-1;;;;28136:200:0;;;;-1:-1:-1;;;;;;28136:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27594:750::o;28352:256::-;-1:-1:-1;;;;;28458:30:0;;28454:69;;28505:7;;28454:69;28552:16;-1:-1:-1;;;;;28535:49:0;;28585:6;28593;28535:65;;;;;;;;;;;;;-1:-1:-1;;;;;28535:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4305:192;4391:7;4427:12;4419:6;;;;4411:29;;;;-1:-1:-1;;;4411:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4463:5:0;;;4305:192::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://25d5f4b0e6fbb97cb9af698f316b1ac1a25d930dcf96f60dd1a1043e18a4b19d
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.