S Price: $0.713079 (+5.96%)

Token

SonicSuperRain (SSR)

Overview

Max Total Supply

100,000,000 SSR

Holders

4

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 SSR

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
SonicSuperRain

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion
File 1 of 1 : SonicSuperRain.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

// Interface definitions
interface IERC20 {
    function totalSupply() external view returns (uint256);
    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);
}

interface IUniswapRouter {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

/**
 * @title SuperRain
 * @dev ERC20 token with reflection rewards in native currency
 */
contract SonicSuperRain {
    // Token setup
    string private _name = "SonicSuperRain";
    string private _symbol = "SSR";
    uint8 private constant _decimals = 18;
    uint256 private _totalSupply;
    
    // Reward token and router addresses
    address public REWARD_TOKEN;
    address constant private ROUTER = 0x95a7e403d7cF20F675fF9273D66e94d35ba49fA3; // ROUTER
    address public LP_PAIR;
    
    // Ownership
    address private _owner;
    
    // Balances and allowances
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    
    // Fee configuration
    uint256 public taxPercentage = 5; // 5% default tax
    uint256 public swapThreshold;
    
    // Reward distribution
    uint256 public distributionInterval = 300; // 5 minutes (in seconds)
    uint256 public batchSize = 50;
    uint256 public lastProcessedTime;
    uint256 public currentIndex;
    
    // Holder management
    address[] private holders;
    mapping(address => uint256) public holderIndexes;
    
    struct HolderInfo {
        uint256 amount;
        uint256 pendingRewards;
        uint256 totalExcluded;
    }
    
    mapping(address => HolderInfo) public holderInfo;
    
    // Rewards accounting - using higher precision for calculations
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public dividendsPerShare;
    uint256 private constant PRECISION_FACTOR = 1e18;
    
    // Special addresses
    mapping(address => bool) public excluded;
    mapping(address => bool) public exempt;
    
    // Control flags
    bool private inSwap;
    bool public tradingEnabled;
    
    // Events
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event SwapAndDistribute(uint256 tokenAmount, uint256 rewardAmount);
    event Excluded(address indexed account, bool status);
    event TaxUpdated(uint256 newTaxPercentage);
    event IntervalUpdated(uint256 newDistributionInterval);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event RewardsProcessed(uint256 holderCount);
    event RewardSent(address indexed holder, uint256 amount);
    event SharesUpdated(address indexed holder, uint256 amount);
    event TotalSharesUpdated(uint256 newValue);
    
    // Modifiers
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }
    
    modifier onlyOwner() {
        require(msg.sender == _owner, "Caller is not the owner");
        _;
    }
    
    // Constructor
    constructor() {
        _owner = msg.sender;
        
        // Initial supply
        _totalSupply = 100000000 * 10**_decimals;
        _balances[msg.sender] = _totalSupply;
        
        // Set default parameters
        swapThreshold = _totalSupply * 5 / 10000; // 0.05%
        
        // Set initial reward token address
        REWARD_TOKEN = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38; // WRAPPED_SONIC
        
        // Add owner to holders array
        _addHolder(_owner, _balances[_owner]);
        
        // Approve router for future swaps
        _approve(address(this), ROUTER, _totalSupply);
        
        emit Transfer(address(0), msg.sender, _totalSupply);
    }
    
    // External functions
    
    function setRewardToken(address newRewardToken) external onlyOwner {
        require(newRewardToken != address(0), "Reward token cannot be zero address");
        REWARD_TOKEN = newRewardToken;
    }
    
    function setLPPair(address newPair) external onlyOwner {
        require(newPair != address(0), "LP pair cannot be zero address");
        LP_PAIR = newPair;
    }
    
    function setTaxPercentage(uint256 newTaxPercentage) external onlyOwner {
        taxPercentage = newTaxPercentage;
        emit TaxUpdated(newTaxPercentage);
    }
    
    function setDistributionInterval(uint256 newInterval) external onlyOwner {
        require(newInterval >= 60, "Interval must be at least 60 seconds");
        distributionInterval = newInterval;
        emit IntervalUpdated(newInterval);
    }
    
    function setBatchSize(uint256 newBatchSize) external onlyOwner {
        require(newBatchSize >= 5 && newBatchSize <= 100, "Batch size must be between 5 and 100");
        batchSize = newBatchSize;
    }
    
    function setSwapThreshold(uint256 newThreshold) external onlyOwner {
        require(newThreshold > 0, "Threshold must be greater than 0");
        swapThreshold = newThreshold;
    }
    
    function setExcluded(address account, bool status) external onlyOwner {
        if (excluded[account] != status) {
            excluded[account] = status;
            if (status) {
                // If excluding an address, remove it from holders
                if (holderInfo[account].amount > 0) {
                    _removeHolder(account);
                }
            } else {
                // If including an address, add it to holders
                _setShare(account, balanceOf(account));
            }
        }
        emit Excluded(account, status);
    }
    
    function setExempt(address account, bool status) external onlyOwner {
        exempt[account] = status;
    }
    
    function enableTrading() external onlyOwner {
        require(!tradingEnabled, "Trading already enabled");
        tradingEnabled = true;
    }
    
    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "New owner cannot be zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    
    /**
     * @dev Manually swap a specified amount of tokens for rewards
     * @param amount Amount of tokens to swap (0 for custom calculation based on contract balance)
     * @return swapped Amount of tokens that were actually swapped
     * @return received Amount of reward tokens received from the swap
     */
    function manualSwap(uint256 amount) external onlyOwner returns (uint256 swapped, uint256 received) {
        uint256 contractBalance = balanceOf(address(this));
        require(contractBalance > 0, "No tokens to swap");
        
        // Determine swap amount based on parameters and contract balance
        uint256 swapAmount;
        if (amount > 0 && amount <= contractBalance) {
            // Use specified amount
            swapAmount = amount;
        } else if (swapThreshold > 0 && contractBalance >= swapThreshold) {
            // Use threshold amount
            swapAmount = swapThreshold;
        } else {
            // Use entire balance
            swapAmount = contractBalance;
        }
        
        // Execute the swap and track results
        uint256 receivedAmount = _swapTokensForRewards(swapAmount);
        
        return (swapAmount, receivedAmount);
    }
    
    /**
     * @dev Manually distribute rewards to holders - optimized for cron job
     * @param batchSize Number of holders to process (0 for default batchSize)
     * @return processed Number of holders processed
     * @return currentIdx Current index position after processing
     */
    function processRewards(uint256 batchSize) external returns (uint256 processed, uint256 currentIdx) {
        require(msg.sender == _owner, "Only owner can process rewards");
        
        // No holders to process
        if (holders.length == 0) return (0, 0);
        
        // Use specified batch size or default
        uint256 batchToProcess = batchSize > 0 ? batchSize : this.batchSize();
        
        // Cap at the number of holders
        if (currentIndex + batchToProcess > holders.length) {
            batchToProcess = holders.length - currentIndex;
        }
        
        if (batchToProcess == 0) {
            // Reset index and update timestamp if we've processed everyone
            currentIndex = 0;
            lastProcessedTime = block.timestamp;
            return (0, 0);
        }
        
        uint256 startIndex = currentIndex;
        uint256 endIndex = currentIndex + batchToProcess;
        
        // Process this batch of holders
        for (uint256 i = startIndex; i < endIndex; i++) {
            if (i < holders.length) {
                _distributeRewards(holders[i]);
            }
        }
        
        // Update current index
        currentIndex = endIndex;
        
        // If we've processed everyone, reset index and update timestamp
        if (currentIndex >= holders.length) {
            currentIndex = 0;
            lastProcessedTime = block.timestamp;
            emit RewardsProcessed(holders.length);
        }
        
        return (endIndex - startIndex, currentIndex);
    }
    
