Contract 0xe20173916e602e1870aad99b162e1dba5017fc33

Contract Overview

Balance:
0 tCRO
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x4383a19113dc37e1aebf8029b42608404b109627d53969e0f3d97a766fcb3b97Set Token Config61308432022-11-17 2:47:4721 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.1776908466680
0x81ee5e051d51fe7f1276bae48600aae65f0cac6daad1dcc3a1d6ea0eb9fd77ddSet Spread Basis...61308412022-11-17 2:47:3521 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.051186027080
0xa59fd85d642b06afa78316b3c8c51886942b87270864e8419c8cc0b0c3cf20e4Set Token Config61308402022-11-17 2:47:3021 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.1776908537450
0x42932b0d21455d376663bc458d4b7b6adc37b39e6068751f1761937a177248f4Set Spread Basis...61308382022-11-17 2:47:1921 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0511860286150
0xea8a38e6972714f855d6f8cb035c8d3aad8c5c09a9328fa0b0bd2622e378fe05Set Token Config61308362022-11-17 2:47:0821 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.1404836702160
0x13df9e580c064b5095aa96b1c2e0c203c136df3e5e4f6ea22a50b8eaf9284c00Set Spread Basis...61308342022-11-17 2:46:5821 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0511860306580
0xb7daaf2cdbbbc73808c27852ba6e16cdd9225d09356ad9b921f0f67b2513aea0Set Token Config61308332022-11-17 2:46:5221 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.1404836744220
0x7cddc05ed8176f51a3c15b0a12d507cb1b931a252e20df687530428f602aef22Set Spread Basis...61308322022-11-17 2:46:4721 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0511860321910
0xdb974484541540f7c8948f0628efb28af058e1cb6af13699c35295eb18ec73acSet Token Config61308302022-11-17 2:46:3521 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.1404836786310
0x6c4f17ea1198ea5c1e057611419fa1e36f521cf4d11aba529cdeeb7cffd925a4Set Spread Basis...61308282022-11-17 2:46:2521 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0511860337250
0xb931282cd5c50061187841d957d24cd0b822aa7d5171e66e7b6596dd45607e25Set Secondary Pr...61308272022-11-17 2:46:1921 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0644773604930
0xb0fbea1884c74cbe4b3fe4319aa13ca27d1d1a001d02d39e08b6bafd7e703b19Set Price Sample...61308252022-11-17 2:46:0821 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0488465448850
0xe67ce85ac14ac1923cab5189b2cc14602f46f7bc10a7f9224d30c645770e2c85Set Max Strict P...61308242022-11-17 2:46:0321 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0490305284750
0x2192d6a65db79a7ddd00a797d71bb15c815c61fe3dcc4d198380b212aa1bcc03Set Secondary Pr...61307572022-11-17 2:39:5421 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0935273883980
0xe6f8e27b1b51d937179da60be45ee22c6e9a308e459fab9b7b660e35190ae89bSet Price Sample...61307562022-11-17 2:39:4921 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0569805760470
0x1ab08cc0a0b885bc74a11885f47e2d9c4a69f72980ea3dcea79a2764759e3940Set Max Strict P...61307502022-11-17 2:39:0921 days 7 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO0.0862145453930
0x67f3187f537f4b6eade565917090ace77514e64906e3bacf95ca9c340571e0660x6080604061304162022-11-17 2:08:2921 days 8 hrs ago0x111e164336e0d0a2b9554f96a2cca80680fba449 IN  Contract Creation0 tCRO3.8110724004210
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xcb58b122fc8d05df53c3a35996eaddf85ffa291ebce82fcae7dd892e61552d7664664002022-12-08 10:07:482 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x7dae6199459419f16e79d548dcd0d44f450e54c50 tCRO
0xcb58b122fc8d05df53c3a35996eaddf85ffa291ebce82fcae7dd892e61552d7664664002022-12-08 10:07:482 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0xcb58b122fc8d05df53c3a35996eaddf85ffa291ebce82fcae7dd892e61552d7664664002022-12-08 10:07:482 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x784850ac2c217924cf08e9798a72be630812e25d0 tCRO
0xcb58b122fc8d05df53c3a35996eaddf85ffa291ebce82fcae7dd892e61552d7664664002022-12-08 10:07:482 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0xcb58b122fc8d05df53c3a35996eaddf85ffa291ebce82fcae7dd892e61552d7664664002022-12-08 10:07:482 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0xb3f6ea8161bdc927d96ae4d4cb35c33c4f3b85b70 tCRO
0xcb58b122fc8d05df53c3a35996eaddf85ffa291ebce82fcae7dd892e61552d7664664002022-12-08 10:07:482 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x652af00d9e8edfa116870338718053f496bfc2db48426cc9af3162b1b56f779064663562022-12-08 10:03:476 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x7dae6199459419f16e79d548dcd0d44f450e54c50 tCRO
0x652af00d9e8edfa116870338718053f496bfc2db48426cc9af3162b1b56f779064663562022-12-08 10:03:476 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x652af00d9e8edfa116870338718053f496bfc2db48426cc9af3162b1b56f779064663562022-12-08 10:03:476 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x784850ac2c217924cf08e9798a72be630812e25d0 tCRO
0x652af00d9e8edfa116870338718053f496bfc2db48426cc9af3162b1b56f779064663562022-12-08 10:03:476 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x652af00d9e8edfa116870338718053f496bfc2db48426cc9af3162b1b56f779064663562022-12-08 10:03:476 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0xb3f6ea8161bdc927d96ae4d4cb35c33c4f3b85b70 tCRO
0x652af00d9e8edfa116870338718053f496bfc2db48426cc9af3162b1b56f779064663562022-12-08 10:03:476 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x8d7ef261527cb9180680874d2eba3486b822c2071dcf90b4c543a64a0e8ac20e64663132022-12-08 9:59:5210 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x7dae6199459419f16e79d548dcd0d44f450e54c50 tCRO
0x8d7ef261527cb9180680874d2eba3486b822c2071dcf90b4c543a64a0e8ac20e64663132022-12-08 9:59:5210 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x8d7ef261527cb9180680874d2eba3486b822c2071dcf90b4c543a64a0e8ac20e64663132022-12-08 9:59:5210 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x784850ac2c217924cf08e9798a72be630812e25d0 tCRO
0x8d7ef261527cb9180680874d2eba3486b822c2071dcf90b4c543a64a0e8ac20e64663132022-12-08 9:59:5210 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x8d7ef261527cb9180680874d2eba3486b822c2071dcf90b4c543a64a0e8ac20e64663132022-12-08 9:59:5210 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0xb3f6ea8161bdc927d96ae4d4cb35c33c4f3b85b70 tCRO
0x8d7ef261527cb9180680874d2eba3486b822c2071dcf90b4c543a64a0e8ac20e64663132022-12-08 9:59:5210 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x503bed04e02d60d9fb44f28de69708348f28da5dd2341722aff02872d757357464662692022-12-08 9:55:5114 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x7dae6199459419f16e79d548dcd0d44f450e54c50 tCRO
0x503bed04e02d60d9fb44f28de69708348f28da5dd2341722aff02872d757357464662692022-12-08 9:55:5114 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x503bed04e02d60d9fb44f28de69708348f28da5dd2341722aff02872d757357464662692022-12-08 9:55:5114 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x784850ac2c217924cf08e9798a72be630812e25d0 tCRO
0x503bed04e02d60d9fb44f28de69708348f28da5dd2341722aff02872d757357464662692022-12-08 9:55:5114 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0x503bed04e02d60d9fb44f28de69708348f28da5dd2341722aff02872d757357464662692022-12-08 9:55:5114 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0xb3f6ea8161bdc927d96ae4d4cb35c33c4f3b85b70 tCRO
0x503bed04e02d60d9fb44f28de69708348f28da5dd2341722aff02872d757357464662692022-12-08 9:55:5114 mins ago 0x8d285947b84fc4223e54c48ecdfa8d48c1294c87 0xe20173916e602e1870aad99b162e1dba5017fc330 tCRO
0xa341466efd318349da9f182b970bceb513f3b99324fecad0bfc49f7b0b67385564662252022-12-08 9:51:5018 mins ago 0xe20173916e602e1870aad99b162e1dba5017fc33 0x7dae6199459419f16e79d548dcd0d44f450e54c50 tCRO
[ Download CSV Export 
Loading

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

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