Contract 0x7D085fB78A1b5a2e731343f4De736478EF73fD19

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago0x5d259edbcd0732bc55f90611b85abd90025c3de9 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00339746
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago0x5d259edbcd0732bc55f90611b85abd90025c3de9 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago0x5d259edbcd0732bc55f90611b85abd90025c3de9 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0x261002528b3526eb402ff8f356b65b36471c15472ed0528d4d6f61325418263d51618512021-02-24 16:12:462 hrs 17 mins ago0x6ba34a45be26a6dfd67bfcf966d61098e992d5f0 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0x244960435113fa2d10d70fe75da96c944b991b1889cc426223787251a836628a51610482021-02-24 15:32:352 hrs 58 mins ago0x62c7afb97b874c627588c143662969c46c07ebc7 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0xfd668321adace823ef9813130f9d6beb2d90db9f0aae9b986ee4d8ec97f13fab51603992021-02-24 15:00:073 hrs 30 mins ago0x005a945c426fe1f2eb3c4b04585a2427f7a032a8 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0x3a45d482756c73699e4fbaa5da2eb8f4ac75fb62fd45683362d3f989fab5c77651596162021-02-24 14:20:124 hrs 10 mins ago0x005a945c426fe1f2eb3c4b04585a2427f7a032a8 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0x5c3bf78018ca09807939ebb1fbd178a17eb750262dc2096d1521b3f97eea3c4e51576262021-02-24 12:40:075 hrs 50 mins ago0x005a945c426fe1f2eb3c4b04585a2427f7a032a8 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0xa02b9e63048b169b9b331bc38d2c9e8ae2c607f8b2b53bdb9a26896615463bc851570222021-02-24 12:09:546 hrs 20 mins ago0x62c7afb97b874c627588c143662969c46c07ebc7 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0x0d8a57cba35e875110c45536a44a55690abfd954b36f63ea3e9f493f8dd9554151563952021-02-24 11:38:336 hrs 52 mins ago0xbfb1b6028510c864fe9a1e56eb89a171ab755923 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0xb4c8891ea34ccf56c78bc5acd658802a27661d595d86c00a353efbe3c61facb251557842021-02-24 11:07:587 hrs 22 mins ago0xbfb1b6028510c864fe9a1e56eb89a171ab755923 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0x065a93527f41112f470e7c3428e3fad1e4caad49c81b85c0903e83bc6c3b865351552002021-02-24 10:37:137 hrs 53 mins ago0x616a5652951cbe6b62913936ab829ec4f5b011b6 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.0034392
0x5843b640102b1fc87ebf2fcddb9b041350fb83eac2a82fd7ee583de19d87d71d51531162021-02-24 8:52:229 hrs 38 mins ago0xf1d05a9206db50225bbab73ea652a284403eb00a IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.0034392
0x0a06e459cb3774a8f4f5bf915e85fb610377649d870f49f811f199381b8c757851520002021-02-24 7:56:3310 hrs 34 mins ago0x62c7afb97b874c627588c143662969c46c07ebc7 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0xa28ce8f4052c0bf2f38064744e2402e24d75d6f17dddce456e1078892ea34dc251512722021-02-24 7:20:0911 hrs 10 mins ago0x005a945c426fe1f2eb3c4b04585a2427f7a032a8 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00343946
0x37613ff72ad62b6b264204b1fd391c96decbd8950a69829dd4db39cdd682a7eb51501282021-02-24 6:22:4912 hrs 7 mins ago0x6f198f157246a596acd5766814cc4d5a74234d19 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00339746
0x1f729c87b54c959cb613c3f00e045bdfbbb2e7c62deb315149244bd69074b86851495212021-02-24 5:52:2812 hrs 38 mins ago0x1cd65bab9683dc74a0746b0922af49949c4fee65 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00339746
0x0c610bb5f11585b2cdb7a7304bde1c27edcc0c475304bb5b1fee7bb3f23a3b5451489142021-02-24 5:22:0613 hrs 8 mins ago0x1cd65bab9683dc74a0746b0922af49949c4fee65 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00339746
0x44482f5962c672231eedf899d722db370ee830151e8b4f32dd95c5e9a56e312651483082021-02-24 4:51:4813 hrs 38 mins ago0x63c45aabd052e259ab33efcfacd41361d0ef69bf IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00339746
0x287459eac635781cee758127e0f06a11a94a554c2685914878757d05dcbcfaa351477032021-02-24 4:21:3314 hrs 9 mins ago0xcc6162f76e9f8026f2eddf2ec30c032514abd048 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.0034392
0xb10ea7497689b282293e5f993eb95513cb7f9d500e27096bb14485a6ff09b4a751470622021-02-24 3:49:1014 hrs 41 mins ago0xcc6162f76e9f8026f2eddf2ec30c032514abd048 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.0034392
0x3bb694741f1fa3fedaec46de6190bc0df8a0b3063cf5b1a0022002b14d19011251464132021-02-24 3:16:4315 hrs 13 mins ago0x63c45aabd052e259ab33efcfacd41361d0ef69bf IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.00339746
0x326576b77a276e75ef2ff3b1c15885494cda8708c0ef7ce4925babba77c01d6251458072021-02-24 2:46:2515 hrs 44 mins ago0xcc6162f76e9f8026f2eddf2ec30c032514abd048 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.0033972
0x24085ebe943345927f7ea11b2b946304d1e78202fd7a3a4e6e88d1e5c3085fcf51449832021-02-24 2:05:1216 hrs 25 mins ago0x0ab745e9055bb6c21456616734be26cc29bed637 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.0033972
0x7ed8dcaab0ee71a7d1948fb34b29763d591147102a980c2f7ddfa2d6a0717e1c51443772021-02-24 1:34:5416 hrs 55 mins ago0x0ab745e9055bb6c21456616734be26cc29bed637 IN  Keep3rb Network: KP3RB/CHS Oracle0 BNB0.0034392
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle Keep3rb Network: KP3RB Token0 BNB
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0x55d01bf07ddd71351bb52faa5b6fc3e275fc4e9bef4762a8500a684e3f61face51639842021-02-24 17:59:2631 mins ago Keep3rb Network: KP3RB/CHS Oracle Keep3rb Network: KP3RB Token0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle Keep3rb Network: KP3RB Token0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0xc2f48e6211a6268a200c608c912f77637a77a670e585561bcb7df01ac0bf502851632342021-02-24 17:21:561 hr 8 mins ago Keep3rb Network: KP3RB/CHS Oracle Keep3rb Network: KP3RB Token0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle Keep3rb Network: KP3RB Token0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-WBNB0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle CheeseSwap: KP3RB-CHS0 BNB
0xfab6d6de3ecd5af28fd8f2be227702d172aa0271818483aa55f36b7dc1dea5b351626002021-02-24 16:50:131 hr 40 mins ago Keep3rb Network: KP3RB/CHS Oracle Keep3rb Network: KP3RB Token0 BNB
0x261002528b3526eb402ff8f356b65b36471c15472ed0528d4d6f61325418263d51618512021-02-24 16:12:462 hrs 17 mins ago Keep3rb Network: KP3RB/CHS Oracle Keep3rb Network: KP3RB Token0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Keep3rbCHSSlidingOracle

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-01-09
*/