    /**
     * @dev Process rewards for ALL holders in one transaction
     * @return processed Number of holders processed
     */
    function processAllRewards() external onlyOwner returns (uint256 processed) {
        // No holders to process
        if (holders.length == 0) return 0;
        
        // Process all holders
        for (uint256 i = 0; i < holders.length; i++) {
            _distributeRewards(holders[i]);
        }
        
        // Reset index and update timestamp
        currentIndex = 0;
        lastProcessedTime = block.timestamp;
        emit RewardsProcessed(holders.length);
        
        return holders.length;
    }
    
    /**
     * @dev Fix totalShares calculation and recalculate dividends
     */
    function recalculateShares() external onlyOwner {
        // Reset totalShares
        totalShares = 0;
        
        // Recalculate from actual holder balances
        for (uint256 i = 0; i < holders.length; i++) {
            address holder = holders[i];
            uint256 balance = _balances[holder];
            holderInfo[holder].amount = balance;
            totalShares += balance;
        }
        
        // Recalculate dividendsPerShare if we have dividends
        if (totalDividends > 0 && totalShares > 0) {
            dividendsPerShare = totalDividends * PRECISION_FACTOR / totalShares;
        }
        
        emit TotalSharesUpdated(totalShares);
    }
    
    /**
     * @dev Returns the contract's current balance of RAIN tokens available for swapping
     */
    function getSwappableBalance() external view returns (uint256) {
        return balanceOf(address(this));
    }
    
    /**
     * @dev Returns the contract's current balance of native SONIC available for distribution
     */
    function getRewardBalance() external view returns (uint256) {
        return address(this).balance;
    }
    
    /**
     * @dev Get detailed holder info for debugging
     */
    function getHolderInfo(address holder) external view returns (
        bool isHolder,
        uint256 balance,
        uint256 shares,
        uint256 pendingRewards,
        uint256 alreadyPaid
    ) {
        bool isInList = false;
        if (holderIndexes[holder] > 0 || (holders.length > 0 && holders[0] == holder)) {
            isInList = true;
        }
        
        return (
            isInList,
            _balances[holder],
            holderInfo[holder].amount,
            getUnpaidEarnings(holder),
            holderInfo[holder].totalExcluded
        );
    }
    
    /**
     * @dev Get detailed contract status for debugging
     */
    function getContractStatus() external view returns (
        uint256 totalHolders,
        uint256 tokenTotalSupply,
        uint256 contractTokenBalance,
        uint256 contractSonicBalance,
        uint256 trackedTotalShares,
        uint256 totalRewards,
        uint256 rewardPerShare
    ) {
        return (
            holders.length,
            _totalSupply,
            balanceOf(address(this)),
            address(this).balance,
            totalShares,
            totalDividends,
            dividendsPerShare
        );
    }
    
    // ERC20 Standard Functions
    
