Contract 0xfe2a4da911c9b41ddac739494a8b0aa7ab3de176

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x90bb559494d912eab55731126f7b7cb1fd87efbbc5f00b779af1bf2ccb5fa55dSet Prices With ...588459952023-04-01 11:21:4630 secs ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005227170727
0xf9b8d45e07e6dfcbf9fe71668472db199779646ab6543e47f52f1fbdd56cf442Set Prices With ...588459842023-04-01 11:21:2650 secs ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005437416193
0x521c95f9f2fa36da85817e17797fe8907f15da7a542ab062d151eeda753d0b23Set Prices With ...588459242023-04-01 11:20:261 min ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005329218795
0x8d42dd9735e5d213811783a085541d39c2822d7d56d5ee99317f734df8c2a2c1Set Prices With ...588458582023-04-01 11:19:262 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005201188273
0xc627475a2d96341f21de251969f1d3ba807f67b24c5280920175795d242eea94Set Prices With ...588455072023-04-01 11:13:378 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005081874187
0x46744942725087bc9ecabeb5e342fdd9b5f5078a45a863815a49a3396dcacda1Set Prices With ...588455002023-04-01 11:13:318 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.00531556921
0x34ddd6cfdcaa5bfb67e5fa06789b72b3dc7596854238851de0383d4a11222f95Set Prices With ...588454912023-04-01 11:13:218 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005394567085
0xf7fb07202c52cdfb0e8de22b95fccc991b9edb3b225364f8ca262c183f8cc65fSet Prices With ...588454322023-04-01 11:12:339 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.00540134924
0x0611b921fc896ee839da90979ca2a39f2cf087df0663d03a579871f4577ee9a9Set Prices With ...588453812023-04-01 11:11:4110 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005198762408
0xb5051791cbffa72225e392bcefc80375f1a2be180c0e60bb09f5f3fe22f24502Set Prices With ...588453042023-04-01 11:10:1911 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.00528026045
0xc88e66a854917f22563759f36c06b5d00fd0f1c6793a310cd1cb01524c8a8c10Set Prices With ...588450612023-04-01 11:06:2915 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005450506318
0xe4439d7acca537dc9c3b769ef2b52a7e2b9c4b0e7a878bfdd5184abc6d9ce016Set Prices With ...588447802023-04-01 11:01:4820 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006385524238
0xb476e2e08a9eaaaa79bf482fbdbf9a02333e3160a3418be0d8ca9ce3c2b5743aSet Prices With ...588446662023-04-01 10:59:3822 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005321218764
0xb46e0fda7325a97c5e7c7661b1087c3790e31fb4cf6f06829e0cb945b963959aSet Prices With ...588446612023-04-01 10:59:3022 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005577054283
0xc1241a8fd67bc93718d2f8ef5a993682f5d7ba8d76c7d81667a8bbf758759271Set Prices With ...588445322023-04-01 10:57:2724 mins ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.005336740313
0x4351012b40781216691dc533612bd83007cde8066a647b6bce407c0c2adc1532Set Prices With ...587698922023-03-31 10:13:081 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.007834374045
0xcc311beaae4b4fc3352b22503ec022322df46c07a2169fe8992d2ae4625b1479Set Prices With ...587698842023-03-31 10:13:011 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.00783240004
0x60306208d3cef3e90fceb806c2debcce68f369dc12f2a3364c2db549a62d5789Set Prices With ...587698712023-03-31 10:12:501 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006173700637
0x4e9836ec8264c02884358a5939ef1cdbb83f422b41358c0df6394465320e26fbSet Prices With ...587697542023-03-31 10:11:001 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006081336431
0xb931760d6346eb957a4646bfb38935109025fa1a81178fae05746500a6e93170Set Prices With ...587696652023-03-31 10:09:331 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006026705941
0x7ab25bde3c47788d2b4710e3be6d57602f0df5d5f8399d20c8b8d1d2a5e4385fSet Prices With ...587694942023-03-31 10:06:351 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006079979603
0xdba73d338bdc1ae5a5bf8e26242b2bef89750aefa04a3ef65951646380ef99a4Set Prices With ...587694392023-03-31 10:05:371 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006252116804
0xac88156c205ca61bb752ea5a0ded75101a65fa57a1b8f41c1538f8db071ed002Set Prices With ...587694062023-03-31 10:05:031 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006131183672
0x5d6bbeeb3a508be009624ff5e4d3f88660f398386a86e865c47324c7a8887bbfSet Prices With ...587693932023-03-31 10:04:491 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.00625244393
0x5e466d82e7e80ccc25e303ad06cd8ed4f97ea454de8134b8a4dade8d6c99a8e9Set Prices With ...587692872023-03-31 10:02:591 day 1 hr ago0xb5784f29564fb3d1c656b7a3e5936811d0d656c1 IN  0xfe2a4da911c9b41ddac739494a8b0aa7ab3de1760 FTM0.006082293052
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xfbe681fe22047c5d8a7b247df69168e80a93356fc1e065c07db9ce8e0a3d96ab548533292023-02-01 15:10:3258 days 20 hrs ago Scarab Finance: 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 0x49eF1610Be70fCAE062E191B55abE336907f0D30

