ETH Price: $2,379.22 (-0.94%)

Token

ChameleonGO (CHAM)
 

Overview

Max Total Supply

1,000,000,000 CHAM

Holders

31

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 10 Decimals)

Balance
12,600,000 CHAM

Value
$0.00
0xb79c4b701f65ba3bd9508bc6266f87d149378868
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:
CHAM

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : cham.sol
//SPDX-License-Identifier: MIT

/**
ChameleonGO - The Coin That Changes Daily
Tracked SmartCoins Swap

Website: https://chameleongo.org
Twitter: https://twitter.com/ChameleonGO
Telegram: https://t.me/ChameleonGO

 β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—  β–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ•‘    β–ˆβ–ˆβ•”β•β•β•β•β• β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•—
β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β–ˆβ–ˆβ–ˆβ–ˆβ•”β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘    β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘
β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•  β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”β•β•β•  β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘    β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘
β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β•šβ•β• β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘    β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•
 β•šβ•β•β•β•β•β•β•šβ•β•  β•šβ•β•β•šβ•β•  β•šβ•β•β•šβ•β•     β•šβ•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β• β•šβ•β•β•β•β•β• β•šβ•β•  β•šβ•β•β•β•     β•šβ•β•β•β•β•β•  β•šβ•β•β•β•β•β•

*/



import "@openzeppelin/contracts/utils/Context.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@looksrare/contracts-libs/contracts/ReentrancyGuard.sol";

pragma solidity 0.8.20;

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

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

interface ERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IDEXRouter {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    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);
}

