ERC-20
DeFi
Overview
Max Total Supply
9,990,189,219.390606649310973386 MTGX
Holders
344 (0.00%)
Market
Price
$0.00 @ 0.000000 ETH (+0.82%)
Onchain Market Cap
$115,186.88
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000099999963348992 MTGXValue
$0.00 ( ~0 Eth) [0.0000%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|---|---|---|---|---|
1 | Uniswap V2 (Ethereum) | 0X06D6F0DD6703A1CFE16025DCC55F36F017887627-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $0.00 0.0000000 Eth | $68.76 5,955,228.632 0X06D6F0DD6703A1CFE16025DCC55F36F017887627 | 100.0000% |
Contract Name:
MontageToken
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion, Audited
Contract Source Code (Solidity Standard Json-Input format)Audit Report
// SPDX-License-Identifier: MIT // Attention all users! // Montage Token takes a strong stance against any form of malicious trading behaviour. We prioritize the safety & security of our community and our enabling ecosystem. // Any user (BOT or human) engaging in activities that threaten the integrity of our services, such as interfering with transactions, will be swiftly identified and blacklisted. // This means permanently restricted from accessing our services. We urge all users to adhere to ethical practices when trading our token and respect these terms of service. // Let us work together to maintain a trusted and secure environment for all Montage investors worldwide. pragma solidity 0.8.19; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IFactory { function createPair(address tokenA, address tokenB) external returns (address pair); function getPair(address tokenA, address tokenB) external view returns (address pair); } interface IRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } 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" ); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } 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" ); } 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); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } 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); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } 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 { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract MontageToken is Ownable, ERC20 { using Address for address; IRouter public uniswapV2Router; address public uniswapV2Pair; string private constant _name = "Montage Token"; string private constant _symbol = "MTGX"; bool public isTradingEnabled; uint256 public initialSupply = 10000000000 * (10**18); uint256 public maxWalletAmount = initialSupply * 200 / 10000; bool private _swapping; uint256 public minimumTokensBeforeSwap = initialSupply - (initialSupply - 1); uint256 public acceptableSlippagePercent= 0; address public targetAWallet; address public targetBWallet; address public targetCWallet; struct CustomTaxPeriod { uint32 targetAFeeOnBuy; //liquidity uint32 targetAFeeOnSell; uint32 targetBFeeOnBuy; //marketing uint32 targetBFeeOnSell; uint32 targetCFeeOnBuy; //charity uint32 targetCFeeOnSell; uint32 burnFeeOnBuy; uint32 burnFeeOnSell; } // Base taxes CustomTaxPeriod private _base = CustomTaxPeriod(0, 618, 1000, 1000, 0, 1000, 0, 382); bool private _pairCreated; bool private _launchTokensClaimed; uint256 private _launchBlockNumber; mapping (address => bool) private _isBlocked; mapping(address => bool) private _isAllowedToTradeWhenDisabled; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromMaxWalletLimit; mapping(address => bool) public automatedMarketMakerPairs; uint32 private _targetAFee; uint32 private _targetBFee; uint32 private _targetCFee; uint32 private _burnFee; uint32 private _totalFee; event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value); event BlockedAccountChange(address indexed holder, bool indexed status); event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress); event WalletChange(string indexed indentifier,address indexed newWallet,address indexed oldWallet); event FeeChange(string indexed identifier,uint32 targetAFee, uint32 targetBFee, uint32 targetCFee, uint32 burnFee); event CustomTaxPeriodChange(uint256 indexed newValue,uint256 indexed oldValue,string indexed taxType); event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue); event ExcludeFromFeesChange(address indexed account, bool isExcluded); event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded); event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded); event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue); event ClaimOverflow(address token, uint256 amount); event TradingStatusChange(bool indexed newValue, bool indexed oldValue); event Liquify(uint256 ethReceived, uint256 tokensIntoLiqudity); event FeesApplied(uint32 targetAFee, uint32 targetBFee, uint32 targetCFee, uint32 burnFee, uint32 totalFee); event TokenBurn(uint32 burnFee, uint256 amountToBurn); constructor() ERC20(_name, _symbol) { targetAWallet = owner(); targetBWallet = owner(); targetCWallet = owner(); IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isAllowedToTradeWhenDisabled[owner()] = true; _isAllowedToTradeWhenDisabled[address(this)] = true; _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true; _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true; _isExcludedFromMaxWalletLimit[address(this)] = true; _isExcludedFromMaxWalletLimit[owner()] = true; _mint(owner(), initialSupply); } receive() external payable {} function activateTrading() external onlyOwner { isTradingEnabled = true; if(_launchBlockNumber == 0) { _launchBlockNumber = block.number; } emit TradingStatusChange(true, false); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value, "Montage: Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; emit AutomatedMarketMakerPairChange(pair, value); } function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner { _isAllowedToTradeWhenDisabled[account] = allowed; emit AllowedWhenTradingDisabledChange(account, allowed); } function blockAccount(address account) external onlyOwner { require(!_isBlocked[account], "Montage: Account is already blocked"); _isBlocked[account] = true; emit BlockedAccountChange(account, true); } function unblockAccount(address account) external onlyOwner { require(_isBlocked[account], "Montage: Account is not blcoked"); _isBlocked[account] = false; emit BlockedAccountChange(account, false); } function excludeFromFees(address account, bool excluded) external onlyOwner { require(_isExcludedFromFee[account] != excluded,"Montage: Account is already the value of 'excluded'"); _isExcludedFromFee[account] = excluded; emit ExcludeFromFeesChange(account, excluded); } function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner { require(_isExcludedFromMaxWalletLimit[account] != excluded,"Montage: Account is already the value of 'excluded'"); _isExcludedFromMaxWalletLimit[account] = excluded; emit ExcludeFromMaxWalletChange(account, excluded); } function setWallets(address newTargetAWallet, address newTargetBWallet, address newTargetCWallet) external onlyOwner { if (targetAWallet != newTargetAWallet) { require(newTargetAWallet != address(0), "Montage: The targetAWallet cannot be 0"); emit WalletChange("targetAWallet", newTargetAWallet, targetAWallet); targetAWallet = newTargetAWallet; } if (targetBWallet != newTargetBWallet) { require(newTargetBWallet != address(0), "Montage: The targetBWallet cannot be 0"); emit WalletChange("targetBWallet", newTargetBWallet, targetBWallet); targetBWallet = newTargetBWallet; } if (targetCWallet != newTargetCWallet) { require(newTargetCWallet != address(0), "Montage: The targetCWallet cannot be 0"); emit WalletChange("targetCWallet", newTargetCWallet, targetCWallet); targetCWallet = newTargetCWallet; } } function setFeesOnBuy(uint32 _targetAFeeOnBuy, uint32 _targetBFeeOnBuy, uint32 _targetCFeeOnBuy, uint32 _burnFeeOnBuy) external onlyOwner { require(_targetAFeeOnBuy + _targetBFeeOnBuy + _targetCFeeOnBuy + _burnFeeOnBuy <= 5000, "Montage: Fees must be less or equal to 5.00%"); _setCustomBuyTaxPeriod(_base,_targetAFeeOnBuy,_targetBFeeOnBuy, _targetCFeeOnBuy, _burnFeeOnBuy); emit FeeChange("baseFees-Buy",_targetAFeeOnBuy,_targetBFeeOnBuy, _targetCFeeOnBuy, _burnFeeOnBuy); } function setFeesOnSell(uint32 _targetAFeeOnSell, uint32 _targetBFeeOnSell, uint32 _targetCFeeOnSell, uint32 _burnFeeOnSell) external onlyOwner { require(_targetAFeeOnSell + _targetBFeeOnSell + _targetCFeeOnSell + _burnFeeOnSell <= 5000, "Montage: Fees must be less or equal to 5.00%"); _setCustomSellTaxPeriod(_base,_targetAFeeOnSell, _targetBFeeOnSell, _targetCFeeOnSell, _burnFeeOnSell); emit FeeChange("baseFees-Sell",_targetAFeeOnSell, _targetBFeeOnSell, _targetCFeeOnSell, _burnFeeOnSell); } function setUniswapRouter(address newAddress) external onlyOwner { require(newAddress != address(uniswapV2Router),"Montage: The router already has that address"); emit UniswapV2RouterChange(newAddress, address(uniswapV2Router)); uniswapV2Router = IRouter(newAddress); } function setMaxWalletAmount(uint256 newValue) external onlyOwner { require(newValue >= totalSupply() * 10 / 1000, "Montage: Max wallet value must be greater than or equal to 1% of supply"); require(newValue != maxWalletAmount,"Montage: Cannot update maxWalletAmount to same value"); emit MaxWalletAmountChange(newValue, maxWalletAmount); maxWalletAmount = newValue; } function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner { require(newValue != minimumTokensBeforeSwap,"Montage: Cannot update minimumTokensBeforeSwap to same value"); emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap); minimumTokensBeforeSwap = newValue; } function claimLaunchTokens() external onlyOwner { require(block.number - _launchBlockNumber > 5, "Montage: Only claim launch tokens after first 5 blocks"); require(!_launchTokensClaimed, "Montage: Launch tokens have been claimed"); _launchTokensClaimed = true; uint256 tokenBalance = balanceOf(address(this)); (bool success) = IERC20(address(this)).transfer(owner(), tokenBalance); if (success){ emit ClaimOverflow(address(this), tokenBalance); } } function claimETHOverflow(uint256 amount) external onlyOwner { require(amount <= address(this).balance, "Montage: Cannot send more than contract balance"); (bool success, ) = address(owner()).call{ value: amount }(""); if (success) { emit ClaimOverflow(uniswapV2Router.WETH(), amount); } } function setAcceptableSlippage(uint256 value) external onlyOwner { require (value <= 1000, "Montage: Acceptable slippage cannot be more than 100%!") ; acceptableSlippagePercent = value; } // Getters function getBuyFees() external view returns (uint32, uint32, uint32, uint32) { return (_base.targetAFeeOnBuy, _base.targetBFeeOnBuy, _base.targetCFeeOnBuy, _base.burnFeeOnBuy); } function getSellFees() external view returns (uint32, uint32, uint32, uint32) { return (_base.targetAFeeOnSell, _base.targetBFeeOnSell, _base.targetCFeeOnSell, _base.burnFeeOnSell); } // Main function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(!_isBlocked[to], "Montage: Account is blocked"); require(!_isBlocked[from], "Montage: Account is blocked"); if (amount == 0) { super._transfer(from, to, 0); return; } if (!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) { require(isTradingEnabled, "Montage: Trading is currently disabled."); } _adjustTaxes(automatedMarketMakerPairs[from], automatedMarketMakerPairs[to]); bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap; if ( isTradingEnabled && canSwap && !_swapping && _totalFee > 0 && automatedMarketMakerPairs[to] ) { _swapping = true; _swapAndTransfer(); _swapping = false; } bool takeFee = !_swapping && isTradingEnabled; if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { takeFee = false; } if (takeFee && _totalFee > 0) { uint256 fee = (amount * _totalFee) / 100000; amount = amount - fee; super._transfer(from, address(this), fee); } if (!_isExcludedFromMaxWalletLimit[to]) { require((balanceOf(to) + amount) <= maxWalletAmount, "Montage: Expected wallet amount exceeds the maxWalletAmount."); } super._transfer(from, to, amount); } function _adjustTaxes(bool isBuy,bool isSell) private { _targetAFee = 0; _targetBFee = 0; _targetCFee = 0; _burnFee = 0; if (isBuy) { if (block.number - _launchBlockNumber <= 5) { _targetAFee = 100000; } else { _targetAFee = _base.targetAFeeOnBuy; _targetBFee = _base.targetBFeeOnBuy; _targetCFee = _base.targetCFeeOnBuy; _burnFee = _base.burnFeeOnBuy; } } if (isSell) { _targetAFee = _base.targetAFeeOnSell; _targetBFee = _base.targetBFeeOnSell; _targetCFee = _base.targetCFeeOnSell; _burnFee = _base.burnFeeOnSell; } _totalFee = _targetAFee + _targetBFee + _targetCFee + _burnFee; emit FeesApplied(_targetAFee, _targetBFee, _targetCFee, _burnFee, _totalFee); } function _setCustomSellTaxPeriod(CustomTaxPeriod storage map, uint32 _targetAFeeOnSell, uint32 _targetBFeeOnSell, uint32 _targetCFeeOnSell, uint32 _burnFeeOnSell ) private { if (map.targetAFeeOnSell != _targetAFeeOnSell) { emit CustomTaxPeriodChange(_targetAFeeOnSell,map.targetAFeeOnSell,"targetAFeeOnSell"); map.targetAFeeOnSell = _targetAFeeOnSell; } if (map.targetBFeeOnSell != _targetBFeeOnSell) { emit CustomTaxPeriodChange(_targetBFeeOnSell,map.targetBFeeOnSell,"targetBFeeOnSell"); map.targetBFeeOnSell = _targetBFeeOnSell; } if (map.targetCFeeOnSell != _targetCFeeOnSell) { emit CustomTaxPeriodChange(_targetCFeeOnSell,map.targetCFeeOnSell,"targetCFeeOnSell"); map.targetCFeeOnSell = _targetCFeeOnSell; } if (map.burnFeeOnSell != _burnFeeOnSell) { emit CustomTaxPeriodChange(_burnFeeOnSell,map.burnFeeOnSell,"burnFeeOnSell"); map.burnFeeOnSell = _burnFeeOnSell; } } function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map, uint32 _targetAFeeOnBuy, uint32 _targetBFeeOnBuy, uint32 _targetCFeeOnBuy, uint32 _burnFeeOnBuy) private { if (map.targetAFeeOnBuy != _targetAFeeOnBuy) { emit CustomTaxPeriodChange(_targetAFeeOnBuy,map.targetAFeeOnBuy,"targetAFeeOnBuy"); map.targetAFeeOnBuy = _targetAFeeOnBuy; } if (map.targetBFeeOnBuy != _targetBFeeOnBuy) { emit CustomTaxPeriodChange(_targetBFeeOnBuy,map.targetBFeeOnBuy,"targetBFeeOnBuy"); map.targetBFeeOnBuy = _targetBFeeOnBuy; } if (map.targetCFeeOnBuy != _targetCFeeOnBuy) { emit CustomTaxPeriodChange(_targetCFeeOnBuy,map.targetCFeeOnBuy,"targetCFeeOnBuy"); map.targetCFeeOnBuy = _targetCFeeOnBuy; } if (map.burnFeeOnBuy != _burnFeeOnBuy) { emit CustomTaxPeriodChange(_burnFeeOnBuy,map.burnFeeOnBuy,"burnFeeOnBuy"); map.burnFeeOnBuy = _burnFeeOnBuy; } } function _swapAndTransfer() private { uint256 contractBalance = balanceOf(address(this)); uint256 initialETHBalance = address(this).balance; uint32 _totalFeePrior = _totalFee; uint256 amountToLiquify = contractBalance * _targetAFee / _totalFeePrior / 2; uint256 amountToBurn = contractBalance * _burnFee / _totalFeePrior; uint256 amountToSwap = contractBalance - amountToLiquify - amountToBurn; if (amountToBurn > 0) { super._burn(address(this), amountToBurn); emit TokenBurn(_burnFee, amountToBurn); } _swapTokensForETH(amountToSwap); uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance; uint256 totalETHFee = _totalFeePrior - (_targetAFee / 2) - _burnFee; uint256 amountETHTargetA = ETHBalanceAfterSwap * _targetAFee / totalETHFee / 2; uint256 amountETHTargetB = ETHBalanceAfterSwap * _targetBFee / totalETHFee; uint256 amountETHTargetC = ETHBalanceAfterSwap - amountETHTargetA - amountETHTargetB; Address.sendValue(payable(targetBWallet),amountETHTargetB); Address.sendValue(payable(targetCWallet),amountETHTargetC); if (amountToLiquify > 0) { _addLiquidity(amountToLiquify, amountETHTargetA); emit Liquify(amountETHTargetA, amountToLiquify); } _totalFee = _totalFeePrior; } function _swapTokensForETH(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uint256 minAmountOut; if (acceptableSlippagePercent == 0) { // Disable slippage protection if zero is set to acceptableSlippagePercent (it would always revert otherwise) minAmountOut = 0; } else { // Determine the minimum out token percentage ie. if tokenAmount was 100 and 20% was the acceptable slippage, // the result will be 20 tokens. uint256 minAmountOutPercentage = (tokenAmount * acceptableSlippagePercent) / 1000; //1 Determine the min amount out by subtracting total token amount the min out percentage so // the final result would be at least 80 tokens out. minAmountOut = tokenAmount - minAmountOutPercentage; } uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, minAmountOut, path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{ value: ethAmount }( address(this), tokenAmount, 1, // slippage is unavoidable 1, // slippage is unavoidable targetAWallet, block.timestamp ); } }
{ "optimizer": { "enabled": true, "runs": 100 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- Hashlock- Oct , 2023 - Security Audit Report
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockedAccountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint32","name":"targetAFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"targetBFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"targetCFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"burnFee","type":"uint32"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"targetAFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"targetBFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"targetCFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"burnFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"totalFee","type":"uint32"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"Liquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"burnFee","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"TokenBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"newValue","type":"bool"},{"indexed":true,"internalType":"bool","name":"oldValue","type":"bool"}],"name":"TradingStatusChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"inputs":[],"name":"acceptableSlippagePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimLaunchTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBuyFees","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellFees","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"}],"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":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setAcceptableSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_targetAFeeOnBuy","type":"uint32"},{"internalType":"uint32","name":"_targetBFeeOnBuy","type":"uint32"},{"internalType":"uint32","name":"_targetCFeeOnBuy","type":"uint32"},{"internalType":"uint32","name":"_burnFeeOnBuy","type":"uint32"}],"name":"setFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_targetAFeeOnSell","type":"uint32"},{"internalType":"uint32","name":"_targetBFeeOnSell","type":"uint32"},{"internalType":"uint32","name":"_targetCFeeOnSell","type":"uint32"},{"internalType":"uint32","name":"_burnFeeOnSell","type":"uint32"}],"name":"setFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTargetAWallet","type":"address"},{"internalType":"address","name":"newTargetBWallet","type":"address"},{"internalType":"address","name":"newTargetCWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetAWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetBWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetCWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526b204fce5e3e2502611000000060085561271060085460c86200002891906200069e565b620000349190620006be565b6009556001600854620000489190620006e1565b600854620000579190620006e1565b600b556000600c819055604080516101008101825282815261026a60208201526103e8918101829052606081018290526080810183905260a081019190915260c081019190915261017e60e0909101527d017e00000000000003e800000000000003e8000003e80000026a00000000601055348015620000d657600080fd5b506040518060400160405280600d81526020016c26b7b73a30b3b2902a37b5b2b760991b8152506040518060400160405280600481526020016309aa88eb60e31b81525060006200012c620004c060201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060046200018483826200079b565b5060056200019382826200079b565b505060008054600d80546001600160a01b039092166001600160a01b03199283168117909155600e8054831682179055600f80549092161790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9350839163c45a01559160048083019260209291908290030181865afa15801562000221573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000247919062000867565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000867565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000309573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032f919062000867565b600680546001600160a01b038086166001600160a01b031992831617909255600780549284169290911691909117905590506200036e816001620004c4565b600160156000620003876000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526015909252812080549092166001908117909255601490620003e06000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530808252601485528382208054871660019081179091558784168352601695869052848320805488168217905560065490931682528382208054871684179055815291822080549094168117909355620004706000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620004b8620004af6000546001600160a01b031690565b600854620005be565b5050620008af565b3390565b6001600160a01b03821660009081526017602052604090205481151560ff9091161515036200056a5760405162461bcd60e51b815260206004820152604160248201527f4d6f6e746167653a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a4015b60405180910390fd5b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a91a35050565b6001600160a01b038216620006165760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000561565b80600360008282546200062a919062000899565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620006b857620006b862000688565b92915050565b600082620006dc57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115620006b857620006b862000688565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200072257607f821691505b6020821081036200074357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200068357600081815260208120601f850160051c81016020861015620007725750805b601f850160051c820191505b8181101562000793578281556001016200077e565b505050505050565b81516001600160401b03811115620007b757620007b7620006f7565b620007cf81620007c884546200070d565b8462000749565b602080601f831160018114620008075760008415620007ee5750858301515b600019600386901b1c1916600185901b17855562000793565b600085815260208120601f198616915b82811015620008385788860151825594840194600190910190840162000817565b5085821015620008575787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200087a57600080fd5b81516001600160a01b03811681146200089257600080fd5b9392505050565b80820180821115620006b857620006b862000688565b61355980620008bf6000396000f3fe6080604052600436106102555760003560e01c806375cb1bd111610139578063aa4bde28116100b6578063d2d7ad831161007a578063d2d7ad8314610742578063d322157614610758578063dd62ed3e14610778578063df42818914610798578063e3ed417f146107ae578063f2fde38b146107ce57600080fd5b8063aa4bde281461069c578063aee50b1e146106b2578063b62496f5146106d2578063bea9849e14610702578063c02466681461072257600080fd5b80638da5cb5b116100fd5780638da5cb5b146106095780639451cca61461062757806395d89b4114610647578063a457c2d71461065c578063a9059cbb1461067c57600080fd5b806375cb1bd114610569578063781edb3c146105895780637c0a893d146105a95780637e3e7650146105c957806389af1725146105e957600080fd5b806327a14fc2116101d257806346c23dae1161019657806346c23dae1461049457806349bd5a5e146104b45780634d78fdc6146104d4578063685fc568146104f457806370a0823114610534578063715018a61461055457600080fd5b806327a14fc21461040d5780632cc25d141461042d578063313ce56714610442578063378dc3dc1461045e578063395093511461047457600080fd5b80630bd05b69116102195780630bd05b69146103615780631694505e1461037657806318160ddd146103ae5780631eb9caec146103cd57806323b872dd146103ed57600080fd5b80630644e75714610261578063064a59d0146102cc57806306fdde03146102fd578063095ea7b31461031f578063098df5851461033f57600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b5060105463ffffffff80821691600160401b8104821691600160801b8204811691600160c01b9004165b6040805163ffffffff958616815293851660208501529184169183019190915290911660608201526080015b60405180910390f35b3480156102d857600080fd5b506007546102ed90600160a01b900460ff1681565b60405190151581526020016102c3565b34801561030957600080fd5b506103126107ee565b6040516102c39190612ef0565b34801561032b57600080fd5b506102ed61033a366004612f56565b610880565b34801561034b57600080fd5b5061035f61035a366004612f82565b61089a565b005b34801561036d57600080fd5b5061035f610a3a565b34801561038257600080fd5b50600654610396906001600160a01b031681565b6040516001600160a01b0390911681526020016102c3565b3480156103ba57600080fd5b506003545b6040519081526020016102c3565b3480156103d957600080fd5b50600f54610396906001600160a01b031681565b3480156103f957600080fd5b506102ed610408366004612f9b565b610ab6565b34801561041957600080fd5b5061035f610428366004612f82565b610ada565b34801561043957600080fd5b5061035f610c4b565b34801561044e57600080fd5b50604051601281526020016102c3565b34801561046a57600080fd5b506103bf60085481565b34801561048057600080fd5b506102ed61048f366004612f56565b610e2a565b3480156104a057600080fd5b5061035f6104af366004612ff5565b610e4c565b3480156104c057600080fd5b50600754610396906001600160a01b031681565b3480156104e057600080fd5b5061035f6104ef366004613049565b610f44565b34801561050057600080fd5b5060105463ffffffff600160201b8204811691600160601b8104821691600160a01b8204811691600160e01b900416610297565b34801561054057600080fd5b506103bf61054f366004613049565b611023565b34801561056057600080fd5b5061035f61103e565b34801561057557600080fd5b5061035f61058436600461306d565b6110b2565b34801561059557600080fd5b5061035f6105a43660046130c6565b61137e565b3480156105b557600080fd5b5061035f6105c4366004613049565b611448565b3480156105d557600080fd5b5061035f6105e4366004612ff5565b611539565b3480156105f557600080fd5b50600e54610396906001600160a01b031681565b34801561061557600080fd5b506000546001600160a01b0316610396565b34801561063357600080fd5b5061035f610642366004612f82565b6115d5565b34801561065357600080fd5b50610312611675565b34801561066857600080fd5b506102ed610677366004612f56565b611684565b34801561068857600080fd5b506102ed610697366004612f56565b6116ff565b3480156106a857600080fd5b506103bf60095481565b3480156106be57600080fd5b5061035f6106cd366004612f82565b61170d565b3480156106de57600080fd5b506102ed6106ed366004613049565b60176020526000908152604090205460ff1681565b34801561070e57600080fd5b5061035f61071d366004613049565b6117e1565b34801561072e57600080fd5b5061035f61073d3660046130c6565b6118db565b34801561074e57600080fd5b506103bf600b5481565b34801561076457600080fd5b5061035f6107733660046130c6565b61199d565b34801561078457600080fd5b506103bf6107933660046130ff565b611a1f565b3480156107a457600080fd5b506103bf600c5481565b3480156107ba57600080fd5b50600d54610396906001600160a01b031681565b3480156107da57600080fd5b5061035f6107e9366004613049565b611a4a565b6060600480546107fd9061312d565b80601f01602080910402602001604051908101604052809291908181526020018280546108299061312d565b80156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b5050505050905090565b60003361088e818585611b34565b60019150505b92915050565b6000546001600160a01b031633146108cd5760405162461bcd60e51b81526004016108c490613167565b60405180910390fd5b478111156109355760405162461bcd60e51b815260206004820152602f60248201527f4d6f6e746167653a2043616e6e6f742073656e64206d6f7265207468616e206360448201526e6f6e74726163742062616c616e636560881b60648201526084016108c4565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610982576040519150601f19603f3d011682016040523d82523d6000602084013e610987565b606091505b505090508015610a3657600654604080516315ab88c960e31b815290517fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156109fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1e919061319c565b83604051610a2d9291906131b9565b60405180910390a15b5050565b6000546001600160a01b03163314610a645760405162461bcd60e51b81526004016108c490613167565b6007805460ff60a01b1916600160a01b179055601254600003610a8657436012555b6040516000906001907fa0f694e30e34d9f05d12691b612650129ed8888d1f93b25fa0cd92e4416a8338908390a3565b600033610ac4858285611c58565b610acf858585611cd2565b506001949350505050565b6000546001600160a01b03163314610b045760405162461bcd60e51b81526004016108c490613167565b6103e8610b1060035490565b610b1b90600a6131e8565b610b259190613215565b811015610baa5760405162461bcd60e51b815260206004820152604760248201527f4d6f6e746167653a204d61782077616c6c65742076616c7565206d757374206260448201527f652067726561746572207468616e206f7220657175616c20746f203125206f6660648201526620737570706c7960c81b608482015260a4016108c4565b6009548103610c185760405162461bcd60e51b815260206004820152603460248201527f4d6f6e746167653a2043616e6e6f7420757064617465206d617857616c6c6574604482015273416d6f756e7420746f2073616d652076616c756560601b60648201526084016108c4565b60095460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600955565b6000546001600160a01b03163314610c755760405162461bcd60e51b81526004016108c490613167565b600560125443610c859190613229565b11610cf15760405162461bcd60e51b815260206004820152603660248201527f4d6f6e746167653a204f6e6c7920636c61696d206c61756e636820746f6b656e60448201527573206166746572206669727374203520626c6f636b7360501b60648201526084016108c4565b601154610100900460ff1615610d5a5760405162461bcd60e51b815260206004820152602860248201527f4d6f6e746167653a204c61756e636820746f6b656e732068617665206265656e6044820152670818db185a5b595960c21b60648201526084016108c4565b6011805461ff0019166101001790556000610d7430611023565b905060003063a9059cbb610d906000546001600160a01b031690565b846040518363ffffffff1660e01b8152600401610dae9291906131b9565b6020604051808303816000875af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df1919061323c565b90508015610a36577fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d3083604051610a2d9291906131b9565b60003361088e818585610e3d8383611a1f565b610e479190613259565b611b34565b6000546001600160a01b03163314610e765760405162461bcd60e51b81526004016108c490613167565b6113888183610e85868861326c565b610e8f919061326c565b610e99919061326c565b63ffffffff161115610ebd5760405162461bcd60e51b81526004016108c490613290565b610ecb6010858585856120b0565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822063ffffffff878116845286811660208501528581168484015284166060840152905190917f7b97950369e93390b14c04dce6a31544c90c43a3c45340c762e98b909be00ee8919081900360800190a250505050565b6000546001600160a01b03163314610f6e5760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03811660009081526013602052604090205460ff16610fd65760405162461bcd60e51b815260206004820152601f60248201527f4d6f6e746167653a204163636f756e74206973206e6f7420626c636f6b65640060448201526064016108c4565b6001600160a01b038116600081815260136020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633146110685760405162461bcd60e51b81526004016108c490613167565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110dc5760405162461bcd60e51b81526004016108c490613167565b600d546001600160a01b038481169116146111bb576001600160a01b0383166111565760405162461bcd60e51b815260206004820152602660248201527f4d6f6e746167653a20546865207461726765744157616c6c65742063616e6e6f60448201526507420626520360d41b60648201526084016108c4565b600d80546040516c1d185c99d95d1055d85b1b195d609a1b81526001600160a01b039182169291861691016040519081900381209060008051602061350483398151915290600090a4600d80546001600160a01b0319166001600160a01b0385161790555b600e546001600160a01b0383811691161461129a576001600160a01b0382166112355760405162461bcd60e51b815260206004820152602660248201527f4d6f6e746167653a20546865207461726765744257616c6c65742063616e6e6f60448201526507420626520360d41b60648201526084016108c4565b600e546040516c1d185c99d95d1095d85b1b195d609a1b81526001600160a01b0391821691841690600d016040519081900381209060008051602061350483398151915290600090a4600e80546001600160a01b0319166001600160a01b0384161790555b600f546001600160a01b03828116911614611379576001600160a01b0381166113145760405162461bcd60e51b815260206004820152602660248201527f4d6f6e746167653a20546865207461726765744357616c6c65742063616e6e6f60448201526507420626520360d41b60648201526084016108c4565b600f546040516c1d185c99d95d10d5d85b1b195d609a1b81526001600160a01b0391821691831690600d016040519081900381209060008051602061350483398151915290600090a4600f80546001600160a01b0319166001600160a01b0383161790555b505050565b6000546001600160a01b031633146113a85760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036113e85760405162461bcd60e51b81526004016108c4906132dc565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146114725760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03811660009081526013602052604090205460ff16156114e75760405162461bcd60e51b815260206004820152602360248201527f4d6f6e746167653a204163636f756e7420697320616c726561647920626c6f636044820152621ad95960ea1b60648201526084016108c4565b6001600160a01b038116600081815260136020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6000546001600160a01b031633146115635760405162461bcd60e51b81526004016108c490613167565b6113888183611572868861326c565b61157c919061326c565b611586919061326c565b63ffffffff1611156115aa5760405162461bcd60e51b81526004016108c490613290565b6115b86010858585856122c9565b6040516b62617365466565732d42757960a01b8152600c01610ee5565b6000546001600160a01b031633146115ff5760405162461bcd60e51b81526004016108c490613167565b6103e88111156116705760405162461bcd60e51b815260206004820152603660248201527f4d6f6e746167653a2041636365707461626c6520736c6970706167652063616e6044820152756e6f74206265206d6f7265207468616e20313030252160501b60648201526084016108c4565b600c55565b6060600580546107fd9061312d565b600033816116928286611a1f565b9050838110156116f25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108c4565b610acf8286868403611b34565b60003361088e818585611cd2565b6000546001600160a01b031633146117375760405162461bcd60e51b81526004016108c490613167565b600b5481036117ae5760405162461bcd60e51b815260206004820152603c60248201527f4d6f6e746167653a2043616e6e6f7420757064617465206d696e696d756d546f60448201527f6b656e734265666f72655377617020746f2073616d652076616c75650000000060648201526084016108c4565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b0316331461180b5760405162461bcd60e51b81526004016108c490613167565b6006546001600160a01b039081169082160361187e5760405162461bcd60e51b815260206004820152602c60248201527f4d6f6e746167653a2054686520726f7574657220616c7265616479206861732060448201526b74686174206164647265737360a01b60648201526084016108c4565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119055760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036119455760405162461bcd60e51b81526004016108c4906132dc565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b910161143c565b6000546001600160a01b031633146119c75760405162461bcd60e51b81526004016108c490613167565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d350910161143c565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b03163314611a745760405162461bcd60e51b81526004016108c490613167565b6001600160a01b038116611ad95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611b965760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108c4565b6001600160a01b038216611bf75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108c4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611c648484611a1f565b90506000198114611ccc5781811015611cbf5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108c4565b611ccc8484848403611b34565b50505050565b6001600160a01b038316611cf85760405162461bcd60e51b81526004016108c49061332f565b6001600160a01b038216611d1e5760405162461bcd60e51b81526004016108c490613374565b6001600160a01b03821660009081526013602052604090205460ff1615611d575760405162461bcd60e51b81526004016108c4906133b7565b6001600160a01b03831660009081526013602052604090205460ff1615611d905760405162461bcd60e51b81526004016108c4906133b7565b80600003611da457611379838360006124c7565b6001600160a01b03831660009081526014602052604090205460ff16158015611de657506001600160a01b03821660009081526014602052604090205460ff16155b15611e5457600754600160a01b900460ff16611e545760405162461bcd60e51b815260206004820152602760248201527f4d6f6e746167653a2054726164696e672069732063757272656e746c7920646960448201526639b0b13632b21760c91b60648201526084016108c4565b6001600160a01b03808416600090815260176020526040808220549285168252902054611e879160ff90811691166125f8565b6000600b54611e9530611023565b6007549111159150600160a01b900460ff168015611eb05750805b8015611ebf5750600a5460ff16155b8015611ed95750601854600160801b900463ffffffff1615155b8015611efd57506001600160a01b03831660009081526017602052604090205460ff165b15611f2257600a805460ff19166001179055611f176127fd565b600a805460ff191690555b600a5460009060ff16158015611f415750600754600160a01b900460ff165b6001600160a01b03861660009081526015602052604090205490915060ff1680611f8357506001600160a01b03841660009081526015602052604090205460ff165b15611f8c575060005b808015611fa75750601854600160801b900463ffffffff1615155b15611ff357601854600090620186a090611fce90600160801b900463ffffffff16866131e8565b611fd89190613215565b9050611fe48185613229565b9350611ff18630836124c7565b505b6001600160a01b03841660009081526016602052604090205460ff1661209e576009548361202086611023565b61202a9190613259565b111561209e5760405162461bcd60e51b815260206004820152603c60248201527f4d6f6e746167653a2045787065637465642077616c6c657420616d6f756e742060448201527f6578636565647320746865206d617857616c6c6574416d6f756e742e0000000060648201526084016108c4565b6120a98585856124c7565b5050505050565b845463ffffffff858116600160201b9092041614612136576040516f1d185c99d95d1051995953db94d95b1b60821b81526010016040519081900381208654909163ffffffff600160201b9092048216918716906000805160206134e483398151915290600090a4845467ffffffff000000001916600160201b63ffffffff8616021785555b845463ffffffff848116600160601b90920416146121bb576040516f1d185c99d95d1091995953db94d95b1b60821b81526010016040519081900381208654909163ffffffff600160601b9092048216918616906000805160206134e483398151915290600090a4845463ffffffff60601b1916600160601b63ffffffff8516021785555b845463ffffffff838116600160a01b9092041614612240576040516f1d185c99d95d10d1995953db94d95b1b60821b81526010016040519081900381208654909163ffffffff600160a01b9092048216918516906000805160206134e483398151915290600090a4845463ffffffff60a01b1916600160a01b63ffffffff8416021785555b845463ffffffff828116600160e01b90920416146120a9576040516c189d5c9b91995953db94d95b1b609a1b8152600d016040519081900381208654909163ffffffff600160e01b9092048216918416906000805160206134e483398151915290600090a4845463ffffffff8216600160e01b026001600160e01b039091161785555050505050565b845463ffffffff858116911614612336576040516e746172676574414665654f6e42757960881b8152600f016040519081900381208654909163ffffffff918216918716906000805160206134e483398151915290600090a4845463ffffffff191663ffffffff85161785555b845463ffffffff848116600160401b90920416146123ba576040516e746172676574424665654f6e42757960881b8152600f016040519081900381208654909163ffffffff600160401b9092048216918616906000805160206134e483398151915290600090a4845463ffffffff60401b1916600160401b63ffffffff8516021785555b845463ffffffff838116600160801b909204161461243e576040516e746172676574434665654f6e42757960881b8152600f016040519081900381208654909163ffffffff600160801b9092048216918516906000805160206134e483398151915290600090a4845463ffffffff60801b1916600160801b63ffffffff8416021785555b845463ffffffff828116600160c01b90920416146120a9576040516b6275726e4665654f6e42757960a01b8152600c016040519081900381208654909163ffffffff600160c01b9092048216918416906000805160206134e483398151915290600090a4845463ffffffff8216600160c01b0263ffffffff60c01b199091161785555050505050565b6001600160a01b0383166124ed5760405162461bcd60e51b81526004016108c49061332f565b6001600160a01b0382166125135760405162461bcd60e51b81526004016108c490613374565b6001600160a01b0383166000908152600160205260409020548181101561258b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108c4565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b60405180910390a3611ccc565b601880546001600160801b031916905581156126aa5760056012544361261e9190613229565b1161263a576018805463ffffffff1916620186a01790556126aa565b6010546018805463ffffffff80841667ffffffffffffffff1990921691909117600160401b8085048316600160201b029190911767ffffffffffffffff60401b1916600160801b850483169190910263ffffffff60601b191617600160c01b90930416600160601b029190911790555b80156127235760105460188054600160201b80840463ffffffff90811667ffffffffffffffff1990931692909217600160601b8086048416929092021767ffffffffffffffff60401b1916600160a01b85048316600160401b0263ffffffff60601b191617600160e01b90940491909116029190911790555b60185463ffffffff600160601b8204811691600160401b810482169161275391600160201b81048216911661326c565b61275d919061326c565b612767919061326c565b6018805463ffffffff60801b198116600160801b63ffffffff94851681029182179384905560408051938616928616929092178352600160201b840485166020840152600160401b8404851691830191909152600160601b83048416606083015290910490911660808201527feb239cafae58864188638fa3ac6ee930b82fb7df5028304bb64ddfa2c6fbab309060a001610a2d565b600061280830611023565b601854909150479063ffffffff600160801b820481169160009160029184916128329116876131e8565b61283c9190613215565b6128469190613215565b60185490915060009063ffffffff8085169161286b91600160601b90910416876131e8565b6128759190613215565b90506000816128848488613229565b61288e9190613229565b905081156128ea576128a03083612a5b565b60185460408051600160601b90920463ffffffff168252602082018490527fc97d6591edac38173f8e500a2e89b8fe98446b80c8478a4c1d60cc3864074940910160405180910390a15b6128f381612b8f565b60006128ff8647613229565b60185490915060009063ffffffff600160601b820481169161292491600291166133ee565b61292e9088613411565b6129389190613411565b60185463ffffffff918216925060009160029184916129589116866131e8565b6129629190613215565b61296c9190613215565b601854909150600090839061298e90600160201b900463ffffffff16866131e8565b6129989190613215565b90506000816129a78487613229565b6129b19190613229565b600e549091506129ca906001600160a01b031683612d2a565b600f546129e0906001600160a01b031682612d2a565b8715612a2a576129f08884612e43565b60408051848152602081018a90527fd2f4e97410796ed7a8c179e2bcedaa646a77cc703849019db2e4a1d368473cff910160405180910390a15b50506018805463ffffffff909816600160801b0263ffffffff60801b19909816979097179096555050505050505050565b6001600160a01b038216612abb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108c4565b6001600160a01b03821660009081526001602052604090205481811015612b2f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108c4565b6001600160a01b03831660008181526001602090815260408083208686039055600380548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612bc457612bc461342e565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c41919061319c565b81600181518110612c5457612c5461342e565b6001600160a01b039283166020918202929092010152600654612c7a9130911684611b34565b6000600c54600003612c8e57506000612cbb565b60006103e8600c5485612ca191906131e8565b612cab9190613215565b9050612cb78185613229565b9150505b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612cf39086908590879030904290600401613444565b600060405180830381600087803b158015612d0d57600080fd5b505af1158015612d21573d6000803e3d6000fd5b50505050505050565b80471015612d7a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108c4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612dc7576040519150601f19603f3d011682016040523d82523d6000602084013e612dcc565b606091505b50509050806113795760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108c4565b600654612e5b9030906001600160a01b031684611b34565b600654600d5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612ecb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120a991906134b5565b600060208083528351808285015260005b81811015612f1d57858101830151858201604001528201612f01565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612f5357600080fd5b50565b60008060408385031215612f6957600080fd5b8235612f7481612f3e565b946020939093013593505050565b600060208284031215612f9457600080fd5b5035919050565b600080600060608486031215612fb057600080fd5b8335612fbb81612f3e565b92506020840135612fcb81612f3e565b929592945050506040919091013590565b803563ffffffff81168114612ff057600080fd5b919050565b6000806000806080858703121561300b57600080fd5b61301485612fdc565b935061302260208601612fdc565b925061303060408601612fdc565b915061303e60608601612fdc565b905092959194509250565b60006020828403121561305b57600080fd5b813561306681612f3e565b9392505050565b60008060006060848603121561308257600080fd5b833561308d81612f3e565b9250602084013561309d81612f3e565b915060408401356130ad81612f3e565b809150509250925092565b8015158114612f5357600080fd5b600080604083850312156130d957600080fd5b82356130e481612f3e565b915060208301356130f4816130b8565b809150509250929050565b6000806040838503121561311257600080fd5b823561311d81612f3e565b915060208301356130f481612f3e565b600181811c9082168061314157607f821691505b60208210810361316157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156131ae57600080fd5b815161306681612f3e565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610894576108946131d2565b634e487b7160e01b600052601260045260246000fd5b600082613224576132246131ff565b500490565b81810381811115610894576108946131d2565b60006020828403121561324e57600080fd5b8151613066816130b8565b80820180821115610894576108946131d2565b63ffffffff818116838216019080821115613289576132896131d2565b5092915050565b6020808252602c908201527f4d6f6e746167653a2046656573206d757374206265206c657373206f7220657160408201526b75616c20746f20352e30302560a01b606082015260800190565b60208082526033908201527f4d6f6e746167653a204163636f756e7420697320616c7265616479207468652060408201527276616c7565206f6620276578636c756465642760681b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601b908201527f4d6f6e746167653a204163636f756e7420697320626c6f636b65640000000000604082015260600190565b600063ffffffff80841680613405576134056131ff565b92169190910492915050565b63ffffffff828116828216039080821115613289576132896131d2565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156134945784516001600160a01b03168352938301939183019160010161346f565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156134ca57600080fd5b835192506020840151915060408401519050925092509256fec36d1613536f357d23fd782d6c91ce23ec1c3eeafc5cc3ea9578cfc1923df3ba4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b52a26469706673582212209b2b6a20aee24dd29a0102ddbbc5c303084a9c6efc57089640a487318d76f28064736f6c63430008130033
Deployed Bytecode
0x6080604052600436106102555760003560e01c806375cb1bd111610139578063aa4bde28116100b6578063d2d7ad831161007a578063d2d7ad8314610742578063d322157614610758578063dd62ed3e14610778578063df42818914610798578063e3ed417f146107ae578063f2fde38b146107ce57600080fd5b8063aa4bde281461069c578063aee50b1e146106b2578063b62496f5146106d2578063bea9849e14610702578063c02466681461072257600080fd5b80638da5cb5b116100fd5780638da5cb5b146106095780639451cca61461062757806395d89b4114610647578063a457c2d71461065c578063a9059cbb1461067c57600080fd5b806375cb1bd114610569578063781edb3c146105895780637c0a893d146105a95780637e3e7650146105c957806389af1725146105e957600080fd5b806327a14fc2116101d257806346c23dae1161019657806346c23dae1461049457806349bd5a5e146104b45780634d78fdc6146104d4578063685fc568146104f457806370a0823114610534578063715018a61461055457600080fd5b806327a14fc21461040d5780632cc25d141461042d578063313ce56714610442578063378dc3dc1461045e578063395093511461047457600080fd5b80630bd05b69116102195780630bd05b69146103615780631694505e1461037657806318160ddd146103ae5780631eb9caec146103cd57806323b872dd146103ed57600080fd5b80630644e75714610261578063064a59d0146102cc57806306fdde03146102fd578063095ea7b31461031f578063098df5851461033f57600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b5060105463ffffffff80821691600160401b8104821691600160801b8204811691600160c01b9004165b6040805163ffffffff958616815293851660208501529184169183019190915290911660608201526080015b60405180910390f35b3480156102d857600080fd5b506007546102ed90600160a01b900460ff1681565b60405190151581526020016102c3565b34801561030957600080fd5b506103126107ee565b6040516102c39190612ef0565b34801561032b57600080fd5b506102ed61033a366004612f56565b610880565b34801561034b57600080fd5b5061035f61035a366004612f82565b61089a565b005b34801561036d57600080fd5b5061035f610a3a565b34801561038257600080fd5b50600654610396906001600160a01b031681565b6040516001600160a01b0390911681526020016102c3565b3480156103ba57600080fd5b506003545b6040519081526020016102c3565b3480156103d957600080fd5b50600f54610396906001600160a01b031681565b3480156103f957600080fd5b506102ed610408366004612f9b565b610ab6565b34801561041957600080fd5b5061035f610428366004612f82565b610ada565b34801561043957600080fd5b5061035f610c4b565b34801561044e57600080fd5b50604051601281526020016102c3565b34801561046a57600080fd5b506103bf60085481565b34801561048057600080fd5b506102ed61048f366004612f56565b610e2a565b3480156104a057600080fd5b5061035f6104af366004612ff5565b610e4c565b3480156104c057600080fd5b50600754610396906001600160a01b031681565b3480156104e057600080fd5b5061035f6104ef366004613049565b610f44565b34801561050057600080fd5b5060105463ffffffff600160201b8204811691600160601b8104821691600160a01b8204811691600160e01b900416610297565b34801561054057600080fd5b506103bf61054f366004613049565b611023565b34801561056057600080fd5b5061035f61103e565b34801561057557600080fd5b5061035f61058436600461306d565b6110b2565b34801561059557600080fd5b5061035f6105a43660046130c6565b61137e565b3480156105b557600080fd5b5061035f6105c4366004613049565b611448565b3480156105d557600080fd5b5061035f6105e4366004612ff5565b611539565b3480156105f557600080fd5b50600e54610396906001600160a01b031681565b34801561061557600080fd5b506000546001600160a01b0316610396565b34801561063357600080fd5b5061035f610642366004612f82565b6115d5565b34801561065357600080fd5b50610312611675565b34801561066857600080fd5b506102ed610677366004612f56565b611684565b34801561068857600080fd5b506102ed610697366004612f56565b6116ff565b3480156106a857600080fd5b506103bf60095481565b3480156106be57600080fd5b5061035f6106cd366004612f82565b61170d565b3480156106de57600080fd5b506102ed6106ed366004613049565b60176020526000908152604090205460ff1681565b34801561070e57600080fd5b5061035f61071d366004613049565b6117e1565b34801561072e57600080fd5b5061035f61073d3660046130c6565b6118db565b34801561074e57600080fd5b506103bf600b5481565b34801561076457600080fd5b5061035f6107733660046130c6565b61199d565b34801561078457600080fd5b506103bf6107933660046130ff565b611a1f565b3480156107a457600080fd5b506103bf600c5481565b3480156107ba57600080fd5b50600d54610396906001600160a01b031681565b3480156107da57600080fd5b5061035f6107e9366004613049565b611a4a565b6060600480546107fd9061312d565b80601f01602080910402602001604051908101604052809291908181526020018280546108299061312d565b80156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b5050505050905090565b60003361088e818585611b34565b60019150505b92915050565b6000546001600160a01b031633146108cd5760405162461bcd60e51b81526004016108c490613167565b60405180910390fd5b478111156109355760405162461bcd60e51b815260206004820152602f60248201527f4d6f6e746167653a2043616e6e6f742073656e64206d6f7265207468616e206360448201526e6f6e74726163742062616c616e636560881b60648201526084016108c4565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610982576040519150601f19603f3d011682016040523d82523d6000602084013e610987565b606091505b505090508015610a3657600654604080516315ab88c960e31b815290517fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156109fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1e919061319c565b83604051610a2d9291906131b9565b60405180910390a15b5050565b6000546001600160a01b03163314610a645760405162461bcd60e51b81526004016108c490613167565b6007805460ff60a01b1916600160a01b179055601254600003610a8657436012555b6040516000906001907fa0f694e30e34d9f05d12691b612650129ed8888d1f93b25fa0cd92e4416a8338908390a3565b600033610ac4858285611c58565b610acf858585611cd2565b506001949350505050565b6000546001600160a01b03163314610b045760405162461bcd60e51b81526004016108c490613167565b6103e8610b1060035490565b610b1b90600a6131e8565b610b259190613215565b811015610baa5760405162461bcd60e51b815260206004820152604760248201527f4d6f6e746167653a204d61782077616c6c65742076616c7565206d757374206260448201527f652067726561746572207468616e206f7220657175616c20746f203125206f6660648201526620737570706c7960c81b608482015260a4016108c4565b6009548103610c185760405162461bcd60e51b815260206004820152603460248201527f4d6f6e746167653a2043616e6e6f7420757064617465206d617857616c6c6574604482015273416d6f756e7420746f2073616d652076616c756560601b60648201526084016108c4565b60095460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600955565b6000546001600160a01b03163314610c755760405162461bcd60e51b81526004016108c490613167565b600560125443610c859190613229565b11610cf15760405162461bcd60e51b815260206004820152603660248201527f4d6f6e746167653a204f6e6c7920636c61696d206c61756e636820746f6b656e60448201527573206166746572206669727374203520626c6f636b7360501b60648201526084016108c4565b601154610100900460ff1615610d5a5760405162461bcd60e51b815260206004820152602860248201527f4d6f6e746167653a204c61756e636820746f6b656e732068617665206265656e6044820152670818db185a5b595960c21b60648201526084016108c4565b6011805461ff0019166101001790556000610d7430611023565b905060003063a9059cbb610d906000546001600160a01b031690565b846040518363ffffffff1660e01b8152600401610dae9291906131b9565b6020604051808303816000875af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df1919061323c565b90508015610a36577fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d3083604051610a2d9291906131b9565b60003361088e818585610e3d8383611a1f565b610e479190613259565b611b34565b6000546001600160a01b03163314610e765760405162461bcd60e51b81526004016108c490613167565b6113888183610e85868861326c565b610e8f919061326c565b610e99919061326c565b63ffffffff161115610ebd5760405162461bcd60e51b81526004016108c490613290565b610ecb6010858585856120b0565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822063ffffffff878116845286811660208501528581168484015284166060840152905190917f7b97950369e93390b14c04dce6a31544c90c43a3c45340c762e98b909be00ee8919081900360800190a250505050565b6000546001600160a01b03163314610f6e5760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03811660009081526013602052604090205460ff16610fd65760405162461bcd60e51b815260206004820152601f60248201527f4d6f6e746167653a204163636f756e74206973206e6f7420626c636f6b65640060448201526064016108c4565b6001600160a01b038116600081815260136020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633146110685760405162461bcd60e51b81526004016108c490613167565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110dc5760405162461bcd60e51b81526004016108c490613167565b600d546001600160a01b038481169116146111bb576001600160a01b0383166111565760405162461bcd60e51b815260206004820152602660248201527f4d6f6e746167653a20546865207461726765744157616c6c65742063616e6e6f60448201526507420626520360d41b60648201526084016108c4565b600d80546040516c1d185c99d95d1055d85b1b195d609a1b81526001600160a01b039182169291861691016040519081900381209060008051602061350483398151915290600090a4600d80546001600160a01b0319166001600160a01b0385161790555b600e546001600160a01b0383811691161461129a576001600160a01b0382166112355760405162461bcd60e51b815260206004820152602660248201527f4d6f6e746167653a20546865207461726765744257616c6c65742063616e6e6f60448201526507420626520360d41b60648201526084016108c4565b600e546040516c1d185c99d95d1095d85b1b195d609a1b81526001600160a01b0391821691841690600d016040519081900381209060008051602061350483398151915290600090a4600e80546001600160a01b0319166001600160a01b0384161790555b600f546001600160a01b03828116911614611379576001600160a01b0381166113145760405162461bcd60e51b815260206004820152602660248201527f4d6f6e746167653a20546865207461726765744357616c6c65742063616e6e6f60448201526507420626520360d41b60648201526084016108c4565b600f546040516c1d185c99d95d10d5d85b1b195d609a1b81526001600160a01b0391821691831690600d016040519081900381209060008051602061350483398151915290600090a4600f80546001600160a01b0319166001600160a01b0383161790555b505050565b6000546001600160a01b031633146113a85760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036113e85760405162461bcd60e51b81526004016108c4906132dc565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146114725760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03811660009081526013602052604090205460ff16156114e75760405162461bcd60e51b815260206004820152602360248201527f4d6f6e746167653a204163636f756e7420697320616c726561647920626c6f636044820152621ad95960ea1b60648201526084016108c4565b6001600160a01b038116600081815260136020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6000546001600160a01b031633146115635760405162461bcd60e51b81526004016108c490613167565b6113888183611572868861326c565b61157c919061326c565b611586919061326c565b63ffffffff1611156115aa5760405162461bcd60e51b81526004016108c490613290565b6115b86010858585856122c9565b6040516b62617365466565732d42757960a01b8152600c01610ee5565b6000546001600160a01b031633146115ff5760405162461bcd60e51b81526004016108c490613167565b6103e88111156116705760405162461bcd60e51b815260206004820152603660248201527f4d6f6e746167653a2041636365707461626c6520736c6970706167652063616e6044820152756e6f74206265206d6f7265207468616e20313030252160501b60648201526084016108c4565b600c55565b6060600580546107fd9061312d565b600033816116928286611a1f565b9050838110156116f25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108c4565b610acf8286868403611b34565b60003361088e818585611cd2565b6000546001600160a01b031633146117375760405162461bcd60e51b81526004016108c490613167565b600b5481036117ae5760405162461bcd60e51b815260206004820152603c60248201527f4d6f6e746167653a2043616e6e6f7420757064617465206d696e696d756d546f60448201527f6b656e734265666f72655377617020746f2073616d652076616c75650000000060648201526084016108c4565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b0316331461180b5760405162461bcd60e51b81526004016108c490613167565b6006546001600160a01b039081169082160361187e5760405162461bcd60e51b815260206004820152602c60248201527f4d6f6e746167653a2054686520726f7574657220616c7265616479206861732060448201526b74686174206164647265737360a01b60648201526084016108c4565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119055760405162461bcd60e51b81526004016108c490613167565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036119455760405162461bcd60e51b81526004016108c4906132dc565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b910161143c565b6000546001600160a01b031633146119c75760405162461bcd60e51b81526004016108c490613167565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d350910161143c565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b03163314611a745760405162461bcd60e51b81526004016108c490613167565b6001600160a01b038116611ad95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611b965760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108c4565b6001600160a01b038216611bf75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108c4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611c648484611a1f565b90506000198114611ccc5781811015611cbf5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108c4565b611ccc8484848403611b34565b50505050565b6001600160a01b038316611cf85760405162461bcd60e51b81526004016108c49061332f565b6001600160a01b038216611d1e5760405162461bcd60e51b81526004016108c490613374565b6001600160a01b03821660009081526013602052604090205460ff1615611d575760405162461bcd60e51b81526004016108c4906133b7565b6001600160a01b03831660009081526013602052604090205460ff1615611d905760405162461bcd60e51b81526004016108c4906133b7565b80600003611da457611379838360006124c7565b6001600160a01b03831660009081526014602052604090205460ff16158015611de657506001600160a01b03821660009081526014602052604090205460ff16155b15611e5457600754600160a01b900460ff16611e545760405162461bcd60e51b815260206004820152602760248201527f4d6f6e746167653a2054726164696e672069732063757272656e746c7920646960448201526639b0b13632b21760c91b60648201526084016108c4565b6001600160a01b03808416600090815260176020526040808220549285168252902054611e879160ff90811691166125f8565b6000600b54611e9530611023565b6007549111159150600160a01b900460ff168015611eb05750805b8015611ebf5750600a5460ff16155b8015611ed95750601854600160801b900463ffffffff1615155b8015611efd57506001600160a01b03831660009081526017602052604090205460ff165b15611f2257600a805460ff19166001179055611f176127fd565b600a805460ff191690555b600a5460009060ff16158015611f415750600754600160a01b900460ff165b6001600160a01b03861660009081526015602052604090205490915060ff1680611f8357506001600160a01b03841660009081526015602052604090205460ff165b15611f8c575060005b808015611fa75750601854600160801b900463ffffffff1615155b15611ff357601854600090620186a090611fce90600160801b900463ffffffff16866131e8565b611fd89190613215565b9050611fe48185613229565b9350611ff18630836124c7565b505b6001600160a01b03841660009081526016602052604090205460ff1661209e576009548361202086611023565b61202a9190613259565b111561209e5760405162461bcd60e51b815260206004820152603c60248201527f4d6f6e746167653a2045787065637465642077616c6c657420616d6f756e742060448201527f6578636565647320746865206d617857616c6c6574416d6f756e742e0000000060648201526084016108c4565b6120a98585856124c7565b5050505050565b845463ffffffff858116600160201b9092041614612136576040516f1d185c99d95d1051995953db94d95b1b60821b81526010016040519081900381208654909163ffffffff600160201b9092048216918716906000805160206134e483398151915290600090a4845467ffffffff000000001916600160201b63ffffffff8616021785555b845463ffffffff848116600160601b90920416146121bb576040516f1d185c99d95d1091995953db94d95b1b60821b81526010016040519081900381208654909163ffffffff600160601b9092048216918616906000805160206134e483398151915290600090a4845463ffffffff60601b1916600160601b63ffffffff8516021785555b845463ffffffff838116600160a01b9092041614612240576040516f1d185c99d95d10d1995953db94d95b1b60821b81526010016040519081900381208654909163ffffffff600160a01b9092048216918516906000805160206134e483398151915290600090a4845463ffffffff60a01b1916600160a01b63ffffffff8416021785555b845463ffffffff828116600160e01b90920416146120a9576040516c189d5c9b91995953db94d95b1b609a1b8152600d016040519081900381208654909163ffffffff600160e01b9092048216918416906000805160206134e483398151915290600090a4845463ffffffff8216600160e01b026001600160e01b039091161785555050505050565b845463ffffffff858116911614612336576040516e746172676574414665654f6e42757960881b8152600f016040519081900381208654909163ffffffff918216918716906000805160206134e483398151915290600090a4845463ffffffff191663ffffffff85161785555b845463ffffffff848116600160401b90920416146123ba576040516e746172676574424665654f6e42757960881b8152600f016040519081900381208654909163ffffffff600160401b9092048216918616906000805160206134e483398151915290600090a4845463ffffffff60401b1916600160401b63ffffffff8516021785555b845463ffffffff838116600160801b909204161461243e576040516e746172676574434665654f6e42757960881b8152600f016040519081900381208654909163ffffffff600160801b9092048216918516906000805160206134e483398151915290600090a4845463ffffffff60801b1916600160801b63ffffffff8416021785555b845463ffffffff828116600160c01b90920416146120a9576040516b6275726e4665654f6e42757960a01b8152600c016040519081900381208654909163ffffffff600160c01b9092048216918416906000805160206134e483398151915290600090a4845463ffffffff8216600160c01b0263ffffffff60c01b199091161785555050505050565b6001600160a01b0383166124ed5760405162461bcd60e51b81526004016108c49061332f565b6001600160a01b0382166125135760405162461bcd60e51b81526004016108c490613374565b6001600160a01b0383166000908152600160205260409020548181101561258b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108c4565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b60405180910390a3611ccc565b601880546001600160801b031916905581156126aa5760056012544361261e9190613229565b1161263a576018805463ffffffff1916620186a01790556126aa565b6010546018805463ffffffff80841667ffffffffffffffff1990921691909117600160401b8085048316600160201b029190911767ffffffffffffffff60401b1916600160801b850483169190910263ffffffff60601b191617600160c01b90930416600160601b029190911790555b80156127235760105460188054600160201b80840463ffffffff90811667ffffffffffffffff1990931692909217600160601b8086048416929092021767ffffffffffffffff60401b1916600160a01b85048316600160401b0263ffffffff60601b191617600160e01b90940491909116029190911790555b60185463ffffffff600160601b8204811691600160401b810482169161275391600160201b81048216911661326c565b61275d919061326c565b612767919061326c565b6018805463ffffffff60801b198116600160801b63ffffffff94851681029182179384905560408051938616928616929092178352600160201b840485166020840152600160401b8404851691830191909152600160601b83048416606083015290910490911660808201527feb239cafae58864188638fa3ac6ee930b82fb7df5028304bb64ddfa2c6fbab309060a001610a2d565b600061280830611023565b601854909150479063ffffffff600160801b820481169160009160029184916128329116876131e8565b61283c9190613215565b6128469190613215565b60185490915060009063ffffffff8085169161286b91600160601b90910416876131e8565b6128759190613215565b90506000816128848488613229565b61288e9190613229565b905081156128ea576128a03083612a5b565b60185460408051600160601b90920463ffffffff168252602082018490527fc97d6591edac38173f8e500a2e89b8fe98446b80c8478a4c1d60cc3864074940910160405180910390a15b6128f381612b8f565b60006128ff8647613229565b60185490915060009063ffffffff600160601b820481169161292491600291166133ee565b61292e9088613411565b6129389190613411565b60185463ffffffff918216925060009160029184916129589116866131e8565b6129629190613215565b61296c9190613215565b601854909150600090839061298e90600160201b900463ffffffff16866131e8565b6129989190613215565b90506000816129a78487613229565b6129b19190613229565b600e549091506129ca906001600160a01b031683612d2a565b600f546129e0906001600160a01b031682612d2a565b8715612a2a576129f08884612e43565b60408051848152602081018a90527fd2f4e97410796ed7a8c179e2bcedaa646a77cc703849019db2e4a1d368473cff910160405180910390a15b50506018805463ffffffff909816600160801b0263ffffffff60801b19909816979097179096555050505050505050565b6001600160a01b038216612abb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108c4565b6001600160a01b03821660009081526001602052604090205481811015612b2f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108c4565b6001600160a01b03831660008181526001602090815260408083208686039055600380548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612bc457612bc461342e565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c41919061319c565b81600181518110612c5457612c5461342e565b6001600160a01b039283166020918202929092010152600654612c7a9130911684611b34565b6000600c54600003612c8e57506000612cbb565b60006103e8600c5485612ca191906131e8565b612cab9190613215565b9050612cb78185613229565b9150505b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612cf39086908590879030904290600401613444565b600060405180830381600087803b158015612d0d57600080fd5b505af1158015612d21573d6000803e3d6000fd5b50505050505050565b80471015612d7a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108c4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612dc7576040519150601f19603f3d011682016040523d82523d6000602084013e612dcc565b606091505b50509050806113795760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108c4565b600654612e5b9030906001600160a01b031684611b34565b600654600d5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612ecb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120a991906134b5565b600060208083528351808285015260005b81811015612f1d57858101830151858201604001528201612f01565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612f5357600080fd5b50565b60008060408385031215612f6957600080fd5b8235612f7481612f3e565b946020939093013593505050565b600060208284031215612f9457600080fd5b5035919050565b600080600060608486031215612fb057600080fd5b8335612fbb81612f3e565b92506020840135612fcb81612f3e565b929592945050506040919091013590565b803563ffffffff81168114612ff057600080fd5b919050565b6000806000806080858703121561300b57600080fd5b61301485612fdc565b935061302260208601612fdc565b925061303060408601612fdc565b915061303e60608601612fdc565b905092959194509250565b60006020828403121561305b57600080fd5b813561306681612f3e565b9392505050565b60008060006060848603121561308257600080fd5b833561308d81612f3e565b9250602084013561309d81612f3e565b915060408401356130ad81612f3e565b809150509250925092565b8015158114612f5357600080fd5b600080604083850312156130d957600080fd5b82356130e481612f3e565b915060208301356130f4816130b8565b809150509250929050565b6000806040838503121561311257600080fd5b823561311d81612f3e565b915060208301356130f481612f3e565b600181811c9082168061314157607f821691505b60208210810361316157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156131ae57600080fd5b815161306681612f3e565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610894576108946131d2565b634e487b7160e01b600052601260045260246000fd5b600082613224576132246131ff565b500490565b81810381811115610894576108946131d2565b60006020828403121561324e57600080fd5b8151613066816130b8565b80820180821115610894576108946131d2565b63ffffffff818116838216019080821115613289576132896131d2565b5092915050565b6020808252602c908201527f4d6f6e746167653a2046656573206d757374206265206c657373206f7220657160408201526b75616c20746f20352e30302560a01b606082015260800190565b60208082526033908201527f4d6f6e746167653a204163636f756e7420697320616c7265616479207468652060408201527276616c7565206f6620276578636c756465642760681b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601b908201527f4d6f6e746167653a204163636f756e7420697320626c6f636b65640000000000604082015260600190565b600063ffffffff80841680613405576134056131ff565b92169190910492915050565b63ffffffff828116828216039080821115613289576132896131d2565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156134945784516001600160a01b03168352938301939183019160010161346f565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156134ca57600080fd5b835192506020840151915060408401519050925092509256fec36d1613536f357d23fd782d6c91ce23ec1c3eeafc5cc3ea9578cfc1923df3ba4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b52a26469706673582212209b2b6a20aee24dd29a0102ddbbc5c303084a9c6efc57089640a487318d76f28064736f6c63430008130033
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.