ETH Price: $3,302.07 (-2.78%)
 

Overview

Max Total Supply

589,510,824,908.178732632507178278 TheBeeConservancy_Dividend_Tracker

Holders

23

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
39,990,000,000 TheBeeConservancy_Dividend_Tracker

Value
$0.00
0x5DD7313dE3786295688484b48D97Ed0D9F11bf73
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
TheBeeConservancyDividendTracker

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-13
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-13
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-12
*/

// SPDX-License-Identifier: UNLICENSED

// IERC20.sol
pragma solidity ^0.6.2;

/*
💝 SAVE THE BEES! 💝

TBC Token - The Bee Conservancy is a Charity Token that Rewards Holders for helping to save the Bees! Team TomorrowWontExist will be donating to the https://thebeeconservancy.org/ on an ongoing Basis

🔶 Officially Stealth Launched!!! 

🌎 Website          https://liveinthenowmovement.com/collections/bee/bee
   
💝 Help Save the Bees and Bee Rewarded with 8% ETH Reflections! Did you know that a ton of your favorite things wouldn't exist without Bees?
🤖 Telegram        https://t.me/TBCToken

✅ Seasoned Contract for Trending!
✅ Rewards & Buy Backs!
✅ Huge Marketing Lined Up!
✅ 1ETH Initial locked Liquidity!
✅ REAL Charity with ongoing proof of Donations Sent - 1st Donation will be Sent August 23rd!

🚀🚀  DON’T MISS OUT ON THE NEXT 1000X 🚀🚀 

🔥  Tokenomics - 15% Tax
💰  8% wETH Reflections (Dividends paid every Hour)
💫  4% Marketing & Charity
⭐️  3% Buybacks - Auto LP
🗣   Community Driven Project and Economy 
💯  Ownership Renounced
🔐  Liquidity Locked - Unruggable
🆔  Fully Doxed and Verified Dev Team (ScrawnyViking from TWE Token with Sustainble Housing Development)

💰 Don't miss out on our Weekly TWE Lottery Fair Launch @ https://tomorrowwontexist.com/twe-lottery-token 💰 
🏘 Participate to help with building Safe Homes in the case of Natural Disasters @TWEToken
*/

pragma solidity ^0.6.2;

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

// CONTEXT.sol

pragma solidity ^0.6.2;

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// uniswapV2Router

pragma solidity ^0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


// UNISWAP factory

pragma solidity ^0.6.2;

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

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

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

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

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

// UNISWAP Pair

pragma solidity ^0.6.2;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// IERC20Meta

pragma solidity ^0.6.2;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// Ownable

pragma solidity ^0.6.2;

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () public {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// SafeMath

pragma solidity ^0.6.2;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// SafeMathInt

pragma solidity ^0.6.2;

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

// SAFEMATHUINT

pragma solidity ^0.6.2;

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

// IterableMapping

pragma solidity ^0.6.2;

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }



    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

// ERC20

pragma solidity ^0.6.2;

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    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 Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


// DividentInterface

pragma solidity ^0.6.2;


/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
interface DividendPayingTokenInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);


  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
  function withdrawDividend() external;

  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmount The amount of distributed ether in wei.
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  /// @dev This event MUST emit when an address withdraws their dividend.
  /// @param to The address which withdraws ether from this contract.
  /// @param weiAmount The amount of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

// DividendPayingOptInterface

pragma solidity ^0.6.2;


/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
interface DividendPayingTokenOptionalInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

pragma solidity ^0.6.2;

/// @title Dividend-Paying Token
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev A mintable ERC20 token that allows anyone to pay and distribute ether
///  to token holders as dividends and allows token holders to withdraw their dividends.
contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

    address public immutable ETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // WETH


  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;

  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;

  uint256 public totalDividendsDistributed;

  constructor(string memory _name, string memory _symbol) public ERC20(_name, _symbol) {

  }


  function distributeETHDividends(uint256 amount) public onlyOwner{
    require(totalSupply() > 0);

    if (amount > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (amount).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, amount);

      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(msg.sender);
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
 function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      bool success = IERC20(ETH).transfer(user, _withdrawableDividend);

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }

      return _withdrawableDividend;
    }

    return 0;
  }


  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }


  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that transfer tokens from one address to another.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param from The address to transfer from.
  /// @param to The address to transfer to.
  /// @param value The amount to be transferred.
  function _transfer(address from, address to, uint256 value) internal virtual override {
    require(false);

    int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
    magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
    magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
  }

  /// @dev Internal function that mints tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that burns an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  function _burn(address account, uint256 value) internal override {
    super._burn(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = balanceOf(account);

    if(newBalance > currentBalance) {
      uint256 mintAmount = newBalance.sub(currentBalance);
      _mint(account, mintAmount);
    } else if(newBalance < currentBalance) {
      uint256 burnAmount = currentBalance.sub(newBalance);
      _burn(account, burnAmount);
    }
  }
}

contract TheBeeConservancy is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;

    bool private swapping;

    TheBeeConservancyDividendTracker public dividendTracker;

    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    address public immutable ETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // WETH
  
    uint256 public swapTokensAtAmount = 2000000 * (10**18);
    

    uint256 public ETHRewardsFee = 8;
    uint256 public liquidityFee   = 3;
    uint256 public marketingFee   = 4;
    uint256 public totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee);

    address public _marketingWalletAddress = 0x5DD7313dE3786295688484b48D97Ed0D9F11bf73;


    // use by default 300,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 300000;

     // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;


    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

    event ProcessedDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );

    constructor() public ERC20("TheBeeConservancy | T.ME/TBCToken", "TBC") {

    	dividendTracker = new TheBeeConservancyDividendTracker();


    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);  // UNIv2
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(deadWallet);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(_marketingWalletAddress, true);
        excludeFromFees(address(this), true);

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 1000000000000 * (10**18));
    }

    receive() external payable {

  	}

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker), "TheBeeConservancy: The dividend tracker already has that address");

        TheBeeConservancyDividendTracker newDividendTracker = TheBeeConservancyDividendTracker(payable(newAddress));

        require(newDividendTracker.owner() == address(this), "TheBeeConservancy: The new dividend tracker must be owned by the TheBeeConservancy token contract");

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "TheBeeConservancy: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "TheBeeConservancy: Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setMarketingWallet(address payable wallet) external onlyOwner{
        _marketingWalletAddress = wallet;
    }

    function setETHRewardsFee(uint256 value) external onlyOwner{
        ETHRewardsFee = value;
        totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee);
    }

    function setLiquiditFee(uint256 value) external onlyOwner{
        liquidityFee = value;
        totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee);
    }

    function setMarketingFee(uint256 value) external onlyOwner{
        marketingFee = value;
        totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee);

    }


    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "TheBeeConservancy: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }
    
    


    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "TheBeeConservancy: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, "TheBeeConservancy: gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "TheBeeConservancy: Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
    	return dividendTracker.withdrawableDividendOf(account);
  	}

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return dividendTracker.balanceOf(account);
	}

	function excludeFromDividends(address account) external onlyOwner{
	    dividendTracker.excludeFromDividends(account);
	}

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

	function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return dividendTracker.getAccountAtIndex(index);
    }

	function processDividendTracker(uint256 gas) external {
		(uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
		emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
		dividendTracker.processAccount(msg.sender, false);
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }


    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != owner() &&
            to != owner()
        ) {
            swapping = true;

            uint256 marketingTokens = contractTokenBalance.mul(marketingFee).div(totalFees);
            swapAndSendToFee(marketingTokens);

            uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees);
            swapAndLiquify(swapTokens);

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendDividends(sellTokens);

            swapping = false;
        }


        bool takeFee = !swapping;

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

        if(takeFee) {
        	uint256 fees = amount.mul(totalFees).div(100);
        	if(automatedMarketMakerPairs[to]){
        	    fees += amount.mul(1).div(100);
        	}
        	amount = amount.sub(fees);

            super._transfer(from, address(this), fees);
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!swapping) {
	    	uint256 gas = gasForProcessing;

	    	try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
	    		emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
	    	}
	    	catch {

	    	}
        }
    }

    function swapAndSendToFee(uint256 tokens) private  {

        uint256 initialETHBalance = IERC20(ETH).balanceOf(address(this));

        swapTokensForETH(tokens);
        uint256 newBalance = (IERC20(ETH).balanceOf(address(this))).sub(initialETHBalance);
        IERC20(ETH).transfer(_marketingWalletAddress, newBalance);
    }

    function swapAndLiquify(uint256 tokens) private {
       // split the contract balance into halves
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HALF swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }


    function swapTokensForEth(uint256 tokenAmount) private {


        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );

    }

    function swapTokensForETH(uint256 tokenAmount) private {

        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        path[2] = ETH;

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {

        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0),
            block.timestamp
        );

    }

    function swapAndSendDividends(uint256 tokens) private{
        swapTokensForETH(tokens);
        uint256 dividends = IERC20(ETH).balanceOf(address(this));
        bool success = IERC20(ETH).transfer(address(dividendTracker), dividends);

        if (success) {
            dividendTracker.distributeETHDividends(dividends);
            emit SendDividends(tokens, dividends);
        }
    }
}

