ERC-20
Overview
Max Total Supply
1,000,000,000,000 DYNA
Holders
117
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
2,550,913.276254290550829267 DYNAValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DynamicsToken
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 80 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /***************************************************************************************************************************************\ |********************************************** Welcome to the DYNAMICS TOKEN source code **********************************************| |***************************************************************************************************************************************| |* This project supports the following: | |***************************************************************************************************************************************| |* 1. A good cause, a portion of fees are sent to charity as outlined on the Dynamics Webpage | |* 2. Token reflections. | |* 3. Automatic Liquidity reflections. | |* 4. Automated reflections of Ethereum to hodlers. | |* 5. Token Buybacks. | |* 6. A Token airdrop system where tokens can be injected directly back into pools for Liquidity, Ethereum reflections and Buybacks. | |* 7. Burning Functions. | |* 7. An airdrop system that feeds directly into the contract. | |* 8. Multi-Tiered sell fees that encourage hodling and discourage whales/dumping. | |* 9. Buy and transfer fees separate from seller fees that support the above. | |***************************************************************************************************************************************| |***************************************************************************************************************************************| |******************** Fork if you dare... But seriously, if you fork just shout us out and consider our charity. :) ********************| |***************************************************************************************************************************************| |***************************************************************************************************************************************| |**************** Don't Mind the blood, sweat and tears throughout the contract, it has caused us many sleepless nights ****************| | - The Dev! | |***************************************************************************************************************************************| |***************************************************************************************************************************************| \***************************************************************************************************************************************/ import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/utils/math/SafeMath.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol'; import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol'; import '@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol'; import './utils/Ownable.sol'; import "./utils/LockableSwap.sol"; import "./utils/EthReflectingToken.sol"; import "./libs/FeeLibrary.sol"; import "./interfaces/SupportingAirdropDeposit.sol"; import "./interfaces/IBuyBack.sol"; contract DynamicsToken is Context, Ownable, IERC20, LockableSwap, SupportingAirdropDeposit, FeeLibrary, EthReflectingToken { using SafeMath for uint256; using Address for address; event Burn(address indexed to, uint256 value); event UpdateRouter(address indexed newAddress, address indexed oldAddress); event SniperBlacklisted(address indexed potentialSniper, bool isAddedToBlacklist); event UpdateFees(Fees oldFees, Fees newFees); event UpdateSellerFees(SellFees oldSellFees, SellFees newSellFees); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); struct User { uint256 buyCD; uint256 sellCD; uint256 lastBuy; bool exists; } address public deadAddress = 0x000000000000000000000000000000000000dEaD; Fees public buyFees = Fees({reflection: 1, project: 0, liquidity: 2, burn: 1, charityAndMarketing: 3, ethReflection: 8}); Fees public transferFees = Fees({reflection: 0, project: 1, liquidity: 1, burn: 0, charityAndMarketing: 0, ethReflection: 0}); Fees private previousBuyFees; Fees private previousTransferFees; // To lock the init after first run as constructor is split into that function and we dont want to be able to ever run it twice uint8 private runOnce = 3; uint256 public totalEthSentToPool = 0; uint8 private swapSelector; uint256 public buyerDiscountPrice = 2 ether; mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => bool) private isMarketingProvider; mapping (address => bool) private isRegistered; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => User) private trader; mapping (address => bool) public _isBlacklisted; mapping (address => bool) public _isExcludedFromFee; uint256 private constant MAX = ~uint256(0); uint256 private _tTotal; uint256 private _rTotal; uint256 private _tFeeTotal; IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public uniswapV2Pair; EthBuybacks public buybackTokenTracker = EthBuybacks({liquidity: 0, redistribution : 0, buyback : 0}); IBuyBack public buybackContract; uint256 private sellToProject = 30; uint256 private sellToEthReflections = 40; uint256 public _minimumTimeFee = 5; uint256 public _minimumSizeFee = 5; bool public buyBackEnabled = true; bool public ethSwapEnabled = true; uint256 public minBuyBack = 0.01 ether; uint256 private poolMaxSwap = 10; bool private skipBB = false; string public constant name = "Dynamics Token"; string public constant symbol = "DYNA"; uint256 public constant decimals = 18; bool public sniperDetection = true; bool public tradingOpen = false; bool public _cooldownEnabled = true; uint256 public tradingStartTime; address payable public _projectWallet; address payable public airdropTokenInjector; address payable public _marketingWallet = payable(0xb854a252e60218a37b8f50081FEC7A5d8b45957A); address payable public _charityWallet = payable(0xA7817792a12C6cC5E6De2929FE116a67a79DF9d3); address payable public servicesWallet = payable(0xEA8fe1764a5385f0C8ACf16F14597856A1f594B8); uint256 private numTokensSellToAddToLiquidity; constructor (uint256 _supply) payable { _tTotal = _supply * 10 ** decimals; _rTotal = (MAX - (MAX % _tTotal)); numTokensSellToAddToLiquidity = 40000 * 10 ** decimals; _rOwned[address(this)] = _rTotal; _isExcludedFromFee[_owner] = true; _isExcludedFromFee[_msgSender()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[address(_marketingWallet)] = true; _isExcludedFromFee[address(_charityWallet)] = true; _isExcludedFromFee[address(servicesWallet)] = true; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { require(gasleft() >= minGas, "Requires higher gas"); _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeFromFee(address account, bool exclude) public onlyOwner { _isExcludedFromFee[account] = exclude; } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _takeProjectFees(uint256 tProject, uint256 tMarketing) private { if(tProject == 0 && tMarketing == 0) return; uint256 currentRate = _getRate(); uint256 rProject = tProject.mul(currentRate); uint256 tCharity = tMarketing.mul(2).div(3); uint256 rMarketing = (tMarketing.sub(tCharity)).mul(currentRate); uint256 rCharity = tCharity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rProject).add(rMarketing); _transferStandard(address(this), _projectWallet, rProject, tProject, rProject); _transferStandard(address(this), _marketingWallet, rMarketing, tMarketing, rMarketing); _transferStandard(address(this), _charityWallet, rCharity, tCharity, rCharity); } function _getTValues(uint256 tAmount, uint256 liquidityFee, uint256 reflectiveFee, uint256 nonReflectiveFee) private pure returns (uint256, uint256, uint256, uint256) { uint256 tFee = tAmount.mul(reflectiveFee).div(100); uint256 tLiquidity = tAmount.mul(liquidityFee).div(100); uint256 tOtherFees = tAmount.mul(nonReflectiveFee).div(100); uint256 tTransferAmount = tAmount.sub(tFee); tTransferAmount = tAmount.sub(tLiquidity).sub(tOtherFees); return (tTransferAmount, tFee, tLiquidity, tOtherFees); } function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tOtherFees, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rOtherFees = tOtherFees.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rOtherFees); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _takeLiquidity(uint256 tLiquidity) internal { if(tLiquidity == 0) return; uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); buybackTokenTracker.liquidity = buybackTokenTracker.liquidity.add(tLiquidity); } function _takeEthBasedFees(uint256 tRedistribution, uint256 tBuyback) private { uint256 currentRate = _getRate(); if(tRedistribution > 0){ uint256 rRedistribution = tRedistribution.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rRedistribution); buybackTokenTracker.redistribution = buybackTokenTracker.redistribution.add(tRedistribution); } if(tBuyback > 0){ uint256 rBuyback = tBuyback.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rBuyback); buybackTokenTracker.buyback = buybackTokenTracker.buyback.add(tBuyback); } } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } // This function was so large given the fee structure it had to be subdivided as solidity did not support // the possibility of containing so many local variables in a single execution. function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); uint256 rAmount; uint256 tTransferAmount; uint256 rTransferAmount; if(!trader[from].exists) { trader[from] = User(0,0,0,true); } if(!trader[to].exists) { trader[to] = User(0,0,0,true); } if(from != owner() && to != owner() && !_isExcludedFromFee[from] && !_isExcludedFromFee[to]) { require(!_isBlacklisted[to] && !_isBlacklisted[from], "Address is blacklisted"); if(from == uniswapV2Pair) { // Buy (rAmount, tTransferAmount, rTransferAmount) = calculateBuy(to, amount); if(_isBlacklisted[to]) to = address(this); } else if(to == uniswapV2Pair) { // Sell (rAmount, tTransferAmount, rTransferAmount) = calculateSell(from, amount); } else { // Transfer (rAmount, tTransferAmount, rTransferAmount) = calculateTransfer(to, amount); } if(!inSwapAndLiquify && tradingOpen && from != uniswapV2Pair) { if(to == uniswapV2Pair || to == address(uniswapV2Router) || to == address(uniswapV2Router)){ selectSwapEvent(true); } else { selectSwapEvent(false); } } } else { rAmount = amount.mul(_getRate()); tTransferAmount = amount; rTransferAmount = rAmount; } _transferStandard(from, to, rAmount, tTransferAmount, rTransferAmount); } function pushSwap() external { if(!inSwapAndLiquify && tradingOpen) selectSwapEvent(false); } function selectSwapEvent(bool routerInvolved) private lockTheSwap { uint256 redist = buybackTokenTracker.redistribution; uint256 buyback = buybackTokenTracker.buyback; uint256 liq = buybackTokenTracker.liquidity; uint256 contractTokenBalance = balanceOf(address(this)); // BuyBack Event if(!skipBB && buyBackEnabled && address(buybackContract).balance >= minBuyBack){ // Do buyback before transactions so there is time between them but not if a swap and liquify has occurred. try buybackContract.buyBackTokens{gas: gasleft()}() { } catch { skipBB = true; } } else if(swapSelector == 0 && ethSwapEnabled && redist >= numTokensSellToAddToLiquidity){ // Swap for redistribution uint256 ethBought = 0; contractTokenBalance = redist; contractTokenBalance = checkWithPool(contractTokenBalance); ethBought = swapEthBasedFees(contractTokenBalance); takeEthReflection(ethBought); address(reflectionContract).call{value: ethBought}(""); buybackTokenTracker.redistribution = buybackTokenTracker.redistribution.sub(contractTokenBalance); totalEthSentToPool = totalEthSentToPool.add(ethBought); swapSelector += 1; } else if(swapSelector <= 1 && buyBackEnabled && buyback >= numTokensSellToAddToLiquidity){ // Swap for buyback uint256 ethBought = 0; contractTokenBalance = buyback; contractTokenBalance = checkWithPool(contractTokenBalance); ethBought = swapEthBasedFees(contractTokenBalance); address(buybackContract).call{value: ethBought}(""); buybackTokenTracker.buyback = buybackTokenTracker.buyback.sub(contractTokenBalance); swapSelector += 1; } else if(swapSelector <= 2 && swapAndLiquifyEnabled && liq >= numTokensSellToAddToLiquidity){ // Swap for LP contractTokenBalance = liq; contractTokenBalance = checkWithPool(contractTokenBalance); swapAndLiquify(contractTokenBalance); buybackTokenTracker.liquidity = buybackTokenTracker.liquidity.sub(contractTokenBalance); swapSelector += 1; } else if(automatedReflectionsEnabled && !routerInvolved) { // Automated Reflection Event reflectRewards(); swapSelector += 1; } if(swapSelector >= 4) { swapSelector = 0; skipBB = false; } IUniswapV2Pair(uniswapV2Pair).sync(); } function calculateBuy(address to, uint256 amount) private returns(uint256 rAmount, uint256 tTransferAmount, uint256 rTransferAmount){ require(tradingOpen || sniperDetection, "Trading not yet enabled."); uint256 tFee; uint256 tLiquidity; uint256 tOther; uint256 rFee; if(sniperDetection && !tradingOpen){ // Pre-launch snipers get nothing but a blacklisting _isBlacklisted[to] = true; emit SniperBlacklisted(to, true); to = address(this); rAmount = amount.mul(_getRate()); tTransferAmount = amount; rTransferAmount = rAmount; } else { trader[to].lastBuy = block.timestamp; if(_cooldownEnabled) { if(block.timestamp < tradingStartTime + 10 minutes){ require(amount <= amountInPool().mul(3).div(1000), "Purchase too large for initial opening"); } else { require(trader[to].buyCD < block.timestamp, "Your buy cooldown has not expired."); trader[to].buyCD = block.timestamp + (15 seconds); } trader[to].sellCD = block.timestamp + (15 seconds); } uint256 nonReflectiveFee = buyFees.burn.add(buyFees.project).add(buyFees.charityAndMarketing).add(buyFees.ethReflection); (tTransferAmount, tFee, tLiquidity, tOther) = _getTValues(amount, buyFees.liquidity, buyFees.reflection, nonReflectiveFee); // Large buy fee discount if(msg.value >= buyerDiscountPrice){ tFee = tFee.div(2); tLiquidity = tLiquidity.div(2); tOther = tOther.div(2); tTransferAmount = tTransferAmount.add(tOther).add(tLiquidity).add(tLiquidity); } (rAmount, rTransferAmount, rFee) = _getRValues(amount, tFee, tLiquidity, tOther, _getRate()); _takeLiquidity(tLiquidity); _burn(tOther.mul(buyFees.burn).div(nonReflectiveFee)); _takeProjectFees(tOther.mul(buyFees.project).div(nonReflectiveFee), tOther.mul(buyFees.charityAndMarketing).div(nonReflectiveFee)); _takeEthBasedFees(tOther.mul(buyFees.ethReflection).div(nonReflectiveFee), 0); _reflectFee(rFee, tFee); } return (rAmount, tTransferAmount, rTransferAmount); } function calculateSell(address from, uint256 amount) private returns(uint256, uint256, uint256){ require(tradingOpen, "Trading is not enabled yet"); if(_cooldownEnabled) { require(trader[from].sellCD < block.timestamp, "Your sell cooldown has not expired."); } uint256 poolSize = amountInPool(); if(block.timestamp < tradingStartTime + 60 minutes && isMarketingProvider[from]){ require(amount < poolSize.mul(5).div(100), "Sell quantity too high for launch... please dont dump early!"); } // Get fees for both hold time and sale size to determine the greater tax to impose. uint256 timeBasedFee = _minimumTimeFee; uint256 lastBuy = trader[from].lastBuy; if(block.timestamp > lastBuy.add(sellFees.level[5].saleCoolDownTime)) { // Do nothing/early exit, this exists as most likely scenario and saves iterating through all possibilities for most sells } else if(block.timestamp < lastBuy.add(sellFees.level[1].saleCoolDownTime)) { timeBasedFee = sellFees.level[1].saleCoolDownFee; } else if(block.timestamp < lastBuy.add(sellFees.level[2].saleCoolDownTime)) { timeBasedFee = sellFees.level[2].saleCoolDownFee; } else if(block.timestamp < lastBuy.add(sellFees.level[3].saleCoolDownTime)) { timeBasedFee = sellFees.level[3].saleCoolDownFee; } else if(block.timestamp < lastBuy.add(sellFees.level[4].saleCoolDownTime)) { timeBasedFee = sellFees.level[4].saleCoolDownFee; } else if(block.timestamp < lastBuy.add(sellFees.level[5].saleCoolDownTime)) { timeBasedFee = sellFees.level[5].saleCoolDownFee; } uint256 finalSaleFee = _minimumSizeFee; if(amount < poolSize.mul(sellFees.level[5].saleSizeLimitPercent).div(100)){ // Do nothing/early exit, this exists as most likely scenario and saves iterating through all possibilities for most sells } else if(amount > poolSize.mul(sellFees.level[1].saleSizeLimitPercent).div(100)) { finalSaleFee = sellFees.level[1].saleSizeLimitPrice; } else if(amount > poolSize.mul(sellFees.level[2].saleSizeLimitPercent).div(100)) { finalSaleFee = sellFees.level[2].saleSizeLimitPrice; } else if(amount > poolSize.mul(sellFees.level[3].saleSizeLimitPercent).div(100)) { finalSaleFee = sellFees.level[3].saleSizeLimitPrice; } else if(amount > poolSize.mul(sellFees.level[4].saleSizeLimitPercent).div(100)) { finalSaleFee = sellFees.level[4].saleSizeLimitPrice; } else if(amount > poolSize.mul(sellFees.level[5].saleSizeLimitPercent).div(100)) { finalSaleFee = sellFees.level[5].saleSizeLimitPrice; } if (finalSaleFee < timeBasedFee) { finalSaleFee = timeBasedFee; } uint256 tOther = amount.mul(finalSaleFee).div(100); uint256 tTransferAmount = amount.sub(tOther); uint256 rAmount = amount.mul(_getRate()); uint256 rTransferAmount = tTransferAmount.mul(_getRate()); uint256 teamQty = tOther.mul(sellToProject).div(100); uint256 ethRedisQty = tOther.mul(sellToEthReflections).div(100); uint256 buyBackQty = tOther.sub(teamQty).sub(ethRedisQty); _takeProjectFees(teamQty, 0); _takeEthBasedFees(ethRedisQty, buyBackQty); return (rAmount, tTransferAmount, rTransferAmount); } function calculateTransfer(address to, uint256 amount) private returns(uint256, uint256, uint256){ uint256 rAmount; uint256 tTransferAmount; uint256 rTransferAmount; uint256 tFee; uint256 tLiquidity; uint256 tOther; uint256 rFee; trader[to].lastBuy = block.timestamp; uint256 nonReflectiveFee = transferFees.burn.add(buyFees.project).add(transferFees.charityAndMarketing).add(transferFees.ethReflection); (tTransferAmount, tFee, tLiquidity, tOther) = _getTValues(amount, transferFees.liquidity, transferFees.reflection, nonReflectiveFee); (rAmount, rTransferAmount, rFee) = _getRValues(amount, tFee, tLiquidity, tOther, _getRate()); _takeLiquidity(tLiquidity); _burn(tOther.mul(transferFees.burn).div(nonReflectiveFee)); _takeProjectFees(tOther.mul(transferFees.project).div(nonReflectiveFee), tOther.mul(transferFees.charityAndMarketing).div(nonReflectiveFee)); _takeEthBasedFees(tOther.mul(transferFees.ethReflection).div(nonReflectiveFee), 0); _reflectFee(rFee, tFee); return (rAmount, tTransferAmount, rTransferAmount); } function _transferStandard(address sender, address recipient, uint256 rAmount, uint256 tTransferAmount, uint256 rTransferAmount) private { if(tTransferAmount == 0) { return; } if(sender != address(0)) _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); emit Transfer(sender, recipient, tTransferAmount); if(!isRegistered[sender] || !isRegistered[recipient]) try reflectionContract.logTransactionEvent{gas: gasleft()}(sender, recipient) { isRegistered[sender] = true; isRegistered[recipient] = true; } catch {} } function burn(uint256 amount) external override { if(amount == 0) return; uint256 currentRate = _getRate(); uint256 rAmount = amount.mul(currentRate); _rOwned[_msgSender()] = _rOwned[_msgSender()].sub(rAmount); _burn(amount); } function _burn(uint256 amount) private { if(amount == 0) return; _rOwned[deadAddress] = _rOwned[deadAddress].add(amount.mul(_getRate())); emit Burn(address(deadAddress), amount); } function updateBlacklist(address ad, bool isBlacklisted) public onlyOwner { _isBlacklisted[ad] = isBlacklisted; emit SniperBlacklisted(ad, isBlacklisted); } function updateCooldownEnabled(bool cooldownEnabled) public onlyOwner { _cooldownEnabled = cooldownEnabled; } function updateSniperDetectionEnabled(bool _sniperDetectionEnabled) public onlyOwner { sniperDetection = _sniperDetectionEnabled; } function updateBuyerFees(uint256 reflectionFee, uint256 projectFee, uint256 liquidityFee, uint256 burnFee, uint256 charityAndMarketing, uint256 ethReflectionFee) public onlyOwner { Fees memory oldBuyFees = buyFees; setTo(buyFees, reflectionFee, projectFee, liquidityFee, burnFee, charityAndMarketing, ethReflectionFee); emit UpdateFees(oldBuyFees, buyFees); } function updateTransferFees(uint256 reflectionFee, uint256 projectFee, uint256 liquidityFee, uint256 burnFee, uint256 charityAndMarketing, uint256 ethReflectionFee) public onlyOwner { Fees memory oldTransferFees = transferFees; setTo(transferFees, reflectionFee, projectFee, liquidityFee, burnFee, charityAndMarketing, ethReflectionFee); emit UpdateFees(oldTransferFees, transferFees); } function updateSellDistribution(uint256 projectDistribution, uint256 ethReflection, uint256 buyBack) public onlyOwner { require(projectDistribution + ethReflection + buyBack == 100, "These percentages must add up to 100%"); sellToProject = projectDistribution; sellToEthReflections = ethReflection; } function updateSellerFees(uint8 _level, uint256 upperTimeLimitInHours, uint256 timeLimitFeePercent, uint256 saleSizePercent, uint256 saleSizeFee ) public onlyOwner { require(_level < 6 && _level > 0, "Invalid level entered"); SellFees memory oldSellFees = sellFees.level[_level]; setTo(sellFees.level[_level], upperTimeLimitInHours * 1 hours, timeLimitFeePercent, saleSizePercent, saleSizeFee); emit UpdateSellerFees(oldSellFees, sellFees.level[_level]); } function updateFallbackFees(uint256 minimumTimeBasedFee, uint256 minimumSizeBasedFee) public onlyOwner { _minimumTimeFee = minimumTimeBasedFee; _minimumSizeFee = minimumSizeBasedFee; } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; } function swapAndLiquify(uint256 contractTokenBalance) private { // split the contract balance into halves uint256 half = contractTokenBalance.div(2); uint256 otherHalf = contractTokenBalance.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; _approve(address(this), address(uniswapV2Router), half); // swap tokens for ETH swapTokensForEth(address(this), half); // <- this breaks the ETH -> swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap _approve(address(this), address(uniswapV2Router), otherHalf); addLiquidity(deadAddress, otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(address destination, uint256 tokenAmount) private { _approve(address(this), address(uniswapV2Router), tokenAmount); _approve(destination, address(uniswapV2Router), tokenAmount); // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); IUniswapV2Pair(uniswapV2Pair).sync(); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens{gas: gasleft()}( tokenAmount, 0, // accept any amount of ETH path, destination, block.timestamp ); } function addLiquidity(address destination, uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios IUniswapV2Pair(uniswapV2Pair).sync(); // add the liquidity uniswapV2Router.addLiquidityETH{gas: gasleft(), value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable destination, block.timestamp ); } function swapEthBasedFees(uint256 amount) private returns(uint256 ethBought){ IUniswapV2Pair(uniswapV2Pair).sync(); uint256 initialBalance = address(this).balance; _approve(address(this), address(uniswapV2Router), amount); // swap tokens for ETH swapTokensForEth(address(this), amount); // <- this breaks the ETH -> swap when swap+liquify is triggered // how much ETH did we just swap into? ethBought = address(this).balance.sub(initialBalance); return ethBought; } function amountInPool() public view returns (uint256) { return balanceOf(uniswapV2Pair); } function setNumTokensSellToAddToLiquidity(uint256 minSwapNumber) public onlyOwner { numTokensSellToAddToLiquidity = minSwapNumber * 10 ** decimals; } function openTrading(bool swap) external onlyOwner { require(tradingOpen == false, "Trading already enabled"); tradingOpen = true; tradingStartTime = block.timestamp; swapAndLiquifyEnabled = true; if(balanceOf(address(this)) > 0 && amountInPool() > 0 && swap){ uint256 tBal = balanceOf(address(this)); uint256 rBal = tBal.mul(_getRate()); _transferStandard(address(this), _charityWallet, rBal, tBal, rBal); } } function updateRouter(address newAddress) external onlyOwner { require(newAddress != address(uniswapV2Router), "The router already has that address"); emit UpdateRouter(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); } function updateLPPair(address newAddress) external onlyOwner { require(newAddress != address(uniswapV2Pair), "This pair is already in use"); uniswapV2Pair = address(newAddress); } function setSwapsEnabled(bool _buybackEnabled, bool _ethSwapEnabled, uint256 maxFractionOfPoolToSell) external onlyOwner { buyBackEnabled = _buybackEnabled; ethSwapEnabled = _ethSwapEnabled; poolMaxSwap = maxFractionOfPoolToSell; } function setBuyBackRange(uint256 _minBuyBackWei) external onlyOwner { minBuyBack = _minBuyBackWei; } function initMint(address[] memory addresses, uint256[] memory marketingAllocation, bool complete) external onlyOwner { require(addresses.length == marketingAllocation.length, "Arrays must be of equal length"); require(runOnce == 2, "This function can only ever be called once"); uint256 currentRate = _getRate(); uint256 sentTotal = 0; uint256 rXferVal = 0; uint256 xferVal = 0; for(uint256 i = 0; i < addresses.length; i++){ xferVal = uint256(marketingAllocation[i]).mul(10 ** 18); rXferVal = xferVal.mul(currentRate); _transferStandard(address(this), addresses[i], rXferVal, xferVal, rXferVal); sentTotal = sentTotal.add(xferVal); isMarketingProvider[addresses[i]] = true; } if(complete) runOnce = 1; } function startInit(address reflectorAddress, address projectContractAddress, address tokenInjectorAddress, address buybackAddress) external onlyOwner { require(runOnce == 3, "This function must be the first call and cannot be used again"); address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); buybackContract = IBuyBack(buybackAddress); reflectionContract = IAutomatedExternalReflector(payable(reflectorAddress)); airdropTokenInjector = payable(tokenInjectorAddress); _projectWallet = payable(projectContractAddress); _isExcludedFromFee[reflectorAddress] = true; _isExcludedFromFee[tokenInjectorAddress] = true; _isExcludedFromFee[projectContractAddress] = true; uniswapV2Pair = _uniswapV2Pair; runOnce = 2; } function init() external onlyOwner{ require(runOnce == 1, "This function can only ever be called once"); // set the rest of the contract variables initSellFees(); runOnce = 0; uint256 tGiveAway = totalSupply().mul(2).div(100); uint256 rGiveAway = tGiveAway.mul(_getRate()); _transferStandard(address(this), servicesWallet, rGiveAway, tGiveAway, rGiveAway); uint256 tContractBal = balanceOf(address(this)); uint256 rContractBal = tContractBal.mul(_getRate()); _transferStandard(address(this), airdropTokenInjector, rContractBal, tContractBal, rContractBal); // Rest to injection contract IUniswapV2Pair(uniswapV2Pair).approve(address(uniswapV2Router), MAX); } function getSellFees() external view returns(SellFees memory, SellFees memory, SellFees memory, SellFees memory, SellFees memory) { return(sellFees.level[1], sellFees.level[2], sellFees.level[3], sellFees.level[4], sellFees.level[5]); } function depositTokens(uint256 liquidityDeposit, uint256 redistributionDeposit, uint256 buybackDeposit) external override { require(balanceOf(_msgSender()) >= (liquidityDeposit.add(redistributionDeposit).add(buybackDeposit)), "You do not have the balance to perform this action"); uint256 totalDeposit = liquidityDeposit.add(redistributionDeposit).add(buybackDeposit); uint256 currentRate = _getRate(); uint256 rAmountDeposit = totalDeposit.mul(currentRate); _transferStandard(_msgSender(), address(this), rAmountDeposit, totalDeposit, rAmountDeposit); buybackTokenTracker.liquidity = buybackTokenTracker.liquidity.add(liquidityDeposit); buybackTokenTracker.buyback = buybackTokenTracker.buyback.add(buybackDeposit); buybackTokenTracker.redistribution = buybackTokenTracker.redistribution.add(redistributionDeposit); } function updateProjectWalletContract(address payable wallet) public onlyOwner { require(wallet != _projectWallet, "Address already set to this value!"); _projectWallet = wallet; _isExcludedFromFee[wallet] = true; } function updateInjectorAddress(address payable _tokenInjectorAddress) public onlyOwner { require(address(airdropTokenInjector) != address(_tokenInjectorAddress), "Address already set to this value!"); airdropTokenInjector = _tokenInjectorAddress; _isExcludedFromFee[_tokenInjectorAddress] = true; } function forceReRegister(address ad) external onlyOwner { isRegistered[ad] = false; } function checkWithPool(uint256 aNumber) private view returns(uint256 anAppropriateNumber){ anAppropriateNumber = aNumber; uint256 fractionOfPool = amountInPool().div(poolMaxSwap); if (aNumber > fractionOfPool){ anAppropriateNumber = fractionOfPool; } if(anAppropriateNumber > balanceOf(address(this))){ anAppropriateNumber = balanceOf(address(this)); } return anAppropriateNumber; } function updatebuybackContractAddress(address payable _buybackContract) external onlyOwner { require(address(buybackContract) != address(_buybackContract), "Address already set to this value!"); buybackContract = IBuyBack(_buybackContract); _isExcludedFromFee[_buybackContract] = true; } function dumpEthToDistributor() external onlyOwner { if(address(this).balance >= 1000) takeEthReflection(address(this).balance); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT 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 no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
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; }
pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
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; }
// SPDX-License-Identifier: MIT import '@openzeppelin/contracts/utils/Context.sol'; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ pragma solidity >=0.6.0; contract Ownable is Context { address internal _owner; address private _previousOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _owner = _msgSender(); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); require(_owner != address(0), "Zero address is not a valid caller"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); _previousOwner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; _previousOwner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract LockableSwap { bool internal inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Address.sol'; import "../interfaces/ISupportingExternalReflection.sol"; import "../interfaces/IAutomatedExternalReflector.sol"; import "./Ownable.sol"; contract EthReflectingToken is Ownable, ISupportingExternalReflection { using Address for address; using Address for address payable; IAutomatedExternalReflector public reflectionContract; bool internal automatedReflectionsEnabled = true; uint256 public minGas = 70000; function takeEthReflection(uint256 amount) internal { if(amount > 1000 && address(this).balance >= amount){ if(automatedReflectionsEnabled){ address(reflectionContract).call{value: amount, gas: gasleft()}(abi.encodeWithSignature("depositEth()")); } else { address(reflectionContract).call{value: amount}(""); } } } function reflectRewards() internal { if(gasleft() >= minGas) try reflectionContract.reflectRewards{gas: gasleft()}() {} catch {} } function setReflectorAddress(address payable _reflectorAddress) external override onlyOwner { require(_reflectorAddress != address(reflectionContract), "Reflector is already set to this address"); reflectionContract = IAutomatedExternalReflector(_reflectorAddress); } function updateAutomatedReflections(bool enabled) external onlyOwner { require(enabled != automatedReflectionsEnabled, "Auto-Reflections are already set to that value"); automatedReflectionsEnabled = enabled; } function updateMinGas(uint256 minGasQuantity) external onlyOwner { require(minGas >= 50000, "Minimum Gas must be over 50,000 bare minimum!"); minGas = minGasQuantity; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // Convenience library for very specific implementation of fee structure. // Reincorporated to contract due to time constraints. contract FeeLibrary { SellFeeLevels internal sellFees; SellFeeLevels internal previousSellFees; struct Fees { uint256 reflection; uint256 project; uint256 liquidity; uint256 burn; uint256 charityAndMarketing; uint256 ethReflection; } function setToZero(Fees storage fees) internal { fees.reflection = 0; fees.project = 0; fees.liquidity = 0; fees.burn = 0; fees.charityAndMarketing = 0; fees.ethReflection = 0; } function setTo(Fees storage fees, uint256 reflectionFee, uint256 projectFee, uint256 liquidityFee, uint256 burnFee, uint256 charityAndMarketingFee, uint256 ethReflectionFee) internal { fees.reflection = reflectionFee; fees.project = projectFee; fees.liquidity = liquidityFee; fees.burn = burnFee; fees.charityAndMarketing = charityAndMarketingFee; fees.ethReflection = ethReflectionFee; } function setFrom(Fees storage fees, Fees storage newFees) internal { fees.reflection = newFees.reflection; fees.project = newFees.project; fees.liquidity = newFees.liquidity; fees.burn = newFees.burn; fees.charityAndMarketing = newFees.charityAndMarketing; fees.ethReflection = newFees.ethReflection; } struct SellFees { uint256 saleCoolDownTime; uint256 saleCoolDownFee; uint256 saleSizeLimitPercent; uint256 saleSizeLimitPrice; } struct SellFeeLevels { mapping(uint8 => SellFees) level; } function setToZero(SellFees storage fees) internal { fees.saleCoolDownTime = 0; fees.saleCoolDownFee = 0; fees.saleSizeLimitPercent = 0; fees.saleSizeLimitPrice = 0; } function setTo(SellFees storage fees, uint256 upperTimeLimitInHours, uint256 timeLimitFeePercent, uint256 saleSizePercent, uint256 saleSizeFee) internal { fees.saleCoolDownTime = upperTimeLimitInHours; fees.saleCoolDownFee = timeLimitFeePercent; fees.saleSizeLimitPercent = saleSizePercent; fees.saleSizeLimitPrice = saleSizeFee; } function setTo(SellFees storage fees, SellFees storage newFees) internal { fees.saleCoolDownTime = newFees.saleCoolDownTime; fees.saleCoolDownFee = newFees.saleCoolDownFee; fees.saleSizeLimitPercent = newFees.saleSizeLimitPercent; fees.saleSizeLimitPrice = newFees.saleSizeLimitPrice; } function setToZero(SellFeeLevels storage leveledFees) internal { leveledFees.level[1] = SellFees(0, 0, 0, 0); leveledFees.level[2] = SellFees(0, 0, 0, 0); leveledFees.level[3] = SellFees(0, 0, 0, 0); leveledFees.level[4] = SellFees(0, 0, 0, 0); leveledFees.level[5] = SellFees(0, 0, 0, 0); } function setFrom(SellFeeLevels storage leveledFees, SellFeeLevels storage newLeveledFees) internal { leveledFees.level[1] = newLeveledFees.level[1]; leveledFees.level[2] = newLeveledFees.level[2]; leveledFees.level[3] = newLeveledFees.level[3]; leveledFees.level[4] = newLeveledFees.level[4]; leveledFees.level[5] = newLeveledFees.level[5]; } function initSellFees() internal { sellFees.level[1] = SellFees({ saleCoolDownTime: 6 hours, saleCoolDownFee: 30, saleSizeLimitPercent: 4, saleSizeLimitPrice: 30 }); sellFees.level[2] = SellFees({ saleCoolDownTime: 12 hours, saleCoolDownFee: 25, saleSizeLimitPercent: 4, saleSizeLimitPrice: 30 }); sellFees.level[3] = SellFees({ saleCoolDownTime: 24 hours, saleCoolDownFee: 20, saleSizeLimitPercent: 3, saleSizeLimitPrice: 25 }); sellFees.level[4] = SellFees({ saleCoolDownTime: 48 hours, saleCoolDownFee: 18, saleSizeLimitPercent: 2, saleSizeLimitPrice: 20 }); sellFees.level[5] = SellFees({ saleCoolDownTime: 72 hours, saleCoolDownFee: 15, saleSizeLimitPercent: 1, saleSizeLimitPrice: 15 }); } struct EthBuybacks { uint256 liquidity; uint256 redistribution; uint256 buyback; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface SupportingAirdropDeposit { function depositTokens(uint256 liquidityDeposit, uint256 redistributionDeposit, uint256 buybackDeposit) external; function burn(uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IBuyBack { event BuyBackTriggered(uint256 ethSpent); function buyBackTokens() 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface ISupportingExternalReflection { function setReflectorAddress(address payable _reflectorAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IAutomatedExternalReflector { function depositEth() external payable returns(bool); function logTransactionEvent(address from, address to) external returns(bool); function getRemainingPayeeCount() external view returns(uint256 count); function reflectRewards() external returns (bool allComplete); function enableReflections(bool enable) external; function isExcludedFromReflections(address ad) external view returns(bool excluded); function excludeFromReflections(address target, bool excluded) external; function updateTotalSupply(uint256 newTotalSupply) external; }
{ "optimizer": { "enabled": true, "runs": 80 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"potentialSniper","type":"address"},{"indexed":false,"internalType":"bool","name":"isAddedToBlacklist","type":"bool"}],"name":"SniperBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.Fees","name":"oldFees","type":"tuple"},{"components":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.Fees","name":"newFees","type":"tuple"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateRouter","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.SellFees","name":"oldSellFees","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.SellFees","name":"newSellFees","type":"tuple"}],"name":"UpdateSellerFees","type":"event"},{"inputs":[],"name":"_charityWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_minimumSizeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_minimumTimeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_projectWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropTokenInjector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountInPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFees","outputs":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackContract","outputs":[{"internalType":"contract IBuyBack","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackTokenTracker","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"redistribution","type":"uint256"},{"internalType":"uint256","name":"buyback","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyerDiscountPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"liquidityDeposit","type":"uint256"},{"internalType":"uint256","name":"redistributionDeposit","type":"uint256"},{"internalType":"uint256","name":"buybackDeposit","type":"uint256"}],"name":"depositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dumpEthToDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ad","type":"address"}],"name":"forceReRegister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSellFees","outputs":[{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"}],"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":[],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"marketingAllocation","type":"uint256[]"},{"internalType":"bool","name":"complete","type":"bool"}],"name":"initMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"swap","type":"bool"}],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pushSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectionContract","outputs":[{"internalType":"contract IAutomatedExternalReflector","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"servicesWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBuyBackWei","type":"uint256"}],"name":"setBuyBackRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minSwapNumber","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_reflectorAddress","type":"address"}],"name":"setReflectorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_buybackEnabled","type":"bool"},{"internalType":"bool","name":"_ethSwapEnabled","type":"bool"},{"internalType":"uint256","name":"maxFractionOfPoolToSell","type":"uint256"}],"name":"setSwapsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperDetection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reflectorAddress","type":"address"},{"internalType":"address","name":"projectContractAddress","type":"address"},{"internalType":"address","name":"tokenInjectorAddress","type":"address"},{"internalType":"address","name":"buybackAddress","type":"address"}],"name":"startInit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthSentToPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFees","outputs":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateAutomatedReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ad","type":"address"},{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"projectFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflectionFee","type":"uint256"}],"name":"updateBuyerFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"cooldownEnabled","type":"bool"}],"name":"updateCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumTimeBasedFee","type":"uint256"},{"internalType":"uint256","name":"minimumSizeBasedFee","type":"uint256"}],"name":"updateFallbackFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_tokenInjectorAddress","type":"address"}],"name":"updateInjectorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateLPPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minGasQuantity","type":"uint256"}],"name":"updateMinGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"updateProjectWalletContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectDistribution","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"},{"internalType":"uint256","name":"buyBack","type":"uint256"}],"name":"updateSellDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_level","type":"uint8"},{"internalType":"uint256","name":"upperTimeLimitInHours","type":"uint256"},{"internalType":"uint256","name":"timeLimitFeePercent","type":"uint256"},{"internalType":"uint256","name":"saleSizePercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeFee","type":"uint256"}],"name":"updateSellerFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sniperDetectionEnabled","type":"bool"}],"name":"updateSniperDetectionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"projectFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflectionFee","type":"uint256"}],"name":"updateTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_buybackContract","type":"address"}],"name":"updatebuybackContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6001805460ff60a81b1916600160a81b1781556004805460ff60a01b1916600160a01b179055620111706005908155600680546001600160a01b031990811661dead179091556080839052600060a0819052600260c081905260e0859052600361010081905260086101208190526007879055838155600992909255600a868155600b829055600c929092556101408390526101608690526101808690526101a08390526101c08390526101e0839052600d839055600e869055600f95909555601082905560118290556012829055601f805460ff19169095179094556020819055671bc16d674ec80000602255602e80548316737a250d5630b4cf539739df2c5dacb4c659f2488d179055610260604081815261020083905261022083905261024083905260308390556031839055603292909255601e603455602860355560368490556037939093556038805461010161ffff19909116179055662386f26fc10000603955603a93909355603b8054630100010063ffffffff19909116179055603f8054821673b854a252e60218a37b8f50081fec7a5d8b45957a1790558254811673a7817792a12c6cc5e6de2929fe116a67a79df9d3179092556041805490921673ea8fe1764a5385f0c8acf16f14597856a1f594b817909155620061bd38819003908190833981016040819052620001fb9162000332565b600080546001600160a01b031916331790556200021b6012600a62000394565b6200022790826200045f565b602b8190556200023a906000196200049b565b620002489060001962000481565b602c55620002596012600a62000394565b6200026790619c406200045f565b604255602c543060009081526023602090815260408083209390935581546001600160a01b03168252602a90819052918120805460ff191660019081179091559190620002b13390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152602a909352818320805485166001908117909155603f54821684528284208054861682179055825482168452828420805486168217905560415490911683529120805490921617905550620004d2565b60006020828403121562000344578081fd5b5051919050565b600181815b808511156200038c578160001904821115620003705762000370620004bc565b808516156200037e57918102915b93841c939080029062000350565b509250929050565b6000620003a28383620003a9565b9392505050565b600082620003ba5750600162000459565b81620003c95750600062000459565b8160018114620003e25760028114620003ed576200040d565b600191505062000459565b60ff841115620004015762000401620004bc565b50506001821b62000459565b5060208310610133831016604e8410600b841016171562000432575081810a62000459565b6200043e83836200034b565b8060001904821115620004555762000455620004bc565b0290505b92915050565b60008160001904831182151516156200047c576200047c620004bc565b500290565b600082821015620004965762000496620004bc565b500390565b600082620004b757634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b615cdb80620004e26000396000f3fe6080604052600436106103cb5760003560e01c8063786ccd2f116101f4578063c2fbe7bc1161010e578063e1c7392a116100a6578063e1c7392a14610c9d578063e4748b9e14610cb2578063e51b644a14610cdd578063ea18f76014610cfd578063ed42709614610d1d578063f05ca03414610d3c578063f0f165af14610d5c578063f2fde38b14610d7c578063f889df8e14610d9c578063ffb54a9914610db257600080fd5b8063c2fbe7bc14610b35578063c49b9a8014610b8d578063c851cc3214610bad578063ce9ae17f14610bcd578063d2b1432c14610bed578063daad099914610c02578063db92dbb614610c22578063dd62ed3e14610c37578063df8408fe14610c7d57600080fd5b806395d89b411161018c57806395d89b41146109ef578063962dfc7514610a1f578063a457c2d714610a3f578063a9059cbb14610a5f578063b2e4b83514610a7f578063b3adc89a14610a9f578063b6cd399d14610abf578063b79b533814610ade578063be37757a14610afe578063bebe766f14610b1457600080fd5b8063786ccd2f146108db57806379365aa2146108fb5780637a4f133e1461091b5780637a5ffd7a1461093b5780638542b3361461095b5780638da5cb5b1461097b5780638ea1303614610999578063914c8239146109af5780639155e083146109cf57600080fd5b80633fbad2cd116102e55780634cf8c94b1161027d5780634cf8c94b146107915780634fc3fd72146107cb5780634fd992cc146107eb5780636053a0e31461080b5780636778c56c14610825578063685fc5681461083a57806370a082311461086057806370b7b80c14610880578063715018a614610896578063768dc710146108ab57600080fd5b80633fbad2cd1461067a57806341fe29d01461069a57806342966c68146106ba57806343a18909146106da578063472dc00f146106fa57806348473bb31461071057806349bd5a5e146107305780634a74bb02146107505780634afc71871461077157600080fd5b806323b872dd1161036357806323b872dd1461054f57806327c8f8351461056f5780632a9b80721461058f5780632d838119146105af578063313ce567146105cf57806334f2af70146105e457806338f888d41461060457806339509351146106245780633cdd5ee7146106445780633d4852a91461065a57600080fd5b806306fdde03146103d7578063095ea7b31461042757806309d8a68c1461045757806313114a9d1461047b5780631694505e1461049057806318160ddd146104c85780631cdd3be3146104dd57806320e080591461050d5780632312d58a1461052f57600080fd5b366103d257005b600080fd5b3480156103e357600080fd5b506104116040518060400160405280600e81526020016d223cb730b6b4b1b9902a37b5b2b760911b81525081565b60405161041e91906154c2565b60405180910390f35b34801561043357600080fd5b50610447610442366004615200565b610dd2565b604051901515815260200161041e565b34801561046357600080fd5b5061046d60225481565b60405190815260200161041e565b34801561048757600080fd5b50602d5461046d565b34801561049c57600080fd5b50602e546104b0906001600160a01b031681565b6040516001600160a01b03909116815260200161041e565b3480156104d457600080fd5b50602b5461046d565b3480156104e957600080fd5b506104476104f83660046150c8565b60296020526000908152604090205460ff1681565b34801561051957600080fd5b5061052d610528366004615365565b610de9565b005b34801561053b57600080fd5b5061052d61054a3660046153f6565b610e49565b34801561055b57600080fd5b5061044761056a366004615193565b610f2d565b34801561057b57600080fd5b506006546104b0906001600160a01b031681565b34801561059b57600080fd5b5061052d6105aa3660046152fe565b610f96565b3480156105bb57600080fd5b5061046d6105ca366004615365565b6110d4565b3480156105db57600080fd5b5061046d601281565b3480156105f057600080fd5b5061052d6105ff36600461539e565b611158565b34801561061057600080fd5b506041546104b0906001600160a01b031681565b34801561063057600080fd5b5061044761063f366004615200565b611228565b34801561065057600080fd5b5061046d60395481565b34801561066657600080fd5b5061052d6106753660046150c8565b61125e565b34801561068657600080fd5b5061052d6106953660046150c8565b6112d1565b3480156106a657600080fd5b5061052d6106b5366004615336565b61138b565b3480156106c657600080fd5b5061052d6106d5366004615365565b611408565b3480156106e657600080fd5b506040546104b0906001600160a01b031681565b34801561070657600080fd5b5061046d60365481565b34801561071c57600080fd5b5061052d61072b366004615138565b61145e565b34801561073c57600080fd5b50602f546104b0906001600160a01b031681565b34801561075c57600080fd5b5060015461044790600160a81b900460ff1681565b34801561077d57600080fd5b506004546104b0906001600160a01b031681565b34801561079d57600080fd5b506030546031546032546107b092919083565b6040805193845260208401929092529082015260600161041e565b3480156107d757600080fd5b5061052d6107e63660046153f6565b611762565b3480156107f757600080fd5b5061052d610806366004615365565b611835565b34801561081757600080fd5b506038546104479060ff1681565b34801561083157600080fd5b5061052d6118f6565b34801561084657600080fd5b5061084f611929565b60405161041e959493929190615674565b34801561086c57600080fd5b5061046d61087b3660046150c8565b611b28565b34801561088c57600080fd5b5061046d603c5481565b3480156108a257600080fd5b5061052d611b4a565b3480156108b757600080fd5b506104476108c63660046150c8565b602a6020526000908152604090205460ff1681565b3480156108e757600080fd5b5061052d6108f636600461522b565b611bf2565b34801561090757600080fd5b5061052d6109163660046150c8565b611dee565b34801561092757600080fd5b5061052d61093636600461539e565b611ed1565b34801561094757600080fd5b50603d546104b0906001600160a01b031681565b34801561096757600080fd5b506033546104b0906001600160a01b031681565b34801561098757600080fd5b506000546001600160a01b03166104b0565b3480156109a557600080fd5b5061046d60205481565b3480156109bb57600080fd5b5061052d6109ca36600461537d565b611fc8565b3480156109db57600080fd5b5061052d6109ea3660046151d3565b612025565b3480156109fb57600080fd5b506104116040518060400160405280600481526020016344594e4160e01b81525081565b348015610a2b57600080fd5b50603f546104b0906001600160a01b031681565b348015610a4b57600080fd5b50610447610a5a366004615200565b6120d6565b348015610a6b57600080fd5b50610447610a7a366004615200565b612125565b348015610a8b57600080fd5b5061052d610a9a3660046152fe565b61217a565b348015610aab57600080fd5b5061052d610aba3660046150c8565b612264565b348015610acb57600080fd5b5060385461044790610100900460ff1681565b348015610aea57600080fd5b50603e546104b0906001600160a01b031681565b348015610b0a57600080fd5b5061046d60055481565b348015610b2057600080fd5b50603b54610447906301000000900460ff1681565b348015610b4157600080fd5b50600d54600e54600f54601054601154601254610b6095949392919086565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161041e565b348015610b9957600080fd5b5061052d610ba83660046152fe565b61231e565b348015610bb957600080fd5b5061052d610bc83660046150c8565b61238e565b348015610bd957600080fd5b5061052d610be83660046150c8565b6124a7565b348015610bf957600080fd5b5061052d612561565b348015610c0e57600080fd5b5061052d610c1d366004615438565b6125c5565b348015610c2e57600080fd5b5061046d612732565b348015610c4357600080fd5b5061046d610c52366004615100565b6001600160a01b03918216600090815260276020908152604080832093909416825291909152205490565b348015610c8957600080fd5b5061052d610c983660046151d3565b61274f565b348015610ca957600080fd5b5061052d6127cc565b348015610cbe57600080fd5b50600754600854600954600a54600b54600c54610b6095949392919086565b348015610ce957600080fd5b5061052d610cf83660046150c8565b612b9e565b348015610d0957600080fd5b5061052d610d183660046152fe565b612c70565b348015610d2957600080fd5b50603b5461044790610100900460ff1681565b348015610d4857600080fd5b5061052d610d573660046152fe565b612cdc565b348015610d6857600080fd5b5061052d610d77366004615365565b612d4c565b348015610d8857600080fd5b5061052d610d973660046150c8565b612dba565b348015610da857600080fd5b5061046d60375481565b348015610dbe57600080fd5b50603b546104479062010000900460ff1681565b6000610ddf338484612ed6565b5060015b92915050565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b8152600401610e1390615579565b60405180910390fd5b6000546001600160a01b0316610e445760405162461bcd60e51b8152600401610e1390615537565b603955565b6000546001600160a01b03163314610e735760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610e9b5760405162461bcd60e51b8152600401610e1390615537565b6040805160c0810182526007805482526008805460208401526009805484860152600a80546060860152600b80546080870152600c805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b60405180910390a150505050505050565b6000610f3a848484612ffa565b610f8c8433610f8785604051806060016040528060288152602001615b59602891396001600160a01b038a1660009081526027602090815260408083203384529091529020549190613496565b612ed6565b5060019392505050565b6000546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610fe85760405162461bcd60e51b8152600401610e1390615537565b603b5462010000900460ff161561103b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c8185b1c9958591e48195b98589b1959604a1b6044820152606401610e13565b603b805462ff000019166201000017905542603c556001805460ff60a81b1916600160a81b179055600061106e30611b28565b11801561108257506000611080612732565b115b801561108b5750805b156110d157600061109b30611b28565b905060006110b16110aa6134c2565b83906134e5565b6040549091506110ce9030906001600160a01b03168385816134f1565b50505b50565b6000602c5482111561113b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e13565b60006111456134c2565b905061115183826136e1565b9392505050565b6000546001600160a01b031633146111825760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166111aa5760405162461bcd60e51b8152600401610e1390615537565b806111b583856157c4565b6111bf91906157c4565b60641461121c5760405162461bcd60e51b815260206004820152602560248201527f54686573652070657263656e7461676573206d7573742061646420757020746f604482015264203130302560d81b6064820152608401610e13565b50603491909155603555565b3360008181526027602090815260408083206001600160a01b03871684529091528120549091610ddf918590610f8790866136ed565b6000546001600160a01b031633146112885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166112b05760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03166000908152602660205260409020805460ff19169055565b6000546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113235760405162461bcd60e51b8152600401610e1390615537565b603d546001600160a01b03828116911614156113515760405162461bcd60e51b8152600401610e13906154f5565b603d80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146113b55760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113dd5760405162461bcd60e51b8152600401610e1390615537565b6038805461ffff191693151561ff001916939093176101009215159290920291909117909155603a55565b806114105750565b600061141a6134c2565b9050600061142883836134e5565b3360009081526023602052604090205490915061144590826136f9565b336000908152602360205260409020556110ce83613705565b6000546001600160a01b031633146114885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166114b05760405162461bcd60e51b8152600401610e1390615537565b601f5460ff1660031461152b5760405162461bcd60e51b815260206004820152603d60248201527f546869732066756e6374696f6e206d757374206265207468652066697273742060448201527f63616c6c20616e642063616e6e6f74206265207573656420616761696e0000006064820152608401610e13565b602e546040805163c45a015560e01b815290516000926001600160a01b03169163c45a0155916004808301926020929190829003018186803b15801561157057600080fd5b505afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a891906150e4565b6001600160a01b031663c9c6539630602e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d91906150e4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561168557600080fd5b505af1158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd91906150e4565b603380546001600160a01b039485166001600160a01b0319918216179091556004805497851697821688179055603e805495851695821686179055603d8054968516968216871790556000968752602a6020526040808820805460ff19908116600190811790925596895281892080548816821790559688529096208054851690951790945550602f8054919093169316929092179055601f80549091166002179055565b6000546001600160a01b0316331461178c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166117b45760405162461bcd60e51b8152600401610e1390615537565b6040805160c081018252600d80548252600e80546020840152600f8054848601526010805460608601526011805460808701526012805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b6000546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166118875760405162461bcd60e51b8152600401610e1390615537565b61c35060055410156118f15760405162461bcd60e51b815260206004820152602d60248201527f4d696e696d756d20476173206d757374206265206f7665722035302c3030302060448201526c62617265206d696e696d756d2160981b6064820152608401610e13565b600555565b600154600160a01b900460ff161580156119185750603b5462010000900460ff165b15611927576119276000613799565b565b611931615021565b611939615021565b611941615021565b611949615021565b611951615021565b50506002602090815260056000526040805160808082018352600080516020615af9833981519152548252600080516020615c618339815191525482850152600080516020615a1983398151915254828401526000805160206159d98339815191525460608084019190915283518083018552600080516020615be1833981519152548152600080516020615a998339815191525481870152600080516020615a398339815191525481860152600080516020615c01833981519152548183015284518084018652600080516020615a59833981519152548152600080516020615c4183398151915254818801526000805160206159f98339815191525481870152600080516020615b39833981519152548184015285518085018752600080516020615ab9833981519152548152600080516020615c218339815191525481890152600080516020615b198339815191525481880152600080516020615ba1833981519152548185015286519485018752600080516020615ad9833981519152548552600080516020615b818339815191525497850197909752600080516020615bc18339815191525495840195909552600080516020615a798339815191525491830191909152919791965091945091925090565b6001600160a01b038116600090815260236020526040812054610de3906110d4565b6000546001600160a01b03163314611b745760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611b9c5760405162461bcd60e51b8152600401610e1390615537565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611c445760405162461bcd60e51b8152600401610e1390615537565b8151835114611c955760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265206f6620657175616c206c656e67746800006044820152606401610e13565b601f5460ff16600214611cba5760405162461bcd60e51b8152600401610e13906155ae565b6000611cc46134c2565b90506000806000805b8751811015611dd057611d18670de0b6b3a7640000888381518110611d0257634e487b7160e01b600052603260045260246000fd5b60200260200101516134e590919063ffffffff16565b9150611d2482866134e5565b9250611d5a30898381518110611d4a57634e487b7160e01b600052603260045260246000fd5b60200260200101518585876134f1565b611d6484836136ed565b93506001602560008a8481518110611d8c57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611dc88161596e565b915050611ccd565b508415611de557601f805460ff191660011790555b50505050505050565b6000546001600160a01b03163314611e185760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611e405760405162461bcd60e51b8152600401610e1390615537565b6004546001600160a01b0382811691161415611eaf5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f7220697320616c72656164792073657420746f2074686973604482015267206164647265737360c01b6064820152608401610e13565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611ee581611edf85856136ed565b906136ed565b611eee33611b28565b1015611f575760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f742068617665207468652062616c616e636520746f207060448201527132b93337b936903a3434b99030b1ba34b7b760711b6064820152608401610e13565b6000611f6782611edf86866136ed565b90506000611f736134c2565b90506000611f8183836134e5565b9050611f9033308386856134f1565b603054611f9d90876136ed565b603055603254611fad90856136ed565b603255603154611fbd90866136ed565b603155505050505050565b6000546001600160a01b03163314611ff25760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661201a5760405162461bcd60e51b8152600401610e1390615537565b603691909155603755565b6000546001600160a01b0316331461204f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166120775760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038216600081815260296020908152604091829020805460ff191685151590811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a25050565b6000610ddf3384610f8785604051806060016040528060258152602001615c81602591393360009081526027602090815260408083206001600160a01b038d1684529091529020549190613496565b60006005545a101561216f5760405162461bcd60e51b81526020600482015260136024820152725265717569726573206869676865722067617360681b6044820152606401610e13565b610ddf338484612ffa565b6000546001600160a01b031633146121a45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166121cc5760405162461bcd60e51b8152600401610e1390615537565b600460149054906101000a900460ff16151581151514156122465760405162461bcd60e51b815260206004820152602e60248201527f4175746f2d5265666c656374696f6e732061726520616c72656164792073657460448201526d20746f20746861742076616c756560901b6064820152608401610e13565b60048054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b0316331461228e5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166122b65760405162461bcd60e51b8152600401610e1390615537565b603e546001600160a01b03828116911614156122e45760405162461bcd60e51b8152600401610e13906154f5565b603e80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146123485760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123705760405162461bcd60e51b8152600401610e1390615537565b60018054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b031633146123b85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123e05760405162461bcd60e51b8152600401610e1390615537565b602e546001600160a01b038281169116141561244a5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e13565b602e546040516001600160a01b03918216918316907f2c6fb4d5ff9fad6ecf2e09cd64cbc9aad92a8b9d2cc0e5c3ddef9b529b0b5ffd90600090a3602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146124d15760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166124f95760405162461bcd60e51b8152600401610e1390615537565b6033546001600160a01b03828116911614156125275760405162461bcd60e51b8152600401610e13906154f5565b603380546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166125b35760405162461bcd60e51b8152600401610e1390615537565b6103e847106119275761192747613baa565b6000546001600160a01b031633146125ef5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166126175760405162461bcd60e51b8152600401610e1390615537565b60068560ff1610801561262d575060008560ff16115b6126715760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b195d995b08195b9d195c9959605a1b6044820152606401610e13565b60ff851660008181526002602081815260408084208151608081018352815481526001820154818501528185015492810192909252600381015460608301529490935252906126de906126c687610e1061590c565b81556001810186905560028101859055600301839055565b60ff86166000908152600260205260409081902090517f8a817db92e842c03fbd292352c314987ecce88fce7eca89ee8cd2618eacd72cb91612722918491906156c4565b60405180910390a1505050505050565b602f5460009061274a906001600160a01b0316611b28565b905090565b6000546001600160a01b031633146127795760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166127a15760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03919091166000908152602a60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146127f65760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661281e5760405162461bcd60e51b8152600401610e1390615537565b601f5460ff166001146128435760405162461bcd60e51b8152600401610e13906155ae565b612a8060408051608080820183526154608252601e6020808401828152600485870181815260608088018681526001600081815260028089529a51600080516020615af9833981519152559551600080516020615c61833981519152559251600080516020615a1983398151915255516000805160206159d98339815191525588518088018a5261a8c081526019818701818152828c01868152838501998a528b88528b89529251600080516020615be18339815191525551600080516020615a99833981519152559051600080516020615a39833981519152559551600080516020615c018339815191525588518088018a5262015180815260148187018181526003838d018181528486019a8b529088528b89529251600080516020615a598339815191525551600080516020615c418339815191525590516000805160206159f9833981519152559551600080516020615b398339815191525588518088018a526202a30081526012818701908152818b018a81528284019889529486528987529051600080516020615ab98339815191525551600080516020615c21833981519152559151600080516020615b19833981519152559351600080516020615ba183398151915255865194850187526203f4808552600f85840181815297860194855290850190815260059091529390529051600080516020615ad9833981519152559151600080516020615b81833981519152559051600080516020615bc18339815191525551600080516020615a7983398151915255565b601f805460ff191690556000612aab6064612aa56002612a9f602b5490565b906134e5565b906136e1565b90506000612aba6110aa6134c2565b604154909150612ad79030906001600160a01b03168385816134f1565b6000612ae230611b28565b90506000612af16110aa6134c2565b603e54909150612b0e9030906001600160a01b03168385816134f1565b602f54602e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015612b5f57600080fd5b505af1158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b97919061531a565b5050505050565b6000546001600160a01b03163314612bc85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612bf05760405162461bcd60e51b8152600401610e1390615537565b602f546001600160a01b0382811691161415612c4e5760405162461bcd60e51b815260206004820152601b60248201527f54686973207061697220697320616c726561647920696e2075736500000000006044820152606401610e13565b602f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612c9a5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612cc25760405162461bcd60e51b8152600401610e1390615537565b603b80549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314612d065760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d2e5760405162461bcd60e51b8152600401610e1390615537565b603b805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b03163314612d765760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d9e5760405162461bcd60e51b8152600401610e1390615537565b612daa6012600a615864565b612db4908261590c565b60425550565b6000546001600160a01b03163314612de45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612e0c5760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038116612e715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e13565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b6001600160a01b038316612f385760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e13565b6001600160a01b038216612f995760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e13565b6001600160a01b0383811660008181526027602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661305e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e13565b6001600160a01b0382166130c05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e13565b600081116131225760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e13565b6001600160a01b0383166000908152602860205260408120600301548190819060ff166131ad5760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038e16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6001600160a01b03851660009081526028602052604090206003015460ff166132345760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038d16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6000546001600160a01b0387811691161480159061326057506000546001600160a01b03868116911614155b801561328557506001600160a01b0386166000908152602a602052604090205460ff16155b80156132aa57506001600160a01b0385166000908152602a602052604090205460ff16155b15613466576001600160a01b03851660009081526029602052604090205460ff161580156132f157506001600160a01b03861660009081526029602052604090205460ff16155b6133365760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610e13565b602f546001600160a01b0387811691161415613388576133568585613cad565b6001600160a01b038816600090815260296020526040902054929550909350915060ff1615613383573094505b6133c6565b602f546001600160a01b03868116911614156133b4576133a88685614085565b919450925090506133c6565b6133be85856146b2565b919450925090505b600154600160a01b900460ff161580156133e85750603b5462010000900460ff165b80156134025750602f546001600160a01b03878116911614155b1561345757602f546001600160a01b03868116911614806134305750602e546001600160a01b038681169116145b806134485750602e546001600160a01b038681169116145b1561345c576134576001613799565b613481565b6134576000613799565b6134786134716134c2565b85906134e5565b92508391508290505b61348e86868585856134f1565b505050505050565b600081848411156134ba5760405162461bcd60e51b8152600401610e1391906154c2565b505050900390565b60008060006134cf6147d3565b90925090506134de82826136e1565b9250505090565b6000611151828461590c565b816134fb57612b97565b6001600160a01b03851615613547576001600160a01b03851660009081526023602052604090205461352d90846136f9565b6001600160a01b0386166000908152602360205260409020555b6001600160a01b03841660009081526023602052604090205461356a90826136ed565b6001600160a01b0380861660008181526023602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906135be9086815260200190565b60405180910390a36001600160a01b03851660009081526026602052604090205460ff16158061360757506001600160a01b03841660009081526026602052604090205460ff16155b15612b97576004546001600160a01b0316639f095b9e5a6040516001600160e01b031960e084901b1681526001600160a01b03808a16600483015288166024820152604401602060405180830381600088803b15801561366657600080fd5b5087f193505050508015613697575060408051601f3d908101601f191682019092526136949181019061531a565b60015b6136a057612b97565b506001600160a01b03808616600090815260266020526040808220805460ff1990811660019081179092559388168352912080549092161790555050505050565b60006111518284615801565b600061115182846157c4565b6000611151828461592b565b8061370d5750565b61373c61371b6110aa6134c2565b6006546001600160a01b0316600090815260236020526040902054906136ed565b600680546001600160a01b0390811660009081526023602090815260409182902094909455915491518481529116917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a250565b6001805460ff60a01b1916600160a01b17905560315460325460305460006137c030611b28565b603b5490915060ff161580156137d8575060385460ff165b80156137f257506039546033546001600160a01b03163110155b15613862576033546001600160a01b031663d506d3fe5a6040518263ffffffff1660e01b8152600401600060405180830381600088803b15801561383557600080fd5b5087f193505050508015613847575060015b61385d57603b805460ff19166001179055613b08565b613b08565b60215460ff1615801561387c5750603854610100900460ff165b801561388a57506042548410155b1561395e575082600061389c82614808565b91506138a78261484a565b90506138b281613baa565b6004546040516001600160a01b03909116908290600081818185875af1925050503d80600081146138ff576040519150601f19603f3d011682016040523d82523d6000602084013e613904565b606091505b50506031546139149150836136f9565b60315560205461392490826136ed565b602055602180546001919060009061394090849060ff166157dc565b92506101000a81548160ff021916908360ff16021790555050613b08565b602154600160ff90911611801590613978575060385460ff165b801561398657506042548310155b15613a22575081600061399882614808565b91506139a38261484a565b6033546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146139f1576040519150601f19603f3d011682016040523d82523d6000602084013e6139f6565b606091505b5050603254613a069150836136f9565b603255602180546001919060009061394090849060ff166157dc565b602154600260ff90911611801590613a435750600154600160a81b900460ff165b8015613a5157506042548210155b15613ab2575080613a6181614808565b9050613a6c816148d8565b603054613a7990826136f9565b6030556021805460019190600090613a9590849060ff166157dc565b92506101000a81548160ff021916908360ff160217905550613b08565b600454600160a01b900460ff168015613ac9575084155b15613b0857613ad66149a0565b6021805460019190600090613aef90849060ff166157dc565b92506101000a81548160ff021916908360ff1602179055505b602154600460ff90911610613b2e576021805460ff19908116909155603b805490911690555b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613b7e57600080fd5b505af1158015613b92573d6000803e3d6000fd5b50506001805460ff60a01b1916905550505050505050565b6103e881118015613bbb5750804710155b156110d157600454600160a01b900460ff1615613c60576004546001600160a01b0316815a60408051600481526024810182526020810180516001600160e01b031663439370b160e01b1790529051919291613c1791906154a6565b600060405180830381858888f193505050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b606091505b50505050565b6004546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b6000806000603b60029054906101000a900460ff1680613cd45750603b54610100900460ff165b613d1b5760405162461bcd60e51b81526020600482015260186024820152772a3930b234b733903737ba103cb2ba1032b730b13632b21760411b6044820152606401610e13565b600080600080603b60019054906101000a900460ff168015613d465750603b5462010000900460ff16155b15613dc7576001600160a01b038916600081815260296020908152604091829020805460ff1916600190811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a2309850613dba613db36134c2565b89906134e5565b965087955086945061407a565b6001600160a01b038916600090815260286020526040902042600290910155603b546301000000900460ff1615613f4357603c54613e07906102586157c4565b421015613e8457613e216103e8612aa56003612a9f612732565b881115613e7f5760405162461bcd60e51b815260206004820152602660248201527f507572636861736520746f6f206c6172676520666f7220696e697469616c206f60448201526570656e696e6760d01b6064820152608401610e13565b613f1b565b6001600160a01b0389166000908152602860205260409020544211613ef65760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b6064820152608401610e13565b613f0142600f6157c4565b6001600160a01b038a166000908152602860205260409020555b613f2642600f6157c4565b6001600160a01b038a166000908152602860205260409020600101555b600c54600b54600854600a54600093613f63939092611edf9283916136ed565b9050613f7b8960076002015460076000015484614a1e565b602254939a50919750955093503410613fc857613f998560026136e1565b9450613fa68460026136e1565b9350613fb38360026136e1565b9250613fc584611edf81818b886136ed565b96505b613fdc89868686613fd76134c2565b614a8a565b91995096509150613fec84614aec565b61401061400b82612aa5600760030154876134e590919063ffffffff16565b613705565b61404861402f82612aa5600760010154876134e590919063ffffffff16565b600b54614043908490612aa59088906134e5565b614b4e565b61406e61406782612aa5600760050154876134e590919063ffffffff16565b6000614c32565b6140788286614ce4565b505b505050509250925092565b6000806000603b60029054906101000a900460ff166140e35760405162461bcd60e51b815260206004820152601a602482015279151c98591a5b99c81a5cc81b9bdd08195b98589b1959081e595d60321b6044820152606401610e13565b603b546301000000900460ff161561416b576001600160a01b038516600090815260286020526040902060010154421161416b5760405162461bcd60e51b815260206004820152602360248201527f596f75722073656c6c20636f6f6c646f776e20686173206e6f7420657870697260448201526232b21760e91b6064820152608401610e13565b6000614175612732565b9050603c54610e1061418791906157c4565b421080156141ad57506001600160a01b03861660009081526025602052604090205460ff165b15614236576141c26064612aa58360056134e5565b85106142365760405162461bcd60e51b815260206004820152603c60248201527f53656c6c207175616e7469747920746f6f206869676820666f72206c61756e6360448201527f682e2e2e20706c6561736520646f6e742064756d70206561726c7921000000006064820152608401610e13565b6036546001600160a01b0387166000908152602860209081526040822060029081015460059093529052600080516020615ad98339815191525461427b9082906136ed565b42111561428757614404565b60016000526002602052600080516020615af9833981519152546142ac9082906136ed565b4210156142d45760016000526002602052600080516020615c61833981519152549150614404565b60026000819052602052600080516020615be1833981519152546142f99082906136ed565b4210156143215760026000819052602052600080516020615a99833981519152549150614404565b60036000526002602052600080516020615a59833981519152546143469082906136ed565b42101561436e5760036000526002602052600080516020615c41833981519152549150614404565b60046000526002602052600080516020615ab9833981519152546143939082906136ed565b4210156143bb5760046000526002602052600080516020615c21833981519152549150614404565b60056000526002602052600080516020615ad9833981519152546143e09082906136ed565b4210156144045760056000526002602052600080516020615b818339815191525491505b60375460056000526002602052600080516020615bc18339815191525461443390606490612aa59087906134e5565b88101561443f576145da565b60016000526002602052600080516020615a198339815191525461446b90606490612aa59087906134e5565b8811156144925750600160005260026020526000805160206159d9833981519152546145da565b60026000819052602052600080516020615a39833981519152546144be90606490612aa59087906134e5565b8811156144e5575060026000819052602052600080516020615c01833981519152546145da565b600360005260026020526000805160206159f98339815191525461451190606490612aa59087906134e5565b881115614538575060036000526002602052600080516020615b39833981519152546145da565b60046000526002602052600080516020615b198339815191525461456490606490612aa59087906134e5565b88111561458b575060046000526002602052600080516020615ba1833981519152546145da565b60056000526002602052600080516020615bc1833981519152546145b790606490612aa59087906134e5565b8811156145da575060056000526002602052600080516020615a79833981519152545b828110156145e55750815b60006145f66064612aa58b856134e5565b905060006146048a836136f9565b9050600061461a6146136134c2565b8c906134e5565b905060006146306146296134c2565b84906134e5565b9050600061464e6064612aa5603454886134e590919063ffffffff16565b9050600061466c6064612aa5603554896134e590919063ffffffff16565b905060006146848261467e89866136f9565b906136f9565b9050614691836000614b4e565b61469b8282614c32565b50929b509299509750505050505050509250925092565b6001600160a01b0382166000908152602860205260408120426002909101556012546011546008546010548493849384938493849384938493849384938493614703939192611edf928391906136ed565b905061471b8c600d60020154600d6000015484614a1e565b929950909650945092506147348c868686613fd76134c2565b9199509650915061474484614aec565b61476361400b82612aa5600d60030154876134e590919063ffffffff16565b61479661478282612aa5600d60010154876134e590919063ffffffff16565b601154614043908490612aa59088906134e5565b6147b561406782612aa5600d60050154876134e590919063ffffffff16565b6147bf8286614ce4565b50959b949a50929850929650505050505050565b602c54602b5460009182916147e882826136e1565b8210156147ff57602c54602b549350935050509091565b90939092509050565b6000819050600061481d603a54612aa5612732565b90508083111561482b578091505b61483430611b28565b8211156148445761115130611b28565b50919050565b602f546040805160016209351760e01b0319815290516000926001600160a01b03169163fff6cae9916004808301928692919082900301818387803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b5050602e544792506148c4915030906001600160a01b031685612ed6565b6148ce3084614d08565b61115147826136f9565b60006148e58260026136e1565b905060006148f383836136f9565b602e5490915047906149109030906001600160a01b031685612ed6565b61491a3084614d08565b600061492647836136f9565b602e549091506149419030906001600160a01b031685612ed6565b600654614958906001600160a01b03168483614f09565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6005545a10611927576004546001600160a01b03166387174c765a6040518263ffffffff1660e01b8152600401602060405180830381600088803b1580156149e757600080fd5b5087f193505050508015614a18575060408051601f3d908101601f19168201909252614a159181019061531a565b60015b6110d157565b600080808080614a336064612aa58b8a6134e5565b90506000614a466064612aa58c8c6134e5565b90506000614a596064612aa58d8b6134e5565b90506000614a678c856136f9565b9050614a778261467e8e866136f9565b9c939b5091995097509095505050505050565b6000808080614a9989866134e5565b90506000614aa789876134e5565b90506000614ab589886134e5565b90506000614ac389896134e5565b90506000614ad78261467e858189896136f9565b949d949c50929a509298505050505050505050565b80614af45750565b6000614afe6134c2565b90506000614b0c83836134e5565b30600090815260236020526040902054909150614b2990826136ed565b30600090815260236020526040902055603054614b4690846136ed565b603055505050565b81158015614b5a575080155b15614b63575050565b6000614b6d6134c2565b90506000614b7b84836134e5565b90506000614b8f6003612aa58660026134e5565b90506000614ba184612a9f87856136f9565b90506000614baf83866134e5565b30600090815260236020526040902054909150614bd2908390611edf90876136ed565b30600081815260236020526040902091909155603d54614bfe91906001600160a01b0316868a816134f1565b603f54614c189030906001600160a01b03168489816134f1565b604054611de59030906001600160a01b03168386816134f1565b6000614c3c6134c2565b90508215614c8f576000614c5084836134e5565b30600090815260236020526040902054909150614c6d90826136ed565b30600090815260236020526040902055603154614c8a90856136ed565b603155505b81156110ce576000614ca183836134e5565b30600090815260236020526040902054909150614cbe90826136ed565b30600090815260236020526040902055603254614cdb90846136ed565b60325550505050565b602c54614cf190836136f9565b602c55602d54614d0190826136ed565b602d555050565b602e54614d209030906001600160a01b031683612ed6565b602e54614d389083906001600160a01b031683612ed6565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614d7b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015614dcf57600080fd5b505afa158015614de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e0791906150e4565b81600181518110614e2857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602f546040805160016209351760e01b031981529051919092169163fff6cae991600480830192600092919082900301818387803b158015614e7f57600080fd5b505af1158015614e93573d6000803e3d6000fd5b5050602e546001600160a01b0316915063791ac94790505a8460008588426040518763ffffffff1660e01b8152600401614ed19594939291906156ff565b600060405180830381600088803b158015614eeb57600080fd5b5087f1158015614eff573d6000803e3d6000fd5b5050505050505050565b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614f5957600080fd5b505af1158015614f6d573d6000803e3d6000fd5b5050602e546001600160a01b0316915063f305d71990505a6040516001600160e01b031960e084901b1681523060048201526024810186905260006044820181905260648201526001600160a01b03871660848201524260a4820152849060c4016060604051808303818589803b158015614fe757600080fd5b5088f1158015614ffb573d6000803e3d6000fd5b5050505050506040513d601f19601f8201168201806040525081019061348e91906153c9565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600082601f830112615059578081fd5b8135602061506e615069836157a0565b61576f565b80838252828201915082860187848660051b890101111561508d578586fd5b855b858110156150ab5781358452928401929084019060010161508f565b5090979650505050505050565b80356150c3816159ca565b919050565b6000602082840312156150d9578081fd5b8135611151816159b5565b6000602082840312156150f5578081fd5b8151611151816159b5565b60008060408385031215615112578081fd5b823561511d816159b5565b9150602083013561512d816159b5565b809150509250929050565b6000806000806080858703121561514d578182fd5b8435615158816159b5565b93506020850135615168816159b5565b92506040850135615178816159b5565b91506060850135615188816159b5565b939692955090935050565b6000806000606084860312156151a7578283fd5b83356151b2816159b5565b925060208401356151c2816159b5565b929592945050506040919091013590565b600080604083850312156151e5578182fd5b82356151f0816159b5565b9150602083013561512d816159ca565b60008060408385031215615212578182fd5b823561521d816159b5565b946020939093013593505050565b60008060006060848603121561523f578283fd5b833567ffffffffffffffff80821115615256578485fd5b818601915086601f830112615269578485fd5b81356020615279615069836157a0565b8083825282820191508286018b848660051b890101111561529857898afd5b8996505b848710156152c35780356152af816159b5565b83526001969096019591830191830161529c565b50975050870135925050808211156152d9578384fd5b506152e686828701615049565b9250506152f5604085016150b8565b90509250925092565b60006020828403121561530f578081fd5b8135611151816159ca565b60006020828403121561532b578081fd5b8151611151816159ca565b60008060006060848603121561534a578081fd5b8335615355816159ca565b925060208401356151c2816159ca565b600060208284031215615376578081fd5b5035919050565b6000806040838503121561538f578182fd5b50508035926020909101359150565b6000806000606084860312156153b2578081fd5b505081359360208301359350604090920135919050565b6000806000606084860312156153dd578081fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561540e578384fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080600080600060a0868803121561544f578283fd5b853560ff8116811461545f578384fd5b97602087013597506040870135966060810135965060800135945092505050565b805182526020810151602083015260408101516040830152606081015160608301525050565b600082516154b8818460208701615942565b9190910192915050565b60208152600082518060208401526154e1816040850160208701615942565b601f01601f19169190910160400192915050565b60208082526022908201527f4164647265737320616c72656164792073657420746f20746869732076616c75604082015261652160f01b606082015260800190565b60208082526022908201527f5a65726f2061646472657373206973206e6f7420612076616c69642063616c6c60408201526132b960f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f546869732066756e6374696f6e2063616e206f6e6c7920657665722062652063604082015269616c6c6564206f6e636560b01b606082015260800190565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a09283015192810192909252805460c0830152600181015460e0830152600281015461010083015260038101546101208301526004810154610140830152600501546101608201526101800190565b61028081016156838288615480565b6156906080830187615480565b61569e610100830186615480565b6156ac610180830185615480565b6156ba610200830184615480565b9695505050505050565b61010081016156d38285615480565b82546080830152600183015460a0830152600283015460c0830152600383015460e08301529392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561574e5784516001600160a01b031683529383019391830191600101615729565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156157985761579861599f565b604052919050565b600067ffffffffffffffff8211156157ba576157ba61599f565b5060051b60200190565b600082198211156157d7576157d7615989565b500190565b600060ff821660ff84168060ff038211156157f9576157f9615989565b019392505050565b60008261581c57634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561585c57816000190482111561584257615842615989565b8085161561584f57918102915b93841c9390800290615826565b509250929050565b6000611151838360008261587a57506001610de3565b8161588757506000610de3565b816001811461589d57600281146158a7576158c3565b6001915050610de3565b60ff8411156158b8576158b8615989565b50506001821b610de3565b5060208310610133831016604e8410600b84101617156158e6575081810a610de3565b6158f08383615821565b806000190482111561590457615904615989565b029392505050565b600081600019048311821515161561592657615926615989565b500290565b60008282101561593d5761593d615989565b500390565b60005b8381101561595d578181015183820152602001615945565b83811115613c5a5750506000910152565b600060001982141561598257615982615989565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110d157600080fd5b80151581146110d157600080fdfee90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e388601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c5e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e2679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28e88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e387679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28dee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6918fb98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e384e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919188601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c645524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e385ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a69192b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e386679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28fee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919088601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e145524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a998ebd315c8bc806c6b7eeba04ebad68bb236645907797e79a2f1b14495a01664736f6c63430008040033000000000000000000000000000000000000000000000000000000e8d4a51000
Deployed Bytecode
0x6080604052600436106103cb5760003560e01c8063786ccd2f116101f4578063c2fbe7bc1161010e578063e1c7392a116100a6578063e1c7392a14610c9d578063e4748b9e14610cb2578063e51b644a14610cdd578063ea18f76014610cfd578063ed42709614610d1d578063f05ca03414610d3c578063f0f165af14610d5c578063f2fde38b14610d7c578063f889df8e14610d9c578063ffb54a9914610db257600080fd5b8063c2fbe7bc14610b35578063c49b9a8014610b8d578063c851cc3214610bad578063ce9ae17f14610bcd578063d2b1432c14610bed578063daad099914610c02578063db92dbb614610c22578063dd62ed3e14610c37578063df8408fe14610c7d57600080fd5b806395d89b411161018c57806395d89b41146109ef578063962dfc7514610a1f578063a457c2d714610a3f578063a9059cbb14610a5f578063b2e4b83514610a7f578063b3adc89a14610a9f578063b6cd399d14610abf578063b79b533814610ade578063be37757a14610afe578063bebe766f14610b1457600080fd5b8063786ccd2f146108db57806379365aa2146108fb5780637a4f133e1461091b5780637a5ffd7a1461093b5780638542b3361461095b5780638da5cb5b1461097b5780638ea1303614610999578063914c8239146109af5780639155e083146109cf57600080fd5b80633fbad2cd116102e55780634cf8c94b1161027d5780634cf8c94b146107915780634fc3fd72146107cb5780634fd992cc146107eb5780636053a0e31461080b5780636778c56c14610825578063685fc5681461083a57806370a082311461086057806370b7b80c14610880578063715018a614610896578063768dc710146108ab57600080fd5b80633fbad2cd1461067a57806341fe29d01461069a57806342966c68146106ba57806343a18909146106da578063472dc00f146106fa57806348473bb31461071057806349bd5a5e146107305780634a74bb02146107505780634afc71871461077157600080fd5b806323b872dd1161036357806323b872dd1461054f57806327c8f8351461056f5780632a9b80721461058f5780632d838119146105af578063313ce567146105cf57806334f2af70146105e457806338f888d41461060457806339509351146106245780633cdd5ee7146106445780633d4852a91461065a57600080fd5b806306fdde03146103d7578063095ea7b31461042757806309d8a68c1461045757806313114a9d1461047b5780631694505e1461049057806318160ddd146104c85780631cdd3be3146104dd57806320e080591461050d5780632312d58a1461052f57600080fd5b366103d257005b600080fd5b3480156103e357600080fd5b506104116040518060400160405280600e81526020016d223cb730b6b4b1b9902a37b5b2b760911b81525081565b60405161041e91906154c2565b60405180910390f35b34801561043357600080fd5b50610447610442366004615200565b610dd2565b604051901515815260200161041e565b34801561046357600080fd5b5061046d60225481565b60405190815260200161041e565b34801561048757600080fd5b50602d5461046d565b34801561049c57600080fd5b50602e546104b0906001600160a01b031681565b6040516001600160a01b03909116815260200161041e565b3480156104d457600080fd5b50602b5461046d565b3480156104e957600080fd5b506104476104f83660046150c8565b60296020526000908152604090205460ff1681565b34801561051957600080fd5b5061052d610528366004615365565b610de9565b005b34801561053b57600080fd5b5061052d61054a3660046153f6565b610e49565b34801561055b57600080fd5b5061044761056a366004615193565b610f2d565b34801561057b57600080fd5b506006546104b0906001600160a01b031681565b34801561059b57600080fd5b5061052d6105aa3660046152fe565b610f96565b3480156105bb57600080fd5b5061046d6105ca366004615365565b6110d4565b3480156105db57600080fd5b5061046d601281565b3480156105f057600080fd5b5061052d6105ff36600461539e565b611158565b34801561061057600080fd5b506041546104b0906001600160a01b031681565b34801561063057600080fd5b5061044761063f366004615200565b611228565b34801561065057600080fd5b5061046d60395481565b34801561066657600080fd5b5061052d6106753660046150c8565b61125e565b34801561068657600080fd5b5061052d6106953660046150c8565b6112d1565b3480156106a657600080fd5b5061052d6106b5366004615336565b61138b565b3480156106c657600080fd5b5061052d6106d5366004615365565b611408565b3480156106e657600080fd5b506040546104b0906001600160a01b031681565b34801561070657600080fd5b5061046d60365481565b34801561071c57600080fd5b5061052d61072b366004615138565b61145e565b34801561073c57600080fd5b50602f546104b0906001600160a01b031681565b34801561075c57600080fd5b5060015461044790600160a81b900460ff1681565b34801561077d57600080fd5b506004546104b0906001600160a01b031681565b34801561079d57600080fd5b506030546031546032546107b092919083565b6040805193845260208401929092529082015260600161041e565b3480156107d757600080fd5b5061052d6107e63660046153f6565b611762565b3480156107f757600080fd5b5061052d610806366004615365565b611835565b34801561081757600080fd5b506038546104479060ff1681565b34801561083157600080fd5b5061052d6118f6565b34801561084657600080fd5b5061084f611929565b60405161041e959493929190615674565b34801561086c57600080fd5b5061046d61087b3660046150c8565b611b28565b34801561088c57600080fd5b5061046d603c5481565b3480156108a257600080fd5b5061052d611b4a565b3480156108b757600080fd5b506104476108c63660046150c8565b602a6020526000908152604090205460ff1681565b3480156108e757600080fd5b5061052d6108f636600461522b565b611bf2565b34801561090757600080fd5b5061052d6109163660046150c8565b611dee565b34801561092757600080fd5b5061052d61093636600461539e565b611ed1565b34801561094757600080fd5b50603d546104b0906001600160a01b031681565b34801561096757600080fd5b506033546104b0906001600160a01b031681565b34801561098757600080fd5b506000546001600160a01b03166104b0565b3480156109a557600080fd5b5061046d60205481565b3480156109bb57600080fd5b5061052d6109ca36600461537d565b611fc8565b3480156109db57600080fd5b5061052d6109ea3660046151d3565b612025565b3480156109fb57600080fd5b506104116040518060400160405280600481526020016344594e4160e01b81525081565b348015610a2b57600080fd5b50603f546104b0906001600160a01b031681565b348015610a4b57600080fd5b50610447610a5a366004615200565b6120d6565b348015610a6b57600080fd5b50610447610a7a366004615200565b612125565b348015610a8b57600080fd5b5061052d610a9a3660046152fe565b61217a565b348015610aab57600080fd5b5061052d610aba3660046150c8565b612264565b348015610acb57600080fd5b5060385461044790610100900460ff1681565b348015610aea57600080fd5b50603e546104b0906001600160a01b031681565b348015610b0a57600080fd5b5061046d60055481565b348015610b2057600080fd5b50603b54610447906301000000900460ff1681565b348015610b4157600080fd5b50600d54600e54600f54601054601154601254610b6095949392919086565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161041e565b348015610b9957600080fd5b5061052d610ba83660046152fe565b61231e565b348015610bb957600080fd5b5061052d610bc83660046150c8565b61238e565b348015610bd957600080fd5b5061052d610be83660046150c8565b6124a7565b348015610bf957600080fd5b5061052d612561565b348015610c0e57600080fd5b5061052d610c1d366004615438565b6125c5565b348015610c2e57600080fd5b5061046d612732565b348015610c4357600080fd5b5061046d610c52366004615100565b6001600160a01b03918216600090815260276020908152604080832093909416825291909152205490565b348015610c8957600080fd5b5061052d610c983660046151d3565b61274f565b348015610ca957600080fd5b5061052d6127cc565b348015610cbe57600080fd5b50600754600854600954600a54600b54600c54610b6095949392919086565b348015610ce957600080fd5b5061052d610cf83660046150c8565b612b9e565b348015610d0957600080fd5b5061052d610d183660046152fe565b612c70565b348015610d2957600080fd5b50603b5461044790610100900460ff1681565b348015610d4857600080fd5b5061052d610d573660046152fe565b612cdc565b348015610d6857600080fd5b5061052d610d77366004615365565b612d4c565b348015610d8857600080fd5b5061052d610d973660046150c8565b612dba565b348015610da857600080fd5b5061046d60375481565b348015610dbe57600080fd5b50603b546104479062010000900460ff1681565b6000610ddf338484612ed6565b5060015b92915050565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b8152600401610e1390615579565b60405180910390fd5b6000546001600160a01b0316610e445760405162461bcd60e51b8152600401610e1390615537565b603955565b6000546001600160a01b03163314610e735760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610e9b5760405162461bcd60e51b8152600401610e1390615537565b6040805160c0810182526007805482526008805460208401526009805484860152600a80546060860152600b80546080870152600c805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b60405180910390a150505050505050565b6000610f3a848484612ffa565b610f8c8433610f8785604051806060016040528060288152602001615b59602891396001600160a01b038a1660009081526027602090815260408083203384529091529020549190613496565b612ed6565b5060019392505050565b6000546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610fe85760405162461bcd60e51b8152600401610e1390615537565b603b5462010000900460ff161561103b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c8185b1c9958591e48195b98589b1959604a1b6044820152606401610e13565b603b805462ff000019166201000017905542603c556001805460ff60a81b1916600160a81b179055600061106e30611b28565b11801561108257506000611080612732565b115b801561108b5750805b156110d157600061109b30611b28565b905060006110b16110aa6134c2565b83906134e5565b6040549091506110ce9030906001600160a01b03168385816134f1565b50505b50565b6000602c5482111561113b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e13565b60006111456134c2565b905061115183826136e1565b9392505050565b6000546001600160a01b031633146111825760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166111aa5760405162461bcd60e51b8152600401610e1390615537565b806111b583856157c4565b6111bf91906157c4565b60641461121c5760405162461bcd60e51b815260206004820152602560248201527f54686573652070657263656e7461676573206d7573742061646420757020746f604482015264203130302560d81b6064820152608401610e13565b50603491909155603555565b3360008181526027602090815260408083206001600160a01b03871684529091528120549091610ddf918590610f8790866136ed565b6000546001600160a01b031633146112885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166112b05760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03166000908152602660205260409020805460ff19169055565b6000546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113235760405162461bcd60e51b8152600401610e1390615537565b603d546001600160a01b03828116911614156113515760405162461bcd60e51b8152600401610e13906154f5565b603d80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146113b55760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113dd5760405162461bcd60e51b8152600401610e1390615537565b6038805461ffff191693151561ff001916939093176101009215159290920291909117909155603a55565b806114105750565b600061141a6134c2565b9050600061142883836134e5565b3360009081526023602052604090205490915061144590826136f9565b336000908152602360205260409020556110ce83613705565b6000546001600160a01b031633146114885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166114b05760405162461bcd60e51b8152600401610e1390615537565b601f5460ff1660031461152b5760405162461bcd60e51b815260206004820152603d60248201527f546869732066756e6374696f6e206d757374206265207468652066697273742060448201527f63616c6c20616e642063616e6e6f74206265207573656420616761696e0000006064820152608401610e13565b602e546040805163c45a015560e01b815290516000926001600160a01b03169163c45a0155916004808301926020929190829003018186803b15801561157057600080fd5b505afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a891906150e4565b6001600160a01b031663c9c6539630602e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d91906150e4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561168557600080fd5b505af1158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd91906150e4565b603380546001600160a01b039485166001600160a01b0319918216179091556004805497851697821688179055603e805495851695821686179055603d8054968516968216871790556000968752602a6020526040808820805460ff19908116600190811790925596895281892080548816821790559688529096208054851690951790945550602f8054919093169316929092179055601f80549091166002179055565b6000546001600160a01b0316331461178c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166117b45760405162461bcd60e51b8152600401610e1390615537565b6040805160c081018252600d80548252600e80546020840152600f8054848601526010805460608601526011805460808701526012805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b6000546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166118875760405162461bcd60e51b8152600401610e1390615537565b61c35060055410156118f15760405162461bcd60e51b815260206004820152602d60248201527f4d696e696d756d20476173206d757374206265206f7665722035302c3030302060448201526c62617265206d696e696d756d2160981b6064820152608401610e13565b600555565b600154600160a01b900460ff161580156119185750603b5462010000900460ff165b15611927576119276000613799565b565b611931615021565b611939615021565b611941615021565b611949615021565b611951615021565b50506002602090815260056000526040805160808082018352600080516020615af9833981519152548252600080516020615c618339815191525482850152600080516020615a1983398151915254828401526000805160206159d98339815191525460608084019190915283518083018552600080516020615be1833981519152548152600080516020615a998339815191525481870152600080516020615a398339815191525481860152600080516020615c01833981519152548183015284518084018652600080516020615a59833981519152548152600080516020615c4183398151915254818801526000805160206159f98339815191525481870152600080516020615b39833981519152548184015285518085018752600080516020615ab9833981519152548152600080516020615c218339815191525481890152600080516020615b198339815191525481880152600080516020615ba1833981519152548185015286519485018752600080516020615ad9833981519152548552600080516020615b818339815191525497850197909752600080516020615bc18339815191525495840195909552600080516020615a798339815191525491830191909152919791965091945091925090565b6001600160a01b038116600090815260236020526040812054610de3906110d4565b6000546001600160a01b03163314611b745760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611b9c5760405162461bcd60e51b8152600401610e1390615537565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611c445760405162461bcd60e51b8152600401610e1390615537565b8151835114611c955760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265206f6620657175616c206c656e67746800006044820152606401610e13565b601f5460ff16600214611cba5760405162461bcd60e51b8152600401610e13906155ae565b6000611cc46134c2565b90506000806000805b8751811015611dd057611d18670de0b6b3a7640000888381518110611d0257634e487b7160e01b600052603260045260246000fd5b60200260200101516134e590919063ffffffff16565b9150611d2482866134e5565b9250611d5a30898381518110611d4a57634e487b7160e01b600052603260045260246000fd5b60200260200101518585876134f1565b611d6484836136ed565b93506001602560008a8481518110611d8c57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611dc88161596e565b915050611ccd565b508415611de557601f805460ff191660011790555b50505050505050565b6000546001600160a01b03163314611e185760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611e405760405162461bcd60e51b8152600401610e1390615537565b6004546001600160a01b0382811691161415611eaf5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f7220697320616c72656164792073657420746f2074686973604482015267206164647265737360c01b6064820152608401610e13565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611ee581611edf85856136ed565b906136ed565b611eee33611b28565b1015611f575760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f742068617665207468652062616c616e636520746f207060448201527132b93337b936903a3434b99030b1ba34b7b760711b6064820152608401610e13565b6000611f6782611edf86866136ed565b90506000611f736134c2565b90506000611f8183836134e5565b9050611f9033308386856134f1565b603054611f9d90876136ed565b603055603254611fad90856136ed565b603255603154611fbd90866136ed565b603155505050505050565b6000546001600160a01b03163314611ff25760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661201a5760405162461bcd60e51b8152600401610e1390615537565b603691909155603755565b6000546001600160a01b0316331461204f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166120775760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038216600081815260296020908152604091829020805460ff191685151590811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a25050565b6000610ddf3384610f8785604051806060016040528060258152602001615c81602591393360009081526027602090815260408083206001600160a01b038d1684529091529020549190613496565b60006005545a101561216f5760405162461bcd60e51b81526020600482015260136024820152725265717569726573206869676865722067617360681b6044820152606401610e13565b610ddf338484612ffa565b6000546001600160a01b031633146121a45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166121cc5760405162461bcd60e51b8152600401610e1390615537565b600460149054906101000a900460ff16151581151514156122465760405162461bcd60e51b815260206004820152602e60248201527f4175746f2d5265666c656374696f6e732061726520616c72656164792073657460448201526d20746f20746861742076616c756560901b6064820152608401610e13565b60048054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b0316331461228e5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166122b65760405162461bcd60e51b8152600401610e1390615537565b603e546001600160a01b03828116911614156122e45760405162461bcd60e51b8152600401610e13906154f5565b603e80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146123485760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123705760405162461bcd60e51b8152600401610e1390615537565b60018054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b031633146123b85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123e05760405162461bcd60e51b8152600401610e1390615537565b602e546001600160a01b038281169116141561244a5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e13565b602e546040516001600160a01b03918216918316907f2c6fb4d5ff9fad6ecf2e09cd64cbc9aad92a8b9d2cc0e5c3ddef9b529b0b5ffd90600090a3602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146124d15760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166124f95760405162461bcd60e51b8152600401610e1390615537565b6033546001600160a01b03828116911614156125275760405162461bcd60e51b8152600401610e13906154f5565b603380546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166125b35760405162461bcd60e51b8152600401610e1390615537565b6103e847106119275761192747613baa565b6000546001600160a01b031633146125ef5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166126175760405162461bcd60e51b8152600401610e1390615537565b60068560ff1610801561262d575060008560ff16115b6126715760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b195d995b08195b9d195c9959605a1b6044820152606401610e13565b60ff851660008181526002602081815260408084208151608081018352815481526001820154818501528185015492810192909252600381015460608301529490935252906126de906126c687610e1061590c565b81556001810186905560028101859055600301839055565b60ff86166000908152600260205260409081902090517f8a817db92e842c03fbd292352c314987ecce88fce7eca89ee8cd2618eacd72cb91612722918491906156c4565b60405180910390a1505050505050565b602f5460009061274a906001600160a01b0316611b28565b905090565b6000546001600160a01b031633146127795760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166127a15760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03919091166000908152602a60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146127f65760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661281e5760405162461bcd60e51b8152600401610e1390615537565b601f5460ff166001146128435760405162461bcd60e51b8152600401610e13906155ae565b612a8060408051608080820183526154608252601e6020808401828152600485870181815260608088018681526001600081815260028089529a51600080516020615af9833981519152559551600080516020615c61833981519152559251600080516020615a1983398151915255516000805160206159d98339815191525588518088018a5261a8c081526019818701818152828c01868152838501998a528b88528b89529251600080516020615be18339815191525551600080516020615a99833981519152559051600080516020615a39833981519152559551600080516020615c018339815191525588518088018a5262015180815260148187018181526003838d018181528486019a8b529088528b89529251600080516020615a598339815191525551600080516020615c418339815191525590516000805160206159f9833981519152559551600080516020615b398339815191525588518088018a526202a30081526012818701908152818b018a81528284019889529486528987529051600080516020615ab98339815191525551600080516020615c21833981519152559151600080516020615b19833981519152559351600080516020615ba183398151915255865194850187526203f4808552600f85840181815297860194855290850190815260059091529390529051600080516020615ad9833981519152559151600080516020615b81833981519152559051600080516020615bc18339815191525551600080516020615a7983398151915255565b601f805460ff191690556000612aab6064612aa56002612a9f602b5490565b906134e5565b906136e1565b90506000612aba6110aa6134c2565b604154909150612ad79030906001600160a01b03168385816134f1565b6000612ae230611b28565b90506000612af16110aa6134c2565b603e54909150612b0e9030906001600160a01b03168385816134f1565b602f54602e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015612b5f57600080fd5b505af1158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b97919061531a565b5050505050565b6000546001600160a01b03163314612bc85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612bf05760405162461bcd60e51b8152600401610e1390615537565b602f546001600160a01b0382811691161415612c4e5760405162461bcd60e51b815260206004820152601b60248201527f54686973207061697220697320616c726561647920696e2075736500000000006044820152606401610e13565b602f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612c9a5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612cc25760405162461bcd60e51b8152600401610e1390615537565b603b80549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314612d065760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d2e5760405162461bcd60e51b8152600401610e1390615537565b603b805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b03163314612d765760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d9e5760405162461bcd60e51b8152600401610e1390615537565b612daa6012600a615864565b612db4908261590c565b60425550565b6000546001600160a01b03163314612de45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612e0c5760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038116612e715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e13565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b6001600160a01b038316612f385760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e13565b6001600160a01b038216612f995760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e13565b6001600160a01b0383811660008181526027602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661305e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e13565b6001600160a01b0382166130c05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e13565b600081116131225760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e13565b6001600160a01b0383166000908152602860205260408120600301548190819060ff166131ad5760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038e16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6001600160a01b03851660009081526028602052604090206003015460ff166132345760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038d16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6000546001600160a01b0387811691161480159061326057506000546001600160a01b03868116911614155b801561328557506001600160a01b0386166000908152602a602052604090205460ff16155b80156132aa57506001600160a01b0385166000908152602a602052604090205460ff16155b15613466576001600160a01b03851660009081526029602052604090205460ff161580156132f157506001600160a01b03861660009081526029602052604090205460ff16155b6133365760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610e13565b602f546001600160a01b0387811691161415613388576133568585613cad565b6001600160a01b038816600090815260296020526040902054929550909350915060ff1615613383573094505b6133c6565b602f546001600160a01b03868116911614156133b4576133a88685614085565b919450925090506133c6565b6133be85856146b2565b919450925090505b600154600160a01b900460ff161580156133e85750603b5462010000900460ff165b80156134025750602f546001600160a01b03878116911614155b1561345757602f546001600160a01b03868116911614806134305750602e546001600160a01b038681169116145b806134485750602e546001600160a01b038681169116145b1561345c576134576001613799565b613481565b6134576000613799565b6134786134716134c2565b85906134e5565b92508391508290505b61348e86868585856134f1565b505050505050565b600081848411156134ba5760405162461bcd60e51b8152600401610e1391906154c2565b505050900390565b60008060006134cf6147d3565b90925090506134de82826136e1565b9250505090565b6000611151828461590c565b816134fb57612b97565b6001600160a01b03851615613547576001600160a01b03851660009081526023602052604090205461352d90846136f9565b6001600160a01b0386166000908152602360205260409020555b6001600160a01b03841660009081526023602052604090205461356a90826136ed565b6001600160a01b0380861660008181526023602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906135be9086815260200190565b60405180910390a36001600160a01b03851660009081526026602052604090205460ff16158061360757506001600160a01b03841660009081526026602052604090205460ff16155b15612b97576004546001600160a01b0316639f095b9e5a6040516001600160e01b031960e084901b1681526001600160a01b03808a16600483015288166024820152604401602060405180830381600088803b15801561366657600080fd5b5087f193505050508015613697575060408051601f3d908101601f191682019092526136949181019061531a565b60015b6136a057612b97565b506001600160a01b03808616600090815260266020526040808220805460ff1990811660019081179092559388168352912080549092161790555050505050565b60006111518284615801565b600061115182846157c4565b6000611151828461592b565b8061370d5750565b61373c61371b6110aa6134c2565b6006546001600160a01b0316600090815260236020526040902054906136ed565b600680546001600160a01b0390811660009081526023602090815260409182902094909455915491518481529116917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a250565b6001805460ff60a01b1916600160a01b17905560315460325460305460006137c030611b28565b603b5490915060ff161580156137d8575060385460ff165b80156137f257506039546033546001600160a01b03163110155b15613862576033546001600160a01b031663d506d3fe5a6040518263ffffffff1660e01b8152600401600060405180830381600088803b15801561383557600080fd5b5087f193505050508015613847575060015b61385d57603b805460ff19166001179055613b08565b613b08565b60215460ff1615801561387c5750603854610100900460ff165b801561388a57506042548410155b1561395e575082600061389c82614808565b91506138a78261484a565b90506138b281613baa565b6004546040516001600160a01b03909116908290600081818185875af1925050503d80600081146138ff576040519150601f19603f3d011682016040523d82523d6000602084013e613904565b606091505b50506031546139149150836136f9565b60315560205461392490826136ed565b602055602180546001919060009061394090849060ff166157dc565b92506101000a81548160ff021916908360ff16021790555050613b08565b602154600160ff90911611801590613978575060385460ff165b801561398657506042548310155b15613a22575081600061399882614808565b91506139a38261484a565b6033546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146139f1576040519150601f19603f3d011682016040523d82523d6000602084013e6139f6565b606091505b5050603254613a069150836136f9565b603255602180546001919060009061394090849060ff166157dc565b602154600260ff90911611801590613a435750600154600160a81b900460ff165b8015613a5157506042548210155b15613ab2575080613a6181614808565b9050613a6c816148d8565b603054613a7990826136f9565b6030556021805460019190600090613a9590849060ff166157dc565b92506101000a81548160ff021916908360ff160217905550613b08565b600454600160a01b900460ff168015613ac9575084155b15613b0857613ad66149a0565b6021805460019190600090613aef90849060ff166157dc565b92506101000a81548160ff021916908360ff1602179055505b602154600460ff90911610613b2e576021805460ff19908116909155603b805490911690555b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613b7e57600080fd5b505af1158015613b92573d6000803e3d6000fd5b50506001805460ff60a01b1916905550505050505050565b6103e881118015613bbb5750804710155b156110d157600454600160a01b900460ff1615613c60576004546001600160a01b0316815a60408051600481526024810182526020810180516001600160e01b031663439370b160e01b1790529051919291613c1791906154a6565b600060405180830381858888f193505050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b606091505b50505050565b6004546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b6000806000603b60029054906101000a900460ff1680613cd45750603b54610100900460ff165b613d1b5760405162461bcd60e51b81526020600482015260186024820152772a3930b234b733903737ba103cb2ba1032b730b13632b21760411b6044820152606401610e13565b600080600080603b60019054906101000a900460ff168015613d465750603b5462010000900460ff16155b15613dc7576001600160a01b038916600081815260296020908152604091829020805460ff1916600190811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a2309850613dba613db36134c2565b89906134e5565b965087955086945061407a565b6001600160a01b038916600090815260286020526040902042600290910155603b546301000000900460ff1615613f4357603c54613e07906102586157c4565b421015613e8457613e216103e8612aa56003612a9f612732565b881115613e7f5760405162461bcd60e51b815260206004820152602660248201527f507572636861736520746f6f206c6172676520666f7220696e697469616c206f60448201526570656e696e6760d01b6064820152608401610e13565b613f1b565b6001600160a01b0389166000908152602860205260409020544211613ef65760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b6064820152608401610e13565b613f0142600f6157c4565b6001600160a01b038a166000908152602860205260409020555b613f2642600f6157c4565b6001600160a01b038a166000908152602860205260409020600101555b600c54600b54600854600a54600093613f63939092611edf9283916136ed565b9050613f7b8960076002015460076000015484614a1e565b602254939a50919750955093503410613fc857613f998560026136e1565b9450613fa68460026136e1565b9350613fb38360026136e1565b9250613fc584611edf81818b886136ed565b96505b613fdc89868686613fd76134c2565b614a8a565b91995096509150613fec84614aec565b61401061400b82612aa5600760030154876134e590919063ffffffff16565b613705565b61404861402f82612aa5600760010154876134e590919063ffffffff16565b600b54614043908490612aa59088906134e5565b614b4e565b61406e61406782612aa5600760050154876134e590919063ffffffff16565b6000614c32565b6140788286614ce4565b505b505050509250925092565b6000806000603b60029054906101000a900460ff166140e35760405162461bcd60e51b815260206004820152601a602482015279151c98591a5b99c81a5cc81b9bdd08195b98589b1959081e595d60321b6044820152606401610e13565b603b546301000000900460ff161561416b576001600160a01b038516600090815260286020526040902060010154421161416b5760405162461bcd60e51b815260206004820152602360248201527f596f75722073656c6c20636f6f6c646f776e20686173206e6f7420657870697260448201526232b21760e91b6064820152608401610e13565b6000614175612732565b9050603c54610e1061418791906157c4565b421080156141ad57506001600160a01b03861660009081526025602052604090205460ff165b15614236576141c26064612aa58360056134e5565b85106142365760405162461bcd60e51b815260206004820152603c60248201527f53656c6c207175616e7469747920746f6f206869676820666f72206c61756e6360448201527f682e2e2e20706c6561736520646f6e742064756d70206561726c7921000000006064820152608401610e13565b6036546001600160a01b0387166000908152602860209081526040822060029081015460059093529052600080516020615ad98339815191525461427b9082906136ed565b42111561428757614404565b60016000526002602052600080516020615af9833981519152546142ac9082906136ed565b4210156142d45760016000526002602052600080516020615c61833981519152549150614404565b60026000819052602052600080516020615be1833981519152546142f99082906136ed565b4210156143215760026000819052602052600080516020615a99833981519152549150614404565b60036000526002602052600080516020615a59833981519152546143469082906136ed565b42101561436e5760036000526002602052600080516020615c41833981519152549150614404565b60046000526002602052600080516020615ab9833981519152546143939082906136ed565b4210156143bb5760046000526002602052600080516020615c21833981519152549150614404565b60056000526002602052600080516020615ad9833981519152546143e09082906136ed565b4210156144045760056000526002602052600080516020615b818339815191525491505b60375460056000526002602052600080516020615bc18339815191525461443390606490612aa59087906134e5565b88101561443f576145da565b60016000526002602052600080516020615a198339815191525461446b90606490612aa59087906134e5565b8811156144925750600160005260026020526000805160206159d9833981519152546145da565b60026000819052602052600080516020615a39833981519152546144be90606490612aa59087906134e5565b8811156144e5575060026000819052602052600080516020615c01833981519152546145da565b600360005260026020526000805160206159f98339815191525461451190606490612aa59087906134e5565b881115614538575060036000526002602052600080516020615b39833981519152546145da565b60046000526002602052600080516020615b198339815191525461456490606490612aa59087906134e5565b88111561458b575060046000526002602052600080516020615ba1833981519152546145da565b60056000526002602052600080516020615bc1833981519152546145b790606490612aa59087906134e5565b8811156145da575060056000526002602052600080516020615a79833981519152545b828110156145e55750815b60006145f66064612aa58b856134e5565b905060006146048a836136f9565b9050600061461a6146136134c2565b8c906134e5565b905060006146306146296134c2565b84906134e5565b9050600061464e6064612aa5603454886134e590919063ffffffff16565b9050600061466c6064612aa5603554896134e590919063ffffffff16565b905060006146848261467e89866136f9565b906136f9565b9050614691836000614b4e565b61469b8282614c32565b50929b509299509750505050505050509250925092565b6001600160a01b0382166000908152602860205260408120426002909101556012546011546008546010548493849384938493849384938493849384938493614703939192611edf928391906136ed565b905061471b8c600d60020154600d6000015484614a1e565b929950909650945092506147348c868686613fd76134c2565b9199509650915061474484614aec565b61476361400b82612aa5600d60030154876134e590919063ffffffff16565b61479661478282612aa5600d60010154876134e590919063ffffffff16565b601154614043908490612aa59088906134e5565b6147b561406782612aa5600d60050154876134e590919063ffffffff16565b6147bf8286614ce4565b50959b949a50929850929650505050505050565b602c54602b5460009182916147e882826136e1565b8210156147ff57602c54602b549350935050509091565b90939092509050565b6000819050600061481d603a54612aa5612732565b90508083111561482b578091505b61483430611b28565b8211156148445761115130611b28565b50919050565b602f546040805160016209351760e01b0319815290516000926001600160a01b03169163fff6cae9916004808301928692919082900301818387803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b5050602e544792506148c4915030906001600160a01b031685612ed6565b6148ce3084614d08565b61115147826136f9565b60006148e58260026136e1565b905060006148f383836136f9565b602e5490915047906149109030906001600160a01b031685612ed6565b61491a3084614d08565b600061492647836136f9565b602e549091506149419030906001600160a01b031685612ed6565b600654614958906001600160a01b03168483614f09565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6005545a10611927576004546001600160a01b03166387174c765a6040518263ffffffff1660e01b8152600401602060405180830381600088803b1580156149e757600080fd5b5087f193505050508015614a18575060408051601f3d908101601f19168201909252614a159181019061531a565b60015b6110d157565b600080808080614a336064612aa58b8a6134e5565b90506000614a466064612aa58c8c6134e5565b90506000614a596064612aa58d8b6134e5565b90506000614a678c856136f9565b9050614a778261467e8e866136f9565b9c939b5091995097509095505050505050565b6000808080614a9989866134e5565b90506000614aa789876134e5565b90506000614ab589886134e5565b90506000614ac389896134e5565b90506000614ad78261467e858189896136f9565b949d949c50929a509298505050505050505050565b80614af45750565b6000614afe6134c2565b90506000614b0c83836134e5565b30600090815260236020526040902054909150614b2990826136ed565b30600090815260236020526040902055603054614b4690846136ed565b603055505050565b81158015614b5a575080155b15614b63575050565b6000614b6d6134c2565b90506000614b7b84836134e5565b90506000614b8f6003612aa58660026134e5565b90506000614ba184612a9f87856136f9565b90506000614baf83866134e5565b30600090815260236020526040902054909150614bd2908390611edf90876136ed565b30600081815260236020526040902091909155603d54614bfe91906001600160a01b0316868a816134f1565b603f54614c189030906001600160a01b03168489816134f1565b604054611de59030906001600160a01b03168386816134f1565b6000614c3c6134c2565b90508215614c8f576000614c5084836134e5565b30600090815260236020526040902054909150614c6d90826136ed565b30600090815260236020526040902055603154614c8a90856136ed565b603155505b81156110ce576000614ca183836134e5565b30600090815260236020526040902054909150614cbe90826136ed565b30600090815260236020526040902055603254614cdb90846136ed565b60325550505050565b602c54614cf190836136f9565b602c55602d54614d0190826136ed565b602d555050565b602e54614d209030906001600160a01b031683612ed6565b602e54614d389083906001600160a01b031683612ed6565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614d7b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015614dcf57600080fd5b505afa158015614de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e0791906150e4565b81600181518110614e2857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602f546040805160016209351760e01b031981529051919092169163fff6cae991600480830192600092919082900301818387803b158015614e7f57600080fd5b505af1158015614e93573d6000803e3d6000fd5b5050602e546001600160a01b0316915063791ac94790505a8460008588426040518763ffffffff1660e01b8152600401614ed19594939291906156ff565b600060405180830381600088803b158015614eeb57600080fd5b5087f1158015614eff573d6000803e3d6000fd5b5050505050505050565b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614f5957600080fd5b505af1158015614f6d573d6000803e3d6000fd5b5050602e546001600160a01b0316915063f305d71990505a6040516001600160e01b031960e084901b1681523060048201526024810186905260006044820181905260648201526001600160a01b03871660848201524260a4820152849060c4016060604051808303818589803b158015614fe757600080fd5b5088f1158015614ffb573d6000803e3d6000fd5b5050505050506040513d601f19601f8201168201806040525081019061348e91906153c9565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600082601f830112615059578081fd5b8135602061506e615069836157a0565b61576f565b80838252828201915082860187848660051b890101111561508d578586fd5b855b858110156150ab5781358452928401929084019060010161508f565b5090979650505050505050565b80356150c3816159ca565b919050565b6000602082840312156150d9578081fd5b8135611151816159b5565b6000602082840312156150f5578081fd5b8151611151816159b5565b60008060408385031215615112578081fd5b823561511d816159b5565b9150602083013561512d816159b5565b809150509250929050565b6000806000806080858703121561514d578182fd5b8435615158816159b5565b93506020850135615168816159b5565b92506040850135615178816159b5565b91506060850135615188816159b5565b939692955090935050565b6000806000606084860312156151a7578283fd5b83356151b2816159b5565b925060208401356151c2816159b5565b929592945050506040919091013590565b600080604083850312156151e5578182fd5b82356151f0816159b5565b9150602083013561512d816159ca565b60008060408385031215615212578182fd5b823561521d816159b5565b946020939093013593505050565b60008060006060848603121561523f578283fd5b833567ffffffffffffffff80821115615256578485fd5b818601915086601f830112615269578485fd5b81356020615279615069836157a0565b8083825282820191508286018b848660051b890101111561529857898afd5b8996505b848710156152c35780356152af816159b5565b83526001969096019591830191830161529c565b50975050870135925050808211156152d9578384fd5b506152e686828701615049565b9250506152f5604085016150b8565b90509250925092565b60006020828403121561530f578081fd5b8135611151816159ca565b60006020828403121561532b578081fd5b8151611151816159ca565b60008060006060848603121561534a578081fd5b8335615355816159ca565b925060208401356151c2816159ca565b600060208284031215615376578081fd5b5035919050565b6000806040838503121561538f578182fd5b50508035926020909101359150565b6000806000606084860312156153b2578081fd5b505081359360208301359350604090920135919050565b6000806000606084860312156153dd578081fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561540e578384fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080600080600060a0868803121561544f578283fd5b853560ff8116811461545f578384fd5b97602087013597506040870135966060810135965060800135945092505050565b805182526020810151602083015260408101516040830152606081015160608301525050565b600082516154b8818460208701615942565b9190910192915050565b60208152600082518060208401526154e1816040850160208701615942565b601f01601f19169190910160400192915050565b60208082526022908201527f4164647265737320616c72656164792073657420746f20746869732076616c75604082015261652160f01b606082015260800190565b60208082526022908201527f5a65726f2061646472657373206973206e6f7420612076616c69642063616c6c60408201526132b960f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f546869732066756e6374696f6e2063616e206f6e6c7920657665722062652063604082015269616c6c6564206f6e636560b01b606082015260800190565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a09283015192810192909252805460c0830152600181015460e0830152600281015461010083015260038101546101208301526004810154610140830152600501546101608201526101800190565b61028081016156838288615480565b6156906080830187615480565b61569e610100830186615480565b6156ac610180830185615480565b6156ba610200830184615480565b9695505050505050565b61010081016156d38285615480565b82546080830152600183015460a0830152600283015460c0830152600383015460e08301529392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561574e5784516001600160a01b031683529383019391830191600101615729565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156157985761579861599f565b604052919050565b600067ffffffffffffffff8211156157ba576157ba61599f565b5060051b60200190565b600082198211156157d7576157d7615989565b500190565b600060ff821660ff84168060ff038211156157f9576157f9615989565b019392505050565b60008261581c57634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561585c57816000190482111561584257615842615989565b8085161561584f57918102915b93841c9390800290615826565b509250929050565b6000611151838360008261587a57506001610de3565b8161588757506000610de3565b816001811461589d57600281146158a7576158c3565b6001915050610de3565b60ff8411156158b8576158b8615989565b50506001821b610de3565b5060208310610133831016604e8410600b84101617156158e6575081810a610de3565b6158f08383615821565b806000190482111561590457615904615989565b029392505050565b600081600019048311821515161561592657615926615989565b500290565b60008282101561593d5761593d615989565b500390565b60005b8381101561595d578181015183820152602001615945565b83811115613c5a5750506000910152565b600060001982141561598257615982615989565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110d157600080fd5b80151581146110d157600080fdfee90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e388601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c5e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e2679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28e88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e387679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28dee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6918fb98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e384e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919188601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c645524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e385ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a69192b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e386679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28fee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919088601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e145524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a998ebd315c8bc806c6b7eeba04ebad68bb236645907797e79a2f1b14495a01664736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000e8d4a51000
-----Decoded View---------------
Arg [0] : _supply (uint256): 1000000000000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000e8d4a51000
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.