// SPDX-License-Identifier: MIT


pragma solidity ^0.6.12;

interface ICheeseSwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface ICheeseSwapPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
library FixedPoint {
    // range: [0, 2**112 - 1]
    // resolution: 1 / 2**112
    struct uq112x112 {
        uint224 _x;
    }

    // range: [0, 2**144 - 1]
    // resolution: 1 / 2**112
    struct uq144x112 {
        uint _x;
    }

    uint8 private constant RESOLUTION = 112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 x) internal pure returns (uq112x112 memory) {
        return uq112x112(uint224(x) << RESOLUTION);
    }

    // encodes a uint144 as a UQ144x112
    function encode144(uint144 x) internal pure returns (uq144x112 memory) {
        return uq144x112(uint256(x) << RESOLUTION);
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function div(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) {
        require(x != 0, 'FixedPoint: DIV_BY_ZERO');
        return uq112x112(self._x / uint224(x));
    }

    // multiply a UQ112x112 by a uint, returning a UQ144x112
    // reverts on overflow
    function mul(uq112x112 memory self, uint y) internal pure returns (uq144x112 memory) {
        uint z;
        require(y == 0 || (z = uint(self._x) * y) / y == uint(self._x), "FixedPoint: MULTIPLICATION_OVERFLOW");
        return uq144x112(z);
    }

    // returns a UQ112x112 which represents the ratio of the numerator to the denominator
    // equivalent to encode(numerator).div(denominator)
    function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, "FixedPoint: DIV_BY_ZERO");
        return uq112x112((uint224(numerator) << RESOLUTION) / denominator);
    }

    // decode a UQ112x112 into a uint112 by truncating after the radix point
    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    // decode a UQ144x112 into a uint144 by truncating after the radix point
    function decode144(uq144x112 memory self) internal pure returns (uint144) {
        return uint144(self._x >> RESOLUTION);
    }
}

// library with helper methods for oracles that are concerned with computing average prices
library Keep3rbCHSSlidingOracleLibrary {
    using FixedPoint for *;

    // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1]
    function currentBlockTimestamp() internal view returns (uint32) {
        return uint32(block.timestamp % 2 ** 32);
    }

    // produces the cumulative price using counterfactuals to save gas and avoid a call to sync.
    function currentCumulativePrices(
        address pair
    ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) {
        blockTimestamp = currentBlockTimestamp();
        price0Cumulative = ICheeseSwapPair(pair).price0CumulativeLast();
        price1Cumulative = ICheeseSwapPair(pair).price1CumulativeLast();

        // if time has elapsed since the last update on the pair, mock the accumulated price values
        (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = ICheeseSwapPair(pair).getReserves();
        if (blockTimestampLast != blockTimestamp) {
            // subtraction overflow is desired
            uint32 timeElapsed = blockTimestamp - blockTimestampLast;
            // addition overflow is desired
            // counterfactual
            price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed;
            // counterfactual
            price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed;
        }
    }
}

 library SafeMath {
   function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
  function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }
  function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
      
        if (a == 0) {
            return 0;
        }

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

        return c;
    }
 function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
      if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library CheeseSwapLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'CheeseSwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'CheeseSwapLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'f52c5189a89e7ca2ef4f19f2798e3900fba7a316de7cef6c5a9446621ba86286' // init code hash of CheeseSwap
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ICheeseSwapPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'CheeseSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'CheeseSwapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'CheeseSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CheeseSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'CheeseSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'CheeseSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'CheeseSwapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'CheeseSwapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

interface IKeep3rb {
    function isKeeper(address) external returns (bool);
    function worked(address keeper) external;
}