    function name() public view returns (string memory) {
        return _name;
    }
    
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    
    function decimals() public pure returns (uint8) {
        return _decimals;
    }
    
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }
    
    function allowance(address owner_, address spender) public view returns (uint256) {
        return _allowances[owner_][spender];
    }
    
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        uint256 currentAllowance = _allowances[sender][msg.sender];
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
            _approve(sender, msg.sender, currentAllowance - amount);
        }
        
        _transfer(sender, recipient, amount);
        return true;
    }
    
    // Information functions
    
    function owner() public view returns (address) {
        return _owner;
    }
    
    function getHolderCount() public view returns (uint256) {
        return holders.length;
    }
    
    function isRewardsReady() public view returns (bool) {
        return block.timestamp >= lastProcessedTime + distributionInterval;
    }
    
    function getTimeUntilRewards() public view returns (uint256) {
        if (isRewardsReady()) return 0;
        return lastProcessedTime + distributionInterval - block.timestamp;
    }
    
    function getUnpaidEarnings(address account) public view returns (uint256) {
        if (holderInfo[account].amount == 0) return 0;
        
        uint256 earnedRewards = (dividendsPerShare * holderInfo[account].amount) / PRECISION_FACTOR;
        uint256 alreadyPaid = holderInfo[account].totalExcluded;
        
        if (earnedRewards <= alreadyPaid) return 0;
        return earnedRewards - alreadyPaid;
    }
    
    function getDistributionStatus() public view returns (uint256, uint256, uint256) {
        if (holders.length == 0) return (0, 0, 100);
        
        uint256 percentage = currentIndex * 100 / holders.length;
        return (holders.length, currentIndex, percentage);
    }
    
    // Internal functions
    
    function _transfer(address from, address to, uint256 amount) internal {
        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");
        
        // Check if trading is enabled when interacting with LP
        if (!tradingEnabled && (from == LP_PAIR || to == LP_PAIR)) {
            require(from == _owner || to == _owner, "Trading not enabled yet");
        }
        
        // Auto-liquidity and swap
        bool canSwap = balanceOf(address(this)) >= swapThreshold;
        if (canSwap && !inSwap && from != LP_PAIR && from != _owner && to != _owner) {
            uint256 swapAmount = amount > swapThreshold ? swapThreshold : amount;
            _swapTokensForRewards(swapAmount);
        }
        
        // Fee system
        bool takeFee = !exempt[from] && !exempt[to];
        
        uint256 fees = 0;
        if (takeFee) {
            if (from == LP_PAIR || to == LP_PAIR) {
                fees = amount * taxPercentage / 100;
            }
            if (fees > 0) {
                _takeFee(from, address(this), fees);
                amount -= fees;
            }
        }
        
        // Standard transfer
        _balances[from] -= amount;
        _balances[to] += amount;
        emit Transfer(from, to, amount);
        
        // Update holder tracking
        if (!excluded[from] && from != LP_PAIR) {
            _setShare(from, _balances[from]);
        }
        
        if (!excluded[to] && to != LP_PAIR) {
            _setShare(to, _balances[to]);
        }
    }
    
    function _approve(address owner_, address spender, uint256 amount) internal {
        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 _takeFee(address from, address to, uint256 amount) internal {
        _balances[to] += amount;
        emit Transfer(from, to, amount);
    }
    
    // Optimized swap function
    function _swapTokensForRewards(uint256 amount) internal lockTheSwap returns (uint256) {
        // Setup swap path
        address[] memory path = new address[](2);
        path[0] = address(this);      // SUPERRAIN token address
        path[1] = REWARD_TOKEN;       // WRAPPED_SONIC address
        
        // Approve router
        _approve(address(this), ROUTER, amount);
        
        // Get initial balance of native SONIC
        uint256 initialBalance = address(this).balance;
        
        try IUniswapRouter(ROUTER).swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp + 1200 // 20 minute deadline
        ) {
            // Calculate received native SONIC
            uint256 newBalance = address(this).balance;
            uint256 receivedSonic = newBalance - initialBalance;
            
            if (receivedSonic > 0 && totalShares > 0) {
                // Update dividends per share with higher precision
                totalDividends += receivedSonic;
                dividendsPerShare = totalDividends * PRECISION_FACTOR / totalShares;
                
                emit SwapAndDistribute(amount, receivedSonic);
            }
            
            return receivedSonic;
        } catch {
            // If swap fails, return 0
            return 0;
        }
    }
    
    // Optimized reward distribution function
    function _distributeRewards(address holder) internal {
        // Skip if holder has zero balance or is excluded
        if (holderInfo[holder].amount == 0 || excluded[holder]) return;
        
        uint256 amount = getUnpaidEarnings(holder);
        if (amount > 0) {
            uint256 contractBalance = address(this).balance;
            
            if (amount <= contractBalance) {
                // Update holder's accounting first to prevent reentrancy
                holderInfo[holder].totalExcluded = (dividendsPerShare * holderInfo[holder].amount) / PRECISION_FACTOR;
                holderInfo[holder].pendingRewards = 0;
                
                // Send native SONIC
                (bool success, ) = holder.call{value: amount}("");
                
                // Only emit event if transfer succeeded
                if (success) {
                    emit RewardSent(holder, amount);
                }
            }
        }
    }
    
    // Optimized share tracking function
    function _setShare(address holder, uint256 amount) internal {
        // Only consider meaningful balances
        if (amount < 1 * 10**_decimals) { // Minimum 1 token
            if (amount == 0 && holderInfo[holder].amount > 0) {
                _removeHolder(holder);
            }
            return;
        }
        
        if (holderInfo[holder].amount > 0) {
            // Existing holder - update totalShares correctly
            if (amount == 0) {
                _removeHolder(holder);
            } else {
                uint256 oldAmount = holderInfo[holder].amount;
                
                // Update totalShares safely
                totalShares = totalShares - oldAmount + amount;
                
                // Update holder info
                holderInfo[holder].amount = amount;
                
                emit SharesUpdated(holder, amount);
            }
        } else {
            // New holder
            _addHolder(holder, amount);
        }
    }
    
    function _addHolder(address holder, uint256 amount) internal {
        // Check if holder already exists (safety check)
        if (holderIndexes[holder] > 0 || (holders.length > 0 && holders[0] == holder)) {
            return;
        }
        
        // Add to holders array
        holders.push(holder);
        holderIndexes[holder] = holders.length - 1;
        
        // Set holder info
        holderInfo[holder].amount = amount;
        totalShares += amount;
        
        emit SharesUpdated(holder, amount);
    }
    
    function _removeHolder(address holder) internal {
        // Make sure holder exists
        if (holders.length == 0 || 
            (holderIndexes[holder] == 0 && holders[0] != holder) || 
            holderIndexes[holder] >= holders.length) {
            return;
        }
        
        // Get holder amount before removal
        uint256 holderAmount = holderInfo[holder].amount;
        
        // Handle array removal
        address lastHolder = holders[holders.length - 1];
        uint256 holderIndex = holderIndexes[holder];
        
        // Replace with last element
        holders[holderIndex] = lastHolder;
        holderIndexes[lastHolder] = holderIndex;
        
        // Remove last element
        holders.pop();
        delete holderIndexes[holder];
        
        // Update totalShares
        totalShares -= holderAmount;
        
        // Clear holder info
        delete holderInfo[holder];
        
        emit SharesUpdated(holder, 0);
    }
    
    // Rescue functions
    
    function rescueToken(address token, uint256 amount) external onlyOwner {
        IERC20(token).transfer(_owner, amount);
    }
    
    function withdrawETH() external onlyOwner {
        (bool success,) = _owner.call{value: address(this).balance}("");
        require(success, "ETH withdrawal failed");
    }
    
    // Receive function to accept ETH (native SONIC)
    receive() external payable {}
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Excluded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDistributionInterval","type":"uint256"}],"name":"IntervalUpdated","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":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"holderCount","type":"uint256"}],"name":"RewardsProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SharesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"SwapAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTaxPercentage","type":"uint256"}],"name":"TaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"TotalSharesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LP_PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"distributionInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendsPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractStatus","outputs":[{"internalType":"uint256","name":"totalHolders","type":"uint256"},{"internalType":"uint256","name":"tokenTotalSupply","type":"uint256"},{"internalType":"uint256","name":"contractTokenBalance","type":"uint256"},{"internalType":"uint256","name":"contractSonicBalance","type":"uint256"},{"internalType":"uint256","name":"trackedTotalShares","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistributionStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getHolderInfo","outputs":[{"internalType":"bool","name":"isHolder","type":"bool"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"},{"internalType":"uint256","name":"alreadyPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwappableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeUntilRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnpaidEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderIndexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"},{"internalType":"uint256","name":"totalExcluded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRewardsReady","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualSwap","outputs":[{"internalType":"uint256","name":"swapped","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processAllRewards","outputs":[{"internalType":"uint256","name":"processed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"processRewards","outputs":[{"internalType":"uint256","name":"processed","type":"uint256"},{"internalType":"uint256","name":"currentIdx","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recalculateShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBatchSize","type":"uint256"}],"name":"setBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newInterval","type":"uint256"}],"name":"setDistributionInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"}],"name":"setLPPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTaxPercentage","type":"uint256"}],"name":"setTaxPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523461029257610014600054610297565b601f8111610249575b507f536f6e696353757065725261696e00000000000000000000000000000000001c60005560015461004e90610297565b601f81116101ff575b5060066229a9a960e91b016001556005600881905561012c600a556032600b5580546001600160a01b03199081163390811783556a52b7d2dcc80cd2e4000000600281905560009182526006602052604080832091909155690a968163f0a57b4000006009556003805490931673039e2fb66102314ce7b64ce5ce3e5183bc94ad381790925591546001600160a01b03168083529120546100f7916102d1565b60025430156101ae5730600052600760205260406000207395a7e403d7cf20f675ff9273d66e94d35ba49fa3600052602052806040600020557395a7e403d7cf20f675ff9273d66e94d35ba49fa36040518281527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203092a360405190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a360405161273b90816104468239f35b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600052601f0160051c7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6908101905b81811061023d5750610057565b60008155600101610230565b60008052601f0160051c7f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563908101905b818110610286575061001d565b60008155600101610279565b600080fd5b90600182811c921680156102c7575b60208310146102b157565b634e487b7160e01b600052602260045260246000fd5b91607f16916102a6565b6001600160a01b03166000818152600f60205260409020549091901580159061040a575b61040657600e54680100000000000000008110156103f05760018101600e556000600e548210156103dc57600e90819052600080516020612b818339815191529190910180546001600160a01b031916841790555460009060001981019081116103c857838252600f60205260408220558281526010602052816040822055601154908282018092116103b457507fe6382c9ed5c0c33bb05042f73cf6cbe9cb25639f9a711e094ee563bc9cb80e2c91602091601155604051908152a2565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b600052604160045260246000fd5b5050565b50600e54151580156102f557506000600e54156103dc57600e9052600080516020612b81833981519152546001600160a01b031682146102f556fe608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630445b667146114bf5750806306fdde0314611404578063095ea7b3146113de57806318160ddd146113c057806323b872dd146112cc57806326987b60146112ae5780632836be24146111c057806328fd31981461119d578063313ce5671461118157806333f3d628146110c35780633a98ef39146110a5578063429cead1146110665780634ada218b1461104057806354e4067a14610f6d578063576f35e314610eba5780635e42b45514610e9e57806363c98ffa14610e80578063699abb3c14610e265780636d1d59a814610dcb57806370a0823114610d9357806371201a0e14610d755780637136982b14610d575780637a16a49e14610c8b578063880603d414610b6d5780638a8c523c14610ae65780638aee812714610a3c5780638da5cb5b14610a155780638f1b0efc146109e457806393a013e0146109bd57806395d89b41146108b957806399248ea714610892578063997664d7146108745780639d0014b1146107fb5780639fde54f5146107b2578063a1b140b614610775578063a9059cbb14610744578063ae7b6d1614610726578063b70143c914610652578063c032846b146105f7578063c07fbb8c146105bd578063cbdd9b30146105a2578063dd62ed3e1461054a578063de1c24d0146104ac578063e086e5ec14610427578063e2d2e21914610409578063e6ef675b146103df578063f1320af2146103a0578063f2fde38b146102dc578063f4daaba1146102be578063f74fe6be146102995763f96b88841461025b573861000f565b34610294576000366003190112610294576102826001600160a01b036005541633146115c3565b602061028c6119d0565b604051908152f35b600080fd5b346102945760003660031901126102945760206102b46119bb565b6040519015158152f35b34610294576000366003190112610294576020600b54604051908152f35b34610294576020366003190112610294576102f5611523565b600554906001600160a01b03808316916103108333146115c3565b1691821561035c578273ffffffffffffffffffffffffffffffffffffffff19927f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a31617600555005b606460405162461bcd60e51b815260206004820152602060248201527f4e6577206f776e65722063616e6e6f74206265207a65726f20616464726573736044820152fd5b34610294576020366003190112610294576001600160a01b036103c1611523565b166000526015602052602060ff604060002054166040519015158152f35b346102945760203660031901126102945760406103fd6004356117cc565b82519182526020820152f35b34610294576000366003190112610294576020601354604051908152f35b346102945760003660031901126102945760008080806001600160a01b03600554166104548133146115c3565b47905af161046061178c565b501561046857005b606460405162461bcd60e51b815260206004820152601560248201527f455448207769746864726177616c206661696c656400000000000000000000006044820152fd5b34610294576020366003190112610294576001600160a01b036104cd611523565b6104dc826005541633146115c3565b1680156105065773ffffffffffffffffffffffffffffffffffffffff196004541617600455600080f35b606460405162461bcd60e51b815260206004820152601e60248201527f4c5020706169722063616e6e6f74206265207a65726f206164647265737300006044820152fd5b3461029457604036600319011261029457610563611523565b6001600160a01b03610573611539565b911660005260076020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b3461029457600036600319011261029457602061028c611762565b34610294576020366003190112610294576001600160a01b036105de611523565b16600052600f6020526020604060002054604051908152f35b346102945760003660031901126102945760e0600e5460025430600052600660205260406000205447601154906012549260135494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b346102945760203660031901126102945760043561067c6001600160a01b036005541633146115c3565b3060005260066020526040600020549081156106e257604091811515806106d8575b156106ae57505b6103fd81612275565b6009549150811515806106ce575b156106c757506106a5565b90506106a5565b50818110156106bc565b508082111561069e565b606460405162461bcd60e51b815260206004820152601160248201527f4e6f20746f6b656e7320746f20737761700000000000000000000000000000006044820152fd5b34610294576000366003190112610294576020600854604051908152f35b346102945760403660031901126102945761076a610760611523565b6024359033611b76565b602060405160018152f35b34610294576000366003190112610294576107ae610791611727565b604080519384526020840192909252908201529081906060820190565b0390f35b346102945761001b6001600160a01b036107cb3661154f565b91906107dc826005541633146115c3565b16600052601560205260406000209060ff801983541691151516179055565b34610294576020366003190112610294576004356108256001600160a01b036005541633146115c3565b801561083057600955005b606460405162461bcd60e51b815260206004820152602060248201527f5468726573686f6c64206d7573742062652067726561746572207468616e20306044820152fd5b34610294576000366003190112610294576020601254604051908152f35b346102945760003660031901126102945760206001600160a01b0360035416604051908152f35b346102945760003660031901126102945760405160006001548060011c906001811680156109b3575b60208310811461099f5782855290811561097b575060011461091b575b6107ae8361090f8185038261157e565b604051918291826114da565b91905060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6916000905b8082106109615750909150810160200161090f6108ff565b919260018160209254838588010152019101909291610949565b60ff191660208086019190915291151560051b8401909101915061090f90506108ff565b602484634e487b7160e01b81526022600452fd5b91607f16916108e2565b346102945760003660031901126102945760206001600160a01b0360045416604051908152f35b3461029457600036600319011261029457602061028c306001600160a01b0316600052600660205260406000205490565b346102945760003660031901126102945760206001600160a01b0360055416604051908152f35b34610294576020366003190112610294576001600160a01b03610a5d611523565b610a6c826005541633146115c3565b168015610a965773ffffffffffffffffffffffffffffffffffffffff196003541617600355600080f35b608460405162461bcd60e51b815260206004820152602360248201527f52657761726420746f6b656e2063616e6e6f74206265207a65726f206164647260448201526265737360e81b6064820152fd5b3461029457600036600319011261029457610b0d6001600160a01b036005541633146115c3565b60165460ff8160081c16610b295761ff00191661010017601655005b606460405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152fd5b3461029457600036600319011261029457610b946001600160a01b036005541633146115c3565b600060115560005b600e54811015610bf55780610bec6001600160a01b03610bbd6001946116ff565b90549060031b1c168060005260066020526040600020549060005260106020528060406000205560115461171a565b60115501610b9c565b6012548015801580610c80575b610c36575b7f3677ba94506ffc0a2e6968fe926b51985b6403fcc6b900d17c926b41079f93346020601154604051908152a1005b670de0b6b3a76400008202918204670de0b6b3a7640000141715610c6a57601154610c6091611621565b6013558080610c07565b634e487b7160e01b600052601160045260246000fd5b506011541515610c02565b3461029457602036600319011261029457600435610cb56001600160a01b036005541633146115c3565b603c8110610cee576020817fc6f44473d25b86976ee7357c1339328224e349abc5486edc3007ef658a57608a92600a55604051908152a1005b608460405162461bcd60e51b8152602060048201526024808201527f496e74657276616c206d757374206265206174206c656173742036302073656360448201527f6f6e6473000000000000000000000000000000000000000000000000000000006064820152fd5b34610294576000366003190112610294576020600e54604051908152f35b34610294576000366003190112610294576020600a54604051908152f35b3461029457602036600319011261029457602061028c610db1611523565b6001600160a01b0316600052600660205260406000205490565b34610294576020366003190112610294576001600160a01b03610dec611523565b166000526010602052604060002080546107ae60026001840154930154604051938493846040919493926060820195825260208201520152565b34610294576020366003190112610294577f35ad15e7f5e4a16b548e8916bd02c51847dde8d106f334b4edaaacf140e43c916020600435610e736001600160a01b036005541633146115c3565b80600855604051908152a1005b34610294576000366003190112610294576020600c54604051908152f35b3461029457600036600319011261029457602047604051908152f35b3461029457602036600319011261029457600435610ee46001600160a01b036005541633146115c3565b600581101580610f62575b15610ef957600b55005b608460405162461bcd60e51b8152602060048201526024808201527f42617463682073697a65206d757374206265206265747765656e203520616e6460448201527f20313030000000000000000000000000000000000000000000000000000000006064820152fd5b506064811115610eef565b346102945760203660031901126102945760a0610f88611523565b6000906001600160a01b03811680600052600f60205260406000205415801590611014575b61100b575b80600052600660205260406000205491816000526010602052610fda60406000205491611641565b9160005260106020526002604060002001549260405194151585526020850152604084015260608301526080820152f35b60019250610fb2565b50600e5415158015610fad5750806001600160a01b036110326116b6565b90549060031b1c1614610fad565b3461029457600036600319011261029457602060ff60165460081c166040519015158152f35b34610294576020366003190112610294576001600160a01b03611087611523565b166000526014602052602060ff604060002054166040519015158152f35b34610294576000366003190112610294576020601154604051908152f35b34610294576040366003190112610294576001600160a01b0360206110e6611523565b604483600554166110f88133146115c3565b600060405195869485937fa9059cbb00000000000000000000000000000000000000000000000000000000855260048501526024356024850152165af180156111755761114157005b6020813d60201161116d575b8161115a6020938361157e565b8101031261029457518015150361029457005b3d915061114d565b6040513d6000823e3d90fd5b3461029457600036600319011261029457602060405160128152f35b3461029457602036600319011261029457602061028c6111bb611523565b611641565b346102945760207ff3a7c8242f0708821ed31a47f066fc7fa42f2ae65ed3e4d1d7cb5b3765d2939c6111f13661154f565b61120a6001600160a01b036005959395541633146115c3565b6001600160a01b03841693846000526014835260ff6040600020541691801515809315150361123f575b5050604051908152a2005b85600052601484526112618160406000209060ff801983541691151516179055565b15611291578460005260108352604060002054611282575b505b8480611234565b61128b906120ba565b84611279565b6112a990856000526006845260406000205490611fd2565b61127b565b34610294576000366003190112610294576020600d54604051908152f35b34610294576060366003190112610294576112e5611523565b6112ed611539565b604435906001600160a01b038316600052600760205260406000206001600160a01b033316600052602052604060002054926000198403611333575b61076a9350611b76565b8284106113565761135161134a8461076a966115b6565b3383611a3c565b611329565b608460405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152fd5b34610294576000366003190112610294576020600254604051908152f35b346102945760403660031901126102945761076a6113fa611523565b6024359033611a3c565b3461029457600036600319011261029457604051600080548060011c906001811680156114b5575b60208310811461099f5782855290811561097b5750600114611458576107ae8361090f8185038261157e565b60008080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b80821061149b5750909150810160200161090f6108ff565b919260018160209254838588010152019101909291611483565b91607f169161142c565b34610294576000366003190112610294576020906009548152f35b91909160208152825180602083015260005b81811061150d575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016114ec565b600435906001600160a01b038216820361029457565b602435906001600160a01b038216820361029457565b6040906003190112610294576004356001600160a01b0381168103610294579060243580151581036102945790565b90601f8019910116810190811067ffffffffffffffff8211176115a057604052565b634e487b7160e01b600052604160045260246000fd5b91908203918211610c6a57565b156115ca57565b606460405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152fd5b81810292918115918404141715610c6a57565b811561162b570490565b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0316806000526010602052604060002054156116b057670de0b6b3a76400006116826013548360005260106020526040600020549061160e565b04906000526010602052600260406000200154808211156116a9576116a6916115b6565b90565b5050600090565b50600090565b600e54156116e957600e60009081527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd91565b634e487b7160e01b600052603260045260246000fd5b600e548110156116e957600e60005260206000200190600090565b91908201809211610c6a57565b600e54801561175657600d54916064830283810460641484151715610c6a578261175091611621565b91929190565b50600090600090606490565b61176a6119bb565b611787576116a6611780600c54600a549061171a565b42906115b6565b600090565b3d156117c7573d9067ffffffffffffffff82116115a057604051916117bb601f8201601f19166020018461157e565b82523d6000602084013e565b606090565b906001600160a01b0360055416330361197757600e5491821561196e57600081156118e457505b809280611803600d54938461171a565b116118d1575b505081156118be5761181e600d54928361171a565b91805b8381106118855750826118449293600d55600e548082101561184b575b506115b6565b90600d5490565b60207fcbb46d9b69e77a6b5011c11cd2bf9be0461c9a1920e9f42678661cec154cd2a8916000600d5542600c55604051908152a13861183e565b600190600e548110611898575b01611821565b6118b96001600160a01b036118ac836116ff565b90549060031b1c16612535565b611892565b90506000600d5542600c55600090600090565b6118dc9293506115b6565b903880611809565b90506040517ff4daaba1000000000000000000000000000000000000000000000000000000008152602081600481305afa91821561196257809261192a575b50506117f3565b9091506020823d60201161195a575b816119466020938361157e565b810103126119575750513880611923565b80fd5b3d9150611939565b604051903d90823e3d90fd5b50600091508190565b606460405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206f776e65722063616e2070726f63657373207265776172647300006044820152fd5b6119ca600c54600a549061171a565b42101590565b600e54156117875760005b600e54811015611a0257806119fc6001600160a01b036118ac6001946116ff565b016119db565b506000600d5542600c55600e547fcbb46d9b69e77a6b5011c11cd2bf9be0461c9a1920e9f42678661cec154cd2a86020604051838152a190565b6001600160a01b0316908115611b0d576001600160a01b0316918215611aa35760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260078252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b6001600160a01b038116908115611f68576001600160a01b038316938415611f18578015611eae5782859160165460ff8160081c161580611e86575b611e0e575b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91602091306000526006835260406000205490600954809210159081611e02575b5080611ded575b80611dd8575b80611dc3575b611da1575b50836000526015825260ff604060002054161580611d89575b600090611d12575b5083600052600682526040600020611c4b8282546115b6565b905584600052600682526040600020611c6582825461171a565b9055604051908152a381600052601460205260ff604060002054161580611cfd575b611cde575b505081600052601460205260ff604060002054161580611cc9575b611caf575050565b611cc791600052600660205260406000205490611fd2565b565b506001600160a01b0360045416821415611ca7565b611cf691600052600660205260406000205490611fd2565b3880611c8c565b506001600160a01b0360045416821415611c87565b6001600160a01b0360045416808614908115611d7f575b50611d6a575b8015611c3257611d649130600052600684526040600020611d5183825461171a565b90556040518281528686863093a36115b6565b38611c32565b506064611d796008548361160e565b04611d2f565b9050861438611d29565b50846000526015825260ff6040600020541615611c2a565b80821115611db957611db290612275565b5038611c11565b50611db281612275565b506001600160a01b0360055416861415611c0c565b506001600160a01b0360055416851415611c06565b506001600160a01b0360045416851415611c00565b60ff9150161538611bf9565b915091506001600160a01b0360055416808514908115611e7c575b5015611e385785918491611bb7565b606460405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152fd5b9050861438611e29565b506001600160a01b0360045416808414908115611ea4575b50611bb2565b9050841438611e9e565b608460405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152fd5b608460405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152fd5b670de0b6b3a76400008210612082576001600160a01b03811691826000526010602052604060002054151560001461207757806120145750611cc791506120ba565b7fe6382c9ed5c0c33bb05042f73cf6cbe9cb25639f9a711e094ee563bc9cb80e2c9150602090836000526010825261205c816120576040600020546011546115b6565b61171a565b601155836000526010825280604060002055604051908152a2565b90611cc79250612620565b90158061209a575b6120915750565b611cc7906120ba565b506001600160a01b0381166000526010602052604060002054151561208a565b600e54908115801561222b575b801561220a575b612206576001600160a01b031690816000526010602052604060002054906000198101908111610c6a576121096001600160a01b03916116ff565b90549060031b1c1682600052600f6020526040600020549061214d8161212e846116ff565b9091906001600160a01b038084549260031b9316831b921b1916179055565b600052600f602052604060002055600e549081156121f0576121a49160001901612176816116ff565b6001600160a01b0382549160031b1b19169055600e5582600052600f602052600060408120556011546115b6565b601155806000526010602052600060026040822082815582600182015501557fe6382c9ed5c0c33bb05042f73cf6cbe9cb25639f9a711e094ee563bc9cb80e2c602060405160008152a2565b634e487b7160e01b600052603160045260246000fd5b5050565b506001600160a01b038116600052600f6020528160406000205410156120ce565b506001600160a01b03811680600052600f602052604060002054159081612253575b506120c7565b90506001600160a01b036122656116b6565b90549060031b1c1614153861224d565b61228b90600160ff196016541617601655612298565b9060ff1960165416601655565b6000906040516122a960608261157e565b6002815260208101906040368337805115612521573082526001600160a01b036003541681516001101561250d5760408201523015611b0d573084526007602052604084207395a7e403d7cf20f675ff9273d66e94d35ba49fa385526020528260408520557395a7e403d7cf20f675ff9273d66e94d35ba49fa36040518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203092a347916104b042018042116124f9577395a7e403d7cf20f675ff9273d66e94d35ba49fa33b156124f5579185916040519384927f791ac94700000000000000000000000000000000000000000000000000000000845260a484019088600486015285602486015260a060448601525180915260c484019290855b8181106124d057505030606485015250608483015281900381837395a7e403d7cf20f675ff9273d66e94d35ba49fa35af190816124bc575b5061240a57505090565b61241490476115b6565b91821515806124b1575b61242757505090565b6124338360125461171a565b9081601255670de0b6b3a7640000820291808304670de0b6b3a7640000149015171561249d57507f10da9408d1358808fea34ded33d675db0ba8e618a2fb814298059b2a6b0a473f9161248b60409260115490611621565b6013558151908152836020820152a190565b80634e487b7160e01b602492526011600452fd5b50601154151561241e565b846124c99195929561157e565b9238612400565b82516001600160a01b031685528a9650879550602094850194909201916001016123c8565b8580fd5b602486634e487b7160e01b81526011600452fd5b602485634e487b7160e01b81526032600452fd5b602484634e487b7160e01b81526032600452fd5b6001600160a01b03811690816000526010602052604060002054158015612608575b6122065761256481611641565b9081612570575b505050565b4782111561257d57505050565b60008080848194670de0b6b3a76400006125a66013548a8652601060205260408620549061160e565b048884526010602052600260408520015587835260106020528260016040822001555af16125d261178c565b506125db575050565b60207f6177f4110771217c72937d51f3a73915f2c714a6b98507e17eea7a186136a24a91604051908152a2565b5081600052601460205260ff60406000205416612557565b906001600160a01b0382169182600052600f602052604060002054158015906126d9575b61256b57600e5490680100000000000000008210156115a05761212e8260016126709401600e556116ff565b600e546000198101908111610c6a577fe6382c9ed5c0c33bb05042f73cf6cbe9cb25639f9a711e094ee563bc9cb80e2c9160209184600052600f83526040600020558360005260108252806040600020556126cd8160115461171a565b601155604051908152a2565b50600e54151580156126445750826001600160a01b036126f76116b6565b90549060031b1c161461264456fea26469706673582212203608c89ffa25b8fd9ca72abf410b8086f24bb3154b8c37f17ac8af4a75d7217564736f6c634300081c0033bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd

Deployed Bytecode

0x608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630445b667146114bf5750806306fdde0314611404578063095ea7b3146113de57806318160ddd146113c057806323b872dd146112cc57806326987b60146112ae5780632836be24146111c057806328fd31981461119d578063313ce5671461118157806333f3d628146110c35780633a98ef39146110a5578063429cead1146110665780634ada218b1461104057806354e4067a14610f6d578063576f35e314610eba5780635e42b45514610e9e57806363c98ffa14610e80578063699abb3c14610e265780636d1d59a814610dcb57806370a0823114610d9357806371201a0e14610d755780637136982b14610d575780637a16a49e14610c8b578063880603d414610b6d5780638a8c523c14610ae65780638aee812714610a3c5780638da5cb5b14610a155780638f1b0efc146109e457806393a013e0146109bd57806395d89b41146108b957806399248ea714610892578063997664d7146108745780639d0014b1146107fb5780639fde54f5146107b2578063a1b140b614610775578063a9059cbb14610744578063ae7b6d1614610726578063b70143c914610652578063c032846b146105f7578063c07fbb8c146105bd578063cbdd9b30146105a2578063dd62ed3e1461054a578063de1c24d0146104ac578063e086e5ec14610427578063e2d2e21914610409578063e6ef675b146103df578063f1320af2146103a0578063f2fde38b146102dc578063f4daaba1146102be578063f74fe6be146102995763f96b88841461025b573861000f565b34610294576000366003190112610294576102826001600160a01b036005541633146115c3565b602061028c6119d0565b604051908152f35b600080fd5b346102945760003660031901126102945760206102b46119bb565b6040519015158152f35b34610294576000366003190112610294576020600b54604051908152f35b34610294576020366003190112610294576102f5611523565b600554906001600160a01b03808316916103108333146115c3565b1691821561035c578273ffffffffffffffffffffffffffffffffffffffff19927f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a31617600555005b606460405162461bcd60e51b815260206004820152602060248201527f4e6577206f776e65722063616e6e6f74206265207a65726f20616464726573736044820152fd5b34610294576020366003190112610294576001600160a01b036103c1611523565b166000526015602052602060ff604060002054166040519015158152f35b346102945760203660031901126102945760406103fd6004356117cc565b82519182526020820152f35b34610294576000366003190112610294576020601354604051908152f35b346102945760003660031901126102945760008080806001600160a01b03600554166104548133146115c3565b47905af161046061178c565b501561046857005b606460405162461bcd60e51b815260206004820152601560248201527f455448207769746864726177616c206661696c656400000000000000000000006044820152fd5b34610294576020366003190112610294576001600160a01b036104cd611523565b6104dc826005541633146115c3565b1680156105065773ffffffffffffffffffffffffffffffffffffffff196004541617600455600080f35b606460405162461bcd60e51b815260206004820152601e60248201527f4c5020706169722063616e6e6f74206265207a65726f206164647265737300006044820152fd5b3461029457604036600319011261029457610563611523565b6001600160a01b03610573611539565b911660005260076020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b3461029457600036600319011261029457602061028c611762565b34610294576020366003190112610294576001600160a01b036105de611523565b16600052600f6020526020604060002054604051908152f35b346102945760003660031901126102945760e0600e5460025430600052600660205260406000205447601154906012549260135494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b346102945760203660031901126102945760043561067c6001600160a01b036005541633146115c3565b3060005260066020526040600020549081156106e257604091811515806106d8575b156106ae57505b6103fd81612275565b6009549150811515806106ce575b156106c757506106a5565b90506106a5565b50818110156106bc565b508082111561069e565b606460405162461bcd60e51b815260206004820152601160248201527f4e6f20746f6b656e7320746f20737761700000000000000000000000000000006044820152fd5b34610294576000366003190112610294576020600854604051908152f35b346102945760403660031901126102945761076a610760611523565b6024359033611b76565b602060405160018152f35b34610294576000366003190112610294576107ae610791611727565b604080519384526020840192909252908201529081906060820190565b0390f35b346102945761001b6001600160a01b036107cb3661154f565b91906107dc826005541633146115c3565b16600052601560205260406000209060ff801983541691151516179055565b34610294576020366003190112610294576004356108256001600160a01b036005541633146115c3565b801561083057600955005b606460405162461bcd60e51b815260206004820152602060248201527f5468726573686f6c64206d7573742062652067726561746572207468616e20306044820152fd5b34610294576000366003190112610294576020601254604051908152f35b346102945760003660031901126102945760206001600160a01b0360035416604051908152f35b346102945760003660031901126102945760405160006001548060011c906001811680156109b3575b60208310811461099f5782855290811561097b575060011461091b575b6107ae8361090f8185038261157e565b604051918291826114da565b91905060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6916000905b8082106109615750909150810160200161090f6108ff565b919260018160209254838588010152019101909291610949565b60ff191660208086019190915291151560051b8401909101915061090f90506108ff565b602484634e487b7160e01b81526022600452fd5b91607f16916108e2565b346102945760003660031901126102945760206001600160a01b0360045416604051908152f35b3461029457600036600319011261029457602061028c306001600160a01b0316600052600660205260406000205490565b346102945760003660031901126102945760206001600160a01b0360055416604051908152f35b34610294576020366003190112610294576001600160a01b03610a5d611523565b610a6c826005541633146115c3565b168015610a965773ffffffffffffffffffffffffffffffffffffffff196003541617600355600080f35b608460405162461bcd60e51b815260206004820152602360248201527f52657761726420746f6b656e2063616e6e6f74206265207a65726f206164647260448201526265737360e81b6064820152fd5b3461029457600036600319011261029457610b0d6001600160a01b036005541633146115c3565b60165460ff8160081c16610b295761ff00191661010017601655005b606460405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152fd5b3461029457600036600319011261029457610b946001600160a01b036005541633146115c3565b600060115560005b600e54811015610bf55780610bec6001600160a01b03610bbd6001946116ff565b90549060031b1c168060005260066020526040600020549060005260106020528060406000205560115461171a565b60115501610b9c565b6012548015801580610c80575b610c36575b7f3677ba94506ffc0a2e6968fe926b51985b6403fcc6b900d17c926b41079f93346020601154604051908152a1005b670de0b6b3a76400008202918204670de0b6b3a7640000141715610c6a57601154610c6091611621565b6013558080610c07565b634e487b7160e01b600052601160045260246000fd5b506011541515610c02565b3461029457602036600319011261029457600435610cb56001600160a01b036005541633146115c3565b603c8110610cee576020817fc6f44473d25b86976ee7357c1339328224e349abc5486edc3007ef658a57608a92600a55604051908152a1005b608460405162461bcd60e51b8152602060048201526024808201527f496e74657276616c206d757374206265206174206c656173742036302073656360448201527f6f6e6473000000000000000000000000000000000000000000000000000000006064820152fd5b34610294576000366003190112610294576020600e54604051908152f35b34610294576000366003190112610294576020600a54604051908152f35b3461029457602036600319011261029457602061028c610db1611523565b6001600160a01b0316600052600660205260406000205490565b34610294576020366003190112610294576001600160a01b03610dec611523565b166000526010602052604060002080546107ae60026001840154930154604051938493846040919493926060820195825260208201520152565b34610294576020366003190112610294577f35ad15e7f5e4a16b548e8916bd02c51847dde8d106f334b4edaaacf140e43c916020600435610e736001600160a01b036005541633146115c3565b80600855604051908152a1005b34610294576000366003190112610294576020600c54604051908152f35b3461029457600036600319011261029457602047604051908152f35b3461029457602036600319011261029457600435610ee46001600160a01b036005541633146115c3565b600581101580610f62575b15610ef957600b55005b608460405162461bcd60e51b8152602060048201526024808201527f42617463682073697a65206d757374206265206265747765656e203520616e6460448201527f20313030000000000000000000000000000000000000000000000000000000006064820152fd5b506064811115610eef565b346102945760203660031901126102945760a0610f88611523565b6000906001600160a01b03811680600052600f60205260406000205415801590611014575b61100b575b80600052600660205260406000205491816000526010602052610fda60406000205491611641565b9160005260106020526002604060002001549260405194151585526020850152604084015260608301526080820152f35b60019250610fb2565b50600e5415158015610fad5750806001600160a01b036110326116b6565b90549060031b1c1614610fad565b3461029457600036600319011261029457602060ff60165460081c166040519015158152f35b34610294576020366003190112610294576001600160a01b03611087611523565b166000526014602052602060ff604060002054166040519015158152f35b34610294576000366003190112610294576020601154604051908152f35b34610294576040366003190112610294576001600160a01b0360206110e6611523565b604483600554166110f88133146115c3565b600060405195869485937fa9059cbb00000000000000000000000000000000000000000000000000000000855260048501526024356024850152165af180156111755761114157005b6020813d60201161116d575b8161115a6020938361157e565b8101031261029457518015150361029457005b3d915061114d565b6040513d6000823e3d90fd5b3461029457600036600319011261029457602060405160128152f35b3461029457602036600319011261029457602061028c6111bb611523565b611641565b346102945760207ff3a7c8242f0708821ed31a47f066fc7fa42f2ae65ed3e4d1d7cb5b3765d2939c6111f13661154f565b61120a6001600160a01b036005959395541633146115c3565b6001600160a01b03841693846000526014835260ff6040600020541691801515809315150361123f575b5050604051908152a2005b85600052601484526112618160406000209060ff801983541691151516179055565b15611291578460005260108352604060002054611282575b505b8480611234565b61128b906120ba565b84611279565b6112a990856000526006845260406000205490611fd2565b61127b565b34610294576000366003190112610294576020600d54604051908152f35b34610294576060366003190112610294576112e5611523565b6112ed611539565b604435906001600160a01b038316600052600760205260406000206001600160a01b033316600052602052604060002054926000198403611333575b61076a9350611b76565b8284106113565761135161134a8461076a966115b6565b3383611a3c565b611329565b608460405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152fd5b34610294576000366003190112610294576020600254604051908152f35b346102945760403660031901126102945761076a6113fa611523565b6024359033611a3c565b3461029457600036600319011261029457604051600080548060011c906001811680156114b5575b60208310811461099f5782855290811561097b5750600114611458576107ae8361090f8185038261157e565b60008080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b80821061149b5750909150810160200161090f6108ff565b919260018160209254838588010152019101909291611483565b91607f169161142c565b34610294576000366003190112610294576020906009548152f35b91909160208152825180602083015260005b81811061150d575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016114ec565b600435906001600160a01b038216820361029457565b602435906001600160a01b038216820361029457565b6040906003190112610294576004356001600160a01b0381168103610294579060243580151581036102945790565b90601f8019910116810190811067ffffffffffffffff8211176115a057604052565b634e487b7160e01b600052604160045260246000fd5b91908203918211610c6a57565b156115ca57565b606460405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152fd5b81810292918115918404141715610c6a57565b811561162b570490565b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0316806000526010602052604060002054156116b057670de0b6b3a76400006116826013548360005260106020526040600020549061160e565b04906000526010602052600260406000200154808211156116a9576116a6916115b6565b90565b5050600090565b50600090565b600e54156116e957600e60009081527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd91565b634e487b7160e01b600052603260045260246000fd5b600e548110156116e957600e60005260206000200190600090565b91908201809211610c6a57565b600e54801561175657600d54916064830283810460641484151715610c6a578261175091611621565b91929190565b50600090600090606490565b61176a6119bb565b611787576116a6611780600c54600a549061171a565b42906115b6565b600090565b3d156117c7573d9067ffffffffffffffff82116115a057604051916117bb601f8201601f19166020018461157e565b82523d6000602084013e565b606090565b906001600160a01b0360055416330361197757600e5491821561196e57600081156118e457505b809280611803600d54938461171a565b116118d1575b505081156118be5761181e600d54928361171a565b91805b8381106118855750826118449293600d55600e548082101561184b575b506115b6565b90600d5490565b60207fcbb46d9b69e77a6b5011c11cd2bf9be0461c9a1920e9f42678661cec154cd2a8916000600d5542600c55604051908152a13861183e565b600190600e548110611898575b01611821565b6118b96001600160a01b036118ac836116ff565b90549060031b1c16612535565b611892565b90506000600d5542600c55600090600090565b6118dc9293506115b6565b903880611809565b90506040517ff4daaba1000000000000000000000000000000000000000000000000000000008152602081600481305afa91821561196257809261192a575b50506117f3565b9091506020823d60201161195a575b816119466020938361157e565b810103126119575750513880611923565b80fd5b3d9150611939565b604051903d90823e3d90fd5b50600091508190565b606460405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206f776e65722063616e2070726f63657373207265776172647300006044820152fd5b6119ca600c54600a549061171a565b42101590565b600e54156117875760005b600e54811015611a0257806119fc6001600160a01b036118ac6001946116ff565b016119db565b506000600d5542600c55600e547fcbb46d9b69e77a6b5011c11cd2bf9be0461c9a1920e9f42678661cec154cd2a86020604051838152a190565b6001600160a01b0316908115611b0d576001600160a01b0316918215611aa35760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260078252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b6001600160a01b038116908115611f68576001600160a01b038316938415611f18578015611eae5782859160165460ff8160081c161580611e86575b611e0e575b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91602091306000526006835260406000205490600954809210159081611e02575b5080611ded575b80611dd8575b80611dc3575b611da1575b50836000526015825260ff604060002054161580611d89575b600090611d12575b5083600052600682526040600020611c4b8282546115b6565b905584600052600682526040600020611c6582825461171a565b9055604051908152a381600052601460205260ff604060002054161580611cfd575b611cde575b505081600052601460205260ff604060002054161580611cc9575b611caf575050565b611cc791600052600660205260406000205490611fd2565b565b506001600160a01b0360045416821415611ca7565b611cf691600052600660205260406000205490611fd2565b3880611c8c565b506001600160a01b0360045416821415611c87565b6001600160a01b0360045416808614908115611d7f575b50611d6a575b8015611c3257611d649130600052600684526040600020611d5183825461171a565b90556040518281528686863093a36115b6565b38611c32565b506064611d796008548361160e565b04611d2f565b9050861438611d29565b50846000526015825260ff6040600020541615611c2a565b80821115611db957611db290612275565b5038611c11565b50611db281612275565b506001600160a01b0360055416861415611c0c565b506001600160a01b0360055416851415611c06565b506001600160a01b0360045416851415611c00565b60ff9150161538611bf9565b915091506001600160a01b0360055416808514908115611e7c575b5015611e385785918491611bb7565b606460405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152fd5b9050861438611e29565b506001600160a01b0360045416808414908115611ea4575b50611bb2565b9050841438611e9e565b608460405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152fd5b608460405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152fd5b670de0b6b3a76400008210612082576001600160a01b03811691826000526010602052604060002054151560001461207757806120145750611cc791506120ba565b7fe6382c9ed5c0c33bb05042f73cf6cbe9cb25639f9a711e094ee563bc9cb80e2c9150602090836000526010825261205c816120576040600020546011546115b6565b61171a565b601155836000526010825280604060002055604051908152a2565b90611cc79250612620565b90158061209a575b6120915750565b611cc7906120ba565b506001600160a01b0381166000526010602052604060002054151561208a565b600e54908115801561222b575b801561220a575b612206576001600160a01b031690816000526010602052604060002054906000198101908111610c6a576121096001600160a01b03916116ff565b90549060031b1c1682600052600f6020526040600020549061214d8161212e846116ff565b9091906001600160a01b038084549260031b9316831b921b1916179055565b600052600f602052604060002055600e549081156121f0576121a49160001901612176816116ff565b6001600160a01b0382549160031b1b19169055600e5582600052600f602052600060408120556011546115b6565b601155806000526010602052600060026040822082815582600182015501557fe6382c9ed5c0c33bb05042f73cf6cbe9cb25639f9a711e094ee563bc9cb80e2c602060405160008152a2565b634e487b7160e01b600052603160045260246000fd5b5050565b506001600160a01b038116600052600f6020528160406000205410156120ce565b506001600160a01b03811680600052600f602052604060002054159081612253575b506120c7565b90506001600160a01b036122656116b6565b90549060031b1c1614153861224d565b61228b90600160ff196016541617601655612298565b9060ff1960165416601655565b6000906040516122a960608261157e565b6002815260208101906040368337805115612521573082526001600160a01b036003541681516001101561250d5760408201523015611b0d573084526007602052604084207395a7e403d7cf20f675ff9273d66e94d35ba49fa385526020528260408520557395a7e403d7cf20f675ff9273d66e94d35ba49fa36040518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203092a347916104b042018042116124f9577395a7e403d7cf20f675ff9273d66e94d35ba49fa33b156124f5579185916040519384927f791ac94700000000000000000000000000000000000000000000000000000000845260a484019088600486015285602486015260a060448601525180915260c484019290855b8181106124d057505030606485015250608483015281900381837395a7e403d7cf20f675ff9273d66e94d35ba49fa35af190816124bc575b5061240a57505090565b61241490476115b6565b91821515806124b1575b61242757505090565b6124338360125461171a565b9081601255670de0b6b3a7640000820291808304670de0b6b3a7640000149015171561249d57507f10da9408d1358808fea34ded33d675db0ba8e618a2fb814298059b2a6b0a473f9161248b60409260115490611621565b6013558151908152836020820152a190565b80634e487b7160e01b602492526011600452fd5b50601154151561241e565b846124c99195929561157e565b9238612400565b82516001600160a01b031685528a9650879550602094850194909201916001016123c8565b8580fd5b602486634e487b7160e01b81526011600452fd5b602485634e487b7160e01b81526032600452fd5b602484634e487b7160e01b81526032600452fd5b6001600160a01b03811690816000526010602052604060002054158015612608575b6122065761256481611641565b9081612570575b505050565b4782111561257d57505050565b60008080848194670de0b6b3a76400006125a66013548a8652601060205260408620549061160e565b048884526010602052600260408520015587835260106020528260016040822001555af16125d261178c565b506125db575050565b60207f6177f4110771217c72937d51f3a73915f2c714a6b98507e17eea7a186136a24a91604051908152a2565b5081600052601460205260ff60406000205416612557565b906001600160a01b0382169182600052600f602052604060002054158015906126d9575b61256b57600e5490680100000000000000008210156115a05761212e8260016126709401600e556116ff565b600e546000198101908111610c6a577fe6382c9ed5c0c33bb05042f73cf6cbe9cb25639f9a711e094ee563bc9cb80e2c9160209184600052600f83526040600020558360005260108252806040600020556126cd8160115461171a565b601155604051908152a2565b50600e54151580156126445750826001600160a01b036126f76116b6565b90549060031b1c161461264456fea26469706673582212203608c89ffa25b8fd9ca72abf410b8086f24bb3154b8c37f17ac8af4a75d7217564736f6c634300081c0033

[ 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.