contract TheBeeConservancyDividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() public DividendPayingToken("TheBeeConservancy_Dividen_Tracker", "TheBeeConservancy_Dividend_Tracker") {
    	claimWait = 3600;
        minimumTokenBalanceForDividends = 200000 * (10**18); //must hold 200000+ tokens
    }

    function _transfer(address, address, uint256) internal override {
        require(false, "TheBeeConservancy_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public override {
        require(false, "TheBeeConservancy_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main TheBeeConservancy contract.");
    }

    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account]);
    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);
    	tokenHoldersMap.remove(account);

    	emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "TheBeeConservancy_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "TheBeeConservancy_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }



    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
    	if(lastClaimTime > block.timestamp)  {
    		return false;
    	}

    	return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
    	if(excludedFromDividends[account]) {
    		return;
    	}

    	if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
    		tokenHoldersMap.set(account, newBalance);
    	}
    	else {
            _setBalance(account, 0);
    		tokenHoldersMap.remove(account);
    	}

    	processAccount(account, true);
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
    	uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

    	if(numberOfTokenHolders == 0) {
    		return (0, 0, lastProcessedIndex);
    	}

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

    	while(gasUsed < gas && iterations < numberOfTokenHolders) {
    		_lastProcessedIndex++;

    		if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
    			_lastProcessedIndex = 0;
    		}

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

    		if(canAutoClaim(lastClaimTimes[account])) {
    			if(processAccount(payable(account), true)) {
    				claims++;
    			}
    		}

    		iterations++;

    		uint256 newGasLeft = gasleft();

    		if(gasLeft > newGasLeft) {
    			gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
    		}

    		gasLeft = newGasLeft;
    	}

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

    	if(amount > 0) {
    		lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
    		return true;
    	}

    	return false;
    }
}

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":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"amount","type":"uint256"}],"name":"distributeETHDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"int256","name":"iterationsUntilProcessed","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"setBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040527fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006080523480156200003557600080fd5b5060405180606001604052806021815260200162002366602191396040518060600160405280602281526020016200238760229139815182908290620000839060039060208501906200011c565b508051620000999060049060208401906200011c565b5050506000620000ae6200011860201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060115550692a5a058fc295ed00000060a052620001b8565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015f57805160ff19168380011785556200018f565b828001600101855582156200018f579182015b828111156200018f57825182559160200191906001019062000172565b506200019d929150620001a1565b5090565b5b808211156200019d5760008155600101620001a2565b60805160601c60a05161217d620001e96000398061102b52806110f8525080610dee5280611ac4525061217d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80638322fff211610125578063bc4c4b37116100ad578063e7841ec01161007c578063e7841ec01461067b578063e98030c714610683578063f2fde38b146106a0578063fbcbc0f1146106c6578063ffb2c479146106ec5761021c565b8063bc4c4b37146105eb578063be10b61414610619578063dd62ed3e14610621578063e30443bc1461064f5761021c565b806395d89b41116100f457806395d89b411461053f578063a457c2d714610547578063a8b9d24014610573578063a9059cbb14610599578063aafd847a146105c55761021c565b80638322fff2146104e557806385a6b3ae146105095780638da5cb5b1461051157806391b89fba146105195761021c565b806331e79db0116101a857806351c2a0e31161017757806351c2a0e31461048a5780636a474002146104a75780636f2789ec146104af57806370a08231146104b7578063715018a6146104dd5761021c565b806331e79db0146103a857806339509351146103d05780634e7b827f146103fc5780635183d6fd146104225761021c565b8063226cfa3d116101ef578063226cfa3d1461030057806323b872dd1461032657806327ce01471461035c5780633009a60914610382578063313ce5671461038a5761021c565b806306fdde0314610221578063095ea7b31461029e57806309bbedde146102de57806318160ddd146102f8575b600080fd5b610229610727565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026357818101518382015260200161024b565b50505050905090810190601f1680156102905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ca600480360360408110156102b457600080fd5b506001600160a01b0381351690602001356107bd565b604080519115158252519081900360200190f35b6102e66107db565b60408051918252519081900360200190f35b6102e66107e1565b6102e66004803603602081101561031657600080fd5b50356001600160a01b03166107e7565b6102ca6004803603606081101561033c57600080fd5b506001600160a01b038135811691602081013590911690604001356107f9565b6102e66004803603602081101561037257600080fd5b50356001600160a01b0316610880565b6102e66108df565b6103926108e5565b6040805160ff9092168252519081900360200190f35b6103ce600480360360208110156103be57600080fd5b50356001600160a01b03166108ea565b005b6102ca600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610a46565b6102ca6004803603602081101561041257600080fd5b50356001600160a01b0316610a94565b61043f6004803603602081101561043857600080fd5b5035610aa9565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b6103ce600480360360208110156104a057600080fd5b5035610c08565b6103ce610cf2565b6102e6610d29565b6102e6600480360360208110156104cd57600080fd5b50356001600160a01b0316610d2f565b6103ce610d4a565b6104ed610dec565b604080516001600160a01b039092168252519081900360200190f35b6102e6610e10565b6104ed610e16565b6102e66004803603602081101561052f57600080fd5b50356001600160a01b0316610e25565b610229610e30565b6102ca6004803603604081101561055d57600080fd5b506001600160a01b038135169060200135610e91565b6102e66004803603602081101561058957600080fd5b50356001600160a01b0316610ef9565b6102ca600480360360408110156105af57600080fd5b506001600160a01b038135169060200135610f25565b6102e6600480360360208110156105db57600080fd5b50356001600160a01b0316610f39565b6102ca6004803603604081101561060157600080fd5b506001600160a01b0381351690602001351515610f54565b6102e6611029565b6102e66004803603604081101561063757600080fd5b506001600160a01b038135811691602001351661104d565b6103ce6004803603604081101561066557600080fd5b506001600160a01b038135169060200135611078565b6102e6611242565b6103ce6004803603602081101561069957600080fd5b5035611248565b6103ce600480360360208110156106b657600080fd5b50356001600160a01b0316611364565b61043f600480360360208110156106dc57600080fd5b50356001600160a01b031661145d565b6107096004803603602081101561070257600080fd5b50356115d0565b60408051938452602084019290925282820152519081900360600190f35b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b5050505050905090565b60006107d16107ca6116ce565b84846116d2565b5060015b92915050565b600a5490565b60025490565b60106020526000908152604090205481565b60006108068484846117be565b610876846108126116ce565b61087185604051806060016040528060288152602001612017602891396001600160a01b038a166000908152600160205260408120906108506116ce565b6001600160a01b0316815260208101919091526040016000205491906117f5565b6116d2565b5060019392505050565b6001600160a01b038116600090815260076020526040812054600160801b906108cf906108ca906108c46108bf6108b688610d2f565b6006549061188c565b6118ec565b906118fc565b61192f565b816108d657fe5b0490505b919050565b600e5481565b601290565b6108f26116ce565b6005546001600160a01b03908116911614610942576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff161561096857600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610996908290611942565b6040805163131836e760e21b8152600a60048201526001600160a01b0383166024820152905173ec4e387549b236e03de2b52e49b490fe3c10c59291634c60db9c916044808301926000929190829003018186803b1580156109f757600080fd5b505af4158015610a0b573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b60006107d1610a536116ce565b846108718560016000610a646116ce565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061199b565b600f6020526000908152604090205460ff1681565b600080600080600080600080600a73ec4e387549b236e03de2b52e49b490fe3c10c59263deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b0757600080fd5b505af4158015610b1b573d6000803e3d6000fd5b505050506040513d6020811015610b3157600080fd5b50518910610b58575060009650600019955085945086935083925082915081905080610bfd565b6000600a73ec4e387549b236e03de2b52e49b490fe3c10c59263d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610bb457600080fd5b505af4158015610bc8573d6000803e3d6000fd5b505050506040513d6020811015610bde57600080fd5b50519050610beb8161145d565b98509850985098509850985098509850505b919395975091939597565b610c106116ce565b6005546001600160a01b03908116911614610c60576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6000610c6a6107e1565b11610c7457600080fd5b8015610cef57610ca5610c856107e1565b610c9383600160801b61188c565b81610c9a57fe5b60065491900461199b565b60065560408051828152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a2600954610ceb908261199b565b6009555b50565b60405162461bcd60e51b815260040180806020018281038252607f81526020018061205f607f913960800191505060405180910390fd5b60115481565b6001600160a01b031660009081526020819052604090205490565b610d526116ce565b6005546001600160a01b03908116911614610da2576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60095481565b6005546001600160a01b031690565b60006107d582610ef9565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b60006107d1610e9e6116ce565b84610871856040518060600160405280602581526020016121236025913960016000610ec86116ce565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906117f5565b6001600160a01b0381166000908152600860205260408120546107d590610f1f84610880565b906119f5565b60006107d1610f326116ce565b84846117be565b6001600160a01b031660009081526008602052604090205490565b6000610f5e6116ce565b6005546001600160a01b03908116911614610fae576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6000610fb984611a37565b9050801561101f576001600160a01b0384166000818152601060209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a360019150506107d5565b5060009392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110806116ce565b6005546001600160a01b039081169116146110d0576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16156110f65761123e565b7f000000000000000000000000000000000000000000000000000000000000000081106111ac576111278282611942565b60408051632f0ad01760e21b8152600a60048201526001600160a01b038416602482015260448101839052905173ec4e387549b236e03de2b52e49b490fe3c10c5929163bc2b405c916064808301926000929190829003018186803b15801561118f57600080fd5b505af41580156111a3573d6000803e3d6000fd5b50505050611231565b6111b7826000611942565b6040805163131836e760e21b8152600a60048201526001600160a01b0384166024820152905173ec4e387549b236e03de2b52e49b490fe3c10c59291634c60db9c916044808301926000929190829003018186803b15801561121857600080fd5b505af415801561122c573d6000803e3d6000fd5b505050505b61123c826001610f54565b505b5050565b600e5490565b6112506116ce565b6005546001600160a01b039081169116146112a0576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b610e1081101580156112b55750620151808111155b6112f05760405162461bcd60e51b8152600401808060200182810382526057815260200180611f1e6057913960600191505060405180910390fd5b6011548114156113315760405162461bcd60e51b8152600401808060200182810382526049815260200180611f756049913960600191505060405180910390fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b61136c6116ce565b6005546001600160a01b039081169116146113bc576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0381166114015760405162461bcd60e51b8152600401808060200182810382526026815260200180611ed66026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600a73ec4e387549b236e03de2b52e49b490fe3c10c5926317e142d190918a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156114cf57600080fd5b505af41580156114e3573d6000803e3d6000fd5b505050506040513d60208110156114f957600080fd5b5051965060001995506000871261155d57600e5487111561152957600e54611522908890611bc6565b955061155d565b600e54600a546000911061153e57600061154d565b600e54600a5461154d916119f5565b905061155988826118fc565b9650505b61156688610ef9565b945061157188610880565b6001600160a01b03891660009081526010602052604090205490945092508261159b5760006115a9565b6011546115a990849061199b565b91504282116115b95760006115c3565b6115c382426119f5565b9050919395975091939597565b600a5460009081908190806115f0575050600e54600092508291506116c7565b600e546000805a90506000805b898410801561160b57508582105b156116b657600a54600190950194851061162457600094505b6000600a600001868154811061163657fe5b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915061166790611bf8565b1561168357611677816001610f54565b15611683576001909101905b60019092019160005a9050808511156116ad576116aa6116a386836119f5565b879061199b565b95505b93506115fd9050565b600e85905590975095509193505050505b9193909250565b3390565b6001600160a01b0383166117175760405162461bcd60e51b81526004018080602001828103825260248152602001806120ff6024913960400191505060405180910390fd5b6001600160a01b03821661175c5760405162461bcd60e51b8152600401808060200182810382526022815260200180611efc6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60405162461bcd60e51b8152600401808060200182810382526038815260200180611fbe6038913960400191505060405180910390fd5b600081848411156118845760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611849578181015183820152602001611831565b50505050905090810190601f1680156118765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008261189b575060006107d5565b828202828482816118a857fe5b04146118e55760405162461bcd60e51b8152600401808060200182810382526021815260200180611ff66021913960400191505060405180910390fd5b9392505050565b600081818112156107d557600080fd5b60008282018183128015906119115750838112155b80611926575060008312801561192657508381125b6118e557600080fd5b60008082121561193e57600080fd5b5090565b600061194d83610d2f565b90508082111561197557600061196383836119f5565b905061196f8482611c1f565b5061123c565b8082101561123c57600061198982846119f5565b90506119958482611c83565b50505050565b6000828201838110156118e5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006118e583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117f5565b600080611a4383610ef9565b90508015611bbd576001600160a01b038316600090815260086020526040902054611a6e908261199b565b6001600160a01b038416600081815260086020908152604091829020939093558051848152905191927fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d92918290030190a260007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611b3957600080fd5b505af1158015611b4d573d6000803e3d6000fd5b505050506040513d6020811015611b6357600080fd5b5051905080611bb5576001600160a01b038416600090815260086020526040902054611b8f90836119f5565b6001600160a01b03851660009081526008602052604081209190915592506108da915050565b5090506108da565b50600092915050565b6000818303818312801590611bdb5750838113155b80611926575060008312801561192657508381136118e557600080fd5b600042821115611c0a575060006108da565b601154611c1742846119f5565b101592915050565b611c298282611cc7565b611c63611c446108bf8360065461188c90919063ffffffff16565b6001600160a01b03841660009081526007602052604090205490611bc6565b6001600160a01b0390921660009081526007602052604090209190915550565b611c8d8282611db7565b611c63611ca86108bf8360065461188c90919063ffffffff16565b6001600160a01b038416600090815260076020526040902054906118fc565b6001600160a01b038216611d22576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611d2e6000838361123c565b600254611d3b908261199b565b6002556001600160a01b038216600090815260208190526040902054611d61908261199b565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611dfc5760405162461bcd60e51b81526004018080602001828103825260218152602001806120de6021913960400191505060405180910390fd5b611e088260008361123c565b611e4581604051806060016040528060228152602001611eb4602291396001600160a01b03851660009081526020819052604090205491906117f5565b6001600160a01b038316600090815260208190526040902055600254611e6b90826119f5565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c7565546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20546865426565436f6e73657276616e637920636f6e74726163742e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206918748375ba2b19a44736a39c9872db7f69d99c631d8744d3e3cf7e4a4e151864736f6c634300060c0033546865426565436f6e73657276616e63795f4469766964656e5f547261636b6572546865426565436f6e73657276616e63795f4469766964656e645f547261636b6572

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80638322fff211610125578063bc4c4b37116100ad578063e7841ec01161007c578063e7841ec01461067b578063e98030c714610683578063f2fde38b146106a0578063fbcbc0f1146106c6578063ffb2c479146106ec5761021c565b8063bc4c4b37146105eb578063be10b61414610619578063dd62ed3e14610621578063e30443bc1461064f5761021c565b806395d89b41116100f457806395d89b411461053f578063a457c2d714610547578063a8b9d24014610573578063a9059cbb14610599578063aafd847a146105c55761021c565b80638322fff2146104e557806385a6b3ae146105095780638da5cb5b1461051157806391b89fba146105195761021c565b806331e79db0116101a857806351c2a0e31161017757806351c2a0e31461048a5780636a474002146104a75780636f2789ec146104af57806370a08231146104b7578063715018a6146104dd5761021c565b806331e79db0146103a857806339509351146103d05780634e7b827f146103fc5780635183d6fd146104225761021c565b8063226cfa3d116101ef578063226cfa3d1461030057806323b872dd1461032657806327ce01471461035c5780633009a60914610382578063313ce5671461038a5761021c565b806306fdde0314610221578063095ea7b31461029e57806309bbedde146102de57806318160ddd146102f8575b600080fd5b610229610727565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026357818101518382015260200161024b565b50505050905090810190601f1680156102905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ca600480360360408110156102b457600080fd5b506001600160a01b0381351690602001356107bd565b604080519115158252519081900360200190f35b6102e66107db565b60408051918252519081900360200190f35b6102e66107e1565b6102e66004803603602081101561031657600080fd5b50356001600160a01b03166107e7565b6102ca6004803603606081101561033c57600080fd5b506001600160a01b038135811691602081013590911690604001356107f9565b6102e66004803603602081101561037257600080fd5b50356001600160a01b0316610880565b6102e66108df565b6103926108e5565b6040805160ff9092168252519081900360200190f35b6103ce600480360360208110156103be57600080fd5b50356001600160a01b03166108ea565b005b6102ca600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610a46565b6102ca6004803603602081101561041257600080fd5b50356001600160a01b0316610a94565b61043f6004803603602081101561043857600080fd5b5035610aa9565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b6103ce600480360360208110156104a057600080fd5b5035610c08565b6103ce610cf2565b6102e6610d29565b6102e6600480360360208110156104cd57600080fd5b50356001600160a01b0316610d2f565b6103ce610d4a565b6104ed610dec565b604080516001600160a01b039092168252519081900360200190f35b6102e6610e10565b6104ed610e16565b6102e66004803603602081101561052f57600080fd5b50356001600160a01b0316610e25565b610229610e30565b6102ca6004803603604081101561055d57600080fd5b506001600160a01b038135169060200135610e91565b6102e66004803603602081101561058957600080fd5b50356001600160a01b0316610ef9565b6102ca600480360360408110156105af57600080fd5b506001600160a01b038135169060200135610f25565b6102e6600480360360208110156105db57600080fd5b50356001600160a01b0316610f39565b6102ca6004803603604081101561060157600080fd5b506001600160a01b0381351690602001351515610f54565b6102e6611029565b6102e66004803603604081101561063757600080fd5b506001600160a01b038135811691602001351661104d565b6103ce6004803603604081101561066557600080fd5b506001600160a01b038135169060200135611078565b6102e6611242565b6103ce6004803603602081101561069957600080fd5b5035611248565b6103ce600480360360208110156106b657600080fd5b50356001600160a01b0316611364565b61043f600480360360208110156106dc57600080fd5b50356001600160a01b031661145d565b6107096004803603602081101561070257600080fd5b50356115d0565b60408051938452602084019290925282820152519081900360600190f35b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b5050505050905090565b60006107d16107ca6116ce565b84846116d2565b5060015b92915050565b600a5490565b60025490565b60106020526000908152604090205481565b60006108068484846117be565b610876846108126116ce565b61087185604051806060016040528060288152602001612017602891396001600160a01b038a166000908152600160205260408120906108506116ce565b6001600160a01b0316815260208101919091526040016000205491906117f5565b6116d2565b5060019392505050565b6001600160a01b038116600090815260076020526040812054600160801b906108cf906108ca906108c46108bf6108b688610d2f565b6006549061188c565b6118ec565b906118fc565b61192f565b816108d657fe5b0490505b919050565b600e5481565b601290565b6108f26116ce565b6005546001600160a01b03908116911614610942576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff161561096857600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610996908290611942565b6040805163131836e760e21b8152600a60048201526001600160a01b0383166024820152905173ec4e387549b236e03de2b52e49b490fe3c10c59291634c60db9c916044808301926000929190829003018186803b1580156109f757600080fd5b505af4158015610a0b573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b60006107d1610a536116ce565b846108718560016000610a646116ce565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061199b565b600f6020526000908152604090205460ff1681565b600080600080600080600080600a73ec4e387549b236e03de2b52e49b490fe3c10c59263deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b0757600080fd5b505af4158015610b1b573d6000803e3d6000fd5b505050506040513d6020811015610b3157600080fd5b50518910610b58575060009650600019955085945086935083925082915081905080610bfd565b6000600a73ec4e387549b236e03de2b52e49b490fe3c10c59263d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610bb457600080fd5b505af4158015610bc8573d6000803e3d6000fd5b505050506040513d6020811015610bde57600080fd5b50519050610beb8161145d565b98509850985098509850985098509850505b919395975091939597565b610c106116ce565b6005546001600160a01b03908116911614610c60576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6000610c6a6107e1565b11610c7457600080fd5b8015610cef57610ca5610c856107e1565b610c9383600160801b61188c565b81610c9a57fe5b60065491900461199b565b60065560408051828152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a2600954610ceb908261199b565b6009555b50565b60405162461bcd60e51b815260040180806020018281038252607f81526020018061205f607f913960800191505060405180910390fd5b60115481565b6001600160a01b031660009081526020819052604090205490565b610d526116ce565b6005546001600160a01b03908116911614610da2576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60095481565b6005546001600160a01b031690565b60006107d582610ef9565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b60006107d1610e9e6116ce565b84610871856040518060600160405280602581526020016121236025913960016000610ec86116ce565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906117f5565b6001600160a01b0381166000908152600860205260408120546107d590610f1f84610880565b906119f5565b60006107d1610f326116ce565b84846117be565b6001600160a01b031660009081526008602052604090205490565b6000610f5e6116ce565b6005546001600160a01b03908116911614610fae576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6000610fb984611a37565b9050801561101f576001600160a01b0384166000818152601060209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a360019150506107d5565b5060009392505050565b7f000000000000000000000000000000000000000000002a5a058fc295ed00000081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110806116ce565b6005546001600160a01b039081169116146110d0576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16156110f65761123e565b7f000000000000000000000000000000000000000000002a5a058fc295ed00000081106111ac576111278282611942565b60408051632f0ad01760e21b8152600a60048201526001600160a01b038416602482015260448101839052905173ec4e387549b236e03de2b52e49b490fe3c10c5929163bc2b405c916064808301926000929190829003018186803b15801561118f57600080fd5b505af41580156111a3573d6000803e3d6000fd5b50505050611231565b6111b7826000611942565b6040805163131836e760e21b8152600a60048201526001600160a01b0384166024820152905173ec4e387549b236e03de2b52e49b490fe3c10c59291634c60db9c916044808301926000929190829003018186803b15801561121857600080fd5b505af415801561122c573d6000803e3d6000fd5b505050505b61123c826001610f54565b505b5050565b600e5490565b6112506116ce565b6005546001600160a01b039081169116146112a0576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b610e1081101580156112b55750620151808111155b6112f05760405162461bcd60e51b8152600401808060200182810382526057815260200180611f1e6057913960600191505060405180910390fd5b6011548114156113315760405162461bcd60e51b8152600401808060200182810382526049815260200180611f756049913960600191505060405180910390fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b61136c6116ce565b6005546001600160a01b039081169116146113bc576040805162461bcd60e51b8152602060048201819052602482015260008051602061203f833981519152604482015290519081900360640190fd5b6001600160a01b0381166114015760405162461bcd60e51b8152600401808060200182810382526026815260200180611ed66026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600a73ec4e387549b236e03de2b52e49b490fe3c10c5926317e142d190918a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156114cf57600080fd5b505af41580156114e3573d6000803e3d6000fd5b505050506040513d60208110156114f957600080fd5b5051965060001995506000871261155d57600e5487111561152957600e54611522908890611bc6565b955061155d565b600e54600a546000911061153e57600061154d565b600e54600a5461154d916119f5565b905061155988826118fc565b9650505b61156688610ef9565b945061157188610880565b6001600160a01b03891660009081526010602052604090205490945092508261159b5760006115a9565b6011546115a990849061199b565b91504282116115b95760006115c3565b6115c382426119f5565b9050919395975091939597565b600a5460009081908190806115f0575050600e54600092508291506116c7565b600e546000805a90506000805b898410801561160b57508582105b156116b657600a54600190950194851061162457600094505b6000600a600001868154811061163657fe5b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915061166790611bf8565b1561168357611677816001610f54565b15611683576001909101905b60019092019160005a9050808511156116ad576116aa6116a386836119f5565b879061199b565b95505b93506115fd9050565b600e85905590975095509193505050505b9193909250565b3390565b6001600160a01b0383166117175760405162461bcd60e51b81526004018080602001828103825260248152602001806120ff6024913960400191505060405180910390fd5b6001600160a01b03821661175c5760405162461bcd60e51b8152600401808060200182810382526022815260200180611efc6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60405162461bcd60e51b8152600401808060200182810382526038815260200180611fbe6038913960400191505060405180910390fd5b600081848411156118845760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611849578181015183820152602001611831565b50505050905090810190601f1680156118765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008261189b575060006107d5565b828202828482816118a857fe5b04146118e55760405162461bcd60e51b8152600401808060200182810382526021815260200180611ff66021913960400191505060405180910390fd5b9392505050565b600081818112156107d557600080fd5b60008282018183128015906119115750838112155b80611926575060008312801561192657508381125b6118e557600080fd5b60008082121561193e57600080fd5b5090565b600061194d83610d2f565b90508082111561197557600061196383836119f5565b905061196f8482611c1f565b5061123c565b8082101561123c57600061198982846119f5565b90506119958482611c83565b50505050565b6000828201838110156118e5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006118e583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117f5565b600080611a4383610ef9565b90508015611bbd576001600160a01b038316600090815260086020526040902054611a6e908261199b565b6001600160a01b038416600081815260086020908152604091829020939093558051848152905191927fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d92918290030190a260007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611b3957600080fd5b505af1158015611b4d573d6000803e3d6000fd5b505050506040513d6020811015611b6357600080fd5b5051905080611bb5576001600160a01b038416600090815260086020526040902054611b8f90836119f5565b6001600160a01b03851660009081526008602052604081209190915592506108da915050565b5090506108da565b50600092915050565b6000818303818312801590611bdb5750838113155b80611926575060008312801561192657508381136118e557600080fd5b600042821115611c0a575060006108da565b601154611c1742846119f5565b101592915050565b611c298282611cc7565b611c63611c446108bf8360065461188c90919063ffffffff16565b6001600160a01b03841660009081526007602052604090205490611bc6565b6001600160a01b0390921660009081526007602052604090209190915550565b611c8d8282611db7565b611c63611ca86108bf8360065461188c90919063ffffffff16565b6001600160a01b038416600090815260076020526040902054906118fc565b6001600160a01b038216611d22576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611d2e6000838361123c565b600254611d3b908261199b565b6002556001600160a01b038216600090815260208190526040902054611d61908261199b565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611dfc5760405162461bcd60e51b81526004018080602001828103825260218152602001806120de6021913960400191505060405180910390fd5b611e088260008361123c565b611e4581604051806060016040528060228152602001611eb4602291396001600160a01b03851660009081526020819052604090205491906117f5565b6001600160a01b038316600090815260208190526040902055600254611e6b90826119f5565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c7565546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546865426565436f6e73657276616e63795f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20546865426565436f6e73657276616e637920636f6e74726163742e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206918748375ba2b19a44736a39c9872db7f69d99c631d8744d3e3cf7e4a4e151864736f6c634300060c0033