Contract Name:
FastPriceFeed

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 50 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

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

pragma solidity 0.6.12;

contract Governable {
    address public gov;

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

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

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

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

pragma solidity 0.6.12;

interface IPositionRouter {

    function increasePositionRequestKeysStart() external returns (uint256);
    function decreasePositionRequestKeysStart() external returns (uint256);

    function executeIncreasePositions(
        uint256 _count,
        address payable _executionFeeReceiver
    ) external;

    function executeDecreasePositions(
        uint256 _count,
        address payable _executionFeeReceiver
    ) external;

    function getRequestQueueLengths()  external view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        );
}

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

pragma solidity 0.6.12;

interface IVaultPriceFeed {
    function adjustmentBasisPoints(address _token)
        external
        view
        returns (uint256);

    function isAdjustmentAdditive(address _token) external view returns (bool);

    function setAdjustment(
        address _token,
        bool _isAdditive,
        uint256 _adjustmentBps
    ) external;

    function setIsSecondaryPriceEnabled(bool _isEnabled) external;

    function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints)
        external;

    function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints)
        external;

    function setFavorPrimaryPrice(bool _favorPrimaryPrice) external;

    function setPriceSampleSpace(uint256 _priceSampleSpace) external;

    function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation)
        external;

    function getPrice(
        address _token,
        bool _maximise,
        bool _includeAmmPrice,
        bool _useSwapPricing
    ) external view returns (uint256);

    function getPrimaryPrice(address _token, bool _maximise)
        external
        view
        returns (uint256);

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

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


}

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

pragma solidity 0.6.12;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

pragma solidity 0.6.12;

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

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

    uint256 public constant PRICE_PRECISION = 10 ** 30;

    uint256 public constant CUMULATIVE_DELTA_PRECISION = 10 * 1000 * 1000;

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

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

    uint256 public constant BASIS_POINTS_DIVISOR = 10000;

    uint256 public constant MAX_PRICE_DURATION = 30 minutes;

    bool public isInitialized;
    bool public isSpreadEnabled = false;

    address public vaultPriceFeed;
    address public fastPriceEvents;

    address public tokenManager;

    address public positionRouter;

    uint256 public override lastUpdatedAt;
    uint256 public override lastUpdatedBlock;

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

    uint256 public priceDataInterval;

    // allowed deviation from primary price
    uint256 public maxDeviationBasisPoints;

    uint256 public minAuthorizations;
    uint256 public disableFastPriceVoteCount = 0;

    mapping (address => bool) public isUpdater;

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

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

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

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

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

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

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

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

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

        minAuthorizations = _minAuthorizations;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit DisableFastPrice(msg.sender);
    }

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

        emit EnableFastPrice(msg.sender);
    }

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

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

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

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

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

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

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

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

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

        return fastPrice;
    }

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

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

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

        return true;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        lastUpdatedAt = _timestamp;
        lastUpdatedBlock = block.number;

        return true;
    }
}

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

pragma solidity 0.6.12;

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

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

pragma solidity 0.6.12;

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

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

pragma solidity 0.6.12;

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

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

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

