ERC-20
Overview
Max Total Supply
69,420,420,420,420 IMG
Holders
96
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
163,474,682,756.869711707348966909 IMGValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
IMG
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.20; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != - 1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? - a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint) external; } interface DividendPayingTokenOptionalInterface { function withdrawableDividendOf(address _owner, address _rewardToken) external view returns (uint256); function withdrawnDividendOf(address _owner, address _rewardToken) external view returns (uint256); function accumulativeDividendOf(address _owner, address _rewardToken) external view returns (uint256); } interface DividendPayingTokenInterface { function dividendOf(address _owner, address _rewardToken) external view returns (uint256); function distributeDividends() external payable; function withdrawDividend(address _rewardToken) external; event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); } contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable(msg.sender) { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; IUniswapV2Router02 public immutable uniswapV2Router; uint256 public totalBalance; uint256 public rewardTokenCounter; uint256 internal constant magnitude = 2 ** 128; address public nextRewardToken; address[] public rewardTokens; mapping(address => bool) public customDistributions; mapping(address => uint256) public holderBalance; mapping(address => uint256) public standardDistributions; mapping(address => uint256) public totalDividendsDistributed; mapping(address => uint256) internal magnifiedDividendPerShare; mapping(address => mapping(address => uint256)) internal userDistributions; mapping(address => mapping(address => uint256)) internal withdrawnDividends; mapping(address => mapping(address => int256)) internal magnifiedDividendCorrections; constructor() { uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); standardDistributions[address(0x6982508145454Ce325dDbE47a25d4ec3d2311933)] = 15; // PEPE rewardTokens.push(address(0x6982508145454Ce325dDbE47a25d4ec3d2311933)); standardDistributions[address(0x812Ba41e071C7b7fA4EBcFB62dF5F45f6fA853Ee)] = 15; // NEIRO rewardTokens.push(address(0x812Ba41e071C7b7fA4EBcFB62dF5F45f6fA853Ee)); standardDistributions[address(0xE0f63A424a4439cBE457D80E4f4b51aD25b2c56C)] = 15; // SPX rewardTokens.push(address(0xE0f63A424a4439cBE457D80E4f4b51aD25b2c56C)); standardDistributions[address(0xaaeE1A9723aaDB7afA2810263653A34bA2C21C7a)] = 15; // MOG rewardTokens.push(address(0xaaeE1A9723aaDB7afA2810263653A34bA2C21C7a)); standardDistributions[address(0xB90B2A35C65dBC466b04240097Ca756ad2005295)] = 15; // BOBO rewardTokens.push(address(0xB90B2A35C65dBC466b04240097Ca756ad2005295)); standardDistributions[address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)] = 15; // ETH rewardTokens.push(address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)); standardDistributions[address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)] = 10; // USDC rewardTokens.push(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)); nextRewardToken = rewardTokens[0]; } function dividendOf(address _owner, address _rewardToken) external view override returns (uint256) { return withdrawableDividendOf(_owner, _rewardToken); } function withdrawableDividendOf(address _owner, address _rewardToken) public view override returns (uint256) { return accumulativeDividendOf(_owner, _rewardToken).sub(withdrawnDividends[_owner][_rewardToken]); } function withdrawnDividendOf(address _owner, address _rewardToken) external view override returns (uint256) { return withdrawnDividends[_owner][_rewardToken]; } function accumulativeDividendOf(address _owner, address _rewardToken) public view override returns (uint256) { return magnifiedDividendPerShare[_rewardToken].mul(holderBalance[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_rewardToken][_owner]).toUint256Safe() / magnitude; } function distributionsOf(address _owner) external view returns (uint256[] memory) { uint256[] memory currentDistributions = new uint256[](rewardTokens.length); if (customDistributions[_owner]) for (uint256 i = 0; i < rewardTokens.length; i++) currentDistributions[i] = userDistributions[_owner][rewardTokens[i]]; else for (uint256 i = 0; i < rewardTokens.length; i++) currentDistributions[i] = standardDistributions[rewardTokens[i]]; return currentDistributions; } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = holderBalance[account]; holderBalance[account] = newBalance; if (newBalance > currentBalance) { uint256 increaseAmount = newBalance.sub(currentBalance); _increase(account, increaseAmount); totalBalance += increaseAmount; } else if (newBalance < currentBalance) { uint256 reduceAmount = currentBalance.sub(newBalance); _reduce(account, reduceAmount); totalBalance -= reduceAmount; } } function setDistributionPercentages(uint256[] calldata percentages) external { require(percentages.length == rewardTokens.length, "ARRAY MISMATCH: Percentages total must match rewards tokens total!"); uint256 totalPercentage = 0; for (uint256 i = 0; i < percentages.length; i++) { require(percentages[i] <= 100, "PERCENTAGE EXCEEDED: Percentage must not exceed 100%!"); userDistributions[msg.sender][rewardTokens[i]] = percentages[i]; totalPercentage += percentages[i]; } require(totalPercentage == 100, " TOTAL PERCENTAGE EXCEEDED: Total percentage must equal 100%!"); customDistributions[msg.sender] = true; } function distributeDividends() public payable override { require(totalBalance > 0); uint256 initialBalance = IERC20(nextRewardToken).balanceOf(address(this)); buyTokens(msg.value, nextRewardToken); uint256 newBalance = IERC20(nextRewardToken).balanceOf(address(this)).sub(initialBalance); if (newBalance > 0) { magnifiedDividendPerShare[nextRewardToken] = magnifiedDividendPerShare[nextRewardToken].add((newBalance).mul(magnitude) / totalBalance); emit DividendsDistributed(msg.sender, newBalance); totalDividendsDistributed[nextRewardToken] = totalDividendsDistributed[nextRewardToken].add(newBalance); } rewardTokenCounter = (rewardTokenCounter + 1) % (rewardTokens.length - 1); nextRewardToken = rewardTokens[rewardTokenCounter]; } function buyTokens(uint256 ethAmount, address rewardToken) internal { if (rewardToken != uniswapV2Router.WETH()) { address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = rewardToken; uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}( 0, path, address(this), block.timestamp ); } else IWETH(uniswapV2Router.WETH()).deposit{value: ethAmount}(); } function withdrawDividend(address _rewardToken) external virtual override { _withdrawDividendOfUser(payable(msg.sender), _rewardToken); } function _withdrawDividendOfUser(address payable user, address _rewardToken) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user, _rewardToken); uint256 _dividendSupplyAvailable = IERC20(_rewardToken).balanceOf(address(this)); _withdrawableDividend = _withdrawableDividend < _dividendSupplyAvailable ? _withdrawableDividend : _dividendSupplyAvailable; if (_withdrawableDividend > 0) { withdrawnDividends[user][_rewardToken] = withdrawnDividends[user][_rewardToken].add(_withdrawableDividend); uint256 distribution = customDistributions[user] ? userDistributions[user][_rewardToken] : standardDistributions[_rewardToken]; uint256 withdrawal = _withdrawableDividend.mul(distribution).div(100); IERC20(_rewardToken).transfer(user, withdrawal); emit DividendWithdrawn(user, withdrawal); return _withdrawableDividend; } return 0; } function _increase(address account, uint256 value) internal { for (uint256 i; i < rewardTokens.length; i++) magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account] .sub((magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe()); } function _reduce(address account, uint256 value) internal { for (uint256 i; i < rewardTokens.length; i++) magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account] .add((magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe()); } receive() external payable { distributeDividends(); } } contract DividendTracker is DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; struct Map { address[] keys; mapping(address => uint256) values; mapping(address => uint256) indexOf; mapping(address => bool) inserted; } Map private tokenHoldersMap; uint256 public lastProcessedIndex; uint256 public claimWait; uint256 public immutable minimumTokenBalanceForDividends; mapping(address => bool) public excludedFromDividends; mapping(address => uint256) public lastClaimTimes; event ExcludeFromDividends(address indexed account); event IncludeInDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() { claimWait = 86400; minimumTokenBalanceForDividends = 347102102 * (10 ** 18); //0.0005% } function get(address key) private view returns (uint) { return tokenHoldersMap.values[key]; } function getIndexOfKey(address key) private view returns (int) { if (!tokenHoldersMap.inserted[key]) return - 1; return int(tokenHoldersMap.indexOf[key]); } function getKeyAtIndex(uint index) private view returns (address) { return tokenHoldersMap.keys[index]; } function size() private view returns (uint) { return tokenHoldersMap.keys.length; } function set(address key, uint val) private { if (tokenHoldersMap.inserted[key]) tokenHoldersMap.values[key] = val; else { tokenHoldersMap.inserted[key] = true; tokenHoldersMap.values[key] = val; tokenHoldersMap.indexOf[key] = tokenHoldersMap.keys.length; tokenHoldersMap.keys.push(key); } } function remove(address key) private { if (!tokenHoldersMap.inserted[key]) return; delete tokenHoldersMap.inserted[key]; delete tokenHoldersMap.values[key]; uint index = tokenHoldersMap.indexOf[key]; uint lastIndex = tokenHoldersMap.keys.length - 1; address lastKey = tokenHoldersMap.keys[lastIndex]; tokenHoldersMap.indexOf[lastKey] = index; delete tokenHoldersMap.indexOf[key]; tokenHoldersMap.keys[index] = lastKey; tokenHoldersMap.keys.pop(); } function excludeFromDividends(address account) external onlyOwner() { excludedFromDividends[account] = true; _setBalance(account, 0); remove(account); emit ExcludeFromDividends(account); } function includeInDividends(address account) external onlyOwner() { require(excludedFromDividends[account]); excludedFromDividends[account] = false; emit IncludeInDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner() { require(newClaimWait >= 0 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value"); claimWait = newClaimWait; emit ClaimWaitUpdated(newClaimWait, claimWait); } function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account, address _rewardToken) public view returns (address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = getIndexOfKey(account); iterationsUntilProcessed = - 1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account, _rewardToken); totalDividends = accumulativeDividendOf(account, _rewardToken); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index, address _rewardToken) external view returns (address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if (index >= size()) return (0x0000000000000000000000000000000000000000, - 1, - 1, 0, 0, 0, 0, 0); address account = getKeyAtIndex(index); return getAccount(account, _rewardToken); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) return false; return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner() { if (excludedFromDividends[account]) return; if (newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); set(account, newBalance); } else { _setBalance(account, 0); remove(account); } processAccount(account, true); } function process(uint256 gas) external returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if (numberOfTokenHolders == 0) return (0, 0, lastProcessedIndex); uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.keys.length) _lastProcessedIndex = 0; address account = tokenHoldersMap.keys[_lastProcessedIndex]; if (canAutoClaim(lastClaimTimes[account])) if (processAccount(payable(account), true)) claims++; iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner() returns (bool) { uint256 amount; bool paid; for (uint256 i; i < rewardTokens.length; i++) { amount = _withdrawDividendOfUser(account, rewardTokens[i]); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); paid = true; } } return paid; } } /* * * * ██╗███╗░░██╗███████╗██╗███╗░░██╗██╗████████╗███████╗ ███╗░░░███╗░█████╗░███╗░░██╗███████╗██╗░░░██╗ * ██║████╗░██║██╔════╝██║████╗░██║██║╚══██╔══╝██╔════╝ ████╗░████║██╔══██╗████╗░██║██╔════╝╚██╗░██╔╝ * ██║██╔██╗██║█████╗░░██║██╔██╗██║██║░░░██║░░░█████╗░░ ██╔████╔██║██║░░██║██╔██╗██║█████╗░░░╚████╔╝░ * ██║██║╚████║██╔══╝░░██║██║╚████║██║░░░██║░░░██╔══╝░░ ██║╚██╔╝██║██║░░██║██║╚████║██╔══╝░░░░╚██╔╝░░ * ██║██║░╚███║██║░░░░░██║██║░╚███║██║░░░██║░░░███████╗ ██║░╚═╝░██║╚█████╔╝██║░╚███║███████╗░░░██║░░░ * ╚═╝╚═╝░░╚══╝╚═╝░░░░░╚═╝╚═╝░░╚══╝╚═╝░░░╚═╝░░░╚══════╝ ╚═╝░░░░░╚═╝░╚════╝░╚═╝░░╚══╝╚══════╝░░░╚═╝░░░ * ░██████╗░██╗░░░░░██╗████████╗░█████╗░██╗░░██╗ * ██╔════╝░██║░░░░░██║╚══██╔══╝██╔══██╗██║░░██║ * ██║░░██╗░██║░░░░░██║░░░██║░░░██║░░╚═╝███████║ * ██║░░╚██╗██║░░░░░██║░░░██║░░░██║░░██╗██╔══██║ * ╚██████╔╝███████╗██║░░░██║░░░╚█████╔╝██║░░██║ * ░╚═════╝░╚══════╝╚═╝░░░╚═╝░░░░╚════╝░╚═╝░░╚═╝ * Description: The Infinite Meme-conomy Awaits. The Protocol doesn’t just distribute tokens — it distributes culture. * * Telegram: https://t.me/TheInfiniteMoneyGlitch * Twitter: https://x.com/MoneyGlitchERC * Website: https://www.theglitch.money */ contract IMG is Context, IERC20, Ownable(msg.sender) { string public constant name = "Infinite Money Glitch"; string public constant symbol = "IMG"; uint public constant decimals = 18; uint public constant totalSupply = 69420420420420 * 10 ** decimals; uint public maxTokenBalance; uint public maxTokenTransfer; address public constant DEAD = 0x000000000000000000000000000000000000dEaD; address public constant ZERO = 0x0000000000000000000000000000000000000000; address public immutable dexPair; IUniswapV2Router02 public immutable dexRouter; mapping (address => uint) private balances; mapping (address => mapping (address => uint)) private allowances; mapping(address => bool) public isFeeExempt; mapping(address => bool) public isMarketPair; mapping(address => bool) public isBalanceLimitExempt; mapping(address => bool) public isTransferLimitExempt; address private operationsWallet; DividendTracker public dividendTracker; struct InFees { uint rewards; uint operations; uint burn; } struct OutFees { uint rewards; uint operations; uint burn; } InFees public inFees; OutFees public outFees; bool public trading; bool public feesStatus; bool private inSwap; bool private swapAndLiquify; bool private swapByLimitEnabled; uint private immutable feeDivisor = 10000; uint private gasForProcessing = 300000; uint private swapLowerThreshold; uint private swapUpperThreshold; event FeeStatusChanged(address indexed account, bool indexed newStatus); event BulkFeeStatusChanged(address[] accounts, bool indexed newStatus); event MaxBalanceStatusChanged(address indexed account, bool indexed newStatus); event MaxTransferStatusChanged(address indexed account, bool indexed newStatus); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed newStatus); event FeesForBuysChanged(uint newOperations, uint newRewards, uint newBurn); event FeesForSellsChanged(uint newOperations, uint newRewards, uint newBurn); event FeesCollectionStatusChanged(bool newStatus); event TokenBalanceAndTransferLimitsChanged(uint newBalance, uint newTransfer); event SwapAndLiquifyStatusChanged(bool newStatus); event SwapAndLiquifyByLimitStatusChanged(bool newStatus); event SwapAndLiquifyThresholdsChanged(uint newLower, uint newUpper); event GasForProcessingChanged(uint newGas); event ProcessedDividendTracker(uint iterations, uint claims, uint lastProcessedIndex, bool indexed automatic, uint gas, address indexed processor); modifier lockSwap { inSwap = true; _; inSwap = false; } constructor() { dexRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); dexPair = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this)); allowances[address(this)][address(dexRouter)] = type(uint).max; dividendTracker = new DividendTracker(); operationsWallet = address(0x07E5c17e8385a378D2B80F656E1e3E809F86A19F); _setMarketPair(dexPair, true); maxTokenBalance = (totalSupply * 200) / 10000; maxTokenTransfer = (totalSupply * 200) / 10000; swapLowerThreshold = (totalSupply * 1) / 10000; swapUpperThreshold = (totalSupply * 100) / 10000; inFees.rewards = 0; inFees.operations = 2000; inFees.burn = 0; outFees.rewards = 0; outFees.operations = 2000; outFees.burn = 0; feesStatus = true; isFeeExempt[DEAD] = true; isFeeExempt[owner()] = true; isFeeExempt[address(this)] = true; isBalanceLimitExempt[DEAD] = true; isBalanceLimitExempt[owner()] = true; isBalanceLimitExempt[address(this)] = true; isBalanceLimitExempt[address(dexPair)] = true; isBalanceLimitExempt[address(dividendTracker)] = true; isTransferLimitExempt[DEAD] = true; isTransferLimitExempt[owner()] = true; isTransferLimitExempt[address(this)] = true; isTransferLimitExempt[address(dividendTracker)] = true; dividendTracker.excludeFromDividends(DEAD); dividendTracker.excludeFromDividends(owner()); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(address(dexRouter)); dividendTracker.excludeFromDividends(address(dividendTracker)); balances[owner()] = totalSupply; emit Transfer(address(0), owner(), totalSupply); } function balanceOf(address account) public view override returns (uint) { return balances[account]; } function allowance(address holder, address spender) external view override returns (uint) { return allowances[holder][spender]; } function getCirculatingSupply() public view returns (uint) { return totalSupply - balanceOf(DEAD) - balanceOf(ZERO); } function setDividendsExemption(address account) external onlyOwner() { dividendTracker.excludeFromDividends(account); } function setDividendsInclusion(address account) external onlyOwner() { dividendTracker.includeInDividends(account); } function setMarketPair(address pair, bool value) external onlyOwner() { require(pair != dexPair, "ERROR: Cannot mutate core dex pair!"); _setMarketPair(pair, value); } function _setMarketPair(address pair, bool value) private { isMarketPair[pair] = value; isBalanceLimitExempt[pair] = value; if (value) dividendTracker.excludeFromDividends(pair); emit SetAutomatedMarketMakerPair(pair, value); } function setFeeExempt(address account, bool status) public onlyOwner() { isFeeExempt[account] = status; emit FeeStatusChanged(account, status); } function setBalanceLimitExempt(address account, bool status) public onlyOwner() { isBalanceLimitExempt[account] = status; emit MaxBalanceStatusChanged(account, status); } function setTransferLimitExempt(address account, bool status) public onlyOwner() { isTransferLimitExempt[account] = status; emit MaxTransferStatusChanged(account, status); } function setBulkFeeExemption(address[] calldata accounts, bool status) external onlyOwner() { for (uint i = 0; i < accounts.length; i++) isFeeExempt[accounts[i]] = status; emit BulkFeeStatusChanged(accounts, status); } function updateBuyFees(uint newOperations, uint newRewards, uint newBurn) external onlyOwner() { require(!feesStatus || (newOperations + newRewards + newBurn > 0 && newOperations + newRewards + newBurn <= 4000), "ERROR: Total fees must be >0% and <= 40%!"); inFees.operations = newOperations; inFees.rewards = newRewards; inFees.burn = newBurn; emit FeesForBuysChanged(newOperations, newRewards, newBurn); } function updateSellFees(uint newOperations, uint newRewards, uint newBurn) external onlyOwner() { require(!feesStatus || (newOperations + newRewards + newBurn > 0 && newOperations + newRewards + newBurn <= 4000), "ERROR: Total fees must be >0% and <= 40%!"); outFees.operations = newOperations; outFees.rewards = newRewards; outFees.burn = newBurn; emit FeesForSellsChanged(newOperations, newRewards, newBurn); } function updateFeesStatus(bool status) external onlyOwner() { require(status != feesStatus, "ERROR: New status matches existing status!"); if (status) { require(outFees.operations + outFees.rewards + outFees.burn > 0, "ERROR: Total out fees must be >0%"); require(inFees.operations + inFees.rewards + inFees.burn > 0, "ERROR: Total in fees must be >0%"); } feesStatus = status; emit FeesCollectionStatusChanged(status); } function updateTokenLimits(uint newBalance, uint newTransfer) external onlyOwner() { require(newBalance >= totalSupply / 500, "ERROR: New balance threshold must be >=0.2% total supply!"); require(newTransfer >= totalSupply / 500, "ERROR: New transfer threshold must be >=0.2% total supply!"); maxTokenBalance = newBalance * (10 ** decimals); maxTokenTransfer = newTransfer * (10 ** decimals); emit TokenBalanceAndTransferLimitsChanged(maxTokenBalance, maxTokenTransfer); } function updateSwapStatus(bool status) external onlyOwner() { require(status != swapAndLiquify, "ERROR: New status matches existing status!"); swapAndLiquify = status; emit SwapAndLiquifyStatusChanged(swapAndLiquify); } function updateSwapByLimitStatus(bool status) external onlyOwner() { require(status != swapByLimitEnabled, "ERROR: New status matches existing status!"); swapByLimitEnabled = status; emit SwapAndLiquifyByLimitStatusChanged(swapAndLiquify); } function updateSwapThresholds(uint lowerThreshold, uint upperThreshold, uint divisor) external onlyOwner() { require(lowerThreshold > 0, "ERROR: Lower threshold must be greater than zero!"); require(upperThreshold > 0, "ERROR: Upper threshold must be greater than zero!"); swapLowerThreshold = (totalSupply * lowerThreshold) / (divisor); swapUpperThreshold = (totalSupply * upperThreshold) / (divisor); emit SwapAndLiquifyThresholdsChanged(swapLowerThreshold, swapUpperThreshold); } function updateGasForProcessing(uint newValue) external onlyOwner() { require(newValue >= 200000 && newValue <= 500000, "ERROR: Gas must be between 200,000 and 500,000 WEI!"); require(newValue != gasForProcessing, "ERROR: New gas value matches existing value!"); gasForProcessing = newValue; emit GasForProcessingChanged(gasForProcessing); } function updateClaimWait(uint claimWait) external onlyOwner() { dividendTracker.updateClaimWait(claimWait); } function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } function openLaunch() external payable onlyOwner() { require(!trading, "ERROR: Cannot open trading more than once!"); isFeeExempt[owner()] = false; address[] memory path = new address[](2); path[0] = dexRouter.WETH(); path[1] = address(this); dexRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}( 0, path, owner(), block.timestamp ); trading = true; swapAndLiquify = true; swapByLimitEnabled = true; isFeeExempt[owner()] = true; } function increaseAllowance(address spender, uint addedValue) public virtual returns (bool) { _approve(msg.sender, spender, allowances[_msgSender()][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, allowances[_msgSender()][spender] - subtractedValue); return true; } function approve(address spender, uint amount) public override returns (bool) { _approve(msg.sender, spender, amount); return true; } function _approve(address owner, address spender, uint amount) private { require(owner != address(0), "ERROR: Approve from the zero address!"); require(spender != address(0), "ERROR: Approve to the zero address!"); allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function transfer(address to, uint amount) public override returns (bool) { _transferFrom(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint amount) public override returns (bool) { _transferFrom(from, to, amount); _approve(from, msg.sender, allowances[from][msg.sender] - amount); return true; } function _transferFrom(address from, address to, uint amount) internal { if (inSwap) { balances[from] -= amount; balances[to] += amount; emit Transfer(from, to, amount); } else { if (from != owner() && to != owner()) { if (!isFeeExempt[from] && !isFeeExempt[to]) require(trading, "ERROR: Trading is closed!"); if (!isTransferLimitExempt[from] && !isTransferLimitExempt[to]) require(amount <= maxTokenTransfer, "ERROR: Transfer amount exceeds maximum limit!"); } uint contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= swapLowerThreshold && !inSwap && !isMarketPair[from] && isMarketPair[to] && swapAndLiquify) { if (swapByLimitEnabled) contractTokenBalance = contractTokenBalance > swapUpperThreshold ? swapUpperThreshold : contractTokenBalance; swapBack(contractTokenBalance); } balances[from] -= amount; uint finalAmount = (isFeeExempt[from] || isFeeExempt[to]) ? amount : takeFee(from, to, amount); if (!isBalanceLimitExempt[to]) require(balances[to] + finalAmount <= maxTokenBalance, "ERROR: New balance exceeds maximum limit!"); balances[to] += finalAmount; emit Transfer(from, to, finalAmount); dividendTracker.setBalance(payable(from), balanceOf(from)); dividendTracker.setBalance(payable(to), balanceOf(to)); if (gasForProcessing > 0) try dividendTracker.process(gasForProcessing) returns (uint iterations, uint claims, uint lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin); } catch {} } } function takeFee(address from, address to, uint amount) internal returns (uint) { uint feeTotal = 0; if (feesStatus) { if (isMarketPair[from]) feeTotal = amount * (inFees.rewards + inFees.operations + inFees.burn) / feeDivisor; else if (isMarketPair[to]) feeTotal = amount * (outFees.rewards + outFees.operations + outFees.burn) / feeDivisor; if (feeTotal > 0) { balances[address(this)] += feeTotal; emit Transfer(from, address(this), feeTotal); } } return amount - feeTotal; } function swapBack(uint amount) private lockSwap() { uint totalFees = inFees.rewards + inFees.operations + inFees.burn + outFees.rewards + outFees.operations + outFees.burn; uint totalEthFees = totalFees - inFees.burn - outFees.burn; uint burnTokens = amount * (inFees.burn + outFees.burn) / totalFees; uint amountToSwapForETH = amount - burnTokens; address[] memory path = new address[](2); path[0] = address(this); path[1] = dexRouter.WETH(); try dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwapForETH, 0, path, address(this), block.timestamp ){ payable(address(dividendTracker)).call{ value: address(this).balance * (inFees.rewards + outFees.rewards) / totalEthFees }(""); payable(operationsWallet).call{ value: address(this).balance * (inFees.operations + outFees.operations) / totalEthFees }(""); } catch {} _transferFrom(address(this), DEAD, burnTokens); } function withdrawStuckEth() external onlyOwner() { payable(msg.sender).call{ value: address(this).balance }(""); } receive() external payable {} }
pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "remappings": [] }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"BulkFeeStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"FeeStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"FeesCollectionStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newOperations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"FeesForBuysChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newOperations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"FeesForSellsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newGas","type":"uint256"}],"name":"GasForProcessingChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"MaxBalanceStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"MaxTransferStatusChanged","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":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"SwapAndLiquifyByLimitStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"SwapAndLiquifyStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLower","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newUpper","type":"uint256"}],"name":"SwapAndLiquifyThresholdsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTransfer","type":"uint256"}],"name":"TokenBalanceAndTransferLimitsChanged","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":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inFees","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"operations","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBalanceLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransferLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenTransfer","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":"openLaunch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"outFees","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"operations","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setBalanceLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setBulkFeeExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setDividendsExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setDividendsInclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setTransferLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newOperations","type":"uint256"},{"internalType":"uint256","name":"newRewards","type":"uint256"},{"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateFeesStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newOperations","type":"uint256"},{"internalType":"uint256","name":"newRewards","type":"uint256"},{"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSwapByLimitStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSwapStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lowerThreshold","type":"uint256"},{"internalType":"uint256","name":"upperThreshold","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"updateSwapThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"},{"internalType":"uint256","name":"newTransfer","type":"uint256"}],"name":"updateTokenLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e060405261271060c052620493e06012553480156200001d575f80fd5b5033806200004457604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200004f8162000801565b50737a250d5630b4cf539739df2c5dacb4c659f2488d60a08190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620000a4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000ca91906200093a565b6001600160a01b031663c9c6539660a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000117573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200013d91906200093a565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303815f875af115801562000187573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001ad91906200093a565b6001600160a01b03908116608052305f90815260046020908152604080832060a05190941683529290528190205f19905551620001ea906200092c565b604051809103905ff08015801562000204573d5f803e3d5ffd5b50600a80546001600160a01b03929092166001600160a01b0319928316179055600980549091167307e5c17e8385a378d2b80f656e1e3e809f86a19f1790556080516200025390600162000850565b612710620002646012600a62000a78565b6200027690653f23337fd34462000a85565b620002839060c862000a85565b6200028f919062000a9f565b600155612710620002a36012600a62000a78565b620002b590653f23337fd34462000a85565b620002c29060c862000a85565b620002ce919062000a9f565b600255612710620002e26012600a62000a78565b620002f490653f23337fd34462000a85565b6200030190600162000a85565b6200030d919062000a9f565b601355612710620003216012600a62000a78565b6200033390653f23337fd34462000a85565b6200034090606462000a85565b6200034c919062000a9f565b6014555f600b8190556107d0600c819055600d829055600e829055600f5560108190556011805461ff00191661010017905561dead8152600560208190527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba805460ff1916600190811790915591620003cc5f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff199586161790553081526005835290812080548416600190811790915561dead82526007928390527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80549094168117909355620004555f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff1996871617905530815260078452828120805486166001908117909155608051831682528382208054871682179055600a549092168152918220805485168217905561dead82526008928390527f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd0933429980549094168117909355620005055f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff199687161790553081526008909352818320805485166001908117909155600a805483168552938390208054909516179093559054905163031e79db60e41b815261dead60048201529116906331e79db0906024015f604051808303815f87803b15801562000598575f80fd5b505af1158015620005ab573d5f803e3d5ffd5b5050600a546001600160a01b031691506331e79db09050620005d45f546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b15801562000613575f80fd5b505af115801562000626573d5f803e3d5ffd5b5050600a5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b1580156200066d575f80fd5b505af115801562000680573d5f803e3d5ffd5b5050600a5460a05160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b158015620006cb575f80fd5b505af1158015620006de573d5f803e3d5ffd5b5050600a5460405163031e79db60e41b81526001600160a01b039091166004820181905292506331e79db091506024015f604051808303815f87803b15801562000726575f80fd5b505af115801562000739573d5f803e3d5ffd5b505050506012600a6200074d919062000a78565b6200075f90653f23337fd34462000a85565b60035f620007745f546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20556200079f5f546001600160a01b031690565b6001600160a01b03165f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620007d86012600a62000a78565b620007ea90653f23337fd34462000a85565b60405190815260200160405180910390a362000abf565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260066020908152604080832080548515801560ff1992831681179093556007909452919093208054909116909217909155620008f157600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015620008d9575f80fd5b505af1158015620008ec573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6126fa80620038b983390190565b5f602082840312156200094b575f80fd5b81516001600160a01b038116811462000962575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620009bd57815f1904821115620009a157620009a162000969565b80851615620009af57918102915b93841c939080029062000982565b509250929050565b5f82620009d55750600162000a72565b81620009e357505f62000a72565b8160018114620009fc576002811462000a075762000a27565b600191505062000a72565b60ff84111562000a1b5762000a1b62000969565b50506001821b62000a72565b5060208310610133831016604e8410600b841016171562000a4c575081810a62000a72565b62000a5883836200097d565b805f190482111562000a6e5762000a6e62000969565b0290505b92915050565b5f620009628383620009c5565b808202811582820484141762000a725762000a7262000969565b5f8262000aba57634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c051612da562000b145f395f818161266101526126db01525f818161034301528181610cd401528181610db0015281816123f301526124a901525f81816108c701526116aa0152612da55ff3fe6080604052600436106102a8575f3560e01c8063871c128d1161016f578063c17b5b8c116100d8578063e98030c711610092578063f242ab411161006d578063f242ab41146108b6578063f2fde38b146108e9578063f8eba5c914610908578063fff4602f14610927575f80fd5b8063e98030c714610869578063ea0cdeff14610888578063ec44acf21461089d575f80fd5b8063c17b5b8c14610795578063cb20beaa146107b4578063d151d9cd146107d3578063dc2f5e48146107f1578063dd62ed3e14610810578063e8cedb2414610854575f80fd5b806395d89b411161012957806395d89b41146106cc57806398faa8ea146106fa5780639ae786af14610719578063a457c2d714610738578063a9059cbb14610757578063c16dd4a414610776575f80fd5b8063871c128d14610616578063879dd3c514610635578063880000341461065357806389824b93146106725780638da5cb5b146106915780638ebfc796146106ad575f80fd5b8063313ce567116102115780634e71d92d116101cb5780634e71d92d1461057457806358fa63ca1461058857806370a082311461059b578063715018a6146105cf5780637fa787ba146105e35780638095d564146105f7575f80fd5b8063313ce567146104be57806339509351146104d25780633ecad271146104f15780633f4218e01461051f57806340fb0b131461054d57806342ab9b2614610555575f80fd5b806318160ddd1161026257806318160ddd146103ee578063232bbdca1461041057806323b872dd1461043e5780632b112e491461045d5780632c1f5216146104715780632e1207aa14610490575f80fd5b806303fd2a45146102b357806306fdde03146102e55780630758d92414610332578063095ea7b3146103655780630f0ceb671461039457806312163785146103b5575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102c861dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f0575f80fd5b5061032560405180604001604052806015815260200174092dcccd2dcd2e8ca409adedccaf2408ed8d2e8c6d605b1b81525081565b6040516102dc91906127a3565b34801561033d575f80fd5b506102c87f000000000000000000000000000000000000000000000000000000000000000081565b348015610370575f80fd5b5061038461037f366004612802565b610946565b60405190151581526020016102dc565b34801561039f575f80fd5b506103b36103ae366004612839565b61095c565b005b3480156103c0575f80fd5b50600e54600f546010546103d392919083565b604080519384526020840192909252908201526060016102dc565b3480156103f9575f80fd5b50610402610ad6565b6040519081526020016102dc565b34801561041b575f80fd5b5061038461042a36600461285b565b60086020525f908152604090205460ff1681565b348015610449575f80fd5b50610384610458366004612876565b610af5565b348015610468575f80fd5b50610402610b45565b34801561047c575f80fd5b50600a546102c8906001600160a01b031681565b34801561049b575f80fd5b506103846104aa36600461285b565b60076020525f908152604090205460ff1681565b3480156104c9575f80fd5b50610402601281565b3480156104dd575f80fd5b506103846104ec366004612802565b610bcd565b3480156104fc575f80fd5b5061038461050b36600461285b565b60066020525f908152604090205460ff1681565b34801561052a575f80fd5b5061038461053936600461285b565b60056020525f908152604090205460ff1681565b6103b3610c03565b348015610560575f80fd5b506103b361056f3660046128b4565b610e71565b34801561057f575f80fd5b506103b3610ecc565b348015610593575f80fd5b506102c85f81565b3480156105a6575f80fd5b506104026105b536600461285b565b6001600160a01b03165f9081526003602052604090205490565b3480156105da575f80fd5b506103b3610f40565b3480156105ee575f80fd5b506103b3610f53565b348015610602575f80fd5b506103b36106113660046128eb565b610f9d565b348015610621575f80fd5b506103b3610630366004612914565b611062565b348015610640575f80fd5b5060115461038490610100900460ff1681565b34801561065e575f80fd5b506103b361066d3660046128eb565b611183565b34801561067d575f80fd5b506103b361068c36600461292b565b611302565b34801561069c575f80fd5b505f546001600160a01b03166102c8565b3480156106b8575f80fd5b506103b36106c73660046128b4565b6113ba565b3480156106d7575f80fd5b5061032560405180604001604052806003815260200162494d4760e81b81525081565b348015610705575f80fd5b506103b3610714366004612839565b611415565b348015610724575f80fd5b506103b36107333660046129aa565b6114a1565b348015610743575f80fd5b50610384610752366004612802565b61165e565b348015610762575f80fd5b50610384610771366004612802565b611694565b348015610781575f80fd5b506103b36107903660046128b4565b6116a0565b3480156107a0575f80fd5b506103b36107af3660046128eb565b611743565b3480156107bf575f80fd5b506103b36107ce36600461285b565b6117ff565b3480156107de575f80fd5b50600b54600c54600d546103d392919083565b3480156107fc575f80fd5b506103b361080b366004612839565b611865565b34801561081b575f80fd5b5061040261082a3660046129ca565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561085f575f80fd5b5061040260015481565b348015610874575f80fd5b506103b3610883366004612914565b6118f6565b348015610893575f80fd5b5061040260025481565b3480156108a8575f80fd5b506011546103849060ff1681565b3480156108c1575f80fd5b506102c87f000000000000000000000000000000000000000000000000000000000000000081565b3480156108f4575f80fd5b506103b361090336600461285b565b61192f565b348015610913575f80fd5b506103b361092236600461285b565b611969565b348015610932575f80fd5b506103b36109413660046128b4565b6119a3565b5f6109523384846119fe565b5060015b92915050565b610964611b25565b601154610100900460ff1615158115150361099a5760405162461bcd60e51b8152600401610991906129f6565b60405180910390fd5b8015610a8257601054600e54600f545f92916109b591612a54565b6109bf9190612a54565b11610a165760405162461bcd60e51b815260206004820152602160248201527f4552524f523a20546f74616c206f75742066656573206d757374206265203e306044820152602560f81b6064820152608401610991565b600d54600b54600c545f9291610a2b91612a54565b610a359190612a54565b11610a825760405162461bcd60e51b815260206004820181905260248201527f4552524f523a20546f74616c20696e2066656573206d757374206265203e30256044820152606401610991565b601180548215156101000261ff00199091161790556040517fcf5b8994e88702dcc077176517145092990b0e63dd35b64c412961aceb0139da90610acb90831515815260200190565b60405180910390a150565b610ae26012600a612b47565b610af290653f23337fd344612b52565b81565b5f610b01848484611b51565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610b3b918691610b36908690612b69565b6119fe565b5060019392505050565b60036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff5461dead5f9081527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c54909190610ba46012600a612b47565b610bb490653f23337fd344612b52565b610bbe9190612b69565b610bc89190612b69565b905090565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612a54565b610c0b611b25565b60115460ff1615610c715760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a2043616e6e6f74206f70656e2074726164696e67206d6f7265206044820152697468616e206f6e63652160b01b6064820152608401610991565b5f60055f610c865f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805460ff191694151594909417909355805160028082526060820183529092909190830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d529190612b7c565b815f81518110610d6457610d64612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610d9857610d98612b97565b6001600160a01b0392831660209182029290920101527f00000000000000000000000000000000000000000000000000000000000000001663b6f9de95345f84610de95f546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610e099493929190612bed565b5f604051808303818588803b158015610e20575f80fd5b505af1158015610e32573d5f803e3d5ffd5b50506011805464ffff0000ff191664010100000117905550505f80546001600160a01b03168152600560205260409020805460ff191660011790555050565b610e79611b25565b6001600160a01b0382165f81815260086020526040808220805460ff191685151590811790915590519092917f1e66b5fde56c4d8ecb85d64d19db4a0cda78614ba8d21189ecfe2d5d739625da91a35050565b600a5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af1158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190612c21565b50565b610f48611b25565b610f515f6121c1565b565b610f5b611b25565b604051339047905f81818185875af1925050503d805f8114610f98576040519150601f19603f3d011682016040523d82523d5f602084013e505050565b505050565b610fa5611b25565b601154610100900460ff161580610ff057505f81610fc38486612a54565b610fcd9190612a54565b118015610ff05750610fa081610fe38486612a54565b610fed9190612a54565b11155b61100c5760405162461bcd60e51b815260040161099190612c3c565b600c839055600b829055600d81905560408051848152602081018490529081018290527fd53c6456bc9b86bb998c3caf4c194591aa2be28760be154ae9d142ae25b326b6906060015b60405180910390a1505050565b61106a611b25565b62030d40811015801561108057506207a1208111155b6110e85760405162461bcd60e51b815260206004820152603360248201527f4552524f523a20476173206d757374206265206265747765656e203230302c30604482015272303020616e64203530302c303030205745492160681b6064820152608401610991565b601254810361114e5760405162461bcd60e51b815260206004820152602c60248201527f4552524f523a204e6577206761732076616c7565206d6174636865732065786960448201526b7374696e672076616c75652160a01b6064820152608401610991565b60128190556040518181527fbe808aedc0249fa7c80307e37e5465deced3eddb31d3b8df66884f9c0c074d6f90602001610acb565b61118b611b25565b5f83116111f45760405162461bcd60e51b815260206004820152603160248201527f4552524f523a204c6f776572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b5f821161125d5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a205570706572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b808361126b6012600a612b47565b61127b90653f23337fd344612b52565b6112859190612b52565b61128f9190612c85565b60135580826112a06012600a612b47565b6112b090653f23337fd344612b52565b6112ba9190612b52565b6112c49190612c85565b60148190556013546040517fc366ae351d3d7d0b43cdc7dc176c4798fc8a8c0f228b557c26c0c823e37b0f8892611055928252602082015260400190565b61130a611b25565b5f5b82811015611378578160055f86868581811061132a5761132a612b97565b905060200201602081019061133f919061285b565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061137081612ca4565b91505061130c565b508015157f7c159dbef063be687bb45fa8314ade451f22a7d65c3c57475f7b80e414178fae84846040516113ad929190612cbc565b60405180910390a2505050565b6113c2611b25565b6001600160a01b0382165f81815260056020526040808220805460ff191685151590811790915590519092917f1341b4f10431dd805adb88f6edc74d4f6f67882e6878cf6aa540f3d97a91a2a391a35050565b61141d611b25565b6011546301000000900460ff1615158115150361144c5760405162461bcd60e51b8152600401610991906129f6565b6011805463ff000000191663010000008315158102919091179182905560405160ff9190920416151581527fec812adf80955811a54e735da9734f7a470923c96c5548fa90a21fb80011731f90602001610acb565b6114a9611b25565b6101f46114b86012600a612b47565b6114c890653f23337fd344612b52565b6114d29190612c85565b8210156115475760405162461bcd60e51b815260206004820152603960248201527f4552524f523a204e65772062616c616e6365207468726573686f6c64206d757360448201527f74206265203e3d302e322520746f74616c20737570706c7921000000000000006064820152608401610991565b6101f46115566012600a612b47565b61156690653f23337fd344612b52565b6115709190612c85565b8110156115e55760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a204e6577207472616e73666572207468726573686f6c64206d7560448201527f7374206265203e3d302e322520746f74616c20737570706c79210000000000006064820152608401610991565b6115f16012600a612b47565b6115fb9083612b52565b60015561160a6012600a612b47565b6116149082612b52565b60028190556001546040517f5be9cf7a1cfe6f06f03895820a324a18e140745c3b9a3c6a9c568473df3f24be92611652928252602082015260400190565b60405180910390a15050565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612b69565b5f610952338484611b51565b6116a8611b25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036117355760405162461bcd60e51b815260206004820152602360248201527f4552524f523a2043616e6e6f74206d757461746520636f72652064657820706160448201526269722160e81b6064820152608401610991565b61173f8282612210565b5050565b61174b611b25565b601154610100900460ff16158061179657505f816117698486612a54565b6117739190612a54565b1180156117965750610fa0816117898486612a54565b6117939190612a54565b11155b6117b25760405162461bcd60e51b815260040161099190612c3c565b600f839055600e829055601081905560408051848152602081018490529081018290527f5fe4a516756a6b0cbb71fbad74616e0fe2f7a204a4c74384f78641468a87518a90606001611055565b611807611b25565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b15801561184c575f80fd5b505af115801561185e573d5f803e3d5ffd5b5050505050565b61186d611b25565b601154640100000000900460ff1615158115150361189d5760405162461bcd60e51b8152600401610991906129f6565b601180548215156401000000000264ff00000000199091161790819055604051630100000090910460ff16151581527febac0310d5b9ba7464c127bf2a1f9f862623c65ea1b2502ec2f56e6dd29ea32290602001610acb565b6118fe611b25565b600a5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611835565b611937611b25565b6001600160a01b03811661196057604051631e4fbdf760e01b81525f6004820152602401610991565b610f3d816121c1565b611971611b25565b600a5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611835565b6119ab611b25565b6001600160a01b0382165f81815260076020526040808220805460ff191685151590811790915590519092917f703e2a1b267e9264efd6afd3df9c45af223ae3edbe88c223021b026ae719a42391a35050565b6001600160a01b038316611a625760405162461bcd60e51b815260206004820152602560248201527f4552524f523a20417070726f76652066726f6d20746865207a65726f20616464604482015264726573732160d81b6064820152608401610991565b6001600160a01b038216611ac45760405162461bcd60e51b815260206004820152602360248201527f4552524f523a20417070726f766520746f20746865207a65726f20616464726560448201526273732160e81b6064820152608401610991565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f546001600160a01b03163314610f515760405163118cdaa760e01b8152336004820152602401610991565b60115462010000900460ff1615611c01576001600160a01b0383165f9081526003602052604081208054839290611b89908490612b69565b90915550506001600160a01b0382165f9081526003602052604081208054839290611bb5908490612a54565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b1891815260200190565b5f546001600160a01b03848116911614801590611c2b57505f546001600160a01b03838116911614155b15611d74576001600160a01b0383165f9081526005602052604090205460ff16158015611c7057506001600160a01b0382165f9081526005602052604090205460ff16155b15611cc75760115460ff16611cc75760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2054726164696e6720697320636c6f73656421000000000000006044820152606401610991565b6001600160a01b0383165f9081526008602052604090205460ff16158015611d0757506001600160a01b0382165f9081526008602052604090205460ff16155b15611d7457600254811115611d745760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a205472616e7366657220616d6f756e742065786365656473206d60448201526c6178696d756d206c696d69742160981b6064820152608401610991565b305f908152600360205260409020546013548110801590611d9e575060115462010000900460ff16155b8015611dc257506001600160a01b0384165f9081526006602052604090205460ff16155b8015611de557506001600160a01b0383165f9081526006602052604090205460ff165b8015611dfa57506011546301000000900460ff165b15611e3157601154640100000000900460ff1615611e28576014548111611e215780611e25565b6014545b90505b611e31816122e9565b6001600160a01b0384165f9081526003602052604081208054849290611e58908490612b69565b90915550506001600160a01b0384165f9081526005602052604081205460ff1680611e9a57506001600160a01b0384165f9081526005602052604090205460ff165b611eae57611ea9858585612622565b611eb0565b825b6001600160a01b0385165f9081526007602052604090205490915060ff16611f58576001546001600160a01b0385165f90815260036020526040902054611ef8908390612a54565b1115611f585760405162461bcd60e51b815260206004820152602960248201527f4552524f523a204e65772062616c616e63652065786365656473206d6178696d604482015268756d206c696d69742160b81b6064820152608401610991565b6001600160a01b0384165f9081526003602052604081208054839290611f7f908490612a54565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fcb91815260200190565b60405180910390a3600a546001600160a01b031663e30443bc86612003816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612046575f80fd5b505af1158015612058573d5f803e3d5ffd5b5050600a546001600160a01b0316915063e30443bc90508561208e816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156120d1575f80fd5b505af11580156120e3573d5f803e3d5ffd5b505050505f601254111561185e57600a546012546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916121299160040190815260200190565b6060604051808303815f875af1925050508015612163575060408051601f3d908101601f1916820190925261216091810190612d09565b60015b1561185e57601254604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260066020908152604080832080548515801560ff19928316811790935560079094529190932080549091169092179091556122ae57600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015612297575f80fd5b505af11580156122a9573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6011805462ff0000191662010000179055601054600f54600e54600d54600c54600b545f959493929161231b91612a54565b6123259190612a54565b61232f9190612a54565b6123399190612a54565b6123439190612a54565b601054600d549192505f916123589084612b69565b6123629190612b69565b601054600d549192505f91849161237891612a54565b6123829086612b52565b61238c9190612c85565b90505f6123998286612b69565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106123d1576123d1612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561244d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124719190612b7c565b8160018151811061248457612484612b97565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906124e89085905f90869030904290600401612d34565b5f604051808303815f87803b1580156124ff575f80fd5b505af1925050508015612510575060015b1561260157600a54600e54600b546001600160a01b0390921691869161253591612a54565b61253f9047612b52565b6125499190612c85565b6040515f81818185875af1925050503d805f8114612582576040519150601f19603f3d011682016040523d82523d5f602084013e612587565b606091505b5050600954600f54600c546001600160a01b03909216925086916125ab9190612a54565b6125b59047612b52565b6125bf9190612c85565b6040515f81818185875af1925050503d805f81146125f8576040519150601f19603f3d011682016040523d82523d5f602084013e6125fd565b606091505b5050505b61260e3061dead85611b51565b50506011805462ff00001916905550505050565b6011545f908190610100900460ff1615612790576001600160a01b0385165f9081526006602052604090205460ff16156126b057600d54600c54600b547f0000000000000000000000000000000000000000000000000000000000000000929161268b91612a54565b6126959190612a54565b61269f9085612b52565b6126a99190612c85565b9050612726565b6001600160a01b0384165f9081526006602052604090205460ff161561272657601054600f54600e547f0000000000000000000000000000000000000000000000000000000000000000929161270591612a54565b61270f9190612a54565b6127199085612b52565b6127239190612c85565b90505b801561279057305f908152600360205260408120805483929061274a908490612a54565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b61279a8184612b69565b95945050505050565b5f6020808352835180828501525f5b818110156127ce578581018301518582016040015282016127b2565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f3d575f80fd5b5f8060408385031215612813575f80fd5b823561281e816127ee565b946020939093013593505050565b8015158114610f3d575f80fd5b5f60208284031215612849575f80fd5b81356128548161282c565b9392505050565b5f6020828403121561286b575f80fd5b8135612854816127ee565b5f805f60608486031215612888575f80fd5b8335612893816127ee565b925060208401356128a3816127ee565b929592945050506040919091013590565b5f80604083850312156128c5575f80fd5b82356128d0816127ee565b915060208301356128e08161282c565b809150509250929050565b5f805f606084860312156128fd575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215612924575f80fd5b5035919050565b5f805f6040848603121561293d575f80fd5b833567ffffffffffffffff80821115612954575f80fd5b818601915086601f830112612967575f80fd5b813581811115612975575f80fd5b8760208260051b8501011115612989575f80fd5b6020928301955093505084013561299f8161282c565b809150509250925092565b5f80604083850312156129bb575f80fd5b50508035926020909101359150565b5f80604083850312156129db575f80fd5b82356129e6816127ee565b915060208301356128e0816127ee565b6020808252602a908201527f4552524f523a204e657720737461747573206d617463686573206578697374696040820152696e67207374617475732160b01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095657610956612a40565b600181815b80851115612aa157815f1904821115612a8757612a87612a40565b80851615612a9457918102915b93841c9390800290612a6c565b509250929050565b5f82612ab757506001610956565b81612ac357505f610956565b8160018114612ad95760028114612ae357612aff565b6001915050610956565b60ff841115612af457612af4612a40565b50506001821b610956565b5060208310610133831016604e8410600b8410161715612b22575081810a610956565b612b2c8383612a67565b805f1904821115612b3f57612b3f612a40565b029392505050565b5f6128548383612aa9565b808202811582820484141761095657610956612a40565b8181038181111561095657610956612a40565b5f60208284031215612b8c575f80fd5b8151612854816127ee565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b83811015612be25781516001600160a01b031687529582019590820190600101612bbd565b509495945050505050565b848152608060208201525f612c056080830186612bab565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215612c31575f80fd5b81516128548161282c565b60208082526029908201527f4552524f523a20546f74616c2066656573206d757374206265203e302520616e60408201526864203c3d203430252160b81b606082015260800190565b5f82612c9f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612cb557612cb5612a40565b5060010190565b60208082528181018390525f908460408401835b86811015612cfe578235612ce3816127ee565b6001600160a01b031682529183019190830190600101612cd0565b509695505050505050565b5f805f60608486031215612d1b575f80fd5b8351925060208401519150604084015190509250925092565b85815284602082015260a060408201525f612d5260a0830186612bab565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220c6d150952e681ea6b06bb13beff3179a397374d042e3186ab4297c75f58ca4de64736f6c6343000814003360c060405234801562000010575f80fd5b5033806200003757604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200004281620002f4565b50737a250d5630b4cf539739df2c5dacb4c659f2488d6080526007602052600f7ffb17e715424f0d73f459cecca07fcd18aa5a7779685373d8f04ce9acf74066ef81905560048054600181810183557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b91820180546001600160a01b0319908116736982508145454ce325ddbe47a25d4ec3d2311933179091557f6b5aa315c702061b8fcd6cc12c221cb8280c4abb8c3571584550b7ddf76bb66b8590558354808301855583018054821673812ba41e071c7b7fa4ebcfb62df5f45f6fa853ee1790557f0c044bd9ed09f43bcbe739742c6bf90f950ad19364df79b3427c565ed9afbb4a8590558354808301855583018054821673e0f63a424a4439cbe457d80e4f4b51ad25b2c56c1790557f3e8b1db2ade8955a561883f7b2250f0079ec867feb39be887c318f34fae2fd1e8590558354808301855583018054821673aaee1a9723aadb7afa2810263653a34ba2c21c7a1790557f37b3eb5ea1f605bc1ae441eec20d6293f4796ff67dd2705f586c7aea40007ba98590558354808301855583018054821673b90b2a35c65dbc466b04240097ca756ad20052951790557f84c5ca2f7f2e4ca0122d358aebf0036d19214a8ecd3345e57129dbae0618d018949094558254808201845582018054851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2179055600a7ff942f4688cdba65adc8aa59da583acae93fa87351143ebc775559218bfa5f83255825490810183555f8381529101805490931673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48179092558054909190620002ad57620002ad62000343565b5f91825260209091200154600380546001600160a01b0319166001600160a01b03909216919091179055620151806012556b011f1dbaa733ce84a098000060a05262000357565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52603260045260245ffd5b60805160a05161235e6200039c5f395f818161057f015261109a01525f818161024e0152818161146b015281816115230152818161160c0152611680015261235e5ff3fe6080604052600436106101ff575f3560e01c80639c53c0ca11610113578063cc5489df1161009d578063e7f4d2c31161006d578063e7f4d2c314610675578063e98030c714610694578063f2fde38b146106b3578063fd590847146106d2578063ffb2c479146106f1575f80fd5b8063cc5489df146105df578063e30443bc146105fe578063e6f083f41461061d578063e7841ec014610661575f80fd5b8063b379dc41116100e3578063b379dc4114610523578063bc4c4b371461054f578063be10b6141461056e578063c0f306ef146105a1578063cb83bcd6146105c0575f80fd5b80639c53c0ca14610499578063a549c08b146104b8578063ab6ddfa8146104e3578063ad7a672f1461050e575f80fd5b80634e7b827f11610194578063793072851161016457806379307285146103b75780637bb7bed1146103e55780638c503bf5146104045780638da5cb5b1461046857806393fcfe6114610484575f80fd5b80634e7b827f1461033157806355bb47b41461036f5780636f2789ec1461038e578063715018a6146103a3575f80fd5b8063226cfa3d116101cf578063226cfa3d146102a75780633009a609146102d257806331e79db0146102e75780634d6e5e0214610306575f80fd5b806303c833021461021257806309bbedde1461021a5780631694505e1461023d578063204f11a814610288575f80fd5b3661020e5761020c61072b565b005b5f80fd5b61020c61072b565b348015610225575f80fd5b50600d545b6040519081526020015b60405180910390f35b348015610248575f80fd5b506102707f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610234565b348015610293575f80fd5b5061022a6102a2366004611fad565b61097a565b3480156102b2575f80fd5b5061022a6102c1366004611fe4565b60146020525f908152604090205481565b3480156102dd575f80fd5b5061022a60115481565b3480156102f2575f80fd5b5061020c610301366004611fe4565b6109b8565b348015610311575f80fd5b5061022a610320366004611fe4565b60086020525f908152604090205481565b34801561033c575f80fd5b5061035f61034b366004611fe4565b60136020525f908152604090205460ff1681565b6040519015158152602001610234565b34801561037a575f80fd5b5061020c610389366004611fff565b610a2c565b348015610399575f80fd5b5061022a60125481565b3480156103ae575f80fd5b5061020c610c86565b3480156103c2575f80fd5b5061035f6103d1366004611fe4565b60056020525f908152604090205460ff1681565b3480156103f0575f80fd5b506102706103ff36600461206e565b610c99565b34801561040f575f80fd5b5061042361041e366004612085565b610cc1565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610234565b348015610473575f80fd5b505f546001600160a01b0316610270565b34801561048f575f80fd5b5061022a60025481565b3480156104a4575f80fd5b5061020c6104b3366004611fe4565b610d2a565b3480156104c3575f80fd5b5061022a6104d2366004611fe4565b60076020525f908152604090205481565b3480156104ee575f80fd5b5061022a6104fd366004611fe4565b60066020525f908152604090205481565b348015610519575f80fd5b5061022a60015481565b34801561052e575f80fd5b5061054261053d366004611fe4565b610d38565b60405161023491906120a8565b34801561055a575f80fd5b5061035f6105693660046120f8565b610eb8565b348015610579575f80fd5b5061022a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ac575f80fd5b5061020c6105bb366004611fe4565b610f80565b3480156105cb575f80fd5b5061022a6105da366004611fad565b610ff3565b3480156105ea575f80fd5b5061022a6105f9366004611fad565b610ffe565b348015610609575f80fd5b5061020c610618366004612124565b611071565b348015610628575f80fd5b5061022a610637366004611fad565b6001600160a01b039182165f908152600b6020908152604080832093909416825291909152205490565b34801561066c575f80fd5b5060115461022a565b348015610680575f80fd5b50600354610270906001600160a01b031681565b34801561069f575f80fd5b5061020c6106ae36600461206e565b6110fb565b3480156106be575f80fd5b5061020c6106cd366004611fe4565b611235565b3480156106dd575f80fd5b506104236106ec366004611fad565b611272565b3480156106fc575f80fd5b5061071061070b36600461206e565b611355565b60408051938452602084019290925290820152606001610234565b5f60015411610738575f80fd5b6003546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561077e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a2919061214e565b6003549091506107bc9034906001600160a01b0316611469565b6003546040516370a0823160e01b81523060048201525f916108329184916001600160a01b0316906370a0823190602401602060405180830381865afa158015610808573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082c919061214e565b90611751565b9050801561090a576001546108799061084f83600160801b61175c565b610859919061218d565b6003546001600160a01b03165f9081526009602052604090205490611767565b6003546001600160a01b03165f90815260096020908152604091829020929092555182815233917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a26003546001600160a01b03165f908152600860205260409020546108ef9082611767565b6003546001600160a01b03165f908152600860205260409020555b600454610919906001906121a0565b6002546109279060016121b3565b61093191906121c6565b60028190555060046002548154811061094c5761094c6121d9565b5f91825260209091200154600380546001600160a01b0319166001600160a01b039092169190911790555050565b6001600160a01b038083165f908152600b602090815260408083209385168352929052908120546109af9061082c8585610ffe565b90505b92915050565b6109c0611772565b6001600160a01b0381165f908152601360205260408120805460ff191660011790556109ed90829061179e565b6109f681611832565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b25905f90a250565b6004548114610ab35760405162461bcd60e51b815260206004820152604260248201527f4152524159204d49534d415443483a2050657263656e746167657320746f746160448201527f6c206d757374206d61746368207265776172647320746f6b656e7320746f74616064820152616c2160f01b608482015260a4015b60405180910390fd5b5f805b82811015610bf1576064848483818110610ad257610ad26121d9565b905060200201351115610b455760405162461bcd60e51b815260206004820152603560248201527f50455243454e544147452045584345454445443a2050657263656e74616765206044820152746d757374206e6f742065786365656420313030252160581b6064820152608401610aaa565b838382818110610b5757610b576121d9565b90506020020135600a5f336001600160a01b03166001600160a01b031681526020019081526020015f205f60048481548110610b9557610b956121d9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055838382818110610bcb57610bcb6121d9565b9050602002013582610bdd91906121b3565b915080610be9816121ed565b915050610ab6565b5080606414610c685760405162461bcd60e51b815260206004820152603d60248201527f20544f54414c2050455243454e544147452045584345454445443a20546f746160448201527f6c2070657263656e74616765206d75737420657175616c2031303025210000006064820152608401610aaa565b5050335f908152600560205260409020805460ff1916600117905550565b610c8e611772565b610c975f61195d565b565b60048181548110610ca8575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f805f805f805f80610cd2600d5490565b8a10610cf557505f96505f19955085945086935083925082915081905080610d1d565b5f610cff8b6119ac565b9050610d0b818b611272565b98509850985098509850985098509850505b9295985092959890939650565b610d3433826119dc565b5050565b6004546060905f9067ffffffffffffffff811115610d5857610d58612205565b604051908082528060200260200182016040528015610d81578160200160208202803683370190505b506001600160a01b0384165f9081526005602052604090205490915060ff1615610e3a575f5b600454811015610e34576001600160a01b0384165f908152600a602052604081206004805491929184908110610ddf57610ddf6121d9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610e1757610e176121d9565b602090810291909101015280610e2c816121ed565b915050610da7565b506109b2565b5f5b600454811015610eb15760075f60048381548110610e5c57610e5c6121d9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610e9457610e946121d9565b602090810291909101015280610ea9816121ed565b915050610e3c565b5092915050565b5f610ec1611772565b5f805f5b600454811015610f7757610eff8660048381548110610ee657610ee66121d9565b5f918252602090912001546001600160a01b03166119dc565b92508215610f65576001600160a01b0386165f81815260146020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610f589087815260200190565b60405180910390a3600191505b80610f6f816121ed565b915050610ec5565b50949350505050565b610f88611772565b6001600160a01b0381165f9081526013602052604090205460ff16610fab575f80fd5b6001600160a01b0381165f81815260136020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b5f6109af838361097a565b6001600160a01b038082165f818152600c6020908152604080832094871683529381528382205460068252848320549383526009909152928120549092600160801b9261106792611062929161105c916110579161175c565b611c00565b90611c0e565b611c48565b6109af919061218d565b611079611772565b6001600160a01b0382165f9081526013602052604090205460ff16610d34577f000000000000000000000000000000000000000000000000000000000000000081106110d8576110c9828261179e565b6110d38282611c59565b6110eb565b6110e2825f61179e565b6110eb82611832565b6110f6826001610eb8565b505050565b611103611772565b6201518081111561118a5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610aaa565b60125481036112015760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610aaa565b6012819055604051819081907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f905f90a350565b61123d611772565b6001600160a01b03811661126657604051631e4fbdf760e01b81525f6004820152602401610aaa565b61126f8161195d565b50565b815f80808080808061128388611d14565b96505f1995505f87126112e1576011548711156112af576011546112a8908890611d56565b95506112e1565b601154600d545f91106112c2575f6112d1565b601154600d546112d191611751565b90506112dd8882611c0e565b9650505b6112eb888a61097a565b94506112f7888a610ffe565b6001600160a01b0389165f9081526014602052604090205490945092508261131f575f61132d565b60125461132d908490611767565b915042821161133c575f611346565b6113468242611751565b90509295985092959890939650565b600d545f90819081908082036113755750506011545f9250829150611462565b6011545f805a90505f805b898410801561138e57508582105b15611451578461139d816121ed565b600d54909650861090506113af575f94505b5f600d5f0186815481106113c5576113c56121d9565b5f9182526020808320909101546001600160a01b031680835260149091526040909120549091506113f590611d8f565b1561141857611405816001610eb8565b156114185781611414816121ed565b9250505b82611422816121ed565b9350505f5a9050808511156114485761144561143e8683611751565b8790611767565b95505b93506113809050565b601185905590975095509193505050505b9193909250565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190612219565b6001600160a01b0316816001600160a01b03161461167e576040805160028082526060820183525f926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a19190612219565b815f815181106115b3576115b36121d9565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106115e7576115e76121d9565b6001600160a01b03928316602091820292909201015260405163b6f9de9560e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de9590859061164b905f90869030904290600401612234565b5f604051808303818588803b158015611662575f80fd5b505af1158015611674573d5f803e3d5ffd5b5050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116fe9190612219565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611736575f80fd5b505af1158015611748573d5f803e3d5ffd5b50505050505050565b5f6109af82846121a0565b5f6109af828461229c565b5f6109af82846121b3565b5f546001600160a01b03163314610c975760405163118cdaa760e01b8152336004820152602401610aaa565b6001600160a01b0382165f908152600660205260409020805490829055808211156117f7575f6117ce8383611751565b90506117da8482611db4565b8060015f8282546117eb91906121b3565b909155506110f6915050565b808210156110f6575f61180a8284611751565b90506118168482611eb6565b8060015f82825461182791906121a0565b909155505050505050565b6001600160a01b0381165f9081526010602052604090205460ff166118545750565b6001600160a01b0381165f908152601060209081526040808320805460ff19169055600e8252808320839055600f909152812054600d5490919061189a906001906121a0565b90505f600d5f0182815481106118b2576118b26121d9565b5f9182526020808320909101546001600160a01b03908116808452600f90925260408084208790559087168352822091909155600d80549192508291859081106118fe576118fe6121d9565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d805480611937576119376122b3565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f600d5f0182815481106119c2576119c26121d9565b5f918252602090912001546001600160a01b031692915050565b5f806119e8848461097a565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa158015611a2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a53919061214e565b9050808210611a625780611a64565b815b91508115611bf6576001600160a01b038086165f908152600b6020908152604080832093881683529290522054611a9b9083611767565b6001600160a01b038087165f818152600b60209081526040808320948a16835293815283822094909455908152600590925281205460ff16611af4576001600160a01b0385165f90815260076020526040902054611b1a565b6001600160a01b038087165f908152600a60209081526040808320938916835292905220545b90505f611b326064611b2c868561175c565b90611f8e565b60405163a9059cbb60e01b81526001600160a01b038981166004830152602482018390529192509087169063a9059cbb906044016020604051808303815f875af1158015611b82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba691906122c7565b50866001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d82604051611be291815260200190565b60405180910390a2839450505050506109b2565b505f949350505050565b5f81818112156109b2575f80fd5b5f80611c1a83856122e2565b90505f8312158015611c2c5750838112155b80611c4057505f83128015611c4057508381125b6109af575f80fd5b5f80821215611c55575f80fd5b5090565b6001600160a01b0382165f9081526010602052604090205460ff1615611c95576001600160a01b03919091165f908152600e6020526040902055565b6001600160a01b0382165f818152601060209081526040808320805460ff19166001908117909155600e8352818420869055600d8054600f909452918420839055820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b03191690911790555050565b6001600160a01b0381165f9081526010602052604081205460ff16611d3b57505f19919050565b506001600160a01b03165f908152600f602052604090205490565b5f80611d628385612309565b90505f8312158015611d745750838113155b80611c4057505f83128015611c4057508381136109af575f80fd5b5f42821115611d9f57505f919050565b601254611dac4284611751565b101592915050565b5f5b6004548110156110f657611e5a611e0a6110578460095f60048781548110611de057611de06121d9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020549061175c565b600c5f60048581548110611e2057611e206121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093891682529290925290205490611d56565b600c5f60048481548110611e7057611e706121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611eae816121ed565b915050611db6565b5f5b6004548110156110f657611f32611ee26110578460095f60048781548110611de057611de06121d9565b600c5f60048581548110611ef857611ef86121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093891682529290925290205490611c0e565b600c5f60048481548110611f4857611f486121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611f86816121ed565b915050611eb8565b5f6109af828461218d565b6001600160a01b038116811461126f575f80fd5b5f8060408385031215611fbe575f80fd5b8235611fc981611f99565b91506020830135611fd981611f99565b809150509250929050565b5f60208284031215611ff4575f80fd5b81356109af81611f99565b5f8060208385031215612010575f80fd5b823567ffffffffffffffff80821115612027575f80fd5b818501915085601f83011261203a575f80fd5b813581811115612048575f80fd5b8660208260051b850101111561205c575f80fd5b60209290920196919550909350505050565b5f6020828403121561207e575f80fd5b5035919050565b5f8060408385031215612096575f80fd5b823591506020830135611fd981611f99565b602080825282518282018190525f9190848201906040850190845b818110156120df578351835292840192918401916001016120c3565b50909695505050505050565b801515811461126f575f80fd5b5f8060408385031215612109575f80fd5b823561211481611f99565b91506020830135611fd9816120eb565b5f8060408385031215612135575f80fd5b823561214081611f99565b946020939093013593505050565b5f6020828403121561215e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261219b5761219b612165565b500490565b818103818111156109b2576109b2612179565b808201808211156109b2576109b2612179565b5f826121d4576121d4612165565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f600182016121fe576121fe612179565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612229575f80fd5b81516109af81611f99565b5f60808201868352602060808185015281875180845260a08601915082890193505f5b8181101561227c5784516001600160a01b031683529383019391830191600101612257565b50506001600160a01b039690961660408501525050506060015292915050565b80820281158282048414176109b2576109b2612179565b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156122d7575f80fd5b81516109af816120eb565b8082018281125f83128015821682158216171561230157612301612179565b505092915050565b8181035f831280158383131683831282161715610eb157610eb161217956fea2646970667358221220127dce52561aed9310bb86c3af0057fc3ab22ba29b435c89f6f448c7716a84a564736f6c63430008140033
Deployed Bytecode
0x6080604052600436106102a8575f3560e01c8063871c128d1161016f578063c17b5b8c116100d8578063e98030c711610092578063f242ab411161006d578063f242ab41146108b6578063f2fde38b146108e9578063f8eba5c914610908578063fff4602f14610927575f80fd5b8063e98030c714610869578063ea0cdeff14610888578063ec44acf21461089d575f80fd5b8063c17b5b8c14610795578063cb20beaa146107b4578063d151d9cd146107d3578063dc2f5e48146107f1578063dd62ed3e14610810578063e8cedb2414610854575f80fd5b806395d89b411161012957806395d89b41146106cc57806398faa8ea146106fa5780639ae786af14610719578063a457c2d714610738578063a9059cbb14610757578063c16dd4a414610776575f80fd5b8063871c128d14610616578063879dd3c514610635578063880000341461065357806389824b93146106725780638da5cb5b146106915780638ebfc796146106ad575f80fd5b8063313ce567116102115780634e71d92d116101cb5780634e71d92d1461057457806358fa63ca1461058857806370a082311461059b578063715018a6146105cf5780637fa787ba146105e35780638095d564146105f7575f80fd5b8063313ce567146104be57806339509351146104d25780633ecad271146104f15780633f4218e01461051f57806340fb0b131461054d57806342ab9b2614610555575f80fd5b806318160ddd1161026257806318160ddd146103ee578063232bbdca1461041057806323b872dd1461043e5780632b112e491461045d5780632c1f5216146104715780632e1207aa14610490575f80fd5b806303fd2a45146102b357806306fdde03146102e55780630758d92414610332578063095ea7b3146103655780630f0ceb671461039457806312163785146103b5575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102c861dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f0575f80fd5b5061032560405180604001604052806015815260200174092dcccd2dcd2e8ca409adedccaf2408ed8d2e8c6d605b1b81525081565b6040516102dc91906127a3565b34801561033d575f80fd5b506102c87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610370575f80fd5b5061038461037f366004612802565b610946565b60405190151581526020016102dc565b34801561039f575f80fd5b506103b36103ae366004612839565b61095c565b005b3480156103c0575f80fd5b50600e54600f546010546103d392919083565b604080519384526020840192909252908201526060016102dc565b3480156103f9575f80fd5b50610402610ad6565b6040519081526020016102dc565b34801561041b575f80fd5b5061038461042a36600461285b565b60086020525f908152604090205460ff1681565b348015610449575f80fd5b50610384610458366004612876565b610af5565b348015610468575f80fd5b50610402610b45565b34801561047c575f80fd5b50600a546102c8906001600160a01b031681565b34801561049b575f80fd5b506103846104aa36600461285b565b60076020525f908152604090205460ff1681565b3480156104c9575f80fd5b50610402601281565b3480156104dd575f80fd5b506103846104ec366004612802565b610bcd565b3480156104fc575f80fd5b5061038461050b36600461285b565b60066020525f908152604090205460ff1681565b34801561052a575f80fd5b5061038461053936600461285b565b60056020525f908152604090205460ff1681565b6103b3610c03565b348015610560575f80fd5b506103b361056f3660046128b4565b610e71565b34801561057f575f80fd5b506103b3610ecc565b348015610593575f80fd5b506102c85f81565b3480156105a6575f80fd5b506104026105b536600461285b565b6001600160a01b03165f9081526003602052604090205490565b3480156105da575f80fd5b506103b3610f40565b3480156105ee575f80fd5b506103b3610f53565b348015610602575f80fd5b506103b36106113660046128eb565b610f9d565b348015610621575f80fd5b506103b3610630366004612914565b611062565b348015610640575f80fd5b5060115461038490610100900460ff1681565b34801561065e575f80fd5b506103b361066d3660046128eb565b611183565b34801561067d575f80fd5b506103b361068c36600461292b565b611302565b34801561069c575f80fd5b505f546001600160a01b03166102c8565b3480156106b8575f80fd5b506103b36106c73660046128b4565b6113ba565b3480156106d7575f80fd5b5061032560405180604001604052806003815260200162494d4760e81b81525081565b348015610705575f80fd5b506103b3610714366004612839565b611415565b348015610724575f80fd5b506103b36107333660046129aa565b6114a1565b348015610743575f80fd5b50610384610752366004612802565b61165e565b348015610762575f80fd5b50610384610771366004612802565b611694565b348015610781575f80fd5b506103b36107903660046128b4565b6116a0565b3480156107a0575f80fd5b506103b36107af3660046128eb565b611743565b3480156107bf575f80fd5b506103b36107ce36600461285b565b6117ff565b3480156107de575f80fd5b50600b54600c54600d546103d392919083565b3480156107fc575f80fd5b506103b361080b366004612839565b611865565b34801561081b575f80fd5b5061040261082a3660046129ca565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561085f575f80fd5b5061040260015481565b348015610874575f80fd5b506103b3610883366004612914565b6118f6565b348015610893575f80fd5b5061040260025481565b3480156108a8575f80fd5b506011546103849060ff1681565b3480156108c1575f80fd5b506102c87f000000000000000000000000723d2fa64221b4e22706c931140e9c895430dcf281565b3480156108f4575f80fd5b506103b361090336600461285b565b61192f565b348015610913575f80fd5b506103b361092236600461285b565b611969565b348015610932575f80fd5b506103b36109413660046128b4565b6119a3565b5f6109523384846119fe565b5060015b92915050565b610964611b25565b601154610100900460ff1615158115150361099a5760405162461bcd60e51b8152600401610991906129f6565b60405180910390fd5b8015610a8257601054600e54600f545f92916109b591612a54565b6109bf9190612a54565b11610a165760405162461bcd60e51b815260206004820152602160248201527f4552524f523a20546f74616c206f75742066656573206d757374206265203e306044820152602560f81b6064820152608401610991565b600d54600b54600c545f9291610a2b91612a54565b610a359190612a54565b11610a825760405162461bcd60e51b815260206004820181905260248201527f4552524f523a20546f74616c20696e2066656573206d757374206265203e30256044820152606401610991565b601180548215156101000261ff00199091161790556040517fcf5b8994e88702dcc077176517145092990b0e63dd35b64c412961aceb0139da90610acb90831515815260200190565b60405180910390a150565b610ae26012600a612b47565b610af290653f23337fd344612b52565b81565b5f610b01848484611b51565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610b3b918691610b36908690612b69565b6119fe565b5060019392505050565b60036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff5461dead5f9081527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c54909190610ba46012600a612b47565b610bb490653f23337fd344612b52565b610bbe9190612b69565b610bc89190612b69565b905090565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612a54565b610c0b611b25565b60115460ff1615610c715760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a2043616e6e6f74206f70656e2074726164696e67206d6f7265206044820152697468616e206f6e63652160b01b6064820152608401610991565b5f60055f610c865f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805460ff191694151594909417909355805160028082526060820183529092909190830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d529190612b7c565b815f81518110610d6457610d64612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610d9857610d98612b97565b6001600160a01b0392831660209182029290920101527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663b6f9de95345f84610de95f546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610e099493929190612bed565b5f604051808303818588803b158015610e20575f80fd5b505af1158015610e32573d5f803e3d5ffd5b50506011805464ffff0000ff191664010100000117905550505f80546001600160a01b03168152600560205260409020805460ff191660011790555050565b610e79611b25565b6001600160a01b0382165f81815260086020526040808220805460ff191685151590811790915590519092917f1e66b5fde56c4d8ecb85d64d19db4a0cda78614ba8d21189ecfe2d5d739625da91a35050565b600a5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af1158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190612c21565b50565b610f48611b25565b610f515f6121c1565b565b610f5b611b25565b604051339047905f81818185875af1925050503d805f8114610f98576040519150601f19603f3d011682016040523d82523d5f602084013e505050565b505050565b610fa5611b25565b601154610100900460ff161580610ff057505f81610fc38486612a54565b610fcd9190612a54565b118015610ff05750610fa081610fe38486612a54565b610fed9190612a54565b11155b61100c5760405162461bcd60e51b815260040161099190612c3c565b600c839055600b829055600d81905560408051848152602081018490529081018290527fd53c6456bc9b86bb998c3caf4c194591aa2be28760be154ae9d142ae25b326b6906060015b60405180910390a1505050565b61106a611b25565b62030d40811015801561108057506207a1208111155b6110e85760405162461bcd60e51b815260206004820152603360248201527f4552524f523a20476173206d757374206265206265747765656e203230302c30604482015272303020616e64203530302c303030205745492160681b6064820152608401610991565b601254810361114e5760405162461bcd60e51b815260206004820152602c60248201527f4552524f523a204e6577206761732076616c7565206d6174636865732065786960448201526b7374696e672076616c75652160a01b6064820152608401610991565b60128190556040518181527fbe808aedc0249fa7c80307e37e5465deced3eddb31d3b8df66884f9c0c074d6f90602001610acb565b61118b611b25565b5f83116111f45760405162461bcd60e51b815260206004820152603160248201527f4552524f523a204c6f776572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b5f821161125d5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a205570706572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b808361126b6012600a612b47565b61127b90653f23337fd344612b52565b6112859190612b52565b61128f9190612c85565b60135580826112a06012600a612b47565b6112b090653f23337fd344612b52565b6112ba9190612b52565b6112c49190612c85565b60148190556013546040517fc366ae351d3d7d0b43cdc7dc176c4798fc8a8c0f228b557c26c0c823e37b0f8892611055928252602082015260400190565b61130a611b25565b5f5b82811015611378578160055f86868581811061132a5761132a612b97565b905060200201602081019061133f919061285b565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061137081612ca4565b91505061130c565b508015157f7c159dbef063be687bb45fa8314ade451f22a7d65c3c57475f7b80e414178fae84846040516113ad929190612cbc565b60405180910390a2505050565b6113c2611b25565b6001600160a01b0382165f81815260056020526040808220805460ff191685151590811790915590519092917f1341b4f10431dd805adb88f6edc74d4f6f67882e6878cf6aa540f3d97a91a2a391a35050565b61141d611b25565b6011546301000000900460ff1615158115150361144c5760405162461bcd60e51b8152600401610991906129f6565b6011805463ff000000191663010000008315158102919091179182905560405160ff9190920416151581527fec812adf80955811a54e735da9734f7a470923c96c5548fa90a21fb80011731f90602001610acb565b6114a9611b25565b6101f46114b86012600a612b47565b6114c890653f23337fd344612b52565b6114d29190612c85565b8210156115475760405162461bcd60e51b815260206004820152603960248201527f4552524f523a204e65772062616c616e6365207468726573686f6c64206d757360448201527f74206265203e3d302e322520746f74616c20737570706c7921000000000000006064820152608401610991565b6101f46115566012600a612b47565b61156690653f23337fd344612b52565b6115709190612c85565b8110156115e55760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a204e6577207472616e73666572207468726573686f6c64206d7560448201527f7374206265203e3d302e322520746f74616c20737570706c79210000000000006064820152608401610991565b6115f16012600a612b47565b6115fb9083612b52565b60015561160a6012600a612b47565b6116149082612b52565b60028190556001546040517f5be9cf7a1cfe6f06f03895820a324a18e140745c3b9a3c6a9c568473df3f24be92611652928252602082015260400190565b60405180910390a15050565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612b69565b5f610952338484611b51565b6116a8611b25565b7f000000000000000000000000723d2fa64221b4e22706c931140e9c895430dcf26001600160a01b0316826001600160a01b0316036117355760405162461bcd60e51b815260206004820152602360248201527f4552524f523a2043616e6e6f74206d757461746520636f72652064657820706160448201526269722160e81b6064820152608401610991565b61173f8282612210565b5050565b61174b611b25565b601154610100900460ff16158061179657505f816117698486612a54565b6117739190612a54565b1180156117965750610fa0816117898486612a54565b6117939190612a54565b11155b6117b25760405162461bcd60e51b815260040161099190612c3c565b600f839055600e829055601081905560408051848152602081018490529081018290527f5fe4a516756a6b0cbb71fbad74616e0fe2f7a204a4c74384f78641468a87518a90606001611055565b611807611b25565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b15801561184c575f80fd5b505af115801561185e573d5f803e3d5ffd5b5050505050565b61186d611b25565b601154640100000000900460ff1615158115150361189d5760405162461bcd60e51b8152600401610991906129f6565b601180548215156401000000000264ff00000000199091161790819055604051630100000090910460ff16151581527febac0310d5b9ba7464c127bf2a1f9f862623c65ea1b2502ec2f56e6dd29ea32290602001610acb565b6118fe611b25565b600a5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611835565b611937611b25565b6001600160a01b03811661196057604051631e4fbdf760e01b81525f6004820152602401610991565b610f3d816121c1565b611971611b25565b600a5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611835565b6119ab611b25565b6001600160a01b0382165f81815260076020526040808220805460ff191685151590811790915590519092917f703e2a1b267e9264efd6afd3df9c45af223ae3edbe88c223021b026ae719a42391a35050565b6001600160a01b038316611a625760405162461bcd60e51b815260206004820152602560248201527f4552524f523a20417070726f76652066726f6d20746865207a65726f20616464604482015264726573732160d81b6064820152608401610991565b6001600160a01b038216611ac45760405162461bcd60e51b815260206004820152602360248201527f4552524f523a20417070726f766520746f20746865207a65726f20616464726560448201526273732160e81b6064820152608401610991565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f546001600160a01b03163314610f515760405163118cdaa760e01b8152336004820152602401610991565b60115462010000900460ff1615611c01576001600160a01b0383165f9081526003602052604081208054839290611b89908490612b69565b90915550506001600160a01b0382165f9081526003602052604081208054839290611bb5908490612a54565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b1891815260200190565b5f546001600160a01b03848116911614801590611c2b57505f546001600160a01b03838116911614155b15611d74576001600160a01b0383165f9081526005602052604090205460ff16158015611c7057506001600160a01b0382165f9081526005602052604090205460ff16155b15611cc75760115460ff16611cc75760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2054726164696e6720697320636c6f73656421000000000000006044820152606401610991565b6001600160a01b0383165f9081526008602052604090205460ff16158015611d0757506001600160a01b0382165f9081526008602052604090205460ff16155b15611d7457600254811115611d745760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a205472616e7366657220616d6f756e742065786365656473206d60448201526c6178696d756d206c696d69742160981b6064820152608401610991565b305f908152600360205260409020546013548110801590611d9e575060115462010000900460ff16155b8015611dc257506001600160a01b0384165f9081526006602052604090205460ff16155b8015611de557506001600160a01b0383165f9081526006602052604090205460ff165b8015611dfa57506011546301000000900460ff165b15611e3157601154640100000000900460ff1615611e28576014548111611e215780611e25565b6014545b90505b611e31816122e9565b6001600160a01b0384165f9081526003602052604081208054849290611e58908490612b69565b90915550506001600160a01b0384165f9081526005602052604081205460ff1680611e9a57506001600160a01b0384165f9081526005602052604090205460ff165b611eae57611ea9858585612622565b611eb0565b825b6001600160a01b0385165f9081526007602052604090205490915060ff16611f58576001546001600160a01b0385165f90815260036020526040902054611ef8908390612a54565b1115611f585760405162461bcd60e51b815260206004820152602960248201527f4552524f523a204e65772062616c616e63652065786365656473206d6178696d604482015268756d206c696d69742160b81b6064820152608401610991565b6001600160a01b0384165f9081526003602052604081208054839290611f7f908490612a54565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fcb91815260200190565b60405180910390a3600a546001600160a01b031663e30443bc86612003816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612046575f80fd5b505af1158015612058573d5f803e3d5ffd5b5050600a546001600160a01b0316915063e30443bc90508561208e816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156120d1575f80fd5b505af11580156120e3573d5f803e3d5ffd5b505050505f601254111561185e57600a546012546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916121299160040190815260200190565b6060604051808303815f875af1925050508015612163575060408051601f3d908101601f1916820190925261216091810190612d09565b60015b1561185e57601254604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260066020908152604080832080548515801560ff19928316811790935560079094529190932080549091169092179091556122ae57600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015612297575f80fd5b505af11580156122a9573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6011805462ff0000191662010000179055601054600f54600e54600d54600c54600b545f959493929161231b91612a54565b6123259190612a54565b61232f9190612a54565b6123399190612a54565b6123439190612a54565b601054600d549192505f916123589084612b69565b6123629190612b69565b601054600d549192505f91849161237891612a54565b6123829086612b52565b61238c9190612c85565b90505f6123998286612b69565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106123d1576123d1612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561244d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124719190612b7c565b8160018151811061248457612484612b97565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac947906124e89085905f90869030904290600401612d34565b5f604051808303815f87803b1580156124ff575f80fd5b505af1925050508015612510575060015b1561260157600a54600e54600b546001600160a01b0390921691869161253591612a54565b61253f9047612b52565b6125499190612c85565b6040515f81818185875af1925050503d805f8114612582576040519150601f19603f3d011682016040523d82523d5f602084013e612587565b606091505b5050600954600f54600c546001600160a01b03909216925086916125ab9190612a54565b6125b59047612b52565b6125bf9190612c85565b6040515f81818185875af1925050503d805f81146125f8576040519150601f19603f3d011682016040523d82523d5f602084013e6125fd565b606091505b5050505b61260e3061dead85611b51565b50506011805462ff00001916905550505050565b6011545f908190610100900460ff1615612790576001600160a01b0385165f9081526006602052604090205460ff16156126b057600d54600c54600b547f0000000000000000000000000000000000000000000000000000000000002710929161268b91612a54565b6126959190612a54565b61269f9085612b52565b6126a99190612c85565b9050612726565b6001600160a01b0384165f9081526006602052604090205460ff161561272657601054600f54600e547f0000000000000000000000000000000000000000000000000000000000002710929161270591612a54565b61270f9190612a54565b6127199085612b52565b6127239190612c85565b90505b801561279057305f908152600360205260408120805483929061274a908490612a54565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b61279a8184612b69565b95945050505050565b5f6020808352835180828501525f5b818110156127ce578581018301518582016040015282016127b2565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f3d575f80fd5b5f8060408385031215612813575f80fd5b823561281e816127ee565b946020939093013593505050565b8015158114610f3d575f80fd5b5f60208284031215612849575f80fd5b81356128548161282c565b9392505050565b5f6020828403121561286b575f80fd5b8135612854816127ee565b5f805f60608486031215612888575f80fd5b8335612893816127ee565b925060208401356128a3816127ee565b929592945050506040919091013590565b5f80604083850312156128c5575f80fd5b82356128d0816127ee565b915060208301356128e08161282c565b809150509250929050565b5f805f606084860312156128fd575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215612924575f80fd5b5035919050565b5f805f6040848603121561293d575f80fd5b833567ffffffffffffffff80821115612954575f80fd5b818601915086601f830112612967575f80fd5b813581811115612975575f80fd5b8760208260051b8501011115612989575f80fd5b6020928301955093505084013561299f8161282c565b809150509250925092565b5f80604083850312156129bb575f80fd5b50508035926020909101359150565b5f80604083850312156129db575f80fd5b82356129e6816127ee565b915060208301356128e0816127ee565b6020808252602a908201527f4552524f523a204e657720737461747573206d617463686573206578697374696040820152696e67207374617475732160b01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095657610956612a40565b600181815b80851115612aa157815f1904821115612a8757612a87612a40565b80851615612a9457918102915b93841c9390800290612a6c565b509250929050565b5f82612ab757506001610956565b81612ac357505f610956565b8160018114612ad95760028114612ae357612aff565b6001915050610956565b60ff841115612af457612af4612a40565b50506001821b610956565b5060208310610133831016604e8410600b8410161715612b22575081810a610956565b612b2c8383612a67565b805f1904821115612b3f57612b3f612a40565b029392505050565b5f6128548383612aa9565b808202811582820484141761095657610956612a40565b8181038181111561095657610956612a40565b5f60208284031215612b8c575f80fd5b8151612854816127ee565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b83811015612be25781516001600160a01b031687529582019590820190600101612bbd565b509495945050505050565b848152608060208201525f612c056080830186612bab565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215612c31575f80fd5b81516128548161282c565b60208082526029908201527f4552524f523a20546f74616c2066656573206d757374206265203e302520616e60408201526864203c3d203430252160b81b606082015260800190565b5f82612c9f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612cb557612cb5612a40565b5060010190565b60208082528181018390525f908460408401835b86811015612cfe578235612ce3816127ee565b6001600160a01b031682529183019190830190600101612cd0565b509695505050505050565b5f805f60608486031215612d1b575f80fd5b8351925060208401519150604084015190509250925092565b85815284602082015260a060408201525f612d5260a0830186612bab565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220c6d150952e681ea6b06bb13beff3179a397374d042e3186ab4297c75f58ca4de64736f6c63430008140033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.