Contract 0x2488f8ce316cfaa9d9094c87fff02e4552ac2dbd 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd940ae91a1fbc94f826d16befc8cf00813edf0493da0a296ad22d881c5cf7c5cApprove130118702021-11-28 2:00:381 hr 7 mins ago0x57d46f8ebc52e53c6f64e6601f34794dba05d02f IN  AlvareNet: ALVN Token0 BNB0.000225915
0x131b40140adcea140da6d3df522088990431719bd00baeea677806ca3d763615Approve130117182021-11-28 1:52:531 hr 14 mins ago0x0ae70a594a37b3686c894cba5871a0d8c49d41bd IN  AlvareNet: ALVN Token0 BNB0.000225915
0xeffa7d473fb5b21773217d344072a601200bf37fb907f6ec7ce58ea475e12d7eApprove130109482021-11-28 1:11:241 hr 56 mins ago0x8b0d84c176eb5201218bf0af3233830e17a41fb6 IN  AlvareNet: ALVN Token0 BNB0.000225915
0x48a312bdfb8fde16194173a4722311d126ec4d6b2fd9c73471fe36bfa8af68c1Approve130053602021-11-27 20:15:026 hrs 52 mins ago0x867100beadf3f86cf3003b8a117bfb7d319405fc IN  AlvareNet: ALVN Token0 BNB0.000225915
0xa92fc647ac30ef2c65f808c40570c50200a350ca18fb17574546a3fba34d785eApprove130044552021-11-27 19:27:567 hrs 39 mins ago0x9641444b0a068f137613283ecb458a2c1167f573 IN  AlvareNet: ALVN Token0 BNB0.000225915
0x96e9a7ef8e3dc3debf4d24e8d90fec08598ab35de35af3330b7ff5cbb59ac8e3Approve130042062021-11-27 19:14:587 hrs 52 mins ago0x9217d47cda1803aa13d1ccc2e3d0196317750d63 IN  AlvareNet: ALVN Token0 BNB0.000225915
0x75153e55b6744db459d0dd1825b54795506081d9f875490d212caa3086340687Approve130040892021-11-27 19:08:317 hrs 59 mins ago0xef3322ba9278a27ddec2e397bdc04ebe2f24e0e2 IN  AlvareNet: ALVN Token0 BNB0.000225915
0xc1db12ac42ab76aa5bdd4961d690cfa040cc6fb1ac4df215b30bc776daf716a8Approve130039162021-11-27 18:58:388 hrs 9 mins ago0x9b23ce3fd82ea5890207595035750fe6622fdd8f IN  AlvareNet: ALVN Token0 BNB0.000225915
0x7b3de1e4eb5ded7695e1a4cf2a4f32e036638ae1f6ffdff2452724e161d181f1Approve130013712021-11-27 16:39:3110 hrs 28 mins ago0x1615c92509eb7e280090bb010dcc5760575101da IN  AlvareNet: ALVN Token0 BNB0.000271098
0x44866b20329a4fc105a0b872bc6419d85478e7cf8dd1dda615875e67e34ca587Approve129990422021-11-27 14:36:4212 hrs 31 mins ago0x3389b8f556fae7b0e88b440d382e62d1bc6e5b98 IN  AlvareNet: ALVN Token0 BNB0.000225915
0xd1553977eadb8d9b47854187b3c679a8a99a228b8f2e38f769c9d6154ef70ab0Approve129986662021-11-27 14:15:5812 hrs 51 mins ago0xec98a19021f29ce424cb28e1c41f293434518691 IN  AlvareNet: ALVN Token0 BNB0.000271098
0x506f818050f14c24cf5cca363923dcdbc1bc393d031d992dcf2ca6be0771a2f9Approve129976002021-11-27 13:18:0013 hrs 49 mins ago0x2331c3990774f9838967d34c4ac9579fae08450b IN  AlvareNet: ALVN Token0 BNB0.000225915
0x59abe1cde4f828c9df1ed2b921fdeccb15f1be5ee95ba1ad670950b738581862Approve129952942021-11-27 11:13:5315 hrs 53 mins ago0xd80d5476da34d8d9e00d4fb609d3d1d843f9c043 IN  AlvareNet: ALVN Token0 BNB0.000225915
0xd41769bcb9792bb7eb2a4a257598e4c09ee498107338fc556634e3d7148ad63eTransfer129946802021-11-27 10:41:1616 hrs 26 mins ago0xc1205af2f4bba7dc7ccdf9fe842c66e6379ac374 IN  AlvareNet: ALVN Token0 BNB0.00090888
0x794349c4feb16f42585b651e0679836358bd78fb074da1f56621e6311eb8db13Approve129905832021-11-27 7:00:2420 hrs 7 mins ago0x8ce9dfe9424bb38a2aae0cf7f67b282f17dcdb80 IN  AlvareNet: ALVN Token0 BNB0.000127995
0x9a64d4f26627839d3d0b8ae5dc1cbca24807d17d1ddb6237393572fd59eb8d04Approve129905812021-11-27 7:00:1820 hrs 7 mins ago0x8ce9dfe9424bb38a2aae0cf7f67b282f17dcdb80 IN  AlvareNet: ALVN Token0 BNB0.000127995
0xc1821493dc3d0fbb534084c4994fee5fcb418ddd2ab0a99a254a8122254ef730Approve129905812021-11-27 7:00:1820 hrs 7 mins ago0x8ce9dfe9424bb38a2aae0cf7f67b282f17dcdb80 IN  AlvareNet: ALVN Token0 BNB0.0000745
0x5819d2f2675e75185dd8a001bb79b6310035aef62952e13ca46919369462dec0Approve129844702021-11-27 1:22:531 day 1 hr ago0x7f606b2edbe47a6326d203d2df890170d646d890 IN  AlvareNet: ALVN Token0 BNB0.000225915
0x5f48d11129ba9c1c26626a0d55c7a72b0ec1e4d022ef2d3b7372d27cf4ddd011Approve129821282021-11-26 23:20:051 day 3 hrs ago0x8568ecd5099b62a487ea9e5bc32a44d3c0b06d56 IN  AlvareNet: ALVN Token0 BNB0.000181881
0x555b3e2a2e7f2ef5e3e12c6da74c76782b314270c9fd56b229f8f99af7bf834cApprove129821242021-11-26 23:19:531 day 3 hrs ago0x8568ecd5099b62a487ea9e5bc32a44d3c0b06d56 IN  AlvareNet: ALVN Token0 BNB0.000316281
0x18735ccc4d11171d2582a47548b3f7229894e41c22bae0005749b650fe2214b4Approve129815112021-11-26 22:48:181 day 4 hrs ago0xd81a84cac54d38053a85bdf7a0f3d2ba8cc28ccd IN  AlvareNet: ALVN Token0 BNB0.0000745
0x202f6bef234a3669d01d95c4e41b1b20cd519de9760d0f7ef4fb80178cf67f10Approve129703212021-11-26 12:42:051 day 14 hrs ago0xe5bed2ec7a32eabd96d2a6b8da44cb6cb93b7f61 IN  AlvareNet: ALVN Token0 BNB0.000225915
0x14dd952f52b4c1f6534e8a19cd7affdedb66133c2c2cdb544206dd9e9696d1b4Approve129657652021-11-26 8:31:121 day 18 hrs ago0x13532c0bc572fd9a3fa623097a13024467c96e35 IN  AlvareNet: ALVN Token0 BNB0.000316281
0xef9f7103bc2e5ec09ccba704bf5234b1434083ebb1ec8dfb9c5334a7900249aaApprove129570342021-11-25 23:47:322 days 3 hrs ago0xdbfe55e8dc367ac6b0fb1a057da3f6515300250f IN  AlvareNet: ALVN Token0 BNB0.000225915
0xdc609550b5a9294ae335b58f3046c6fb21f3167ecbf42cf0177b05be2ec0b0b2Approve129569582021-11-25 23:42:402 days 3 hrs ago0x56a4cde12768f06b50b45e9cdc480f5000913978 IN  AlvareNet: ALVN Token0 BNB0.000225915
[ Download CSV Export 

OVERVIEW

AlvareNet is creating an ecosystem of Dapps making it easier and secure to navigate in the crypto sphere.

Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AlvareNet

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 14 : token.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

//Imports from openzeppelin library
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./interfaces/proxyinterface.sol";

contract AlvareNet is Context, IERC20, AccessControlEnumerable {

    //using safe math to not rewrite even though its not needed anymore
    using SafeMath for uint256;

    using Address for address;

    //Create roles for the contract
    bytes32 public constant TOCENOMICS_ROLE = keccak256("TOCENOMICS_ROLE");
    bytes32 public constant JANITOR_ROLE = keccak256("JANITOR_ROLE");
    bytes32 public constant POOL_ROLE = keccak256("POOL_ROLE");

    //Mapping of token and reflection values
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    uint256 private _tOwnedExcluded;
    uint256 private _rOwnedExcluded;

    mapping(address => mapping(address => uint256)) private _allowances;

    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;

    //Calculate initial total supply and total reflection value
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1000000000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    //Proxy and antiwhale disabled by default since the contract can first be added after token creation
    bool public proxyfee = false;
    bool public proxyenabled = false;

    //Define initial contract settings
    string private constant _name = "AlvareNet";
    string private constant _symbol = "ALVN";
    uint8 private constant _decimals = 9;

    uint256 public taxFee = 4;
    uint256 private _previousTaxFee = taxFee;

    uint256 public otherFee = 7;
    uint256 private _previousOtherFee = otherFee;

    uint256 public constant maxFeeTotal = 20;

    address public proxycontract;

    bool private _inTransfer = false;

    modifier lockTheSwap {
        _inTransfer = true;
        _;
        _inTransfer = false;
    }

    //TODO What to do with initial fee contract? should it be created from here?
    constructor() {
        //initially set the _msgsender to otherFee contract, can't work once we are working with an interface
        //Send total token amount to contract creator
        _rOwned[_msgSender()] = _rTotal;
        //Give contract creator all roles defined in contract
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(TOCENOMICS_ROLE, _msgSender());
        _setupRole(JANITOR_ROLE, _msgSender());
        //
        proxycontract = _msgSender();
        //exclude owner and this contract from transfer fee
        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[address(this)] = true;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    /**
     * @dev Get the token name
     *
     */
    function name() public pure returns (string memory) {
        return _name;
    }

    /**
     * @dev Get the token symbol
     *
     */
    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Get the decimals for token
     *
     */
    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Get the total token supply
     *
     */
    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    /**
     * @dev Get the balance of an address
     *
     */
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    /**
     * @dev Transfer function called by wallet owner
     *
     */
    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev Show how much spender address is able to take from owner wallet
     *
     */
    function allowance(address owner, address spender)
        public
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev Approve spender address to take tokens from sender accounts wallet
     *
     */
    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    //TODO proxy contract approve!!!
    /**
     * @dev Transfer from address, can be called from different address then sender
     *
     * The address calling this function needs to be approved to take this amount of tokens from the sender address if it isnt the sender
     *
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Decrease the allowance amount, that has been set by the approve function(or this function)
     *
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Decrease the allowance amount, that has been set by the approve or increaseAllowance function
     *
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Check if address is excluded from redistribution rewards
     *
     */
    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    /**
     * @dev Get the total fee amount in tokens
     *
     */
    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    /**
     * @dev Set contract that recieves other fee
     *
     */
    function setproxyContract(address contractaddress)
        public onlyRole(DEFAULT_ADMIN_ROLE)
    {
        proxycontract = contractaddress;
        _isExcludedFromFee[contractaddress] = true;
        _isExcluded[contractaddress] = true;
    }

    /**
     * @dev Disable or enable call of external proxy functions
     *
     */
    function changeProxyState(bool newstate) public onlyRole(TOCENOMICS_ROLE){
        proxyenabled = newstate;
    }

    /**
     * @dev Enable or disable using fees supplied by proxy contract
     *
     */
    function changeproxyfeeState(bool newstate) public onlyRole(TOCENOMICS_ROLE){
        proxyfee = newstate;
    }

    /**
     * @dev Change reflected amount to tokens
     *
     */
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(
            !_isExcluded[sender],
            "Excluded addresses cannot call this function"
        );
        (uint256 rAmount, , , , , ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    /**
     * @dev Get the current reflection value from token amount
     *
     */
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        public
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    /**
     * @dev Get token amount based on reflection value
     *
     */
    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    /**
     * @dev Exclude account from redistribution reward
     *
     * Address needs to be included in rewards before
     *
     */
    function excludeFromReward(address account) public onlyRole(JANITOR_ROLE){
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _tOwnedExcluded = _tOwnedExcluded.add(_tOwned[account]);
        _rOwnedExcluded = _rOwnedExcluded.add(_rOwned[account]);
        _isExcluded[account] = true;
    }

    /**
     * @dev Include account in redistribution reward
     *
     * Address needs to be excluded from rewards before
     *
     */
    function includeInReward(address account) public onlyRole(JANITOR_ROLE){
        require(_isExcluded[account], "Account is already included");
        _tOwnedExcluded = _tOwnedExcluded.sub(_tOwned[account]);
        _rOwnedExcluded = _rOwnedExcluded.sub(_rOwned[account]);
        _tOwned[account] = 0;
        _isExcluded[account] = false;
    }

    /**
     * @dev Exlude address in transferfees
     *
     * Address needs to be included in fees before
     *
     */
    function excludeFromFee(address account) public onlyRole(JANITOR_ROLE){
        _isExcludedFromFee[account] = true;
    }

    /**
     * @dev Include address in transferfees
     *
     * Address needs to be excluded from fees before
     *
     */
    function includeInFee(address account) public onlyRole(JANITOR_ROLE){
        _isExcludedFromFee[account] = false;
    }

    /**
     * @dev Set the the value of the fee that is redistributed between holders
     *
     * Input is in percent
     *
     */
    function setTaxFeePercent(uint256 fee) public onlyRole(TOCENOMICS_ROLE) {
        require(fee.add(otherFee) <= maxFeeTotal, "The total fee cant be higher than 20%");
        taxFee = fee;
    }

    /**
     * @dev Set the the value of other fees in total
     *
     * Input is in percent
     *
     */
    function setOtherFeeFeePercent(uint256 fee) public onlyRole(TOCENOMICS_ROLE) {
        require(fee.add(taxFee) <= maxFeeTotal, "The total fee cant be higher than 20%");
        otherFee = fee;
    }

    /**
     * @dev Check if address is excluded from transfer fees
     *
     */
    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    /**
     * @dev Calculate new reflection values and token values based on fee send
     *
     * Subtract fee from total reflection amount and add fee to total token fee amount
     *
     */
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    /**
     * @dev Get token and reflection values
     *
     * Function that combines the following to functions
     *
     */
    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (uint256 tTransferAmount, uint256 tFee, uint256 tOtherFee) =
            _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) =
            _getRValues(tAmount, tFee, tOtherFee, _getRate());
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tOtherFee
        );
    }

    /**
     * @dev Get token values
     *
     * Calculate token amounts for transaction that goes to fees and how much is supposed to be send
     *
     */
    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tOtherFee = calculateOtherFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tOtherFee);
        return (tTransferAmount, tFee, tOtherFee);
    }

    /**
     * @dev Get token reflection values
     *
     * Reflection amount of tokens to get how much is subtracted for fees and supposed to be send
     *
     */
    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tOtherFee,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rOtherFee = tOtherFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rOtherFee);
        return (rAmount, rTransferAmount, rFee);
    }

    /**
     * @dev Get current rate between token ammount and refelction amount
     *
     * Is used to calculate what the current reflection amount is worth in actual tokens.
     *
     */
    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    //

    /**
     * @dev Internal function to calculate current supply based on token amounts and reflected amounts for not excluded adresses
     *
     */
    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if(_rOwnedExcluded > rSupply || _tOwnedExcluded > tSupply){
            return (_rTotal, _tTotal);
        }
        rSupply = rSupply.sub(_rOwnedExcluded);
        tSupply = tSupply.sub(_tOwnedExcluded);
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    /**
     * @dev Internal function to send other fee amounts to proxy contract
     *
     */
    function _takeOtherFee(uint256 tOtherFee, address sender) private {
        uint256 currentRate = _getRate();
        uint256 rOtherFee = tOtherFee.mul(currentRate);
        _rOwned[proxycontract] = _rOwned[proxycontract].add(
            rOtherFee
        );
        if (_isExcluded[proxycontract]){
            _tOwned[proxycontract] = _tOwned[proxycontract]
                .add(tOtherFee);
            _tOwnedExcluded = _tOwnedExcluded.add(tOtherFee);
            _rOwnedExcluded = _rOwnedExcluded.add(rOtherFee);
                }
        emit Transfer(sender, proxycontract, tOtherFee);
    }

    /**
     * @dev Helper functions to calculate fees
     *
     */
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(taxFee).div(10**2);
    }

    function calculateOtherFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(otherFee).div(10**2);
    }

    /**
     * @dev Internal functions to temporary remove fee during one transaction
     *
     *  Set fee to 0 during one transaction to make it simpler to calculate transfer values
     *
     */
    function removeAllFee() private {
        if (taxFee == 0 && otherFee == 0) return;

        _previousTaxFee = taxFee;
        _previousOtherFee = otherFee;

        taxFee = 0;
        otherFee = 0;
    }

    function restoreAllFee() private {
        taxFee = _previousTaxFee;
        otherFee = _previousOtherFee;
    }

    /**
     * @dev Approve other address to remove tokens from wallet
     *
     *  Since pankacke swap and other sites need to remove tokens from the users wallet
     *  it needs to be approved by the wallet the amount is removed from.
     *
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }


    //Transfer functions

    /**
     * @dev Internal transferfunction to check requirements for transfer
     *
     *  Check if requires are satisfied and check if sender or recipient is excluded from the fee.
     *  Avoid sending too much during one transaction for whales
     *
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private{
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if(_inTransfer){
            _tokenTransfer(from, to, amount, false);
        }
        else {
            _inTransfer = true;
            //antiwhale function upgradable in the future

            //indicates if fee should be deducted from transfer
            bool takeFee = true;
            uint256 contractTax = taxFee;
            uint256 contractOther = otherFee;

            //if any account belongs to _isExcludedFromFee account then remove the fee
            if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
                takeFee = false;
            }

            //If proxy function is enabled, do pretransfer checks and modify fee if its enabled
            if(proxyenabled){

                (uint256 newTaxFee, uint256 newOtherFee, bool newTakeFee) = IProxyContract(proxycontract).preTransfer(from, to, amount, takeFee);

                if(proxyfee){
                    taxFee = newTaxFee;
                    otherFee = newOtherFee;
                    takeFee = newTakeFee;
                }
            }


            //transfer amount, it will take tax, burn, liquidity fee
            _tokenTransfer(from, to, amount, takeFee);

            if(proxyenabled){
                //Reverse fee to old state
                if(proxyfee){
                    taxFee = contractTax;
                    otherFee = contractOther;
                }
                IProxyContract(proxycontract).postTransfer(from, to, amount, takeFee);
            }
            _inTransfer = false;
        }


    }

    /**
     * @dev Check if sender or reciever is excluded from reward and use the right transfer functions based on this
     *
     *  Disable fee, if this transaction is excluded from fees. Check if sender or/and reciever is excluded from rewards
     *  to check if token balance or/and reflection balance need to be added to reciepient addres and subtracted from sender
     */
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (!takeFee) {
            removeAllFee();
        }

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        //Make sure that next transactions have a fee if they aren't excluded
        if (!takeFee) {
            restoreAllFee();
        }
    }

    /**
     * @dev Transfer function when both sender and reciever are included in rewards
     *
     *  Remove the reflection amount from sender and add reflection amount to sender
     *
     */
    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tOtherFee
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeOtherFee(tOtherFee, sender);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
     * @dev Transfer function when reciever is exluded from rewards
     *
     *  Remove the reflection amount from sender and only add reflection and token amount to sender
     *
     */
    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tOtherFee
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _tOwnedExcluded = _tOwnedExcluded.add(tTransferAmount);
        _rOwnedExcluded = _rOwnedExcluded.add(rTransferAmount);
        _takeOtherFee(tOtherFee, sender);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
     * @dev Transfer function when sender is exluded from rewards
     *
     *  Remove the token and reflection amount from sender and only add reflection amount to sender
     *
     */
    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tOtherFee
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        //Update total amount
        _tOwnedExcluded = _tOwnedExcluded.sub(tAmount);
        _rOwnedExcluded = _rOwnedExcluded.sub(rAmount);

        _takeOtherFee(tOtherFee, sender);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
     * @dev Transfer function when sender and reciever is excluded from rewards
     *
     *  Remove the token and reflection amount from sender and add reflection and token amount to sender
     *
     */
    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tOtherFee
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        //Update total amount in total adresses
        _tOwnedExcluded = _tOwnedExcluded.sub(tAmount).add(tTransferAmount);
        _rOwnedExcluded = _rOwnedExcluded.sub(rAmount).add(rTransferAmount);

        _takeOtherFee(tOtherFee, sender);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    //Withdraw tokens, can be vanurable to reentrancy attacks, but doesn't matter becouse of onlyOwner
    function emergencyWithdraw(uint256 _amount, address _token) public onlyRole(JANITOR_ROLE){
        IERC20 token = IERC20(_token);
        require(_amount >= token.balanceOf(address(this)), 'The contract balance is too low');
        token.transfer(msg.sender, _amount);
    }
}