60806040526000805460ff60a81b1916815560105534801561002057600080fd5b5060405162002f9d38038062002f9d833981810160405260e081101561004557600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151600080546001600160a01b0319163317905594959394929391929091906107088711156100c65760405162461bcd60e51b815260040180806020018281038252602581526020018062002f786025913960400191505060405180910390fd5b600796909655600894909455600b92909255600e55600280546001600160a01b039283166001600160a01b031991821617909155600380549383169382169390931790925560048054919093169116179055612e5080620001286000396000f3fe608060405234801561001057600080fd5b50600436106103505760003560e01c806372279ba1116101bf578063b3606b56116100fa578063d6a153f11161009d578063d6a153f114610db9578063d925351a14610dd6578063de0d1b9414610df3578063dfb481c914610e10578063e64559ad14610e18578063e68a22c014610e20578063eeaa783a14610e28578063f90ce5ba14610e3057610350565b8063b3606b5614610ba0578063b70c7b7014610ba8578063c8390a4814610bc5578063c84a912414610ce8578063cab44b7614610cf0578063ce98dfa814610d4e578063cfad57a214610d6d578063cfed246b14610d9357610350565b8063807c978211610162578063807c97821461044e57806382553aad14610b205780638b7677f414610b3d57806395082d2514610b5a578063a2b47c1614610b62578063a374242514610b6a578063a6eca89614610b90578063b0a2566614610b9857610350565b806372279ba1146107e057806374bfed891461082c578063776d16c114610834578063782661bc146108515780637cb2b79c146109765780637df73e271461099c5780637fbc79c6146109c25780637fece36814610aec57610350565b8063392e53cd1161028f57806354aea1271161023257806354aea1271461074f578063574ec1be1461075757806361ef161f14610792578063668d3d651461079a578063695d4184146107a25780636c56fd05146107aa5780636ccd47c4146107d0578063715c7536146107d857610350565b8063392e53cd1461059f5780633aa08f86146105a757806344c23193146105af5780634bd66c1c1461044e5780634c0e31c8146105cc5780634d11fb4a146106ef5780634f64b2be1461070c5780634fdfb0861461072957610350565b8063162ac4e0116102f7578063162ac4e0146104a757806317835d1c146104cd5780631a153391146104f0578063238aafb71461051e578063287800c9146105445780632a709b141461054c5780632e9cd94b1461055457806331cb61051461057157610350565b806303b049361461035557806303cd25711461038f57806303f4d7dc146103a95780630604ddea1461044e5780630e9272ea14610456578063126082cf1461047a57806312d43a511461048257806314dd2dce1461048a575b600080fd5b61037b6004803603602081101561036b57600080fd5b50356001600160a01b0316610e38565b604080519115158252519081900360200190f35b610397610e4d565b60408051918252519081900360200190f35b61044c600480360360408110156103bf57600080fd5b810190602081018135600160201b8111156103d957600080fd5b8201836020820111156103eb57600080fd5b803590602001918460208302840111600160201b8311171561040c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610e53915050565b005b610397610fca565b61045e610fd2565b604080516001600160a01b039092168252519081900360200190f35b610397610fe1565b61045e610fe7565b61044c600480360360208110156104a057600080fd5b5035610ff6565b61044c600480360360208110156104bd57600080fd5b50356001600160a01b0316611048565b61044c600480360360408110156104e357600080fd5b50803590602001356110b7565b61044c6004803603604081101561050657600080fd5b506001600160a01b0381351690602001351515611113565b61044c6004803603602081101561053457600080fd5b50356001600160a01b031661118b565b6103976111fa565b61045e611200565b61044c6004803603602081101561056a57600080fd5b503561120f565b61044c6004803603604081101561058757600080fd5b506001600160a01b0381351690602001351515611261565b61037b6112d9565b6103976112e9565b61044c600480360360208110156105c557600080fd5b50356112ef565b61044c600480360360408110156105e257600080fd5b810190602081018135600160201b8111156105fc57600080fd5b82018360208201111561060e57600080fd5b803590602001918460208302840111600160201b8311171561062f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561067e57600080fd5b82018360208201111561069057600080fd5b803590602001918460208302840111600160201b831117156106b157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611382945050505050565b6103976004803603602081101561070557600080fd5b503561142d565b61045e6004803603602081101561072257600080fd5b503561144b565b61037b6004803603602081101561073f57600080fd5b50356001600160a01b0316611472565b610397611487565b61044c600480360360c081101561076d57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561148d565b61045e61169c565b6103976116ab565b61037b6116b1565b61037b600480360360208110156107c057600080fd5b50356001600160a01b03166116c1565b61044c61174c565b61039761185f565b610806600480360360208110156107f657600080fd5b50356001600160a01b0316611865565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6103976118e3565b61044c6004803603602081101561084a57600080fd5b50356118e9565b61044c6004803603606081101561086757600080fd5b810190602081018135600160201b81111561088157600080fd5b82018360208201111561089357600080fd5b803590602001918460208302840111600160201b831117156108b457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561090357600080fd5b82018360208201111561091557600080fd5b803590602001918460208302840111600160201b8311171561093657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061193b915050565b61044c6004803603602081101561098c57600080fd5b50356001600160a01b0316611a09565b61037b600480360360208110156109b257600080fd5b50356001600160a01b0316611a78565b61044c600480360360608110156109d857600080fd5b81359190810190604081016020820135600160201b8111156109f957600080fd5b820183602082011115610a0b57600080fd5b803590602001918460208302840111600160201b83111715610a2c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b803590602001918460208302840111600160201b83111715610aae57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a8d945050505050565b61039760048036036060811015610b0257600080fd5b506001600160a01b0381351690602081013590604001351515611be6565b61044c60048036036020811015610b3657600080fd5b5035611d6c565b61044c60048036036020811015610b5357600080fd5b5035611dbe565b610397611e10565b610397611e20565b61039760048036036020811015610b8057600080fd5b50356001600160a01b0316611e27565b610397611e39565b610397611e3f565b610397611e45565b61044c60048036036020811015610bbe57600080fd5b5035611e4b565b61044c60048036036040811015610bdb57600080fd5b810190602081018135600160201b811115610bf557600080fd5b820183602082011115610c0757600080fd5b803590602001918460208302840111600160201b83111715610c2857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c7757600080fd5b820183602082011115610c8957600080fd5b803590602001918460208302840111600160201b83111715610caa57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e9d945050505050565b61044c611f67565b610d1660048036036020811015610d0657600080fd5b50356001600160a01b031661207f565b604080516001600160a01b03909516855263ffffffff9384166020860152918316848301529091166060830152519081900360800190f35b61044c60048036036020811015610d6457600080fd5b503515156120be565b61044c60048036036020811015610d8357600080fd5b50356001600160a01b0316612129565b61039760048036036020811015610da957600080fd5b50356001600160a01b0316612198565b61044c60048036036020811015610dcf57600080fd5b50356121aa565b61044c60048036036020811015610dec57600080fd5b50356121fc565b61044c60048036036020811015610e0957600080fd5b503561224e565b6103976122a0565b6103976122a6565b6103976122ac565b61045e6122b7565b6103976122c6565b60166020526000908152604090205460ff1681565b60075481565b3360009081526011602052604090205460ff16610ea5576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b6000610eb0826122cc565b90508015610fc4576002546001546001600160a01b03918216911660005b8551811015610fc0576000868281518110610ee557fe5b6020026020010151905060005b6008811015610fb657601754600884028201908110610f175750505050505050610fc6565b60178054602084029185831c63ffffffff169160009190600889028701908110610f3d57fe5b6000918252602082200154601880546001600160a01b0390921693509060088a028801908110610f6957fe5b60009182526020822001549150610f9682610f908668327cb2734119d3b7a9601e1b6123d8565b9061243a565b9050610fa483828c8e612479565b505060019094019350610ef292505050565b5050600101610ece565b5050505b505b5050565b63ffffffff81565b6002546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b03163314611043576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600555565b6000546001600160a01b03163314611095576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526011602052604090205460ff16611109576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b610fc6828261270e565b6000546001600160a01b03163314611160576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146111d8576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b6003546001600160a01b031681565b6003546001600160a01b0316331461125c576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b600d55565b6000546001600160a01b031633146112ae576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600054600160a01b900460ff1681565b600c5481565b6000546001600160a01b0316331461133c576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b61070881111561137d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c966025913960400191505060405180910390fd5b600755565b6003546001600160a01b031633146113cf576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b60005b8251811015610fc45760008382815181106113e957fe5b602002602001015190508282815181106113ff57fe5b6020908102919091018101516001600160a01b039092166000908152601490915260409020556001016113d2565b6018818154811061143a57fe5b600091825260209091200154905081565b6017818154811061145857fe5b6000918252602090912001546001600160a01b0316905081565b60116020526000908152604090205460ff1681565b60055481565b3360009081526011602052604090205460ff166114df576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b6114e9868661270e565b60048054604080516304dabc3160e51b815290516001600160a01b03909216926000926115699287928692639b57862092808301926020929182900301818987803b15801561153757600080fd5b505af115801561154b573d6000803e3d6000fd5b505050506040513d602081101561156157600080fd5b5051906127e4565b905060006115ac84846001600160a01b0316631bca8cf06040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561153757600080fd5b9050818711156115ba578196505b808611156115c6578095505b60408051629a208160e81b81526004810189905233602482015290516001600160a01b03851691639a20810091604480830192600092919082900301818387803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b50506040805163f3883d8b60e01b8152600481018a905233602482015290516001600160a01b038716935063f3883d8b9250604480830192600092919082900301818387803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160a01b031681565b61070881565b600054600160a81b900460ff1681565b60008054600160a81b900460ff16156116dc57506000611747565b600f54601054106116ef57506000611747565b6000806116fb84611865565b935093505050818111801561173057506001600160a01b03841660009081526014602052604090205461172e828461283c565b115b1561174057600092505050611747565b6001925050505b919050565b3360009081526015602052604090205460ff1661179e576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff16611802576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601660205260409020805460ff1916905560105461182790600161283c565b6010556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600e5481565b600080600080611873612b8e565b505050506001600160a01b039182166000908152601360209081526040918290208251608081018452905494851680825263ffffffff600160a01b87048116938301849052600160c01b87048116948301859052600160e01b909604909516606090910181905293949093919250565b60095481565b6000546001600160a01b03163314611936576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600c55565b3360009081526011602052604090205460ff1661198d576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b6000611998826122cc565b90508015611a03576002546001546001600160a01b03918216911660005b86518110156119ff5760008782815181106119cd57fe5b602002602001015190506119f6818884815181106119e757fe5b60200260200101518587612479565b506001016119b6565b5050505b50505050565b6003546001600160a01b03163314611a56576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6000546001600160a01b03163314611ada576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1615611b235760405162461bcd60e51b8152600401808060200182810382526022815260200180612df96022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600f8490555b8251811015611b8f576000838281518110611b5357fe5b6020908102919091018101516001600160a01b03166000908152601590915260409020805460ff19166001908117909155919091019050611b3c565b5060005b8151811015611a03576000828281518110611baa57fe5b6020908102919091018101516001600160a01b03166000908152601190915260409020805460ff19166001908117909155919091019050611b93565b6000611bff6008546005546127e490919063ffffffff16565b421115611c5a578115611c3a57611c33612710610f90611c2c600a546127106127e490919063ffffffff16565b86906123d8565b9050611d65565b611c33612710610f90611c2c600a5461271061283c90919063ffffffff16565b600754600554611c69916127e4565b421115611cb6578115611c9657611c33612710610f90611c2c6009546127106127e490919063ffffffff16565b611c33612710610f90611c2c60095461271061283c90919063ffffffff16565b6001600160a01b03841660009081526012602052604090205480611cdd5783915050611d65565b6000818511611cf557611cf0828661283c565b611cff565b611cff858361283c565b9050611d1185610f90836127106123d8565b90506000611d1e876116c1565b1580611d2b5750600e5482115b90508015611d5f578415611d5257828611611d465782611d48565b855b9350505050611d65565b828610611d465782611d48565b50909150505b9392505050565b6003546001600160a01b03163314611db9576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b600e55565b6000546001600160a01b03163314611e0b576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600855565b68327cb2734119d3b7a9601e1b81565b6298968081565b60146020526000908152604090205481565b600a5481565b60105481565b600b5481565b6000546001600160a01b03163314611e98576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600955565b6000546001600160a01b03163314611eea576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b8051825114611f40576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611f53906017906020850190612bb5565b508051610fc4906018906020840190612c1a565b3360009081526015602052604090205460ff16611fb9576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff161561201e576040805162461bcd60e51b815260206004820152601c60248201527f466173745072696365466565643a20616c726561647920766f74656400000000604482015290519081900360640190fd5b336000908152601660205260409020805460ff19166001908117909155601054612047916127e4565b6010556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6013602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b6000546001600160a01b0316331461210b576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314612176576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205481565b6000546001600160a01b031633146121f7576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600b55565b6003546001600160a01b03163314612249576040805162461bcd60e51b81526020600482015260186024820152600080516020612d05833981519152604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331461229b576040805162461bcd60e51b81526020600482015260156024820152600080516020612ce5833981519152604482015290519081900360640190fd5b600a55565b600d5481565b60085481565b6001600160a01b0381565b6001546001600160a01b031681565b60065481565b600b546000901561232557600b546006546122e890439061283c565b10156123255760405162461bcd60e51b815260040180806020018281038252602e815260200180612da2602e913960400191505060405180910390fd5b600c54612332428261283c565b831161236f5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d75602d913960400191505060405180910390fd5b61237942826127e4565b83106123b65760405162461bcd60e51b815260040180806020018281038252602f815260200180612d25602f913960400191505060405180910390fd5b6005548310156123ca576000915050611747565b505060055543600655600190565b6000826123e757506000612434565b828202828482816123f457fe5b04146124315760405162461bcd60e51b8152600401808060200182810382526021815260200180612d546021913960400191505060405180910390fd5b90505b92915050565b600061243183836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061287e565b6001600160a01b038216156126e8576000826001600160a01b03166356bf9de4866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124d757600080fd5b505afa1580156124eb573d6000803e3d6000fd5b505050506040513d602081101561250157600080fd5b50516001600160a01b03861660009081526012602052604081205491925080808061252b8a611865565b935093509350935060008411156125f25760008487116125545761254f858861283c565b61255e565b61255e878661283c565b905060008a8711612578576125738b8861283c565b612582565b612582878c61283c565b9050612599600d544261243a90919063ffffffff16565b600d546125a790879061243a565b146125b55760009350600092505b6125d06125c987610f9085629896806123d8565b85906127e4565b93506125ed6125e688610f9084629896806123d8565b84906127e4565b925050505b818111801561262157506001600160a01b038a1660009081526014602052604090205461261f828461283c565b115b1561267e57604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517fe582322b389ad06b2bbf619cd6da3f16a288ec873ea0fa6df4d72f3d9480b4479181900360a00190a15b61268a8a878484612920565b604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517f23b9387f81fca646aac1dc4487ede045c65f5f7445482906565f01e05afdb3a89181900360a00190a15050505050505b6001600160a01b0384166000908152601260205260409020839055611a03818585612ab6565b6000612719826122cc565b90508015610fc4576002546001546001600160a01b03918216911660005b6008811015610fc05760175481908110612755575050505050610fc6565b60178054602084029189831c63ffffffff1691600091908690811061277657fe5b6000918252602082200154601880546001600160a01b039092169350908790811061279d57fe5b600091825260208220015491506127c482610f908668327cb2734119d3b7a9601e1b6123d8565b90506127d283828a8c612479565b50506001909401935061273792505050565b600082820183811015612431576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600061243183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b34565b6000818361290a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128cf5781810151838201526020016128b7565b50505050905090810190601f1680156128fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161291657fe5b0495945050505050565b6001600160a01b03831061297b576040805162461bcd60e51b815260206004820152601f60248201527f466173745072696365466565643a20696e76616c696420726566507269636500604482015290519081900360640190fd5b63ffffffff82106129bd5760405162461bcd60e51b8152600401808060200182810382526029815260200180612dd06029913960400191505060405180910390fd5b63ffffffff81106129ff5760405162461bcd60e51b815260040180806020018281038252602a815260200180612cbb602a913960400191505060405180910390fd5b604080516080810182526001600160a01b03948516815263ffffffff4281166020808401918252958216838501908152948216606084019081529787166000908152601390965292909420905181549251935196518516600160e01b026001600160e01b03978616600160c01b0263ffffffff60c01b1995909616600160a01b0263ffffffff60a01b19929097166001600160a01b0319909416939093171694909417919091169190911792909216919091179055565b6001600160a01b038316612ac957610fc4565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612b2057600080fd5b505af11580156119ff573d6000803e3d6000fd5b60008184841115612b865760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156128cf5781810151838201526020016128b7565b505050900390565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054828255906000526020600020908101928215612c0a579160200282015b82811115612c0a57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612bd5565b50612c16929150612c61565b5090565b828054828255906000526020600020908101928215612c55579160200282015b82811115612c55578251825591602001919060010190612c3a565b50612c16929150612c80565b5b80821115612c165780546001600160a01b0319168155600101612c62565b5b80821115612c165760008155600101612c8156fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e466173745072696365466565643a20696e76616c69642063756d756c61746976654661737444656c7461476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20696e76616c69642063756d756c617469766552656644656c7461466173745072696365466565643a20616c726561647920696e697469616c697a6564a26469706673582212209b77ec46d237ce6a1dabce3cea9d1ddde2bb7645d0e3611655447a8cfa9e9b3164736f6c634300060c0033466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000dde4c458c7709005edbbb48739203a9674ca4387000000000000000000000000bab0dd4f88d0042d955a0c026fa4b429635f7063000000000000000000000000f58ea416eb0a786a84c869ec8e154d212e3e2fe2

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.