// sliding oracle that uses observations collected to provide moving price averages in the past
contract Keep3rbCHSSlidingOracle {
    using FixedPoint for *;
    using SafeMath for uint;

    struct Observation {
        uint timestamp;
        uint price0Cumulative;
        uint price1Cumulative;
        uint timeElapsed;
    }
    
    modifier keeper() {
        require(KP3RB.isKeeper(msg.sender), "::isKeeper: keeper is not registered");
        _;
    }
    
    modifier upkeep() {
        require(KP3RB.isKeeper(msg.sender), "::isKeeper: keeper is not registered");
        _;
        KP3RB.worked(msg.sender);
    }
    
    address public governance;
    address public pendingGovernance;
    
    /**
     * @notice Allows governance to change governance (for future upgradability)
     * @param _governance new governance address to set
     */
    function setGovernance(address _governance) external {
        require(msg.sender == governance, "setGovernance: !gov");
        pendingGovernance = _governance;
    }

    /**
     * @notice Allows pendingGovernance to accept their role as governance (protection pattern)
     */
    function acceptGovernance() external {
        require(msg.sender == pendingGovernance, "acceptGovernance: !pendingGov");
        governance = pendingGovernance;
    }
    
    IKeep3rb public constant KP3RB = IKeep3rb(0x5EA29eEe799aA7cC379FdE5cf370BC24f2Ea7c81);

    address public constant factory = 0xdd538E4Fd1b69B7863E1F741213276A6Cf1EfB3B;
    // this is redundant with granularity and windowSize, but stored for gas savings & informational purposes.
    uint public constant periodSize = 1800;
    
    address[] internal _pairs;
    mapping(address => bool) internal _known;
    
    function pairs() external view returns (address[] memory) {
        return _pairs;
    }

    // mapping from pair address to a list of price observations of that pair
    mapping(address => Observation[]) public pairObservations;
    mapping(address => uint) public lastUpdated;
    mapping(address => Observation) public lastObservation;

    constructor() public {
        governance = msg.sender;
    }
    
    function updatePair(address pair) external keeper returns (bool) {
        return _update(pair);
    }
    
    function update(address tokenA, address tokenB) external keeper returns (bool) {
        address pair = CheeseSwapLibrary.pairFor(factory, tokenA, tokenB);
        return _update(pair);
    }
    
    function add(address tokenA, address tokenB) external {
        require(msg.sender == governance, "Keep3rbCHSSlidingOracle::add: !gov");
        address pair = CheeseSwapLibrary.pairFor(factory, tokenA, tokenB);
        require(!_known[pair], "known");
        _known[pair] = true;
        _pairs.push(pair);

        (uint price0Cumulative, uint price1Cumulative,) = Keep3rbCHSSlidingOracleLibrary.currentCumulativePrices(pair);
        lastObservation[pair] = Observation(block.timestamp, price0Cumulative, price1Cumulative, 0);
        pairObservations[pair].push(lastObservation[pair]);
        lastUpdated[pair] = block.timestamp;
    }
    
    function work() public upkeep {
        bool worked = _updateAll();
        require(worked, "Keep3rbCHSSlidingOracle: !work");
    }
    
    function _updateAll() internal returns (bool updated) {
        for (uint i = 0; i < _pairs.length; i++) {
            if (_update(_pairs[i])) {
                updated = true;
            }
        }
    }
    
    function updateFor(uint i, uint length) external keeper returns (bool updated) {
        for (; i < length; i++) {
            if (_update(_pairs[i])) {
                updated = true;
            }
        }
    }
    
    function workable(address pair) public view returns (bool) {
        return (block.timestamp - lastUpdated[pair]) > periodSize;
    }
    
    function workable() external view returns (bool) {
        for (uint i = 0; i < _pairs.length; i++) {
            if (workable(_pairs[i])) {
                return true;
            }
        }
        return false;
    }
    
    function _update(address pair) internal returns (bool) {
        // we only want to commit updates once per period (i.e. windowSize / granularity)
        uint timeElapsed = block.timestamp - lastUpdated[pair];
        if (timeElapsed > periodSize) {
            (uint price0Cumulative, uint price1Cumulative,) = Keep3rbCHSSlidingOracleLibrary.currentCumulativePrices(pair);
            lastObservation[pair] = Observation(block.timestamp, price0Cumulative, price1Cumulative, timeElapsed);
            pairObservations[pair].push(lastObservation[pair]);
            lastUpdated[pair] = block.timestamp;
            return true;
        }
        return false;
    }
    
    function computeAmountOut(
        uint priceCumulativeStart, uint priceCumulativeEnd,
        uint timeElapsed, uint amountIn
    ) private pure returns (uint amountOut) {
        // overflow is desired.
        FixedPoint.uq112x112 memory priceAverage = FixedPoint.uq112x112(
            uint224((priceCumulativeEnd - priceCumulativeStart) / timeElapsed)
        );
        amountOut = priceAverage.mul(amountIn).decode144();
    }
    
    function _valid(address pair, uint age) internal view returns (bool) {
        return (block.timestamp - lastUpdated[pair]) <= age;
    }
    
    function current(address tokenIn, uint amountIn, address tokenOut) external view returns (uint amountOut) {
        address pair = CheeseSwapLibrary.pairFor(factory, tokenIn, tokenOut);
        require(_valid(pair, periodSize.mul(2)), "Keep3rbCHSSlidingOracle::quote: stale prices");
        (address token0,) = CheeseSwapLibrary.sortTokens(tokenIn, tokenOut);
        
        (uint price0Cumulative, uint price1Cumulative,) = Keep3rbCHSSlidingOracleLibrary.currentCumulativePrices(pair);
        uint timeElapsed = block.timestamp - lastObservation[pair].timestamp;
        timeElapsed = timeElapsed == 0 ? 1 : timeElapsed;
        if (token0 == tokenIn) {
            return computeAmountOut(lastObservation[pair].price0Cumulative, price0Cumulative, timeElapsed, amountIn);
        } else {
            return computeAmountOut(lastObservation[pair].price1Cumulative, price1Cumulative, timeElapsed, amountIn);
        }
    }
    
    function quote(address tokenIn, uint amountIn, address tokenOut, uint granularity) external view returns (uint amountOut) {
        address pair = CheeseSwapLibrary.pairFor(factory, tokenIn, tokenOut);
        require(_valid(pair, periodSize.mul(granularity)), "Keep3rbCHSSlidingOracle::quote: stale prices");
        (address token0,) = CheeseSwapLibrary.sortTokens(tokenIn, tokenOut);
        
        uint priceAverageCumulative = 0;
        uint length = pairObservations[pair].length-1;
        uint i = length.sub(granularity);
        
        
        uint nextIndex = 0;
        if (token0 == tokenIn) {
            for (; i < length; i++) {
                nextIndex = i+1;
                priceAverageCumulative += computeAmountOut(
                    pairObservations[pair][i].price0Cumulative, 
                    pairObservations[pair][nextIndex].price0Cumulative, pairObservations[pair][nextIndex].timeElapsed, amountIn);
            }
        } else {
            for (; i < length; i++) {
                nextIndex = i+1;
                priceAverageCumulative += computeAmountOut(
                    pairObservations[pair][i].price1Cumulative, 
                    pairObservations[pair][nextIndex].price1Cumulative, pairObservations[pair][nextIndex].timeElapsed, amountIn);
            }
        }
        return priceAverageCumulative.div(granularity);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"KP3RB","outputs":[{"internalType":"contract IKeep3rb","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"current","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastObservation","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"price0Cumulative","type":"uint256"},{"internalType":"uint256","name":"price1Cumulative","type":"uint256"},{"internalType":"uint256","name":"timeElapsed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"price0Cumulative","type":"uint256"},{"internalType":"uint256","name":"price1Cumulative","type":"uint256"},{"internalType":"uint256","name":"timeElapsed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"granularity","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"update","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"updateFor","outputs":[{"internalType":"bool","name":"updated","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"updatePair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"work","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"workable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"workable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191633179055611a01806100326000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063a75d39c2116100ad578063c640752d11610071578063c640752d14610353578063c9ff6f4d14610381578063e4463eb2146103a4578063f39c38a0146103ac578063ffb0a4a0146103b45761012c565b8063a75d39c214610289578063ab033ea9146102bf578063ae6ec9b7146102e5578063bfcc8e421461031f578063c45a01551461034b5761012c565b806352c28fab116100f457806352c28fab146102015780635aa6e6751461022f57806380bb2bac14610253578063886d24a91461025b5780639f471303146102635761012c565b80630a6f93e6146101315780631b56bbf914610169578063202e1e43146101a3578063238efcbc146101ef578063322e9f04146101f9575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b031661040c565b60408051918252519081900360200190f35b61018f6004803603602081101561017f57600080fd5b50356001600160a01b031661041e565b604080519115158252519081900360200190f35b6101c9600480360360208110156101b957600080fd5b50356001600160a01b03166104ec565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6101f7610513565b005b6101f7610596565b6101f76004803603604081101561021757600080fd5b506001600160a01b038135811691602001351661071b565b6102376108fa565b604080516001600160a01b039092168252519081900360200190f35b61018f610909565b610237610961565b61018f6004803603602081101561027957600080fd5b50356001600160a01b0316610979565b6101576004803603606081101561029f57600080fd5b506001600160a01b0381358116916020810135916040909101351661099d565b6101f7600480360360208110156102d557600080fd5b50356001600160a01b0316610adc565b610157600480360360808110156102fb57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135610b53565b6101c96004803603604081101561033557600080fd5b506001600160a01b038135169060200135610de2565b610237610e25565b61018f6004803603604081101561036957600080fd5b506001600160a01b0381358116916020013516610e3d565b61018f6004803603604081101561039757600080fd5b5080359060200135610f30565b610157611033565b610237611039565b6103bc611048565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103f85781810151838201526020016103e0565b505050509050019250505060405180910390f35b60056020526000908152604090205481565b604080516335d2155560e11b81523360048201529051600091735ea29eee799aa7cc379fde5cf370bc24f2ea7c8191636ba42aaa9160248082019260209290919082900301818787803b15801561047457600080fd5b505af1158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b50516104db5760405162461bcd60e51b81526004018080602001828103825260248152602001806119596024913960400191505060405180910390fd5b6104e4826110aa565b90505b919050565b60066020526000908152604090208054600182015460028301546003909301549192909184565b6001546001600160a01b03163314610572576040805162461bcd60e51b815260206004820152601d60248201527f616363657074476f7665726e616e63653a202170656e64696e67476f76000000604482015290519081900360640190fd5b600154600080546001600160a01b0319166001600160a01b03909216919091179055565b604080516335d2155560e11b81523360048201529051735ea29eee799aa7cc379fde5cf370bc24f2ea7c8191636ba42aaa9160248083019260209291908290030181600087803b1580156105e957600080fd5b505af11580156105fd573d6000803e3d6000fd5b505050506040513d602081101561061357600080fd5b50516106505760405162461bcd60e51b81526004018080602001828103825260248152602001806119596024913960400191505060405180910390fd5b600061065a611191565b9050806106ae576040805162461bcd60e51b815260206004820152601e60248201527f4b656570337262434853536c6964696e674f7261636c653a2021776f726b0000604482015290519081900360640190fd5b50604080516317fbade560e21b81523360048201529051735ea29eee799aa7cc379fde5cf370bc24f2ea7c8191635feeb79491602480830192600092919082900301818387803b15801561070157600080fd5b505af1158015610715573d6000803e3d6000fd5b50505050565b6000546001600160a01b031633146107645760405162461bcd60e51b81526004018080602001828103825260228152602001806119166022913960400191505060405180910390fd5b600061078573dd538e4fd1b69b7863e1f741213276a6cf1efb3b84846111c5565b6001600160a01b03811660009081526003602052604090205490915060ff16156107de576040805162461bcd60e51b815260206004820152600560248201526435b737bbb760d91b604482015290519081900360640190fd5b6001600160a01b0381166000818152600360205260408120805460ff1916600190811790915560028054918201815582527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319169092179091558061084d83611285565b50604080516080810182524280825260208083019586528284019485526000606084018181526001600160a01b03909a16808252600683528582209451855596516001808601918255965160028087019182559b51600380880191825560048087528986208054808d01825590875287872099549102909801978855925498870198909855549a85019a909a55945492909801919091559282526005909552939093209290925550505050565b6000546001600160a01b031681565b6000805b600254811015610958576109416002828154811061092757fe5b6000918252602090912001546001600160a01b0316610979565b1561095057600191505061095e565b60010161090d565b50600090505b90565b735ea29eee799aa7cc379fde5cf370bc24f2ea7c8181565b6001600160a01b031660009081526005602052604090205461070842919091031190565b6000806109bf73dd538e4fd1b69b7863e1f741213276a6cf1efb3b86856111c5565b90506109d7816109d26107086002611454565b6114ad565b610a125760405162461bcd60e51b815260040180806020018281038252602c8152602001806119a0602c913960400191505060405180910390fd5b6000610a1e86856114cf565b509050600080610a2d84611285565b506001600160a01b038616600090815260066020526040902054919350915042038015610a5a5780610a5d565b60015b9050886001600160a01b0316846001600160a01b03161415610aad576001600160a01b038516600090815260066020526040902060010154610aa19084838b6115ad565b95505050505050610ad5565b6001600160a01b038516600090815260066020526040902060020154610aa19083838b6115ad565b9392505050565b6000546001600160a01b03163314610b31576040805162461bcd60e51b815260206004820152601360248201527239b2ba23b7bb32b93730b731b29d1010b3b7bb60691b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080610b7573dd538e4fd1b69b7863e1f741213276a6cf1efb3b87866111c5565b9050610b87816109d261070886611454565b610bc25760405162461bcd60e51b815260040180806020018281038252602c8152602001806119a0602c913960400191505060405180910390fd5b6000610bce87866114cf565b506001600160a01b038316600090815260046020526040812054919250906000190181610bfb828861160b565b905060008a6001600160a01b0316856001600160a01b03161415610d00575b82821015610cfb57506001600160a01b038516600090815260046020526040902080546001830191610cec9184908110610c5057fe5b90600052602060002090600402016001015460046000896001600160a01b03166001600160a01b031681526020019081526020016000208381548110610c9257fe5b906000526020600020906004020160010154600460008a6001600160a01b03166001600160a01b031681526020019081526020016000208481548110610cd457fe5b9060005260206000209060040201600301548d6115ad565b90930192600190910190610c1a565b610dc9565b82821015610dc957506001600160a01b038516600090815260046020526040902080546001830191610dba9184908110610d3657fe5b90600052602060002090600402016002015460046000896001600160a01b03166001600160a01b031681526020019081526020016000208381548110610d7857fe5b906000526020600020906004020160020154600460008a6001600160a01b03166001600160a01b031681526020019081526020016000208481548110610cd457fe5b90930192600190910190610d00565b610dd3848961164d565b9b9a5050505050505050505050565b60046020528160005260406000208181548110610dfb57fe5b60009182526020909120600490910201805460018201546002830154600390930154919450925084565b73dd538e4fd1b69b7863e1f741213276a6cf1efb3b81565b604080516335d2155560e11b81523360048201529051600091735ea29eee799aa7cc379fde5cf370bc24f2ea7c8191636ba42aaa9160248082019260209290919082900301818787803b158015610e9357600080fd5b505af1158015610ea7573d6000803e3d6000fd5b505050506040513d6020811015610ebd57600080fd5b5051610efa5760405162461bcd60e51b81526004018080602001828103825260248152602001806119596024913960400191505060405180910390fd5b6000610f1b73dd538e4fd1b69b7863e1f741213276a6cf1efb3b85856111c5565b9050610f26816110aa565b9150505b92915050565b604080516335d2155560e11b81523360048201529051600091735ea29eee799aa7cc379fde5cf370bc24f2ea7c8191636ba42aaa9160248082019260209290919082900301818787803b158015610f8657600080fd5b505af1158015610f9a573d6000803e3d6000fd5b505050506040513d6020811015610fb057600080fd5b5051610fed5760405162461bcd60e51b81526004018080602001828103825260248152602001806119596024913960400191505060405180910390fd5b81831015610f2a5761101f6002848154811061100557fe5b6000918252602090912001546001600160a01b03166110aa565b15611028575060015b600190920191610fed565b61070881565b6001546001600160a01b031681565b606060028054806020026020016040519081016040528092919081815260200182805480156110a057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611082575b5050505050905090565b6001600160a01b0381166000908152600560205260408120544203610708811115611188576000806110db85611285565b5060408051608081018252428082526020808301958652828401948552606083019889526001600160a01b038b166000818152600683528581209451855596516001808601918255965160028087019182559b5160038088019182556004808752898c208054808d018255908d52878d20995491029098019788559254878a015590549b86019b909b55995493909901929092559684526005905290912093909355509091506104e79050565b50600092915050565b6000805b6002548110156111c1576111af6002828154811061100557fe5b156111b957600191505b600101611195565b5090565b60008060006111d485856114cf565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527ff52c5189a89e7ca2ef4f19f2798e3900fba7a316de7cef6c5a9446621ba86286609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b600080600061129261168f565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156112cd57600080fd5b505afa1580156112e1573d6000803e3d6000fd5b505050506040513d60208110156112f757600080fd5b505160408051635a3d549360e01b815290519194506001600160a01b03861691635a3d549391600480820192602092909190829003018186803b15801561133d57600080fd5b505afa158015611351573d6000803e3d6000fd5b505050506040513d602081101561136757600080fd5b505160408051630240bc6b60e21b81529051919350600091829182916001600160a01b03891691630902f1ac916004808301926060929190829003018186803b1580156113b357600080fd5b505afa1580156113c7573d6000803e3d6000fd5b505050506040513d60608110156113dd57600080fd5b5080516020820151604090920151909450909250905063ffffffff8082169085161461144a5780840363ffffffff81166114178486611699565b516001600160e01b031602969096019563ffffffff81166114388585611699565b516001600160e01b0316029590950194505b5050509193909250565b60008261146357506000610f2a565b8282028284828161147057fe5b0414610ad55760405162461bcd60e51b81526004018080602001828103825260218152602001806119386021913960400191505060405180910390fd5b6001600160a01b03919091166000908152600560205260409020544203111590565b600080826001600160a01b0316846001600160a01b031614156115235760405162461bcd60e51b81526004018080602001828103825260268152602001806118f06026913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610611543578284611546565b83835b90925090506001600160a01b0382166115a6576040805162461bcd60e51b815260206004820152601f60248201527f436865657365537761704c6962726172793a205a45524f5f4144445245535300604482015290519081900360640190fd5b9250929050565b60006115b76118ca565b604051806020016040528085888803816115cd57fe5b046001600160e01b0316905290506115ed6115e88285611749565b6117c7565b71ffffffffffffffffffffffffffffffffffff169695505050505050565b6000610ad583836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506117ce565b6000610ad583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611865565b63ffffffff421690565b6116a16118ca565b6000826001600160701b0316116116ff576040805162461bcd60e51b815260206004820152601760248201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604482015290519081900360640190fd5b6040805160208101909152806001600160701b0384166dffffffffffffffffffffffffffff60701b607087901b168161173457fe5b046001600160e01b0316815250905092915050565b6117516118dc565b600082158061177757505082516001600160e01b03168281029083828161177457fe5b04145b6117b25760405162461bcd60e51b815260040180806020018281038252602381526020018061197d6023913960400191505060405180910390fd5b60408051602081019091529081529392505050565b5160701c90565b6000818484111561185d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561182257818101518382015260200161180a565b50505050905090810190601f16801561184f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836118b45760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561182257818101518382015260200161180a565b5060008385816118c057fe5b0495945050505050565b60408051602081019091526000815290565b604051806020016040528060008152509056fe436865657365537761704c6962726172793a204944454e544943414c5f4144445245535345534b656570337262434853536c6964696e674f7261636c653a3a6164643a2021676f76536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f773a3a69734b65657065723a206b6565706572206973206e6f7420726567697374657265644669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552464c4f574b656570337262434853536c6964696e674f7261636c653a3a71756f74653a207374616c6520707269636573a2646970667358221220ac51fca2a5585c9705cfb2800da500c19217112e4cf9d46a74ec0f633c18599a64736f6c634300060c0033

Deployed ByteCode Sourcemap

13698:7758:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15636:43;;;;;;;;;;;;;;;;-1:-1:-1;15636:43:0;-1:-1:-1;;;;;15636:43:0;;:::i;:::-;;;;;;;;;;;;;;;;15824:104;;;;;;;;;;;;;;;;-1:-1:-1;15824:104:0;-1:-1:-1;;;;;15824:104:0;;:::i;:::-;;;;;;;;;;;;;;;;;;15686:54;;;;;;;;;;;;;;;;-1:-1:-1;15686:54:0;-1:-1:-1;;;;;15686:54:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14788:170;;;:::i;:::-;;16810:135;;;:::i;16146:652::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16146:652:0;;;;;;;;;;:::i;14261:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;14261:25:0;;;;;;;;;;;;;;17560:228;;;:::i;14970:85::-;;;:::i;17413:135::-;;;;;;;;;;;;;;;;-1:-1:-1;17413:135:0;-1:-1:-1;;;;;17413:135:0;;:::i;19093:940::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19093:940:0;;;;;;;;;;;;;;;;;:::i;14495:170::-;;;;;;;;;;;;;;;;-1:-1:-1;14495:170:0;-1:-1:-1;;;;;14495:170:0;;:::i;20045:1408::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20045:1408:0;;;;;;;;;;;;;;;;;;;;:::i;15572:57::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15572:57:0;;;;;;;;:::i;15064:76::-;;;:::i;15940:194::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15940:194:0;;;;;;;;;;:::i;17181:220::-;;;;;;;;;;;;;;;;-1:-1:-1;17181:220:0;;;;;;;:::i;15259:38::-;;;:::i;14293:32::-;;;:::i;15395:90::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15636:43;;;;;;;;;;;;;:::o;15824:104::-;13991:26;;;-1:-1:-1;;;13991:26:0;;14006:10;13991:26;;;;;;15883:4;;15012:42;;13991:14;;:26;;;;;;;;;;;;;;;15883:4;15012:42;13991:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13991:26:0;13983:75;;;;-1:-1:-1;;;13983:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15907:13:::1;15915:4;15907:7;:13::i;:::-;15900:20;;14069:1;15824:104:::0;;;:::o;15686:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14788:170::-;14858:17;;-1:-1:-1;;;;;14858:17:0;14844:10;:31;14836:73;;;;;-1:-1:-1;;;14836:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14933:17;;;14920:30;;-1:-1:-1;;;;;;14920:30:0;-1:-1:-1;;;;;14933:17:0;;;14920:30;;;;;;14788:170::o;16810:135::-;14127:26;;;-1:-1:-1;;;14127:26:0;;14142:10;14127:26;;;;;;15012:42;;14127:14;;:26;;;;;;;;;;;;;;-1:-1:-1;15012:42:0;14127:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14127:26:0;14119:75;;;;-1:-1:-1;;;14119:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16851:11:::1;16865:12;:10;:12::i;:::-;16851:26;;16896:6;16888:49;;;::::0;;-1:-1:-1;;;16888:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;14217:24:0;;;-1:-1:-1;;;14217:24:0;;14230:10;14217:24;;;;;;15012:42;;14217:12;;:24;;;;;-1:-1:-1;;14217:24:0;;;;;;;-1:-1:-1;15012:42:0;14217:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16810:135::o;16146:652::-;16233:10;;-1:-1:-1;;;;;16233:10:0;16219;:24;16211:71;;;;-1:-1:-1;;;16211:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16293:12;16308:50;15098:42;16343:6;16351;16308:25;:50::i;:::-;-1:-1:-1;;;;;16378:12:0;;;;;;:6;:12;;;;;;16293:65;;-1:-1:-1;16378:12:0;;16377:13;16369:31;;;;;-1:-1:-1;;;16369:31:0;;;;;;;;;;;;-1:-1:-1;;;16369:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16411:12:0;;;;;;:6;:12;;;;;:19;;-1:-1:-1;;16411:19:0;16426:4;16411:19;;;;;;16441:6;:17;;;;;;;;;;;;;-1:-1:-1;;;;;;16441:17:0;;;;;;;16411:12;16521:60;16418:4;16521:54;:60::i;:::-;-1:-1:-1;16616:67:0;;;;;;;;16628:15;16616:67;;;;;;;;;;;;;;;;-1:-1:-1;16616:67:0;;;;;;-1:-1:-1;;;;;16592:21:0;;;;;;:15;:21;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16694:16;:22;;;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16755:17;;;:11;:17;;;;;;;:35;;;;-1:-1:-1;;;;16146:652:0:o;14261:25::-;;;-1:-1:-1;;;;;14261:25:0;;:::o;17560:228::-;17603:4;;17620:138;17641:6;:13;17637:17;;17620:138;;;17680:19;17689:6;17696:1;17689:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17689:9:0;17680:8;:19::i;:::-;17676:71;;;17727:4;17720:11;;;;;17676:71;17656:3;;17620:138;;;;17775:5;17768:12;;17560:228;;:::o;14970:85::-;15012:42;14970:85;:::o;17413:135::-;-1:-1:-1;;;;;17509:17:0;17466:4;17509:17;;;:11;:17;;;;;;15293:4;17491:15;:35;;;;17490:50;;17413:135::o;19093:940::-;19183:14;19210:12;19225:53;15098:42;19260:7;19269:8;19225:25;:53::i;:::-;19210:68;-1:-1:-1;19297:31:0;19210:68;19310:17;15293:4;19325:1;19310:14;:17::i;:::-;19297:6;:31::i;:::-;19289:88;;;;-1:-1:-1;;;19289:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19389:14;19408:47;19437:7;19446:8;19408:28;:47::i;:::-;19388:67;;;19477:21;19500;19526:60;19581:4;19526:54;:60::i;:::-;-1:-1:-1;;;;;;19634:21:0;;19597:16;19634:21;;;:15;:21;;;;;:31;19476:110;;-1:-1:-1;19476:110:0;-1:-1:-1;19616:15:0;:49;19690:16;;:34;;19713:11;19690:34;;;19709:1;19690:34;19676:48;;19749:7;-1:-1:-1;;;;;19739:17:0;:6;-1:-1:-1;;;;;19739:17:0;;19735:291;;;-1:-1:-1;;;;;19797:21:0;;;;;;:15;:21;;;;;:38;;;19780:97;;19837:16;19855:11;19868:8;19780:16;:97::i;:::-;19773:104;;;;;;;;;19735:291;-1:-1:-1;;;;;19934:21:0;;;;;;:15;:21;;;;;:38;;;19917:97;;19974:16;19992:11;20005:8;19917:16;:97::i;19093:940::-;;;;;;:::o;14495:170::-;14581:10;;-1:-1:-1;;;;;14581:10:0;14567;:24;14559:56;;;;;-1:-1:-1;;;14559:56:0;;;;;;;;;;;;-1:-1:-1;;;14559:56:0;;;;;;;;;;;;;;;14626:17;:31;;-1:-1:-1;;;;;;14626:31:0;-1:-1:-1;;;;;14626:31:0;;;;;;;;;;14495:170::o;20045:1408::-;20151:14;20178:12;20193:53;15098:42;20228:7;20237:8;20193:25;:53::i;:::-;20178:68;-1:-1:-1;20265:41:0;20178:68;20278:27;15293:4;20293:11;20278:14;:27::i;20265:41::-;20257:98;;;;-1:-1:-1;;;20257:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20367:14;20386:47;20415:7;20424:8;20386:28;:47::i;:::-;-1:-1:-1;;;;;;20510:22:0;;20454:27;20510:22;;;:16;:22;;;;;:29;20366:67;;-1:-1:-1;20454:27:0;-1:-1:-1;;20510:31:0;20454:27;20561:23;20510:31;20572:11;20561:10;:23::i;:::-;20552:32;;20615:14;20658:7;-1:-1:-1;;;;;20648:17:0;:6;-1:-1:-1;;;;;20648:17:0;;20644:745;;;20682:332;20693:6;20689:1;:10;20682:332;;;-1:-1:-1;;;;;;20824:22:0;;;;;;:16;:22;;;;;:25;;20739:1;20737:3;;;20785:213;;20737:1;;20824:25;;;;;;;;;;;;;;;;:42;;;20890:16;:22;20907:4;-1:-1:-1;;;;;20890:22:0;-1:-1:-1;;;;;20890:22:0;;;;;;;;;;;;20913:9;20890:33;;;;;;;;;;;;;;;;;;:50;;;20942:16;:22;20959:4;-1:-1:-1;;;;;20942:22:0;-1:-1:-1;;;;;20942:22:0;;;;;;;;;;;;20965:9;20942:33;;;;;;;;;;;;;;;;;;:45;;;20989:8;20785:16;:213::i;:::-;20759:239;;;;20701:3;;;;;20682:332;;;20644:745;;;21057:6;21053:1;:10;21046:332;;;-1:-1:-1;;;;;;21188:22:0;;;;;;:16;:22;;;;;:25;;21103:1;21101:3;;;21149:213;;21101:1;;21188:25;;;;;;;;;;;;;;;;:42;;;21254:16;:22;21271:4;-1:-1:-1;;;;;21254:22:0;-1:-1:-1;;;;;21254:22:0;;;;;;;;;;;;21277:9;21254:33;;;;;;;;;;;;;;;;;;:50;;;21306:16;:22;21323:4;-1:-1:-1;;;;;21306:22:0;-1:-1:-1;;;;;21306:22:0;;;;;;;;;;;;21329:9;21306:33;;;;;;;21149:213;21123:239;;;;21065:3;;;;;21046:332;;;21406:39;:22;21433:11;21406:26;:39::i;:::-;21399:46;20045:1408;-1:-1:-1;;;;;;;;;;;20045:1408:0:o;15572:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15572:57:0;-1:-1:-1;15572:57:0;:::o;15064:76::-;15098:42;15064:76;:::o;15940:194::-;13991:26;;;-1:-1:-1;;;13991:26:0;;14006:10;13991:26;;;;;;16013:4;;15012:42;;13991:14;;:26;;;;;;;;;;;;;;;16013:4;15012:42;13991:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13991:26:0;13983:75;;;;-1:-1:-1;;;13983:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16030:12:::1;16045:50;15098:42;16080:6;16088;16045:25;:50::i;:::-;16030:65;;16113:13;16121:4;16113:7;:13::i;:::-;16106:20;;;14069:1;15940:194:::0;;;;:::o;17181:220::-;13991:26;;;-1:-1:-1;;;13991:26:0;;14006:10;13991:26;;;;;;17246:12;;15012:42;;13991:14;;:26;;;;;;;;;;;;;;;17246:12;15012:42;13991:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13991:26:0;13983:75;;;;-1:-1:-1;;;13983:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17282:6:::1;17278:1;:10;17271:123;;;17314:18;17322:6;17329:1;17322:9;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;17322:9:0::1;17314:7;:18::i;:::-;17310:73;;;-1:-1:-1::0;17363:4:0::1;17310:73;17290:3;::::0;;::::1;::::0;17271:123:::1;;15259:38:::0;15293:4;15259:38;:::o;14293:32::-;;;-1:-1:-1;;;;;14293:32:0;;:::o;15395:90::-;15435:16;15471:6;15464:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15464:13:0;;;;;;;;;;;;;;;;;;;;;;;15395:90;:::o;17800:676::-;-1:-1:-1;;;;;17994:17:0;;17849:4;17994:17;;;:11;:17;;;;;;17976:15;:35;15293:4;18026:24;;18022:424;;;18068:21;18091;18117:60;18172:4;18117:54;:60::i;:::-;-1:-1:-1;18216:77:0;;;;;;;;18228:15;18216:77;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18192:21:0;;-1:-1:-1;18192:21:0;;;:15;:21;;;;;:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18308:16;:22;;;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18373:17;;;:11;:17;;;;;:35;;;;-1:-1:-1;18192:101:0;;-1:-1:-1;18423:11:0;;-1:-1:-1;18423:11:0;18022:424;-1:-1:-1;18463:5:0;;17800:676;-1:-1:-1;;17800:676:0:o;16957:212::-;16997:12;;17022:140;17043:6;:13;17039:17;;17022:140;;;17082:18;17090:6;17097:1;17090:9;;;;;;;17082:18;17078:73;;;17131:4;17121:14;;17078:73;17058:3;;17022:140;;;;16957:212;:::o;9641:492::-;9730:12;9756:14;9772;9790:26;9801:6;9809;9790:10;:26::i;:::-;9954:32;;;-1:-1:-1;;9954:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9944:43;;;;;;-1:-1:-1;;;;;;9857:265:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9847:276;;;;;;;;;9641:492;-1:-1:-1;;;;;9641:492:0:o;5896:1061::-;5982:21;6005;6028;6079:23;:21;:23::i;:::-;6062:40;;6148:4;-1:-1:-1;;;;;6132:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6132:44:0;6206;;;-1:-1:-1;;;6206:44:0;;;;6132;;-1:-1:-1;;;;;;6206:42:0;;;;;:44;;;;;6132;;6206;;;;;;;;:42;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6206:44:0;6430:35;;;-1:-1:-1;;;6430:35:0;;;;6206:44;;-1:-1:-1;6365:16:0;;;;;;-1:-1:-1;;;;;6430:33:0;;;;;:35;;;;;;;;;;;;;;:33;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6430:35:0;;;;;;;;;;;;;-1:-1:-1;6430:35:0;;-1:-1:-1;6430:35:0;-1:-1:-1;6480:36:0;;;;;;;;6476:474;;6602:35;;;6748:62;;;6753:39;6773:8;6783;6753:19;:39::i;:::-;:42;-1:-1:-1;;;;;6748:48:0;:62;6728:82;;;;;6876:62;;;6881:39;6901:8;6911;6881:19;:39::i;:::-;:42;-1:-1:-1;;;;;6876:48:0;:62;6856:82;;;;;-1:-1:-1;6476:474:0;5896:1061;;;;;;;;:::o;7706:258::-;7764:7;7796:6;7792:47;;-1:-1:-1;7826:1:0;7819:8;;7792:47;7863:5;;;7867:1;7863;:5;:1;7887:5;;;;;:10;7879:56;;;;-1:-1:-1;;;7879:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18942:139;-1:-1:-1;;;;;19048:17:0;;;;19005:4;19048:17;;;:11;:17;;;;;;19030:15;:35;-1:-1:-1;19029:44:0;;18942:139::o;9198:351::-;9273:14;9289;9334:6;-1:-1:-1;;;;;9324:16:0;:6;-1:-1:-1;;;;;9324:16:0;;;9316:67;;;;-1:-1:-1;;;9316:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9422:6;-1:-1:-1;;;;;9413:15:0;:6;-1:-1:-1;;;;;9413:15:0;;:53;;9451:6;9459;9413:53;;;9432:6;9440;9413:53;9394:72;;-1:-1:-1;9394:72:0;-1:-1:-1;;;;;;9485:20:0;;9477:64;;;;;-1:-1:-1;;;9477:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9198:351;;;;;:::o;18488:442::-;18646:14;18706:40;;:::i;:::-;18749:112;;;;;;;;18838:11;18814:20;18793:18;:41;18792:57;;;;;;-1:-1:-1;;;;;18749:112:0;;;18706:155;-1:-1:-1;18884:38:0;:26;18706:155;18901:8;18884:16;:26::i;:::-;:36;:38::i;:::-;18872:50;;;18488:442;-1:-1:-1;;;;;;18488:442:0:o;7369:137::-;7427:7;7454:44;7458:1;7461;7454:44;;;;;;;;;;;;;;;;;:3;:44::i;8228:132::-;8286:7;8313:39;8317:1;8320;8313:39;;;;;;;;;;;;;;;;;:3;:39::i;5667:123::-;5756:25;:15;:25;;5667:123::o;4702:246::-;4783:16;;:::i;:::-;4834:1;4820:11;-1:-1:-1;;;;;4820:15:0;;4812:51;;;;;-1:-1:-1;;;4812:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4881:59;;;;;;;;;;-1:-1:-1;;;;;4891:48:0;;-1:-1:-1;;;3564:3:0;4892:32;;;;4891:48;;;;;;-1:-1:-1;;;;;4881:59:0;;;;4874:66;;4702:246;;;;:::o;4293:253::-;4360:16;;:::i;:::-;4389:6;4414;;;:54;;-1:-1:-1;;4460:7:0;;-1:-1:-1;;;;;4455:13:0;4429:17;;;;4450:1;4429:17;4450:1;4424:27;;;;;:44;4414:54;4406:102;;;;-1:-1:-1;;;4406:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4526:12;;;;;;;;;;;;;4293:253;-1:-1:-1;;;4293:253:0:o;5247:130::-;5347:7;3564:3;5347:21;;5247:130::o;7510:192::-;7596:7;7632:12;7624:6;;;;7616:29;;;;-1:-1:-1;;;7616:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7668:5:0;;;7510:192::o;8368:345::-;8454:7;8556:12;8549:5;8541:28;;;;-1:-1:-1;;;8541:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8580:9;8596:1;8592;:5;;;;;;;8368:345;-1:-1:-1;;;;;8368:345:0:o;-1:-1:-1:-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o

Swarm Source

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