contract CHAM is ERC20, Context, Ownable, ReentrancyGuard {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private isBlacklisted;
    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled = false;
    address payable private _taxWallet;

    uint256 private _startBT=10; //Initial Buy Tax
    uint256 private _startST=25; //Initial Sell Tax
    uint256 private _medBuyTax=3; //First 10 days Buy Tax
    uint256 private _medSellTax=3; //First 10 days Sell Tax
    uint256 private _finalBuyTax=1; //Final Buy Tax
    uint256 private _finalSellTax=1; //Final Sell Tax
    uint256 private _buyCount=0;

    uint256 private _avatarCreatorTax=4; //This is the tax the avatar creator gets when they are traded through Chameleon SWAP

    uint256 private _preventSwapBefore=20;

    uint8 private constant _decimals = 10;
    uint256 private constant _totalSupply = 1_000_000_000 * 10**_decimals;
    string private constant _name = "ChameleonGO";
    string private constant _symbol = "CHAM";
    uint256 public _maxTxAmount =   _totalSupply * 15 / 1000; // 1.5% of total supply
    uint256 public _maxWalletAmount = _totalSupply * 15 / 1000; // 1.5% of total supply
    uint256 public _taxSwapThreshold = _totalSupply * 2000; // 0.1% of total supply
    uint256 public _maxTaxSwap = _totalSupply * 3 / 1000; // 0.3% of total supply

    //The price in ETH to create an avatar 0.05 ETH
    uint256 public _avatarCreationFee = 5 * 10**16;

    //Holds all created avatars and their respective supplies
    mapping(uint256 => Avatar) private _avatars;

    //User Balances _balances divided between each avatar. _userAvatarBalances[userAddress][avatarNumber];
    mapping (address => mapping (uint256 => uint256)) private _userAvatarBalances;

    //User selected avatar that will be transfered.
    //This only works after _launchIsOver = true
    mapping(address => uint256) private _userSelectedTradeAvatar;

    mapping(address => TradeAuthorization) private _authorizedTrades;

    uint256 public _deployDate;
    uint256 public _launchBlock;
    bool private _launchIsOver = false;
    bool private _intermediateFee = false;
    uint256 public _lastCreatedAvatarId = 0;

    IDEXRouter private router;
    address private pair;
    bool private tradingOpen = false;
    bool private inSwap = false;
    bool private swapEnabled = false;
    uint256 private firstBlock;

    event AvatarCreated(address creator, string name, string symbol, uint256 supply, uint256 supplyFromAvatarId);
    event MaxTxAmountUpdated(uint _maxTxAmount);
    event UserUpdatedTradeAvatar(address user, uint256 avatarId);
    event ChameleonTradeAllowed(
        address traders,
        uint256 sendAmount,
        uint256 sendAvatarId,
        uint256 receiveAmount,
        uint256 receiveAvatarId
    );
    event ChameleonTradePerformed(
        address trader1,
        address trader2,
        uint256 trader1SendAmount,
        uint256 trader1SendAvatarId,
        uint256 trader1ReceiveAmount,
        uint256 trader1ReceiveAvatarId
    );

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

    struct Avatar {
        string name;
        string symbol;
        uint256 supply;
        address creator;
        uint256 creationDate;
    }

    struct TradeAuthorization {
        uint256 sendAmount;
        uint256 sendAvatarId;
        uint256 receiveAmount;
        uint256 receiveAvatarId;
        bool allowed;
    }

    //Max avatar name length in bytes
    uint256 public constant _maxAvatarNameBytes = 20;

    //Max avatar symbol length in bytes
    uint256 public constant _maxAvatarSymbolBytes = 7;

    function _stringsMatch(string memory _a, string memory _b) private pure returns (bool) {
        return keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b));
    }

    /*
        Creating an avatar
    */
    function createAvatar(
        string memory avatarName,
        string memory avatarSymbol,
        uint256 supply,
        uint256 supplyFromAvatarId
    ) external payable nonReentrant returns (uint256) {
        bool isOwner = msg.sender == owner();
        if(!isOwner) {
            require(_launchIsOver, "Public avatar creation is only allowed after the launch is over");
            require(msg.value >= _avatarCreationFee, "Avatar creation tax invalid");
        }
        /*
            During the launch, the 10 original avatars will have dynamic supply
            But supply isn't created, it is transformed from the main avatar id 0
        */
        if(_launchIsOver) {
            require(_userAvatarBalances[msg.sender][supplyFromAvatarId] >= supply, "Not enough balance of the selected avatar");
        }
        require(bytes(avatarName).length <= _maxAvatarNameBytes, "Name too big");
        require(bytes(avatarSymbol).length <= _maxAvatarSymbolBytes, "Symbol too big");
        require(!_stringsMatch(avatarSymbol, "CHAM"), "Cannot use this symbol name");

        ++_lastCreatedAvatarId;

        Avatar storage a = _avatars[_lastCreatedAvatarId];
        a.name = avatarName;
        a.name = avatarSymbol;
        a.supply = _launchIsOver ? supply : 0;
        a.creator = _launchIsOver ? msg.sender : address(this);
        a.creationDate = block.timestamp;

        if(_launchIsOver) {
            _userAvatarBalances[msg.sender][supplyFromAvatarId] -= supply;
            _avatars[supplyFromAvatarId].supply -= supply;

            _userAvatarBalances[msg.sender][_lastCreatedAvatarId] += supply;
        }

        emit AvatarCreated(
            msg.sender,
            avatarName,
            avatarSymbol,
            supply,
            supplyFromAvatarId
        );

        return _lastCreatedAvatarId;
    }

    constructor () {

        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IDEXFactory(router.factory()).createPair(address(this), router.WETH());

        _deployDate = block.timestamp;
        _taxWallet = payable(_msgSender());
        _balances[_msgSender()] = _totalSupply;

        //Initialize main avatar 0 with all the coins
        Avatar storage a = _avatars[0];
        a.name = "Chameleon";
        a.symbol = "CHAM";
        a.supply = _totalSupply;
        a.creator = address(this);
        a.creationDate = block.timestamp;

        _userAvatarBalances[_msgSender()][0] = _totalSupply;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_taxWallet] = true;

        emit Transfer(address(0), _msgSender(), _totalSupply);
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function getOwner() external view override returns (address) {
        return owner();
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function totalAvatarSupply(uint256 avatarId) public view returns (uint256) {
        return _avatars[avatarId].supply;
    }

    function setSelectedTradeAvatar(uint256 avatarId) external {
        _userSelectedTradeAvatar[_msgSender()] = avatarId;
        emit UserUpdatedTradeAvatar(_msgSender(), avatarId);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        bool isFromUser = (
            from != address(this)
            && from != address(router)
            && from != address(pair)
        );

        bool isToUser = (
            to != address(this)
            && to != address(router)
            && to != address(pair)
        );

        uint256 soldAvatarId = 0;
        uint256 receivedAvatarId = 0;
        if(isFromUser) {
            soldAvatarId = _userSelectedTradeAvatar[from];
            require(_userAvatarBalances[from][soldAvatarId] >= amount, "Not enough balance of the selected avatar");
        }
        if(isFromUser && isToUser) {
            receivedAvatarId = soldAvatarId;
        }
        //All transfers TO the contract through uniswap burns the avatar and returns in main CHAM id 0;
        if(!_launchIsOver && isToUser) {
            receivedAvatarId = _lastCreatedAvatarId;
        }

        uint256 taxAmount=0;
        if (from != owner() && to != owner()) {
            require(!isBlacklisted[from]);

            if (transferDelayEnabled) {
                if (to != address(router) && to != address(pair)) {
                    require(_holderLastTransferTimestamp[tx.origin] < block.number,"Only one transfer per block allowed.");
                    _holderLastTransferTimestamp[tx.origin] = block.number;
                }
            }

            if (from == pair && to != address(router) && ! _isExcludedFromFee[to] ) {
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                require(balanceOf(to) + amount <= _maxWalletAmount, "Exceeds the maxWalletSize.");
                if (firstBlock + 3  > block.number) {
                    isBlacklisted[to] = true;
                }
                _buyCount++;
            }

            taxAmount = amount.mul(
                isBlacklisted[to] ? 49 :
                _launchIsOver ? _finalBuyTax
                    : _intermediateFee ? _medBuyTax
                        : _startBT
            ).div(100);

            if(to == pair && from!= address(this) ){
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                taxAmount = amount.mul(
                    isBlacklisted[from] ? 49 :
                    _launchIsOver ? _finalSellTax
                        : _intermediateFee ? _medSellTax
                            : _startST
                ).div(100);
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            if (!inSwap && to == pair && swapEnabled && contractTokenBalance>_taxSwapThreshold && _buyCount>_preventSwapBefore) {
                swapTokensForEth(min(amount,min(contractTokenBalance,_maxTaxSwap)));
                uint256 contractETHBalance = address(this).balance;
                if(contractETHBalance > 0) {
                    sendETHToFee(address(this).balance);
                }
            }
        }

        if(taxAmount>0){
            _balances[address(this)]=_balances[address(this)].add(taxAmount);
            emit Transfer(from, address(this),taxAmount);
        }

        uint256 transferredMinusTax = amount.sub(taxAmount);

        _balances[from]= _balances[from].sub(amount);
        _balances[to]= _balances[to].add(transferredMinusTax);

        if (isFromUser) {
            _userAvatarBalances[from][soldAvatarId] -= amount;
            _avatars[soldAvatarId].supply -= amount;
        } else {
            _avatars[0].supply -= amount;
        }

        if(isToUser) {
            _userAvatarBalances[to][receivedAvatarId] += transferredMinusTax;
            _avatars[receivedAvatarId].supply += transferredMinusTax;
        } else {
            _avatars[0].supply += transferredMinusTax;
        }

        emit Transfer(from, to, amount.sub(taxAmount));
    }

    function chameleonSwapAllowAndTrade(
        address with,
        uint256 sendAmount,
        uint256 sendAvatarId,
        uint256 receiveAmount,
        uint256 receiveAvatarId
    ) public returns (bool) {
        require(_launchIsOver, "Chameleon Swap not enabled yet. Wait for the launch to end");
        require(
            chameleonSwapAllowTrade(
                sendAmount,
                sendAvatarId,
                receiveAmount,
                receiveAvatarId
            ),
            "Invalid Trade Authorization"
        );
        require(
            chameleonSwapPerformTrade(with),
            "Error trading"
        );

        return true;
    }

    function chameleonSwapPerformTrade(
        address with
    ) public nonReentrant returns (bool) {
        require(_launchIsOver, "Chameleon Swap not enabled yet. Wait for the launch to end");
        require(with != address(0), "ERC20: transfer to the zero address");

        TradeAuthorization storage senderTA = _authorizedTrades[msg.sender];
        TradeAuthorization storage receiverTA = _authorizedTrades[with];

        require(
            senderTA.allowed && receiverTA.allowed,
            "Authorization has not been allowed or initiated"
        );
        require(
            senderTA.sendAmount == receiverTA.receiveAmount
            && senderTA.sendAvatarId == receiverTA.receiveAvatarId
            && senderTA.receiveAmount == receiverTA.sendAmount
            && senderTA.receiveAvatarId == receiverTA.sendAvatarId,
            "Invalid trade"
        );

        require(senderTA.sendAmount > 0 && receiverTA.sendAmount > 0, "Transfer amount must be greater than zero");

        require(_userAvatarBalances[msg.sender][senderTA.sendAvatarId] >= senderTA.sendAmount, "Insufficient balance of the sender");
        require(_userAvatarBalances[with][receiverTA.sendAvatarId] >= receiverTA.sendAmount, "Insufficient balance of the receiver");

        uint256 senderTaxAmount = 0;
        uint256 receiverTaxAmount = 0;

        address trader1ReceivedAvatarCreator = _avatars[senderTA.receiveAvatarId].creator;
        address trader2ReceivedAvatarCreator = _avatars[receiverTA.receiveAvatarId].creator;

        if(
            msg.sender != address(this)
            || msg.sender != trader1ReceivedAvatarCreator
        ) {
            senderTaxAmount = senderTA.receiveAmount.mul(_avatarCreatorTax).div(100);
        }

        if(
            with != address(this)
            || with != trader2ReceivedAvatarCreator
        ) {
            receiverTaxAmount = receiverTA.receiveAmount.mul(_avatarCreatorTax).div(100);
        }

        _balances[msg.sender] = _balances[msg.sender].sub(senderTA.sendAmount).add(receiverTA.sendAmount.sub(senderTaxAmount));
        _userAvatarBalances[msg.sender][senderTA.sendAvatarId] = _userAvatarBalances[msg.sender][senderTA.sendAvatarId].sub(senderTA.sendAmount);
        _userAvatarBalances[msg.sender][senderTA.receiveAvatarId] = _userAvatarBalances[msg.sender][senderTA.receiveAvatarId].add(receiverTA.sendAmount.sub(senderTaxAmount));

        if(senderTaxAmount > 0) {
            _balances[trader1ReceivedAvatarCreator] = _balances[trader1ReceivedAvatarCreator].add(senderTaxAmount);
            _userAvatarBalances[trader1ReceivedAvatarCreator][senderTA.receiveAvatarId] = _userAvatarBalances[trader1ReceivedAvatarCreator][senderTA.receiveAvatarId].add(senderTaxAmount);
        }

        _balances[with] = _balances[with].sub(receiverTA.sendAmount).add(senderTA.sendAmount.sub(receiverTaxAmount));
        _userAvatarBalances[with][receiverTA.sendAvatarId] = _userAvatarBalances[with][receiverTA.sendAvatarId].sub(receiverTA.sendAmount);
        _userAvatarBalances[with][receiverTA.receiveAvatarId] = _userAvatarBalances[with][receiverTA.receiveAvatarId].add(senderTA.sendAmount.sub(receiverTaxAmount));

        if(receiverTaxAmount > 0) {
            _balances[trader2ReceivedAvatarCreator] = _balances[trader2ReceivedAvatarCreator].add(receiverTaxAmount);
            _userAvatarBalances[trader2ReceivedAvatarCreator][receiverTA.receiveAvatarId] = _userAvatarBalances[trader2ReceivedAvatarCreator][receiverTA.receiveAvatarId].add(receiverTaxAmount);
        }

        senderTA.allowed = false;
        receiverTA.allowed = false;

        emit ChameleonTradePerformed(
            msg.sender,
            with,
            senderTA.sendAmount,
            senderTA.sendAvatarId,
            senderTA.receiveAmount,
            senderTA.receiveAvatarId
        );

        return true;
    }

    function chameleonSwapAllowTrade(
        uint256 sendAmount,
        uint256 sendAvatarId,
        uint256 receiveAmount,
        uint256 receiveAvatarId
    ) public nonReentrant returns (bool) {
        require(_launchIsOver, "Chameleon Swap not enabled yet. Wait for the launch to end");
        require(sendAmount > 0, "Send amount must be greater than zero");
        require(receiveAmount > 0, "Receive amount must be greater than zero");
        require(sendAvatarId != receiveAvatarId, "Traded avatars must be different");
        require(_userAvatarBalances[msg.sender][sendAvatarId] >= sendAmount, "Insufficient balance of the sender");

        TradeAuthorization storage ta = _authorizedTrades[msg.sender];
        ta.sendAvatarId = sendAvatarId;
        ta.sendAmount = sendAmount;
        ta.receiveAmount = receiveAmount;
        ta.receiveAvatarId = receiveAvatarId;
        ta.allowed = true;

        emit ChameleonTradeAllowed(
            msg.sender,
            sendAmount,
            sendAvatarId,
            receiveAmount,
            receiveAvatarId
        );

        return true;
    }


    function min(uint256 a, uint256 b) private pure returns (uint256){
        return (a>b)?b:a;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        if(tokenAmount==0){return;}
        if(!tradingOpen){return;}
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function removeLimits() external onlyOwner {
        _maxTxAmount = _totalSupply;
        _maxWalletAmount=_totalSupply;
        transferDelayEnabled=false;
        emit MaxTxAmountUpdated(_totalSupply);
    }

    function sendETHToFee(uint256 amount) private {
        _taxWallet.transfer(amount);
    }

    function isBot(address a) public view returns (bool){
        return isBlacklisted[a];
    }

    function manageList(address[] memory isBlacklisted_) external onlyOwner{
        for (uint i = 0; i < isBlacklisted_.length; i++) {
            isBlacklisted[isBlacklisted_[i]] = true;
        }
    }

    function reduceFee(uint256 _newBuyFee,uint256 _newSellFee) external onlyOwner{
        _finalBuyTax=_newBuyFee;
        _finalSellTax=_newSellFee;
    }

    function setLaunchOver() external onlyOwner {
        _launchIsOver = true;
    }

    function setIntermediateFee() external onlyOwner {
        _intermediateFee = true;
    }

    function setInitialBuySellTax(uint256 newBuyTax, uint256 newSellTax) external onlyOwner {
        _startBT = newBuyTax;
        _startST = newSellTax;
    }

    function setMedBuySellTax(uint256 newBuyTax, uint256 newSellTax) external onlyOwner {
        _medBuyTax = newBuyTax;
        _medSellTax = newSellTax;
    }

    function setAvatarCreatorTax(uint256 newTax) external onlyOwner {
        _avatarCreatorTax = newTax;
    }

    //Update Fee in ETH
    function setAvatarCreationFee(uint256 newFee) external onlyOwner {
        _avatarCreationFee = newFee;
    }

    function openTrading() external onlyOwner {
        require(!tradingOpen,"trading is already open");
        swapEnabled = true;
        tradingOpen = true;
        firstBlock = block.number;
    }

    function avatarBalanceOf(address user, uint256 avatarId) public view returns (uint256) {
        return _userAvatarBalances[user][avatarId];
    }

    function getAvatar(uint256 avatarId) public view returns (Avatar memory) {
        return _avatars[avatarId];
    }

    function userSelectedTradeAvatarId(address user) public view returns (uint256) {
        return _userSelectedTradeAvatar[user];
    }

    function isLaunchOver() public view returns (bool) {
        return _launchIsOver;
    }

    function cancelAuthorizations() public nonReentrant {
        require(_launchIsOver, "Chameleon Swap not enabled yet");
        _authorizedTrades[msg.sender].allowed = false;
    }

    receive() external payable {}

    function isContract(address account) private view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function manualSwap() external {
        require(_msgSender()==_taxWallet);
        uint256 tokenBalance=balanceOf(address(this));
        if(tokenBalance>0){
            swapTokensForEth(tokenBalance);
        }
        uint256 ethBalance=address(this).balance;
        if(ethBalance>0){
            sendETHToFee(ethBalance);
        }
    }
}

File 2 of 5 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// Interfaces
import {IReentrancyGuard} from "./interfaces/IReentrancyGuard.sol";

/**
 * @title ReentrancyGuard
 * @notice This contract protects against reentrancy attacks.
 *         It is adjusted from OpenZeppelin.
 * @author LooksRare protocol team (👀,💎)
 */
abstract contract ReentrancyGuard is IReentrancyGuard {
    uint256 private _status;

    /**
     * @notice Modifier to wrap functions to prevent reentrancy calls.
     */
    modifier nonReentrant() {
        if (_status == 2) {
            revert ReentrancyFail();
        }

        _status = 2;
        _;
        _status = 1;
    }

    constructor() {
        _status = 1;
    }
}

File 3 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 4 of 5 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 5 of 5 : IReentrancyGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**
 * @title IReentrancyGuard
 * @author LooksRare protocol team (👀,💎)
 */
interface IReentrancyGuard {
    /**
     * @notice This is returned when there is a reentrant call.
     */
    error ReentrancyFail();
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyFail","type":"error"},{"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":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supplyFromAvatarId","type":"uint256"}],"name":"AvatarCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"traders","type":"address"},{"indexed":false,"internalType":"uint256","name":"sendAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sendAvatarId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiveAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiveAvatarId","type":"uint256"}],"name":"ChameleonTradeAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"trader1","type":"address"},{"indexed":false,"internalType":"address","name":"trader2","type":"address"},{"indexed":false,"internalType":"uint256","name":"trader1SendAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"trader1SendAvatarId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"trader1ReceiveAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"trader1ReceiveAvatarId","type":"uint256"}],"name":"ChameleonTradePerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"avatarId","type":"uint256"}],"name":"UserUpdatedTradeAvatar","type":"event"},{"inputs":[],"name":"_avatarCreationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_deployDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lastCreatedAvatarId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxAvatarNameBytes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxAvatarSymbolBytes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxSwapThreshold","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":"user","type":"address"},{"internalType":"uint256","name":"avatarId","type":"uint256"}],"name":"avatarBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelAuthorizations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"with","type":"address"},{"internalType":"uint256","name":"sendAmount","type":"uint256"},{"internalType":"uint256","name":"sendAvatarId","type":"uint256"},{"internalType":"uint256","name":"receiveAmount","type":"uint256"},{"internalType":"uint256","name":"receiveAvatarId","type":"uint256"}],"name":"chameleonSwapAllowAndTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sendAmount","type":"uint256"},{"internalType":"uint256","name":"sendAvatarId","type":"uint256"},{"internalType":"uint256","name":"receiveAmount","type":"uint256"},{"internalType":"uint256","name":"receiveAvatarId","type":"uint256"}],"name":"chameleonSwapAllowTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"with","type":"address"}],"name":"chameleonSwapPerformTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"avatarName","type":"string"},{"internalType":"string","name":"avatarSymbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"supplyFromAvatarId","type":"uint256"}],"name":"createAvatar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"avatarId","type":"uint256"}],"name":"getAvatar","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"creationDate","type":"uint256"}],"internalType":"struct CHAM.Avatar","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunchOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"isBlacklisted_","type":"address[]"}],"name":"manageList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBuyFee","type":"uint256"},{"internalType":"uint256","name":"_newSellFee","type":"uint256"}],"name":"reduceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setAvatarCreationFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTax","type":"uint256"}],"name":"setAvatarCreatorTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"setInitialBuySellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setIntermediateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLaunchOver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"setMedBuySellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"avatarId","type":"uint256"}],"name":"setSelectedTradeAvatar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"avatarId","type":"uint256"}],"name":"totalAvatarSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"user","type":"address"}],"name":"userSelectedTradeAvatarId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526007805460ff19169055600a600881905560196009556003808255600b556001600c819055600d555f600e556004600f5560146010556103e8906200004a908062000662565b6200005a90633b9aca0062000679565b6200006790600f62000679565b62000073919062000693565b6011556103e862000086600a8062000662565b6200009690633b9aca0062000679565b620000a390600f62000679565b620000af919062000693565b601255620000bf600a8062000662565b620000cf90633b9aca0062000679565b620000dd906107d062000679565b6013556103e8620000f0600a8062000662565b6200010090633b9aca0062000679565b6200010d90600362000679565b62000119919062000693565b60145566b1a2bc2ec50000601555601c805461ffff191690555f601d55601f805462ffffff60a01b1916905534801562000151575f80fd5b506200015d3362000504565b60018055601e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001c4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001ea9190620006b3565b6001600160a01b031663c9c6539630601e5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200024a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002709190620006b3565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620002bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002e19190620006b3565b601f80546001600160a01b0319166001600160a01b039290921691909117905542601a556200030d3390565b600780546001600160a01b039290921661010002610100600160a81b031990921691909117905562000341600a8062000662565b6200035190633b9aca0062000679565b335f90815260026020908152604080832093909355908052601681528151808301909252600982526821b430b6b2b632b7b760b91b908201527f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153dd908190620003ba90826200077b565b506040805180820190915260048152634348414d60e01b60208201526001820190620003e790826200077b565b50620003f5600a8062000662565b6200040590633b9aca0062000679565b60028201556003810180546001600160a01b0319163017905542600482015562000431600a8062000662565b6200044190633b9aca0062000679565b335f81815260176020908152604080832083805282528083209490945581546001600160a01b03908116835260049091528382208054600160ff1991821681179092553084528584208054821683179055600754610100900490921683529382208054909116909317909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620004dc600a8062000662565b620004ec90633b9aca0062000679565b60405190815260200160405180910390a35062000843565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620005a757815f19048211156200058b576200058b62000553565b808516156200059957918102915b93841c93908002906200056c565b509250929050565b5f82620005bf575060016200065c565b81620005cd57505f6200065c565b8160018114620005e65760028114620005f15762000611565b60019150506200065c565b60ff84111562000605576200060562000553565b50506001821b6200065c565b5060208310610133831016604e8410600b841016171562000636575081810a6200065c565b62000642838362000567565b805f190482111562000658576200065862000553565b0290505b92915050565b5f6200067260ff841683620005af565b9392505050565b80820281158282048414176200065c576200065c62000553565b5f82620006ae57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215620006c4575f80fd5b81516001600160a01b038116811462000672575f80fd5b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200070457607f821691505b6020821081036200072357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000776575f81815260208120601f850160051c81016020861015620007515750805b601f850160051c820191505b8181101562000772578281556001016200075d565b5050505b505050565b81516001600160401b03811115620007975762000797620006db565b620007af81620007a88454620006ef565b8462000729565b602080601f831160018114620007e5575f8415620007cd5750858301515b5f19600386901b1c1916600185901b17855562000772565b5f85815260208120601f198616915b828110156200081557888601518255948401946001909101908401620007f4565b50858210156200083357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61352b80620008515f395ff3fe608060405260043610610282575f3560e01c806353bddc4a1161015557806395d89b41116100be578063c876d0b911610078578063c876d0b9146107a8578063c9567bf9146107c1578063dd62ed3e146107d5578063ec762d7d14610819578063f2fde38b14610830578063f8e420c31461084f575f80fd5b806395d89b41146106be578063a8d55a12146106ea578063a9059cbb1461071e578063b7278c6d1461073d578063bf474bed1461077e578063c3c3960c14610793575f80fd5b8063723333561161010f578063723333561461060b578063751039fc1461062a578063757f78291461063e5780637d1db4a51461065d578063893d20e8146106725780638da5cb5b146106a2575f80fd5b806353bddc4a1461055c5780635ae88e85146105705780636c0a24eb1461058f5780636de7bcbd146105a457806370a08231146105c3578063715018a6146105f7575f80fd5b806319776fc2116101f75780633bbac579116101b15780633bbac5791461049f5780633c1975ff146104d6578063479831ef146104f5578063511423381461050a57806351bc3c8514610529578063523ef8e71461053d575f80fd5b806319776fc2146103fc5780631dd332e41461042a5780631ee2e6581461043e57806323b872dd146104515780633083091e14610470578063313ce56714610484575f80fd5b80630de81eb3116102485780630de81eb3146103545780630f7a11fe146103735780630faee56f146103925780631328ec9b146103a757806313cf2513146103d357806318160ddd146103e8575f80fd5b80625507521461028d5780630318c1dd146102a357806306fdde03146102ca5780630905311814610306578063095ea7b314610325575f80fd5b3661028957005b5f80fd5b348015610298575f80fd5b506102a1610864565b005b3480156102ae575f80fd5b506102b7601481565b6040519081526020015b60405180910390f35b3480156102d5575f80fd5b5060408051808201909152600b81526a4368616d656c656f6e474f60a81b60208201525b6040516102c19190612bb1565b348015610311575f80fd5b506102a1610320366004612bc3565b6108a7565b348015610330575f80fd5b5061034461033f366004612bee565b6108d5565b60405190151581526020016102c1565b34801561035f575f80fd5b506102a161036e366004612bc3565b6108eb565b34801561037e575f80fd5b506102a161038d366004612bc3565b610919565b34801561039d575f80fd5b506102b760145481565b3480156103b2575f80fd5b506103c66103c1366004612bc3565b610967565b6040516102c19190612c18565b3480156103de575f80fd5b506102b7601a5481565b3480156103f3575f80fd5b506102b7610b04565b348015610407575f80fd5b506102b7610416366004612bc3565b5f9081526016602052604090206002015490565b348015610435575f80fd5b506102a1610b23565b6102b761044c366004612d34565b610bbc565b34801561045c575f80fd5b5061034461046b366004612da3565b610f67565b34801561047b575f80fd5b506102b7600781565b34801561048f575f80fd5b50604051600a81526020016102c1565b3480156104aa575f80fd5b506103446104b9366004612de1565b6001600160a01b03165f9081526005602052604090205460ff1690565b3480156104e1575f80fd5b506102a16104f0366004612dfc565b610fce565b348015610500575f80fd5b506102b760155481565b348015610515575f80fd5b50610344610524366004612e1c565b611002565b348015610534575f80fd5b506102a1611228565b348015610548575f80fd5b506102a1610557366004612dfc565b61127e565b348015610567575f80fd5b506102a16112b2565b34801561057b575f80fd5b5061034461058a366004612e4b565b6112ea565b34801561059a575f80fd5b506102b760125481565b3480156105af575f80fd5b506102a16105be366004612e8b565b6113b7565b3480156105ce575f80fd5b506102b76105dd366004612de1565b6001600160a01b03165f9081526002602052604090205490565b348015610602575f80fd5b506102a1611445565b348015610616575f80fd5b506102a1610625366004612dfc565b611479565b348015610635575f80fd5b506102a16114ad565b348015610649575f80fd5b50610344610658366004612de1565b611565565b348015610668575f80fd5b506102b760115481565b34801561067d575f80fd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020016102c1565b3480156106ad575f80fd5b505f546001600160a01b031661068a565b3480156106c9575f80fd5b506040805180820190915260048152634348414d60e01b60208201526102f9565b3480156106f5575f80fd5b506102b7610704366004612de1565b6001600160a01b03165f9081526018602052604090205490565b348015610729575f80fd5b50610344610738366004612bee565b611c1c565b348015610748575f80fd5b506102b7610757366004612bee565b6001600160a01b03919091165f908152601760209081526040808320938352929052205490565b348015610789575f80fd5b506102b760135481565b34801561079e575f80fd5b506102b7601b5481565b3480156107b3575f80fd5b506007546103449060ff1681565b3480156107cc575f80fd5b506102a1611c28565b3480156107e0575f80fd5b506102b76107ef366004612f38565b6001600160a01b039182165f90815260036020908152604080832093909416825291909152205490565b348015610824575f80fd5b50601c5460ff16610344565b34801561083b575f80fd5b506102a161084a366004612de1565b611cc8565b34801561085a575f80fd5b506102b7601d5481565b5f546001600160a01b031633146108965760405162461bcd60e51b815260040161088d90612f6f565b60405180910390fd5b601c805461ff001916610100179055565b5f546001600160a01b031633146108d05760405162461bcd60e51b815260040161088d90612f6f565b601555565b5f6108e1338484611d62565b5060015b92915050565b5f546001600160a01b031633146109145760405162461bcd60e51b815260040161088d90612f6f565b600f55565b335f818152601860209081526040918290208490558151928352820183905280517f5c152b64f8c506bcf9e1cb889e53e0107611ee665160f0b61c2297088de8fb599281900390910190a150565b61099f6040518060a0016040528060608152602001606081526020015f81526020015f6001600160a01b031681526020015f81525090565b5f8281526016602052604090819020815160a081019092528054829082906109c690612fa4565b80601f01602080910402602001604051908101604052809291908181526020018280546109f290612fa4565b8015610a3d5780601f10610a1457610100808354040283529160200191610a3d565b820191905f5260205f20905b815481529060010190602001808311610a2057829003601f168201915b50505050508152602001600182018054610a5690612fa4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290612fa4565b8015610acd5780601f10610aa457610100808354040283529160200191610acd565b820191905f5260205f20905b815481529060010190602001808311610ab057829003601f168201915b50505091835250506002820154602082015260038201546001600160a01b0316604082015260049091015460609091015292915050565b5f610b10600a806130ca565b610b1e90633b9aca006130d8565b905090565b600154600203610b4657604051630ddf739360e11b815260040160405180910390fd5b6002600155601c5460ff16610b9d5760405162461bcd60e51b815260206004820152601e60248201527f4368616d656c656f6e2053776170206e6f7420656e61626c6564207965740000604482015260640161088d565b335f908152601960205260409020600401805460ff1916905560018055565b5f600154600203610be057604051630ddf739360e11b815260040160405180910390fd5b60026001555f546001600160a01b0316331480610cc157601c5460ff16610c6f5760405162461bcd60e51b815260206004820152603f60248201527f5075626c696320617661746172206372656174696f6e206973206f6e6c79206160448201527f6c6c6f77656420616674657220746865206c61756e6368206973206f76657200606482015260840161088d565b601554341015610cc15760405162461bcd60e51b815260206004820152601b60248201527f417661746172206372656174696f6e2074617820696e76616c69640000000000604482015260640161088d565b601c5460ff1615610d0557335f908152601760209081526040808320868452909152902054841115610d055760405162461bcd60e51b815260040161088d906130ef565b601486511115610d465760405162461bcd60e51b815260206004820152600c60248201526b4e616d6520746f6f2062696760a01b604482015260640161088d565b600785511115610d895760405162461bcd60e51b815260206004820152600e60248201526d53796d626f6c20746f6f2062696760901b604482015260640161088d565b610daf85604051806040016040528060048152602001634348414d60e01b815250611e85565b15610dfc5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742075736520746869732073796d626f6c206e616d650000000000604482015260640161088d565b601d5f8154610e0a90613138565b90915550601d545f90815260166020526040902080610e29888261319e565b5080610e35878261319e565b50601c5460ff16610e46575f610e48565b845b6002820155601c5460ff16610e5d5730610e5f565b335b6003820180546001600160a01b0319166001600160a01b0392909216919091179055426004820155601c5460ff1615610f1657335f90815260176020908152604080832087845290915281208054879290610ebb90849061325a565b90915550505f8481526016602052604081206002018054879290610ee090849061325a565b9091555050335f908152601760209081526040808320601d54845290915281208054879290610f1090849061326d565b90915550505b7fe8ab21509695e00c50cca7733420dfa88df9557ee785c48dcd59a0c472fd06083388888888604051610f4d959493929190613280565b60405180910390a15050601d546001805595945050505050565b5f610f73848484611edd565b610fc48433610fbf856040518060600160405280602881526020016134ce602891396001600160a01b038a165f9081526003602090815260408083203384529091529020549190612774565b611d62565b5060019392505050565b5f546001600160a01b03163314610ff75760405162461bcd60e51b815260040161088d90612f6f565b600891909155600955565b5f60015460020361102657604051630ddf739360e11b815260040160405180910390fd5b6002600155601c5460ff1661104d5760405162461bcd60e51b815260040161088d906132ca565b5f85116110aa5760405162461bcd60e51b815260206004820152602560248201527f53656e6420616d6f756e74206d7573742062652067726561746572207468616e604482015264207a65726f60d81b606482015260840161088d565b5f831161110a5760405162461bcd60e51b815260206004820152602860248201527f5265636569766520616d6f756e74206d7573742062652067726561746572207460448201526768616e207a65726f60c01b606482015260840161088d565b8184036111595760405162461bcd60e51b815260206004820181905260248201527f5472616465642061766174617273206d75737420626520646966666572656e74604482015260640161088d565b335f9081526017602090815260408083208784529091529020548511156111925760405162461bcd60e51b815260040161088d90613327565b335f818152601960209081526040918290206001808201899055898255600282018890556003820187905560048201805460ff1916909117905582519384529083018890529082018690526060820185905260808201849052907f93bd2b90cf210a5272dc65c2759d3850d0cac0a09d93b86cdea7e52652ac78639060a00160405180910390a150506001808055949350505050565b60075461010090046001600160a01b0316336001600160a01b03161461124c575f80fd5b305f90815260026020526040902054801561126a5761126a816127ac565b47801561127a5761127a81612935565b5050565b5f546001600160a01b031633146112a75760405162461bcd60e51b815260040161088d90612f6f565b600a91909155600b55565b5f546001600160a01b031633146112db5760405162461bcd60e51b815260040161088d90612f6f565b601c805460ff19166001179055565b601c545f9060ff1661130e5760405162461bcd60e51b815260040161088d906132ca565b61131a85858585611002565b6113665760405162461bcd60e51b815260206004820152601b60248201527f496e76616c696420547261646520417574686f72697a6174696f6e0000000000604482015260640161088d565b61136f86611565565b6113ab5760405162461bcd60e51b815260206004820152600d60248201526c4572726f722074726164696e6760981b604482015260640161088d565b50600195945050505050565b5f546001600160a01b031633146113e05760405162461bcd60e51b815260040161088d90612f6f565b5f5b815181101561127a57600160055f84848151811061140257611402613369565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790558061143d81613138565b9150506113e2565b5f546001600160a01b0316331461146e5760405162461bcd60e51b815260040161088d90612f6f565b6114775f612970565b565b5f546001600160a01b031633146114a25760405162461bcd60e51b815260040161088d90612f6f565b600c91909155600d55565b5f546001600160a01b031633146114d65760405162461bcd60e51b815260040161088d90612f6f565b6114e1600a806130ca565b6114ef90633b9aca006130d8565b6011556114fd600a806130ca565b61150b90633b9aca006130d8565b6012556007805460ff191690557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf611544600a806130ca565b61155290633b9aca006130d8565b60405190815260200160405180910390a1565b5f60015460020361158957604051630ddf739360e11b815260040160405180910390fd5b6002600155601c5460ff166115b05760405162461bcd60e51b815260040161088d906132ca565b6001600160a01b0382166115d65760405162461bcd60e51b815260040161088d9061337d565b335f908152601960205260408082206001600160a01b03851683529120600482015460ff16801561160b5750600481015460ff165b61166f5760405162461bcd60e51b815260206004820152602f60248201527f417574686f72697a6174696f6e20686173206e6f74206265656e20616c6c6f7760448201526e1959081bdc881a5b9a5d1a585d1959608a1b606482015260840161088d565b6002810154825414801561168a575080600301548260010154145b801561169a575080546002830154145b80156116ad575080600101548260030154145b6116e95760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420747261646560981b604482015260640161088d565b8154158015906116f95750805415155b6117155760405162461bcd60e51b815260040161088d906133c0565b8154335f9081526017602090815260408083206001870154845290915290205410156117535760405162461bcd60e51b815260040161088d90613327565b80546001600160a01b0385165f9081526017602090815260408083206001860154845290915290205410156117d65760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e742062616c616e6365206f6620746865207265636560448201526334bb32b960e11b606482015260840161088d565b6003808301545f9081526016602052604080822083015484840154835290822090920154909182916001600160a01b03918216911633301415806118235750336001600160a01b03831614155b1561184f5761184c6064611846600f5489600201546129bf90919063ffffffff16565b90612a44565b93505b6001600160a01b038816301415806118795750806001600160a01b0316886001600160a01b031614155b1561189f5761189c6064611846600f5488600201546129bf90919063ffffffff16565b92505b84546118cf906118af9086612a85565b8754335f908152600260205260409020546118c991612a85565b90612ac6565b335f9081526002602090815260408083209390935588546017825283832060018b015484529091529190205461190491612a85565b335f90815260176020908152604080832060018b015484529091529020558454611956906119329086612a85565b335f90815260176020908152604080832060038c0154845290915290205490612ac6565b335f90815260176020908152604080832060038b0154845290915290205583156119fe576001600160a01b0382165f9081526002602052604090205461199c9085612ac6565b6001600160a01b0383165f908152600260209081526040808320939093556017815282822060038a01548352905220546119d69085612ac6565b6001600160a01b0383165f90815260176020908152604080832060038b015484529091529020555b8554611a3190611a0e9085612a85565b86546001600160a01b038b165f908152600260205260409020546118c991612a85565b6001600160a01b0389165f9081526002602090815260408083209390935587546017825283832060018a0154845290915291902054611a6f91612a85565b6001600160a01b0389165f90815260176020908152604080832060018a015484529091529020558554611ad390611aa69085612a85565b6001600160a01b038a165f90815260176020908152604080832060038b0154845290915290205490612ac6565b6001600160a01b0389165f90815260176020908152604080832060038a015484529091529020558215611b84576001600160a01b0381165f90815260026020526040902054611b229084612ac6565b6001600160a01b0382165f90815260026020908152604080832093909355601781528282206003890154835290522054611b5c9084612ac6565b6001600160a01b0382165f90815260176020908152604080832060038a015484529091529020555b6004868101805460ff19908116909155908601805490911690558554600187015460028801546003890154604080513381526001600160a01b038e166020820152908101949094526060840192909252608083015260a08201527f02ed71be4566f1d6694a18e8299079d06ec28fb5cf1f4abbcf361acbebed1ee89060c00160405180910390a1505060018080559695505050505050565b5f6108e1338484611edd565b5f546001600160a01b03163314611c515760405162461bcd60e51b815260040161088d90612f6f565b601f54600160a01b900460ff1615611cab5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604482015260640161088d565b601f805462ff00ff60a01b19166201000160a01b17905543602055565b5f546001600160a01b03163314611cf15760405162461bcd60e51b815260040161088d90612f6f565b6001600160a01b038116611d565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088d565b611d5f81612970565b50565b6001600160a01b038316611dc45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161088d565b6001600160a01b038216611e255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161088d565b6001600160a01b038381165f8181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f81604051602001611e979190613409565b6040516020818303038152906040528051906020012083604051602001611ebe9190613409565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b038316611f415760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161088d565b6001600160a01b038216611f675760405162461bcd60e51b815260040161088d9061337d565b5f8111611f865760405162461bcd60e51b815260040161088d906133c0565b5f6001600160a01b0384163014801590611fae5750601e546001600160a01b03858116911614155b8015611fc85750601f546001600160a01b03858116911614155b90505f6001600160a01b0384163014801590611ff25750601e546001600160a01b03858116911614155b801561200c5750601f546001600160a01b03858116911614155b90505f808315612064576001600160a01b0387165f9081526018602090815260408083205460178352818420818552909252909120549092508511156120645760405162461bcd60e51b815260040161088d906130ef565b83801561206e5750825b156120765750805b601c5460ff161580156120865750825b156120905750601d545b5f80546001600160a01b038981169116148015906120bb57505f546001600160a01b03888116911614155b156124e1576001600160a01b0388165f9081526005602052604090205460ff16156120e4575f80fd5b60075460ff161561219b57601e546001600160a01b0388811691161480159061211b5750601f546001600160a01b03888116911614155b1561219b57325f9081526006602052604090205443116121895760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f6044820152633bb2b21760e11b606482015260840161088d565b325f9081526006602052604090204390555b601f546001600160a01b0389811691161480156121c65750601e546001600160a01b03888116911614155b80156121ea57506001600160a01b0387165f9081526004602052604090205460ff16155b156123055760115486111561223d5760405162461bcd60e51b815260206004820152601960248201527822bc31b2b2b239903a3432902fb6b0bc2a3c20b6b7bab73a1760391b604482015260640161088d565b6012548661225f896001600160a01b03165f9081526002602052604090205490565b612269919061326d565b11156122b75760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e000000000000604482015260640161088d565b4360205460036122c7919061326d565b11156122f0576001600160a01b0387165f908152600560205260409020805460ff191660011790555b600e8054905f6122ff83613138565b91905055505b6001600160a01b0387165f9081526005602052604090205461236a906064906118469060ff1661236057601c5460ff1661235857601c54610100900460ff1661235057600854612363565b600a54612363565b600c54612363565b60315b89906129bf565b601f549091506001600160a01b03888116911614801561239357506001600160a01b0388163014155b15612444576011548611156123e65760405162461bcd60e51b815260206004820152601960248201527822bc31b2b2b239903a3432902fb6b0bc2a3c20b6b7bab73a1760391b604482015260640161088d565b6001600160a01b0388165f90815260056020526040902054612441906064906118469060ff1661236057601c5460ff1661243957601c54610100900460ff1661243157600954612363565b600b54612363565b600d54612363565b90505b305f90815260026020526040902054601f54600160a81b900460ff1615801561247a5750601f546001600160a01b038981169116145b801561248f5750601f54600160b01b900460ff165b801561249c575060135481115b80156124ab5750601054600e54115b156124df576124cd6124c8886124c384601454612b24565b612b24565b6127ac565b4780156124dd576124dd47612935565b505b505b801561255957305f908152600260205260409020546125009082612ac6565b305f81815260026020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125509085815260200190565b60405180910390a35b5f6125648783612a85565b6001600160a01b038a165f908152600260205260409020549091506125899088612a85565b6001600160a01b03808b165f9081526002602052604080822093909355908a16815220546125b79082612ac6565b6001600160a01b0389165f908152600260205260409020558515612637576001600160a01b0389165f9081526017602090815260408083208784529091528120805489929061260790849061325a565b90915550505f848152601660205260408120600201805489929061262c90849061325a565b909155506126779050565b5f80805260166020527f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153df805489929061267190849061325a565b90915550505b84156126df576001600160a01b0388165f908152601760209081526040808320868452909152812080548392906126af90849061326d565b90915550505f83815260166020526040812060020180548392906126d490849061326d565b9091555061271f9050565b5f80805260166020527f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153df805483929061271990849061326d565b90915550505b6001600160a01b03808916908a167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6127588a86612a85565b60405190815260200160405180910390a3505050505050505050565b5f81848411156127975760405162461bcd60e51b815260040161088d9190612bb1565b505f6127a3848661325a565b95945050505050565b601f805460ff60a81b1916600160a81b179055801561292557601f54600160a01b900460ff1615612925576040805160028082526060820183525f9260208301908036833701905050905030815f8151811061280a5761280a613369565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612861573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128859190613424565b8160018151811061289857612898613369565b6001600160a01b039283166020918202929092010152601e546128be9130911684611d62565b601e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906128f69085905f9086903090429060040161343f565b5f604051808303815f87803b15801561290d575f80fd5b505af115801561291f573d5f803e3d5ffd5b50505050505b50601f805460ff60a81b19169055565b6007546040516101009091046001600160a01b0316906108fc8315029083905f818181858888f1935050505015801561127a573d5f803e3d5ffd5b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f825f036129ce57505f6108e5565b5f6129d983856130d8565b9050826129e685836134ae565b14612a3d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161088d565b9392505050565b5f612a3d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b38565b5f612a3d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612774565b5f80612ad2838561326d565b905083811015612a3d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161088d565b5f818311612b325782612a3d565b50919050565b5f8183612b585760405162461bcd60e51b815260040161088d9190612bb1565b505f6127a384866134ae565b5f5b83811015612b7e578181015183820152602001612b66565b50505f910152565b5f8151808452612b9d816020860160208601612b64565b601f01601f19169290920160200192915050565b602081525f612a3d6020830184612b86565b5f60208284031215612bd3575f80fd5b5035919050565b6001600160a01b0381168114611d5f575f80fd5b5f8060408385031215612bff575f80fd5b8235612c0a81612bda565b946020939093013593505050565b602081525f825160a06020840152612c3360c0840182612b86565b90506020840151601f19848303016040850152612c508282612b86565b9150506040840151606084015260018060a01b036060850151166080840152608084015160a08401528091505092915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612cc057612cc0612c83565b604052919050565b5f82601f830112612cd7575f80fd5b813567ffffffffffffffff811115612cf157612cf1612c83565b612d04601f8201601f1916602001612c97565b818152846020838601011115612d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215612d47575f80fd5b843567ffffffffffffffff80821115612d5e575f80fd5b612d6a88838901612cc8565b95506020870135915080821115612d7f575f80fd5b50612d8c87828801612cc8565b949794965050505060408301359260600135919050565b5f805f60608486031215612db5575f80fd5b8335612dc081612bda565b92506020840135612dd081612bda565b929592945050506040919091013590565b5f60208284031215612df1575f80fd5b8135612a3d81612bda565b5f8060408385031215612e0d575f80fd5b50508035926020909101359150565b5f805f8060808587031215612e2f575f80fd5b5050823594602084013594506040840135936060013592509050565b5f805f805f60a08688031215612e5f575f80fd5b8535612e6a81612bda565b97602087013597506040870135966060810135965060800135945092505050565b5f6020808385031215612e9c575f80fd5b823567ffffffffffffffff80821115612eb3575f80fd5b818501915085601f830112612ec6575f80fd5b813581811115612ed857612ed8612c83565b8060051b9150612ee9848301612c97565b8181529183018401918481019088841115612f02575f80fd5b938501935b83851015612f2c5784359250612f1c83612bda565b8282529385019390850190612f07565b98975050505050505050565b5f8060408385031215612f49575f80fd5b8235612f5481612bda565b91506020830135612f6481612bda565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612fb857607f821691505b602082108103612b3257634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561302457815f190482111561300a5761300a612fd6565b8085161561301757918102915b93841c9390800290612fef565b509250929050565b5f8261303a575060016108e5565b8161304657505f6108e5565b816001811461305c576002811461306657613082565b60019150506108e5565b60ff84111561307757613077612fd6565b50506001821b6108e5565b5060208310610133831016604e8410600b84101617156130a5575081810a6108e5565b6130af8383612fea565b805f19048211156130c2576130c2612fd6565b029392505050565b5f612a3d60ff84168361302c565b80820281158282048414176108e5576108e5612fd6565b60208082526029908201527f4e6f7420656e6f7567682062616c616e6365206f66207468652073656c65637460408201526832b21030bb30ba30b960b91b606082015260800190565b5f6001820161314957613149612fd6565b5060010190565b601f821115613199575f81815260208120601f850160051c810160208610156131765750805b601f850160051c820191505b8181101561319557828155600101613182565b5050505b505050565b815167ffffffffffffffff8111156131b8576131b8612c83565b6131cc816131c68454612fa4565b84613150565b602080601f8311600181146131ff575f84156131e85750858301515b5f19600386901b1c1916600185901b178555613195565b5f85815260208120601f198616915b8281101561322d5788860151825594840194600190910190840161320e565b508582101561324a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156108e5576108e5612fd6565b808201808211156108e5576108e5612fd6565b6001600160a01b038616815260a0602082018190525f906132a390830187612b86565b82810360408401526132b58187612b86565b60608401959095525050608001529392505050565b6020808252603a908201527f4368616d656c656f6e2053776170206e6f7420656e61626c6564207965742e2060408201527f5761697420666f7220746865206c61756e636820746f20656e64000000000000606082015260800190565b60208082526022908201527f496e73756666696369656e742062616c616e6365206f66207468652073656e6460408201526132b960f11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b5f825161341a818460208701612b64565b9190910192915050565b5f60208284031215613434575f80fd5b8151612a3d81612bda565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561348d5784516001600160a01b031683529383019391830191600101613468565b50506001600160a01b03969096166060850152505050608001529392505050565b5f826134c857634e487b7160e01b5f52601260045260245ffd5b50049056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212201a31022f7c37d74ed330bd5bfe7b0b7387cc575cd1c8ba5e2bc2e3e60d7f0ea364736f6c63430008140033

