ERC-20
Overview
Max Total Supply
100,000,000 RAIN
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
3,278,974.497057352771473632 RAINValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RainToken_v3
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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 swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; // Add token-to-token swap function function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } /** * @title Rain Token * @dev Implementation of the ERC20 Token Standard with reflection rewards */ contract RainToken_v3 { // Define REWARD_TOKEN constant with correct checksum address constant private REWARD_TOKEN = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38; // WRAPPED_SONIC // Define ROUTER constant with correct checksum address constant private ROUTER = 0x95a7e403d7cF20F675fF9273D66e94d35ba49fA3; // METROPOLIS_ROUTER // Use SONIC_LP_PAIR consistently address public SONIC_LP_PAIR; function setLPPair(address newPair) public onlyOwner { require(newPair != address(0), "LP pair cannot be zero address"); SONIC_LP_PAIR = newPair; } // Add owner() function for the deploy script function owner() public view returns (address) { return _owner; } function setExempt(address account, bool status) public onlyOwner { exempt[account] = status; } // Events event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event TradingEnabled(address indexed by); event MaxWalletDisabled(address indexed by); event SurplusWithdrawn(address indexed to, uint256 amount); event Claimed(address indexed user, uint256 amount); event RainAutoLPTriggered(uint256 ethSwapped, uint256 tokensReceived); event RainPrinted(address indexed to, uint256 amount); event RainBurned(address indexed from, uint256 amount); event RewardsUpdated(uint256 intervalSeconds, uint256 batchSize, uint256 gasLimit); // Add new event for manual swaps event ManualSwapExecuted(uint256 rainAmount, uint256 wsReceived); // Add new event for holder tracking event HolderAdded(address indexed holder); event HolderRemoved(address indexed holder); // State variables string private _name = "Rain"; string private _symbol = "RAIN"; uint8 private constant _decimals = 18; uint256 private _totalSupply; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; address private _owner; bool public maxWalletDisabled; bool public tradingEnabled; mapping(address => bool) public whitelisted; mapping(address => bool) public excluded; mapping(address => bool) public exempt; address constant public DEAD = 0x000000000000000000000000000000000000dEaD; uint256 public maxTxAmount; uint256 public maxWalletSize; uint256 public swapThreshold; uint256 public totalFees; uint256 public liquidityFee; uint256 public buybackFee; uint256 public reflectionFee; uint256 public marketingFee; uint256 public burnFee; uint256 public gasForProcessing; uint256 public batchSize; uint256 public processingInterval; uint256 public lastProcessedTime; // Change pendingAmount from uint256 to bool bool public pendingAmount; address[] private holders; mapping(address => uint256) public holderIndexes; struct HolderInfo { uint256 amount; uint256 pendingRewards; uint256 totalExcluded; } mapping(address => HolderInfo) public holderInfo; uint256 public totalShares; uint256 public totalDividends; uint256 public totalDistributed; uint256 public dividendsPerShare; uint256 public currentIndex; bool private inSwap; uint256 public swappedTokens; modifier lockTheSwap { inSwap = true; _; inSwap = false; } modifier onlyOwner() { require(msg.sender == _owner, "Ownable: caller is not the owner"); _; } // Constructor constructor() { _owner = msg.sender; // Initial supply and tokenomics setup _totalSupply = 100000000 * 10**_decimals; _balances[msg.sender] = _totalSupply; maxTxAmount = _totalSupply * 2 / 100; // 2% maxWalletSize = _totalSupply * 2 / 100; // 2% swapThreshold = _totalSupply * 5 / 10000; // 0.05% // Initialize fee structure totalFees = 5; // 5% total fee for reflection reflectionFee = 5; // 5% for reflections (to match your requirement) liquidityFee = 0; buybackFee = 0; marketingFee = 0; burnFee = 0; processingInterval = 300; // 5 minutes batchSize = 20; gasForProcessing = 300000; // Initialize LP pair address with a placeholder - will be updated later SONIC_LP_PAIR = 0x663DC15D3C1aC63ff12E45Ab68FeA3F0a883C251; // Add owner to holders array _addHolder(_owner); totalShares = _totalSupply; // Approve router for future swaps _approve(address(this), ROUTER, _totalSupply); emit Transfer(address(0), msg.sender, _totalSupply); } // Basic ERC20 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; } // Fix parameter shadowing by renaming function allowance(address tokenOwner, address spender) public view returns (uint256) { return _allowances[tokenOwner][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; } // Fix parameter shadowing by renaming function _approve(address tokenOwner, address spender, uint256 amount) internal { require(tokenOwner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[tokenOwner][spender] = amount; emit Approval(tokenOwner, spender, amount); } // Token specific functions function _transfer(address from, address to, uint256 amount) internal { require(amount > 0, "Transfer amount must be greater than zero"); // Check if trading is enabled for non-whitelisted addresses if (!tradingEnabled && (from == SONIC_LP_PAIR || to == SONIC_LP_PAIR)) { require(whitelisted[from] || whitelisted[to], "Trading not enabled yet"); } // Max wallet size limit if (maxWalletDisabled && to != address(0) && to != DEAD && to != SONIC_LP_PAIR && !exempt[to]) { require(_balances[to] + amount <= maxWalletSize, "Max wallet limit exceeded"); } // Auto liquidity system bool canSwap = balanceOf(address(this)) >= swapThreshold; if (canSwap && !inSwap && from != SONIC_LP_PAIR && !whitelisted[from] && !whitelisted[to]) { pendingAmount = true; uint256 swapAmount = amount > swapThreshold ? swapThreshold : amount; _swapAndLiquify(swapAmount); pendingAmount = false; } // Fee system or direct transfer bool takeFee = true; if (whitelisted[from] || whitelisted[to]) { takeFee = false; } uint256 fees = 0; if (takeFee) { if (from == SONIC_LP_PAIR || to == SONIC_LP_PAIR) { fees = amount * totalFees / 100; // Use the totalFees variable } if (fees > 0) { _takeFee(from, address(this), fees); amount -= fees; } } // Standard transfer _basicTransfer(from, to, amount); // Update holder tracking - FIXED LOGIC // Only track non-excluded addresses and don't track the LP pair if (!excluded[from] && from != SONIC_LP_PAIR) { _setShare(from, _balances[from]); } if (!excluded[to] && to != SONIC_LP_PAIR) { _setShare(to, _balances[to]); } // Process rewards if it's time if (!inSwap && isRewardsReady()) { processRewards(); lastProcessedTime = block.timestamp; } } function _basicTransfer(address sender, address recipient, uint256 amount) internal { if (recipient == address(0)) { _totalSupply -= amount; } else if (recipient != address(0)) { _balances[recipient] += amount; } if (sender != address(0)) { require(_balances[sender] >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] -= amount; } emit Transfer(sender, recipient, amount); } function _takeFee(address from, address to, uint256 amount) internal { _balances[to] += amount; emit Transfer(from, to, amount); } // Reward system functions function getUnpaidEarnings(address account) public view returns (uint256) { if (holderInfo[account].amount == 0) return 0; uint256 earnedDividends = getSharesPercentage(account); uint256 alreadyPaid = holderInfo[account].totalExcluded; if (earnedDividends <= alreadyPaid) return 0; return earnedDividends - alreadyPaid; } // Fix getSharesPercentage to accept address parameter function getSharesPercentage(address account) internal view returns (uint256) { if (totalShares == 0) return 0; return dividendsPerShare * holderInfo[account].amount / 10000; } // Add an overload for uint256 parameter function getSharesPercentage(uint256 amount) internal view returns (uint256) { if (totalShares == 0) return 0; return dividendsPerShare * amount / 10000; } function getHolderDetails(address account) public view returns (uint256 shares, uint256 pending, uint256 withdrawn) { if (totalShares == 0) return (0, 0, 0); HolderInfo storage holder = holderInfo[account]; return (holder.amount, getUnpaidEarnings(account), holder.totalExcluded); } function getLatestMetrics() public view returns ( uint256 holdersCount, uint256 swappedTotal, uint256 contractBalance, uint256 sharesTotal, uint256 dividendsTotal, uint256 distributedTotal, uint256 nextProcessingTime, uint256 timeUntilProcessing ) { uint256 contractETH = 0; for (uint256 i = 0; i < holders.length; i++) { contractETH += balanceOf(holders[i]); } contractBalance = IERC20(REWARD_TOKEN).balanceOf(address(this)); uint256 timeRemaining = 0; if (block.timestamp < lastProcessedTime + processingInterval) { timeRemaining = lastProcessedTime + processingInterval - block.timestamp; } return ( holders.length, swappedTokens, contractBalance, totalShares, totalDividends, totalDistributed, lastProcessedTime + processingInterval, timeRemaining ); } function getRewardsInfo() public view returns ( uint256 totalHolders, uint256 pendingRewards, bool isProcessingAvailable, uint256 nextProcessing ) { uint256 ethBalance = 0; for (uint256 i = 0; i < holders.length; i++) { ethBalance += balanceOf(holders[i]); } uint256 contractBalance = IERC20(REWARD_TOKEN).balanceOf(address(this)); return ( holders.length, contractBalance, isRewardsReady(), lastProcessedTime + processingInterval ); } function isRewardsReady() public view returns (bool) { return block.timestamp >= lastProcessedTime + processingInterval; } function getTimeUntilProcessing() public view returns (uint256) { if (isRewardsReady()) return 0; return lastProcessedTime + processingInterval - block.timestamp; } function claimRewards() public { require(!excluded[msg.sender], "Excluded from rewards"); uint256 amount = getUnpaidEarnings(msg.sender); require(amount > 0, "No rewards to claim"); uint256 contractBalance = IERC20(REWARD_TOKEN).balanceOf(address(this)); if (contractBalance < amount) { require(false, "Insufficient contract balance"); } holderInfo[msg.sender].totalExcluded = getSharesPercentage(msg.sender); holderInfo[msg.sender].pendingRewards = 0; swappedTokens += amount; bool success = IERC20(REWARD_TOKEN).transfer(msg.sender, amount); require(success, "Failed to claim rewards"); emit Claimed(msg.sender, amount); } function processRewards() public { uint256 gas = gasForProcessing; uint256 iterations = 0; while (gas > 0 && iterations < batchSize && currentIndex < holders.length) { uint256 gasUsed = gasleft(); _distributeRewards(holders[currentIndex]); gas -= (gasUsed - gasleft()); currentIndex++; iterations++; } if (currentIndex >= holders.length) { currentIndex = 0; } } function _distributeRewards(address holder) internal { if (holderInfo[holder].amount == 0) return; uint256 amount = getUnpaidEarnings(holder); if (amount > 0) { uint256 contractBalance = IERC20(REWARD_TOKEN).balanceOf(address(this)); if (amount <= contractBalance) { holderInfo[holder].totalExcluded = getSharesPercentage(holder); holderInfo[holder].pendingRewards = 0; swappedTokens += amount; bool success = IERC20(REWARD_TOKEN).transfer(holder, amount); if (success) { emit RainPrinted(holder, amount); } else { holderInfo[holder].pendingRewards += amount; holderInfo[holder].totalExcluded -= getSharesPercentage(holder); swappedTokens -= amount; } } } } // Fixed _setShare function with proper minimum threshold 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) { if (amount == 0) { _removeHolder(holder); } else { totalShares = totalShares - holderInfo[holder].amount + amount; holderInfo[holder].amount = amount; holderInfo[holder].pendingRewards = getSharesPercentage(holder); } } else { _addHolder(holder); holderInfo[holder].amount = amount; holderInfo[holder].pendingRewards = getSharesPercentage(holder); totalShares += amount; } } // Improved _addHolder function function _addHolder(address holder) internal { // Check if holder already exists (safety check) if (holderIndexes[holder] > 0 || (holders.length > 0 && holders[0] == holder)) { return; } holders.push(holder); holderIndexes[holder] = holders.length - 1; emit HolderAdded(holder); } // Improved _removeHolder function function _removeHolder(address holder) internal { // Make sure holder exists if (holders.length == 0 || (holderIndexes[holder] == 0 && holders[0] != holder) || holderIndexes[holder] >= holders.length) { return; } address lastHolder = holders[holders.length - 1]; uint256 holderIndex = holderIndexes[holder]; // Replace the removed holder with the last one holders[holderIndex] = lastHolder; holderIndexes[lastHolder] = holderIndex; // Remove the last element holders.pop(); delete holderIndexes[holder]; // Update totals totalShares -= holderInfo[holder].amount; delete holderInfo[holder]; emit HolderRemoved(holder); } // New function to manually swap RAIN tokens for wS tokens function manualSwap() public onlyOwner { // Ensure there are tokens to swap uint256 contractBalance = balanceOf(address(this)); require(contractBalance > 0, "No tokens to swap"); // Determine swap amount - use the smaller of the contract balance or swapThreshold uint256 swapAmount = contractBalance; if (swapThreshold > 0 && swapAmount > swapThreshold) { swapAmount = swapThreshold; } // Call the swap function _swapTokensForRewards(swapAmount); } // New helper function that handles the actual swap logic function _swapTokensForRewards(uint256 amount) internal lockTheSwap { // Setup swap path address[] memory path = new address[](2); path[0] = address(this); // RAIN token address path[1] = REWARD_TOKEN; // WRAPPED_SONIC address // Approve router _approve(address(this), ROUTER, amount); // Get initial balance uint256 initialBalance = IERC20(REWARD_TOKEN).balanceOf(address(this)); // Swap tokens for tokens IUniswapRouter(ROUTER).swapExactTokensForTokensSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); // Calculate received tokens uint256 newContractBalance = IERC20(REWARD_TOKEN).balanceOf(address(this)); uint256 swappedTokenAmount = newContractBalance - initialBalance; if (swappedTokenAmount > 0 && totalShares > 0) { // Update dividends per share totalDividends += swappedTokenAmount; dividendsPerShare = totalDividends * 10000 / totalShares; emit ManualSwapExecuted(amount, swappedTokenAmount); } } // Modified _swapAndLiquify to use the new _swapTokensForRewards function function _swapAndLiquify(uint256 amount) internal { _swapTokensForRewards(amount); } function _addETHToRewards(uint256 amount) internal { // No need to send ETH to the WRAPPED_SONIC token // This function is called after ETH is received from swapping // The contract will accumulate Wrapped Sonic tokens automatically after the swap } // Owner functions function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0), "Invalid new owner address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function enableTrading() public onlyOwner { require(!tradingEnabled, "Trading already enabled"); tradingEnabled = true; emit TradingEnabled(msg.sender); } function disableMaxWallet() public onlyOwner { require(!maxWalletDisabled, "Max wallet already disabled"); maxWalletDisabled = true; emit MaxWalletDisabled(msg.sender); } function setSwapSettings(uint256 minSwap, uint256 maxSwap) public onlyOwner { require(minSwap <= maxSwap, "Min swap must be <= max swap"); require(minSwap >= 10000 * 10**_decimals, "Min swap too small"); require(maxSwap <= 2 * 10**_decimals * _totalSupply / 100, "Max swap too large"); swapThreshold = minSwap; maxTxAmount = maxSwap; } function setRewardsSettings(uint256 interval, uint256 batch, uint256 gas) public onlyOwner { require(interval >= 60, "Interval must be at least 1 minute"); require(batch >= 5 && batch <= 100, "Batch size must be between 5 and 100"); require(gas >= 200000 && gas <= 500000, "Gas must be between 200,000 and 500,000"); processingInterval = interval; batchSize = batch; gasForProcessing = gas; emit RewardsUpdated(interval, batch, gas); } function setWhitelisted(address account, bool status) public onlyOwner { whitelisted[account] = status; } // Fixed setExcluded function with correct logic function setExcluded(address account, bool status) public 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)); } } } function setFeeStructure( uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _burnFee ) public onlyOwner { uint256 newTotalFee = _liquidityFee + _buybackFee + _reflectionFee + _marketingFee + _burnFee; liquidityFee = _liquidityFee; buybackFee = _buybackFee; reflectionFee = _reflectionFee; marketingFee = _marketingFee; burnFee = _burnFee; totalFees = newTotalFee; } function withdrawSurplus() public onlyOwner { uint256 contractETH = 0; for (uint256 i = 0; i < holders.length; i++) { contractETH += balanceOf(holders[i]); } uint256 contractBalance = IERC20(REWARD_TOKEN).balanceOf(address(this)); if (contractBalance <= contractETH) { revert("No surplus available"); } uint256 surplus = contractBalance - contractETH; if (surplus <= 0) { revert("No surplus to withdraw"); } bool success = IERC20(REWARD_TOKEN).transfer(_owner, surplus); require(success, "Surplus withdrawal failed"); emit SurplusWithdrawn(_owner, surplus); } function rescueToken(address token, uint256 amount) public onlyOwner { require(token != REWARD_TOKEN, "Cannot rescue dividend token"); IERC20(token).transfer(_owner, amount); } function withdrawETH() public onlyOwner { (bool success,) = _owner.call{value: address(this).balance}(""); require(success, "ETH withdrawal failed"); } function resetRewards() public onlyOwner { for (uint256 i = 0; i < holders.length; i++) { _removeHolder(holders[i]); } totalShares = 0; lastProcessedTime = block.timestamp; } // New function to fix holder tracking for existing token holders function fixHolders() public onlyOwner { // This function should be called once to correct the holder tracking // It will clear and rebuild the holders list // First, save all balances to memory address[] memory accounts = new address[](100); // Adjust size as needed uint256[] memory balances = new uint256[](100); uint256 count = 0; // In a real implementation, you would need to get this data from off-chain // For testing purposes, you can manually add known holders here // Clear current holders while(holders.length > 0) { address holder = holders[holders.length - 1]; _removeHolder(holder); } totalShares = 0; // Re-add holders with balances for (uint256 i = 0; i < count; i++) { if (!excluded[accounts[i]] && balances[i] >= 1 * 10**_decimals) { _setShare(accounts[i], balances[i]); } } } /** * @dev Manually distribute rewards to a specific number of holders * @param batchCount Number of holders to process in this call * @return (processedHolders, currentPosition) - Number of holders processed and current position in the holders array */ function manualDistributeRewards(uint256 batchCount) public returns (uint256, uint256) { // Allow owners and any address if automatic timing is ready require(msg.sender == _owner || isRewardsReady(), "Not authorized or too early"); // Use either the provided batch count or the contract's default batchSize uint256 batchSize = batchCount > 0 ? batchCount : this.batchSize(); // Cap at the remaining holders to prevent array out-of-bounds errors if (currentIndex + batchSize > holders.length) { batchSize = holders.length - currentIndex; } // If no holders to process, reset index and return if (batchSize == 0) { currentIndex = 0; return (0, 0); } // Track the starting position for return value uint256 startIndex = currentIndex; // Process the batch of holders for (uint256 i = 0; i < batchSize; i++) { if (currentIndex < holders.length) { _distributeRewards(holders[currentIndex]); currentIndex++; } } // Calculate how many holders were actually processed uint256 processedCount = currentIndex - startIndex; // Reset index if we've reached the end if (currentIndex >= holders.length) { currentIndex = 0; // Update the last processed time if we've completed a full cycle lastProcessedTime = block.timestamp; } // Return the number of holders processed and the current position return (processedCount, currentIndex); } /** * @dev Get the current distribution status * @return (totalHolders, currentPosition, processedPercent) - Total holders count, current processing position, percentage complete */ 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); } // Receive function to accept ETH receive() external payable {} }
{ "optimizer": { "enabled": true, "runs": 1000 }, "viaIR": true, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"}],"name":"HolderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"}],"name":"HolderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rainAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wsReceived","type":"uint256"}],"name":"ManualSwapExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"MaxWalletDisabled","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":false,"internalType":"uint256","name":"ethSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensReceived","type":"uint256"}],"name":"RainAutoLPTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RainBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RainPrinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"intervalSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"batchSize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SurplusWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"TradingEnabled","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":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SONIC_LP_PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","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":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","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":"disableMaxWallet","outputs":[],"stateMutability":"nonpayable","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":"fixHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"address","name":"account","type":"address"}],"name":"getHolderDetails","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestMetrics","outputs":[{"internalType":"uint256","name":"holdersCount","type":"uint256"},{"internalType":"uint256","name":"swappedTotal","type":"uint256"},{"internalType":"uint256","name":"contractBalance","type":"uint256"},{"internalType":"uint256","name":"sharesTotal","type":"uint256"},{"internalType":"uint256","name":"dividendsTotal","type":"uint256"},{"internalType":"uint256","name":"distributedTotal","type":"uint256"},{"internalType":"uint256","name":"nextProcessingTime","type":"uint256"},{"internalType":"uint256","name":"timeUntilProcessing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsInfo","outputs":[{"internalType":"uint256","name":"totalHolders","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"},{"internalType":"bool","name":"isProcessingAvailable","type":"bool"},{"internalType":"uint256","name":"nextProcessing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeUntilProcessing","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":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchCount","type":"uint256"}],"name":"manualDistributeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingFee","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":"maxWalletDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processingInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[],"name":"resetRewards","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":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setFeeStructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"}],"name":"setLPPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"batch","type":"uint256"},{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setRewardsSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minSwap","type":"uint256"},{"internalType":"uint256","name":"maxSwap","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swappedTokens","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":"totalDistributed","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":"totalFees","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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawSurplus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052346102b6576100146001546102bb565b601f811161026c575b506008632930b4b760e11b01600155600254610038906102bb565b601f8111610222575b506008632920a4a760e11b0160025560068054336001600160a01b031990911681179091556a52b7d2dcc80cd2e400000060038190556000918252600460205260408220556a01a784379d99db42000000600a819055600b556b019d971e4fe8401e740000006127109004600c556005600d819055601055600e819055600f8190556011819055601281905561012c60155560148055620493e060135580546001600160a01b03191673663dc15d3c1ac63ff12e45ab68fea3f0a883c251178155600654610117906001600160a01b03166102f5565b60035480601b5530156101bd577395a7e403d7cf20f675ff9273d66e94d35ba49fa3903083526005602052604083208284526020528060408420556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203092a3600354906040519182527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3604051613885908161043a8239f35b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b634e487b7160e01b82526011600452602482fd5b6002600052601f0160051c7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace908101905b8181106102605750610041565b60008155600101610253565b6001600052601f0160051c7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6908101905b8181106102aa575061001d565b6000815560010161029d565b600080fd5b90600182811c921680156102eb575b60208310146102d557565b634e487b7160e01b600052602260045260246000fd5b91607f16916102ca565b6001600160a01b0316600081815260196020526040902054158015906103ec575b6103e957601854680100000000000000008110156103d3576001810160185560006018548210156103bf576018908190527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e9190910180546001600160a01b0319168317905554600090600019810190811161020e57828252601960205260408220557f9894d458cf29e8bc4eb7e591bac54b31dc90125dfa852474419972ab4347dd129080a2565b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b600052604160045260246000fd5b50565b506018541515801561031657506000601854156103bf57601890527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e546001600160a01b0316811461031656fe608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c90816303fd2a451461227c575080630445b6671461225e57806306fdde03146121a1578063095ea7b31461217a5780630a05cd011461215557806313114a9d1461213757806318160ddd1461211957806323b872dd1461202957806326987b601461200b5780632836be2414611f5357806328fd319814611f2f578063313ce56714611f1357806333f3d62814611e17578063372500ab14611b86578063395924dc14611a525780633a98ef3914611a345780633b2d081c14611a165780633c590e76146119f8578063429cead1146119bb5780634ada218b1461199557806351bc3c851461163857806363c98ffa1461161a57806365356f8c146115705780636b67c4df146115525780636d1d59a8146114f857806370a08231146114bf578063715018a61461145457806383ad7994146114365780638731b2e9146112315780638a24c17514610fa85780638a8c523c14610ecc5780638c0b5e2214610eae5780638da5cb5b14610e875780638ef8ed3214610e5c5780638f3fa86014610e3e5780638f4590d214610cc35780639281aa0b14610c7b5780639302db3e14610c1157806395d89b4114610b0c57806398118cb414610aee578063997664d714610ad05780639c1b8af514610ab25780639f27f00b14610a8f5780639fde54f514610a47578063a1b140b614610a0a578063a9059cbb146109d8578063a98a934a146108fd578063ad29f5da14610894578063ad523fe114610773578063ba1066ed14610750578063c07fbb8c14610718578063c20ab228146106f2578063d936547e146106b5578063dd62ed3e14610665578063de1c24d0146105ca578063e086e5ec146104fd578063e2d2e219146104df578063ea05c027146104b9578063efca2eed1461049b578063f0425fe11461047d578063f1320af214610440578063f2fde38b1461037b578063f4daaba11461035d578063f74fe6be14610338578063f9fc0d071461031c5763fce589d80361000f57346103195780600319360112610319576020601254604051908152f35b80fd5b503461031957806003193601126103195761033561279c565b80f35b50346103195780600319360112610319576020610353612787565b6040519015158152f35b50346103195780600319360112610319576020601454604051908152f35b5034610319576020366003190112610319576103956122e5565b600654906001600160a01b03808316916103b08333146123dd565b169182156103fc578273ffffffffffffffffffffffffffffffffffffffff19927f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08680a3161760065580f35b606460405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206e6577206f776e65722061646472657373000000000000006044820152fd5b50346103195760203660031901126103195760ff60406020926001600160a01b036104696122e5565b168152600984522054166040519015158152f35b50346103195780600319360112610319576020602154604051908152f35b50346103195780600319360112610319576020601d54604051908152f35b50346103195780600319360112610319576001600160a01b036020915416604051908152f35b50346103195780600319360112610319576020601e54604051908152f35b5034610319578060031936011261031957808080806001600160a01b03600654166105298133146123dd565b47905af13d156105c5573d67ffffffffffffffff81116105b1576040519061055b601f8201601f191660200183612340565b81528260203d92013e5b1561056d5780f35b606460405162461bcd60e51b815260206004820152601560248201527f455448207769746864726177616c206661696c656400000000000000000000006044820152fd5b602483634e487b7160e01b81526041600452fd5b610565565b5034610319576020366003190112610319576001600160a01b036105ec6122e5565b6105fb826006541633146123dd565b1680156106215773ffffffffffffffffffffffffffffffffffffffff1982541617815580f35b606460405162461bcd60e51b815260206004820152601e60248201527f4c5020706169722063616e6e6f74206265207a65726f206164647265737300006044820152fd5b5034610319576040366003190112610319576001600160a01b0360406106896122e5565b92826106936122fb565b9416815260056020522091166000526020526020604060002054604051908152f35b50346103195760203660031901126103195760ff60406020926001600160a01b036106de6122e5565b168152600784522054166040519015158152f35b5034610319578060031936011261031957602060ff60065460a01c166040519015158152f35b50346103195760203660031901126103195760406020916001600160a01b0361073f6122e5565b168152601983522054604051908152f35b5034610319578060031936011261031957602060ff601754166040519015158152f35b503461031957806003193601126103195760185481805b82821061084a575050604051916370a0823160e01b835230600484015260208360248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa90811561083e5790610806575b608092506107dd612787565b6107ec60165460155490612495565b916040519384526020840152151560408301526060820152f35b506020823d602011610836575b8161082060209383612340565b8101031261083157608091516107d1565b600080fd5b3d9150610813565b604051903d90823e3d90fd5b61088c6001916108866001600160a01b03610864866124a2565b90549060031b1c166001600160a01b0316600052600460205260406000205490565b90612495565b91019061078a565b50346103195780600319360112610319576108bb6001600160a01b036006541633146123dd565b805b6018548110156108f157806108eb6001600160a01b036108de6001946124a2565b90549060031b1c166133bd565b016108bd565b5080601b554260165580f35b50346103195780600319360112610319576006546109256001600160a01b03821633146123dd565b60ff8160a01c16610994577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017600655337fadf394848f4a4640c44200e2408200a65398b3cda533d9db87526013e20c8d278280a280f35b606460405162461bcd60e51b815260206004820152601b60248201527f4d61782077616c6c657420616c72656164792064697361626c656400000000006044820152fd5b5034610319576040366003190112610319576109ff6109f56122e5565b60243590336129d5565b602060405160018152f35b5034610319578060031936011261031957610a43610a2661274c565b604080519384526020840192909252908201529081906060820190565b0390f35b5034610319576103356001600160a01b03610a6136612311565b9190610a72826006541633146123dd565b1683526009602052604083209060ff801983541691151516179055565b50346103195780600319360112610319576020610aaa612722565b604051908152f35b50346103195780600319360112610319576020601354604051908152f35b50346103195780600319360112610319576020601c54604051908152f35b50346103195780600319360112610319576020600e54604051908152f35b50346103195780600319360112610319576040519080600254908160011c91600181168015610c07575b602084108114610bf357838652908115610bcc5750600114610b6f575b610a4384610b6381860382612340565b6040519182918261229c565b600281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b808210610bb257509091508101602001610b6382610b53565b919260018160209254838588010152019101909291610b99565b60ff191660208087019190915292151560051b85019092019250610b639150839050610b53565b602483634e487b7160e01b81526022600452fd5b92607f1692610b36565b50346103195760a0366003190112610319576004356024356044356064359060843592610c4a6001600160a01b036006541633146123dd565b610c6584610c6085610c6086610c60878c612495565b612495565b94600e55600f55601055601155601255600d5580f35b5034610319576103356001600160a01b03610c9536612311565b9190610ca6826006541633146123dd565b1683526007602052604083209060ff801983541691151516179055565b50346103195760403660031901126103195760043560243590610cf26001600160a01b036006541633146123dd565b818111610dfa57670de0b6b3a764000069021e19e0c9bab24000008210610db6577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610da257610d4e6064916003549060011b612523565b048211610d5e57600c55600a5580f35b606460405162461bcd60e51b815260206004820152601260248201527f4d6178207377617020746f6f206c6172676500000000000000000000000000006044820152fd5b602484634e487b7160e01b81526011600452fd5b606460405162461bcd60e51b815260206004820152601260248201527f4d696e207377617020746f6f20736d616c6c00000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f4d696e2073776170206d757374206265203c3d206d61782073776170000000006044820152fd5b50346103195780600319360112610319576020600b54604051908152f35b5034610319576020366003190112610319576040610e7b600435612545565b82519182526020820152f35b503461031957806003193601126103195760206001600160a01b0360065416604051908152f35b50346103195780600319360112610319576020600a54604051908152f35b5034610319578060031936011261031957600654610ef46001600160a01b03821633146123dd565b60ff8160a81c16610f64577fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000017600655337f32acebb207383f6d09c833a8b6ff8e83246f4cf11637e76f9b94ef945c704a308280a280f35b606460405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152fd5b50346103195780600319360112610319576001600160a01b0360065416610fd08133146123dd565b81826018545b80821061120d575050604051906370a0823160e01b825230600483015260208260248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa9182156112025784926111ce575b508082111561118a57611030916123ba565b9081156111465760405163a9059cbb60e01b81526001600160a01b03919091166004820152602481018290526020816044818673039e2fb66102314ce7b64ce5ce3e5183bc94ad385af190811561113b57839161110c575b50156110c8577fb94528ab6dc2c15743a47b933115b331b7beae78712677f1e345a9f1ae84bbd160206001600160a01b036006541692604051908152a280f35b606460405162461bcd60e51b815260206004820152601960248201527f537572706c7573207769746864726177616c206661696c6564000000000000006044820152fd5b61112e915060203d602011611134575b6111268183612340565b81019061247d565b38611088565b503d61111c565b6040513d85823e3d90fd5b606460405162461bcd60e51b815260206004820152601660248201527f4e6f20737572706c757320746f207769746864726177000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601460248201527f4e6f20737572706c757320617661696c61626c650000000000000000000000006044820152fd5b9091506020813d6020116111fa575b816111ea60209383612340565b810103126108315751903861101e565b3d91506111dd565b6040513d86823e3d90fd5b90916112296001916108866001600160a01b03610864876124a2565b920190610fd6565b503461031957606036600319011261031957600435602435604435916112636001600160a01b036006541633146123dd565b603c81106113cc576005821015806113c1575b156113585762030d408310158061134b575b156112e1576112db7f4b4e9b2b02700f36dc5c043149dbb42bc2bf2211b35cd776181b8a9880891be293826015558360145580601355604051938493846040919493926060820195825260208201520152565b0390a180f35b608460405162461bcd60e51b815260206004820152602760248201527f476173206d757374206265206265747765656e203230302c30303020616e642060448201527f3530302c303030000000000000000000000000000000000000000000000000006064820152fd5b506207a120831115611288565b608460405162461bcd60e51b8152602060048201526024808201527f42617463682073697a65206d757374206265206265747765656e203520616e6460448201527f20313030000000000000000000000000000000000000000000000000000000006064820152fd5b506064821115611276565b608460405162461bcd60e51b815260206004820152602260248201527f496e74657276616c206d757374206265206174206c656173742031206d696e7560448201527f74650000000000000000000000000000000000000000000000000000000000006064820152fd5b50346103195780600319360112610319576020601054604051908152f35b503461031957806003193601126103195773ffffffffffffffffffffffffffffffffffffffff19600654826001600160a01b0382166114948133146123dd565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a31660065580f35b5034610319576020366003190112610319576020610aaa6114de6122e5565b6001600160a01b0316600052600460205260406000205490565b5034610319576020366003190112610319576040906001600160a01b0361151d6122e5565b168152601a602052208054610a4360026001840154930154604051938493846040919493926060820195825260208201520152565b50346103195780600319360112610319576020601154604051908152f35b50346103195780600319360112610319576115976001600160a01b036006541633146123dd565b604051610ca06115a78183612340565b60648252601f19810180926020369101376115c56040519182612340565b606481526020369101375b60185480156116125760001981019081116115fe576001600160a01b036108de6115f9926124a2565b6115d0565b602482634e487b7160e01b81526011600452fd5b5080601b5580f35b50346103195780600319360112610319576020601654604051908152f35b503461031957806003193601126103195761165f6001600160a01b036006541633146123dd565b30815260046020526040812054801561195157600c54801515818382611947575b505061193f575b50600160ff1960205416176020556040516116a3606082612340565b6002815260208101906040368337306116bb82612506565b5273039e2fb66102314ce7b64ce5ce3e5183bc94ad386116da82612513565b526116e58330612830565b604051916370a0823160e01b835230600484015260208360248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa928315611934578593611900575b507395a7e403d7cf20f675ff9273d66e94d35ba49fa33b156118fc5790846040518093635c11d79560e01b825260a482019387600484015283602484015260a060448401525180945260c482019093835b8181106118d7575050819293503060648301524260848301520381837395a7e403d7cf20f675ff9273d66e94d35ba49fa35af18015611202576118c3575b50604051906370a0823160e01b825230600483015260208260248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa801561120257849061188f575b6117fc92506123ba565b80151580611884575b611818575b8260ff196020541660205580f35b61182481601c54612495565b80601c556127108102908082046127101490151715610da2579160409161186f7ff3f26d5868efb63003b8eb193a2e6cab91e9cf8f8637177178034b36d54e1d5194601b5490612702565b601e5582519182526020820152a1388061180a565b50601b541515611805565b506020823d6020116118bb575b816118a960209383612340565b81010312610831576117fc91516117f2565b3d915061189c565b836118d091949294612340565b91386117b3565b85516001600160a01b031683526020958601958a955087945090920191600101611775565b8480fd5b9092506020813d60201161192c575b8161191c60209383612340565b810103126118fc57519138611724565b3d915061190f565b6040513d87823e3d90fd5b905038611687565b1190508138611680565b606460405162461bcd60e51b815260206004820152601160248201527f4e6f20746f6b656e7320746f20737761700000000000000000000000000000006044820152fd5b5034610319578060031936011261031957602060ff60065460a81c166040519015158152f35b50346103195760203660031901126103195760ff60406020926001600160a01b036119e46122e5565b168152600884522054166040519015158152f35b50346103195780600319360112610319576020601554604051908152f35b50346103195780600319360112610319576020600f54604051908152f35b50346103195780600319360112610319576020601b54604051908152f35b503461031957806003193601126103195760185481805b828210611b645750506040516370a0823160e01b815230600482015260208160248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa90811561113b578391611b2c575b506101009290601654601554611ac68183612495565b4210611b11575b60215492601b5490611ae5601c5493601d5495612495565b94604051978852602088015260408701526060860152608085015260a084015260c083015260e0820152f35b9250611b2642611b218584612495565b6123ba565b92611acd565b90506020813d602011611b5c575b81611b4760209383612340565b81010312611b585751610100611ab0565b8280fd5b3d9150611b3a565b611b7e6001916108866001600160a01b03610864866124a2565b910190611a69565b5034610319578060031936011261031957338152600860205260ff604082205416611dd357611bb433612428565b8015611d8f576040516370a0823160e01b815230600482015260208160248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa801561113b5782918491611d5a575b5010611d1657611c0833613568565b338352601a6020526002604084200155338252601a602052816001604082200155611c3581602154612495565b60215560405163a9059cbb60e01b8152336004820152602481018290526020816044818673039e2fb66102314ce7b64ce5ce3e5183bc94ad385af190811561113b578391611cf7575b5015611cb3576040519081527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a60203392a280f35b606460405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f20636c61696d20726577617264730000000000000000006044820152fd5b611d10915060203d602011611134576111268183612340565b38611c7e565b606460405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152fd5b9150506020813d602011611d87575b81611d7660209383612340565b81010312611b585781905138611bf9565b3d9150611d69565b606460405162461bcd60e51b815260206004820152601360248201527f4e6f207265776172647320746f20636c61696d000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f4578636c756465642066726f6d207265776172647300000000000000000000006044820152fd5b503461031957604036600319011261031957611e316122e5565b6001600160a01b03806006541691611e4a8333146123dd565b1673039e2fb66102314ce7b64ce5ce3e5183bc94ad388114611ecf5760405163a9059cbb60e01b81526001600160a01b0392909216600483015260248035908301526020908290604490829086905af18015611ec457611ea8575080f35b611ec09060203d602011611134576111268183612340565b5080f35b6040513d84823e3d90fd5b606460405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420726573637565206469766964656e6420746f6b656e000000006044820152fd5b5034610319578060031936011261031957602060405160128152f35b5034610319576020366003190112610319576020610aaa611f4e6122e5565b612428565b503461031957611f6236612311565b611f786001600160a01b036006541633146123dd565b6001600160a01b03821690818452600860205260ff60408520541681151590151503611fa2578380f35b8184526008602052611fc381604086209060ff801983541691151516179055565b15611ff1578252601a6020526040822054611fe2575b505b3880808380f35b611feb906133bd565b38611fd9565b825260046020526040822054612006916132ac565b611fdb565b50346103195780600319360112610319576020601f54604051908152f35b5034610319576060366003190112610319576120436122e5565b9061204c6122fb565b6040604435926001600160a01b038516815260056020528181206001600160a01b0333168252602052205492600019840361208c575b6109ff93506129d5565b8284106120af576120aa6120a3846109ff966123ba565b3383612904565b612082565b608460405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152fd5b50346103195780600319360112610319576020600354604051908152f35b50346103195780600319360112610319576020600d54604051908152f35b503461031957602036600319011261031957610a43610a266121756122e5565b612378565b5034610319576040366003190112610319576109ff6121976122e5565b6024359033612904565b50346103195780600319360112610319576040519080600154908160011c91600181168015612254575b602084108114610bf357838652908115610bcc57506001146121f757610a4384610b6381860382612340565b600181527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b80821061223a57509091508101602001610b6382610b53565b919260018160209254838588010152019101909291612221565b92607f16926121cb565b50346103195780600319360112610319576020600c54604051908152f35b9050346122985781600319360112612298578061dead60209252f35b5080fd5b91909160208152825180602083015260005b8181106122cf575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016122ae565b600435906001600160a01b038216820361083157565b602435906001600160a01b038216820361083157565b6040906003190112610831576004356001600160a01b0381168103610831579060243580151581036108315790565b90601f8019910116810190811067ffffffffffffffff82111761236257604052565b634e487b7160e01b600052604160045260246000fd5b601b54156123ae576001600160a01b038116600052601a60205260406000209160026123a5845493612428565b93015491929190565b50600090600090600090565b919082039182116123c757565b634e487b7160e01b600052601160045260246000fd5b156123e457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6001600160a01b0381169081600052601a602052604060002054156124765761245090613568565b90600052601a6020526002604060002001548082111561247657612473916123ba565b90565b5050600090565b90816020910312610831575180151581036108315790565b919082018092116123c757565b6018548110156124bd57601860005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b601854156124bd57601860009081527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e91565b8051156124bd5760200190565b8051600110156124bd5760400190565b818102929181159184041417156123c757565b60001981146123c75760010190565b6001600160a01b0360065416331480156126f4575b156126b057600081156126345750905b601f546125778382612495565b601854809111612621575b5050811561261257601f549160005b8181106125c65750506125a7601f5492836123ba565b9160185411156125b8575b601f5490565b6000601f55426016556125b2565b600190601f5460185481106125dd575b5001612591565b6001600160a01b036125f16125fe926124a2565b90549060031b1c166135a2565b612609601f54612536565b601f55386125d6565b90506000601f55600090600090565b61262c9293506123ba565b903880612582565b90506040517ff4daaba1000000000000000000000000000000000000000000000000000000008152602081600481305afa91821561083e57809261267b575b50509061256a565b9091506020823d6020116126a8575b8161269760209383612340565b810103126103195750513880612673565b3d915061268a565b606460405162461bcd60e51b815260206004820152601b60248201527f4e6f7420617574686f72697a6564206f7220746f6f206561726c7900000000006044820152fd5b506126fd612787565b61255a565b811561270c570490565b634e487b7160e01b600052601260045260246000fd5b61272a612787565b6127475761247361274060165460155490612495565b42906123ba565b600090565b601854801561277b57601f549160648302838104606414841517156123c7578261277591612702565b91929190565b50600090600090606490565b61279660165460155490612495565b42101590565b601354906000915b80151580612825575b80612818575b15612800576127e66127fa916127e05a6127d96001600160a01b036125f1601f546124a2565b5a906123ba565b906123ba565b926127f2601f54612536565b601f55612536565b916127a4565b509050601f54601854111561281157565b6000601f55565b50601f54601854116127b3565b5060145483106127ad565b6001600160a01b0316801561289b577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560207395a7e403d7cf20f675ff9273d66e94d35ba49fa3938360005260058252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b6001600160a01b031690811561289b576001600160a01b031691821561296b5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260058252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152fd5b9160009281156132425760065460ff8160a81c161580613209575b613182575b60a01c60ff1680613170575b8061315b575b8061313e575b8061311e575b6130b2575b30845260046020526040842054600c5480911015806130a5575b80613088575b80613068575b80613048575b612d47575b506001906001600160a01b038116928392838752600760205260ff6040882054168015612d28575b612d21575b8690612c82575b506001600160a01b03851693849182612c6457612a9c816003546123ba565b6003555b81612ba0575b60207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91604051908152a3818552600860205260ff6040862054161580612b8c575b612b6f575b5050808352600860205260ff6040842054161580612b5b575b612b3d575b50505060ff602054161580612b2f575b612b2157565b612b2961279c565b42601655565b50612b38612787565b612b1b565b82604091612b53945260046020522054906132ac565b388080612b0b565b506001600160a01b03835416811415612b06565b612b8591855260046020526040852054906132ac565b3880612aed565b506001600160a01b03855416821415612ae8565b91508652600460205280604087205410612bfa57827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208693838a526004825260408a20612bf08282546123ba565b9055915050612aa6565b608460405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152fd5b828852600460205260408820612c7b828254612495565b9055612aa0565b6001600160a01b03875416808514908115612d0e575b50612cf9575b8015612a7d57612cf391308852600460205260408820612cbf838254612495565b9055604051828152857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a36123ba565b38612a7d565b506064612d08600d5483612523565b04612c9e565b90506001600160a01b0387161438612c98565b5085612a76565b506001600160a01b0386168752600760205260ff604088205416612a71565b6017805460ff1916600117905580831115613041575b600160ff196020541617602055604051612d78606082612340565b600281526020810190604036833730612d9082612506565b5273039e2fb66102314ce7b64ce5ce3e5183bc94ad38612daf82612513565b52612dba8330612830565b604051916370a0823160e01b835230600484015260208360248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa928315613036578893613002575b507395a7e403d7cf20f675ff9273d66e94d35ba49fa33b15612ffe5790876040518093635c11d79560e01b825260a482019387600484015283602484015260a060448401525180945260c482019093835b818110612fd9575050819293503060648301524260848301520381837395a7e403d7cf20f675ff9273d66e94d35ba49fa35af18015612fba57612fc5575b50604051906370a0823160e01b825230600483015260208260248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa8015612fba578790612f86575b612ed192506123ba565b80151580612f7b575b612efb575b505060ff196020541660205560ff196017541660175538612a49565b612f0781601c54612495565b80601c556127108102908082046127101490151715612f675791604091612f527ff3f26d5868efb63003b8eb193a2e6cab91e9cf8f8637177178034b36d54e1d5194601b5490612702565b601e5582519182526020820152a13880612edf565b602487634e487b7160e01b81526011600452fd5b50601b541515612eda565b506020823d602011612fb2575b81612fa060209383612340565b8101031261083157612ed19151612ec7565b3d9150612f93565b6040513d89823e3d90fd5b86612fd291979297612340565b9438612e88565b85516001600160a01b031683526020958601958d955087945090920191600101612e4a565b8780fd5b9092506020813d60201161302e575b8161301e60209383612340565b81010312612ffe57519138612df9565b3d9150613011565b6040513d8a823e3d90fd5b5081612d5d565b506001600160a01b0384168552600760205260ff60408620541615612a44565b506001600160a01b0382168552600760205260ff60408620541615612a3e565b506001600160a01b038554166001600160a01b0383161415612a38565b5060ff6020541615612a32565b6001600160a01b038316845260046020526130d1826040862054612495565b600b541015612a1857606460405162461bcd60e51b815260206004820152601960248201527f4d61782077616c6c6574206c696d6974206578636565646564000000000000006044820152fd5b506001600160a01b0383168452600960205260ff60408520541615612a13565b506001600160a01b038454166001600160a01b0384161415612a0d565b5061dead6001600160a01b0384161415612a07565b506001600160a01b0383161515612a01565b6001600160a01b0382168552600760205260ff60408620541680156131ea575b6129f557606460405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152fd5b506001600160a01b0384168552600760205260ff6040862054166131a2565b506001600160a01b03855416806001600160a01b0384161490811561322f575b506129f0565b90506001600160a01b0385161438613229565b608460405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152fd5b670de0b6b3a76400008210613385576001600160a01b0381169182600052601a602052604060002054151560001461333f57806132f057506132ee91506133bd565b565b908161331461332b93610c60601b5487600052601a602052604060002054906123ba565b601b5583600052601a602052604060002055613568565b90600052601a602052600160406000200155565b9091613366836133516133809561378f565b82600052601a60205283604060002055613568565b90600052601a602052600160406000200155601b54612495565b601b55565b90158061339d575b6133945750565b6132ee906133bd565b506001600160a01b038116600052601a602052604060002054151561338d565b6018548015801561351e575b80156134fd575b6134f95760001981019081116123c7576001600160a01b036133f281926124a2565b90549060031b1c16911690816000526019602052604060002054906134398161341a846124a2565b9091906001600160a01b038084549260031b9316831b921b1916179055565b600052601960205260406000205560185480156134e3576000190161345d816124a2565b6001600160a01b0382549160031b1b191690556018558060005260196020526000604081205580600052601a60205261349d604060002054601b546123ba565b601b5580600052601a602052600060026040822082815582600182015501557fd9bc583d1445615d8b795b7374f03ff79efa83b6359a91331efd95e4cf023ab6600080a2565b634e487b7160e01b600052603160045260246000fd5b5050565b506001600160a01b03821660005260196020528060406000205410156133d0565b506001600160a01b038216806000526019602052604060002054159081613546575b506133c9565b90506001600160a01b036135586124d3565b90549060031b1c16141538613540565b601b541561359c57613598612710916001600160a01b03601e549116600052601a60205260406000205490612523565b0490565b50600090565b6001600160a01b0381169081600052601a602052604060002054156134f9576135ca81612428565b90816135d557505050565b6040516370a0823160e01b815230600482015260208160248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa9081156137515760009161375d575b5082111561362157505050565b61362a81613568565b6000848152601a602052604081206002810192909255600190910155602154613654908390612495565b60215560405163a9059cbb60e01b81526001600160a01b038216600482015260248101839052602081604481600073039e2fb66102314ce7b64ce5ce3e5183bc94ad385af190811561375157600091613732575b50156136dc575060207f07ccd18e485bb053d9974066929ac474d597f10bafa07dee4d52719a29d4bf4991604051908152a2565b9161370761372d9382600052601a6020526001604060002001613700858254612495565b9055613568565b90600052601a60205261372360026040600020019182546123ba565b90556021546123ba565b602155565b61374b915060203d602011611134576111268183612340565b386136a8565b6040513d6000823e3d90fd5b90506020813d602011613787575b8161377860209383612340565b81010312610831575138613614565b3d915061376b565b6001600160a01b0381169081600052601960205260406000205415801590613823575b6134f95760185490680100000000000000008210156123625761341a8260016137de94016018556124a2565b60185460001981019081116123c7578160005260196020526040600020557f9894d458cf29e8bc4eb7e591bac54b31dc90125dfa852474419972ab4347dd12600080a2565b50601854151580156137b25750816001600160a01b036138416124d3565b90549060031b1c16146137b256fea264697066735822122088ef90678f46a635e98428705415f1a64c715002fcae191ed33f5f5c5c2b4b4c64736f6c634300081c0033
Deployed Bytecode
0x608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c90816303fd2a451461227c575080630445b6671461225e57806306fdde03146121a1578063095ea7b31461217a5780630a05cd011461215557806313114a9d1461213757806318160ddd1461211957806323b872dd1461202957806326987b601461200b5780632836be2414611f5357806328fd319814611f2f578063313ce56714611f1357806333f3d62814611e17578063372500ab14611b86578063395924dc14611a525780633a98ef3914611a345780633b2d081c14611a165780633c590e76146119f8578063429cead1146119bb5780634ada218b1461199557806351bc3c851461163857806363c98ffa1461161a57806365356f8c146115705780636b67c4df146115525780636d1d59a8146114f857806370a08231146114bf578063715018a61461145457806383ad7994146114365780638731b2e9146112315780638a24c17514610fa85780638a8c523c14610ecc5780638c0b5e2214610eae5780638da5cb5b14610e875780638ef8ed3214610e5c5780638f3fa86014610e3e5780638f4590d214610cc35780639281aa0b14610c7b5780639302db3e14610c1157806395d89b4114610b0c57806398118cb414610aee578063997664d714610ad05780639c1b8af514610ab25780639f27f00b14610a8f5780639fde54f514610a47578063a1b140b614610a0a578063a9059cbb146109d8578063a98a934a146108fd578063ad29f5da14610894578063ad523fe114610773578063ba1066ed14610750578063c07fbb8c14610718578063c20ab228146106f2578063d936547e146106b5578063dd62ed3e14610665578063de1c24d0146105ca578063e086e5ec146104fd578063e2d2e219146104df578063ea05c027146104b9578063efca2eed1461049b578063f0425fe11461047d578063f1320af214610440578063f2fde38b1461037b578063f4daaba11461035d578063f74fe6be14610338578063f9fc0d071461031c5763fce589d80361000f57346103195780600319360112610319576020601254604051908152f35b80fd5b503461031957806003193601126103195761033561279c565b80f35b50346103195780600319360112610319576020610353612787565b6040519015158152f35b50346103195780600319360112610319576020601454604051908152f35b5034610319576020366003190112610319576103956122e5565b600654906001600160a01b03808316916103b08333146123dd565b169182156103fc578273ffffffffffffffffffffffffffffffffffffffff19927f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08680a3161760065580f35b606460405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206e6577206f776e65722061646472657373000000000000006044820152fd5b50346103195760203660031901126103195760ff60406020926001600160a01b036104696122e5565b168152600984522054166040519015158152f35b50346103195780600319360112610319576020602154604051908152f35b50346103195780600319360112610319576020601d54604051908152f35b50346103195780600319360112610319576001600160a01b036020915416604051908152f35b50346103195780600319360112610319576020601e54604051908152f35b5034610319578060031936011261031957808080806001600160a01b03600654166105298133146123dd565b47905af13d156105c5573d67ffffffffffffffff81116105b1576040519061055b601f8201601f191660200183612340565b81528260203d92013e5b1561056d5780f35b606460405162461bcd60e51b815260206004820152601560248201527f455448207769746864726177616c206661696c656400000000000000000000006044820152fd5b602483634e487b7160e01b81526041600452fd5b610565565b5034610319576020366003190112610319576001600160a01b036105ec6122e5565b6105fb826006541633146123dd565b1680156106215773ffffffffffffffffffffffffffffffffffffffff1982541617815580f35b606460405162461bcd60e51b815260206004820152601e60248201527f4c5020706169722063616e6e6f74206265207a65726f206164647265737300006044820152fd5b5034610319576040366003190112610319576001600160a01b0360406106896122e5565b92826106936122fb565b9416815260056020522091166000526020526020604060002054604051908152f35b50346103195760203660031901126103195760ff60406020926001600160a01b036106de6122e5565b168152600784522054166040519015158152f35b5034610319578060031936011261031957602060ff60065460a01c166040519015158152f35b50346103195760203660031901126103195760406020916001600160a01b0361073f6122e5565b168152601983522054604051908152f35b5034610319578060031936011261031957602060ff601754166040519015158152f35b503461031957806003193601126103195760185481805b82821061084a575050604051916370a0823160e01b835230600484015260208360248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa90811561083e5790610806575b608092506107dd612787565b6107ec60165460155490612495565b916040519384526020840152151560408301526060820152f35b506020823d602011610836575b8161082060209383612340565b8101031261083157608091516107d1565b600080fd5b3d9150610813565b604051903d90823e3d90fd5b61088c6001916108866001600160a01b03610864866124a2565b90549060031b1c166001600160a01b0316600052600460205260406000205490565b90612495565b91019061078a565b50346103195780600319360112610319576108bb6001600160a01b036006541633146123dd565b805b6018548110156108f157806108eb6001600160a01b036108de6001946124a2565b90549060031b1c166133bd565b016108bd565b5080601b554260165580f35b50346103195780600319360112610319576006546109256001600160a01b03821633146123dd565b60ff8160a01c16610994577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017600655337fadf394848f4a4640c44200e2408200a65398b3cda533d9db87526013e20c8d278280a280f35b606460405162461bcd60e51b815260206004820152601b60248201527f4d61782077616c6c657420616c72656164792064697361626c656400000000006044820152fd5b5034610319576040366003190112610319576109ff6109f56122e5565b60243590336129d5565b602060405160018152f35b5034610319578060031936011261031957610a43610a2661274c565b604080519384526020840192909252908201529081906060820190565b0390f35b5034610319576103356001600160a01b03610a6136612311565b9190610a72826006541633146123dd565b1683526009602052604083209060ff801983541691151516179055565b50346103195780600319360112610319576020610aaa612722565b604051908152f35b50346103195780600319360112610319576020601354604051908152f35b50346103195780600319360112610319576020601c54604051908152f35b50346103195780600319360112610319576020600e54604051908152f35b50346103195780600319360112610319576040519080600254908160011c91600181168015610c07575b602084108114610bf357838652908115610bcc5750600114610b6f575b610a4384610b6381860382612340565b6040519182918261229c565b600281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b808210610bb257509091508101602001610b6382610b53565b919260018160209254838588010152019101909291610b99565b60ff191660208087019190915292151560051b85019092019250610b639150839050610b53565b602483634e487b7160e01b81526022600452fd5b92607f1692610b36565b50346103195760a0366003190112610319576004356024356044356064359060843592610c4a6001600160a01b036006541633146123dd565b610c6584610c6085610c6086610c60878c612495565b612495565b94600e55600f55601055601155601255600d5580f35b5034610319576103356001600160a01b03610c9536612311565b9190610ca6826006541633146123dd565b1683526007602052604083209060ff801983541691151516179055565b50346103195760403660031901126103195760043560243590610cf26001600160a01b036006541633146123dd565b818111610dfa57670de0b6b3a764000069021e19e0c9bab24000008210610db6577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610da257610d4e6064916003549060011b612523565b048211610d5e57600c55600a5580f35b606460405162461bcd60e51b815260206004820152601260248201527f4d6178207377617020746f6f206c6172676500000000000000000000000000006044820152fd5b602484634e487b7160e01b81526011600452fd5b606460405162461bcd60e51b815260206004820152601260248201527f4d696e207377617020746f6f20736d616c6c00000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f4d696e2073776170206d757374206265203c3d206d61782073776170000000006044820152fd5b50346103195780600319360112610319576020600b54604051908152f35b5034610319576020366003190112610319576040610e7b600435612545565b82519182526020820152f35b503461031957806003193601126103195760206001600160a01b0360065416604051908152f35b50346103195780600319360112610319576020600a54604051908152f35b5034610319578060031936011261031957600654610ef46001600160a01b03821633146123dd565b60ff8160a81c16610f64577fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000017600655337f32acebb207383f6d09c833a8b6ff8e83246f4cf11637e76f9b94ef945c704a308280a280f35b606460405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152fd5b50346103195780600319360112610319576001600160a01b0360065416610fd08133146123dd565b81826018545b80821061120d575050604051906370a0823160e01b825230600483015260208260248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa9182156112025784926111ce575b508082111561118a57611030916123ba565b9081156111465760405163a9059cbb60e01b81526001600160a01b03919091166004820152602481018290526020816044818673039e2fb66102314ce7b64ce5ce3e5183bc94ad385af190811561113b57839161110c575b50156110c8577fb94528ab6dc2c15743a47b933115b331b7beae78712677f1e345a9f1ae84bbd160206001600160a01b036006541692604051908152a280f35b606460405162461bcd60e51b815260206004820152601960248201527f537572706c7573207769746864726177616c206661696c6564000000000000006044820152fd5b61112e915060203d602011611134575b6111268183612340565b81019061247d565b38611088565b503d61111c565b6040513d85823e3d90fd5b606460405162461bcd60e51b815260206004820152601660248201527f4e6f20737572706c757320746f207769746864726177000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601460248201527f4e6f20737572706c757320617661696c61626c650000000000000000000000006044820152fd5b9091506020813d6020116111fa575b816111ea60209383612340565b810103126108315751903861101e565b3d91506111dd565b6040513d86823e3d90fd5b90916112296001916108866001600160a01b03610864876124a2565b920190610fd6565b503461031957606036600319011261031957600435602435604435916112636001600160a01b036006541633146123dd565b603c81106113cc576005821015806113c1575b156113585762030d408310158061134b575b156112e1576112db7f4b4e9b2b02700f36dc5c043149dbb42bc2bf2211b35cd776181b8a9880891be293826015558360145580601355604051938493846040919493926060820195825260208201520152565b0390a180f35b608460405162461bcd60e51b815260206004820152602760248201527f476173206d757374206265206265747765656e203230302c30303020616e642060448201527f3530302c303030000000000000000000000000000000000000000000000000006064820152fd5b506207a120831115611288565b608460405162461bcd60e51b8152602060048201526024808201527f42617463682073697a65206d757374206265206265747765656e203520616e6460448201527f20313030000000000000000000000000000000000000000000000000000000006064820152fd5b506064821115611276565b608460405162461bcd60e51b815260206004820152602260248201527f496e74657276616c206d757374206265206174206c656173742031206d696e7560448201527f74650000000000000000000000000000000000000000000000000000000000006064820152fd5b50346103195780600319360112610319576020601054604051908152f35b503461031957806003193601126103195773ffffffffffffffffffffffffffffffffffffffff19600654826001600160a01b0382166114948133146123dd565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a31660065580f35b5034610319576020366003190112610319576020610aaa6114de6122e5565b6001600160a01b0316600052600460205260406000205490565b5034610319576020366003190112610319576040906001600160a01b0361151d6122e5565b168152601a602052208054610a4360026001840154930154604051938493846040919493926060820195825260208201520152565b50346103195780600319360112610319576020601154604051908152f35b50346103195780600319360112610319576115976001600160a01b036006541633146123dd565b604051610ca06115a78183612340565b60648252601f19810180926020369101376115c56040519182612340565b606481526020369101375b60185480156116125760001981019081116115fe576001600160a01b036108de6115f9926124a2565b6115d0565b602482634e487b7160e01b81526011600452fd5b5080601b5580f35b50346103195780600319360112610319576020601654604051908152f35b503461031957806003193601126103195761165f6001600160a01b036006541633146123dd565b30815260046020526040812054801561195157600c54801515818382611947575b505061193f575b50600160ff1960205416176020556040516116a3606082612340565b6002815260208101906040368337306116bb82612506565b5273039e2fb66102314ce7b64ce5ce3e5183bc94ad386116da82612513565b526116e58330612830565b604051916370a0823160e01b835230600484015260208360248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa928315611934578593611900575b507395a7e403d7cf20f675ff9273d66e94d35ba49fa33b156118fc5790846040518093635c11d79560e01b825260a482019387600484015283602484015260a060448401525180945260c482019093835b8181106118d7575050819293503060648301524260848301520381837395a7e403d7cf20f675ff9273d66e94d35ba49fa35af18015611202576118c3575b50604051906370a0823160e01b825230600483015260208260248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa801561120257849061188f575b6117fc92506123ba565b80151580611884575b611818575b8260ff196020541660205580f35b61182481601c54612495565b80601c556127108102908082046127101490151715610da2579160409161186f7ff3f26d5868efb63003b8eb193a2e6cab91e9cf8f8637177178034b36d54e1d5194601b5490612702565b601e5582519182526020820152a1388061180a565b50601b541515611805565b506020823d6020116118bb575b816118a960209383612340565b81010312610831576117fc91516117f2565b3d915061189c565b836118d091949294612340565b91386117b3565b85516001600160a01b031683526020958601958a955087945090920191600101611775565b8480fd5b9092506020813d60201161192c575b8161191c60209383612340565b810103126118fc57519138611724565b3d915061190f565b6040513d87823e3d90fd5b905038611687565b1190508138611680565b606460405162461bcd60e51b815260206004820152601160248201527f4e6f20746f6b656e7320746f20737761700000000000000000000000000000006044820152fd5b5034610319578060031936011261031957602060ff60065460a81c166040519015158152f35b50346103195760203660031901126103195760ff60406020926001600160a01b036119e46122e5565b168152600884522054166040519015158152f35b50346103195780600319360112610319576020601554604051908152f35b50346103195780600319360112610319576020600f54604051908152f35b50346103195780600319360112610319576020601b54604051908152f35b503461031957806003193601126103195760185481805b828210611b645750506040516370a0823160e01b815230600482015260208160248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa90811561113b578391611b2c575b506101009290601654601554611ac68183612495565b4210611b11575b60215492601b5490611ae5601c5493601d5495612495565b94604051978852602088015260408701526060860152608085015260a084015260c083015260e0820152f35b9250611b2642611b218584612495565b6123ba565b92611acd565b90506020813d602011611b5c575b81611b4760209383612340565b81010312611b585751610100611ab0565b8280fd5b3d9150611b3a565b611b7e6001916108866001600160a01b03610864866124a2565b910190611a69565b5034610319578060031936011261031957338152600860205260ff604082205416611dd357611bb433612428565b8015611d8f576040516370a0823160e01b815230600482015260208160248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa801561113b5782918491611d5a575b5010611d1657611c0833613568565b338352601a6020526002604084200155338252601a602052816001604082200155611c3581602154612495565b60215560405163a9059cbb60e01b8152336004820152602481018290526020816044818673039e2fb66102314ce7b64ce5ce3e5183bc94ad385af190811561113b578391611cf7575b5015611cb3576040519081527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a60203392a280f35b606460405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f20636c61696d20726577617264730000000000000000006044820152fd5b611d10915060203d602011611134576111268183612340565b38611c7e565b606460405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152fd5b9150506020813d602011611d87575b81611d7660209383612340565b81010312611b585781905138611bf9565b3d9150611d69565b606460405162461bcd60e51b815260206004820152601360248201527f4e6f207265776172647320746f20636c61696d000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f4578636c756465642066726f6d207265776172647300000000000000000000006044820152fd5b503461031957604036600319011261031957611e316122e5565b6001600160a01b03806006541691611e4a8333146123dd565b1673039e2fb66102314ce7b64ce5ce3e5183bc94ad388114611ecf5760405163a9059cbb60e01b81526001600160a01b0392909216600483015260248035908301526020908290604490829086905af18015611ec457611ea8575080f35b611ec09060203d602011611134576111268183612340565b5080f35b6040513d84823e3d90fd5b606460405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420726573637565206469766964656e6420746f6b656e000000006044820152fd5b5034610319578060031936011261031957602060405160128152f35b5034610319576020366003190112610319576020610aaa611f4e6122e5565b612428565b503461031957611f6236612311565b611f786001600160a01b036006541633146123dd565b6001600160a01b03821690818452600860205260ff60408520541681151590151503611fa2578380f35b8184526008602052611fc381604086209060ff801983541691151516179055565b15611ff1578252601a6020526040822054611fe2575b505b3880808380f35b611feb906133bd565b38611fd9565b825260046020526040822054612006916132ac565b611fdb565b50346103195780600319360112610319576020601f54604051908152f35b5034610319576060366003190112610319576120436122e5565b9061204c6122fb565b6040604435926001600160a01b038516815260056020528181206001600160a01b0333168252602052205492600019840361208c575b6109ff93506129d5565b8284106120af576120aa6120a3846109ff966123ba565b3383612904565b612082565b608460405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152fd5b50346103195780600319360112610319576020600354604051908152f35b50346103195780600319360112610319576020600d54604051908152f35b503461031957602036600319011261031957610a43610a266121756122e5565b612378565b5034610319576040366003190112610319576109ff6121976122e5565b6024359033612904565b50346103195780600319360112610319576040519080600154908160011c91600181168015612254575b602084108114610bf357838652908115610bcc57506001146121f757610a4384610b6381860382612340565b600181527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b80821061223a57509091508101602001610b6382610b53565b919260018160209254838588010152019101909291612221565b92607f16926121cb565b50346103195780600319360112610319576020600c54604051908152f35b9050346122985781600319360112612298578061dead60209252f35b5080fd5b91909160208152825180602083015260005b8181106122cf575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016122ae565b600435906001600160a01b038216820361083157565b602435906001600160a01b038216820361083157565b6040906003190112610831576004356001600160a01b0381168103610831579060243580151581036108315790565b90601f8019910116810190811067ffffffffffffffff82111761236257604052565b634e487b7160e01b600052604160045260246000fd5b601b54156123ae576001600160a01b038116600052601a60205260406000209160026123a5845493612428565b93015491929190565b50600090600090600090565b919082039182116123c757565b634e487b7160e01b600052601160045260246000fd5b156123e457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6001600160a01b0381169081600052601a602052604060002054156124765761245090613568565b90600052601a6020526002604060002001548082111561247657612473916123ba565b90565b5050600090565b90816020910312610831575180151581036108315790565b919082018092116123c757565b6018548110156124bd57601860005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b601854156124bd57601860009081527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e91565b8051156124bd5760200190565b8051600110156124bd5760400190565b818102929181159184041417156123c757565b60001981146123c75760010190565b6001600160a01b0360065416331480156126f4575b156126b057600081156126345750905b601f546125778382612495565b601854809111612621575b5050811561261257601f549160005b8181106125c65750506125a7601f5492836123ba565b9160185411156125b8575b601f5490565b6000601f55426016556125b2565b600190601f5460185481106125dd575b5001612591565b6001600160a01b036125f16125fe926124a2565b90549060031b1c166135a2565b612609601f54612536565b601f55386125d6565b90506000601f55600090600090565b61262c9293506123ba565b903880612582565b90506040517ff4daaba1000000000000000000000000000000000000000000000000000000008152602081600481305afa91821561083e57809261267b575b50509061256a565b9091506020823d6020116126a8575b8161269760209383612340565b810103126103195750513880612673565b3d915061268a565b606460405162461bcd60e51b815260206004820152601b60248201527f4e6f7420617574686f72697a6564206f7220746f6f206561726c7900000000006044820152fd5b506126fd612787565b61255a565b811561270c570490565b634e487b7160e01b600052601260045260246000fd5b61272a612787565b6127475761247361274060165460155490612495565b42906123ba565b600090565b601854801561277b57601f549160648302838104606414841517156123c7578261277591612702565b91929190565b50600090600090606490565b61279660165460155490612495565b42101590565b601354906000915b80151580612825575b80612818575b15612800576127e66127fa916127e05a6127d96001600160a01b036125f1601f546124a2565b5a906123ba565b906123ba565b926127f2601f54612536565b601f55612536565b916127a4565b509050601f54601854111561281157565b6000601f55565b50601f54601854116127b3565b5060145483106127ad565b6001600160a01b0316801561289b577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560207395a7e403d7cf20f675ff9273d66e94d35ba49fa3938360005260058252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b6001600160a01b031690811561289b576001600160a01b031691821561296b5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260058252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152fd5b9160009281156132425760065460ff8160a81c161580613209575b613182575b60a01c60ff1680613170575b8061315b575b8061313e575b8061311e575b6130b2575b30845260046020526040842054600c5480911015806130a5575b80613088575b80613068575b80613048575b612d47575b506001906001600160a01b038116928392838752600760205260ff6040882054168015612d28575b612d21575b8690612c82575b506001600160a01b03851693849182612c6457612a9c816003546123ba565b6003555b81612ba0575b60207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91604051908152a3818552600860205260ff6040862054161580612b8c575b612b6f575b5050808352600860205260ff6040842054161580612b5b575b612b3d575b50505060ff602054161580612b2f575b612b2157565b612b2961279c565b42601655565b50612b38612787565b612b1b565b82604091612b53945260046020522054906132ac565b388080612b0b565b506001600160a01b03835416811415612b06565b612b8591855260046020526040852054906132ac565b3880612aed565b506001600160a01b03855416821415612ae8565b91508652600460205280604087205410612bfa57827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208693838a526004825260408a20612bf08282546123ba565b9055915050612aa6565b608460405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152fd5b828852600460205260408820612c7b828254612495565b9055612aa0565b6001600160a01b03875416808514908115612d0e575b50612cf9575b8015612a7d57612cf391308852600460205260408820612cbf838254612495565b9055604051828152857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a36123ba565b38612a7d565b506064612d08600d5483612523565b04612c9e565b90506001600160a01b0387161438612c98565b5085612a76565b506001600160a01b0386168752600760205260ff604088205416612a71565b6017805460ff1916600117905580831115613041575b600160ff196020541617602055604051612d78606082612340565b600281526020810190604036833730612d9082612506565b5273039e2fb66102314ce7b64ce5ce3e5183bc94ad38612daf82612513565b52612dba8330612830565b604051916370a0823160e01b835230600484015260208360248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa928315613036578893613002575b507395a7e403d7cf20f675ff9273d66e94d35ba49fa33b15612ffe5790876040518093635c11d79560e01b825260a482019387600484015283602484015260a060448401525180945260c482019093835b818110612fd9575050819293503060648301524260848301520381837395a7e403d7cf20f675ff9273d66e94d35ba49fa35af18015612fba57612fc5575b50604051906370a0823160e01b825230600483015260208260248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa8015612fba578790612f86575b612ed192506123ba565b80151580612f7b575b612efb575b505060ff196020541660205560ff196017541660175538612a49565b612f0781601c54612495565b80601c556127108102908082046127101490151715612f675791604091612f527ff3f26d5868efb63003b8eb193a2e6cab91e9cf8f8637177178034b36d54e1d5194601b5490612702565b601e5582519182526020820152a13880612edf565b602487634e487b7160e01b81526011600452fd5b50601b541515612eda565b506020823d602011612fb2575b81612fa060209383612340565b8101031261083157612ed19151612ec7565b3d9150612f93565b6040513d89823e3d90fd5b86612fd291979297612340565b9438612e88565b85516001600160a01b031683526020958601958d955087945090920191600101612e4a565b8780fd5b9092506020813d60201161302e575b8161301e60209383612340565b81010312612ffe57519138612df9565b3d9150613011565b6040513d8a823e3d90fd5b5081612d5d565b506001600160a01b0384168552600760205260ff60408620541615612a44565b506001600160a01b0382168552600760205260ff60408620541615612a3e565b506001600160a01b038554166001600160a01b0383161415612a38565b5060ff6020541615612a32565b6001600160a01b038316845260046020526130d1826040862054612495565b600b541015612a1857606460405162461bcd60e51b815260206004820152601960248201527f4d61782077616c6c6574206c696d6974206578636565646564000000000000006044820152fd5b506001600160a01b0383168452600960205260ff60408520541615612a13565b506001600160a01b038454166001600160a01b0384161415612a0d565b5061dead6001600160a01b0384161415612a07565b506001600160a01b0383161515612a01565b6001600160a01b0382168552600760205260ff60408620541680156131ea575b6129f557606460405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152fd5b506001600160a01b0384168552600760205260ff6040862054166131a2565b506001600160a01b03855416806001600160a01b0384161490811561322f575b506129f0565b90506001600160a01b0385161438613229565b608460405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152fd5b670de0b6b3a76400008210613385576001600160a01b0381169182600052601a602052604060002054151560001461333f57806132f057506132ee91506133bd565b565b908161331461332b93610c60601b5487600052601a602052604060002054906123ba565b601b5583600052601a602052604060002055613568565b90600052601a602052600160406000200155565b9091613366836133516133809561378f565b82600052601a60205283604060002055613568565b90600052601a602052600160406000200155601b54612495565b601b55565b90158061339d575b6133945750565b6132ee906133bd565b506001600160a01b038116600052601a602052604060002054151561338d565b6018548015801561351e575b80156134fd575b6134f95760001981019081116123c7576001600160a01b036133f281926124a2565b90549060031b1c16911690816000526019602052604060002054906134398161341a846124a2565b9091906001600160a01b038084549260031b9316831b921b1916179055565b600052601960205260406000205560185480156134e3576000190161345d816124a2565b6001600160a01b0382549160031b1b191690556018558060005260196020526000604081205580600052601a60205261349d604060002054601b546123ba565b601b5580600052601a602052600060026040822082815582600182015501557fd9bc583d1445615d8b795b7374f03ff79efa83b6359a91331efd95e4cf023ab6600080a2565b634e487b7160e01b600052603160045260246000fd5b5050565b506001600160a01b03821660005260196020528060406000205410156133d0565b506001600160a01b038216806000526019602052604060002054159081613546575b506133c9565b90506001600160a01b036135586124d3565b90549060031b1c16141538613540565b601b541561359c57613598612710916001600160a01b03601e549116600052601a60205260406000205490612523565b0490565b50600090565b6001600160a01b0381169081600052601a602052604060002054156134f9576135ca81612428565b90816135d557505050565b6040516370a0823160e01b815230600482015260208160248173039e2fb66102314ce7b64ce5ce3e5183bc94ad385afa9081156137515760009161375d575b5082111561362157505050565b61362a81613568565b6000848152601a602052604081206002810192909255600190910155602154613654908390612495565b60215560405163a9059cbb60e01b81526001600160a01b038216600482015260248101839052602081604481600073039e2fb66102314ce7b64ce5ce3e5183bc94ad385af190811561375157600091613732575b50156136dc575060207f07ccd18e485bb053d9974066929ac474d597f10bafa07dee4d52719a29d4bf4991604051908152a2565b9161370761372d9382600052601a6020526001604060002001613700858254612495565b9055613568565b90600052601a60205261372360026040600020019182546123ba565b90556021546123ba565b602155565b61374b915060203d602011611134576111268183612340565b386136a8565b6040513d6000823e3d90fd5b90506020813d602011613787575b8161377860209383612340565b81010312610831575138613614565b3d915061376b565b6001600160a01b0381169081600052601960205260406000205415801590613823575b6134f95760185490680100000000000000008210156123625761341a8260016137de94016018556124a2565b60185460001981019081116123c7578160005260196020526040600020557f9894d458cf29e8bc4eb7e591bac54b31dc90125dfa852474419972ab4347dd12600080a2565b50601854151580156137b25750816001600160a01b036138416124d3565b90549060031b1c16146137b256fea264697066735822122088ef90678f46a635e98428705415f1a64c715002fcae191ed33f5f5c5c2b4b4c64736f6c634300081c0033
[ 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.