Libraries Used


Deployed Bytecode Sourcemap

60884:6742:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26557:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28724:169;;;;;;;;;;;;;;;;-1:-1:-1;28724:169:0;;-1:-1:-1;;;;;28724:169:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;63105:119;;;:::i;:::-;;;;;;;;;;;;;;;;27677:108;;;:::i;61242:50::-;;;;;;;;;;;;;;;;-1:-1:-1;61242:50:0;-1:-1:-1;;;;;61242:50:0;;:::i;29375:355::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29375:355:0;;;;;;;;;;;;;;;;;:::i;42985:247::-;;;;;;;;;;;;;;;;-1:-1:-1;42985:247:0;-1:-1:-1;;;;;42985:247:0;;:::i;61137:33::-;;;:::i;27519:93::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62249:283;;;;;;;;;;;;;;;;-1:-1:-1;62249:283:0;-1:-1:-1;;;;;62249:283:0;;:::i;:::-;;30139:218;;;;;;;;;;;;;;;;-1:-1:-1;30139:218:0;;-1:-1:-1;;;;;30139:218:0;;;;;;:::i;61179:54::-;;;;;;;;;;;;;;;;-1:-1:-1;61179:54:0;-1:-1:-1;;;;;61179:54:0;;:::i;64914:505::-;;;;;;;;;;;;;;;;-1:-1:-1;64914:505:0;;:::i;:::-;;;;-1:-1:-1;;;;;64914:505:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40042:390;;;;;;;;;;;;;;;;-1:-1:-1;40042:390:0;;:::i;62033:208::-;;;:::i;61301:24::-;;;:::i;27848:127::-;;;;;;;;;;;;;;;;-1:-1:-1;27848:127:0;-1:-1:-1;;;;;27848:127:0;;:::i;15260:148::-;;;:::i;38409:82::-;;;:::i;:::-;;;;-1:-1:-1;;;;;38409:82:0;;;;;;;;;;;;;;39894:40;;;:::i;14618:79::-;;;:::i;41699:124::-;;;;;;;;;;;;;;;;-1:-1:-1;41699:124:0;-1:-1:-1;;;;;41699:124:0;;:::i;26776:104::-;;;:::i;30860:269::-;;;;;;;;;;;;;;;;-1:-1:-1;30860:269:0;;-1:-1:-1;;;;;30860:269:0;;;;;;:::i;42034:168::-;;;;;;;;;;;;;;;;-1:-1:-1;42034:168:0;-1:-1:-1;;;;;42034:168:0;;:::i;28188:175::-;;;;;;;;;;;;;;;;-1:-1:-1;28188:175:0;;-1:-1:-1;;;;;28188:175:0;;;;;;:::i;42415:129::-;;;;;;;;;;;;;;;;-1:-1:-1;42415:129:0;-1:-1:-1;;;;;42415:129:0;;:::i;67280:343::-;;;;;;;;;;;;;;;;-1:-1:-1;67280:343:0;;-1:-1:-1;;;;;67280:343:0;;;;;;;;:::i;61332:56::-;;;:::i;28426:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28426:151:0;;;;;;;;;;:::i;65654:460::-;;;;;;;;;;;;;;;;-1:-1:-1;65654:460:0;;-1:-1:-1;;;;;65654:460:0;;;;;;:::i;62992:105::-;;;:::i;62540:444::-;;;;;;;;;;;;;;;;-1:-1:-1;62540:444:0;;:::i;15563:244::-;;;;;;;;;;;;;;;;-1:-1:-1;15563:244:0;-1:-1:-1;;;;;15563:244:0;;:::i;63236:1670::-;;;;;;;;;;;;;;;;-1:-1:-1;63236:1670:0;-1:-1:-1;;;;;63236:1670:0;;:::i;66122:1150::-;;;;;;;;;;;;;;;;-1:-1:-1;66122:1150:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26557:100;26644:5;26637:12;;;;;;;;;;;;;-1:-1:-1;;26637:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;26611:13;;26637:12;;26644:5;;26637:12;;;26644:5;26637:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26557:100;:::o;28724:169::-;28807:4;28824:39;28833:12;:10;:12::i;:::-;28847:7;28856:6;28824:8;:39::i;:::-;-1:-1:-1;28881:4:0;28724:169;;;;;:::o;63105:119::-;63189:15;:27;63105:119;:::o;27677:108::-;27765:12;;27677:108;:::o;61242:50::-;;;;;;;;;;;;;:::o;29375:355::-;29515:4;29532:36;29542:6;29550:9;29561:6;29532:9;:36::i;:::-;29579:121;29588:6;29596:12;:10;:12::i;:::-;29610:89;29648:6;29610:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29610:19:0;;;;;;-1:-1:-1;29610:19:0;;;;;;29630:12;:10;:12::i;:::-;-1:-1:-1;;;;;29610:33:0;;;;;;;;;;;;-1:-1:-1;29610:33:0;;;;:37;:89::i;:::-;29579:8;:121::i;:::-;-1:-1:-1;29718:4:0;29375:355;;;;;:::o;42985:247::-;-1:-1:-1;;;;;43161:36:0;;43062:7;43161:36;;;:28;:36;;;;;;-1:-1:-1;;;;43085:129:0;;:113;;:63;:48;43115:17;43161:36;43115:9;:17::i;:::-;43085:25;;;:29;:48::i;:::-;:61;:63::i;:::-;:75;;:113::i;:::-;:127;:129::i;:::-;:141;;;;;;43078:148;;42985:247;;;;:::o;61137:33::-;;;;:::o;27519:93::-;27602:2;27519:93;:::o;62249:283::-;14840:12;:10;:12::i;:::-;14830:6;;-1:-1:-1;;;;;14830:22:0;;;:6;;:22;14822:67;;;;;-1:-1:-1;;;14822:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14822:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;62332:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;62331:31;62323:40;;;::::0;::::1;;-1:-1:-1::0;;;;;62371:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;62371:37:0::1;-1:-1:-1::0;62371:37:0::1;::::0;;62418:23:::1;::::0;62371:30;;62418:11:::1;:23::i;:::-;62449:31;::::0;;-1:-1:-1;;;62449:31:0;;:15:::1;:31;::::0;::::1;::::0;-1:-1:-1;;;;;62449:31:0;::::1;::::0;;;;;;:22:::1;::::0;::::1;::::0;:31;;;;;-1:-1:-1;;62449:31:0;;;;;;;:22;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62495:29:0::1;::::0;-1:-1:-1;;;;;62495:29:0;::::1;::::0;-1:-1:-1;62495:29:0::1;::::0;-1:-1:-1;62495:29:0;;::::1;62249:283:::0;:::o;30139:218::-;30227:4;30244:83;30253:12;:10;:12::i;:::-;30267:7;30276:50;30315:10;30276:11;:25;30288:12;:10;:12::i;:::-;-1:-1:-1;;;;;30276:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;30276:25:0;;;:34;;;;;;;;;;;:38;:50::i;61179:54::-;;;;;;;;;;;;;;;:::o;64914:505::-;65000:7;65022:6;65043;65064:7;65086;65108;65130;65152;65181:15;:20;;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65181:22:0;65172:31;;65169:137;;-1:-1:-1;65228:42:0;;-1:-1:-1;;;;;;;;65228:42:0;;-1:-1:-1;65228:42:0;;-1:-1:-1;65228:42:0;;-1:-1:-1;65228:42:0;;-1:-1:-1;65228:42:0;65220:74;;65169:137;65318:15;65336;:29;;;;65366:5;65336:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65336:36:0;;-1:-1:-1;65392:19:0;65336:36;65392:10;:19::i;:::-;65385:26;;;;;;;;;;;;;;;;;64914:505;;;;;;;;;;:::o;40042:390::-;14840:12;:10;:12::i;:::-;14830:6;;-1:-1:-1;;;;;14830:22:0;;;:6;;:22;14822:67;;;;;-1:-1:-1;;;14822:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14822:67:0;;;;;;;;;;;;;;;40137:1:::1;40121:13;:11;:13::i;:::-;:17;40113:26;;;::::0;::::1;;40152:10:::0;;40148:279:::1;;40201:88;40267:13;:11;:13::i;:::-;40241:23;40242:6:::0;-1:-1:-1;;;40241:12:0::1;:23::i;:::-;:39;;;;;40201:25;::::0;;40241:39;::::1;40201:29;:88::i;:::-;40173:25;:116:::0;40303:40:::1;::::0;;;;;;;40324:10:::1;::::0;40303:40:::1;::::0;;;;;::::1;::::0;;::::1;40382:25;::::0;:37:::1;::::0;40412:6;40382:29:::1;:37::i;:::-;40354:25;:65:::0;40148:279:::1;40042:390:::0;:::o;62033:208::-;62088:145;;-1:-1:-1;;;62088:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61301:24;;;;:::o;27848:127::-;-1:-1:-1;;;;;27949:18:0;27922:7;27949:18;;;;;;;;;;;;27848:127::o;15260:148::-;14840:12;:10;:12::i;:::-;14830:6;;-1:-1:-1;;;;;14830:22:0;;;:6;;:22;14822:67;;;;;-1:-1:-1;;;14822:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14822:67:0;;;;;;;;;;;;;;;15351:6:::1;::::0;15330:40:::1;::::0;15367:1:::1;::::0;-1:-1:-1;;;;;15351:6:0::1;::::0;15330:40:::1;::::0;15367:1;;15330:40:::1;15381:6;:19:::0;;-1:-1:-1;;;;;;15381:19:0::1;::::0;;15260:148::o;38409:82::-;;;:::o;39894:40::-;;;;:::o;14618:79::-;14683:6;;-1:-1:-1;;;;;14683:6:0;;14618:79::o;41699:124::-;41764:7;41787:30;41810:6;41787:22;:30::i;26776:104::-;26865:7;26858:14;;;;;;;;;;;;;-1:-1:-1;;26858:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;26832:13;;26858:14;;26865:7;;26858:14;;;26865:7;26858:14;;;;;;;;;;;;;;;;;;;;;;;;30860:269;30953:4;30970:129;30979:12;:10;:12::i;:::-;30993:7;31002:96;31041:15;31002:96;;;;;;;;;;;;;;;;;:11;:25;31014:12;:10;:12::i;:::-;-1:-1:-1;;;;;31002:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;31002:25:0;;;:34;;;;;;;;;;;;:38;:96::i;42034:168::-;-1:-1:-1;;;;;42169:26:0;;42111:7;42169:26;;;:18;:26;;;;;;42134:62;;:30;42169:26;42134:22;:30::i;:::-;:34;;:62::i;28188:175::-;28274:4;28291:42;28301:12;:10;:12::i;:::-;28315:9;28326:6;28291:9;:42::i;42415:129::-;-1:-1:-1;;;;;42512:26:0;42489:7;42512:26;;;:18;:26;;;;;;;42415:129::o;67280:343::-;67371:4;14840:12;:10;:12::i;:::-;14830:6;;-1:-1:-1;;;;;14830:22:0;;;:6;;:22;14822:67;;;;;-1:-1:-1;;;14822:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14822:67:0;;;;;;;;;;;;;;;67388:14:::1;67405:32;67429:7;67405:23;:32::i;:::-;67388:49:::0;-1:-1:-1;67450:10:0;;67447:147:::1;;-1:-1:-1::0;;;;;67471:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;67497:15:::1;67471:41:::0;;67532:33;;;;;;;;::::1;;::::0;67471:23;67532:33:::1;::::0;;;;;;;::::1;67581:4;67574:11;;;;;67447:147;-1:-1:-1::0;67610:5:0::1;::::0;67280:343;-1:-1:-1;;;67280:343:0:o;61332:56::-;;;:::o;28426:151::-;-1:-1:-1;;;;;28542:18:0;;;28515:7;28542:18;;;-1:-1:-1;28542:18:0;;;;;;;;:27;;;;;;;;;;;;;28426:151::o;65654:460::-;14840:12;:10;:12::i;:::-;14830:6;;-1:-1:-1;;;;;14830:22:0;;;:6;;:22;14822:67;;;;;-1:-1:-1;;;14822:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14822:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;65749:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;65746:59;;;65790:7;;65746:59;65831:31;65817:10;:45;65814:254;;65879:32;65891:7;65900:10;65879:11;:32::i;:::-;65920:40;::::0;;-1:-1:-1;;;65920:40:0;;:15:::1;:40;::::0;::::1;::::0;-1:-1:-1;;;;;65920:40:0;::::1;::::0;;;;;;;;;;;;:19:::1;::::0;::::1;::::0;:40;;;;;-1:-1:-1;;65920:40:0;;;;;;;:19;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65814:254;;;65996:23;66008:7;66017:1;65996:11;:23::i;:::-;66028:31;::::0;;-1:-1:-1;;;66028:31:0;;:15:::1;:31;::::0;::::1;::::0;-1:-1:-1;;;;;66028:31:0;::::1;::::0;;;;;;:22:::1;::::0;::::1;::::0;:31;;;;;-1:-1:-1;;66028:31:0;;;;;;;:22;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65814:254;66077:29;66092:7;66101:4;66077:14;:29::i;:::-;;14900:1;65654:460:::0;;:::o;62992:105::-;63071:18;;62992:105;:::o;62540:444::-;14840:12;:10;:12::i;:::-;14830:6;;-1:-1:-1;;;;;14830:22:0;;;:6;;:22;14822:67;;;;;-1:-1:-1;;;14822:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14822:67:0;;;;;;;;;;;;;;;62641:4:::1;62625:12;:20;;:45;;;;;62665:5;62649:12;:21;;62625:45;62617:145;;;;-1:-1:-1::0;;;62617:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62797:9;;62781:12;:25;;62773:111;;;;-1:-1:-1::0;;;62773:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62931:9;::::0;62900:41:::1;::::0;62917:12;;62900:41:::1;::::0;;;::::1;62952:9;:24:::0;62540:444::o;15563:244::-;14840:12;:10;:12::i;:::-;14830:6;;-1:-1:-1;;;;;14830:22:0;;;:6;;:22;14822:67;;;;;-1:-1:-1;;;14822:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14822:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15652:22:0;::::1;15644:73;;;;-1:-1:-1::0;;;15644:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15754:6;::::0;15733:38:::1;::::0;-1:-1:-1;;;;;15733:38:0;;::::1;::::0;15754:6:::1;::::0;15733:38:::1;::::0;15754:6:::1;::::0;15733:38:::1;15782:6;:17:::0;;-1:-1:-1;;;;;;15782:17:0::1;-1:-1:-1::0;;;;;15782:17:0;;;::::1;::::0;;;::::1;::::0;;15563:244::o;63236:1670::-;63664:38;;;-1:-1:-1;;;63664:38:0;;:15;:38;;;;-1:-1:-1;;;;;63664:38:0;;;;;;;;63635:8;;63318:15;;;;;;;;;;;;;;63664:29;;;;:38;;;;;;;;;;;;;;:29;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63664:38:0;;-1:-1:-1;;;;;;63760:10:0;;63757:582;;63807:18;;63798:5;63790:35;63787:541;;;63890:18;;63873:37;;:5;;:9;:37::i;:::-;63846:64;;63787:541;;;64029:18;;63999:15;:27;63964:32;;-1:-1:-1;63999:220:0;;64218:1;63999:220;;;64139:18;;64107:15;:27;:51;;:31;:51::i;:::-;63964:255;-1:-1:-1;64269:43:0;:5;63964:255;64269:9;:43::i;:::-;64242:70;;63787:541;;64377:31;64400:7;64377:22;:31::i;:::-;64353:55;;64436:31;64459:7;64436:22;:31::i;:::-;-1:-1:-1;;;;;64496:23:0;;;;;;:14;:23;;;;;;64419:48;;-1:-1:-1;64496:23:0;-1:-1:-1;64496:23:0;64548:126;;64673:1;64548:126;;;64623:9;;64605:28;;:13;;:17;:28::i;:::-;64532:142;;64736:15;64720:13;:31;:178;;64897:1;64720:178;;;64807:34;:13;64825:15;64807:17;:34::i;:::-;64687:211;;63236:1670;;;;;;;;;:::o;66122:1150::-;66234:15;:27;66168:7;;;;;;66274:25;66271:81;;-1:-1:-1;;66324:18:0;;66318:1;;-1:-1:-1;66318:1:0;;-1:-1:-1;66310:33:0;;66271:81;66391:18;;66361:27;;66466:9;66448:27;;66485:18;66515:14;66543:615;66559:3;66549:7;:13;:50;;;;;66579:20;66566:10;:33;66549:50;66543:615;;;66668:15;:27;66610:21;;;;;66645:50;;66642:98;;66729:1;66707:23;;66642:98;66750:15;66768;:20;;66789:19;66768:41;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66768:41:0;66836:23;;;:14;:23;;;;;;;;66768:41;;-1:-1:-1;66823:37:0;;:12;:37::i;:::-;66820:134;;;66875:38;66898:7;66908:4;66875:14;:38::i;:::-;66872:73;;;66926:8;;;;;66872:73;66964:12;;;;;66987:18;67008:9;66987:30;;67041:10;67031:7;:20;67028:91;;;67073:36;67085:23;:7;67097:10;67085:11;:23::i;:::-;67073:7;;:11;:36::i;:::-;67063:46;;67028:91;67139:10;-1:-1:-1;66543:615:0;;-1:-1:-1;66543:615:0;;67167:18;:40;;;67225:10;;-1:-1:-1;67237:6:0;-1:-1:-1;67188:19:0;;-1:-1:-1;;;;66122:1150:0;;;;;;:::o;4994:98::-;5074:10;4994:98;:::o;34046:380::-;-1:-1:-1;;;;;34182:19:0;;34174:68;;;;-1:-1:-1;;;34174:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34261:21:0;;34253:68;;;;-1:-1:-1;;;34253:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34334:18:0;;;;;;;-1:-1:-1;34334:18:0;;;;;;;;:27;;;;;;;;;;;;;:36;;;34386:32;;;;;;;;;;;;;;;;;34046:380;;;:::o;61868:157::-;61943:74;;-1:-1:-1;;;61943:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17022:192;17108:7;17144:12;17136:6;;;;17128:29;;;;-1:-1:-1;;;17128:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17180:5:0;;;17022:192::o;17473:471::-;17531:7;17776:6;17772:47;;-1:-1:-1;17806:1:0;17799:8;;17772:47;17843:5;;;17847:1;17843;:5;:1;17867:5;;;;;:10;17859:56;;;;-1:-1:-1;;;17859:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17935:1;17473:471;-1:-1:-1;;;17473:471:0:o;22684:134::-;22740:6;22773:1;22790:6;;;;22782:15;;;;;21974:176;22030:6;22060:5;;;22085:6;;;;;;:16;;;22100:1;22095;:6;;22085:16;22084:38;;;;22111:1;22107;:5;:14;;;;;22120:1;22116;:5;22107:14;22076:47;;;;;22379:127;22435:7;22468:1;22463;:6;;22455:15;;;;;;-1:-1:-1;22496:1:0;22379:127::o;44990:407::-;45064:22;45089:18;45099:7;45089:9;:18::i;:::-;45064:43;;45132:14;45119:10;:27;45116:276;;;45157:18;45178:30;:10;45193:14;45178;:30::i;:::-;45157:51;;45217:26;45223:7;45232:10;45217:5;:26::i;:::-;45116:276;;;;45273:14;45260:10;:27;45257:135;;;45298:18;45319:30;:14;45338:10;45319:18;:30::i;:::-;45298:51;;45358:26;45364:7;45373:10;45358:5;:26::i;:::-;45257:135;44990:407;;;:::o;16119:181::-;16177:7;16209:5;;;16233:6;;;;16225:46;;;;;-1:-1:-1;;;16225:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16583:136;16641:7;16668:43;16672:1;16675;16668:43;;;;;;;;;;;;;;;;;:3;:43::i;40869:617::-;40942:7;40958:29;40990:28;41013:4;40990:22;:28::i;:::-;40958:60;-1:-1:-1;41029:25:0;;41025:439;;-1:-1:-1;;;;;41092:24:0;;;;;;:18;:24;;;;;;:51;;41121:21;41092:28;:51::i;:::-;-1:-1:-1;;;;;41065:24:0;;;;;;:18;:24;;;;;;;;;:78;;;;41157:46;;;;;;;41065:24;;41157:46;;;;;;;;;41227:49;;;-1:-1:-1;;;41227:49:0;;-1:-1:-1;;;;;41227:49:0;;;;;;;;;;;;;;;41212:12;;41234:3;41227:20;;;;:49;;;;;;;;;;;;;;41212:12;41227:20;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41227:49:0;;-1:-1:-1;41227:49:0;41287:131;;-1:-1:-1;;;;;41338:24:0;;;;;;:18;:24;;;;;;:51;;41367:21;41338:28;:51::i;:::-;-1:-1:-1;;;;;41311:24:0;;;;;;:18;:24;;;;;:78;;;;:24;-1:-1:-1;41400:8:0;;-1:-1:-1;;41400:8:0;41287:131;-1:-1:-1;41435:21:0;-1:-1:-1;41428:28:0;;41025:439;-1:-1:-1;41479:1:0;;40869:617;-1:-1:-1;;40869:617:0:o;21710:176::-;21766:6;21796:5;;;21821:6;;;;;;:16;;;21836:1;21831;:6;;21821:16;21820:38;;;;21847:1;21843;:5;:14;;;;;21856:1;21852;:5;21812:47;;;;;65427:219;65494:4;65527:15;65511:13;:31;65508:67;;;-1:-1:-1;65561:5:0;65554:12;;65508:67;65629:9;;65591:34;:15;65611:13;65591:19;:34::i;:::-;:47;;;65427:219;-1:-1:-1;;65427:219:0:o;44189:260::-;44261:27;44273:7;44282:5;44261:11;:27::i;:::-;44337:106;44388:53;44389:36;44419:5;44389:25;;:29;;:36;;;;:::i;44388:53::-;-1:-1:-1;;;;;44337:37:0;;;;;;:28;:37;;;;;;;:49;:106::i;:::-;-1:-1:-1;;;;;44297:37:0;;;;;;;;:28;:37;;;;;:146;;;;-1:-1:-1;44189:260:0:o;44724:::-;44796:27;44808:7;44817:5;44796:11;:27::i;:::-;44872:106;44923:53;44924:36;44954:5;44924:25;;:29;;:36;;;;:::i;44923:53::-;-1:-1:-1;;;;;44872:37:0;;;;;;:28;:37;;;;;;;:49;:106::i;32479:378::-;-1:-1:-1;;;;;32563:21:0;;32555:65;;;;;-1:-1:-1;;;32555:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32633:49;32662:1;32666:7;32675:6;32633:20;:49::i;:::-;32710:12;;:24;;32727:6;32710:16;:24::i;:::-;32695:12;:39;-1:-1:-1;;;;;32766:18:0;;:9;:18;;;;;;;;;;;:30;;32789:6;32766:22;:30::i;:::-;-1:-1:-1;;;;;32745:18:0;;:9;:18;;;;;;;;;;;:51;;;;32812:37;;;;;;;32745:18;;:9;;32812:37;;;;;;;;;;32479:378;;:::o;33190:418::-;-1:-1:-1;;;;;33274:21:0;;33266:67;;;;-1:-1:-1;;;33266:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33346:49;33367:7;33384:1;33388:6;33346:20;:49::i;:::-;33429:68;33452:6;33429:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33429:18:0;;:9;:18;;;;;;;;;;;;;:22;:68::i;:::-;-1:-1:-1;;;;;33408:18:0;;:9;:18;;;;;;;;;;:89;33523:12;;:24;;33540:6;33523:16;:24::i;:::-;33508:12;:39;33563:37;;;;;;;;33589:1;;-1:-1:-1;;;;;33563:37:0;;;;;;;;;;;;33190:418;;:::o

Swarm Source

ipfs://6918748375ba2b19a44736a39c9872db7f69d99c631d8744d3e3cf7e4a4e1518
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.