Deployed Bytecode

0x608060405260043610610282575f3560e01c806353bddc4a1161015557806395d89b41116100be578063c876d0b911610078578063c876d0b9146107a8578063c9567bf9146107c1578063dd62ed3e146107d5578063ec762d7d14610819578063f2fde38b14610830578063f8e420c31461084f575f80fd5b806395d89b41146106be578063a8d55a12146106ea578063a9059cbb1461071e578063b7278c6d1461073d578063bf474bed1461077e578063c3c3960c14610793575f80fd5b8063723333561161010f578063723333561461060b578063751039fc1461062a578063757f78291461063e5780637d1db4a51461065d578063893d20e8146106725780638da5cb5b146106a2575f80fd5b806353bddc4a1461055c5780635ae88e85146105705780636c0a24eb1461058f5780636de7bcbd146105a457806370a08231146105c3578063715018a6146105f7575f80fd5b806319776fc2116101f75780633bbac579116101b15780633bbac5791461049f5780633c1975ff146104d6578063479831ef146104f5578063511423381461050a57806351bc3c8514610529578063523ef8e71461053d575f80fd5b806319776fc2146103fc5780631dd332e41461042a5780631ee2e6581461043e57806323b872dd146104515780633083091e14610470578063313ce56714610484575f80fd5b80630de81eb3116102485780630de81eb3146103545780630f7a11fe146103735780630faee56f146103925780631328ec9b146103a757806313cf2513146103d357806318160ddd146103e8575f80fd5b80625507521461028d5780630318c1dd146102a357806306fdde03146102ca5780630905311814610306578063095ea7b314610325575f80fd5b3661028957005b5f80fd5b348015610298575f80fd5b506102a1610864565b005b3480156102ae575f80fd5b506102b7601481565b6040519081526020015b60405180910390f35b3480156102d5575f80fd5b5060408051808201909152600b81526a4368616d656c656f6e474f60a81b60208201525b6040516102c19190612bb1565b348015610311575f80fd5b506102a1610320366004612bc3565b6108a7565b348015610330575f80fd5b5061034461033f366004612bee565b6108d5565b60405190151581526020016102c1565b34801561035f575f80fd5b506102a161036e366004612bc3565b6108eb565b34801561037e575f80fd5b506102a161038d366004612bc3565b610919565b34801561039d575f80fd5b506102b760145481565b3480156103b2575f80fd5b506103c66103c1366004612bc3565b610967565b6040516102c19190612c18565b3480156103de575f80fd5b506102b7601a5481565b3480156103f3575f80fd5b506102b7610b04565b348015610407575f80fd5b506102b7610416366004612bc3565b5f9081526016602052604090206002015490565b348015610435575f80fd5b506102a1610b23565b6102b761044c366004612d34565b610bbc565b34801561045c575f80fd5b5061034461046b366004612da3565b610f67565b34801561047b575f80fd5b506102b7600781565b34801561048f575f80fd5b50604051600a81526020016102c1565b3480156104aa575f80fd5b506103446104b9366004612de1565b6001600160a01b03165f9081526005602052604090205460ff1690565b3480156104e1575f80fd5b506102a16104f0366004612dfc565b610fce565b348015610500575f80fd5b506102b760155481565b348015610515575f80fd5b50610344610524366004612e1c565b611002565b348015610534575f80fd5b506102a1611228565b348015610548575f80fd5b506102a1610557366004612dfc565b61127e565b348015610567575f80fd5b506102a16112b2565b34801561057b575f80fd5b5061034461058a366004612e4b565b6112ea565b34801561059a575f80fd5b506102b760125481565b3480156105af575f80fd5b506102a16105be366004612e8b565b6113b7565b3480156105ce575f80fd5b506102b76105dd366004612de1565b6001600160a01b03165f9081526002602052604090205490565b348015610602575f80fd5b506102a1611445565b348015610616575f80fd5b506102a1610625366004612dfc565b611479565b348015610635575f80fd5b506102a16114ad565b348015610649575f80fd5b50610344610658366004612de1565b611565565b348015610668575f80fd5b506102b760115481565b34801561067d575f80fd5b505f546001600160a01b03165b6040516001600160a01b0390911681526020016102c1565b3480156106ad575f80fd5b505f546001600160a01b031661068a565b3480156106c9575f80fd5b506040805180820190915260048152634348414d60e01b60208201526102f9565b3480156106f5575f80fd5b506102b7610704366004612de1565b6001600160a01b03165f9081526018602052604090205490565b348015610729575f80fd5b50610344610738366004612bee565b611c1c565b348015610748575f80fd5b506102b7610757366004612bee565b6001600160a01b03919091165f908152601760209081526040808320938352929052205490565b348015610789575f80fd5b506102b760135481565b34801561079e575f80fd5b506102b7601b5481565b3480156107b3575f80fd5b506007546103449060ff1681565b3480156107cc575f80fd5b506102a1611c28565b3480156107e0575f80fd5b506102b76107ef366004612f38565b6001600160a01b039182165f90815260036020908152604080832093909416825291909152205490565b348015610824575f80fd5b50601c5460ff16610344565b34801561083b575f80fd5b506102a161084a366004612de1565b611cc8565b34801561085a575f80fd5b506102b7601d5481565b5f546001600160a01b031633146108965760405162461bcd60e51b815260040161088d90612f6f565b60405180910390fd5b601c805461ff001916610100179055565b5f546001600160a01b031633146108d05760405162461bcd60e51b815260040161088d90612f6f565b601555565b5f6108e1338484611d62565b5060015b92915050565b5f546001600160a01b031633146109145760405162461bcd60e51b815260040161088d90612f6f565b600f55565b335f818152601860209081526040918290208490558151928352820183905280517f5c152b64f8c506bcf9e1cb889e53e0107611ee665160f0b61c2297088de8fb599281900390910190a150565b61099f6040518060a0016040528060608152602001606081526020015f81526020015f6001600160a01b031681526020015f81525090565b5f8281526016602052604090819020815160a081019092528054829082906109c690612fa4565b80601f01602080910402602001604051908101604052809291908181526020018280546109f290612fa4565b8015610a3d5780601f10610a1457610100808354040283529160200191610a3d565b820191905f5260205f20905b815481529060010190602001808311610a2057829003601f168201915b50505050508152602001600182018054610a5690612fa4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290612fa4565b8015610acd5780601f10610aa457610100808354040283529160200191610acd565b820191905f5260205f20905b815481529060010190602001808311610ab057829003601f168201915b50505091835250506002820154602082015260038201546001600160a01b0316604082015260049091015460609091015292915050565b5f610b10600a806130ca565b610b1e90633b9aca006130d8565b905090565b600154600203610b4657604051630ddf739360e11b815260040160405180910390fd5b6002600155601c5460ff16610b9d5760405162461bcd60e51b815260206004820152601e60248201527f4368616d656c656f6e2053776170206e6f7420656e61626c6564207965740000604482015260640161088d565b335f908152601960205260409020600401805460ff1916905560018055565b5f600154600203610be057604051630ddf739360e11b815260040160405180910390fd5b60026001555f546001600160a01b0316331480610cc157601c5460ff16610c6f5760405162461bcd60e51b815260206004820152603f60248201527f5075626c696320617661746172206372656174696f6e206973206f6e6c79206160448201527f6c6c6f77656420616674657220746865206c61756e6368206973206f76657200606482015260840161088d565b601554341015610cc15760405162461bcd60e51b815260206004820152601b60248201527f417661746172206372656174696f6e2074617820696e76616c69640000000000604482015260640161088d565b601c5460ff1615610d0557335f908152601760209081526040808320868452909152902054841115610d055760405162461bcd60e51b815260040161088d906130ef565b601486511115610d465760405162461bcd60e51b815260206004820152600c60248201526b4e616d6520746f6f2062696760a01b604482015260640161088d565b600785511115610d895760405162461bcd60e51b815260206004820152600e60248201526d53796d626f6c20746f6f2062696760901b604482015260640161088d565b610daf85604051806040016040528060048152602001634348414d60e01b815250611e85565b15610dfc5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742075736520746869732073796d626f6c206e616d650000000000604482015260640161088d565b601d5f8154610e0a90613138565b90915550601d545f90815260166020526040902080610e29888261319e565b5080610e35878261319e565b50601c5460ff16610e46575f610e48565b845b6002820155601c5460ff16610e5d5730610e5f565b335b6003820180546001600160a01b0319166001600160a01b0392909216919091179055426004820155601c5460ff1615610f1657335f90815260176020908152604080832087845290915281208054879290610ebb90849061325a565b90915550505f8481526016602052604081206002018054879290610ee090849061325a565b9091555050335f908152601760209081526040808320601d54845290915281208054879290610f1090849061326d565b90915550505b7fe8ab21509695e00c50cca7733420dfa88df9557ee785c48dcd59a0c472fd06083388888888604051610f4d959493929190613280565b60405180910390a15050601d546001805595945050505050565b5f610f73848484611edd565b610fc48433610fbf856040518060600160405280602881526020016134ce602891396001600160a01b038a165f9081526003602090815260408083203384529091529020549190612774565b611d62565b5060019392505050565b5f546001600160a01b03163314610ff75760405162461bcd60e51b815260040161088d90612f6f565b600891909155600955565b5f60015460020361102657604051630ddf739360e11b815260040160405180910390fd5b6002600155601c5460ff1661104d5760405162461bcd60e51b815260040161088d906132ca565b5f85116110aa5760405162461bcd60e51b815260206004820152602560248201527f53656e6420616d6f756e74206d7573742062652067726561746572207468616e604482015264207a65726f60d81b606482015260840161088d565b5f831161110a5760405162461bcd60e51b815260206004820152602860248201527f5265636569766520616d6f756e74206d7573742062652067726561746572207460448201526768616e207a65726f60c01b606482015260840161088d565b8184036111595760405162461bcd60e51b815260206004820181905260248201527f5472616465642061766174617273206d75737420626520646966666572656e74604482015260640161088d565b335f9081526017602090815260408083208784529091529020548511156111925760405162461bcd60e51b815260040161088d90613327565b335f818152601960209081526040918290206001808201899055898255600282018890556003820187905560048201805460ff1916909117905582519384529083018890529082018690526060820185905260808201849052907f93bd2b90cf210a5272dc65c2759d3850d0cac0a09d93b86cdea7e52652ac78639060a00160405180910390a150506001808055949350505050565b60075461010090046001600160a01b0316336001600160a01b03161461124c575f80fd5b305f90815260026020526040902054801561126a5761126a816127ac565b47801561127a5761127a81612935565b5050565b5f546001600160a01b031633146112a75760405162461bcd60e51b815260040161088d90612f6f565b600a91909155600b55565b5f546001600160a01b031633146112db5760405162461bcd60e51b815260040161088d90612f6f565b601c805460ff19166001179055565b601c545f9060ff1661130e5760405162461bcd60e51b815260040161088d906132ca565b61131a85858585611002565b6113665760405162461bcd60e51b815260206004820152601b60248201527f496e76616c696420547261646520417574686f72697a6174696f6e0000000000604482015260640161088d565b61136f86611565565b6113ab5760405162461bcd60e51b815260206004820152600d60248201526c4572726f722074726164696e6760981b604482015260640161088d565b50600195945050505050565b5f546001600160a01b031633146113e05760405162461bcd60e51b815260040161088d90612f6f565b5f5b815181101561127a57600160055f84848151811061140257611402613369565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790558061143d81613138565b9150506113e2565b5f546001600160a01b0316331461146e5760405162461bcd60e51b815260040161088d90612f6f565b6114775f612970565b565b5f546001600160a01b031633146114a25760405162461bcd60e51b815260040161088d90612f6f565b600c91909155600d55565b5f546001600160a01b031633146114d65760405162461bcd60e51b815260040161088d90612f6f565b6114e1600a806130ca565b6114ef90633b9aca006130d8565b6011556114fd600a806130ca565b61150b90633b9aca006130d8565b6012556007805460ff191690557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf611544600a806130ca565b61155290633b9aca006130d8565b60405190815260200160405180910390a1565b5f60015460020361158957604051630ddf739360e11b815260040160405180910390fd5b6002600155601c5460ff166115b05760405162461bcd60e51b815260040161088d906132ca565b6001600160a01b0382166115d65760405162461bcd60e51b815260040161088d9061337d565b335f908152601960205260408082206001600160a01b03851683529120600482015460ff16801561160b5750600481015460ff165b61166f5760405162461bcd60e51b815260206004820152602f60248201527f417574686f72697a6174696f6e20686173206e6f74206265656e20616c6c6f7760448201526e1959081bdc881a5b9a5d1a585d1959608a1b606482015260840161088d565b6002810154825414801561168a575080600301548260010154145b801561169a575080546002830154145b80156116ad575080600101548260030154145b6116e95760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420747261646560981b604482015260640161088d565b8154158015906116f95750805415155b6117155760405162461bcd60e51b815260040161088d906133c0565b8154335f9081526017602090815260408083206001870154845290915290205410156117535760405162461bcd60e51b815260040161088d90613327565b80546001600160a01b0385165f9081526017602090815260408083206001860154845290915290205410156117d65760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e742062616c616e6365206f6620746865207265636560448201526334bb32b960e11b606482015260840161088d565b6003808301545f9081526016602052604080822083015484840154835290822090920154909182916001600160a01b03918216911633301415806118235750336001600160a01b03831614155b1561184f5761184c6064611846600f5489600201546129bf90919063ffffffff16565b90612a44565b93505b6001600160a01b038816301415806118795750806001600160a01b0316886001600160a01b031614155b1561189f5761189c6064611846600f5488600201546129bf90919063ffffffff16565b92505b84546118cf906118af9086612a85565b8754335f908152600260205260409020546118c991612a85565b90612ac6565b335f9081526002602090815260408083209390935588546017825283832060018b015484529091529190205461190491612a85565b335f90815260176020908152604080832060018b015484529091529020558454611956906119329086612a85565b335f90815260176020908152604080832060038c0154845290915290205490612ac6565b335f90815260176020908152604080832060038b0154845290915290205583156119fe576001600160a01b0382165f9081526002602052604090205461199c9085612ac6565b6001600160a01b0383165f908152600260209081526040808320939093556017815282822060038a01548352905220546119d69085612ac6565b6001600160a01b0383165f90815260176020908152604080832060038b015484529091529020555b8554611a3190611a0e9085612a85565b86546001600160a01b038b165f908152600260205260409020546118c991612a85565b6001600160a01b0389165f9081526002602090815260408083209390935587546017825283832060018a0154845290915291902054611a6f91612a85565b6001600160a01b0389165f90815260176020908152604080832060018a015484529091529020558554611ad390611aa69085612a85565b6001600160a01b038a165f90815260176020908152604080832060038b0154845290915290205490612ac6565b6001600160a01b0389165f90815260176020908152604080832060038a015484529091529020558215611b84576001600160a01b0381165f90815260026020526040902054611b229084612ac6565b6001600160a01b0382165f90815260026020908152604080832093909355601781528282206003890154835290522054611b5c9084612ac6565b6001600160a01b0382165f90815260176020908152604080832060038a015484529091529020555b6004868101805460ff19908116909155908601805490911690558554600187015460028801546003890154604080513381526001600160a01b038e166020820152908101949094526060840192909252608083015260a08201527f02ed71be4566f1d6694a18e8299079d06ec28fb5cf1f4abbcf361acbebed1ee89060c00160405180910390a1505060018080559695505050505050565b5f6108e1338484611edd565b5f546001600160a01b03163314611c515760405162461bcd60e51b815260040161088d90612f6f565b601f54600160a01b900460ff1615611cab5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604482015260640161088d565b601f805462ff00ff60a01b19166201000160a01b17905543602055565b5f546001600160a01b03163314611cf15760405162461bcd60e51b815260040161088d90612f6f565b6001600160a01b038116611d565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088d565b611d5f81612970565b50565b6001600160a01b038316611dc45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161088d565b6001600160a01b038216611e255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161088d565b6001600160a01b038381165f8181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f81604051602001611e979190613409565b6040516020818303038152906040528051906020012083604051602001611ebe9190613409565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b038316611f415760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161088d565b6001600160a01b038216611f675760405162461bcd60e51b815260040161088d9061337d565b5f8111611f865760405162461bcd60e51b815260040161088d906133c0565b5f6001600160a01b0384163014801590611fae5750601e546001600160a01b03858116911614155b8015611fc85750601f546001600160a01b03858116911614155b90505f6001600160a01b0384163014801590611ff25750601e546001600160a01b03858116911614155b801561200c5750601f546001600160a01b03858116911614155b90505f808315612064576001600160a01b0387165f9081526018602090815260408083205460178352818420818552909252909120549092508511156120645760405162461bcd60e51b815260040161088d906130ef565b83801561206e5750825b156120765750805b601c5460ff161580156120865750825b156120905750601d545b5f80546001600160a01b038981169116148015906120bb57505f546001600160a01b03888116911614155b156124e1576001600160a01b0388165f9081526005602052604090205460ff16156120e4575f80fd5b60075460ff161561219b57601e546001600160a01b0388811691161480159061211b5750601f546001600160a01b03888116911614155b1561219b57325f9081526006602052604090205443116121895760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f6044820152633bb2b21760e11b606482015260840161088d565b325f9081526006602052604090204390555b601f546001600160a01b0389811691161480156121c65750601e546001600160a01b03888116911614155b80156121ea57506001600160a01b0387165f9081526004602052604090205460ff16155b156123055760115486111561223d5760405162461bcd60e51b815260206004820152601960248201527822bc31b2b2b239903a3432902fb6b0bc2a3c20b6b7bab73a1760391b604482015260640161088d565b6012548661225f896001600160a01b03165f9081526002602052604090205490565b612269919061326d565b11156122b75760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e000000000000604482015260640161088d565b4360205460036122c7919061326d565b11156122f0576001600160a01b0387165f908152600560205260409020805460ff191660011790555b600e8054905f6122ff83613138565b91905055505b6001600160a01b0387165f9081526005602052604090205461236a906064906118469060ff1661236057601c5460ff1661235857601c54610100900460ff1661235057600854612363565b600a54612363565b600c54612363565b60315b89906129bf565b601f549091506001600160a01b03888116911614801561239357506001600160a01b0388163014155b15612444576011548611156123e65760405162461bcd60e51b815260206004820152601960248201527822bc31b2b2b239903a3432902fb6b0bc2a3c20b6b7bab73a1760391b604482015260640161088d565b6001600160a01b0388165f90815260056020526040902054612441906064906118469060ff1661236057601c5460ff1661243957601c54610100900460ff1661243157600954612363565b600b54612363565b600d54612363565b90505b305f90815260026020526040902054601f54600160a81b900460ff1615801561247a5750601f546001600160a01b038981169116145b801561248f5750601f54600160b01b900460ff165b801561249c575060135481115b80156124ab5750601054600e54115b156124df576124cd6124c8886124c384601454612b24565b612b24565b6127ac565b4780156124dd576124dd47612935565b505b505b801561255957305f908152600260205260409020546125009082612ac6565b305f81815260026020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125509085815260200190565b60405180910390a35b5f6125648783612a85565b6001600160a01b038a165f908152600260205260409020549091506125899088612a85565b6001600160a01b03808b165f9081526002602052604080822093909355908a16815220546125b79082612ac6565b6001600160a01b0389165f908152600260205260409020558515612637576001600160a01b0389165f9081526017602090815260408083208784529091528120805489929061260790849061325a565b90915550505f848152601660205260408120600201805489929061262c90849061325a565b909155506126779050565b5f80805260166020527f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153df805489929061267190849061325a565b90915550505b84156126df576001600160a01b0388165f908152601760209081526040808320868452909152812080548392906126af90849061326d565b90915550505f83815260166020526040812060020180548392906126d490849061326d565b9091555061271f9050565b5f80805260166020527f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153df805483929061271990849061326d565b90915550505b6001600160a01b03808916908a167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6127588a86612a85565b60405190815260200160405180910390a3505050505050505050565b5f81848411156127975760405162461bcd60e51b815260040161088d9190612bb1565b505f6127a3848661325a565b95945050505050565b601f805460ff60a81b1916600160a81b179055801561292557601f54600160a01b900460ff1615612925576040805160028082526060820183525f9260208301908036833701905050905030815f8151811061280a5761280a613369565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612861573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128859190613424565b8160018151811061289857612898613369565b6001600160a01b039283166020918202929092010152601e546128be9130911684611d62565b601e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906128f69085905f9086903090429060040161343f565b5f604051808303815f87803b15801561290d575f80fd5b505af115801561291f573d5f803e3d5ffd5b50505050505b50601f805460ff60a81b19169055565b6007546040516101009091046001600160a01b0316906108fc8315029083905f818181858888f1935050505015801561127a573d5f803e3d5ffd5b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f825f036129ce57505f6108e5565b5f6129d983856130d8565b9050826129e685836134ae565b14612a3d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161088d565b9392505050565b5f612a3d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b38565b5f612a3d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612774565b5f80612ad2838561326d565b905083811015612a3d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161088d565b5f818311612b325782612a3d565b50919050565b5f8183612b585760405162461bcd60e51b815260040161088d9190612bb1565b505f6127a384866134ae565b5f5b83811015612b7e578181015183820152602001612b66565b50505f910152565b5f8151808452612b9d816020860160208601612b64565b601f01601f19169290920160200192915050565b602081525f612a3d6020830184612b86565b5f60208284031215612bd3575f80fd5b5035919050565b6001600160a01b0381168114611d5f575f80fd5b5f8060408385031215612bff575f80fd5b8235612c0a81612bda565b946020939093013593505050565b602081525f825160a06020840152612c3360c0840182612b86565b90506020840151601f19848303016040850152612c508282612b86565b9150506040840151606084015260018060a01b036060850151166080840152608084015160a08401528091505092915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612cc057612cc0612c83565b604052919050565b5f82601f830112612cd7575f80fd5b813567ffffffffffffffff811115612cf157612cf1612c83565b612d04601f8201601f1916602001612c97565b818152846020838601011115612d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215612d47575f80fd5b843567ffffffffffffffff80821115612d5e575f80fd5b612d6a88838901612cc8565b95506020870135915080821115612d7f575f80fd5b50612d8c87828801612cc8565b949794965050505060408301359260600135919050565b5f805f60608486031215612db5575f80fd5b8335612dc081612bda565b92506020840135612dd081612bda565b929592945050506040919091013590565b5f60208284031215612df1575f80fd5b8135612a3d81612bda565b5f8060408385031215612e0d575f80fd5b50508035926020909101359150565b5f805f8060808587031215612e2f575f80fd5b5050823594602084013594506040840135936060013592509050565b5f805f805f60a08688031215612e5f575f80fd5b8535612e6a81612bda565b97602087013597506040870135966060810135965060800135945092505050565b5f6020808385031215612e9c575f80fd5b823567ffffffffffffffff80821115612eb3575f80fd5b818501915085601f830112612ec6575f80fd5b813581811115612ed857612ed8612c83565b8060051b9150612ee9848301612c97565b8181529183018401918481019088841115612f02575f80fd5b938501935b83851015612f2c5784359250612f1c83612bda565b8282529385019390850190612f07565b98975050505050505050565b5f8060408385031215612f49575f80fd5b8235612f5481612bda565b91506020830135612f6481612bda565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612fb857607f821691505b602082108103612b3257634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561302457815f190482111561300a5761300a612fd6565b8085161561301757918102915b93841c9390800290612fef565b509250929050565b5f8261303a575060016108e5565b8161304657505f6108e5565b816001811461305c576002811461306657613082565b60019150506108e5565b60ff84111561307757613077612fd6565b50506001821b6108e5565b5060208310610133831016604e8410600b84101617156130a5575081810a6108e5565b6130af8383612fea565b805f19048211156130c2576130c2612fd6565b029392505050565b5f612a3d60ff84168361302c565b80820281158282048414176108e5576108e5612fd6565b60208082526029908201527f4e6f7420656e6f7567682062616c616e6365206f66207468652073656c65637460408201526832b21030bb30ba30b960b91b606082015260800190565b5f6001820161314957613149612fd6565b5060010190565b601f821115613199575f81815260208120601f850160051c810160208610156131765750805b601f850160051c820191505b8181101561319557828155600101613182565b5050505b505050565b815167ffffffffffffffff8111156131b8576131b8612c83565b6131cc816131c68454612fa4565b84613150565b602080601f8311600181146131ff575f84156131e85750858301515b5f19600386901b1c1916600185901b178555613195565b5f85815260208120601f198616915b8281101561322d5788860151825594840194600190910190840161320e565b508582101561324a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156108e5576108e5612fd6565b808201808211156108e5576108e5612fd6565b6001600160a01b038616815260a0602082018190525f906132a390830187612b86565b82810360408401526132b58187612b86565b60608401959095525050608001529392505050565b6020808252603a908201527f4368616d656c656f6e2053776170206e6f7420656e61626c6564207965742e2060408201527f5761697420666f7220746865206c61756e636820746f20656e64000000000000606082015260800190565b60208082526022908201527f496e73756666696369656e742062616c616e6365206f66207468652073656e6460408201526132b960f11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b5f825161341a818460208701612b64565b9190910192915050565b5f60208284031215613434575f80fd5b8151612a3d81612bda565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561348d5784516001600160a01b031683529383019391830191600101613468565b50506001600160a01b03969096166060850152505050608001529392505050565b5f826134c857634e487b7160e01b5f52601260045260245ffd5b50049056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212201a31022f7c37d74ed330bd5bfe7b0b7387cc575cd1c8ba5e2bc2e3e60d7f0ea364736f6c63430008140033

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.