Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
ProofNonReflectionTokenFactory
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "./libraries/Ownable.sol"; import "./libraries/ProofNonReflectionTokenFees.sol"; import "./libraries/Context.sol"; import "./interfaces/ITeamFinanceLocker.sol"; import "./interfaces/ITokenCutter.sol"; import "./interfaces/IUniswapV2Router02.sol"; import "./interfaces/IUniswapV2Factory.sol"; import "./interfaces/IFACTORY.sol"; import "./interfaces/IProofNonReflectionTokenCutter.sol"; import "./tokenCutters/ProofNonReflectionTokenCutter.sol"; contract ProofNonReflectionTokenFactory is Ownable { struct ProofToken { bool status; address pair; address owner; uint256 unlockTime; uint256 lockId; } struct TokenParam { string tokenName; string tokenSymbol; uint256 initialSupply; uint256 percentToLP; uint256 initialMainFee; uint256 initialMainFeeOnSell; uint256 initialLpFee; uint256 initialLpFeeOnSell; uint256 initialDevFee; uint256 initialDevFeeOnSell; uint256 unlockTime; address operationsWallet; address mainWallet; uint256 antiSnipeDuration; } mapping(address => ProofToken) public validatedPairs; address public proofAdmin; address public routerAddress; address public lockerAddress; address payable public revenueAddress; address payable public rewardPoolAddress; event TokenCreated(address _address); constructor( address initialRouterAddress, address initialLockerAddress, address initialRewardPoolAddress, address initialRevenueAddress ) { routerAddress = initialRouterAddress; lockerAddress = initialLockerAddress; revenueAddress = payable(initialRevenueAddress); rewardPoolAddress = payable(initialRewardPoolAddress); proofAdmin = msg.sender; } function createToken(TokenParam memory tokenParam_) external payable { require( tokenParam_.unlockTime >= block.timestamp + 30 days, "unlock under 30 days" ); require(msg.value >= 1 ether, "not enough liquidity"); require(tokenParam_.antiSnipeDuration <= 36, "36 sec anti-snipe max"); //create token ProofNonReflectionTokenFees.allFees memory fees = ProofNonReflectionTokenFees.allFees( tokenParam_.initialMainFee, tokenParam_.initialMainFeeOnSell, tokenParam_.initialLpFee, tokenParam_.initialLpFeeOnSell, tokenParam_.initialDevFee, tokenParam_.initialDevFeeOnSell ); ProofNonReflectionTokenCutter newToken = new ProofNonReflectionTokenCutter(); IProofNonReflectionTokenCutter(address(newToken)).setBasicData( IProofNonReflectionTokenCutter.BaseData( tokenParam_.tokenName, tokenParam_.tokenSymbol, tokenParam_.initialSupply, tokenParam_.percentToLP, msg.sender, tokenParam_.operationsWallet, tokenParam_.mainWallet, routerAddress, proofAdmin, tokenParam_.antiSnipeDuration ), fees ); emit TokenCreated(address(newToken)); //add liquidity newToken.approve(routerAddress, type(uint256).max); IUniswapV2Router02 router = IUniswapV2Router02(routerAddress); router.addLiquidityETH{value: msg.value}( address(newToken), newToken.balanceOf(address(this)), 0, 0, address(this), block.timestamp ); // disable trading newToken.swapTradingStatus(); validatedPairs[address(newToken)] = ProofToken( false, newToken.pair(), msg.sender, tokenParam_.unlockTime, 0 ); } function finalizeToken(address tokenAddress) external payable { require(validatedPairs[tokenAddress].owner == msg.sender, "!owner"); require(validatedPairs[tokenAddress].status == false, "validated"); address _pair = validatedPairs[tokenAddress].pair; uint256 _unlockTime = validatedPairs[tokenAddress].unlockTime; IERC20(_pair).approve(lockerAddress, type(uint256).max); uint256 lpBalance = IERC20(_pair).balanceOf(address(this)); uint256 _lockId = ITeamFinanceLocker(lockerAddress).lockToken{ value: msg.value }(_pair, msg.sender, lpBalance, _unlockTime, false, 0x0000000000000000000000000000000000000000); validatedPairs[tokenAddress].lockId = _lockId; //enable trading ITokenCutter(tokenAddress).swapTradingStatus(); ITokenCutter(tokenAddress).setLaunchedAt(); validatedPairs[tokenAddress].status = true; } function cancelToken(address tokenAddress) external { require(validatedPairs[tokenAddress].owner == msg.sender, "!owner"); require(validatedPairs[tokenAddress].status == false, "validated"); address _pair = validatedPairs[tokenAddress].pair; address _owner = validatedPairs[tokenAddress].owner; IUniswapV2Router02 router = IUniswapV2Router02(routerAddress); IERC20(_pair).approve(routerAddress, type(uint256).max); uint256 _lpBalance = IERC20(_pair).balanceOf(address(this)); // enable transfer and allow router to exceed tx limit to remove liquidity ITokenCutter(tokenAddress).cancelToken(); router.removeLiquidityETH( address(tokenAddress), _lpBalance, 0, 0, _owner, block.timestamp ); // disable transfer of token ITokenCutter(tokenAddress).swapTradingStatus(); delete validatedPairs[tokenAddress]; } function setLockerAddress(address newlockerAddress) external onlyOwner { lockerAddress = newlockerAddress; } function setRouterAddress(address newRouterAddress) external onlyOwner { routerAddress = payable(newRouterAddress); } function distributeExcessFunds() external onlyOwner { (bool sent, ) = revenueAddress.call{value: address(this).balance / 2}(""); require(sent, ""); (bool sent1, ) = rewardPoolAddress.call{value: address(this).balance}(""); require(sent1, ""); } function proofRevenueAddress() external view returns (address) { return revenueAddress; } function proofRewardPoolAddress() external view returns (address) { return rewardPoolAddress; } function setProofAdmin(address newProofAdmin) external onlyOwner { proofAdmin = newProofAdmin; } function setRevenueAddress(address newRevenueAddress) external onlyOwner { revenueAddress = payable(newRevenueAddress); } function setRewardPoolAddress( address newRewardPoolAddress ) external onlyOwner { rewardPoolAddress = payable(newRewardPoolAddress); } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IFACTORY { function proofRevenueAddress() external view returns (address); function proofRewardPoolAddress() external view returns (address); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "../libraries/ProofNonReflectionTokenFees.sol"; interface IProofNonReflectionTokenCutter is IERC20, IERC20Metadata { struct BaseData { string tokenName; string tokenSymbol; uint256 initialSupply; uint256 percentToLP; address owner; address dev; address main; address routerAddress; address initialProofAdmin; uint256 antiSnipeDuration; } function setBasicData( BaseData memory _baseData, ProofNonReflectionTokenFees.allFees memory fees ) external; function changeIsTxLimitExempt( address holder, bool exempt ) external; }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface ITeamFinanceLocker { function lockToken( address _tokenAddress, address _withdrawalAddress, uint256 _amount, uint256 _unlockTime, bool _mintNFT, address referrer ) external payable returns (uint256 _id); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface ITokenCutter { function swapTradingStatus() external; function setLaunchedAt() external; function cancelToken() external; }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; 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 removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "./Context.sol"; abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; library ProofNonReflectionTokenFees { struct allFees { uint256 mainFee; uint256 mainFeeOnSell; uint256 lpFee; uint256 lpFeeOnSell; uint256 devFee; uint256 devFeeOnSell; } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "../libraries/Ownable.sol"; import "../libraries/Context.sol"; import "../libraries/ProofNonReflectionTokenFees.sol"; import "../interfaces/IFACTORY.sol"; import "../interfaces/IUniswapV2Router02.sol"; import "../interfaces/IUniswapV2Factory.sol"; import "../interfaces/IProofNonReflectionTokenCutter.sol"; contract ProofNonReflectionTokenCutter is Context, IProofNonReflectionTokenCutter { //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; address constant DEAD = 0x000000000000000000000000000000000000dEaD; address constant ZERO = 0x0000000000000000000000000000000000000000; address public proofAdmin; bool public restrictWhales = true; mapping(address => bool) public isFeeExempt; mapping(address => bool) public isTxLimitExempt; mapping(address => bool) public isDividendExempt; uint256 public launchedAt; uint256 public proofFee = 2; uint256 public mainFee; uint256 public lpFee; uint256 public devFee; uint256 public mainFeeOnSell; uint256 public lpFeeOnSell; uint256 public devFeeOnSell; uint256 public totalFee; uint256 public totalFeeIfSelling; IUniswapV2Router02 public router; address public pair; address public factory; address public tokenOwner; address payable public devWallet; address payable public mainWallet; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool public tradingStatus = true; mapping(address => bool) public bots; uint256 public antiSnipeDuration; uint256 public antiSnipeEndTime; uint256 public _maxTxAmount; uint256 public _walletMax; uint256 public swapThreshold; constructor() { factory = msg.sender; } modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier onlyProofAdmin() { require(proofAdmin == _msgSender(), "Caller is not the proofAdmin"); _; } modifier onlyOwner() { require(tokenOwner == _msgSender(), "Caller is not the owner"); _; } modifier onlyFactory() { require(factory == _msgSender(), "Caller is not the factory"); _; } function setBasicData( BaseData memory _baseData, ProofNonReflectionTokenFees.allFees memory fees ) external onlyFactory { _name = _baseData.tokenName; _symbol = _baseData.tokenSymbol; _totalSupply = _baseData.initialSupply; //Tx & Wallet Limits require(_baseData.percentToLP >= 70, "Too low"); _maxTxAmount = (_baseData.initialSupply * 5) / 1000; _walletMax = (_baseData.initialSupply * 1) / 100; swapThreshold = (_baseData.initialSupply * 5) / 4000; router = IUniswapV2Router02(_baseData.routerAddress); pair = IUniswapV2Factory(router.factory()).createPair( router.WETH(), address(this) ); _allowances[address(this)][address(router)] = type(uint256).max; isFeeExempt[address(this)] = true; isFeeExempt[factory] = true; isFeeExempt[_baseData.owner] = true; isTxLimitExempt[_baseData.owner] = true; isTxLimitExempt[pair] = true; isTxLimitExempt[factory] = true; isTxLimitExempt[DEAD] = true; isTxLimitExempt[ZERO] = true; //Fees lpFee = fees.lpFee; lpFeeOnSell = fees.lpFeeOnSell; devFee = fees.devFee; devFeeOnSell = fees.devFeeOnSell; mainFee = fees.mainFee; mainFeeOnSell = fees.mainFeeOnSell; totalFee = devFee + lpFee + mainFee + proofFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + mainFeeOnSell + proofFee; require(totalFee <= 12, "Too high"); require(totalFeeIfSelling <= 17, "Too high"); tokenOwner = _baseData.owner; devWallet = payable(_baseData.dev); mainWallet = payable(_baseData.main); proofAdmin = _baseData.initialProofAdmin; //Initial supply uint256 forLP = (_baseData.initialSupply * _baseData.percentToLP) / 100; //95% uint256 forOwner = _baseData.initialSupply - forLP; //5% _balances[msg.sender] += forLP; _balances[_baseData.owner] += forOwner; antiSnipeDuration = _baseData.antiSnipeDuration; emit Transfer(address(0), msg.sender, forLP); emit Transfer(address(0), _baseData.owner, forOwner); } //proofAdmin functions function updateProofAdmin( address newAdmin ) external virtual onlyProofAdmin { proofAdmin = newAdmin; } //Factory functions function swapTradingStatus() external onlyFactory { tradingStatus = !tradingStatus; } function setLaunchedAt() external onlyFactory { require(launchedAt == 0, "launched"); launchedAt = block.timestamp; antiSnipeEndTime = block.timestamp + antiSnipeDuration; } function cancelToken() external onlyFactory { isFeeExempt[address(router)] = true; isTxLimitExempt[address(router)] = true; isTxLimitExempt[tokenOwner] = true; tradingStatus = true; restrictWhales = false; swapAndLiquifyEnabled = false; } //Owner functions function changeRestrictWhales(bool _enable) external onlyOwner { restrictWhales = _enable; } function changeFees( uint256 initialMainFee, uint256 initialMainFeeOnSell, uint256 initialLpFee, uint256 initialLpFeeOnSell, uint256 initialDevFee, uint256 initialDevFeeOnSell ) external onlyOwner { mainFee = initialMainFee; lpFee = initialLpFee; devFee = initialDevFee; mainFeeOnSell = initialMainFeeOnSell; lpFeeOnSell = initialLpFeeOnSell; devFeeOnSell = initialDevFeeOnSell; totalFee = devFee + lpFee + proofFee + mainFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + proofFee + mainFeeOnSell; require(totalFee <= 12, "High fee"); require(totalFeeIfSelling <= 17, "High fee"); } function changeTxLimit(uint256 newLimit) external onlyOwner { require(launchedAt != 0, "!launched"); require(newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%"); require(newLimit <= (_totalSupply * 3) / 100, "Max 3%"); _maxTxAmount = newLimit; } function changeWalletLimit(uint256 newLimit) external onlyOwner { require(launchedAt != 0, "!launched"); require(newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%"); require(newLimit <= (_totalSupply * 3) / 100, "Max 3%"); _walletMax = newLimit; } function changeIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function changeIsTxLimitExempt( address holder, bool exempt ) external onlyOwner { isTxLimitExempt[holder] = exempt; } function reduceProofFee() external onlyOwner { require(proofFee == 2, "!already reduced"); require(launchedAt != 0, "!launched"); require(block.timestamp >= launchedAt + 72 hours); proofFee = 1; totalFee = devFee + lpFee + proofFee + mainFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + proofFee + mainFeeOnSell; } function adjustProofFee(uint256 _proofFee) external onlyProofAdmin { require(launchedAt != 0, "!launched"); if (block.timestamp >= launchedAt + 72 hours) { require(_proofFee <= 1); proofFee = _proofFee; totalFee = devFee + lpFee + proofFee + mainFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + proofFee + mainFeeOnSell; } else { require(_proofFee <= 2); proofFee = _proofFee; totalFee = devFee + lpFee + proofFee + mainFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + proofFee + mainFeeOnSell; } } function setDevWallet(address payable newDevWallet) external onlyOwner { devWallet = payable(newDevWallet); } function setMainWallet(address payable newMainWallet) external onlyOwner { mainWallet = newMainWallet; } function setOwnerWallet(address payable newOwnerWallet) external onlyOwner { tokenOwner = newOwnerWallet; } function changeSwapBackSettings( bool enableSwapBack, uint256 newSwapBackLimit ) external onlyOwner { swapAndLiquifyEnabled = enableSwapBack; swapThreshold = newSwapBackLimit; } function delBot(address notbot) external { address sender = _msgSender(); require( sender == proofAdmin || sender == tokenOwner, "Caller doesn't have permission" ); bots[notbot] = false; } function getCirculatingSupply() external view returns (uint256) { return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO); } /** * @dev Returns the name of the token. */ function name() external view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() external view virtual override returns (uint8) { return 9; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() external view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer( address to, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve( address spender, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) external virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance( address spender, uint256 addedValue ) external virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance( address spender, uint256 subtractedValue ) external virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require( currentAllowance >= subtractedValue, "Decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } function _transfer( address sender, address recipient, uint256 amount ) internal returns (bool) { require(tradingStatus, "Closed"); require(!bots[sender] && !bots[recipient]); if (antiSnipeEndTime != 0 && block.timestamp < antiSnipeEndTime) { bots[tx.origin] = true; if (recipient != tx.origin) { revert('antisnipe'); } } if (inSwapAndLiquify) { return _basicTransfer(sender, recipient, amount); } if (recipient == pair && restrictWhales) { require( amount <= _maxTxAmount || (isTxLimitExempt[sender] && isTxLimitExempt[recipient]), "Max TX" ); } if (!isTxLimitExempt[recipient] && restrictWhales) { require(_balances[recipient] + amount <= _walletMax, "Max Wallet"); } if ( sender != pair && !inSwapAndLiquify && swapAndLiquifyEnabled && _balances[address(this)] >= swapThreshold ) { swapBack(); } _balances[sender] = _balances[sender] - amount; uint256 finalAmount = amount; if (sender == pair || recipient == pair) { finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient] ? takeFee(sender, recipient, amount) : amount; } _balances[recipient] = _balances[recipient] + finalAmount; emit Transfer(sender, recipient, finalAmount); return true; } function _basicTransfer( address sender, address recipient, uint256 amount ) internal returns (bool) { _balances[sender] = _balances[sender] - amount; _balances[recipient] = _balances[recipient] + amount; emit Transfer(sender, recipient, amount); return true; } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "Approve from the zero address"); require(spender != address(0), "Approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "Insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } function takeFee( address sender, address recipient, uint256 amount ) internal returns (uint256) { uint256 feeApplicable = pair == recipient ? totalFeeIfSelling : totalFee; uint256 feeAmount = (amount * feeApplicable) / 100; _balances[address(this)] = _balances[address(this)] + feeAmount; emit Transfer(sender, address(this), feeAmount); return amount - feeAmount; } function swapBack() internal lockTheSwap { uint256 tokensToLiquify = _balances[address(this)]; uint256 amountToLiquify; uint256 devBalance; uint256 proofBalance; uint256 amountEthLiquidity; // Use sell ratios if buy tax too low if (totalFee <= 2) { amountToLiquify = (tokensToLiquify * lpFeeOnSell) / totalFeeIfSelling / 2; } else { amountToLiquify = (tokensToLiquify * lpFee) / totalFee / 2; } uint256 amountToSwap = tokensToLiquify - amountToLiquify; if (amountToSwap == 0) return; address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); uint256 amountETH = address(this).balance; // Use sell ratios if buy tax too low if (totalFee <= 2) { amountEthLiquidity = (amountETH * lpFeeOnSell) / totalFeeIfSelling / 2; } else { amountEthLiquidity = (amountETH * lpFee) / totalFee / 2; } if (amountToLiquify > 0) { router.addLiquidityETH{value: amountEthLiquidity}( address(this), amountToLiquify, 0, 0, 0x000000000000000000000000000000000000dEaD, block.timestamp ); } uint256 amountETHafterLP = address(this).balance; // Use sell ratios if buy tax too low if (totalFee <= 2) { devBalance = (amountETHafterLP * devFeeOnSell) / totalFeeIfSelling; proofBalance = (amountETHafterLP * proofFee) / totalFeeIfSelling; } else { devBalance = (amountETHafterLP * devFee) / totalFee; proofBalance = (amountETHafterLP * proofFee) / totalFee; } uint256 amountEthMain = amountETHafterLP - devBalance - proofBalance; if (amountETH > 0) { if (proofBalance > 0) { uint256 revenueSplit = proofBalance / 2; (bool sent, ) = payable(IFACTORY(factory).proofRevenueAddress()).call{value: revenueSplit}(""); require(sent); (bool sent1, ) = payable(IFACTORY(factory).proofRewardPoolAddress()).call{value: revenueSplit}(""); require(sent1); } if (devBalance > 0) { (bool sent, ) = devWallet.call{value: devBalance}(""); require(sent); } if (amountEthMain > 0) { (bool sent1, ) = mainWallet.call{value: amountEthMain}(""); require(sent1); } } } receive() external payable {} }
{ "optimizer": { "enabled": true, "runs": 200, "details": { "yul": true } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialRouterAddress","type":"address"},{"internalType":"address","name":"initialLockerAddress","type":"address"},{"internalType":"address","name":"initialRewardPoolAddress","type":"address"},{"internalType":"address","name":"initialRevenueAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"address","name":"_address","type":"address"}],"name":"TokenCreated","type":"event"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"percentToLP","type":"uint256"},{"internalType":"uint256","name":"initialMainFee","type":"uint256"},{"internalType":"uint256","name":"initialMainFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialLpFee","type":"uint256"},{"internalType":"uint256","name":"initialLpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialDevFee","type":"uint256"},{"internalType":"uint256","name":"initialDevFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"address","name":"operationsWallet","type":"address"},{"internalType":"address","name":"mainWallet","type":"address"},{"internalType":"uint256","name":"antiSnipeDuration","type":"uint256"}],"internalType":"struct ProofNonReflectionTokenFactory.TokenParam","name":"tokenParam_","type":"tuple"}],"name":"createToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"distributeExcessFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"finalizeToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"lockerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofRevenueAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofRewardPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPoolAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newlockerAddress","type":"address"}],"name":"setLockerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProofAdmin","type":"address"}],"name":"setProofAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRevenueAddress","type":"address"}],"name":"setRevenueAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardPoolAddress","type":"address"}],"name":"setRewardPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validatedPairs","outputs":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"lockId","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004b5738038062004b5783398101604081905262000034916200010b565b6200003f336200009e565b600380546001600160a01b03199081166001600160a01b03968716179091556004805482169486169490941790935560058054841691851691909117905560068054831691909316179091556002805433921691909117905562000168565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200010657600080fd5b919050565b600080600080608085870312156200012257600080fd5b6200012d85620000ee565b93506200013d60208601620000ee565b92506200014d60408601620000ee565b91506200015d60608601620000ee565b905092959194509250565b6149df80620001786000396000f3fe6080604052600436106101235760003560e01c8063715018a6116100a0578063b410908d11610064578063b410908d14610377578063d7e7a9e714610397578063e6a053d0146103b5578063f2fde38b146103d5578063f4f1af3a146103f557600080fd5b8063715018a6146102ef578063845a51ec146103045780638da5cb5b146103245780639a97b07814610342578063b24cf5d71461035757600080fd5b806341cb87fc116100e757806341cb87fc1461024f57806345338d631461026f57806359a51c341461028f578063653ed5d4146102af57806370a78991146102cf57600080fd5b80632423ef7d1461012f5780632dcacf44146101445780633268cc56146101d95780633675f29b146102115780633690e2871461023157600080fd5b3661012a57005b600080fd5b61014261013d3660046113c4565b610408565b005b34801561015057600080fd5b5061019e61015f3660046114f0565b6001602081905260009182526040909120805491810154600282015460039092015460ff8416936001600160a01b036101009091048116939216919085565b6040805195151586526001600160a01b03948516602087015292909316918401919091526060830152608082015260a0015b60405180910390f35b3480156101e557600080fd5b506003546101f9906001600160a01b031681565b6040516001600160a01b0390911681526020016101d0565b34801561021d57600080fd5b506004546101f9906001600160a01b031681565b34801561023d57600080fd5b506005546001600160a01b03166101f9565b34801561025b57600080fd5b5061014261026a3660046114f0565b610953565b34801561027b57600080fd5b5061014261028a3660046114f0565b61097d565b34801561029b57600080fd5b506002546101f9906001600160a01b031681565b3480156102bb57600080fd5b506101426102ca3660046114f0565b6109a7565b3480156102db57600080fd5b506101426102ea3660046114f0565b610cc7565b3480156102fb57600080fd5b50610142610cf1565b34801561031057600080fd5b506006546101f9906001600160a01b031681565b34801561033057600080fd5b506000546001600160a01b03166101f9565b34801561034e57600080fd5b50610142610d05565b34801561036357600080fd5b506101426103723660046114f0565b610e14565b34801561038357600080fd5b506005546101f9906001600160a01b031681565b3480156103a357600080fd5b506006546001600160a01b03166101f9565b3480156103c157600080fd5b506101426103d03660046114f0565b610e3e565b3480156103e157600080fd5b506101426103f03660046114f0565b610e68565b6101426104033660046114f0565b610ee1565b6104154262278d00611514565b81610140015110156104655760405162461bcd60e51b8152602060048201526014602482015273756e6c6f636b20756e646572203330206461797360601b60448201526064015b60405180910390fd5b670de0b6b3a76400003410156104b45760405162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f756768206c697175696469747960601b604482015260640161045c565b6024816101a0015111156105025760405162461bcd60e51b81526020600482015260156024820152740666c40e6cac640c2dce8d25ae6dcd2e0ca40dac2f605b1b604482015260640161045c565b60006040518060c00160405280836080015181526020018360a0015181526020018360c0015181526020018360e00151815260200183610100015181526020018361012001518152509050600060405161055b906112c5565b604051809103906000f080158015610577573d6000803e3d6000fd5b50604080516101408101825285518152602080870151908201528582015181830152606080870151908201523360808201526101608601516001600160a01b0390811660a0830152610180870151811660c0830152600354811660e083015260025481166101008301526101a08701516101208301529151630716a59760e31b8152929350908316916338b52cb891610614918690600401611581565b600060405180830381600087803b15801561062e57600080fd5b505af1158015610642573d6000803e3d6000fd5b50506040516001600160a01b03841681527f2e2b3f61b70d2d131b2a807371103cc98d51adcaa5e9a8f9c32658ad8426e74e9250602001905060405180910390a160035460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529082169063095ea7b3906044016020604051808303816000875af11580156106d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fb9190611685565b506003546040516370a0823160e01b81523060048201526001600160a01b0391821691829163f305d71991349186918216906370a0823190602401602060405180830381865afa158015610753573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077791906116a7565b60008030426040518863ffffffff1660e01b815260040161079d969594939291906116c0565b60606040518083038185885af11580156107bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906107e091906116fb565b505050816001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561081e57600080fd5b505af1158015610832573d6000803e3d6000fd5b505050506040518060a00160405280600015158152602001836001600160a01b031663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611729565b6001600160a01b03908116825233602080840191909152610140979097015160408084019190915260006060938401819052958216865260018089529581902084518154998601516001600160a81b0319909a16901515610100600160a81b031916179883166101000298909817885583015194870180546001600160a01b0319169590911694909417909355918201516002850155506080015160039092019190915550565b61095b61121b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61098561121b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03818116600090815260016020819052604090912001541633146109fd5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b604482015260640161045c565b6001600160a01b03811660009081526001602052604090205460ff1615610a525760405162461bcd60e51b81526020600482015260096024820152681d985b1a59185d195960ba1b604482015260640161045c565b6001600160a01b038181166000908152600160208190526040918290208054910154600354925163095ea7b360e01b81529284166004840181905260001960248501526101009092048416931691839063095ea7b3906044016020604051808303816000875af1158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee9190611685565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5a91906116a7565b9050846001600160a01b031663546a88116040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b9757600080fd5b505af1158015610bab573d6000803e3d6000fd5b5050604051629d473b60e21b81526001600160a01b03851692506302751cec9150610be5908890859060009081908a9042906004016116c0565b60408051808303816000875af1158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190611746565b5050846001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040822080546001600160a81b031916815590810180546001600160a01b031916905560028101829055600301555050505050565b610ccf61121b565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610cf961121b565b610d036000611275565b565b610d0d61121b565b6005546000906001600160a01b0316610d2760024761176a565b604051600081818185875af1925050503d8060008114610d63576040519150601f19603f3d011682016040523d82523d6000602084013e610d68565b606091505b5050905080610d935760405162461bcd60e51b8152602060048201526000602482015260440161045c565b6006546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610de0576040519150601f19603f3d011682016040523d82523d6000602084013e610de5565b606091505b5050905080610e105760405162461bcd60e51b8152602060048201526000602482015260440161045c565b5050565b610e1c61121b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b610e4661121b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610e7061121b565b6001600160a01b038116610ed55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045c565b610ede81611275565b50565b6001600160a01b0381811660009081526001602081905260409091200154163314610f375760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b604482015260640161045c565b6001600160a01b03811660009081526001602052604090205460ff1615610f8c5760405162461bcd60e51b81526020600482015260096024820152681d985b1a59185d195960ba1b604482015260640161045c565b6001600160a01b0381811660009081526001602052604090819020805460029091015460048054935163095ea7b360e01b81529385169084015260001960248401526101009091049092169190829063095ea7b3906044016020604051808303816000875af1158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190611685565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561106f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109391906116a7565b60048054604051635af06fed60e01b81526001600160a01b0387811693820193909352336024820152604481018490526064810186905260006084820181905260a48201819052939450911690635af06fed90349060c40160206040518083038185885af1158015611109573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061112e91906116a7565b6001600160a01b038616600081815260016020526040808220600301849055805163fbd7575360e01b81529051939450919263fbd7575392600480820193929182900301818387803b15801561118357600080fd5b505af1158015611197573d6000803e3d6000fd5b50505050846001600160a01b03166327193bc46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111d657600080fd5b505af11580156111ea573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040909120805460ff191690911790555050505050565b6000546001600160a01b03163314610d035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61321d8061178d83390190565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff8111828210171561130c5761130c6112d2565b60405290565b600082601f83011261132357600080fd5b813567ffffffffffffffff8082111561133e5761133e6112d2565b604051601f8301601f19908116603f01168101908282118183101715611366576113666112d2565b8160405283815286602085880101111561137f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610ede57600080fd5b80356113bf8161139f565b919050565b6000602082840312156113d657600080fd5b813567ffffffffffffffff808211156113ee57600080fd5b908301906101c0828603121561140357600080fd5b61140b6112e8565b82358281111561141a57600080fd5b61142687828601611312565b82525060208301358281111561143b57600080fd5b61144787828601611312565b60208301525060408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e082015261010091508183013582820152610120915081830135828201526101409150818301358282015261016091506114c08284016113b4565b8282015261018091506114d48284016113b4565b918101919091526101a091820135918101919091529392505050565b60006020828403121561150257600080fd5b813561150d8161139f565b9392505050565b8082018082111561153557634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845260005b8181101561156157602081850181015186830182015201611545565b506000602082860101526020601f19601f83011685010191505092915050565b60e08152600083516101408060e08501526115a061022085018361153b565b9150602086015161010060df1986850301818701526115bf848361153b565b9350604088015191506101208281880152606089015184880152608089015193506115f66101608801856001600160a01b03169052565b60a0898101516001600160a01b039081166101808a015260c0808c015182166101a08b015260e08c015182166101c08b0152938b0151166101e089015290890151610200880152875160208089019190915288015160408089019190915288015160608089019190915288015160808089019190915288015187820152870151908601525090915061150d9050565b60006020828403121561169757600080fd5b8151801515811461150d57600080fd5b6000602082840312156116b957600080fd5b5051919050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121561171057600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561173b57600080fd5b815161150d8161139f565b6000806040838503121561175957600080fd5b505080516020909101519092909150565b60008261178757634e487b7160e01b600052601260045260246000fd5b50049056fe60806040526005805460ff60a01b1916600160a01b1790556002600a556018805461010160a81b61ffff60a81b1990911617905534801561003f57600080fd5b50601580546001600160a01b031916331790556131bc806100616000396000f3fe6080604052600436106103905760003560e01c8063807c2d9c116101dc578063bfd7928411610102578063d920334e116100a0578063f16fd78d1161006f578063f16fd78d14610a5e578063f887ea4014610a7e578063fabe628314610a9e578063fbd7575314610abe57600080fd5b8063d920334e146109c3578063dd62ed3e146109e3578063e66b1d1e14610a29578063ef92e22214610a4957600080fd5b8063cb29813c116100dc578063cb29813c1461094c578063cd1e330a1461096c578063d0a5eb4e14610982578063d4fb9a01146109a257600080fd5b8063bfd79284146108e6578063c45a015514610916578063ca987b0e1461093657600080fd5b8063a3e676101161017a578063aa8e79c211610149578063aa8e79c214610884578063b0c8edbd1461089a578063bb542ef0146108b0578063bf56b371146108d057600080fd5b8063a3e6761014610804578063a457c2d714610824578063a8aa1b3114610844578063a9059cbb1461086457600080fd5b80639502c426116101b65780639502c426146107a357806395d89b41146107b9578063985b9db0146107ce578063a3a2e89e146107e457600080fd5b8063807c2d9c1461073d5780638b42507f146107535780638ea5220f1461078357600080fd5b806339509351116102c1578063546a88111161025f57806370a082311161022e57806370a08231146106bb5780637c0ff205146106f15780637d1db4a5146107075780637db1342c1461071d57600080fd5b8063546a88111461065a57806359a51c341461066f5780636827e7641461068f578063704ce43e146106a557600080fd5b80633f4218e01161029b5780633f4218e0146105b85780634355855a146105e857806344de2e4c146106185780634a74bb021461063957600080fd5b806339509351146105585780633c822812146105785780633dab52691461059857600080fd5b806323b62b751161032e578063273123b711610308578063273123b7146104e75780632b112e4914610507578063313ce5671461051c57806338b52cb81461053857600080fd5b806323b62b751461047a57806323b872dd146104b257806327193bc4146104d257600080fd5b80630963da6c1161036a5780630963da6c1461041757806318160ddd1461042d5780631df4ccfc146104425780631f53ac021461045857600080fd5b80630445b6671461039c57806306fdde03146103c5578063095ea7b3146103e757600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b2601e5481565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103da610ad3565b6040516103bc91906129de565b3480156103f357600080fd5b50610407610402366004612a51565b610b65565b60405190151581526020016103bc565b34801561042357600080fd5b506103b2600b5481565b34801561043957600080fd5b506002546103b2565b34801561044e57600080fd5b506103b260115481565b34801561046457600080fd5b50610478610473366004612a7d565b610b7f565b005b34801561048657600080fd5b5060185461049a906001600160a01b031681565b6040516001600160a01b0390911681526020016103bc565b3480156104be57600080fd5b506104076104cd366004612a9a565b610bd4565b3480156104de57600080fd5b50610478610bfb565b3480156104f357600080fd5b50610478610502366004612a7d565b610c77565b34801561051357600080fd5b506103b2610d0d565b34801561052857600080fd5b50604051600981526020016103bc565b34801561054457600080fd5b50610478610553366004612c22565b610d79565b34801561056457600080fd5b50610407610573366004612a51565b611356565b34801561058457600080fd5b50610478610593366004612d41565b611395565b3480156105a457600080fd5b506104786105b3366004612d6a565b6114a6565b3480156105c457600080fd5b506104076105d3366004612a7d565b60066020526000908152604090205460ff1681565b3480156105f457600080fd5b50610407610603366004612a7d565b60086020526000908152604090205460ff1681565b34801561062457600080fd5b5060055461040790600160a01b900460ff1681565b34801561064557600080fd5b5060185461040790600160a81b900460ff1681565b34801561066657600080fd5b506104786114f2565b34801561067b57600080fd5b5060055461049a906001600160a01b031681565b34801561069b57600080fd5b506103b2600d5481565b3480156106b157600080fd5b506103b2600c5481565b3480156106c757600080fd5b506103b26106d6366004612a7d565b6001600160a01b031660009081526020819052604090205490565b3480156106fd57600080fd5b506103b2600f5481565b34801561071357600080fd5b506103b2601c5481565b34801561072957600080fd5b50610478610738366004612d41565b611598565b34801561074957600080fd5b506103b2601d5481565b34801561075f57600080fd5b5061040761076e366004612a7d565b60076020526000908152604090205460ff1681565b34801561078f57600080fd5b5060175461049a906001600160a01b031681565b3480156107af57600080fd5b506103b260105481565b3480156107c557600080fd5b506103da611692565b3480156107da57600080fd5b506103b2600e5481565b3480156107f057600080fd5b506104786107ff366004612d86565b6116a1565b34801561081057600080fd5b5060165461049a906001600160a01b031681565b34801561083057600080fd5b5061040761083f366004612a51565b6116f6565b34801561085057600080fd5b5060145461049a906001600160a01b031681565b34801561087057600080fd5b5061040761087f366004612a51565b611785565b34801561089057600080fd5b506103b2601a5481565b3480156108a657600080fd5b506103b2601b5481565b3480156108bc57600080fd5b506104786108cb366004612a7d565b611793565b3480156108dc57600080fd5b506103b260095481565b3480156108f257600080fd5b50610407610901366004612a7d565b60196020526000908152604090205460ff1681565b34801561092257600080fd5b5060155461049a906001600160a01b031681565b34801561094257600080fd5b506103b260125481565b34801561095857600080fd5b50610478610967366004612db2565b6117df565b34801561097857600080fd5b506103b2600a5481565b34801561098e57600080fd5b5061047861099d366004612a7d565b6118fe565b3480156109ae57600080fd5b5060185461040790600160b01b900460ff1681565b3480156109cf57600080fd5b506104786109de366004612d41565b61194a565b3480156109ef57600080fd5b506103b26109fe366004612df5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a3557600080fd5b50610478610a44366004612e2e565b611a44565b348015610a5557600080fd5b50610478611a8c565b348015610a6a57600080fd5b50610478610a79366004612a7d565b611b9d565b348015610a8a57600080fd5b5060135461049a906001600160a01b031681565b348015610aaa57600080fd5b50610478610ab9366004612d86565b611c19565b348015610aca57600080fd5b50610478611c6e565b606060038054610ae290612e49565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0e90612e49565b8015610b5b5780601f10610b3057610100808354040283529160200191610b5b565b820191906000526020600020905b815481529060010190602001808311610b3e57829003601f168201915b5050505050905090565b600033610b73818585611cb9565b60019150505b92915050565b6016546001600160a01b03163314610bb25760405162461bcd60e51b8152600401610ba990612e83565b60405180910390fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600033610be2858285611dc6565b610bed858585611e51565b5060019150505b9392505050565b6015546001600160a01b03163314610c255760405162461bcd60e51b8152600401610ba990612eba565b60095415610c605760405162461bcd60e51b81526020600482015260086024820152671b185d5b98da195960c21b6044820152606401610ba9565b426009819055601a54610c7291612f07565b601b55565b60055433906001600160a01b0316811480610c9f57506016546001600160a01b038281169116145b610ceb5760405162461bcd60e51b815260206004820152601e60248201527f43616c6c657220646f65736e27742068617665207065726d697373696f6e00006044820152606401610ba9565b506001600160a01b03166000908152601960205260409020805460ff19169055565b600060208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461dead82527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf8354600254610d6a9190612f1a565b610d749190612f1a565b905090565b6015546001600160a01b03163314610da35760405162461bcd60e51b8152600401610ba990612eba565b8151600390610db29082612f78565b506020820151600490610dc59082612f78565b506040820151600255606082015160461115610e0d5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610ba9565b6103e882604001516005610e219190613038565b610e2b919061304f565b601c556040820151606490610e41906001613038565b610e4b919061304f565b601d556040820151610fa090610e62906005613038565b610e6c919061304f565b601e5560e0820151601380546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190613071565b6001600160a01b031663c9c65396601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f769190613071565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015610fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe69190613071565b601480546001600160a01b0319166001600160a01b03928316178155306000818152600160208181526040808420601354881685528252808420600019905593835260068152838320805460ff1990811684179091556015805488168552858520805483168517905560808a810180518a16875287872080548516871790555189168652600784528686208054841686179055965488168552858520805483168517905554909616835283832080548716831790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80548716831790559180527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805490951617909355830151600c8190556060840151600f5590830151600d81905560a08401516010558351600b81905592840151600e55600a54929161112e91612f07565b6111389190612f07565b6111429190612f07565b601155600a54600e54600f5460105461115b9190612f07565b6111659190612f07565b61116f9190612f07565b601255601154600c10156111b05760405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606401610ba9565b601160125411156111ee5760405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606401610ba9565b6080820151601680546001600160a01b039283166001600160a01b03199182161790915560a08401516017805491841691831691909117905560c08401516018805491841691831691909117905561010084015160058054919093169116179055606082015160408301516000916064916112699190613038565b611273919061304f565b905060008184604001516112879190612f1a565b336000908152602081905260408120805492935084929091906112ab908490612f07565b909155505060808401516001600160a01b0316600090815260208190526040812080548392906112dc908490612f07565b9091555050610120840151601a5560405182815233906000906000805160206131678339815191529060200160405180910390a383608001516001600160a01b031660006001600160a01b03166000805160206131678339815191528360405161134891815260200190565b60405180910390a350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610b739082908690611390908790612f07565b611cb9565b6005546001600160a01b031633146113ef5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74207468652070726f6f6641646d696e000000006044820152606401610ba9565b6009546000036114115760405162461bcd60e51b8152600401610ba99061308e565b600954611421906203f480612f07565b421061149557600181111561143557600080fd5b600a819055600b54600c54600d54839161144e91612f07565b6114589190612f07565b6114629190612f07565b601155600e54600a54600f5460105461147b9190612f07565b6114859190612f07565b61148f9190612f07565b60125550565b600281111561143557600080fd5b50565b6016546001600160a01b031633146114d05760405162461bcd60e51b8152600401610ba990612e83565b60188054921515600160a81b0260ff60a81b1990931692909217909155601e55565b6015546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610ba990612eba565b601380546001600160a01b039081166000908152600660209081526040808320805460ff1990811660019081179092559554851684526007909252808320805486168317905560165490931682529190208054909216179055601880546005805460ff60a01b1916905561ffff60a81b1916600160b01b179055565b6016546001600160a01b031633146115c25760405162461bcd60e51b8152600401610ba990612e83565b6009546000036115e45760405162461bcd60e51b8152600401610ba99061308e565b6103e860025460056115f69190613038565b611600919061304f565b81101561163a5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606401610ba9565b6064600254600361164b9190613038565b611655919061304f565b81111561168d5760405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606401610ba9565b601d55565b606060048054610ae290612e49565b6016546001600160a01b031633146116cb5760405162461bcd60e51b8152600401610ba990612e83565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561176d5760405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606401610ba9565b61177a8286868403611cb9565b506001949350505050565b60003361177a818585611e51565b6016546001600160a01b031633146117bd5760405162461bcd60e51b8152600401610ba990612e83565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031633146118095760405162461bcd60e51b8152600401610ba990612e83565b600b869055600c849055600d829055600e859055600f8390556010819055600a5486906118368685612f07565b6118409190612f07565b61184a9190612f07565b601155600e54600a54600f546010546118639190612f07565b61186d9190612f07565b6118779190612f07565b601255601154600c10156118b85760405162461bcd60e51b8152602060048201526008602482015267486967682066656560c01b6044820152606401610ba9565b601160125411156118f65760405162461bcd60e51b8152602060048201526008602482015267486967682066656560c01b6044820152606401610ba9565b505050505050565b6016546001600160a01b031633146119285760405162461bcd60e51b8152600401610ba990612e83565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031633146119745760405162461bcd60e51b8152600401610ba990612e83565b6009546000036119965760405162461bcd60e51b8152600401610ba99061308e565b6103e860025460056119a89190613038565b6119b2919061304f565b8110156119ec5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606401610ba9565b606460025460036119fd9190613038565b611a07919061304f565b811115611a3f5760405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606401610ba9565b601c55565b6016546001600160a01b03163314611a6e5760405162461bcd60e51b8152600401610ba990612e83565b60058054911515600160a01b0260ff60a01b19909216919091179055565b6016546001600160a01b03163314611ab65760405162461bcd60e51b8152600401610ba990612e83565b600a54600214611afb5760405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606401610ba9565b600954600003611b1d5760405162461bcd60e51b8152600401610ba99061308e565b600954611b2d906203f480612f07565b421015611b3957600080fd5b6001600a81905550600b54600a54600c54600d54611b579190612f07565b611b619190612f07565b611b6b9190612f07565b601155600e54600a54600f54601054611b849190612f07565b611b8e9190612f07565b611b989190612f07565b601255565b6005546001600160a01b03163314611bf75760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74207468652070726f6f6641646d696e000000006044820152606401610ba9565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b03163314611c435760405162461bcd60e51b8152600401610ba990612e83565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6015546001600160a01b03163314611c985760405162461bcd60e51b8152600401610ba990612eba565b6018805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6001600160a01b038316611d0f5760405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606401610ba9565b6001600160a01b038216611d655760405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606401610ba9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611e4b5781811015611e3e5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610ba9565b611e4b8484848403611cb9565b50505050565b601854600090600160b01b900460ff16611e965760405162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b6044820152606401610ba9565b6001600160a01b03841660009081526019602052604090205460ff16158015611ed857506001600160a01b03831660009081526019602052604090205460ff16155b611ee157600080fd5b601b5415801590611ef35750601b5442105b15611f5557326000818152601960205260409020805460ff191660011790556001600160a01b03841614611f555760405162461bcd60e51b8152602060048201526009602482015268616e7469736e69706560b81b6044820152606401610ba9565b601854600160a01b900460ff1615611f7957611f72848484612256565b9050610bf4565b6014546001600160a01b038481169116148015611f9f5750600554600160a01b900460ff165b1561202557601c5482111580611ff057506001600160a01b03841660009081526007602052604090205460ff168015611ff057506001600160a01b03831660009081526007602052604090205460ff165b6120255760405162461bcd60e51b815260206004820152600660248201526509ac2f040a8b60d31b6044820152606401610ba9565b6001600160a01b03831660009081526007602052604090205460ff161580156120575750600554600160a01b900460ff165b156120be57601d546001600160a01b038416600090815260208190526040902054612083908490612f07565b11156120be5760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610ba9565b6014546001600160a01b038581169116148015906120e65750601854600160a01b900460ff16155b80156120fb5750601854600160a81b900460ff165b80156121185750601e543060009081526020819052604090205410155b15612125576121256122f6565b6001600160a01b038416600090815260208190526040902054612149908390612f1a565b6001600160a01b0380861660008181526020819052604090209290925560145484929116148061218657506014546001600160a01b038581169116145b156121e5576001600160a01b03851660009081526006602052604090205460ff161580156121cd57506001600160a01b03841660009081526006602052604090205460ff16155b6121d757826121e2565b6121e285858561292d565b90505b6001600160a01b038416600090815260208190526040902054612209908290612f07565b6001600160a01b03858116600081815260208181526040918290209490945551848152909291881691600080516020613167833981519152910160405180910390a3506001949350505050565b6001600160a01b03831660009081526020819052604081205461227a908390612f1a565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546122aa908390612f07565b6001600160a01b03848116600081815260208181526040918290209490945551858152909291871691600080516020613167833981519152910160405180910390a35060019392505050565b6018805460ff60a01b1916600160a01b1790553060009081526020819052604081205460115490919081908190819060021061235a576002601254600f548761233f9190613038565b612349919061304f565b612353919061304f565b9350612384565b6002601154600c548761236d9190613038565b612377919061304f565b612381919061304f565b93505b60006123908587612f1a565b9050806000036123a55750505050505061291e565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106123da576123da6130b1565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124579190613071565b8160018151811061246a5761246a6130b1565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac947906124b09085906000908690309042906004016130c7565b600060405180830381600087803b1580156124ca57600080fd5b505af11580156124de573d6000803e3d6000fd5b50505050600047905060026011541161251f576002601254600f54836125049190613038565b61250e919061304f565b612518919061304f565b9350612549565b6002601154600c54836125329190613038565b61253c919061304f565b612546919061304f565b93505b86156125e65760135460405163f305d71960e01b815230600482015260248101899052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990869060c40160606040518083038185885af11580156125bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125e29190613138565b5050505b6011544790600210612630576012546010546126029083613038565b61260c919061304f565b9650601254600a548261261f9190613038565b612629919061304f565b955061266a565b601154600d546126409083613038565b61264a919061304f565b9650601154600a548261265d9190613038565b612667919061304f565b95505b6000866126778984612f1a565b6126819190612f1a565b9050821561291357861561284357600061269c60028961304f565b90506000601560009054906101000a90046001600160a01b03166001600160a01b0316633690e2876040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127179190613071565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114612761576040519150601f19603f3d011682016040523d82523d6000602084013e612766565b606091505b505090508061277457600080fd5b6015546040805163d7e7a9e760e01b815290516000926001600160a01b03169163d7e7a9e79160048083019260209291908290030181865afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e29190613071565b6001600160a01b03168360405160006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b505090508061283f57600080fd5b5050505b87156128ab576017546040516000916001600160a01b0316908a908381818185875af1925050503d8060008114612896576040519150601f19603f3d011682016040523d82523d6000602084013e61289b565b606091505b50509050806128a957600080fd5b505b8015612913576018546040516000916001600160a01b03169083908381818185875af1925050503d80600081146128fe576040519150601f19603f3d011682016040523d82523d6000602084013e612903565b606091505b505090508061291157600080fd5b505b505050505050505050505b6018805460ff60a01b19169055565b60145460009081906001600160a01b0385811691161461294f57601154612953565b6012545b9050600060646129638386613038565b61296d919061304f565b3060009081526020819052604090205490915061298b908290612f07565b3060008181526020818152604091829020939093555183815290916001600160a01b03891691600080516020613167833981519152910160405180910390a36129d48185612f1a565b9695505050505050565b600060208083528351808285015260005b81811015612a0b578581018301518582016040015282016129ef565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146114a357600080fd5b8035612a4c81612a2c565b919050565b60008060408385031215612a6457600080fd5b8235612a6f81612a2c565b946020939093013593505050565b600060208284031215612a8f57600080fd5b8135610bf481612a2c565b600080600060608486031215612aaf57600080fd5b8335612aba81612a2c565b92506020840135612aca81612a2c565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff81118282101715612b1557612b15612adb565b60405290565b600082601f830112612b2c57600080fd5b813567ffffffffffffffff80821115612b4757612b47612adb565b604051601f8301601f19908116603f01168101908282118183101715612b6f57612b6f612adb565b81604052838152866020858801011115612b8857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060c08284031215612bba57600080fd5b60405160c0810181811067ffffffffffffffff82111715612bdd57612bdd612adb565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b60008060e08385031215612c3557600080fd5b823567ffffffffffffffff80821115612c4d57600080fd5b908401906101408287031215612c6257600080fd5b612c6a612af1565b823582811115612c7957600080fd5b612c8588828601612b1b565b825250602083013582811115612c9a57600080fd5b612ca688828601612b1b565b6020830152506040830135604082015260608301356060820152612ccc60808401612a41565b6080820152612cdd60a08401612a41565b60a0820152612cee60c08401612a41565b60c0820152612cff60e08401612a41565b60e08201526101009150612d14828401612a41565b8282015261012091508183013582820152809450505050612d388460208501612ba8565b90509250929050565b600060208284031215612d5357600080fd5b5035919050565b80358015158114612a4c57600080fd5b60008060408385031215612d7d57600080fd5b612a6f83612d5a565b60008060408385031215612d9957600080fd5b8235612da481612a2c565b9150612d3860208401612d5a565b60008060008060008060c08789031215612dcb57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008060408385031215612e0857600080fd5b8235612e1381612a2c565b91506020830135612e2381612a2c565b809150509250929050565b600060208284031215612e4057600080fd5b610bf482612d5a565b600181811c90821680612e5d57607f821691505b602082108103612e7d57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526019908201527f43616c6c6572206973206e6f742074686520666163746f727900000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b7957610b79612ef1565b81810381811115610b7957610b79612ef1565b601f821115612f7357600081815260208120601f850160051c81016020861015612f545750805b601f850160051c820191505b818110156118f657828155600101612f60565b505050565b815167ffffffffffffffff811115612f9257612f92612adb565b612fa681612fa08454612e49565b84612f2d565b602080601f831160018114612fdb5760008415612fc35750858301515b600019600386901b1c1916600185901b1785556118f6565b600085815260208120601f198616915b8281101561300a57888601518255948401946001909101908401612feb565b50858210156130285787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610b7957610b79612ef1565b60008261306c57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561308357600080fd5b8151610bf481612a2c565b602080825260099082015268085b185d5b98da195960ba1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156131175784516001600160a01b0316835293830193918301916001016130f2565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561314d57600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220372d5e153316c77b8408e4e2677efd724660eba7ce605a2304baa7a758fd325564736f6c63430008110033a26469706673582212202ba5fa4a570c8abeb308e86ae403d32ca46b2089a05b9576dd47e7d057003f9564736f6c634300081100330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e2fe530c047f2d85298b07d9333c05737f1435fb000000000000000000000000cf170d0b07a54844b471cbbe74d2af254245ab54000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e
Deployed Bytecode
0x6080604052600436106101235760003560e01c8063715018a6116100a0578063b410908d11610064578063b410908d14610377578063d7e7a9e714610397578063e6a053d0146103b5578063f2fde38b146103d5578063f4f1af3a146103f557600080fd5b8063715018a6146102ef578063845a51ec146103045780638da5cb5b146103245780639a97b07814610342578063b24cf5d71461035757600080fd5b806341cb87fc116100e757806341cb87fc1461024f57806345338d631461026f57806359a51c341461028f578063653ed5d4146102af57806370a78991146102cf57600080fd5b80632423ef7d1461012f5780632dcacf44146101445780633268cc56146101d95780633675f29b146102115780633690e2871461023157600080fd5b3661012a57005b600080fd5b61014261013d3660046113c4565b610408565b005b34801561015057600080fd5b5061019e61015f3660046114f0565b6001602081905260009182526040909120805491810154600282015460039092015460ff8416936001600160a01b036101009091048116939216919085565b6040805195151586526001600160a01b03948516602087015292909316918401919091526060830152608082015260a0015b60405180910390f35b3480156101e557600080fd5b506003546101f9906001600160a01b031681565b6040516001600160a01b0390911681526020016101d0565b34801561021d57600080fd5b506004546101f9906001600160a01b031681565b34801561023d57600080fd5b506005546001600160a01b03166101f9565b34801561025b57600080fd5b5061014261026a3660046114f0565b610953565b34801561027b57600080fd5b5061014261028a3660046114f0565b61097d565b34801561029b57600080fd5b506002546101f9906001600160a01b031681565b3480156102bb57600080fd5b506101426102ca3660046114f0565b6109a7565b3480156102db57600080fd5b506101426102ea3660046114f0565b610cc7565b3480156102fb57600080fd5b50610142610cf1565b34801561031057600080fd5b506006546101f9906001600160a01b031681565b34801561033057600080fd5b506000546001600160a01b03166101f9565b34801561034e57600080fd5b50610142610d05565b34801561036357600080fd5b506101426103723660046114f0565b610e14565b34801561038357600080fd5b506005546101f9906001600160a01b031681565b3480156103a357600080fd5b506006546001600160a01b03166101f9565b3480156103c157600080fd5b506101426103d03660046114f0565b610e3e565b3480156103e157600080fd5b506101426103f03660046114f0565b610e68565b6101426104033660046114f0565b610ee1565b6104154262278d00611514565b81610140015110156104655760405162461bcd60e51b8152602060048201526014602482015273756e6c6f636b20756e646572203330206461797360601b60448201526064015b60405180910390fd5b670de0b6b3a76400003410156104b45760405162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f756768206c697175696469747960601b604482015260640161045c565b6024816101a0015111156105025760405162461bcd60e51b81526020600482015260156024820152740666c40e6cac640c2dce8d25ae6dcd2e0ca40dac2f605b1b604482015260640161045c565b60006040518060c00160405280836080015181526020018360a0015181526020018360c0015181526020018360e00151815260200183610100015181526020018361012001518152509050600060405161055b906112c5565b604051809103906000f080158015610577573d6000803e3d6000fd5b50604080516101408101825285518152602080870151908201528582015181830152606080870151908201523360808201526101608601516001600160a01b0390811660a0830152610180870151811660c0830152600354811660e083015260025481166101008301526101a08701516101208301529151630716a59760e31b8152929350908316916338b52cb891610614918690600401611581565b600060405180830381600087803b15801561062e57600080fd5b505af1158015610642573d6000803e3d6000fd5b50506040516001600160a01b03841681527f2e2b3f61b70d2d131b2a807371103cc98d51adcaa5e9a8f9c32658ad8426e74e9250602001905060405180910390a160035460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529082169063095ea7b3906044016020604051808303816000875af11580156106d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fb9190611685565b506003546040516370a0823160e01b81523060048201526001600160a01b0391821691829163f305d71991349186918216906370a0823190602401602060405180830381865afa158015610753573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077791906116a7565b60008030426040518863ffffffff1660e01b815260040161079d969594939291906116c0565b60606040518083038185885af11580156107bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906107e091906116fb565b505050816001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561081e57600080fd5b505af1158015610832573d6000803e3d6000fd5b505050506040518060a00160405280600015158152602001836001600160a01b031663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611729565b6001600160a01b03908116825233602080840191909152610140979097015160408084019190915260006060938401819052958216865260018089529581902084518154998601516001600160a81b0319909a16901515610100600160a81b031916179883166101000298909817885583015194870180546001600160a01b0319169590911694909417909355918201516002850155506080015160039092019190915550565b61095b61121b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61098561121b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03818116600090815260016020819052604090912001541633146109fd5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b604482015260640161045c565b6001600160a01b03811660009081526001602052604090205460ff1615610a525760405162461bcd60e51b81526020600482015260096024820152681d985b1a59185d195960ba1b604482015260640161045c565b6001600160a01b038181166000908152600160208190526040918290208054910154600354925163095ea7b360e01b81529284166004840181905260001960248501526101009092048416931691839063095ea7b3906044016020604051808303816000875af1158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee9190611685565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5a91906116a7565b9050846001600160a01b031663546a88116040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b9757600080fd5b505af1158015610bab573d6000803e3d6000fd5b5050604051629d473b60e21b81526001600160a01b03851692506302751cec9150610be5908890859060009081908a9042906004016116c0565b60408051808303816000875af1158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190611746565b5050846001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040822080546001600160a81b031916815590810180546001600160a01b031916905560028101829055600301555050505050565b610ccf61121b565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610cf961121b565b610d036000611275565b565b610d0d61121b565b6005546000906001600160a01b0316610d2760024761176a565b604051600081818185875af1925050503d8060008114610d63576040519150601f19603f3d011682016040523d82523d6000602084013e610d68565b606091505b5050905080610d935760405162461bcd60e51b8152602060048201526000602482015260440161045c565b6006546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610de0576040519150601f19603f3d011682016040523d82523d6000602084013e610de5565b606091505b5050905080610e105760405162461bcd60e51b8152602060048201526000602482015260440161045c565b5050565b610e1c61121b565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b610e4661121b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610e7061121b565b6001600160a01b038116610ed55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045c565b610ede81611275565b50565b6001600160a01b0381811660009081526001602081905260409091200154163314610f375760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b604482015260640161045c565b6001600160a01b03811660009081526001602052604090205460ff1615610f8c5760405162461bcd60e51b81526020600482015260096024820152681d985b1a59185d195960ba1b604482015260640161045c565b6001600160a01b0381811660009081526001602052604090819020805460029091015460048054935163095ea7b360e01b81529385169084015260001960248401526101009091049092169190829063095ea7b3906044016020604051808303816000875af1158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190611685565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561106f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109391906116a7565b60048054604051635af06fed60e01b81526001600160a01b0387811693820193909352336024820152604481018490526064810186905260006084820181905260a48201819052939450911690635af06fed90349060c40160206040518083038185885af1158015611109573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061112e91906116a7565b6001600160a01b038616600081815260016020526040808220600301849055805163fbd7575360e01b81529051939450919263fbd7575392600480820193929182900301818387803b15801561118357600080fd5b505af1158015611197573d6000803e3d6000fd5b50505050846001600160a01b03166327193bc46040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111d657600080fd5b505af11580156111ea573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040909120805460ff191690911790555050505050565b6000546001600160a01b03163314610d035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61321d8061178d83390190565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff8111828210171561130c5761130c6112d2565b60405290565b600082601f83011261132357600080fd5b813567ffffffffffffffff8082111561133e5761133e6112d2565b604051601f8301601f19908116603f01168101908282118183101715611366576113666112d2565b8160405283815286602085880101111561137f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610ede57600080fd5b80356113bf8161139f565b919050565b6000602082840312156113d657600080fd5b813567ffffffffffffffff808211156113ee57600080fd5b908301906101c0828603121561140357600080fd5b61140b6112e8565b82358281111561141a57600080fd5b61142687828601611312565b82525060208301358281111561143b57600080fd5b61144787828601611312565b60208301525060408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e082015261010091508183013582820152610120915081830135828201526101409150818301358282015261016091506114c08284016113b4565b8282015261018091506114d48284016113b4565b918101919091526101a091820135918101919091529392505050565b60006020828403121561150257600080fd5b813561150d8161139f565b9392505050565b8082018082111561153557634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845260005b8181101561156157602081850181015186830182015201611545565b506000602082860101526020601f19601f83011685010191505092915050565b60e08152600083516101408060e08501526115a061022085018361153b565b9150602086015161010060df1986850301818701526115bf848361153b565b9350604088015191506101208281880152606089015184880152608089015193506115f66101608801856001600160a01b03169052565b60a0898101516001600160a01b039081166101808a015260c0808c015182166101a08b015260e08c015182166101c08b0152938b0151166101e089015290890151610200880152875160208089019190915288015160408089019190915288015160608089019190915288015160808089019190915288015187820152870151908601525090915061150d9050565b60006020828403121561169757600080fd5b8151801515811461150d57600080fd5b6000602082840312156116b957600080fd5b5051919050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121561171057600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561173b57600080fd5b815161150d8161139f565b6000806040838503121561175957600080fd5b505080516020909101519092909150565b60008261178757634e487b7160e01b600052601260045260246000fd5b50049056fe60806040526005805460ff60a01b1916600160a01b1790556002600a556018805461010160a81b61ffff60a81b1990911617905534801561003f57600080fd5b50601580546001600160a01b031916331790556131bc806100616000396000f3fe6080604052600436106103905760003560e01c8063807c2d9c116101dc578063bfd7928411610102578063d920334e116100a0578063f16fd78d1161006f578063f16fd78d14610a5e578063f887ea4014610a7e578063fabe628314610a9e578063fbd7575314610abe57600080fd5b8063d920334e146109c3578063dd62ed3e146109e3578063e66b1d1e14610a29578063ef92e22214610a4957600080fd5b8063cb29813c116100dc578063cb29813c1461094c578063cd1e330a1461096c578063d0a5eb4e14610982578063d4fb9a01146109a257600080fd5b8063bfd79284146108e6578063c45a015514610916578063ca987b0e1461093657600080fd5b8063a3e676101161017a578063aa8e79c211610149578063aa8e79c214610884578063b0c8edbd1461089a578063bb542ef0146108b0578063bf56b371146108d057600080fd5b8063a3e6761014610804578063a457c2d714610824578063a8aa1b3114610844578063a9059cbb1461086457600080fd5b80639502c426116101b65780639502c426146107a357806395d89b41146107b9578063985b9db0146107ce578063a3a2e89e146107e457600080fd5b8063807c2d9c1461073d5780638b42507f146107535780638ea5220f1461078357600080fd5b806339509351116102c1578063546a88111161025f57806370a082311161022e57806370a08231146106bb5780637c0ff205146106f15780637d1db4a5146107075780637db1342c1461071d57600080fd5b8063546a88111461065a57806359a51c341461066f5780636827e7641461068f578063704ce43e146106a557600080fd5b80633f4218e01161029b5780633f4218e0146105b85780634355855a146105e857806344de2e4c146106185780634a74bb021461063957600080fd5b806339509351146105585780633c822812146105785780633dab52691461059857600080fd5b806323b62b751161032e578063273123b711610308578063273123b7146104e75780632b112e4914610507578063313ce5671461051c57806338b52cb81461053857600080fd5b806323b62b751461047a57806323b872dd146104b257806327193bc4146104d257600080fd5b80630963da6c1161036a5780630963da6c1461041757806318160ddd1461042d5780631df4ccfc146104425780631f53ac021461045857600080fd5b80630445b6671461039c57806306fdde03146103c5578063095ea7b3146103e757600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b2601e5481565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103da610ad3565b6040516103bc91906129de565b3480156103f357600080fd5b50610407610402366004612a51565b610b65565b60405190151581526020016103bc565b34801561042357600080fd5b506103b2600b5481565b34801561043957600080fd5b506002546103b2565b34801561044e57600080fd5b506103b260115481565b34801561046457600080fd5b50610478610473366004612a7d565b610b7f565b005b34801561048657600080fd5b5060185461049a906001600160a01b031681565b6040516001600160a01b0390911681526020016103bc565b3480156104be57600080fd5b506104076104cd366004612a9a565b610bd4565b3480156104de57600080fd5b50610478610bfb565b3480156104f357600080fd5b50610478610502366004612a7d565b610c77565b34801561051357600080fd5b506103b2610d0d565b34801561052857600080fd5b50604051600981526020016103bc565b34801561054457600080fd5b50610478610553366004612c22565b610d79565b34801561056457600080fd5b50610407610573366004612a51565b611356565b34801561058457600080fd5b50610478610593366004612d41565b611395565b3480156105a457600080fd5b506104786105b3366004612d6a565b6114a6565b3480156105c457600080fd5b506104076105d3366004612a7d565b60066020526000908152604090205460ff1681565b3480156105f457600080fd5b50610407610603366004612a7d565b60086020526000908152604090205460ff1681565b34801561062457600080fd5b5060055461040790600160a01b900460ff1681565b34801561064557600080fd5b5060185461040790600160a81b900460ff1681565b34801561066657600080fd5b506104786114f2565b34801561067b57600080fd5b5060055461049a906001600160a01b031681565b34801561069b57600080fd5b506103b2600d5481565b3480156106b157600080fd5b506103b2600c5481565b3480156106c757600080fd5b506103b26106d6366004612a7d565b6001600160a01b031660009081526020819052604090205490565b3480156106fd57600080fd5b506103b2600f5481565b34801561071357600080fd5b506103b2601c5481565b34801561072957600080fd5b50610478610738366004612d41565b611598565b34801561074957600080fd5b506103b2601d5481565b34801561075f57600080fd5b5061040761076e366004612a7d565b60076020526000908152604090205460ff1681565b34801561078f57600080fd5b5060175461049a906001600160a01b031681565b3480156107af57600080fd5b506103b260105481565b3480156107c557600080fd5b506103da611692565b3480156107da57600080fd5b506103b2600e5481565b3480156107f057600080fd5b506104786107ff366004612d86565b6116a1565b34801561081057600080fd5b5060165461049a906001600160a01b031681565b34801561083057600080fd5b5061040761083f366004612a51565b6116f6565b34801561085057600080fd5b5060145461049a906001600160a01b031681565b34801561087057600080fd5b5061040761087f366004612a51565b611785565b34801561089057600080fd5b506103b2601a5481565b3480156108a657600080fd5b506103b2601b5481565b3480156108bc57600080fd5b506104786108cb366004612a7d565b611793565b3480156108dc57600080fd5b506103b260095481565b3480156108f257600080fd5b50610407610901366004612a7d565b60196020526000908152604090205460ff1681565b34801561092257600080fd5b5060155461049a906001600160a01b031681565b34801561094257600080fd5b506103b260125481565b34801561095857600080fd5b50610478610967366004612db2565b6117df565b34801561097857600080fd5b506103b2600a5481565b34801561098e57600080fd5b5061047861099d366004612a7d565b6118fe565b3480156109ae57600080fd5b5060185461040790600160b01b900460ff1681565b3480156109cf57600080fd5b506104786109de366004612d41565b61194a565b3480156109ef57600080fd5b506103b26109fe366004612df5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a3557600080fd5b50610478610a44366004612e2e565b611a44565b348015610a5557600080fd5b50610478611a8c565b348015610a6a57600080fd5b50610478610a79366004612a7d565b611b9d565b348015610a8a57600080fd5b5060135461049a906001600160a01b031681565b348015610aaa57600080fd5b50610478610ab9366004612d86565b611c19565b348015610aca57600080fd5b50610478611c6e565b606060038054610ae290612e49565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0e90612e49565b8015610b5b5780601f10610b3057610100808354040283529160200191610b5b565b820191906000526020600020905b815481529060010190602001808311610b3e57829003601f168201915b5050505050905090565b600033610b73818585611cb9565b60019150505b92915050565b6016546001600160a01b03163314610bb25760405162461bcd60e51b8152600401610ba990612e83565b60405180910390fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600033610be2858285611dc6565b610bed858585611e51565b5060019150505b9392505050565b6015546001600160a01b03163314610c255760405162461bcd60e51b8152600401610ba990612eba565b60095415610c605760405162461bcd60e51b81526020600482015260086024820152671b185d5b98da195960c21b6044820152606401610ba9565b426009819055601a54610c7291612f07565b601b55565b60055433906001600160a01b0316811480610c9f57506016546001600160a01b038281169116145b610ceb5760405162461bcd60e51b815260206004820152601e60248201527f43616c6c657220646f65736e27742068617665207065726d697373696f6e00006044820152606401610ba9565b506001600160a01b03166000908152601960205260409020805460ff19169055565b600060208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461dead82527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf8354600254610d6a9190612f1a565b610d749190612f1a565b905090565b6015546001600160a01b03163314610da35760405162461bcd60e51b8152600401610ba990612eba565b8151600390610db29082612f78565b506020820151600490610dc59082612f78565b506040820151600255606082015160461115610e0d5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610ba9565b6103e882604001516005610e219190613038565b610e2b919061304f565b601c556040820151606490610e41906001613038565b610e4b919061304f565b601d556040820151610fa090610e62906005613038565b610e6c919061304f565b601e5560e0820151601380546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190613071565b6001600160a01b031663c9c65396601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f769190613071565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015610fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe69190613071565b601480546001600160a01b0319166001600160a01b03928316178155306000818152600160208181526040808420601354881685528252808420600019905593835260068152838320805460ff1990811684179091556015805488168552858520805483168517905560808a810180518a16875287872080548516871790555189168652600784528686208054841686179055965488168552858520805483168517905554909616835283832080548716831790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80548716831790559180527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805490951617909355830151600c8190556060840151600f5590830151600d81905560a08401516010558351600b81905592840151600e55600a54929161112e91612f07565b6111389190612f07565b6111429190612f07565b601155600a54600e54600f5460105461115b9190612f07565b6111659190612f07565b61116f9190612f07565b601255601154600c10156111b05760405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606401610ba9565b601160125411156111ee5760405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606401610ba9565b6080820151601680546001600160a01b039283166001600160a01b03199182161790915560a08401516017805491841691831691909117905560c08401516018805491841691831691909117905561010084015160058054919093169116179055606082015160408301516000916064916112699190613038565b611273919061304f565b905060008184604001516112879190612f1a565b336000908152602081905260408120805492935084929091906112ab908490612f07565b909155505060808401516001600160a01b0316600090815260208190526040812080548392906112dc908490612f07565b9091555050610120840151601a5560405182815233906000906000805160206131678339815191529060200160405180910390a383608001516001600160a01b031660006001600160a01b03166000805160206131678339815191528360405161134891815260200190565b60405180910390a350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610b739082908690611390908790612f07565b611cb9565b6005546001600160a01b031633146113ef5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74207468652070726f6f6641646d696e000000006044820152606401610ba9565b6009546000036114115760405162461bcd60e51b8152600401610ba99061308e565b600954611421906203f480612f07565b421061149557600181111561143557600080fd5b600a819055600b54600c54600d54839161144e91612f07565b6114589190612f07565b6114629190612f07565b601155600e54600a54600f5460105461147b9190612f07565b6114859190612f07565b61148f9190612f07565b60125550565b600281111561143557600080fd5b50565b6016546001600160a01b031633146114d05760405162461bcd60e51b8152600401610ba990612e83565b60188054921515600160a81b0260ff60a81b1990931692909217909155601e55565b6015546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610ba990612eba565b601380546001600160a01b039081166000908152600660209081526040808320805460ff1990811660019081179092559554851684526007909252808320805486168317905560165490931682529190208054909216179055601880546005805460ff60a01b1916905561ffff60a81b1916600160b01b179055565b6016546001600160a01b031633146115c25760405162461bcd60e51b8152600401610ba990612e83565b6009546000036115e45760405162461bcd60e51b8152600401610ba99061308e565b6103e860025460056115f69190613038565b611600919061304f565b81101561163a5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606401610ba9565b6064600254600361164b9190613038565b611655919061304f565b81111561168d5760405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606401610ba9565b601d55565b606060048054610ae290612e49565b6016546001600160a01b031633146116cb5760405162461bcd60e51b8152600401610ba990612e83565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561176d5760405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606401610ba9565b61177a8286868403611cb9565b506001949350505050565b60003361177a818585611e51565b6016546001600160a01b031633146117bd5760405162461bcd60e51b8152600401610ba990612e83565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031633146118095760405162461bcd60e51b8152600401610ba990612e83565b600b869055600c849055600d829055600e859055600f8390556010819055600a5486906118368685612f07565b6118409190612f07565b61184a9190612f07565b601155600e54600a54600f546010546118639190612f07565b61186d9190612f07565b6118779190612f07565b601255601154600c10156118b85760405162461bcd60e51b8152602060048201526008602482015267486967682066656560c01b6044820152606401610ba9565b601160125411156118f65760405162461bcd60e51b8152602060048201526008602482015267486967682066656560c01b6044820152606401610ba9565b505050505050565b6016546001600160a01b031633146119285760405162461bcd60e51b8152600401610ba990612e83565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031633146119745760405162461bcd60e51b8152600401610ba990612e83565b6009546000036119965760405162461bcd60e51b8152600401610ba99061308e565b6103e860025460056119a89190613038565b6119b2919061304f565b8110156119ec5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606401610ba9565b606460025460036119fd9190613038565b611a07919061304f565b811115611a3f5760405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606401610ba9565b601c55565b6016546001600160a01b03163314611a6e5760405162461bcd60e51b8152600401610ba990612e83565b60058054911515600160a01b0260ff60a01b19909216919091179055565b6016546001600160a01b03163314611ab65760405162461bcd60e51b8152600401610ba990612e83565b600a54600214611afb5760405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606401610ba9565b600954600003611b1d5760405162461bcd60e51b8152600401610ba99061308e565b600954611b2d906203f480612f07565b421015611b3957600080fd5b6001600a81905550600b54600a54600c54600d54611b579190612f07565b611b619190612f07565b611b6b9190612f07565b601155600e54600a54600f54601054611b849190612f07565b611b8e9190612f07565b611b989190612f07565b601255565b6005546001600160a01b03163314611bf75760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74207468652070726f6f6641646d696e000000006044820152606401610ba9565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b03163314611c435760405162461bcd60e51b8152600401610ba990612e83565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6015546001600160a01b03163314611c985760405162461bcd60e51b8152600401610ba990612eba565b6018805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6001600160a01b038316611d0f5760405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606401610ba9565b6001600160a01b038216611d655760405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606401610ba9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611e4b5781811015611e3e5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610ba9565b611e4b8484848403611cb9565b50505050565b601854600090600160b01b900460ff16611e965760405162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b6044820152606401610ba9565b6001600160a01b03841660009081526019602052604090205460ff16158015611ed857506001600160a01b03831660009081526019602052604090205460ff16155b611ee157600080fd5b601b5415801590611ef35750601b5442105b15611f5557326000818152601960205260409020805460ff191660011790556001600160a01b03841614611f555760405162461bcd60e51b8152602060048201526009602482015268616e7469736e69706560b81b6044820152606401610ba9565b601854600160a01b900460ff1615611f7957611f72848484612256565b9050610bf4565b6014546001600160a01b038481169116148015611f9f5750600554600160a01b900460ff165b1561202557601c5482111580611ff057506001600160a01b03841660009081526007602052604090205460ff168015611ff057506001600160a01b03831660009081526007602052604090205460ff165b6120255760405162461bcd60e51b815260206004820152600660248201526509ac2f040a8b60d31b6044820152606401610ba9565b6001600160a01b03831660009081526007602052604090205460ff161580156120575750600554600160a01b900460ff165b156120be57601d546001600160a01b038416600090815260208190526040902054612083908490612f07565b11156120be5760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610ba9565b6014546001600160a01b038581169116148015906120e65750601854600160a01b900460ff16155b80156120fb5750601854600160a81b900460ff165b80156121185750601e543060009081526020819052604090205410155b15612125576121256122f6565b6001600160a01b038416600090815260208190526040902054612149908390612f1a565b6001600160a01b0380861660008181526020819052604090209290925560145484929116148061218657506014546001600160a01b038581169116145b156121e5576001600160a01b03851660009081526006602052604090205460ff161580156121cd57506001600160a01b03841660009081526006602052604090205460ff16155b6121d757826121e2565b6121e285858561292d565b90505b6001600160a01b038416600090815260208190526040902054612209908290612f07565b6001600160a01b03858116600081815260208181526040918290209490945551848152909291881691600080516020613167833981519152910160405180910390a3506001949350505050565b6001600160a01b03831660009081526020819052604081205461227a908390612f1a565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546122aa908390612f07565b6001600160a01b03848116600081815260208181526040918290209490945551858152909291871691600080516020613167833981519152910160405180910390a35060019392505050565b6018805460ff60a01b1916600160a01b1790553060009081526020819052604081205460115490919081908190819060021061235a576002601254600f548761233f9190613038565b612349919061304f565b612353919061304f565b9350612384565b6002601154600c548761236d9190613038565b612377919061304f565b612381919061304f565b93505b60006123908587612f1a565b9050806000036123a55750505050505061291e565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106123da576123da6130b1565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612433573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124579190613071565b8160018151811061246a5761246a6130b1565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac947906124b09085906000908690309042906004016130c7565b600060405180830381600087803b1580156124ca57600080fd5b505af11580156124de573d6000803e3d6000fd5b50505050600047905060026011541161251f576002601254600f54836125049190613038565b61250e919061304f565b612518919061304f565b9350612549565b6002601154600c54836125329190613038565b61253c919061304f565b612546919061304f565b93505b86156125e65760135460405163f305d71960e01b815230600482015260248101899052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990869060c40160606040518083038185885af11580156125bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125e29190613138565b5050505b6011544790600210612630576012546010546126029083613038565b61260c919061304f565b9650601254600a548261261f9190613038565b612629919061304f565b955061266a565b601154600d546126409083613038565b61264a919061304f565b9650601154600a548261265d9190613038565b612667919061304f565b95505b6000866126778984612f1a565b6126819190612f1a565b9050821561291357861561284357600061269c60028961304f565b90506000601560009054906101000a90046001600160a01b03166001600160a01b0316633690e2876040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127179190613071565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114612761576040519150601f19603f3d011682016040523d82523d6000602084013e612766565b606091505b505090508061277457600080fd5b6015546040805163d7e7a9e760e01b815290516000926001600160a01b03169163d7e7a9e79160048083019260209291908290030181865afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e29190613071565b6001600160a01b03168360405160006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b505090508061283f57600080fd5b5050505b87156128ab576017546040516000916001600160a01b0316908a908381818185875af1925050503d8060008114612896576040519150601f19603f3d011682016040523d82523d6000602084013e61289b565b606091505b50509050806128a957600080fd5b505b8015612913576018546040516000916001600160a01b03169083908381818185875af1925050503d80600081146128fe576040519150601f19603f3d011682016040523d82523d6000602084013e612903565b606091505b505090508061291157600080fd5b505b505050505050505050505b6018805460ff60a01b19169055565b60145460009081906001600160a01b0385811691161461294f57601154612953565b6012545b9050600060646129638386613038565b61296d919061304f565b3060009081526020819052604090205490915061298b908290612f07565b3060008181526020818152604091829020939093555183815290916001600160a01b03891691600080516020613167833981519152910160405180910390a36129d48185612f1a565b9695505050505050565b600060208083528351808285015260005b81811015612a0b578581018301518582016040015282016129ef565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146114a357600080fd5b8035612a4c81612a2c565b919050565b60008060408385031215612a6457600080fd5b8235612a6f81612a2c565b946020939093013593505050565b600060208284031215612a8f57600080fd5b8135610bf481612a2c565b600080600060608486031215612aaf57600080fd5b8335612aba81612a2c565b92506020840135612aca81612a2c565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff81118282101715612b1557612b15612adb565b60405290565b600082601f830112612b2c57600080fd5b813567ffffffffffffffff80821115612b4757612b47612adb565b604051601f8301601f19908116603f01168101908282118183101715612b6f57612b6f612adb565b81604052838152866020858801011115612b8857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060c08284031215612bba57600080fd5b60405160c0810181811067ffffffffffffffff82111715612bdd57612bdd612adb565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b60008060e08385031215612c3557600080fd5b823567ffffffffffffffff80821115612c4d57600080fd5b908401906101408287031215612c6257600080fd5b612c6a612af1565b823582811115612c7957600080fd5b612c8588828601612b1b565b825250602083013582811115612c9a57600080fd5b612ca688828601612b1b565b6020830152506040830135604082015260608301356060820152612ccc60808401612a41565b6080820152612cdd60a08401612a41565b60a0820152612cee60c08401612a41565b60c0820152612cff60e08401612a41565b60e08201526101009150612d14828401612a41565b8282015261012091508183013582820152809450505050612d388460208501612ba8565b90509250929050565b600060208284031215612d5357600080fd5b5035919050565b80358015158114612a4c57600080fd5b60008060408385031215612d7d57600080fd5b612a6f83612d5a565b60008060408385031215612d9957600080fd5b8235612da481612a2c565b9150612d3860208401612d5a565b60008060008060008060c08789031215612dcb57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008060408385031215612e0857600080fd5b8235612e1381612a2c565b91506020830135612e2381612a2c565b809150509250929050565b600060208284031215612e4057600080fd5b610bf482612d5a565b600181811c90821680612e5d57607f821691505b602082108103612e7d57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526019908201527f43616c6c6572206973206e6f742074686520666163746f727900000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b7957610b79612ef1565b81810381811115610b7957610b79612ef1565b601f821115612f7357600081815260208120601f850160051c81016020861015612f545750805b601f850160051c820191505b818110156118f657828155600101612f60565b505050565b815167ffffffffffffffff811115612f9257612f92612adb565b612fa681612fa08454612e49565b84612f2d565b602080601f831160018114612fdb5760008415612fc35750858301515b600019600386901b1c1916600185901b1785556118f6565b600085815260208120601f198616915b8281101561300a57888601518255948401946001909101908401612feb565b50858210156130285787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610b7957610b79612ef1565b60008261306c57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561308357600080fd5b8151610bf481612a2c565b602080825260099082015268085b185d5b98da195960ba1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156131175784516001600160a01b0316835293830193918301916001016130f2565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561314d57600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220372d5e153316c77b8408e4e2677efd724660eba7ce605a2304baa7a758fd325564736f6c63430008110033a26469706673582212202ba5fa4a570c8abeb308e86ae403d32ca46b2089a05b9576dd47e7d057003f9564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e2fe530c047f2d85298b07d9333c05737f1435fb000000000000000000000000cf170d0b07a54844b471cbbe74d2af254245ab54000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e
-----Decoded View---------------
Arg [0] : initialRouterAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : initialLockerAddress (address): 0xE2fE530C047f2d85298b07D9333C05737f1435fB
Arg [2] : initialRewardPoolAddress (address): 0xcF170D0b07A54844B471CBBE74D2af254245ab54
Arg [3] : initialRevenueAddress (address): 0xe9b4d32f829951a3Ce145D2CaA84Cf66af56CA5e
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000e2fe530c047f2d85298b07d9333c05737f1435fb
Arg [2] : 000000000000000000000000cf170d0b07a54844b471cbbe74d2af254245ab54
Arg [3] : 000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.