ETH Price: $3,164.87 (-7.91%)
Gas: 11 Gwei

Token

Shina Printer (SHIP)
 

Overview

Max Total Supply

20,000,000,000,000 SHIP

Holders

116

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
71,583,764,526.921289951 SHIP

Value
$0.00
0x81f88AAe9B36f26E8F3b127dBCDF4e18C46cFCca
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ShinaPrinter

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 1 : shinaprinter.sol
/**
 *Submitted for verification at Etherscan.io on 2022-03-26
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity ^0.8.7;



interface IUniswapV2Factory {
     function createPair(address tokenA, address tokenB) external returns (address pair);
 }
 
 interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 factory() external pure returns (address);
     function WETH() external pure returns (address);
     function addLiquidityETH(
         address token,
         uint amountTokenDesired,
         uint amountTokenMin,
         uint amountETHMin,
         address to,
         uint deadline
     ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountToken, uint amountETH);     
 }


interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}


contract DividendDistributor is IDividendDistributor {

    using SafeMath for uint256;
    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    IUniswapV2Router02 router;
    IERC20 public RewardToken; 

    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 30 minutes;
    uint256 public minDistribution = 50000000 * (10 ** 18);

    uint256 currentIndex;
    bool initialized;

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router, address _reflectionToken, address token) {
        router = IUniswapV2Router02(_router);
        RewardToken = IERC20(_reflectionToken);
        _token = token;
    }

    function setDistributionCriteria(uint256 newMinPeriod, uint256 newMinDistribution) external override onlyToken {
        minPeriod = newMinPeriod;
        minDistribution = newMinDistribution;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {

        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {

        uint256 balanceBefore = RewardToken.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(RewardToken);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amount = RewardToken.balanceOf(address(this)).sub(balanceBefore);
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }
    
    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 iterations = 0;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        while(gasUsed < gas && iterations < shareholderCount) {

            if(currentIndex >= shareholderCount){ currentIndex = 0; }

            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }
    
    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
                && getUnpaidEarnings(shareholder) > minDistribution;
    }

    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            RewardToken.transfer(shareholder, amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }
    
    function claimDividend() external {
        require(shouldDistribute(msg.sender), "Too soon. Need to wait!");
        distributeDividend(msg.sender);
    }

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}


contract ShinaPrinter is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    IDividendDistributor public dividendDistributor;
    uint256 distributorGas = 500000;

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

    uint256 private _totalSupply;
    
    string private _name;
    string private _symbol;


    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    bool public restrictWhales = true;

    mapping (address => bool) public isFeeExempt;
    mapping (address => bool) public isLimitExempt;
    mapping (address => bool) public isDividendExempt;

    uint256 public reflectionFee;
    uint256 public lpFee;
    uint256 public devFee;

    uint256 public totalFee;

    IUniswapV2Router02 public router;
    address public pair;
    address public tokenOwner;
    address payable public devWallet;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    uint256 public _walletMax;
    uint256 public swapThreshold;
    
    constructor(uint256 initialSupply, address reflectionToken, address routerAddress) {
        tokenOwner = msg.sender;
        _name = "Shina Printer";
        _symbol = "SHIP";
        _totalSupply += initialSupply;
        _balances[tokenOwner] += initialSupply;        

        _walletMax = initialSupply / 100 * 1;
        swapThreshold = initialSupply / 100 * 1;

        router = IUniswapV2Router02(routerAddress);
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));

        _allowances[address(this)][address(router)] = type(uint256).max;

        dividendDistributor = new DividendDistributor(routerAddress, reflectionToken, address(this));

        isFeeExempt[address(this)] = true;
        isFeeExempt[tokenOwner] = true;

        isLimitExempt[address(this)] = true;
        isLimitExempt[address(dividendDistributor)] = true;
        isLimitExempt[pair] = true;
        isLimitExempt[DEAD] = true;
        isLimitExempt[ZERO] = true; 

        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        isDividendExempt[ZERO] = true; 

        reflectionFee = 6;
        lpFee = 2;
        devFee = 4;

        totalFee = devFee.add(lpFee).add(reflectionFee);

        devWallet = payable(tokenOwner);

    }

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

    modifier onlyOwner() {
        require(tokenOwner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    

    //Owner functions
    function changeFees(uint256 initialReflectionFee, uint256 initialLpFee, uint256 initialDevFee) external onlyOwner {

        reflectionFee = initialReflectionFee;
        lpFee = initialLpFee;
        devFee = initialDevFee;

        totalFee = devFee.add(lpFee).add(reflectionFee);
        require(totalFee <= 12, "Too high fee");
    } 

    function changeWalletLimit(uint256 newLimit) external onlyOwner {
        _walletMax  = newLimit;
    }

    function changeRestrictWhales(bool newValue) external onlyOwner {
        restrictWhales = newValue;
    }

    function changeIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setDevWallet(address payable newDevWallet) external onlyOwner {
        devWallet = payable(newDevWallet);
    }

    function setOwnerWallet(address payable newOwnerWallet) external onlyOwner {
        tokenOwner = newOwnerWallet;
    }

    function changeSwapBackSettings(bool enableSwapBack, uint256 newSwapBackLimit) external onlyOwner {
        swapAndLiquifyEnabled  = enableSwapBack;
        swapThreshold = newSwapBackLimit;
    }

    function setDistributionCriteria(uint256 newMinPeriod, uint256 newMinDistribution) external onlyOwner {
        dividendDistributor.setDistributionCriteria(newMinPeriod, newMinDistribution);        
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

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

    /**
     * @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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + 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) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal returns (bool) {

        if(inSwapAndLiquify){ return _basicTransfer(sender, recipient, amount); }


        if(!isLimitExempt[recipient] && restrictWhales)
        {
            require(_balances[recipient].add(amount) <= _walletMax, "wallet");
        }

        if(msg.sender != pair && !inSwapAndLiquify && swapAndLiquifyEnabled && _balances[address(this)] >= swapThreshold){ swapBack(); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        
        uint256 finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient] ? takeFee(sender, amount) : amount;
        _balances[recipient] = _balances[recipient].add(finalAmount);

        // Dividend tracker
        if(!isDividendExempt[sender]) {
            try dividendDistributor.setShare(sender, _balances[sender]) {} catch {}
        }

        if(!isDividendExempt[recipient]) {
            try dividendDistributor.setShare(recipient, _balances[recipient]) {} catch {} 
        }

        try dividendDistributor.process(distributorGas) {} catch {}


        emit Transfer(sender, recipient, finalAmount);
        return true;
    }    

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }    

    /** @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.
     */



    /**
     * @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 Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function takeFee(address sender, uint256 amount) internal returns (uint256) {
        
        uint256 feeAmount = amount.mul(totalFee).div(100);

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function swapBack() internal lockTheSwap {
        
        uint256 tokensToLiquify = _balances[address(this)];
        uint256 amountToLiquify = tokensToLiquify.mul(lpFee).div(totalFee).div(2);
        uint256 amountToSwap = tokensToLiquify.sub(amountToLiquify);

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

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance;
        uint256 devBalance = amountETH.mul(devFee).div(totalFee);

        uint256 amountEthLiquidity = amountETH.mul(lpFee).div(totalFee).div(2);
        uint256 amountEthReflection = amountETH.sub(devBalance).sub(amountEthLiquidity);


        if(amountETH > 0){
            devWallet.transfer(devBalance);
            try dividendDistributor.deposit{value: amountEthReflection}() {} catch {}

            if(amountToLiquify > 0){
                router.addLiquidityETH{value: amountEthLiquidity}(
                    address(this),
                    amountToLiquify,
                    0,
                    0,
                    DEAD,
                    block.timestamp
                );
            }
        }
    
    }

    receive() external payable { }

}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"reflectionToken","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"}],"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":"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":"_walletMax","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":[{"internalType":"uint256","name":"initialReflectionFee","type":"uint256"},{"internalType":"uint256","name":"initialLpFee","type":"uint256"},{"internalType":"uint256","name":"initialDevFee","type":"uint256"}],"name":"changeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"changeRestrictWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableSwapBack","type":"bool"},{"internalType":"uint256","name":"newSwapBackLimit","type":"uint256"}],"name":"changeSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","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":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendDistributor","outputs":[{"internalType":"contract IDividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","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":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restrictWhales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinPeriod","type":"uint256"},{"internalType":"uint256","name":"newMinDistribution","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwnerWallet","type":"address"}],"name":"setOwnerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526207a120600155600780546001600160a01b03191661dead179055600880546001600160a81b031916600160a01b1790556013805460ff60a81b1916600160a81b1790553480156200005557600080fd5b50604051620034a5380380620034a5833981016040819052620000789162000617565b601280546001600160a01b0319163317905560408051808201909152600d8082526c29b434b73090283934b73a32b960991b6020909201918252620000c09160059162000528565b50604080518082019091526004808252630534849560e41b6020909201918252620000ee9160069162000528565b50826004600082825462000103919062000658565b90915550506012546001600160a01b0316600090815260026020526040812080548592906200013490849062000658565b9091555062000147905060648462000673565b6200015490600162000696565b6014556200016460648462000673565b6200017190600162000696565b601555601080546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001c957600080fd5b505afa158015620001de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002049190620005f9565b6001600160a01b031663c9c65396601060009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026157600080fd5b505afa15801562000276573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029c9190620005f9565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b158015620002e457600080fd5b505af1158015620002f9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031f9190620005f9565b601180546001600160a01b0319166001600160a01b03928316179055306000818152600360209081526040808320601054909516835293905282902060001990559051829184916200037190620005b7565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015620003ae573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392831617815530808252600960209081526040808420805460ff199081166001908117909255601254871686528286208054821683179055848652600a8452828620805482168317905585548716865282862080548216831790556011805488168752838720805483168417905560078054891688528488208054841685179055600880548a1689528589208054851686179055915489168852600b86528488208054841685179055958752838720805483168417905594548716865282862080548216831790559354909516845290922080549091169092179091556006600c8190556002600d8190556004600e819055620004e593620004d1929062000513811b62000e1c17901c565b6200051360201b62000e1c1790919060201c565b600f555050601254601380546001600160a01b0319166001600160a01b03909216919091179055506200070b565b600062000521828462000658565b9392505050565b8280546200053690620006b8565b90600052602060002090601f0160209004810192826200055a5760008555620005a5565b82601f106200057557805160ff1916838001178555620005a5565b82800160010185558215620005a5579182015b82811115620005a557825182559160200191906001019062000588565b50620005b3929150620005c5565b5090565b610fdd80620024c883390190565b5b80821115620005b35760008155600101620005c6565b80516001600160a01b0381168114620005f457600080fd5b919050565b6000602082840312156200060c57600080fd5b6200052182620005dc565b6000806000606084860312156200062d57600080fd5b835192506200063f60208501620005dc565b91506200064f60408501620005dc565b90509250925092565b600082198211156200066e576200066e620006f5565b500190565b6000826200069157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615620006b357620006b3620006f5565b500290565b600181811c90821680620006cd57607f821691505b60208210811415620006ef57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b611dad806200071b6000396000f3fe6080604052600436106102535760003560e01c806370a0823111610138578063a457c2d7116100b0578063bad3ea6a1161007f578063dd62ed3e11610064578063dd62ed3e146106a5578063e66b1d1e146106eb578063f887ea401461070b57600080fd5b8063bad3ea6a14610665578063bb542ef01461068557600080fd5b8063a457c2d7146105d5578063a8aa1b31146105f5578063a9059cbb14610615578063b0c150af1461063557600080fd5b806383ad79941161010757806395d89b41116100ec57806395d89b4114610580578063a3a2e89e14610595578063a3e67610146105b557600080fd5b806383ad7994146105325780638ea5220f1461054857600080fd5b806370a08231146104a65780637a319590146104dc5780637db1342c146104fc578063807c2d9c1461051c57600080fd5b8063313ce567116101cb5780634355855a1161019a5780634a74bb021161017f5780634a74bb02146104595780636827e7641461047a578063704ce43e1461049057600080fd5b80634355855a1461040857806344de2e4c1461043857600080fd5b8063313ce5671461037c57806339509351146103985780633dab5269146103b85780633f4218e0146103d857600080fd5b80631df4ccfc1161022257806323b872dd1161020757806323b872dd146103275780632b112e49146103475780632d48e8961461035c57600080fd5b80631df4ccfc146102ef5780631f53ac021461030557600080fd5b80630445b6671461025f57806306fdde0314610288578063095ea7b3146102aa57806318160ddd146102da57600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5061027560155481565b6040519081526020015b60405180910390f35b34801561029457600080fd5b5061029d61072b565b60405161027f9190611bc2565b3480156102b657600080fd5b506102ca6102c5366004611aca565b6107bd565b604051901515815260200161027f565b3480156102e657600080fd5b50600454610275565b3480156102fb57600080fd5b50610275600f5481565b34801561031157600080fd5b506103256103203660046119e1565b6107d5565b005b34801561033357600080fd5b506102ca610342366004611a54565b610863565b34801561035357600080fd5b5061027561088a565b34801561036857600080fd5b50610325610377366004611b46565b6108dc565b34801561038857600080fd5b506040516009815260200161027f565b3480156103a457600080fd5b506102ca6103b3366004611aca565b6109b8565b3480156103c457600080fd5b506103256103d3366004611b11565b6109f7565b3480156103e457600080fd5b506102ca6103f33660046119e1565b60096020526000908152604090205460ff1681565b34801561041457600080fd5b506102ca6104233660046119e1565b600b6020526000908152604090205460ff1681565b34801561044457600080fd5b506008546102ca90600160a01b900460ff1681565b34801561046557600080fd5b506013546102ca90600160a81b900460ff1681565b34801561048657600080fd5b50610275600e5481565b34801561049c57600080fd5b50610275600d5481565b3480156104b257600080fd5b506102756104c13660046119e1565b6001600160a01b031660009081526002602052604090205490565b3480156104e857600080fd5b506103256104f7366004611b68565b610a8e565b34801561050857600080fd5b50610325610517366004611b2d565b610b65565b34801561052857600080fd5b5061027560145481565b34801561053e57600080fd5b50610275600c5481565b34801561055457600080fd5b50601354610568906001600160a01b031681565b6040516001600160a01b03909116815260200161027f565b34801561058c57600080fd5b5061029d610bc4565b3480156105a157600080fd5b506103256105b0366004611a95565b610bd3565b3480156105c157600080fd5b50601254610568906001600160a01b031681565b3480156105e157600080fd5b506102ca6105f0366004611aca565b610c58565b34801561060157600080fd5b50601154610568906001600160a01b031681565b34801561062157600080fd5b506102ca610630366004611aca565b610d0d565b34801561064157600080fd5b506102ca6106503660046119e1565b600a6020526000908152604090205460ff1681565b34801561067157600080fd5b50600054610568906001600160a01b031681565b34801561069157600080fd5b506103256106a03660046119e1565b610d1b565b3480156106b157600080fd5b506102756106c0366004611a1b565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156106f757600080fd5b50610325610706366004611af6565b610da4565b34801561071757600080fd5b50601054610568906001600160a01b031681565b60606005805461073a90611cf8565b80601f016020809104026020016040519081016040528092919081815260200182805461076690611cf8565b80156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b5050505050905090565b6000336107cb818585610e28565b5060019392505050565b6012546001600160a01b031633146108345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6013805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600033610871858285610f80565b61087c858585611012565b5060019150505b9392505050565b6008546001600160a01b03166000908152600260205260408120546108d7906007546001600160a01b03166000908152600260205260409020546108d19060045490611436565b90611436565b905090565b6012546001600160a01b031633146109365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b6000546040517f2d48e89600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0390911690632d48e89690604401600060405180830381600087803b15801561099c57600080fd5b505af11580156109b0573d6000803e3d6000fd5b505050505050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091906107cb90829086906109f2908790611c88565b610e28565b6012546001600160a01b03163314610a515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b60138054921515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff90931692909217909155601555565b6012546001600160a01b03163314610ae85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b600c839055600d829055600e819055610b0b83610b058385610e1c565b90610e1c565b600f819055600c1015610b605760405162461bcd60e51b815260206004820152600c60248201527f546f6f2068696768206665650000000000000000000000000000000000000000604482015260640161082b565b505050565b6012546001600160a01b03163314610bbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b601455565b60606006805461073a90611cf8565b6012546001600160a01b03163314610c2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b038716845290915281205490919083811015610cf55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161082b565b610d028286868403610e28565b506001949350505050565b600033610d02818585611012565b6012546001600160a01b03163314610d755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6012546001600160a01b03163314610dfe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b60088054911515600160a01b0260ff60a01b19909216919091179055565b60006108838284611c88565b6001600160a01b038316610ea35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161082b565b6001600160a01b038216610f1f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161082b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260036020908152604080832093861683529290522054600019811461100c5781811015610fff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161082b565b61100c8484848403610e28565b50505050565b601354600090600160a01b900460ff161561103957611032848484611442565b9050610883565b6001600160a01b0383166000908152600a602052604090205460ff1615801561106b5750600854600160a01b900460ff165b156110e4576014546001600160a01b0384166000908152600260205260409020546110969084610e1c565b11156110e45760405162461bcd60e51b815260206004820152600660248201527f77616c6c65740000000000000000000000000000000000000000000000000000604482015260640161082b565b6011546001600160a01b031633148015906111095750601354600160a01b900460ff16155b801561111e5750601354600160a81b900460ff165b801561113b57506015543060009081526002602052604090205410155b1561114857611148611531565b604080518082018252601481527f496e73756666696369656e742042616c616e63650000000000000000000000006020808301919091526001600160a01b0387166000908152600290915291909120546111a39184906118e3565b6001600160a01b038516600090815260026020908152604080832093909355600990529081205460ff161580156111f357506001600160a01b03841660009081526009602052604090205460ff16155b6111fd5782611207565b611207858461190f565b6001600160a01b03851660009081526002602052604090205490915061122d9082610e1c565b6001600160a01b038086166000908152600260209081526040808320949094559188168152600b909152205460ff166112d257600080546001600160a01b038781168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b1580156112bf57600080fd5b505af19250505080156112d0575060015b505b6001600160a01b0384166000908152600b602052604090205460ff1661136457600080546001600160a01b038681168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b15801561135157600080fd5b505af1925050508015611362575060015b505b6000546001546040517fffb2c4790000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163ffb2c479916113b29160040190815260200190565b600060405180830381600087803b1580156113cc57600080fd5b505af19250505080156113dd575060015b50836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161142391815260200190565b60405180910390a3506001949350505050565b60006108838284611ce1565b604080518082018252601481527f496e73756666696369656e742042616c616e63650000000000000000000000006020808301919091526001600160a01b038616600090815260029091529182205461149c9184906118e3565b6001600160a01b0380861660009081526002602052604080822093909355908516815220546114cb9083610e1c565b6001600160a01b0380851660008181526002602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061151f9086815260200190565b60405180910390a35060019392505050565b6013805460ff60a01b1916600160a01b179055306000908152600260208190526040822054600f54600d5491939261157892909161157291829087906119b4565b906119c0565b905060006115868383611436565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106115c0576115c0611d49565b6001600160a01b03928316602091820292909201810191909152601054604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561162d57600080fd5b505afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166591906119fe565b8160018151811061167857611678611d49565b6001600160a01b0392831660209182029290920101526010546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac947906116d7908590600090869030904290600401611c17565b600060405180830381600087803b1580156116f157600080fd5b505af1158015611705573d6000803e3d6000fd5b505050506000479050600061172b600f54611572600e54856119b490919063ffffffff16565b9050600061174f6002611572600f54611572600d54886119b490919063ffffffff16565b90506000611761826108d18686611436565b905083156118cc576013546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156117a3573d6000803e3d6000fd5b5060008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156117f257600080fd5b505af193505050508015611804575060015b5086156118cc576010546007546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018a905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990849060c4016060604051808303818588803b15801561188f57600080fd5b505af11580156118a3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118c89190611b94565b5050505b50506013805460ff60a01b19169055505050505050565b600081848411156119075760405162461bcd60e51b815260040161082b9190611bc2565b505050900390565b60008061192c6064611572600f54866119b490919063ffffffff16565b306000908152600260205260409020549091506119499082610e1c565b30600081815260026020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061199a9085815260200190565b60405180910390a36119ac8382611436565b949350505050565b60006108838284611cc2565b60006108838284611ca0565b803580151581146119dc57600080fd5b919050565b6000602082840312156119f357600080fd5b813561088381611d5f565b600060208284031215611a1057600080fd5b815161088381611d5f565b60008060408385031215611a2e57600080fd5b8235611a3981611d5f565b91506020830135611a4981611d5f565b809150509250929050565b600080600060608486031215611a6957600080fd5b8335611a7481611d5f565b92506020840135611a8481611d5f565b929592945050506040919091013590565b60008060408385031215611aa857600080fd5b8235611ab381611d5f565b9150611ac1602084016119cc565b90509250929050565b60008060408385031215611add57600080fd5b8235611ae881611d5f565b946020939093013593505050565b600060208284031215611b0857600080fd5b610883826119cc565b60008060408385031215611b2457600080fd5b611ae8836119cc565b600060208284031215611b3f57600080fd5b5035919050565b60008060408385031215611b5957600080fd5b50508035926020909101359150565b600080600060608486031215611b7d57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215611ba957600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015611bef57858101830151858201604001528201611bd3565b81811115611c01576000604083870101525b50601f01601f1916929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611c675784516001600160a01b031683529383019391830191600101611c42565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115611c9b57611c9b611d33565b500190565b600082611cbd57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611cdc57611cdc611d33565b500290565b600082821015611cf357611cf3611d33565b500390565b600181811c90821680611d0c57607f821691505b60208210811415611d2d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611d7457600080fd5b5056fea2646970667358221220c969026d7f7d46640c20e91ec895f3b5545c010d9247d2a606091fddfcffc60664736f6c6343000807003360806040526ec097ce7bc90715b34b9f1000000000600b55610708600c556a295be96e64066972000000600d5534801561003857600080fd5b50604051610fdd380380610fdd833981016040819052610057916100b5565b600180546001600160a01b039485166001600160a01b0319918216179091556002805493851693821693909317909255600080549190931691161790556100f8565b80516001600160a01b03811681146100b057600080fd5b919050565b6000806000606084860312156100ca57600080fd5b6100d384610099565b92506100e160208501610099565b91506100ef60408501610099565b90509250925092565b610ed6806101076000396000f3fe6080604052600436106100e85760003560e01c8063ce7c2ac21161008a578063f0fc6bca11610059578063f0fc6bca14610245578063f1e9f1e51461025a578063ffb2c47914610292578063ffd49c84146102b257600080fd5b8063ce7c2ac2146101ba578063d0e30db014610211578063e2d2e21914610219578063efca2eed1461022f57600080fd5b80632d48e896116100c65780632d48e896146101585780633a98ef39146101785780634fab0ae81461018e578063997664d7146101a457600080fd5b806311ce023d146100ed57806314b6ca961461011657806328fd319814610138575b600080fd5b3480156100f957600080fd5b50610103600b5481565b6040519081526020015b60405180910390f35b34801561012257600080fd5b50610136610131366004610cb2565b6102c8565b005b34801561014457600080fd5b50610103610153366004610c78565b61044d565b34801561016457600080fd5b50610136610173366004610d32565b6104d6565b34801561018457600080fd5b5061010360075481565b34801561019a57600080fd5b50610103600d5481565b3480156101b057600080fd5b5061010360085481565b3480156101c657600080fd5b506101f66101d5366004610c78565b60066020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161010d565b6101366104f8565b34801561022557600080fd5b50610103600a5481565b34801561023b57600080fd5b5061010360095481565b34801561025157600080fd5b506101366107e7565b34801561026657600080fd5b5060025461027a906001600160a01b031681565b6040516001600160a01b03909116815260200161010d565b34801561029e57600080fd5b506101366102ad366004610d00565b610865565b3480156102be57600080fd5b50610103600c5481565b6000546001600160a01b031633146102df57600080fd5b6001600160a01b038216600090815260066020526040902054156103065761030682610966565b60008111801561032c57506001600160a01b038216600090815260066020526040902054155b1561039f57600380546001600160a01b0384166000818152600460205260408120839055600183018455929092527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01805473ffffffffffffffffffffffffffffffffffffffff191690911790556103d2565b801580156103c457506001600160a01b03821660009081526006602052604090205415155b156103d2576103d282610aaa565b6001600160a01b0382166000908152600660205260409020546007546104039183916103fd91610bd9565b90610bec565b6007556001600160a01b038216600090815260066020526040902081905561042a81610bf8565b6001600160a01b0390921660009081526006602052604090206001019190915550565b6001600160a01b03811660009081526006602052604081205461047257506000919050565b6001600160a01b03821660009081526006602052604081205461049490610bf8565b6001600160a01b0384166000908152600660205260409020600101549091508082116104c4575060009392505050565b6104ce8282610bd9565b949350505050565b6000546001600160a01b031633146104ed57600080fd5b600c91909155600d55565b6000546001600160a01b0316331461050f57600080fd5b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561055357600080fd5b505afa158015610567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058b9190610d19565b60408051600280825260608201835292935060009290916020830190803683375050600154604080517fad5c464800000000000000000000000000000000000000000000000000000000815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561060e57600080fd5b505afa158015610622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106469190610c95565b8160008151811061065957610659610e75565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061068a5761068a610e75565b6001600160a01b0392831660209182029290920101526001546040517fb6f9de9500000000000000000000000000000000000000000000000000000000815291169063b6f9de959034906106e990600090869030904290600401610d54565b6000604051808303818588803b15801561070257600080fd5b505af1158015610716573d6000803e3d6000fd5b50506002546040516370a0823160e01b8152306004820152600094506107a593508692506001600160a01b03909116906370a082319060240160206040518083038186803b15801561076757600080fd5b505afa15801561077b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079f9190610d19565b90610bd9565b6008549091506107b59082610bec565b600855600754600b546107df916107d6916107d09085610c1b565b90610c27565b600a5490610bec565b600a55505050565b6107f033610c33565b61085a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546f6f20736f6f6e2e204e65656420746f207761697421000000000000000000604482015260640160405180910390fd5b61086333610966565b565b6000546001600160a01b0316331461087c57600080fd5b60035480610888575050565b60008060005a90505b848210801561089f57508383105b1561095e5783600e54106108b3576000600e555b6108e56003600e54815481106108cb576108cb610e75565b6000918252602090912001546001600160a01b0316610c33565b1561091c5761091c6003600e548154811061090257610902610e75565b6000918252602090912001546001600160a01b0316610966565b61093161092a5a8390610bd9565b8390610bec565b91505a600e8054919250600061094683610e2e565b9190505550828061095690610e2e565b935050610891565b505050505b50565b6001600160a01b0381166000908152600660205260409020546109865750565b60006109918261044d565b90508015610aa6576009546109a69082610bec565b6009556002546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b158015610a1057600080fd5b505af1158015610a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a489190610cde565b506001600160a01b03821660009081526005602090815260408083204290556006909152902060020154610a7c9082610bec565b6001600160a01b038316600090815260066020526040902060028101919091555461042a90610bf8565b5050565b60038054610aba90600190610e17565b81548110610aca57610aca610e75565b60009182526020808320909101546001600160a01b0384811684526004909252604090922054600380549290931692918110610b0857610b08610e75565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03948516179055918316815260049182905260408120546003805491939291610b6190600190610e17565b81548110610b7157610b71610e75565b60009182526020808320909101546001600160a01b031683528201929092526040019020556003805480610ba757610ba7610e5f565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff1916905501905550565b6000610be58284610e17565b9392505050565b6000610be58284610dbe565b6000610c15600b546107d0600a5485610c1b90919063ffffffff16565b92915050565b6000610be58284610df8565b6000610be58284610dd6565b600c546001600160a01b03821660009081526005602052604081205490914291610c5d9190610dbe565b108015610c155750600d54610c718361044d565b1192915050565b600060208284031215610c8a57600080fd5b8135610be581610e8b565b600060208284031215610ca757600080fd5b8151610be581610e8b565b60008060408385031215610cc557600080fd5b8235610cd081610e8b565b946020939093013593505050565b600060208284031215610cf057600080fd5b81518015158114610be557600080fd5b600060208284031215610d1257600080fd5b5035919050565b600060208284031215610d2b57600080fd5b5051919050565b60008060408385031215610d4557600080fd5b50508035926020909101359150565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610d9e5784516001600160a01b031683529383019391830191600101610d79565b50506001600160a01b039690961660408501525050506060015292915050565b60008219821115610dd157610dd1610e49565b500190565b600082610df357634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610e1257610e12610e49565b500290565b600082821015610e2957610e29610e49565b500390565b6000600019821415610e4257610e42610e49565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461096357600080fdfea2646970667358221220167f3e6c2aa820eaad655db22c1d922676877fd48b6ec3504b6b8e09b6c386ee64736f6c6343000807003300000000000000000000000000000000000000000000043c33c1937564800000000000000000000000000000243cacb4d5ff6814ad668c3e225246efa886ad5a0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x6080604052600436106102535760003560e01c806370a0823111610138578063a457c2d7116100b0578063bad3ea6a1161007f578063dd62ed3e11610064578063dd62ed3e146106a5578063e66b1d1e146106eb578063f887ea401461070b57600080fd5b8063bad3ea6a14610665578063bb542ef01461068557600080fd5b8063a457c2d7146105d5578063a8aa1b31146105f5578063a9059cbb14610615578063b0c150af1461063557600080fd5b806383ad79941161010757806395d89b41116100ec57806395d89b4114610580578063a3a2e89e14610595578063a3e67610146105b557600080fd5b806383ad7994146105325780638ea5220f1461054857600080fd5b806370a08231146104a65780637a319590146104dc5780637db1342c146104fc578063807c2d9c1461051c57600080fd5b8063313ce567116101cb5780634355855a1161019a5780634a74bb021161017f5780634a74bb02146104595780636827e7641461047a578063704ce43e1461049057600080fd5b80634355855a1461040857806344de2e4c1461043857600080fd5b8063313ce5671461037c57806339509351146103985780633dab5269146103b85780633f4218e0146103d857600080fd5b80631df4ccfc1161022257806323b872dd1161020757806323b872dd146103275780632b112e49146103475780632d48e8961461035c57600080fd5b80631df4ccfc146102ef5780631f53ac021461030557600080fd5b80630445b6671461025f57806306fdde0314610288578063095ea7b3146102aa57806318160ddd146102da57600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5061027560155481565b6040519081526020015b60405180910390f35b34801561029457600080fd5b5061029d61072b565b60405161027f9190611bc2565b3480156102b657600080fd5b506102ca6102c5366004611aca565b6107bd565b604051901515815260200161027f565b3480156102e657600080fd5b50600454610275565b3480156102fb57600080fd5b50610275600f5481565b34801561031157600080fd5b506103256103203660046119e1565b6107d5565b005b34801561033357600080fd5b506102ca610342366004611a54565b610863565b34801561035357600080fd5b5061027561088a565b34801561036857600080fd5b50610325610377366004611b46565b6108dc565b34801561038857600080fd5b506040516009815260200161027f565b3480156103a457600080fd5b506102ca6103b3366004611aca565b6109b8565b3480156103c457600080fd5b506103256103d3366004611b11565b6109f7565b3480156103e457600080fd5b506102ca6103f33660046119e1565b60096020526000908152604090205460ff1681565b34801561041457600080fd5b506102ca6104233660046119e1565b600b6020526000908152604090205460ff1681565b34801561044457600080fd5b506008546102ca90600160a01b900460ff1681565b34801561046557600080fd5b506013546102ca90600160a81b900460ff1681565b34801561048657600080fd5b50610275600e5481565b34801561049c57600080fd5b50610275600d5481565b3480156104b257600080fd5b506102756104c13660046119e1565b6001600160a01b031660009081526002602052604090205490565b3480156104e857600080fd5b506103256104f7366004611b68565b610a8e565b34801561050857600080fd5b50610325610517366004611b2d565b610b65565b34801561052857600080fd5b5061027560145481565b34801561053e57600080fd5b50610275600c5481565b34801561055457600080fd5b50601354610568906001600160a01b031681565b6040516001600160a01b03909116815260200161027f565b34801561058c57600080fd5b5061029d610bc4565b3480156105a157600080fd5b506103256105b0366004611a95565b610bd3565b3480156105c157600080fd5b50601254610568906001600160a01b031681565b3480156105e157600080fd5b506102ca6105f0366004611aca565b610c58565b34801561060157600080fd5b50601154610568906001600160a01b031681565b34801561062157600080fd5b506102ca610630366004611aca565b610d0d565b34801561064157600080fd5b506102ca6106503660046119e1565b600a6020526000908152604090205460ff1681565b34801561067157600080fd5b50600054610568906001600160a01b031681565b34801561069157600080fd5b506103256106a03660046119e1565b610d1b565b3480156106b157600080fd5b506102756106c0366004611a1b565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156106f757600080fd5b50610325610706366004611af6565b610da4565b34801561071757600080fd5b50601054610568906001600160a01b031681565b60606005805461073a90611cf8565b80601f016020809104026020016040519081016040528092919081815260200182805461076690611cf8565b80156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b5050505050905090565b6000336107cb818585610e28565b5060019392505050565b6012546001600160a01b031633146108345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6013805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600033610871858285610f80565b61087c858585611012565b5060019150505b9392505050565b6008546001600160a01b03166000908152600260205260408120546108d7906007546001600160a01b03166000908152600260205260409020546108d19060045490611436565b90611436565b905090565b6012546001600160a01b031633146109365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b6000546040517f2d48e89600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b0390911690632d48e89690604401600060405180830381600087803b15801561099c57600080fd5b505af11580156109b0573d6000803e3d6000fd5b505050505050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091906107cb90829086906109f2908790611c88565b610e28565b6012546001600160a01b03163314610a515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b60138054921515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff90931692909217909155601555565b6012546001600160a01b03163314610ae85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b600c839055600d829055600e819055610b0b83610b058385610e1c565b90610e1c565b600f819055600c1015610b605760405162461bcd60e51b815260206004820152600c60248201527f546f6f2068696768206665650000000000000000000000000000000000000000604482015260640161082b565b505050565b6012546001600160a01b03163314610bbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b601455565b60606006805461073a90611cf8565b6012546001600160a01b03163314610c2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b038716845290915281205490919083811015610cf55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161082b565b610d028286868403610e28565b506001949350505050565b600033610d02818585611012565b6012546001600160a01b03163314610d755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6012546001600160a01b03163314610dfe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082b565b60088054911515600160a01b0260ff60a01b19909216919091179055565b60006108838284611c88565b6001600160a01b038316610ea35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161082b565b6001600160a01b038216610f1f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161082b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260036020908152604080832093861683529290522054600019811461100c5781811015610fff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161082b565b61100c8484848403610e28565b50505050565b601354600090600160a01b900460ff161561103957611032848484611442565b9050610883565b6001600160a01b0383166000908152600a602052604090205460ff1615801561106b5750600854600160a01b900460ff165b156110e4576014546001600160a01b0384166000908152600260205260409020546110969084610e1c565b11156110e45760405162461bcd60e51b815260206004820152600660248201527f77616c6c65740000000000000000000000000000000000000000000000000000604482015260640161082b565b6011546001600160a01b031633148015906111095750601354600160a01b900460ff16155b801561111e5750601354600160a81b900460ff165b801561113b57506015543060009081526002602052604090205410155b1561114857611148611531565b604080518082018252601481527f496e73756666696369656e742042616c616e63650000000000000000000000006020808301919091526001600160a01b0387166000908152600290915291909120546111a39184906118e3565b6001600160a01b038516600090815260026020908152604080832093909355600990529081205460ff161580156111f357506001600160a01b03841660009081526009602052604090205460ff16155b6111fd5782611207565b611207858461190f565b6001600160a01b03851660009081526002602052604090205490915061122d9082610e1c565b6001600160a01b038086166000908152600260209081526040808320949094559188168152600b909152205460ff166112d257600080546001600160a01b038781168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b1580156112bf57600080fd5b505af19250505080156112d0575060015b505b6001600160a01b0384166000908152600b602052604090205460ff1661136457600080546001600160a01b038681168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b15801561135157600080fd5b505af1925050508015611362575060015b505b6000546001546040517fffb2c4790000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163ffb2c479916113b29160040190815260200190565b600060405180830381600087803b1580156113cc57600080fd5b505af19250505080156113dd575060015b50836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161142391815260200190565b60405180910390a3506001949350505050565b60006108838284611ce1565b604080518082018252601481527f496e73756666696369656e742042616c616e63650000000000000000000000006020808301919091526001600160a01b038616600090815260029091529182205461149c9184906118e3565b6001600160a01b0380861660009081526002602052604080822093909355908516815220546114cb9083610e1c565b6001600160a01b0380851660008181526002602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061151f9086815260200190565b60405180910390a35060019392505050565b6013805460ff60a01b1916600160a01b179055306000908152600260208190526040822054600f54600d5491939261157892909161157291829087906119b4565b906119c0565b905060006115868383611436565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106115c0576115c0611d49565b6001600160a01b03928316602091820292909201810191909152601054604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561162d57600080fd5b505afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166591906119fe565b8160018151811061167857611678611d49565b6001600160a01b0392831660209182029290920101526010546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac947906116d7908590600090869030904290600401611c17565b600060405180830381600087803b1580156116f157600080fd5b505af1158015611705573d6000803e3d6000fd5b505050506000479050600061172b600f54611572600e54856119b490919063ffffffff16565b9050600061174f6002611572600f54611572600d54886119b490919063ffffffff16565b90506000611761826108d18686611436565b905083156118cc576013546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156117a3573d6000803e3d6000fd5b5060008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156117f257600080fd5b505af193505050508015611804575060015b5086156118cc576010546007546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018a905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990849060c4016060604051808303818588803b15801561188f57600080fd5b505af11580156118a3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118c89190611b94565b5050505b50506013805460ff60a01b19169055505050505050565b600081848411156119075760405162461bcd60e51b815260040161082b9190611bc2565b505050900390565b60008061192c6064611572600f54866119b490919063ffffffff16565b306000908152600260205260409020549091506119499082610e1c565b30600081815260026020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061199a9085815260200190565b60405180910390a36119ac8382611436565b949350505050565b60006108838284611cc2565b60006108838284611ca0565b803580151581146119dc57600080fd5b919050565b6000602082840312156119f357600080fd5b813561088381611d5f565b600060208284031215611a1057600080fd5b815161088381611d5f565b60008060408385031215611a2e57600080fd5b8235611a3981611d5f565b91506020830135611a4981611d5f565b809150509250929050565b600080600060608486031215611a6957600080fd5b8335611a7481611d5f565b92506020840135611a8481611d5f565b929592945050506040919091013590565b60008060408385031215611aa857600080fd5b8235611ab381611d5f565b9150611ac1602084016119cc565b90509250929050565b60008060408385031215611add57600080fd5b8235611ae881611d5f565b946020939093013593505050565b600060208284031215611b0857600080fd5b610883826119cc565b60008060408385031215611b2457600080fd5b611ae8836119cc565b600060208284031215611b3f57600080fd5b5035919050565b60008060408385031215611b5957600080fd5b50508035926020909101359150565b600080600060608486031215611b7d57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215611ba957600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015611bef57858101830151858201604001528201611bd3565b81811115611c01576000604083870101525b50601f01601f1916929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611c675784516001600160a01b031683529383019391830191600101611c42565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115611c9b57611c9b611d33565b500190565b600082611cbd57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611cdc57611cdc611d33565b500290565b600082821015611cf357611cf3611d33565b500390565b600181811c90821680611d0c57607f821691505b60208210811415611d2d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611d7457600080fd5b5056fea2646970667358221220c969026d7f7d46640c20e91ec895f3b5545c010d9247d2a606091fddfcffc60664736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000043c33c1937564800000000000000000000000000000243cacb4d5ff6814ad668c3e225246efa886ad5a0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 20000000000000000000000
Arg [1] : reflectionToken (address): 0x243cACb4D5fF6814AD668C3e225246efA886AD5a
Arg [2] : routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000043c33c1937564800000
Arg [1] : 000000000000000000000000243cacb4d5ff6814ad668c3e225246efa886ad5a
Arg [2] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


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.