Contract 0xfe661cbf27da0656b7a1151a761ff194849c387a

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd134e4b8d69e2b1e7429a5c8ac486d654833251d6ff1c68a80aa70bfd61e0667Set Gov210314072022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000059915379 ETH
0x00ad529f6fce6b3539a705dbdad129a6f958e370b3fe448ce07381d140bb519aSet Token Config210314052022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000088518142 ETH
0x24f639d2b8bc0a039055a05a1b440edee4a8f1fcc08d819a1c5765d9357c2951Set Token Config210314002022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.00008851827 ETH
0xc14fd4b03ca4da4b6a537cea17284495c0e4b3f23dad539295de692c5e37ad5aSet Token Config210313942022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000088872782 ETH
0x3a6b003cfe0054d354966bd3a2ee226188b08491b6919e90e05b2519f6844810Set Token Config210313882022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000089051456 ETH
0xfe81c937d80bfac1b1b94da8729d3bebf19e769b78600f175aa335ca3a149a8eSet Token Config210313812022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.00008224977 ETH
0x4869016d7b5714e35ca9b0cde667f7f3f559ed7666b6ef2cfe8ff607b5e4f738Set Token Config210313792022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000082428443 ETH
0x18f2d487e2670c0536a1ca133a5ee3d37f3388efb27826038a140cae58d63d1bSet Token Config210313772022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000088873942 ETH
0x73cc10f4c05fcaf0d2a144d7ecfeb939c6f32ef685334a6c1e1c48f2497a0079Set Token Config210313742022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000082424321 ETH
0x430a9e2008b90d8baf7285e46ae4940b94ac77e3b07081fe156cf04479aff4daSet Token Config210313712022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000082428701 ETH
0x8f8ccf8ac97a67a0b5bf699b7ef75426be7536fe94707b6b819924f278e281d7Set Chainlink Fl...210313662022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.00006009096 ETH
0xd0296b7f3362a5b0938504365766e4ab2baea739f27ebe720c721e6cd1fbd7e2Set Is Amm Enabl...210313622022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000056002348 ETH
0xb5ae2fc4641f13c095b36e1152be9e1056b0aaf6e75976b11da01323e73c97e6Set Secondary Pr...210313532022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000066180916 ETH
0x3554391ff74fa9fe41c916565eb3f7f192ac649321723ff1758f142ea01d44b3Set Price Sample...210313482022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000056535147 ETH
0xae5eb123fca70584d3da220caa3fcc31267d198838401a67d60a7580c622e42fSet Max Strict P...210313442022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH0.000064402172 ETH
0x623adda8bff97e0dc9a22e416511f1c22ebdb8ef11cc74997276e00b73f890a90x60806040210313402022-08-23 7:53:36158 days 8 hrs agoGMX: Deployer IN  Contract Creation0 ETH0.002089880527 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x9c917083fdb403ab5adbec26ee294f6ecada27200 ETH
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x86e53cf1b870786351da77a57575e79cb55812cb0 ETH
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x639fe6ab55c921f74e7fac1ee960c0b6293ba6120 ETH
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x6ce185860a4963106506c203335a2910413708e90 ETH
0x485e38bf0db234b412a0a1a44cb86f03df48ab1148ea1f0af320ec4ee245fdaa368107142022-11-10 4:21:2879 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x9c917083fdb403ab5adbec26ee294f6ecada27200 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x86e53cf1b870786351da77a57575e79cb55812cb0 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x639fe6ab55c921f74e7fac1ee960c0b6293ba6120 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x6ce185860a4963106506c203335a2910413708e90 ETH
0xcb4ec9419dcb4c0f1ed817115e63794c22c06477cc47313691af977f8eb42529368101682022-11-10 4:18:5179 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x9c917083fdb403ab5adbec26ee294f6ecada27200 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x86e53cf1b870786351da77a57575e79cb55812cb0 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x639fe6ab55c921f74e7fac1ee960c0b6293ba6120 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x6ce185860a4963106506c203335a2910413708e90 ETH
0xcd974176510840645fd845b79f9e872d6b68072829f8354d8e21fc5ffdf1fb5f326389932022-10-26 4:19:1894 days 12 hrs ago 0x8960d1b45a2d15d063b84b34dfb2fb2ca7535527 0xfe661cbf27da0656b7a1151a761ff194849c387a0 ETH
0xa3a4297a174812b60cd65ff2356a1cac58f833fc2bf63e5d9f12cc60cba13402326344842022-10-26 3:56:1294 days 12 hrs ago 0xfe661cbf27da0656b7a1151a761ff194849c387a 0x9c917083fdb403ab5adbec26ee294f6ecada27200 ETH
[ Download CSV Export 
Loading

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

Contract Name:
VaultPriceFeed

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : VaultPriceFeed.sol
// SPDX-License-Identifier: MIT

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

import "./interfaces/IVaultPriceFeed.sol";
import "../oracle/interfaces/IPriceFeed.sol";
import "../oracle/interfaces/ISecondaryPriceFeed.sol";
import "../oracle/interfaces/IChainlinkFlags.sol";
import "../amm/interfaces/IPancakePair.sol";

pragma solidity 0.6.12;

contract VaultPriceFeed is IVaultPriceFeed {
    using SafeMath for uint256;

    uint256 public constant PRICE_PRECISION = 10 ** 30;
    uint256 public constant ONE_USD = PRICE_PRECISION;
    uint256 public constant BASIS_POINTS_DIVISOR = 10000;
    uint256 public constant MAX_SPREAD_BASIS_POINTS = 50;
    uint256 public constant MAX_ADJUSTMENT_INTERVAL = 2 hours;
    uint256 public constant MAX_ADJUSTMENT_BASIS_POINTS = 20;

    // Identifier of the Sequencer offline flag on the Flags contract
    address constant private FLAG_ARBITRUM_SEQ_OFFLINE = address(bytes20(bytes32(uint256(keccak256("chainlink.flags.arbitrum-seq-offline")) - 1)));

    address public gov;
    address public chainlinkFlags;

    bool public isAmmEnabled = true;
    bool public isSecondaryPriceEnabled = true;
    bool public useV2Pricing = false;
    bool public favorPrimaryPrice = false;
    uint256 public priceSampleSpace = 3;
    uint256 public maxStrictPriceDeviation = 0;
    address public secondaryPriceFeed;
    uint256 public spreadThresholdBasisPoints = 30;

    address public btc;
    address public eth;
    address public bnb;
    address public bnbBusd;
    address public ethBnb;
    address public btcBnb;

    mapping (address => address) public priceFeeds;
    mapping (address => uint256) public priceDecimals;
    mapping (address => uint256) public spreadBasisPoints;
    // Chainlink can return prices for stablecoins
    // that differs from 1 USD by a larger percentage than stableSwapFeeBasisPoints
    // we use strictStableTokens to cap the price to 1 USD
    // this allows us to configure stablecoins like DAI as being a stableToken
    // while not being a strictStableToken
    mapping (address => bool) public strictStableTokens;

    mapping (address => uint256) public override adjustmentBasisPoints;
    mapping (address => bool) public override isAdjustmentAdditive;
    mapping (address => uint256) public lastAdjustmentTimings;

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

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

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

    function setChainlinkFlags(address _chainlinkFlags) external onlyGov {
        chainlinkFlags = _chainlinkFlags;
    }

    function setAdjustment(address _token, bool _isAdditive, uint256 _adjustmentBps) external override onlyGov {
        require(
            lastAdjustmentTimings[_token].add(MAX_ADJUSTMENT_INTERVAL) < block.timestamp,
            "VaultPriceFeed: adjustment frequency exceeded"
        );
        require(_adjustmentBps <= MAX_ADJUSTMENT_BASIS_POINTS, "invalid _adjustmentBps");
        isAdjustmentAdditive[_token] = _isAdditive;
        adjustmentBasisPoints[_token] = _adjustmentBps;
        lastAdjustmentTimings[_token] = block.timestamp;
    }

    function setUseV2Pricing(bool _useV2Pricing) external override onlyGov {
        useV2Pricing = _useV2Pricing;
    }

    function setIsAmmEnabled(bool _isEnabled) external override onlyGov {
        isAmmEnabled = _isEnabled;
    }

    function setIsSecondaryPriceEnabled(bool _isEnabled) external override onlyGov {
        isSecondaryPriceEnabled = _isEnabled;
    }

    function setSecondaryPriceFeed(address _secondaryPriceFeed) external onlyGov {
        secondaryPriceFeed = _secondaryPriceFeed;
    }

    function setTokens(address _btc, address _eth, address _bnb) external onlyGov {
        btc = _btc;
        eth = _eth;
        bnb = _bnb;
    }

    function setPairs(address _bnbBusd, address _ethBnb, address _btcBnb) external onlyGov {
        bnbBusd = _bnbBusd;
        ethBnb = _ethBnb;
        btcBnb = _btcBnb;
    }

    function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints) external override onlyGov {
        require(_spreadBasisPoints <= MAX_SPREAD_BASIS_POINTS, "VaultPriceFeed: invalid _spreadBasisPoints");
        spreadBasisPoints[_token] = _spreadBasisPoints;
    }

    function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints) external override onlyGov {
        spreadThresholdBasisPoints = _spreadThresholdBasisPoints;
    }

    function setFavorPrimaryPrice(bool _favorPrimaryPrice) external override onlyGov {
        favorPrimaryPrice = _favorPrimaryPrice;
    }

    function setPriceSampleSpace(uint256 _priceSampleSpace) external override onlyGov {
        require(_priceSampleSpace > 0, "VaultPriceFeed: invalid _priceSampleSpace");
        priceSampleSpace = _priceSampleSpace;
    }

    function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation) external override onlyGov {
        maxStrictPriceDeviation = _maxStrictPriceDeviation;
    }

    function setTokenConfig(
        address _token,
        address _priceFeed,
        uint256 _priceDecimals,
        bool _isStrictStable
    ) external override onlyGov {
        priceFeeds[_token] = _priceFeed;
        priceDecimals[_token] = _priceDecimals;
        strictStableTokens[_token] = _isStrictStable;
    }

    function getPrice(address _token, bool _maximise, bool _includeAmmPrice, bool /* _useSwapPricing */) public override view returns (uint256) {
        uint256 price = useV2Pricing ? getPriceV2(_token, _maximise, _includeAmmPrice) : getPriceV1(_token, _maximise, _includeAmmPrice);

        uint256 adjustmentBps = adjustmentBasisPoints[_token];
        if (adjustmentBps > 0) {
            bool isAdditive = isAdjustmentAdditive[_token];
            if (isAdditive) {
                price = price.mul(BASIS_POINTS_DIVISOR.add(adjustmentBps)).div(BASIS_POINTS_DIVISOR);
            } else {
                price = price.mul(BASIS_POINTS_DIVISOR.sub(adjustmentBps)).div(BASIS_POINTS_DIVISOR);
            }
        }

        return price;
    }

    function getPriceV1(address _token, bool _maximise, bool _includeAmmPrice) public view returns (uint256) {
        uint256 price = getPrimaryPrice(_token, _maximise);

        if (_includeAmmPrice && isAmmEnabled) {
            uint256 ammPrice = getAmmPrice(_token);
            if (ammPrice > 0) {
                if (_maximise && ammPrice > price) {
                    price = ammPrice;
                }
                if (!_maximise && ammPrice < price) {
                    price = ammPrice;
                }
            }
        }

        if (isSecondaryPriceEnabled) {
            price = getSecondaryPrice(_token, price, _maximise);
        }

        if (strictStableTokens[_token]) {
            uint256 delta = price > ONE_USD ? price.sub(ONE_USD) : ONE_USD.sub(price);
            if (delta <= maxStrictPriceDeviation) {
                return ONE_USD;
            }

            // if _maximise and price is e.g. 1.02, return 1.02
            if (_maximise && price > ONE_USD) {
                return price;
            }

            // if !_maximise and price is e.g. 0.98, return 0.98
            if (!_maximise && price < ONE_USD) {
                return price;
            }

            return ONE_USD;
        }

        uint256 _spreadBasisPoints = spreadBasisPoints[_token];

        if (_maximise) {
            return price.mul(BASIS_POINTS_DIVISOR.add(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR);
        }

        return price.mul(BASIS_POINTS_DIVISOR.sub(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR);
    }

    function getPriceV2(address _token, bool _maximise, bool _includeAmmPrice) public view returns (uint256) {
        uint256 price = getPrimaryPrice(_token, _maximise);

        if (_includeAmmPrice && isAmmEnabled) {
            price = getAmmPriceV2(_token, _maximise, price);
        }

        if (isSecondaryPriceEnabled) {
            price = getSecondaryPrice(_token, price, _maximise);
        }

        if (strictStableTokens[_token]) {
            uint256 delta = price > ONE_USD ? price.sub(ONE_USD) : ONE_USD.sub(price);
            if (delta <= maxStrictPriceDeviation) {
                return ONE_USD;
            }

            // if _maximise and price is e.g. 1.02, return 1.02
            if (_maximise && price > ONE_USD) {
                return price;
            }

            // if !_maximise and price is e.g. 0.98, return 0.98
            if (!_maximise && price < ONE_USD) {
                return price;
            }

            return ONE_USD;
        }

        uint256 _spreadBasisPoints = spreadBasisPoints[_token];

        if (_maximise) {
            return price.mul(BASIS_POINTS_DIVISOR.add(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR);
        }

        return price.mul(BASIS_POINTS_DIVISOR.sub(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR);
    }

    function getAmmPriceV2(address _token, bool _maximise, uint256 _primaryPrice) public view returns (uint256) {
        uint256 ammPrice = getAmmPrice(_token);
        if (ammPrice == 0) {
            return _primaryPrice;
        }

        uint256 diff = ammPrice > _primaryPrice ? ammPrice.sub(_primaryPrice) : _primaryPrice.sub(ammPrice);
        if (diff.mul(BASIS_POINTS_DIVISOR) < _primaryPrice.mul(spreadThresholdBasisPoints)) {
            if (favorPrimaryPrice) {
                return _primaryPrice;
            }
            return ammPrice;
        }

        if (_maximise && ammPrice > _primaryPrice) {
            return ammPrice;
        }

        if (!_maximise && ammPrice < _primaryPrice) {
            return ammPrice;
        }

        return _primaryPrice;
    }

    function getLatestPrimaryPrice(address _token) public override view returns (uint256) {
        address priceFeedAddress = priceFeeds[_token];
        require(priceFeedAddress != address(0), "VaultPriceFeed: invalid price feed");

        IPriceFeed priceFeed = IPriceFeed(priceFeedAddress);

        int256 price = priceFeed.latestAnswer();
        require(price > 0, "VaultPriceFeed: invalid price");

        return uint256(price);
    }

    function getPrimaryPrice(address _token, bool _maximise) public override view returns (uint256) {
        address priceFeedAddress = priceFeeds[_token];
        require(priceFeedAddress != address(0), "VaultPriceFeed: invalid price feed");

        if (chainlinkFlags != address(0)) {
            bool isRaised = IChainlinkFlags(chainlinkFlags).getFlag(FLAG_ARBITRUM_SEQ_OFFLINE);
            if (isRaised) {
                    // If flag is raised we shouldn't perform any critical operations
                revert("Chainlink feeds are not being updated");
            }
        }

        IPriceFeed priceFeed = IPriceFeed(priceFeedAddress);

        uint256 price = 0;
        uint80 roundId = priceFeed.latestRound();

        for (uint80 i = 0; i < priceSampleSpace; i++) {
            if (roundId <= i) { break; }
            uint256 p;

            if (i == 0) {
                int256 _p = priceFeed.latestAnswer();
                require(_p > 0, "VaultPriceFeed: invalid price");
                p = uint256(_p);
            } else {
                (, int256 _p, , ,) = priceFeed.getRoundData(roundId - i);
                require(_p > 0, "VaultPriceFeed: invalid price");
                p = uint256(_p);
            }

            if (price == 0) {
                price = p;
                continue;
            }

            if (_maximise && p > price) {
                price = p;
                continue;
            }

            if (!_maximise && p < price) {
                price = p;
            }
        }

        require(price > 0, "VaultPriceFeed: could not fetch price");
        // normalise price precision
        uint256 _priceDecimals = priceDecimals[_token];
        return price.mul(PRICE_PRECISION).div(10 ** _priceDecimals);
    }

    function getSecondaryPrice(address _token, uint256 _referencePrice, bool _maximise) public view returns (uint256) {
        if (secondaryPriceFeed == address(0)) { return _referencePrice; }
        return ISecondaryPriceFeed(secondaryPriceFeed).getPrice(_token, _referencePrice, _maximise);
    }

    function getAmmPrice(address _token) public override view returns (uint256) {
        if (_token == bnb) {
            // for bnbBusd, reserve0: BNB, reserve1: BUSD
            return getPairPrice(bnbBusd, true);
        }

        if (_token == eth) {
            uint256 price0 = getPairPrice(bnbBusd, true);
            // for ethBnb, reserve0: ETH, reserve1: BNB
            uint256 price1 = getPairPrice(ethBnb, true);
            // this calculation could overflow if (price0 / 10**30) * (price1 / 10**30) is more than 10**17
            return price0.mul(price1).div(PRICE_PRECISION);
        }

        if (_token == btc) {
            uint256 price0 = getPairPrice(bnbBusd, true);
            // for btcBnb, reserve0: BTC, reserve1: BNB
            uint256 price1 = getPairPrice(btcBnb, true);
            // this calculation could overflow if (price0 / 10**30) * (price1 / 10**30) is more than 10**17
            return price0.mul(price1).div(PRICE_PRECISION);
        }

        return 0;
    }

    // if divByReserve0: calculate price as reserve1 / reserve0
    // if !divByReserve1: calculate price as reserve0 / reserve1
    function getPairPrice(address _pair, bool _divByReserve0) public view returns (uint256) {
        (uint256 reserve0, uint256 reserve1, ) = IPancakePair(_pair).getReserves();
        if (_divByReserve0) {
            if (reserve0 == 0) { return 0; }
            return reserve1.mul(PRICE_PRECISION).div(reserve0);
        }
        if (reserve1 == 0) { return 0; }
        return reserve0.mul(PRICE_PRECISION).div(reserve1);
    }
}

File 2 of 7 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

File 3 of 7 : 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 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 4 of 7 : IPriceFeed.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IPriceFeed {
    function description() external view returns (string memory);
    function aggregator() external view returns (address);
    function latestAnswer() external view returns (int256);
    function latestRound() external view returns (uint80);
    function getRoundData(uint80 roundId) external view returns (uint80, int256, uint256, uint256, uint80);
}

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

pragma solidity 0.6.12;

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

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

pragma solidity 0.6.12;

interface IChainlinkFlags {
  function getFlag(address) external view returns (bool);
}

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

pragma solidity >=0.5.0;

interface IPancakePair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}

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

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ADJUSTMENT_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ADJUSTMENT_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SPREAD_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_USD","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":[{"internalType":"address","name":"","type":"address"}],"name":"adjustmentBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnbBusd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"btc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"btcBnb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainlinkFlags","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethBnb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"favorPrimaryPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getAmmPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"uint256","name":"_primaryPrice","type":"uint256"}],"name":"getAmmPriceV2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getLatestPrimaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_divByReserve0","type":"bool"}],"name":"getPairPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"bool","name":"_includeAmmPrice","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"bool","name":"_includeAmmPrice","type":"bool"}],"name":"getPriceV1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"bool","name":"_includeAmmPrice","type":"bool"}],"name":"getPriceV2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getPrimaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_referencePrice","type":"uint256"},{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getSecondaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdjustmentAdditive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAmmEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSecondaryPriceEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastAdjustmentTimings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStrictPriceDeviation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceFeeds","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceSampleSpace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_isAdditive","type":"bool"},{"internalType":"uint256","name":"_adjustmentBps","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_chainlinkFlags","type":"address"}],"name":"setChainlinkFlags","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_favorPrimaryPrice","type":"bool"}],"name":"setFavorPrimaryPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"setIsAmmEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"setIsSecondaryPriceEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxStrictPriceDeviation","type":"uint256"}],"name":"setMaxStrictPriceDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bnbBusd","type":"address"},{"internalType":"address","name":"_ethBnb","type":"address"},{"internalType":"address","name":"_btcBnb","type":"address"}],"name":"setPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceSampleSpace","type":"uint256"}],"name":"setPriceSampleSpace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_secondaryPriceFeed","type":"address"}],"name":"setSecondaryPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_spreadBasisPoints","type":"uint256"}],"name":"setSpreadBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_spreadThresholdBasisPoints","type":"uint256"}],"name":"setSpreadThresholdBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_priceFeed","type":"address"},{"internalType":"uint256","name":"_priceDecimals","type":"uint256"},{"internalType":"bool","name":"_isStrictStable","type":"bool"}],"name":"setTokenConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_btc","type":"address"},{"internalType":"address","name":"_eth","type":"address"},{"internalType":"address","name":"_bnb","type":"address"}],"name":"setTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useV2Pricing","type":"bool"}],"name":"setUseV2Pricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"spreadBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spreadThresholdBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strictStableTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useV2Pricing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526001805461ffff60b01b1960ff60a81b1960ff60a01b19909216600160a01b1791909116600160a81b171690556003600281905560009055601e60055534801561004d57600080fd5b50600080546001600160a01b031916331790556121098061006f6000396000f3fe608060405234801561001057600080fd5b50600436106102675760003560e01c80630957aed91461026c5780631193c80914610286578063126082cf146102aa57806312d43a51146102b25780632fa03b8f146102ba5780632fbfe3d3146102d95780632fc3a70a146102f657806330536ee514610334578063378e7bf7146103505780633d949c5f146103585780633eba8d361461038e5780633ebbc601146103c25780633f0c3bb7146103ca578063443be209146103d257806348cac2771461040a57806349a876e4146104305780634a4b1f4f146104385780634b9ade471461044057806356bf9de41461047e57806356c8c2c1146104a4578063593d9e80146104d2578063604f37e9146104da57806367781c0e146104f95780636ce8a44b146105015780636fc8070814610527578063717cfe7a1461052f578063732391b414610555578063826e055f1461058b5780638b86616c146105b15780638c7c9e0c146105b957806393f69074146105c157806395082d25146104f9578063971bd396146105f957806397dfade7146106015780639917dc74146106095780639a0a6635146106285780639b18dc471461064e5780639b889380146106565780639dcb511a14610682578063a27ea386146106a8578063a28d57d8146106ce578063a2ad7b93146106d6578063a39c73a314610704578063b02a2de41461070c578063b731dd8714610740578063b8f611051461075d578063c2138d8c14610783578063cefe0f21146107a9578063cfad57a2146107cf578063d694376c146107f5578063e4440e0214610829578063eb1c92a914610831578063fd34ec4014610850575b600080fd5b61027461086f565b60408051918252519081900360200190f35b61028e610874565b604080516001600160a01b039092168252519081900360200190f35b610274610883565b61028e610889565b6102d7600480360360208110156102d057600080fd5b5035610898565b005b6102d7600480360360208110156102ef57600080fd5b5035610929565b6102746004803603608081101561030c57600080fd5b506001600160a01b03813516906020810135151590604081013515159060600135151561097b565b61033c610a39565b604080519115158252519081900360200190f35b610274610a49565b6102746004803603606081101561036e57600080fd5b506001600160a01b03813516906020810135151590604001351515610a4f565b610274600480360360608110156103a457600080fd5b506001600160a01b0381351690602081013590604001351515610c23565b61033c610cd1565b61033c610ce1565b6102d7600480360360608110156103e857600080fd5b506001600160a01b038135811691602081013582169160409091013516610cf1565b6102746004803603602081101561042057600080fd5b50356001600160a01b0316610d7d565b61028e610d8f565b610274610d9e565b6102d76004803603608081101561045657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610da3565b6102746004803603602081101561049457600080fd5b50356001600160a01b0316610e45565b610274600480360360408110156104ba57600080fd5b506001600160a01b0381351690602001351515610f59565b61033c611386565b6102d7600480360360208110156104f057600080fd5b50351515611396565b610274611401565b61033c6004803603602081101561051757600080fd5b50356001600160a01b0316611411565b610274611426565b6102746004803603602081101561054557600080fd5b50356001600160a01b031661142c565b6102746004803603606081101561056b57600080fd5b506001600160a01b0381351690602081013515159060400135151561143e565b6102d7600480360360208110156105a157600080fd5b50356001600160a01b0316611493565b61028e611502565b61028e611511565b6102d7600480360360608110156105d757600080fd5b506001600160a01b038135811691602081013582169160409091013516611520565b61028e6115ac565b61028e6115bb565b6102d76004803603602081101561061f57600080fd5b503515156115ca565b6102d76004803603602081101561063e57600080fd5b50356001600160a01b0316611635565b6102746116a4565b6102d76004803603604081101561066c57600080fd5b506001600160a01b0381351690602001356116aa565b61028e6004803603602081101561069857600080fd5b50356001600160a01b0316611753565b610274600480360360208110156106be57600080fd5b50356001600160a01b031661176e565b61028e611780565b610274600480360360408110156106ec57600080fd5b506001600160a01b038135169060200135151561178f565b61027461187c565b6102746004803603606081101561072257600080fd5b506001600160a01b0381351690602081013515159060400135611882565b6102d76004803603602081101561075657600080fd5b503561194a565b61033c6004803603602081101561077357600080fd5b50356001600160a01b031661199c565b6102746004803603602081101561079957600080fd5b50356001600160a01b03166119b1565b610274600480360360208110156107bf57600080fd5b50356001600160a01b0316611aaf565b6102d7600480360360208110156107e557600080fd5b50356001600160a01b0316611ac1565b6102d76004803603606081101561080b57600080fd5b506001600160a01b0381351690602081013515159060400135611b30565b61028e611c73565b6102d76004803603602081101561084757600080fd5b50351515611c82565b6102d76004803603602081101561086657600080fd5b50351515611ced565b603281565b600a546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b031633146108e5576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600081116109245760405162461bcd60e51b8152600401808060200182810382526029815260200180611f876029913960400191505060405180910390fd5b600255565b6000546001600160a01b03163314610976576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600355565b6001546000908190600160b01b900460ff166109a15761099c868686610a4f565b6109ac565b6109ac86868661143e565b6001600160a01b0387166000908152601060205260409020549091508015610a2f576001600160a01b03871660009081526011602052604090205460ff168015610a1757610a10612710610a0a610a038286611d58565b8690611db0565b90611e09565b9250610a2d565b610a2a612710610a0a610a038286611e48565b92505b505b5095945050505050565b600154600160b01b900460ff1681565b60035481565b600080610a5c8585610f59565b9050828015610a745750600154600160a01b900460ff165b15610ab9576000610a84866119b1565b90508015610ab757848015610a9857508181115b15610aa1578091505b84158015610aae57508181105b15610ab7578091505b505b600154600160a81b900460ff1615610ad957610ad6858286610c23565b90505b6001600160a01b0385166000908152600f602052604090205460ff1615610bc257600068327cb2734119d3b7a9601e1b8211610b2a57610b2568327cb2734119d3b7a9601e1b83611e48565b610b40565b610b408268327cb2734119d3b7a9601e1b611e48565b90506003548111610b615768327cb2734119d3b7a9601e1b92505050610c1c565b848015610b79575068327cb2734119d3b7a9601e1b82115b15610b8657509050610c1c565b84158015610b9f575068327cb2734119d3b7a9601e1b82105b15610bac57509050610c1c565b68327cb2734119d3b7a9601e1b92505050610c1c565b6001600160a01b0385166000908152600e60205260409020548415610c0457610bfb612710610a0a610bf48285611d58565b8590611db0565b92505050610c1c565b610c17612710610a0a610bf48285611e48565b925050505b9392505050565b6004546000906001600160a01b0316610c3d575081610c1c565b6004805460408051630ffd9c6d60e31b81526001600160a01b038881169482019490945260248101879052851515604482015290519290911691637fece36891606480820192602092909190829003018186803b158015610c9d57600080fd5b505afa158015610cb1573d6000803e3d6000fd5b505050506040513d6020811015610cc757600080fd5b5051949350505050565b600154600160a81b900460ff1681565b600154600160a01b900460ff1681565b6000546001600160a01b03163314610d3e576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600680546001600160a01b039485166001600160a01b031991821617909155600780549385169382169390931790925560088054919093169116179055565b60106020526000908152604090205481565b6008546001600160a01b031681565b601481565b6000546001600160a01b03163314610df0576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b6001600160a01b039384166000908152600c6020908152604080832080546001600160a01b0319169690971695909517909555600d855283812092909255600f90935220805460ff1916911515919091179055565b6001600160a01b038082166000908152600c602052604081205490911680610e9e5760405162461bcd60e51b81526004018080602001828103825260228152602001806120b26022913960400191505060405180910390fd5b60008190506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ede57600080fd5b505afa158015610ef2573d6000803e3d6000fd5b505050506040513d6020811015610f0857600080fd5b5051905060008113610f4f576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b925050505b919050565b6001600160a01b038083166000908152600c602052604081205490911680610fb25760405162461bcd60e51b81526004018080602001828103825260228152602001806120b26022913960400191505060405180910390fd5b6001546001600160a01b03161561108f5760015460408051631abf23ff60e11b815273a438451d6458044c3c8cd2f6f31c91ac882a6d91600482015290516000926001600160a01b03169163357e47fe916024808301926020929190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b50519050801561108d5760405162461bcd60e51b81526004018080602001828103825260258152602001806120436025913960400191505060405180910390fd5b505b6000819050600080826001600160a01b031663668a0f026040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d057600080fd5b505afa1580156110e4573d6000803e3d6000fd5b505050506040513d60208110156110fa57600080fd5b5051905060005b600254816001600160501b0316101561130157806001600160501b0316826001600160501b03161161113257611301565b60006001600160501b0382166111f5576000856001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561117d57600080fd5b505afa158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50519050600081136111ee576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b90506112bd565b6000856001600160a01b0316639a6fc8f58486036040518263ffffffff1660e01b815260040180826001600160501b0316815260200191505060a06040518083038186803b15801561124657600080fd5b505afa15801561125a573d6000803e3d6000fd5b505050506040513d60a081101561127057600080fd5b50602001519050600081136112ba576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b90505b836112c95792506112f9565b8780156112d557508381115b156112e15792506112f9565b871580156112ee57508381105b156112f7578093505b505b600101611101565b50600082116113415760405162461bcd60e51b8152600401808060200182810382526025815260200180611fb06025913960400191505060405180910390fd5b6001600160a01b0387166000908152600d6020526040902054611378600a82900a610a0a8568327cb2734119d3b7a9601e1b611db0565b955050505050505b92915050565b600154600160b81b900460ff1681565b6000546001600160a01b031633146113e3576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160b81b0260ff60b81b19909216919091179055565b68327cb2734119d3b7a9601e1b81565b60116020526000908152604090205460ff1681565b60025481565b60126020526000908152604090205481565b60008061144b8585610f59565b90508280156114635750600154600160a01b900460ff165b15610ab957611473858583611882565b905060015460ff600160a81b9091041615610ad957610ad6858286610c23565b6000546001600160a01b031633146114e0576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b6007546001600160a01b031681565b6000546001600160a01b0316331461156d576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600980546001600160a01b039485166001600160a01b031991821617909155600a805493851693821693909317909255600b8054919093169116179055565b600b546001600160a01b031681565b6009546001600160a01b031681565b6000546001600160a01b03163314611617576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b03163314611682576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611c2081565b6000546001600160a01b031633146116f7576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60328111156117375760405162461bcd60e51b815260040180806020018281038252602a815260200180612068602a913960400191505060405180910390fd5b6001600160a01b039091166000908152600e6020526040902055565b600c602052600090815260409020546001600160a01b031681565b600e6020526000908152604090205481565b6006546001600160a01b031681565b6000806000846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156117cd57600080fd5b505afa1580156117e1573d6000803e3d6000fd5b505050506040513d60608110156117f757600080fd5b5080516020909101516001600160701b0391821693501690508315611849578161182657600092505050611380565b61184082610a0a8368327cb2734119d3b7a9601e1b611db0565b92505050611380565b8061185957600092505050611380565b61187381610a0a8468327cb2734119d3b7a9601e1b611db0565b95945050505050565b60055481565b60008061188e856119b1565b90508061189e5782915050610c1c565b60008382116118b6576118b18483611e48565b6118c0565b6118c08285611e48565b90506118d760055485611db090919063ffffffff16565b6118e382612710611db0565b101561190d57600154600160b81b900460ff1615611905578392505050610c1c565b509050610c1c565b84801561191957508382115b1561192657509050610c1c565b8415801561193357508382105b1561194057509050610c1c565b5091949350505050565b6000546001600160a01b03163314611997576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600555565b600f6020526000908152604090205460ff1681565b6008546000906001600160a01b03838116911614156119e8576009546119e1906001600160a01b0316600161178f565b9050610f54565b6007546001600160a01b0383811691161415611a5a57600954600090611a18906001600160a01b0316600161178f565b600a54909150600090611a35906001600160a01b0316600161178f565b9050611a5168327cb2734119d3b7a9601e1b610a0a8484611db0565b92505050610f54565b6006546001600160a01b0383811691161415611aa757600954600090611a8a906001600160a01b0316600161178f565b600b54909150600090611a35906001600160a01b0316600161178f565b506000919050565b600d6020526000908152604090205481565b6000546001600160a01b03163314611b0e576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b7d576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152601260205260409020544290611ba490611c20611d58565b10611be05760405162461bcd60e51b815260040180806020018281038252602d815260200180611ff6602d913960400191505060405180910390fd5b6014811115611c2f576040805162461bcd60e51b8152602060048201526016602482015275696e76616c6964205f61646a7573746d656e7442707360501b604482015290519081900360640190fd5b6001600160a01b03929092166000908152601160209081526040808320805460ff191694151594909417909355601081528282209390935560129092529020429055565b6001546001600160a01b031681565b6000546001600160a01b03163314611ccf576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314611d3a576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160b01b0260ff60b01b19909216919091179055565b600082820183811015610c1c576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600082611dbf57506000611380565b82820282848281611dcc57fe5b0414610c1c5760405162461bcd60e51b8152600401808060200182810382526021815260200180611fd56021913960400191505060405180910390fd5b6000610c1c83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250611e8a565b6000610c1c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f2c565b60008183611f165760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611edb578181015183820152602001611ec3565b50505050905090810190601f168015611f085780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f2257fe5b0495945050505050565b60008184841115611f7e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611edb578181015183820152602001611ec3565b50505090039056fe5661756c745072696365466565643a20696e76616c6964205f707269636553616d706c6553706163655661756c745072696365466565643a20636f756c64206e6f74206665746368207072696365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775661756c745072696365466565643a2061646a7573746d656e74206672657175656e63792065786365656465645661756c745072696365466565643a20666f7262696464656e00000000000000436861696e6c696e6b20666565647320617265206e6f74206265696e6720757064617465645661756c745072696365466565643a20696e76616c6964205f7370726561644261736973506f696e74735661756c745072696365466565643a20696e76616c69642070726963650000005661756c745072696365466565643a20696e76616c69642070726963652066656564a2646970667358221220073af6fe877aa978fdc815a1e143101759d7e9725672d114405bc95552a3c22964736f6c634300060c0033

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