File 2 of 14 : AccessControlEnumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IAccessControlEnumerable.sol";
import "./AccessControl.sol";
import "../utils/structs/EnumerableSet.sol";

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}

File 3 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 14 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 5 of 14 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 6 of 14 : proxyinterface.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IProxyContract {
    function preTransfer(address, address, uint256, bool) external returns (uint256, uint256, bool);
    function postTransfer(address, address, uint256, bool) external;
    function getPair() external view returns (address);
}

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

pragma solidity ^0.8.0;

import "./IAccessControl.sol";

/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

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

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 9 of 14 : EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

File 10 of 14 : IAccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 11 of 14 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 12 of 14 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 13 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 14 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JANITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOCENOMICS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newstate","type":"bool"}],"name":"changeProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newstate","type":"bool"}],"name":"changeproxyfeeState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"otherFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxycontract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyenabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyfee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setOtherFeeFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractaddress","type":"address"}],"name":"setproxyContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405269d3c21bcecceda10000006000196200001e91906200063f565b6000196200002d9190620005fa565b6009556000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506004600c55600c54600d556007600e55600e54600f556000601060146101000a81548160ff021916908315150217905550348015620000a457600080fd5b5060095460026000620000bc6200033660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200011e6000801b620001126200033660201b60201c565b6200033e60201b60201c565b6200015f7f7194b1ccf87a73100daa4a1a78ef88a2b4f239f3857dc6cbb11d95ecc56b8e9a620001536200033660201b60201c565b6200033e60201b60201c565b620001a07f1cb0d6461572bd9b725739f1d8ea32d250b0dfcd75c68201355159719c012f80620001946200033660201b60201c565b6200033e60201b60201c565b620001b06200033660201b60201c565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000620002066200033660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002bf6200033660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef69d3c21bcecceda1000000604051620003289190620005dd565b60405180910390a3620006d5565b600033905090565b6200035582826200038660201b62001d931760201c565b6200038181600160008581526020019081526020016000206200039c60201b62001da11790919060201c565b505050565b620003988282620003d460201b60201c565b5050565b6000620003cc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620004c560201b60201c565b905092915050565b620003e682826200053f60201b60201c565b620004c157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004666200033660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620004d98383620005a960201b60201c565b6200053457826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000539565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b620005d78162000635565b82525050565b6000602082019050620005f46000830184620005cc565b92915050565b6000620006078262000635565b9150620006148362000635565b9250828210156200062a576200062962000677565b5b828203905092915050565b6000819050919050565b60006200064c8262000635565b9150620006598362000635565b9250826200066c576200066b620006a6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6152ff80620006e56000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80635342acb41161015c578063a217fddf116100ce578063d547741f11610087578063d547741f1461080e578063dc2d43211461082a578063dd62ed3e14610848578063de6bc03f14610878578063e223905f14610894578063ea2f0b37146108b25761027f565b8063a217fddf14610726578063a457c2d714610744578063a9059cbb14610774578063af5413cd146107a4578063c902ae5d146107c0578063ca15c873146107de5761027f565b806388f820201161012057806388f820201461063e5780639010d07c1461066e57806391d148541461069e57806394d2faea146106ce57806395d89b41146106ea578063a071dcf4146107085761027f565b80635342acb4146105865780636692dd57146105b65780636827ffc7146105d457806370a08231146105f2578063796706de146106225761027f565b8063313ce567116101f55780633bd5d173116101b95780633bd5d173146104c6578063402e04a6146104e2578063404ccd0714610500578063437823ec1461051e5780634549b0391461053a57806352390c021461056a5761027f565b8063313ce56714610422578063343ab2161461044057806336568abe1461045e5780633685d4191461047a57806339509351146104965761027f565b806318160ddd1161024757806318160ddd1461033c57806323b872dd1461035a578063248a9ca31461038a5780632d838119146103ba5780632f2ff15d146103ea5780632f940c70146104065761027f565b806301ffc9a714610284578063061c82d0146102b457806306fdde03146102d0578063095ea7b3146102ee57806313114a9d1461031e575b600080fd5b61029e60048036038101906102999190614458565b6108ce565b6040516102ab9190614942565b60405180910390f35b6102ce60048036038101906102c99190614481565b610948565b005b6102d86109dd565b6040516102e59190614978565b60405180910390f35b61030860048036038101906103039190614329565b610a1a565b6040516103159190614942565b60405180910390f35b610326610a38565b6040516103339190614b5a565b60405180910390f35b610344610a42565b6040516103519190614b5a565b60405180910390f35b610374600480360381019061036f91906142da565b610a54565b6040516103819190614942565b60405180910390f35b6103a4600480360381019061039f91906143b7565b610b2d565b6040516103b1919061495d565b60405180910390f35b6103d460048036038101906103cf9190614481565b610b4c565b6040516103e19190614b5a565b60405180910390f35b61040460048036038101906103ff91906143e0565b610bba565b005b610420600480360381019061041b91906144d3565b610bee565b005b61042a610d84565b6040516104379190614b75565b60405180910390f35b610448610d8d565b6040516104559190614b5a565b60405180910390f35b610478600480360381019061047391906143e0565b610d93565b005b610494600480360381019061048f9190614275565b610dc7565b005b6104b060048036038101906104ab9190614329565b610fda565b6040516104bd9190614942565b60405180910390f35b6104e060048036038101906104db9190614481565b61108d565b005b6104ea611208565b6040516104f79190614942565b60405180910390f35b61050861121b565b604051610515919061495d565b60405180910390f35b61053860048036038101906105339190614275565b61123f565b005b610554600480360381019061054f919061450f565b6112cd565b6040516105619190614b5a565b60405180910390f35b610584600480360381019061057f9190614275565b611359565b005b6105a0600480360381019061059b9190614275565b6115fc565b6040516105ad9190614942565b60405180910390f35b6105be611652565b6040516105cb919061495d565b60405180910390f35b6105dc611676565b6040516105e99190614b5a565b60405180910390f35b61060c60048036038101906106079190614275565b61167b565b6040516106199190614b5a565b60405180910390f35b61063c60048036038101906106379190614275565b611766565b005b61065860048036038101906106539190614275565b611870565b6040516106659190614942565b60405180910390f35b6106886004803603810190610683919061441c565b6118c6565b60405161069591906148b9565b60405180910390f35b6106b860048036038101906106b391906143e0565b6118f5565b6040516106c59190614942565b60405180910390f35b6106e860048036038101906106e39190614365565b61195f565b005b6106f26119af565b6040516106ff9190614978565b60405180910390f35b6107106119ec565b60405161071d9190614b5a565b60405180910390f35b61072e6119f2565b60405161073b919061495d565b60405180910390f35b61075e60048036038101906107599190614329565b6119f9565b60405161076b9190614942565b60405180910390f35b61078e60048036038101906107899190614329565b611ac6565b60405161079b9190614942565b60405180910390f35b6107be60048036038101906107b99190614365565b611ae4565b005b6107c8611b34565b6040516107d591906148b9565b60405180910390f35b6107f860048036038101906107f391906143b7565b611b5a565b6040516108059190614b5a565b60405180910390f35b610828600480360381019061082391906143e0565b611b7e565b005b610832611bb2565b60405161083f919061495d565b60405180910390f35b610862600480360381019061085d919061429e565b611bd6565b60405161086f9190614b5a565b60405180910390f35b610892600480360381019061088d9190614481565b611c5d565b005b61089c611cf2565b6040516108a99190614942565b60405180910390f35b6108cc60048036038101906108c79190614275565b611d05565b005b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610941575061094082611dd1565b5b9050919050565b7f7194b1ccf87a73100daa4a1a78ef88a2b4f239f3857dc6cbb11d95ecc56b8e9a61097a81610975611e4b565b611e53565b6014610991600e5484611ef090919063ffffffff16565b11156109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990614a9a565b60405180910390fd5b81600c819055505050565b60606040518060400160405280600981526020017f416c766172654e65740000000000000000000000000000000000000000000000815250905090565b6000610a2e610a27611e4b565b8484611f06565b6001905092915050565b6000600a54905090565b600069d3c21bcecceda1000000905090565b6000610a618484846120d1565b610b2284610a6d611e4b565b610b1d8560405180606001604052806028815260200161527d60289139600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ad3611e4b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124f09092919063ffffffff16565b611f06565b600190509392505050565b6000806000838152602001908152602001600020600101549050919050565b6000600954821115610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a906149fa565b60405180910390fd5b6000610b9d612545565b9050610bb2818461257090919063ffffffff16565b915050919050565b610bc48282612586565b610be98160016000858152602001908152602001600020611da190919063ffffffff16565b505050565b7f1cb0d6461572bd9b725739f1d8ea32d250b0dfcd75c68201355159719c012f80610c2081610c1b611e4b565b611e53565b60008290508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c5e91906148b9565b60206040518083038186803b158015610c7657600080fd5b505afa158015610c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cae91906144aa565b841015610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce79061499a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401610d2b929190614919565b602060405180830381600087803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7d919061438e565b5050505050565b60006009905090565b600e5481565b610d9d82826125af565b610dc2816001600085815260200190815260200160002061263290919063ffffffff16565b505050565b7f1cb0d6461572bd9b725739f1d8ea32d250b0dfcd75c68201355159719c012f80610df981610df4611e4b565b611e53565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614a5a565b60405180910390fd5b610ed9600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460045461266290919063ffffffff16565b600481905550610f33600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460055461266290919063ffffffff16565b6005819055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000611083610fe7611e4b565b8461107e8560066000610ff8611e4b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b611f06565b6001905092915050565b6000611097611e4b565b9050600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d90614b1a565b60405180910390fd5b600061113183612678565b5050505050905061118a81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111e28160095461266290919063ffffffff16565b6009819055506111fd83600a54611ef090919063ffffffff16565b600a81905550505050565b600b60009054906101000a900460ff1681565b7fb8179c2726c8d8961ef054875ab3f4c1c3d34e1cb429c3d5e0bc97958e4cab9d81565b7f1cb0d6461572bd9b725739f1d8ea32d250b0dfcd75c68201355159719c012f806112718161126c611e4b565b611e53565b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600069d3c21bcecceda100000083111561131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390614a7a565b60405180910390fd5b8161133c57600061132c84612678565b5050505050905080915050611353565b600061134784612678565b50505050915050809150505b92915050565b7f1cb0d6461572bd9b725739f1d8ea32d250b0dfcd75c68201355159719c012f8061138b81611386611e4b565b611e53565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90614a3a565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156114ec576114a8600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b4c565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611540600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600454611ef090919063ffffffff16565b60048190555061159a600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600554611ef090919063ffffffff16565b6005819055506001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b7f1cb0d6461572bd9b725739f1d8ea32d250b0dfcd75c68201355159719c012f8081565b601481565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561171657600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611761565b61175e600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b4c565b90505b919050565b6000801b61177b81611776611e4b565b611e53565b81601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006118ed82600160008681526020019081526020016000206126d490919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f7194b1ccf87a73100daa4a1a78ef88a2b4f239f3857dc6cbb11d95ecc56b8e9a6119918161198c611e4b565b611e53565b81600b60016101000a81548160ff0219169083151502179055505050565b60606040518060400160405280600481526020017f414c564e00000000000000000000000000000000000000000000000000000000815250905090565b600c5481565b6000801b81565b6000611abc611a06611e4b565b84611ab7856040518060600160405280602581526020016152a56025913960066000611a30611e4b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124f09092919063ffffffff16565b611f06565b6001905092915050565b6000611ada611ad3611e4b565b84846120d1565b6001905092915050565b7f7194b1ccf87a73100daa4a1a78ef88a2b4f239f3857dc6cbb11d95ecc56b8e9a611b1681611b11611e4b565b611e53565b81600b60006101000a81548160ff0219169083151502179055505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b77600160008481526020019081526020016000206126ee565b9050919050565b611b888282612703565b611bad816001600085815260200190815260200160002061263290919063ffffffff16565b505050565b7f7194b1ccf87a73100daa4a1a78ef88a2b4f239f3857dc6cbb11d95ecc56b8e9a81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f7194b1ccf87a73100daa4a1a78ef88a2b4f239f3857dc6cbb11d95ecc56b8e9a611c8f81611c8a611e4b565b611e53565b6014611ca6600c5484611ef090919063ffffffff16565b1115611ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cde90614a9a565b60405180910390fd5b81600e819055505050565b600b60019054906101000a900460ff1681565b7f1cb0d6461572bd9b725739f1d8ea32d250b0dfcd75c68201355159719c012f80611d3781611d32611e4b565b611e53565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611d9d828261272c565b5050565b6000611dc9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61280c565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e445750611e438261287c565b5b9050919050565b600033905090565b611e5d82826118f5565b611eec57611e828173ffffffffffffffffffffffffffffffffffffffff1660146128e6565b611e908360001c60206128e6565b604051602001611ea192919061487f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39190614978565b60405180910390fd5b5050565b60008183611efe9190614bb7565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d90614afa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90614a1a565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120c49190614b5a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213890614ada565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a8906149da565b60405180910390fd5b600081116121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90614aba565b60405180910390fd5b601060149054906101000a900460ff161561221b576122168383836000612be0565b6124eb565b6001601060146101000a81548160ff0219169083151502179055506000600190506000600c5490506000600e549050600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806122eb5750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122f557600092505b600b60019054906101000a900460ff16156123f3576000806000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166374e342ed8a8a8a8a6040518563ffffffff1660e01b815260040161237094939291906148d4565b606060405180830381600087803b15801561238a57600080fd5b505af115801561239e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c2919061454b565b925092509250600b60009054906101000a900460ff16156123ef5782600c8190555081600e819055508095505b5050505b6123ff86868686612be0565b600b60019054906101000a900460ff16156124cc57600b60009054906101000a900460ff16156124385781600c8190555080600e819055505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa94e751878787876040518563ffffffff1660e01b815260040161249994939291906148d4565b600060405180830381600087803b1580156124b357600080fd5b505af11580156124c7573d6000803e3d6000fd5b505050505b6000601060146101000a81548160ff0219169083151502179055505050505b505050565b6000838311158290612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f9190614978565b60405180910390fd5b5082840390509392505050565b6000806000612552612ef1565b91509150612569818361257090919063ffffffff16565b9250505090565b6000818361257e9190614c0d565b905092915050565b61258f82610b2d565b6125a08161259b611e4b565b611e53565b6125aa838361272c565b505050565b6125b7611e4b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b90614b3a565b60405180910390fd5b61262e8282612fb3565b5050565b600061265a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613094565b905092915050565b600081836126709190614c98565b905092915050565b600080600080600080600080600061268f8a61321a565b92509250925060008060006126ad8d86866126a8612545565b613274565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b60006126e383600001836132fd565b60001c905092915050565b60006126fc8260000161334e565b9050919050565b61270c82610b2d565b61271d81612718611e4b565b611e53565b6127278383612fb3565b505050565b61273682826118f5565b61280857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127ad611e4b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612818838361335f565b612871578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612876565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600060028360026128f99190614c3e565b6129039190614bb7565b67ffffffffffffffff811115612942577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106129d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a9c9190614c3e565b612aa69190614bb7565b90505b6001811115612b92577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612b4b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612b8b90614d8a565b9050612aa9565b5060008414612bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcd906149ba565b60405180910390fd5b8091505092915050565b80612bee57612bed613382565b5b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612c915750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ca657612ca18484846133c5565b612edd565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612d495750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612d5e57612d5984848461365c565b612edc565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e025750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e1757612e128484846138f3565b612edb565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612eb95750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ece57612ec9848484613abf565b612eda565b612ed98484846138f3565b5b5b5b5b80612eeb57612eea613e0f565b5b50505050565b60008060006009549050600069d3c21bcecceda10000009050816005541180612f1b575080600454115b15612f395760095469d3c21bcecceda1000000935093505050612faf565b612f4e6005548361266290919063ffffffff16565b9150612f656004548261266290919063ffffffff16565b9050612f8669d3c21bcecceda100000060095461257090919063ffffffff16565b821015612fa65760095469d3c21bcecceda1000000935093505050612faf565b81819350935050505b9091565b612fbd82826118f5565b1561309057600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613035611e4b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808360010160008481526020019081526020016000205490506000811461320e5760006001826130c69190614c98565b90506000600186600001805490506130de9190614c98565b9050818114613199576000866000018281548110613125577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061316f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806131d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613214565b60009150505b92915050565b60008060008061322985613e23565b9050600061323686613e54565b9050600061325f82613251858a61266290919063ffffffff16565b61266290919063ffffffff16565b90508083839550955095505050509193909250565b60008060008061328d8589613e8590919063ffffffff16565b905060006132a48689613e8590919063ffffffff16565b905060006132bb8789613e8590919063ffffffff16565b905060006132e4826132d6858761266290919063ffffffff16565b61266290919063ffffffff16565b9050838184965096509650505050509450945094915050565b600082600001828154811061333b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6000600c5414801561339657506000600e54145b156133a0576133c3565b600c54600d81905550600e54600f819055506000600c819055506000600e819055505b565b6000806000806000806133d787612678565b95509550955095509550955061343587600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266290919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134ca86600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061355f85600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135b78760045461266290919063ffffffff16565b6004819055506135d28660055461266290919063ffffffff16565b6005819055506135e2818a613e9b565b6135ec84836141a8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516136499190614b5a565b60405180910390a3505050505050505050565b60008060008060008061366e87612678565b9550955095509550955095506136cc86600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061376183600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137f685600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061384e83600454611ef090919063ffffffff16565b60048190555061386985600554611ef090919063ffffffff16565b600581905550613879818a613e9b565b61388384836141a8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516138e09190614b5a565b60405180910390a3505050505050505050565b60008060008060008061390587612678565b95509550955095509550955061396386600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139f885600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a45818a613e9b565b613a4f84836141a8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613aac9190614b5a565b60405180910390a3505050505050505050565b600080600080600080613ad187612678565b955095509550955095509550613b2f87600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266290919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bc486600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c5983600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cee85600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d5883613d4a8960045461266290919063ffffffff16565b611ef090919063ffffffff16565b600481905550613d8585613d778860055461266290919063ffffffff16565b611ef090919063ffffffff16565b600581905550613d95818a613e9b565b613d9f84836141a8565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613dfc9190614b5a565b60405180910390a3505050505050505050565b600d54600c81905550600f54600e81905550565b6000613e4d6064613e3f600c5485613e8590919063ffffffff16565b61257090919063ffffffff16565b9050919050565b6000613e7e6064613e70600e5485613e8590919063ffffffff16565b61257090919063ffffffff16565b9050919050565b60008183613e939190614c3e565b905092915050565b6000613ea5612545565b90506000613ebc8285613e8590919063ffffffff16565b9050613f328160026000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b60026000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060086000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561411b5761407f8460036000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ef090919063ffffffff16565b60036000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140f984600454611ef090919063ffffffff16565b60048190555061411481600554611ef090919063ffffffff16565b6005819055505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161419a9190614b5a565b60405180910390a350505050565b6141bd8260095461266290919063ffffffff16565b6009819055506141d881600a54611ef090919063ffffffff16565b600a819055505050565b6000813590506141f181615209565b92915050565b60008135905061420681615220565b92915050565b60008151905061421b81615220565b92915050565b60008135905061423081615237565b92915050565b6000813590506142458161524e565b92915050565b60008135905061425a81615265565b92915050565b60008151905061426f81615265565b92915050565b60006020828403121561428757600080fd5b6000614295848285016141e2565b91505092915050565b600080604083850312156142b157600080fd5b60006142bf858286016141e2565b92505060206142d0858286016141e2565b9150509250929050565b6000806000606084860312156142ef57600080fd5b60006142fd868287016141e2565b935050602061430e868287016141e2565b925050604061431f8682870161424b565b9150509250925092565b6000806040838503121561433c57600080fd5b600061434a858286016141e2565b925050602061435b8582860161424b565b9150509250929050565b60006020828403121561437757600080fd5b6000614385848285016141f7565b91505092915050565b6000602082840312156143a057600080fd5b60006143ae8482850161420c565b91505092915050565b6000602082840312156143c957600080fd5b60006143d784828501614221565b91505092915050565b600080604083850312156143f357600080fd5b600061440185828601614221565b9250506020614412858286016141e2565b9150509250929050565b6000806040838503121561442f57600080fd5b600061443d85828601614221565b925050602061444e8582860161424b565b9150509250929050565b60006020828403121561446a57600080fd5b600061447884828501614236565b91505092915050565b60006020828403121561449357600080fd5b60006144a18482850161424b565b91505092915050565b6000602082840312156144bc57600080fd5b60006144ca84828501614260565b91505092915050565b600080604083850312156144e657600080fd5b60006144f48582860161424b565b9250506020614505858286016141e2565b9150509250929050565b6000806040838503121561452257600080fd5b60006145308582860161424b565b9250506020614541858286016141f7565b9150509250929050565b60008060006060848603121561456057600080fd5b600061456e86828701614260565b935050602061457f86828701614260565b92505060406145908682870161420c565b9150509250925092565b6145a381614ccc565b82525050565b6145b281614cde565b82525050565b6145c181614cea565b82525050565b60006145d282614b90565b6145dc8185614b9b565b93506145ec818560208601614d57565b6145f581614e12565b840191505092915050565b600061460b82614b90565b6146158185614bac565b9350614625818560208601614d57565b80840191505092915050565b600061463e601f83614b9b565b915061464982614e23565b602082019050919050565b6000614661602083614b9b565b915061466c82614e4c565b602082019050919050565b6000614684602383614b9b565b915061468f82614e75565b604082019050919050565b60006146a7602a83614b9b565b91506146b282614ec4565b604082019050919050565b60006146ca602283614b9b565b91506146d582614f13565b604082019050919050565b60006146ed601b83614b9b565b91506146f882614f62565b602082019050919050565b6000614710601b83614b9b565b915061471b82614f8b565b602082019050919050565b6000614733601f83614b9b565b915061473e82614fb4565b602082019050919050565b6000614756602583614b9b565b915061476182614fdd565b604082019050919050565b6000614779602983614b9b565b91506147848261502c565b604082019050919050565b600061479c602583614b9b565b91506147a78261507b565b604082019050919050565b60006147bf602483614b9b565b91506147ca826150ca565b604082019050919050565b60006147e2601783614bac565b91506147ed82615119565b601782019050919050565b6000614805602c83614b9b565b915061481082615142565b604082019050919050565b6000614828601183614bac565b915061483382615191565b601182019050919050565b600061484b602f83614b9b565b9150614856826151ba565b604082019050919050565b61486a81614d40565b82525050565b61487981614d4a565b82525050565b600061488a826147d5565b91506148968285614600565b91506148a18261481b565b91506148ad8284614600565b91508190509392505050565b60006020820190506148ce600083018461459a565b92915050565b60006080820190506148e9600083018761459a565b6148f6602083018661459a565b6149036040830185614861565b61491060608301846145a9565b95945050505050565b600060408201905061492e600083018561459a565b61493b6020830184614861565b9392505050565b600060208201905061495760008301846145a9565b92915050565b600060208201905061497260008301846145b8565b92915050565b6000602082019050818103600083015261499281846145c7565b905092915050565b600060208201905081810360008301526149b381614631565b9050919050565b600060208201905081810360008301526149d381614654565b9050919050565b600060208201905081810360008301526149f381614677565b9050919050565b60006020820190508181036000830152614a138161469a565b9050919050565b60006020820190508181036000830152614a33816146bd565b9050919050565b60006020820190508181036000830152614a53816146e0565b9050919050565b60006020820190508181036000830152614a7381614703565b9050919050565b60006020820190508181036000830152614a9381614726565b9050919050565b60006020820190508181036000830152614ab381614749565b9050919050565b60006020820190508181036000830152614ad38161476c565b9050919050565b60006020820190508181036000830152614af38161478f565b9050919050565b60006020820190508181036000830152614b13816147b2565b9050919050565b60006020820190508181036000830152614b33816147f8565b9050919050565b60006020820190508181036000830152614b538161483e565b9050919050565b6000602082019050614b6f6000830184614861565b92915050565b6000602082019050614b8a6000830184614870565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000614bc282614d40565b9150614bcd83614d40565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c0257614c01614db4565b5b828201905092915050565b6000614c1882614d40565b9150614c2383614d40565b925082614c3357614c32614de3565b5b828204905092915050565b6000614c4982614d40565b9150614c5483614d40565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c8d57614c8c614db4565b5b828202905092915050565b6000614ca382614d40565b9150614cae83614d40565b925082821015614cc157614cc0614db4565b5b828203905092915050565b6000614cd782614d20565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015614d75578082015181840152602081019050614d5a565b83811115614d84576000848401525b50505050565b6000614d9582614d40565b91506000821415614da957614da8614db4565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f54686520636f6e74726163742062616c616e636520697320746f6f206c6f7700600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b7f4163636f756e7420697320616c726561647920696e636c756465640000000000600082015250565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b7f54686520746f74616c206665652063616e74206265206869676865722074686160008201527f6e20323025000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61521281614ccc565b811461521d57600080fd5b50565b61522981614cde565b811461523457600080fd5b50565b61524081614cea565b811461524b57600080fd5b50565b61525781614cf4565b811461526257600080fd5b50565b61526e81614d40565b811461527957600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122068b7cf3f94316e8a4d14be9306fefe922cf14915202aa1ed5e6064c5f225cd4164736f6c63430008040033

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.