ERC-20
Overview
Max Total Supply
69,000,000,000,000 PEPETH
Holders
97
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
165,716,655,644.540767857 PEPETHValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ProofFactoryTokenCutter
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/ERC721/IERC721.sol"; import "../libraries/Ownable.sol"; import "../libraries/Context.sol"; import "../libraries/ProofFactoryFees.sol"; import "../interfaces/IFACTORY.sol"; import "../interfaces/IDividendDistributor.sol"; import "../interfaces/IUniswapV2Router02.sol"; import "../DividendDistributor.sol"; import "../interfaces/IProofFactoryTokenCutter.sol"; contract ProofFactoryTokenCutter is Context, IProofFactoryTokenCutter { //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects IDividendDistributor public dividendDistributor; uint256 distributorGas = 500000; mapping(address => bool) public userWhitelist; address[] public nftWhitelist; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; uint256 public whitelistEndTime; uint256 public whitelistPeriod; bool public whitelistMode = true; 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 revenueFee = 2; uint256 public reflectionFee; uint256 public lpFee; uint256 public devFee; uint256 public reflectionFeeOnSell; 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; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool public tradingStatus = true; uint256 public _maxTxAmount; uint256 public _walletMax; uint256 public swapThreshold; constructor() { factory = msg.sender; } modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier onlyProofAdmin() { require( proofAdmin == _msgSender(), "not the proofAdmin" ); _; } modifier onlyOwner() { require(tokenOwner == _msgSender(), "not the owner"); _; } modifier onlyFactory() { require(factory == _msgSender(), "not the factory"); _; } function setBasicData( BaseData memory _baseData, ProofFactoryFees.allFees memory fees ) external onlyFactory { _name = _baseData.tokenName; _symbol = _baseData.tokenSymbol; _totalSupply += _baseData.initialSupply; //Initial supply require(_baseData.percentToLP >= 70, "low lp"); uint256 forLP = (_baseData.initialSupply * _baseData.percentToLP) / 100; //95% uint256 forOwner = _baseData.initialSupply - forLP; //5% _balances[msg.sender] += forLP; _balances[_baseData.owner] += forOwner; emit Transfer(address(0), msg.sender, forLP); emit Transfer(address(0), _baseData.owner, forOwner); _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; dividendDistributor = new DividendDistributor( _baseData.routerAddress, _baseData.reflectionToken, address(this) ); userWhitelist[address(this)] = true; userWhitelist[factory] = true; userWhitelist[pair] = true; userWhitelist[_baseData.owner] = true; userWhitelist[_baseData.initialProofAdmin] = true; userWhitelist[_baseData.routerAddress] = true; _addWhitelist(_baseData.whitelists); nftWhitelist = _baseData.nftWhitelist; isFeeExempt[address(this)] = true; isFeeExempt[factory] = true; isTxLimitExempt[address(this)] = true; isTxLimitExempt[_baseData.owner] = true; isTxLimitExempt[pair] = true; isTxLimitExempt[factory] = true; isTxLimitExempt[DEAD] = true; isTxLimitExempt[ZERO] = true; isDividendExempt[pair] = true; isDividendExempt[address(this)] = true; isDividendExempt[DEAD] = true; isDividendExempt[ZERO] = true; whitelistPeriod = _baseData.whitelistPeriod; reflectionFee = fees.reflectionFee; lpFee = fees.lpFee; devFee = fees.devFee; reflectionFeeOnSell = fees.reflectionFeeOnSell; lpFeeOnSell = fees.lpFeeOnSell; devFeeOnSell = fees.devFeeOnSell; _calcTotalFee(); tokenOwner = _baseData.owner; devWallet = payable(_baseData.devWallet); proofAdmin = _baseData.initialProofAdmin; } //proofAdmin functions function updateProofAdmin( address newAdmin ) external virtual onlyProofAdmin { proofAdmin = newAdmin; userWhitelist[newAdmin] = true; } function updateWhitelistPeriod( uint256 _whitelistPeriod ) external onlyProofAdmin { whitelistPeriod = _whitelistPeriod; whitelistEndTime = launchedAt + (60 * _whitelistPeriod); whitelistMode = true; } //Factory functions function updateProofFactory(address newFactory) external onlyFactory { userWhitelist[newFactory] = true; isTxLimitExempt[newFactory] = true; isFeeExempt[newFactory] = true; factory = newFactory; } function swapTradingStatus() external onlyFactory { tradingStatus = !tradingStatus; } function setLaunchedAt() external onlyFactory { require(launchedAt == 0, "already launched"); launchedAt = block.timestamp; whitelistEndTime = block.timestamp + (60 * whitelistPeriod); whitelistMode = true; } function cancelToken() external onlyFactory { isFeeExempt[address(router)] = true; isTxLimitExempt[address(router)] = true; isTxLimitExempt[tokenOwner] = true; tradingStatus = true; restrictWhales = false; swapAndLiquifyEnabled = false; } //Owner functions function changeFees( uint256 initialReflectionFee, uint256 initialReflectionFeeOnSell, uint256 initialLpFee, uint256 initialLpFeeOnSell, uint256 initialDevFee, uint256 initialDevFeeOnSell ) external onlyOwner { reflectionFee = initialReflectionFee; lpFee = initialLpFee; devFee = initialDevFee; reflectionFeeOnSell = initialReflectionFeeOnSell; lpFeeOnSell = initialLpFeeOnSell; devFeeOnSell = initialDevFeeOnSell; _calcTotalFee(); } function changeTxLimit(uint256 newLimit) external onlyOwner { _checkLimit(newLimit); _maxTxAmount = newLimit; } function changeWalletLimit(uint256 newLimit) external onlyOwner { _checkLimit(newLimit); _walletMax = newLimit; } function changeRestrictWhales(bool newValue) external onlyOwner { restrictWhales = newValue; } function changeIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function changeIsTxLimitExempt( address holder, bool exempt ) external onlyOwner { isTxLimitExempt[holder] = exempt; } function changeDistributorGas(uint256 _distributorGas) external onlyOwner { distributorGas = _distributorGas; } function changeMinDistSettings( uint256 _minPeriod, uint256 _minDistLimit ) external onlyOwner { dividendDistributor.setMinPeriod(_minPeriod); dividendDistributor.setMinDistribution(_minDistLimit); } function reduceProofFee() external onlyOwner { require(revenueFee == 2, "!already reduced"); _checkTimestamp72(); revenueFee = 1; _calcTotalFee(); } function adjustProofFee(uint256 _proofFee) external onlyProofAdmin { require(launchedAt != 0, "!launched"); if (block.timestamp >= launchedAt + 72 hours) { require(_proofFee <= 1); revenueFee = _proofFee; totalFee = devFee + lpFee + reflectionFee + revenueFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell + revenueFee; } else { require(_proofFee <= 2); revenueFee = _proofFee; totalFee = devFee + lpFee + reflectionFee + revenueFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell + revenueFee; } } function setDevWallet(address payable newDevWallet) external onlyOwner { devWallet = payable(newDevWallet); } function setOwnerWallet(address payable newOwnerWallet) external onlyOwner { tokenOwner = newOwnerWallet; } function changeSwapBackSettings( bool enableSwapBack, uint256 newSwapBackLimit ) external onlyOwner { swapAndLiquifyEnabled = enableSwapBack; swapThreshold = newSwapBackLimit; } function setDistributionCriteria( uint256 newMinPeriod_, uint256 newMinDistribution_ ) external onlyOwner { dividendDistributor.setDistributionCriteria( newMinPeriod_, newMinDistribution_ ); } function getCirculatingSupply() external view returns (uint256) { return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO); } function rewardTokenAddress() external view returns(address) { return dividendDistributor.rewardTokenAddress(); } function isWhitelisted(address user) public view returns (bool) { return userWhitelist[user]; } function holdsSupportedNFT(address user) public view returns (bool) { for (uint256 i = 0; i < nftWhitelist.length; i++) { if (IERC721(nftWhitelist[i]).balanceOf(user) > 0) { return true; } } return false; } function name() external view virtual override returns (string memory) { return _name; } function symbol() external view virtual override returns (string memory) { return _symbol; } function decimals() external view virtual override returns (uint8) { return 9; } function totalSupply() external view virtual override returns (uint256) { return _totalSupply; } function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } function transfer( address to, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve( address spender, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } 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; } function increaseAllowance( address spender, uint256 addedValue ) external virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } 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, "!trading"); if(whitelistMode) { if (block.timestamp >= whitelistEndTime ) { whitelistMode = false; } else { if (sender == pair) { //buy require(isWhitelisted(recipient) || holdsSupportedNFT(recipient), "Not whitelisted"); } else if (recipient == pair) { //sell require(isWhitelisted(sender) || holdsSupportedNFT(sender), "Not whitelisted"); } else { //transfer require((isWhitelisted(sender) || holdsSupportedNFT(sender)) && (isWhitelisted(recipient) || holdsSupportedNFT(recipient)), "Not Whitelisted"); } } } 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, "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; // Dividend tracker if (!isDividendExempt[sender]) { try dividendDistributor.setShare(sender, _balances[sender]) {} catch { emit DistributorFail(); } } if (!isDividendExempt[recipient]) { try dividendDistributor.setShare(recipient, _balances[recipient]) {} catch { emit DistributorFail(); } } try dividendDistributor.process(distributorGas) {} catch { emit DistributorFail(); } 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; } 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 = (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; uint256 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; uint256 devBalance = (amountETHafterLP * devFee) / totalFee; uint256 revenueBalance = (amountETHafterLP * revenueFee) / totalFee; uint256 amountEthReflection = amountETHafterLP - devBalance - revenueBalance; if (amountETHafterLP > 0) { if (revenueBalance > 0) { uint256 revenueSplit = revenueBalance / 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); } } try dividendDistributor.deposit{value: amountEthReflection}() {} catch { emit DistributorFail(); } } function _checkLimit(uint256 _newLimit) internal view { require(launchedAt != 0, "!launched"); require(_newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%"); require(_newLimit <= (_totalSupply * 3) / 100, "Max 3%"); } function _checkTimestamp72() internal view { require(launchedAt != 0, "!launched"); require(block.timestamp >= launchedAt + 72 hours, "too soon"); } function _calcTotalFee() internal { totalFee = devFee + lpFee + reflectionFee + revenueFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell + revenueFee; require(totalFee <= 12, "high fee"); require(totalFeeIfSelling <= 17, "high fee"); } function _addWhitelist(address[] memory _whitelists) internal { uint256 length = _whitelists.length; for (uint256 i = 0; i < length; i++) { userWhitelist[_whitelists[i]] = true; } } function addMoreToWhitelist(WhitelistAdd_ memory _WhitelistAdd) external onlyFactory { _addWhitelist(_WhitelistAdd.whitelists); } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../token/ERC20/extensions/IERC20Metadata.sol";
// 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: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./libraries/TokenUtils.sol"; import "./interfaces/IDividendDistributor.sol"; import "./interfaces/IUniswapV2Router02.sol"; import "./interfaces/IUniswapV2Factory.sol"; import "./interfaces/IWETH.sol"; contract DividendDistributor is IDividendDistributor { address _token; struct Share { uint256 amount; uint256 totalExcluded; uint256 totalRealised; } IUniswapV2Router02 router; IERC20 public RewardToken; address[] shareholders; mapping(address => uint256) public shareholderIndexes; mapping(address => uint256) public shareholderClaims; mapping(address => Share) public shares; uint256 public totalShares; uint256 public totalDividends; uint256 public totalDistributed; uint256 public dividendsPerShare; uint256 public dividendsPerShareAccuracyFactor = 10 ** 36; uint256 public minPeriod = 30 minutes; uint256 public minDistribution = 1 * (10 ** 18); uint256 currentIndex; bool initialized; modifier onlyToken() { require(msg.sender == _token); _; } constructor(address _router, address _reflectionToken, address token) { router = IUniswapV2Router02(_router); RewardToken = IERC20(_reflectionToken); _token = token; uint8 rewardTokenDecimals = TokenUtils.expectDecimals(token); uint256 fixedPoint = 10 ** rewardTokenDecimals; minDistribution = 1 * fixedPoint; } function setDistributionCriteria( uint256 _minPeriod, uint256 _minDistribution ) external override onlyToken { minPeriod = _minPeriod; minDistribution = _minDistribution; } function getShareHolders() external view returns (address[] memory) { return shareholders; } function setMinPeriod(uint256 _minPeriod) external override onlyToken { minPeriod = _minPeriod; } function setMinDistribution( uint256 _minDistribution ) external override onlyToken { minDistribution = _minDistribution; } function setShare( address shareholder, uint256 amount ) external override onlyToken { if (shares[shareholder].amount > 0) { distributeDividend(shareholder); } if (amount > 0 && shares[shareholder].amount == 0) { addShareholder(shareholder); } else if (amount == 0 && shares[shareholder].amount > 0) { removeShareholder(shareholder); } totalShares = totalShares - shares[shareholder].amount + amount; shares[shareholder].amount = amount; shares[shareholder].totalExcluded = getCumulativeDividends( shares[shareholder].amount ); } function deposit() external payable override onlyToken { uint256 balanceBefore = RewardToken.balanceOf(address(this)); address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = address(RewardToken); if (path[0] == path[1]) { //reward token is weth IWETH(path[0]).deposit{value: msg.value}(); } else { router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: msg.value }(0, path, address(this), block.timestamp); } uint256 amount = RewardToken.balanceOf(address(this)) - balanceBefore; totalDividends = totalDividends + amount; if (totalShares > 0) { dividendsPerShare = dividendsPerShare + (dividendsPerShareAccuracyFactor * amount) / totalShares; } } function process(uint256 gas) external override onlyToken { uint256 shareholderCount = shareholders.length; if (shareholderCount == 0) { return; } uint256 iterations = 0; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); while (gasUsed < gas && iterations < shareholderCount) { if (currentIndex >= shareholderCount) { currentIndex = 0; } if (shouldDistribute(shareholders[currentIndex])) { distributeDividend(shareholders[currentIndex]); } gasUsed = gasUsed + gasLeft - gasleft(); gasLeft = gasleft(); currentIndex++; iterations++; } } function shouldDistribute( address shareholder ) internal view returns (bool) { return shareholderClaims[shareholder] + minPeriod <= block.timestamp && getUnpaidEarnings(shareholder) >= minDistribution; } function distributeDividend(address shareholder) internal { if (shares[shareholder].amount == 0) { return; } uint256 amount = getUnpaidEarnings(shareholder); if (amount > 0) { totalDistributed = totalDistributed + amount; shareholderClaims[shareholder] = block.timestamp; shares[shareholder].totalRealised = shares[shareholder].totalRealised + amount; shares[shareholder].totalExcluded = getCumulativeDividends( shares[shareholder].amount ); RewardToken.transfer(shareholder, amount); } } function rewardTokenAddress() external view returns(address) { return address(RewardToken); } function claimDividend() external { require(shouldDistribute(msg.sender), "Too soon. Need to wait!"); distributeDividend(msg.sender); } function getUnpaidEarnings( address shareholder ) public view returns (uint256) { if (shares[shareholder].amount == 0) { return 0; } uint256 shareholderTotalDividends = getCumulativeDividends( shares[shareholder].amount ); uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded; if (shareholderTotalDividends <= shareholderTotalExcluded) { return 0; } return shareholderTotalDividends - shareholderTotalExcluded; } function getCumulativeDividends( uint256 share ) internal view returns (uint256) { return (share * dividendsPerShare) / dividendsPerShareAccuracyFactor; } function addShareholder(address shareholder) internal { shareholderIndexes[shareholder] = shareholders.length; shareholders.push(shareholder); } function removeShareholder(address shareholder) internal { shareholders[shareholderIndexes[shareholder]] = shareholders[ shareholders.length - 1 ]; shareholderIndexes[ shareholders[shareholders.length - 1] ] = shareholderIndexes[shareholder]; shareholders.pop(); } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IDividendDistributor { function setDistributionCriteria( uint256 _minPeriod, uint256 _minDistribution ) external; function setShare(address shareholder, uint256 amount) external; function deposit() external payable; function process(uint256 gas) external; function setMinPeriod(uint256 _minPeriod) external; function setMinDistribution(uint256 _minDistribution) external; function rewardTokenAddress() external view returns(address); }
// 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/ProofFactoryFees.sol"; interface IProofFactoryTokenCutter is IERC20, IERC20Metadata { struct BaseData { string tokenName; string tokenSymbol; uint256 initialSupply; uint256 percentToLP; uint256 whitelistPeriod; address owner; address devWallet; address reflectionToken; address routerAddress; address initialProofAdmin; address[] whitelists; address[] nftWhitelist; } struct WhitelistAdd_ { address [] whitelists; } function setBasicData( BaseData memory _baseData, ProofFactoryFees.allFees memory fees ) external; function pair() external view returns (address); function swapTradingStatus() external; function updateProofFactory(address _newFactory) external; function addMoreToWhitelist( WhitelistAdd_ memory _WhitelistAdd ) external; function updateWhitelistPeriod( uint256 _whitelistPeriod ) external; function changeIsTxLimitExempt( address holder, bool exempt ) external; event DistributorFail(); }
// 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); }
interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// 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(), "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), "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 ProofFactoryFees { struct allFees { uint256 reflectionFee; uint256 reflectionFeeOnSell; uint256 lpFee; uint256 lpFeeOnSell; uint256 devFee; uint256 devFeeOnSell; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.17; import "@openzeppelin/contracts/interfaces/IERC20Metadata.sol"; /// @title TokenUtils library TokenUtils { /// @dev A safe function to get the decimals of an ERC20 token. /// /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value. /// /// @param token The target token. /// /// @return The amount of decimals of the token. function expectDecimals(address token) internal view returns (uint8) { (bool success, bytes memory data) = token.staticcall( abi.encodeWithSelector(IERC20Metadata.decimals.selector) ); require (success, "invalid"); return abi.decode(data, (uint8)); } }
{ "optimizer": { "enabled": true, "runs": 200, "details": { "yul": true } }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"DistributorFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"whitelists","type":"address[]"}],"internalType":"struct IProofFactoryTokenCutter.WhitelistAdd_","name":"_WhitelistAdd","type":"tuple"}],"name":"addMoreToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proofFee","type":"uint256"}],"name":"adjustProofFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_distributorGas","type":"uint256"}],"name":"changeDistributorGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialReflectionFee","type":"uint256"},{"internalType":"uint256","name":"initialReflectionFeeOnSell","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"}],"name":"changeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistLimit","type":"uint256"}],"name":"changeMinDistSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"changeRestrictWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableSwapBack","type":"bool"},{"internalType":"uint256","name":"newSwapBackLimit","type":"uint256"}],"name":"changeSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendDistributor","outputs":[{"internalType":"contract IDividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"holdsSupportedNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","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":"reduceProofFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restrictWhales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","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":"whitelistPeriod","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"devWallet","type":"address"},{"internalType":"address","name":"reflectionToken","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"initialProofAdmin","type":"address"},{"internalType":"address[]","name":"whitelists","type":"address[]"},{"internalType":"address[]","name":"nftWhitelist","type":"address[]"}],"internalType":"struct IProofFactoryTokenCutter.BaseData","name":"_baseData","type":"tuple"},{"components":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"reflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"lpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"},{"internalType":"uint256","name":"devFeeOnSell","type":"uint256"}],"internalType":"struct ProofFactoryFees.allFees","name":"fees","type":"tuple"}],"name":"setBasicData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinPeriod_","type":"uint256"},{"internalType":"uint256","name":"newMinDistribution_","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLaunchedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwnerWallet","type":"address"}],"name":"setOwnerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeIfSelling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateProofAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFactory","type":"address"}],"name":"updateProofFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistPeriod","type":"uint256"}],"name":"updateWhitelistPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080806040523461006b576207a12060019081556009805460ff19169091179055600c805460ff60a01b1916600160a01b1790556002601155601e805461ffff60a81b191661010160a81b179055601c80546001600160a01b0319163317905561470d90816100718239f35b600080fdfe60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022c25750806306fdde03146200220e578063095ea7b314620021e1578063125f9e33146200216757806316d9962b146200213357806318160ddd14620021135780631df4ccfc14620020f35780631f53ac0214620020a157806323b872dd1462001fe057806327193bc41462001f545780632b112e491462001f045780632d48e8961462001e8a578063313ce5671462001e6c57806336e4ec641462001e4c578063395093511462001df35780633af32abf14620008325780633c8228121462001d105780633dab52691462001cb55780633f4218e01462001c725780634355855a1462001c2f57806344de2e4c1462001c075780634509a9881462001bb9578063497a000a1462001b425780634a74bb021462001b1a578063546a88111462001a7d57806359a51c341462001a525780636457f6bf1462000f5a57806364d817fa1462000ecc5780636827e7641462000eac578063704ce43e1462000e8c57806370a082311462000e4f57806370c757ec1462000e2a5780637c0ff2051462000e0a5780637d1db4a51462000dea5780637db1342c1462000dab578063807c2d9c1462000d8c57806383ad79941462000d6c5780638b42507f1462000d295780638ea5220f1462000cfe57806390fbd17f1462000cca5780639502c4261462000caa57806395d89b411462000bb7578063a3a2e89e1462000b51578063a3e676101462000b26578063a457c2d71462000a7d578063a8aa1b311462000a52578063a9059cbb1462000a19578063b48e665e14620009f9578063bad3ea6a14620009d0578063bb542ef01462000981578063bf56b3711462000961578063c45a01551462000936578063ca987b0e1462000916578063cb29813c14620008bd578063cc6badb3146200089d578063d4fb9a011462000875578063d741b9c31462000832578063d920334e14620007f3578063dd62ed3e146200079e578063e4cbd6b314620006af578063e572967b14620005fc578063e66b1d1e14620005a7578063ebdfd7221462000587578063ef92e22214620004a2578063f16fd78d146200043c578063f887ea401462000411578063fabe628314620003a85763fbd7575303620000105734620003a55780600319360112620003a5576200038160018060a01b03601c54163314620024c0565b601e805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003a5576040366003190112620003a5576200040e620003ca6200232b565b620003d46200239a565b601d5490916001600160a01b0391620003f190831633146200261f565b168352600e602052604083209060ff801983541691151516179055565b80f35b5034620003a55780600319360112620003a557601a546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a5576200045a6200232b565b600c54906001600160a01b0390620004768284163314620025dd565b1680916001600160601b0360a01b1617600c558152600260205260408120600160ff1982541617905580f35b5034620003a55780600319360112620003a557620004cc60018060a01b03601d541633146200261f565b6002601154036200054f57601054620004e78115156200265c565b6203f48081018091116200053b5742106200050b5760016011556200040e6200352d565b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606490fd5b5034620003a55780600319360112620003a5576020600754604051908152f35b5034620003a5576020366003190112620003a557620005c56200238a565b620005dc60018060a01b03601d541633146200261f565b600c805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003a557600319602036820112620006ab57600435906001600160401b03908183116200068d576020908336030112620006a757604051906020820182811082821117620006915760405282600401359081116200068d576200040e9260046200066d923692010162002449565b81526200068660018060a01b03601c54163314620024c0565b5162003591565b8380fd5b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003a55780620006c23662002373565b601d5490916001600160a01b0391620006df90831633146200261f565b8184541690813b156200079a57849160248392604051948593849263f821076960e01b845260048401525af19081156200078f57849162000777575b50541690813b1562000773578291602483926040519485938492635117196160e01b845260048401525af180156200076857620007555750f35b6200076090620023aa565b620003a55780f35b6040513d84823e3d90fd5b5050fd5b6200078290620023aa565b620007735782386200071b565b6040513d86823e3d90fd5b8480fd5b5034620003a5576040366003190112620003a557620007bc6200232b565b6040620007c862002347565b9260018060a01b03809316815260056020522091166000526020526020604060002054604051908152f35b5034620003a5576020366003190112620003a5576004356200082160018060a01b03601d541633146200261f565b6200082c8162003447565b601f5580f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b03620008616200232b565b168152600284522054166040519015158152f35b5034620003a55780600319360112620003a557602060ff601e5460b01c166040519015158152f35b5034620003a55780600319360112620003a5576020601554604051908152f35b5034620003a55760c0366003190112620003a557620008e860018060a01b03601d541633146200261f565b60043560125560443560135560843560145560243560155560643560165560a4356017556200040e6200352d565b5034620003a55780600319360112620003a5576020601954604051908152f35b5034620003a55780600319360112620003a557601c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020601054604051908152f35b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620009bf601d549133908316146200261f565b6001600160a01b03191617601d5580f35b5034620003a55780600319360112620003a557546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020600854604051908152f35b5034620003a5576040366003190112620003a55762000a4662000a3b6200232b565b6024359033620027b5565b50602060405160018152f35b5034620003a55780600319360112620003a557601b546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a55762000a9b6200232b565b60406024359233815260056020522060018060a01b0382166000526020526040600020549180831062000ae15762000ad69203903362002e91565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003a55780600319360112620003a557601d546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a5576200040e62000b736200232b565b62000b7d6200239a565b601d5490916001600160a01b039162000b9a90831633146200261f565b168352600d602052604083209060ff801983541691151516179055565b5034620003a55780600319360112620003a5576040519080600b5462000bdd81620024ff565b8085529160019180831690811562000c7d575060011462000c1d575b62000c198562000c0c81870382620023be565b60405191829182620022e0565b0390f35b9250600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841062000c6457505050810160200162000c0c8262000c1962000bf9565b8054602085870181019190915290930192810162000c45565b86955062000c199693506020925062000c0c94915060ff191682840152151560051b820101929362000bf9565b5034620003a55780600319360112620003a5576020601754604051908152f35b5034620003a5576020366003190112620003a557602062000cf462000cee6200232b565b620026a5565b6040519015158152f35b5034620003a55780600319360112620003a557601e546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362000d586200232b565b168152600e84522054166040519015158152f35b5034620003a55780600319360112620003a5576020601254604051908152f35b5034620003a55780600319360112620003a55760208054604051908152f35b5034620003a5576020366003190112620003a55760043562000dd960018060a01b03601d541633146200261f565b62000de48162003447565b60205580f35b5034620003a55780600319360112620003a5576020601f54604051908152f35b5034620003a55780600319360112620003a5576020601654604051908152f35b5034620003a55780600319360112620003a557602060ff600954166040519015158152f35b5034620003a5576020366003190112620003a5576020906040906001600160a01b0362000e7b6200232b565b168152600483522054604051908152f35b5034620003a55780600319360112620003a5576020601354604051908152f35b5034620003a55780600319360112620003a5576020601454604051908152f35b5034620003a5576020366003190112620003a55762000eea6200232b565b601c546001600160a01b03919062000f069083163314620024c0565b1680825260026020526040822060ff1990600182825416179055600e60205260408320600182825416179055600d602052600160408420918254161790556001600160601b0360a01b601c541617601c5580f35b5034620003a5576003199060e036830112620003a5576001600160401b0360043511620003a557610180809260043536030112620003a5576040519182018281106001600160401b038211176200069157604052600435600401356001600160401b038111620006ab5762000fd7906004369181350101620023fc565b8252602460043501356001600160401b038111620006ab5762001002906004369181350101620023fc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010369060a4016200235e565b60a08301526200104b60c4600435016200235e565b60c08301526200106060e4600435016200235e565b60e083015262001076610104600435016200235e565b6101008301526200108d610124600435016200235e565b61012083015261014460043501356001600160401b038111620006ab57620010bd90600436918135010162002449565b6101408301526001600160401b03610164600435013511620003a557620010f03660048035610164810135010162002449565b61016083015260c0366023190112620003a5576040519060c082018281106001600160401b038211176200069157604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a08301526200116560018060a01b03601c54163314620024c0565b82519283516001600160401b03811162001a3e5762001186600a54620024ff565b601f8111620019ec575b50602094601f82116001146200196557948394958293949262001959575b50508160011b916000199060031b1c191617600a555b60208101519283516001600160401b0381116200194557620011e8600b54620024ff565b601f8111620018e7575b50602094601f82116001146200186057948495829394959262001854575b50508160011b916000199060031b1c191617600b555b62001238604083015160065462002555565b6006556046606083015110620018265760646200125f604084015160608501519062002579565b048362001271826040860151620025ae565b913382526004602052604082206200128b82825462002555565b905560a08501516001600160a01b031682526004602052604082208054620012b590859062002555565b90556040519081526000805160206200469883398151915290828260203393a360a08501516040519384526001600160a01b031692602090a3604082015160058102908082046005149015171562001812576103e89004601f5560408201518080046001148115171562001812576064900460205560408201518060058102046005148115171562001812576005610fa09102046021558260018060a01b036101008401511681601a54826001600160601b0360a01b821617601a5516176040519063c45a015560e01b8252602082600481845afa90811562001774576004928492620017eb575b50602090604051938480926315ab88c960e31b82525afa91821562001774576020926044918591620017c9575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af19081156200078f57849162001793575b50601b80546001600160a01b0319166001600160a01b03928316179055308452600560209081526040808620601a5484166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b0361107a8401908111908411176200177f5761107a620035fe843961107a830190815260208101919091523060408201528190036060019084f08015620017745783546001600160a01b0319166001600160a01b0391821617845530845260026020526040808520805460ff199081166001908117909255601c54841687528287208054821683179055601b5484168752828720805482168317905560a0860151841687528287208054821683179055610120860151841687528287208054821683179055610100860151909316865290852080549092161790556101408201516200154d9062003591565b6101608201518051906001600160401b038211620017605768010000000000000000821162001760576020906003548360035580841062001738575b500160038552845b8281106200170b57505030808552600d602090815260408087208054600160ff199182168117909255601c80546001600160a01b039081168b52848b208054841685179055868b52600e8652848b20805484168517905560a08a81015182168c52858c208054851686179055601b805483168d52868d208054861687179055925482168c52858c20805485168617905561dead808d52868d2080548616871790558c8052868d20805486168717905592549091168b52600f8652848b208054841685179055958a52838a20805483168417905589528289208054821683179055888052828920805490911690911790556080808701516008558551601255908501516013558401516014558301516015556060830151601655919091015160175550620016bd6200352d565b60a0810151601d80546001600160a01b03199081166001600160a01b039384161790915560c0830151601e8054831691841691909117905561012090920151600c8054909316911617905580f35b81516001600160a01b03166000805160206200467883398151915282015560209091019060010162001591565b6200175990846000805160206200467883398151915291820191016200253c565b3862001589565b634e487b7160e01b85526041600452602485fd5b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b620017ba915060203d602011620017c1575b620017b18183620023be565b810190620025bc565b3862001406565b503d620017a5565b620017e49150843d8611620017c157620017b18183620023be565b38620013ca565b60209192506200180a90823d8411620017c157620017b18183620023be565b91906200139d565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001210565b600b8552601f198216957f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db991865b888110620018ce57508360019596979810620018b4575b505050811b01600b5562001226565b015160001960f88460031b161c19169055388080620018a5565b919260206001819286850151815501940192016200188e565b6200193390600b86527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9601f840160051c810191602085106200193a575b601f0160051c01906200253c565b38620011f2565b909150819062001925565b634e487b7160e01b84526041600452602484fd5b015190503880620011ae565b600a8452601f198216957fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a891855b888110620019d357508360019596979810620019b9575b505050811b01600a55620011c4565b015160001960f88460031b161c19169055388080620019aa565b9192602060018192868501518155019401920162001993565b62001a3790600a85527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f840160051c810191602085106200193a57601f0160051c01906200253c565b3862001190565b634e487b7160e01b83526041600452602483fd5b5034620003a55780600319360112620003a557600c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557601c546001600160a01b039062001aab9082163314620024c0565b80601a54168252600d602052604082209060ff199160018382541617905580601a54168352600e60205260408320600183825416179055601d5416825260016040832091825416179055601e5460ff60a01b19600c5416600c55600160b01b9061ffff60a81b191617601e5580f35b5034620003a55780600319360112620003a557602060ff601e5460a81c166040519015158152f35b5034620003a5576020366003190112620003a55760043562001b7060018060a01b03600c54163314620025dd565b8060085560105481603c0291603c83040362001ba5579062001b929162002555565b600755600160ff19600954161760095580f35b634e487b7160e01b83526011600452602483fd5b5034620003a5576020366003190112620003a557600435600354811015620006ab5760036000526000805160206200467883398151915201546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557602060ff600c5460a01c166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001c5e6200232b565b168152600f84522054166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001ca16200232b565b168152600d84522054166040519015158152f35b5034620003a5576040366003190112620003a55762001cd36200238a565b62001cea60018060a01b03601d541633146200261f565b601e805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560215580f35b5034620003a5576020366003190112620003a55760043562001d3e60018060a01b03600c54163314620025dd565b60105462001d4e8115156200265c565b6203f480810180911162001ba557421062001dc75760018111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b6012549062002555565b62002555565b60185562001d9962001db76017546016549062002555565b6015549062002555565b60195580f35b60028111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b5034620003a5576040366003190112620003a55762000ad690604062001e186200232b565b9133815260056020522060018060a01b03821660005260205262001e4460243560406000205462002555565b903362002e91565b5034620003a55780600319360112620003a5576020601154604051908152f35b5034620003a55780600319360112620003a557602060405160098152f35b5034620003a5578062001e9d3662002373565b601d549192916001600160a01b039062001ebb90821633146200261f565b82541692833b15620006a7576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620007685762001ef9575080f35b6200040e90620023aa565b5034620003a55780600319360112620003a55762001f4c602091604062001f3b60065461dead8452600486528284205490620025ae565b9180805260048552205490620025ae565b604051908152f35b5034620003a55780600319360112620003a55762001f7e60018060a01b03601c54163314620024c0565b60105462001fa8574260105560085480603c0290603c8204036200053b5762001b92904262002555565b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003a5576060366003190112620003a55762001ffe6200232b565b906200200962002347565b60406044359260018060a01b03851681526005602052818120338252602052205492600019840362002042575b62000a469350620027b5565b82841062002063576200205d8362000a469503338362002e91565b62002036565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620020dd90601d541633146200261f565b6001600160601b0360a01b601e541617601e5580f35b5034620003a55780600319360112620003a5576020601854604051908152f35b5034620003a55780600319360112620003a5576020600654604051908152f35b5034620003a5576020366003190112620003a5576200215e60018060a01b03601d541633146200261f565b60043560015580f35b5034620003a55780600319360112620003a557805460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa918215620017745760209392620021bd575b5060405191168152f35b620021d9919250833d8111620017c157620017b18183620023be565b9038620021b3565b5034620003a5576040366003190112620003a55762000ad6620022036200232b565b602435903362002e91565b5034620003a55780600319360112620003a5576040519080600a546200223481620024ff565b8085529160019180831690811562000c7d5750600114620022625762000c198562000c0c81870382620023be565b9250600a83527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b828410620022a957505050810160200162000c0c8262000c1962000bf9565b805460208587018101919091529093019281016200228a565b905034620006ab5781600319360112620006ab576020906021548152f35b6020808252825181830181905290939260005b8281106200231657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022f3565b600435906001600160a01b03821682036200234257565b600080fd5b602435906001600160a01b03821682036200234257565b35906001600160a01b03821682036200234257565b604090600319011262002342576004359060243590565b6004359081151582036200234257565b6024359081151582036200234257565b6001600160401b0381116200069157604052565b90601f801991011681019081106001600160401b038211176200069157604052565b6001600160401b0381116200069157601f01601f191660200190565b81601f8201121562002342578035906200241682620023e0565b92620024266040519485620023be565b828452602083830101116200234257816000926020809301838601378301015290565b9080601f8301121562002342578135906001600160401b03821162000691578160051b604051936020936200248185840187620023be565b8552838086019282010192831162002342578301905b828210620024a6575050505090565b838091620024b4846200235e565b81520191019062002497565b15620024c857565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c9216801562002531575b60208310146200251b57565b634e487b7160e01b600052602260045260246000fd5b91607f16916200250f565b81811062002548575050565b600081556001016200253c565b919082018092116200256357565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200256357565b811562002598570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200256357565b908160209103126200234257516001600160a01b0381168103620023425790565b15620025e557565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200262757565b60405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606490fd5b156200266457565b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b6000198114620025635760010190565b60009060038054925b838110620026bf5750505050600090565b600082905260008051602062004678833981519152810154604080516370a0823160e01b81526001600160a01b0386811660048301529092602091829185916024918391165afa9182156200276c57506000916200273a575b50905062002731576200272b9062002695565b620026ae565b50505050600190565b82813d831162002764575b620027518183620023be565b81010312620003a5575051803862002718565b503d62002745565b513d6000823e3d90fd5b156200277e57565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b601e80546000959460ff92909160b01c83161562002e615760095483811662002d0d575b5082815460a01c1662002c9a57601b546001600160a01b038681169691811695918991908888148062002c8b575b62002c15575b888352602096600e88526040958787838188205416158062002c06575b62002baf575b5050838616998a14158062002ba0575b8062002b92575b8062002b7b575b62002b52575b508884526004948589526200286d8888872054620025ae565b8a8652868a5287862055601b54841688818c14801562002b48575b62002a9c575b50508a8552858952620028a5888887205462002555565b8b8652868a5287862055898552600f89528187862054161562002a00575b50898452600f88528584205416156200296a575b508154169160015490833b15620006a757602490838651958694859363ffb2c47960e01b85528401525af190816200294e575b5096600080516020620046988339815191529495969715600014620029475780600080516020620046b883398151915291a15b51908152a3600190565b506200293d565b6200295a8991620023aa565b6200296657386200290a565b8780fd5b818354168488528584205491813b156200079a578651630a5b654b60e11b81526001600160a01b039091168682019081526020810193909352918491829184919082908490829060400103925af19182620029e8575b5050620029e257600080516020620046b88339815191528280a15b38620028d7565b620029db565b620029f390620023aa565b620006a7578238620029c0565b9091929384815416868a528782205490803b15620006a7578851630a5b654b60e11b81526001600160a01b039094168885019081526020810192909252839182908490829060400103925af1908162002a80575b508b9392919062002a7a57600080516020620046b88339815191528480a15b38620028c3565b62002a73565b62002a91909c919493929c620023aa565b9a9091923862002a54565b90919850600d8a528b838988205416158062002b37575b1562002b2e5762002b16920362002b1f57606462002ad56019545b8362002579565b0490308752878b5262002aec828a89205462002555565b308852888c528988205588518281528c600080516020620046988339815191528d3093a3620025ae565b9638806200288e565b606462002ad560185462002ace565b50905062002b16565b5086528b8389882054161562002ab3565b50818d1462002888565b805460ff60a01b19908116600160a01b17825562002b6f62002fb3565b81541690553862002854565b50308552600489528685205460215411156200284e565b5081815460a81c1662002847565b5081815460a01c161562002840565b62002bc4929394959660048c52205462002555565b88541062002bd957908b939291878762002830565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600c5460a01c166200282a565b9150601f54851180159062002c61575b1562002c335789916200280d565b60405162461bcd60e51b815260206004820152600660248201526509ac2f040a8b60d31b6044820152606490fd5b508083168a52600e6020528560408b205416801562002c255750878a528560408b20541662002c25565b5086600c5460a01c1662002807565b5060209150600080516020620046988339815191529260018060a09897981b03809116948587526004845262002cd5836040892054620025ae565b8688526004855260408820551694858152604062002cf7838284205462002555565b91878152600485522055604051908152a3600190565b600754421062002d265760ff19166009555b38620027d9565b50601b546001600160a01b039085821690821681810362002d8457505085168752600260205282604088205416801562002d6c575b62002d669062002776565b62002d1f565b5062002d6662002d7c86620026a5565b905062002d5b565b9091871690810362002dc157508752600260205282604088205416801562002db15762002d669062002776565b5062002d6662002d7c85620026a5565b90885260026020528360408920541690811562002e4d575b8162002e1d575b5062002d665760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b885250600260205260408720548316801562002e3b575b3862002de0565b5062002e4785620026a5565b62002e34565b905062002e5a85620026a5565b9062002dd9565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002f39571691821562002ef45760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260058252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b3d1562002fae573d9062002f9282620023e0565b9162002fa26040519384620023be565b82523d6000602084013e565b606090565b600030815260046020908082526040908184205462002fe362002fd96013548362002579565b601854906200258d565b62002ff4600191821c8093620025ae565b9182156200343e578451606081018181106001600160401b038211176200342b5786526002815286810193863686378151156200341857308552601a5487516315ab88c960e31b81526001600160a01b039691871692908a818a81875afa9081156200340e578c91620033ec575b508451871015620033d957871689850152823b15620033d557885163791ac94760e01b815288810191909152602481018b905260a06044820152925160a484018190528a928492909160c48401919085898e5b838310620033b15750505050508383809230606483015242608483015203925af18015620033a7576200338f575b50908691620030fa62002fd9476013549062002579565b821c9080620032f3575b50504795620031166014548862002579565b916200313f6200312a60185480956200258d565b93620031396011548b62002579565b6200258d565b90620031578262003151868c620025ae565b620025ae565b98620031c3575b50505050541691823b156200079a579184929183925180958193630d0e30db60e41b83525af19182620031ab575b5050620031a85780600080516020620046b883398151915291a1565b50565b620031b690620023aa565b620006ab5781386200318c565b8162003201575b50505080620031dd575b8080806200315e565b8180809285601e54165af1620031f262002f7e565b50156200079a578438620031d4565b90919293501c90848185601c5416885192838092633690e28760e01b82525afa908115620032c75789808588829583958491620032d1575b50165af16200324762002f7e565b50156200296657848185601c541688519283809263d7e7a9e760e01b82525afa918215620032c7578993868594859485948592620032a5575b5050165af16200328f62002f7e565b5015620032a1578590388080620031ca565b8580fd5b620032bf9250803d10620017c157620017b18183620023be565b388062003280565b87513d8b823e3d90fd5b620032ec9150883d8a11620017c157620017b18183620023be565b3862003239565b60609192935060c485601a5416918851948593849263f305d71960e01b8452308b85015260248401528c60448401528c606484015261dead60848401524260a48401525af1801562003385579087929162003350575b8062003104565b6060809293503d81116200337d575b6200336b8183620023be565b81010312620032a15785903862003349565b503d6200335f565b85513d89823e3d90fd5b6200339e9097919297620023aa565b959038620030e3565b86513d8a823e3d90fd5b929597509295509281908b87511681520194019101908c9492869492898e620030b5565b8a80fd5b634e487b7160e01b8c526032895260248cfd5b6200340791508b3d8d11620017c157620017b18183620023be565b3862003062565b8a513d8e823e3d90fd5b634e487b7160e01b895260328652602489fd5b634e487b7160e01b895260418652602489fd5b50505050505050565b6200345660105415156200265c565b6006546005810281159082810460051482171562002563576103e890048310620034c557600382029182046003141715620025635760649004106200349757565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b15620034fd57565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b6200358f60116200354862001d8f6014546013549062002555565b62003587600c6200357a620035608554809562002555565b938460185562001d9962001db76017546016549062002555565b92836019551115620034f5565b1115620034f5565b565b805160005b818110620035a357505050565b8251811015620035e757620035e1906002602060018060a01b03818460051b8801015116600052526040600020600160ff1982541617905562002695565b62003596565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df576060816200107a8038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610e469081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109f357508163125f9e331461018957816314b6ca96146107b657816328fd3198146107895781632d48e896146107595781633a98ef391461073a5781634fab0ae81461071b57816351171961146106f057816366817df5146106b85781638477d9f31461061f578163997664d714610600578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b8a565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c58565b156101dd578261015b33610c9c565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a610a0f565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ade565b9116905261035383610b01565b52888361035f84610ade565b51168461036b85610b01565b51160361049657505061037e8291610ade565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610aae565b6103f281600854610ad1565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610b11565b610b24565b90610ad1565b600a5538808280f35b905082813d831161045a575b6104428183610a8c565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a62565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a25565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a62565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a8c565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a8c565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b5050346101295760203660031901126101295760609181906001600160a01b036105da610a0f565b168152600660205220805491600260018301549201549181519384526020840152820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b868282106106985785906106948861068584890385610a8c565b51928284938452830190610a25565b0390f35b83546001600160a01b03168552889550909301926001928301920161066b565b5050346101295760203660031901126101295760209181906001600160a01b036106e0610a0f565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107af6107aa610a0f565b610dad565b9051908152f35b8383346101295780600319360112610129576107d0610a0f565b82546024359291906001600160a01b0390811633036109ef5780821693848652600692602092848452858820546109e1575b82158015806109d0575b156108d55750506003548688528884528086892055680100000000000000008110156108c2576001969798509061084b828861086f9401600355610b44565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b61088e81610889600754898b52868652878b205490610aae565b610ad1565b600755858752828252838720556108b76108ae84882054600a5490610b11565b600b5490610b24565b948652528320015580f35b634e487b7160e01b885260418952602488fd5b909150806109be575b6108ef575b5060019495965061086f565b60038054600019908181019081116109ab578361090e61092792610b44565b905490851b1c16898b528b875261084b898c2054610b44565b878952898552868920548254828101908111610998576109478591610b44565b905490851b1c168a528a8652878a20558154801561098557600198999a50019161097083610b44565b9091825491841b1b19169055558695946108e3565b634e487b7160e01b8a5260318b5260248afd5b634e487b7160e01b8b5260118c5260248bfd5b634e487b7160e01b8a5260118b5260248afd5b508587528383528487205415156108de565b50878952858552868920541561080c565b6109ea82610c9c565b610802565b8480fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a45575050505090565b83516001600160a01b031685529381019392810192600101610a37565b67ffffffffffffffff8111610a7657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a7657604052565b91908203918211610abb57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610abb57565b805115610aeb5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610aeb5760400190565b81810292918115918404141715610abb57565b8115610b2e570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610aeb5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610abb5760010190565b906003908154908115610c525792916000908180955a5b86881080610c49575b15610c3f57610bfd610bf6610c1192600e9a898c541015610c37575b8b54610bea610bd482610b44565b90546001600160a01b0392918c1b1c8216610c58565b610c18575b5050610ad1565b5a90610aae565b945a98610c0a8154610b7b565b9055610b7b565b9396610ba1565b610c24610c3092610b44565b9054908b1b1c16610c9c565b3880610bef565b868c55610bc6565b5095505050505050565b50858510610baa565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c7d91610ad1565b4210159081610c8a575090565b610c949150610dad565b600d54111590565b60018060a01b0380821690600092828452602091600683526040918286205415610ccf57610cc990610dad565b80610cd7575b505050505050565b60448492610ce783600954610ad1565b60095586885260058452428589205560068452610d0a836002878b200154610ad1565b878952600685526002868a200155610d2b6108ae868a2054600a5490610b11565b878952600685526001868a2001556002541695878551978894859363a9059cbb60e01b8552600485015260248401525af1908115610da45750610d71575b808080610ccf565b81813d8311610d9d575b610d858183610a8c565b81010312610129575180151503610493578080610d69565b503d610d7b565b513d85823e3d90fd5b6001600160a01b031660008181526006602052604081205490919015610e0c57610de16108ae6040842054600a5490610b11565b908252600660205260016040832001549081811115610e0757610e049250610aae565b90565b505090565b509056fea2646970667358221220bdfc7f0abe73f0bfce3c2f01f9220a81c0e23741e935cc0ee148b2d50c15ded964736f6c63430008110033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85bddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efd491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220ecfeaa3592127e6068b536b47f112cc8829ce899c958931f3974056fd48866c064736f6c63430008110033
Deployed Bytecode
0x60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022c25750806306fdde03146200220e578063095ea7b314620021e1578063125f9e33146200216757806316d9962b146200213357806318160ddd14620021135780631df4ccfc14620020f35780631f53ac0214620020a157806323b872dd1462001fe057806327193bc41462001f545780632b112e491462001f045780632d48e8961462001e8a578063313ce5671462001e6c57806336e4ec641462001e4c578063395093511462001df35780633af32abf14620008325780633c8228121462001d105780633dab52691462001cb55780633f4218e01462001c725780634355855a1462001c2f57806344de2e4c1462001c075780634509a9881462001bb9578063497a000a1462001b425780634a74bb021462001b1a578063546a88111462001a7d57806359a51c341462001a525780636457f6bf1462000f5a57806364d817fa1462000ecc5780636827e7641462000eac578063704ce43e1462000e8c57806370a082311462000e4f57806370c757ec1462000e2a5780637c0ff2051462000e0a5780637d1db4a51462000dea5780637db1342c1462000dab578063807c2d9c1462000d8c57806383ad79941462000d6c5780638b42507f1462000d295780638ea5220f1462000cfe57806390fbd17f1462000cca5780639502c4261462000caa57806395d89b411462000bb7578063a3a2e89e1462000b51578063a3e676101462000b26578063a457c2d71462000a7d578063a8aa1b311462000a52578063a9059cbb1462000a19578063b48e665e14620009f9578063bad3ea6a14620009d0578063bb542ef01462000981578063bf56b3711462000961578063c45a01551462000936578063ca987b0e1462000916578063cb29813c14620008bd578063cc6badb3146200089d578063d4fb9a011462000875578063d741b9c31462000832578063d920334e14620007f3578063dd62ed3e146200079e578063e4cbd6b314620006af578063e572967b14620005fc578063e66b1d1e14620005a7578063ebdfd7221462000587578063ef92e22214620004a2578063f16fd78d146200043c578063f887ea401462000411578063fabe628314620003a85763fbd7575303620000105734620003a55780600319360112620003a5576200038160018060a01b03601c54163314620024c0565b601e805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003a5576040366003190112620003a5576200040e620003ca6200232b565b620003d46200239a565b601d5490916001600160a01b0391620003f190831633146200261f565b168352600e602052604083209060ff801983541691151516179055565b80f35b5034620003a55780600319360112620003a557601a546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a5576200045a6200232b565b600c54906001600160a01b0390620004768284163314620025dd565b1680916001600160601b0360a01b1617600c558152600260205260408120600160ff1982541617905580f35b5034620003a55780600319360112620003a557620004cc60018060a01b03601d541633146200261f565b6002601154036200054f57601054620004e78115156200265c565b6203f48081018091116200053b5742106200050b5760016011556200040e6200352d565b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606490fd5b5034620003a55780600319360112620003a5576020600754604051908152f35b5034620003a5576020366003190112620003a557620005c56200238a565b620005dc60018060a01b03601d541633146200261f565b600c805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003a557600319602036820112620006ab57600435906001600160401b03908183116200068d576020908336030112620006a757604051906020820182811082821117620006915760405282600401359081116200068d576200040e9260046200066d923692010162002449565b81526200068660018060a01b03601c54163314620024c0565b5162003591565b8380fd5b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003a55780620006c23662002373565b601d5490916001600160a01b0391620006df90831633146200261f565b8184541690813b156200079a57849160248392604051948593849263f821076960e01b845260048401525af19081156200078f57849162000777575b50541690813b1562000773578291602483926040519485938492635117196160e01b845260048401525af180156200076857620007555750f35b6200076090620023aa565b620003a55780f35b6040513d84823e3d90fd5b5050fd5b6200078290620023aa565b620007735782386200071b565b6040513d86823e3d90fd5b8480fd5b5034620003a5576040366003190112620003a557620007bc6200232b565b6040620007c862002347565b9260018060a01b03809316815260056020522091166000526020526020604060002054604051908152f35b5034620003a5576020366003190112620003a5576004356200082160018060a01b03601d541633146200261f565b6200082c8162003447565b601f5580f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b03620008616200232b565b168152600284522054166040519015158152f35b5034620003a55780600319360112620003a557602060ff601e5460b01c166040519015158152f35b5034620003a55780600319360112620003a5576020601554604051908152f35b5034620003a55760c0366003190112620003a557620008e860018060a01b03601d541633146200261f565b60043560125560443560135560843560145560243560155560643560165560a4356017556200040e6200352d565b5034620003a55780600319360112620003a5576020601954604051908152f35b5034620003a55780600319360112620003a557601c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020601054604051908152f35b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620009bf601d549133908316146200261f565b6001600160a01b03191617601d5580f35b5034620003a55780600319360112620003a557546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020600854604051908152f35b5034620003a5576040366003190112620003a55762000a4662000a3b6200232b565b6024359033620027b5565b50602060405160018152f35b5034620003a55780600319360112620003a557601b546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a55762000a9b6200232b565b60406024359233815260056020522060018060a01b0382166000526020526040600020549180831062000ae15762000ad69203903362002e91565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003a55780600319360112620003a557601d546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a5576200040e62000b736200232b565b62000b7d6200239a565b601d5490916001600160a01b039162000b9a90831633146200261f565b168352600d602052604083209060ff801983541691151516179055565b5034620003a55780600319360112620003a5576040519080600b5462000bdd81620024ff565b8085529160019180831690811562000c7d575060011462000c1d575b62000c198562000c0c81870382620023be565b60405191829182620022e0565b0390f35b9250600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841062000c6457505050810160200162000c0c8262000c1962000bf9565b8054602085870181019190915290930192810162000c45565b86955062000c199693506020925062000c0c94915060ff191682840152151560051b820101929362000bf9565b5034620003a55780600319360112620003a5576020601754604051908152f35b5034620003a5576020366003190112620003a557602062000cf462000cee6200232b565b620026a5565b6040519015158152f35b5034620003a55780600319360112620003a557601e546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362000d586200232b565b168152600e84522054166040519015158152f35b5034620003a55780600319360112620003a5576020601254604051908152f35b5034620003a55780600319360112620003a55760208054604051908152f35b5034620003a5576020366003190112620003a55760043562000dd960018060a01b03601d541633146200261f565b62000de48162003447565b60205580f35b5034620003a55780600319360112620003a5576020601f54604051908152f35b5034620003a55780600319360112620003a5576020601654604051908152f35b5034620003a55780600319360112620003a557602060ff600954166040519015158152f35b5034620003a5576020366003190112620003a5576020906040906001600160a01b0362000e7b6200232b565b168152600483522054604051908152f35b5034620003a55780600319360112620003a5576020601354604051908152f35b5034620003a55780600319360112620003a5576020601454604051908152f35b5034620003a5576020366003190112620003a55762000eea6200232b565b601c546001600160a01b03919062000f069083163314620024c0565b1680825260026020526040822060ff1990600182825416179055600e60205260408320600182825416179055600d602052600160408420918254161790556001600160601b0360a01b601c541617601c5580f35b5034620003a5576003199060e036830112620003a5576001600160401b0360043511620003a557610180809260043536030112620003a5576040519182018281106001600160401b038211176200069157604052600435600401356001600160401b038111620006ab5762000fd7906004369181350101620023fc565b8252602460043501356001600160401b038111620006ab5762001002906004369181350101620023fc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010369060a4016200235e565b60a08301526200104b60c4600435016200235e565b60c08301526200106060e4600435016200235e565b60e083015262001076610104600435016200235e565b6101008301526200108d610124600435016200235e565b61012083015261014460043501356001600160401b038111620006ab57620010bd90600436918135010162002449565b6101408301526001600160401b03610164600435013511620003a557620010f03660048035610164810135010162002449565b61016083015260c0366023190112620003a5576040519060c082018281106001600160401b038211176200069157604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a08301526200116560018060a01b03601c54163314620024c0565b82519283516001600160401b03811162001a3e5762001186600a54620024ff565b601f8111620019ec575b50602094601f82116001146200196557948394958293949262001959575b50508160011b916000199060031b1c191617600a555b60208101519283516001600160401b0381116200194557620011e8600b54620024ff565b601f8111620018e7575b50602094601f82116001146200186057948495829394959262001854575b50508160011b916000199060031b1c191617600b555b62001238604083015160065462002555565b6006556046606083015110620018265760646200125f604084015160608501519062002579565b048362001271826040860151620025ae565b913382526004602052604082206200128b82825462002555565b905560a08501516001600160a01b031682526004602052604082208054620012b590859062002555565b90556040519081526000805160206200469883398151915290828260203393a360a08501516040519384526001600160a01b031692602090a3604082015160058102908082046005149015171562001812576103e89004601f5560408201518080046001148115171562001812576064900460205560408201518060058102046005148115171562001812576005610fa09102046021558260018060a01b036101008401511681601a54826001600160601b0360a01b821617601a5516176040519063c45a015560e01b8252602082600481845afa90811562001774576004928492620017eb575b50602090604051938480926315ab88c960e31b82525afa91821562001774576020926044918591620017c9575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af19081156200078f57849162001793575b50601b80546001600160a01b0319166001600160a01b03928316179055308452600560209081526040808620601a5484166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b0361107a8401908111908411176200177f5761107a620035fe843961107a830190815260208101919091523060408201528190036060019084f08015620017745783546001600160a01b0319166001600160a01b0391821617845530845260026020526040808520805460ff199081166001908117909255601c54841687528287208054821683179055601b5484168752828720805482168317905560a0860151841687528287208054821683179055610120860151841687528287208054821683179055610100860151909316865290852080549092161790556101408201516200154d9062003591565b6101608201518051906001600160401b038211620017605768010000000000000000821162001760576020906003548360035580841062001738575b500160038552845b8281106200170b57505030808552600d602090815260408087208054600160ff199182168117909255601c80546001600160a01b039081168b52848b208054841685179055868b52600e8652848b20805484168517905560a08a81015182168c52858c208054851686179055601b805483168d52868d208054861687179055925482168c52858c20805485168617905561dead808d52868d2080548616871790558c8052868d20805486168717905592549091168b52600f8652848b208054841685179055958a52838a20805483168417905589528289208054821683179055888052828920805490911690911790556080808701516008558551601255908501516013558401516014558301516015556060830151601655919091015160175550620016bd6200352d565b60a0810151601d80546001600160a01b03199081166001600160a01b039384161790915560c0830151601e8054831691841691909117905561012090920151600c8054909316911617905580f35b81516001600160a01b03166000805160206200467883398151915282015560209091019060010162001591565b6200175990846000805160206200467883398151915291820191016200253c565b3862001589565b634e487b7160e01b85526041600452602485fd5b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b620017ba915060203d602011620017c1575b620017b18183620023be565b810190620025bc565b3862001406565b503d620017a5565b620017e49150843d8611620017c157620017b18183620023be565b38620013ca565b60209192506200180a90823d8411620017c157620017b18183620023be565b91906200139d565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001210565b600b8552601f198216957f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db991865b888110620018ce57508360019596979810620018b4575b505050811b01600b5562001226565b015160001960f88460031b161c19169055388080620018a5565b919260206001819286850151815501940192016200188e565b6200193390600b86527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9601f840160051c810191602085106200193a575b601f0160051c01906200253c565b38620011f2565b909150819062001925565b634e487b7160e01b84526041600452602484fd5b015190503880620011ae565b600a8452601f198216957fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a891855b888110620019d357508360019596979810620019b9575b505050811b01600a55620011c4565b015160001960f88460031b161c19169055388080620019aa565b9192602060018192868501518155019401920162001993565b62001a3790600a85527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f840160051c810191602085106200193a57601f0160051c01906200253c565b3862001190565b634e487b7160e01b83526041600452602483fd5b5034620003a55780600319360112620003a557600c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557601c546001600160a01b039062001aab9082163314620024c0565b80601a54168252600d602052604082209060ff199160018382541617905580601a54168352600e60205260408320600183825416179055601d5416825260016040832091825416179055601e5460ff60a01b19600c5416600c55600160b01b9061ffff60a81b191617601e5580f35b5034620003a55780600319360112620003a557602060ff601e5460a81c166040519015158152f35b5034620003a5576020366003190112620003a55760043562001b7060018060a01b03600c54163314620025dd565b8060085560105481603c0291603c83040362001ba5579062001b929162002555565b600755600160ff19600954161760095580f35b634e487b7160e01b83526011600452602483fd5b5034620003a5576020366003190112620003a557600435600354811015620006ab5760036000526000805160206200467883398151915201546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557602060ff600c5460a01c166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001c5e6200232b565b168152600f84522054166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001ca16200232b565b168152600d84522054166040519015158152f35b5034620003a5576040366003190112620003a55762001cd36200238a565b62001cea60018060a01b03601d541633146200261f565b601e805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560215580f35b5034620003a5576020366003190112620003a55760043562001d3e60018060a01b03600c54163314620025dd565b60105462001d4e8115156200265c565b6203f480810180911162001ba557421062001dc75760018111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b6012549062002555565b62002555565b60185562001d9962001db76017546016549062002555565b6015549062002555565b60195580f35b60028111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b5034620003a5576040366003190112620003a55762000ad690604062001e186200232b565b9133815260056020522060018060a01b03821660005260205262001e4460243560406000205462002555565b903362002e91565b5034620003a55780600319360112620003a5576020601154604051908152f35b5034620003a55780600319360112620003a557602060405160098152f35b5034620003a5578062001e9d3662002373565b601d549192916001600160a01b039062001ebb90821633146200261f565b82541692833b15620006a7576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620007685762001ef9575080f35b6200040e90620023aa565b5034620003a55780600319360112620003a55762001f4c602091604062001f3b60065461dead8452600486528284205490620025ae565b9180805260048552205490620025ae565b604051908152f35b5034620003a55780600319360112620003a55762001f7e60018060a01b03601c54163314620024c0565b60105462001fa8574260105560085480603c0290603c8204036200053b5762001b92904262002555565b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003a5576060366003190112620003a55762001ffe6200232b565b906200200962002347565b60406044359260018060a01b03851681526005602052818120338252602052205492600019840362002042575b62000a469350620027b5565b82841062002063576200205d8362000a469503338362002e91565b62002036565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620020dd90601d541633146200261f565b6001600160601b0360a01b601e541617601e5580f35b5034620003a55780600319360112620003a5576020601854604051908152f35b5034620003a55780600319360112620003a5576020600654604051908152f35b5034620003a5576020366003190112620003a5576200215e60018060a01b03601d541633146200261f565b60043560015580f35b5034620003a55780600319360112620003a557805460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa918215620017745760209392620021bd575b5060405191168152f35b620021d9919250833d8111620017c157620017b18183620023be565b9038620021b3565b5034620003a5576040366003190112620003a55762000ad6620022036200232b565b602435903362002e91565b5034620003a55780600319360112620003a5576040519080600a546200223481620024ff565b8085529160019180831690811562000c7d5750600114620022625762000c198562000c0c81870382620023be565b9250600a83527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b828410620022a957505050810160200162000c0c8262000c1962000bf9565b805460208587018101919091529093019281016200228a565b905034620006ab5781600319360112620006ab576020906021548152f35b6020808252825181830181905290939260005b8281106200231657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022f3565b600435906001600160a01b03821682036200234257565b600080fd5b602435906001600160a01b03821682036200234257565b35906001600160a01b03821682036200234257565b604090600319011262002342576004359060243590565b6004359081151582036200234257565b6024359081151582036200234257565b6001600160401b0381116200069157604052565b90601f801991011681019081106001600160401b038211176200069157604052565b6001600160401b0381116200069157601f01601f191660200190565b81601f8201121562002342578035906200241682620023e0565b92620024266040519485620023be565b828452602083830101116200234257816000926020809301838601378301015290565b9080601f8301121562002342578135906001600160401b03821162000691578160051b604051936020936200248185840187620023be565b8552838086019282010192831162002342578301905b828210620024a6575050505090565b838091620024b4846200235e565b81520191019062002497565b15620024c857565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c9216801562002531575b60208310146200251b57565b634e487b7160e01b600052602260045260246000fd5b91607f16916200250f565b81811062002548575050565b600081556001016200253c565b919082018092116200256357565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200256357565b811562002598570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200256357565b908160209103126200234257516001600160a01b0381168103620023425790565b15620025e557565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200262757565b60405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606490fd5b156200266457565b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b6000198114620025635760010190565b60009060038054925b838110620026bf5750505050600090565b600082905260008051602062004678833981519152810154604080516370a0823160e01b81526001600160a01b0386811660048301529092602091829185916024918391165afa9182156200276c57506000916200273a575b50905062002731576200272b9062002695565b620026ae565b50505050600190565b82813d831162002764575b620027518183620023be565b81010312620003a5575051803862002718565b503d62002745565b513d6000823e3d90fd5b156200277e57565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b601e80546000959460ff92909160b01c83161562002e615760095483811662002d0d575b5082815460a01c1662002c9a57601b546001600160a01b038681169691811695918991908888148062002c8b575b62002c15575b888352602096600e88526040958787838188205416158062002c06575b62002baf575b5050838616998a14158062002ba0575b8062002b92575b8062002b7b575b62002b52575b508884526004948589526200286d8888872054620025ae565b8a8652868a5287862055601b54841688818c14801562002b48575b62002a9c575b50508a8552858952620028a5888887205462002555565b8b8652868a5287862055898552600f89528187862054161562002a00575b50898452600f88528584205416156200296a575b508154169160015490833b15620006a757602490838651958694859363ffb2c47960e01b85528401525af190816200294e575b5096600080516020620046988339815191529495969715600014620029475780600080516020620046b883398151915291a15b51908152a3600190565b506200293d565b6200295a8991620023aa565b6200296657386200290a565b8780fd5b818354168488528584205491813b156200079a578651630a5b654b60e11b81526001600160a01b039091168682019081526020810193909352918491829184919082908490829060400103925af19182620029e8575b5050620029e257600080516020620046b88339815191528280a15b38620028d7565b620029db565b620029f390620023aa565b620006a7578238620029c0565b9091929384815416868a528782205490803b15620006a7578851630a5b654b60e11b81526001600160a01b039094168885019081526020810192909252839182908490829060400103925af1908162002a80575b508b9392919062002a7a57600080516020620046b88339815191528480a15b38620028c3565b62002a73565b62002a91909c919493929c620023aa565b9a9091923862002a54565b90919850600d8a528b838988205416158062002b37575b1562002b2e5762002b16920362002b1f57606462002ad56019545b8362002579565b0490308752878b5262002aec828a89205462002555565b308852888c528988205588518281528c600080516020620046988339815191528d3093a3620025ae565b9638806200288e565b606462002ad560185462002ace565b50905062002b16565b5086528b8389882054161562002ab3565b50818d1462002888565b805460ff60a01b19908116600160a01b17825562002b6f62002fb3565b81541690553862002854565b50308552600489528685205460215411156200284e565b5081815460a81c1662002847565b5081815460a01c161562002840565b62002bc4929394959660048c52205462002555565b88541062002bd957908b939291878762002830565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600c5460a01c166200282a565b9150601f54851180159062002c61575b1562002c335789916200280d565b60405162461bcd60e51b815260206004820152600660248201526509ac2f040a8b60d31b6044820152606490fd5b508083168a52600e6020528560408b205416801562002c255750878a528560408b20541662002c25565b5086600c5460a01c1662002807565b5060209150600080516020620046988339815191529260018060a09897981b03809116948587526004845262002cd5836040892054620025ae565b8688526004855260408820551694858152604062002cf7838284205462002555565b91878152600485522055604051908152a3600190565b600754421062002d265760ff19166009555b38620027d9565b50601b546001600160a01b039085821690821681810362002d8457505085168752600260205282604088205416801562002d6c575b62002d669062002776565b62002d1f565b5062002d6662002d7c86620026a5565b905062002d5b565b9091871690810362002dc157508752600260205282604088205416801562002db15762002d669062002776565b5062002d6662002d7c85620026a5565b90885260026020528360408920541690811562002e4d575b8162002e1d575b5062002d665760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b885250600260205260408720548316801562002e3b575b3862002de0565b5062002e4785620026a5565b62002e34565b905062002e5a85620026a5565b9062002dd9565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002f39571691821562002ef45760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260058252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b3d1562002fae573d9062002f9282620023e0565b9162002fa26040519384620023be565b82523d6000602084013e565b606090565b600030815260046020908082526040908184205462002fe362002fd96013548362002579565b601854906200258d565b62002ff4600191821c8093620025ae565b9182156200343e578451606081018181106001600160401b038211176200342b5786526002815286810193863686378151156200341857308552601a5487516315ab88c960e31b81526001600160a01b039691871692908a818a81875afa9081156200340e578c91620033ec575b508451871015620033d957871689850152823b15620033d557885163791ac94760e01b815288810191909152602481018b905260a06044820152925160a484018190528a928492909160c48401919085898e5b838310620033b15750505050508383809230606483015242608483015203925af18015620033a7576200338f575b50908691620030fa62002fd9476013549062002579565b821c9080620032f3575b50504795620031166014548862002579565b916200313f6200312a60185480956200258d565b93620031396011548b62002579565b6200258d565b90620031578262003151868c620025ae565b620025ae565b98620031c3575b50505050541691823b156200079a579184929183925180958193630d0e30db60e41b83525af19182620031ab575b5050620031a85780600080516020620046b883398151915291a1565b50565b620031b690620023aa565b620006ab5781386200318c565b8162003201575b50505080620031dd575b8080806200315e565b8180809285601e54165af1620031f262002f7e565b50156200079a578438620031d4565b90919293501c90848185601c5416885192838092633690e28760e01b82525afa908115620032c75789808588829583958491620032d1575b50165af16200324762002f7e565b50156200296657848185601c541688519283809263d7e7a9e760e01b82525afa918215620032c7578993868594859485948592620032a5575b5050165af16200328f62002f7e565b5015620032a1578590388080620031ca565b8580fd5b620032bf9250803d10620017c157620017b18183620023be565b388062003280565b87513d8b823e3d90fd5b620032ec9150883d8a11620017c157620017b18183620023be565b3862003239565b60609192935060c485601a5416918851948593849263f305d71960e01b8452308b85015260248401528c60448401528c606484015261dead60848401524260a48401525af1801562003385579087929162003350575b8062003104565b6060809293503d81116200337d575b6200336b8183620023be565b81010312620032a15785903862003349565b503d6200335f565b85513d89823e3d90fd5b6200339e9097919297620023aa565b959038620030e3565b86513d8a823e3d90fd5b929597509295509281908b87511681520194019101908c9492869492898e620030b5565b8a80fd5b634e487b7160e01b8c526032895260248cfd5b6200340791508b3d8d11620017c157620017b18183620023be565b3862003062565b8a513d8e823e3d90fd5b634e487b7160e01b895260328652602489fd5b634e487b7160e01b895260418652602489fd5b50505050505050565b6200345660105415156200265c565b6006546005810281159082810460051482171562002563576103e890048310620034c557600382029182046003141715620025635760649004106200349757565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b15620034fd57565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b6200358f60116200354862001d8f6014546013549062002555565b62003587600c6200357a620035608554809562002555565b938460185562001d9962001db76017546016549062002555565b92836019551115620034f5565b1115620034f5565b565b805160005b818110620035a357505050565b8251811015620035e757620035e1906002602060018060a01b03818460051b8801015116600052526040600020600160ff1982541617905562002695565b62003596565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df576060816200107a8038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610e469081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109f357508163125f9e331461018957816314b6ca96146107b657816328fd3198146107895781632d48e896146107595781633a98ef391461073a5781634fab0ae81461071b57816351171961146106f057816366817df5146106b85781638477d9f31461061f578163997664d714610600578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b8a565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c58565b156101dd578261015b33610c9c565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a610a0f565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ade565b9116905261035383610b01565b52888361035f84610ade565b51168461036b85610b01565b51160361049657505061037e8291610ade565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610aae565b6103f281600854610ad1565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610b11565b610b24565b90610ad1565b600a5538808280f35b905082813d831161045a575b6104428183610a8c565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a62565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a25565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a62565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a8c565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a8c565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b5050346101295760203660031901126101295760609181906001600160a01b036105da610a0f565b168152600660205220805491600260018301549201549181519384526020840152820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b868282106106985785906106948861068584890385610a8c565b51928284938452830190610a25565b0390f35b83546001600160a01b03168552889550909301926001928301920161066b565b5050346101295760203660031901126101295760209181906001600160a01b036106e0610a0f565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107af6107aa610a0f565b610dad565b9051908152f35b8383346101295780600319360112610129576107d0610a0f565b82546024359291906001600160a01b0390811633036109ef5780821693848652600692602092848452858820546109e1575b82158015806109d0575b156108d55750506003548688528884528086892055680100000000000000008110156108c2576001969798509061084b828861086f9401600355610b44565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b61088e81610889600754898b52868652878b205490610aae565b610ad1565b600755858752828252838720556108b76108ae84882054600a5490610b11565b600b5490610b24565b948652528320015580f35b634e487b7160e01b885260418952602488fd5b909150806109be575b6108ef575b5060019495965061086f565b60038054600019908181019081116109ab578361090e61092792610b44565b905490851b1c16898b528b875261084b898c2054610b44565b878952898552868920548254828101908111610998576109478591610b44565b905490851b1c168a528a8652878a20558154801561098557600198999a50019161097083610b44565b9091825491841b1b19169055558695946108e3565b634e487b7160e01b8a5260318b5260248afd5b634e487b7160e01b8b5260118c5260248bfd5b634e487b7160e01b8a5260118b5260248afd5b508587528383528487205415156108de565b50878952858552868920541561080c565b6109ea82610c9c565b610802565b8480fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a45575050505090565b83516001600160a01b031685529381019392810192600101610a37565b67ffffffffffffffff8111610a7657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a7657604052565b91908203918211610abb57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610abb57565b805115610aeb5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610aeb5760400190565b81810292918115918404141715610abb57565b8115610b2e570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610aeb5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610abb5760010190565b906003908154908115610c525792916000908180955a5b86881080610c49575b15610c3f57610bfd610bf6610c1192600e9a898c541015610c37575b8b54610bea610bd482610b44565b90546001600160a01b0392918c1b1c8216610c58565b610c18575b5050610ad1565b5a90610aae565b945a98610c0a8154610b7b565b9055610b7b565b9396610ba1565b610c24610c3092610b44565b9054908b1b1c16610c9c565b3880610bef565b868c55610bc6565b5095505050505050565b50858510610baa565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c7d91610ad1565b4210159081610c8a575090565b610c949150610dad565b600d54111590565b60018060a01b0380821690600092828452602091600683526040918286205415610ccf57610cc990610dad565b80610cd7575b505050505050565b60448492610ce783600954610ad1565b60095586885260058452428589205560068452610d0a836002878b200154610ad1565b878952600685526002868a200155610d2b6108ae868a2054600a5490610b11565b878952600685526001868a2001556002541695878551978894859363a9059cbb60e01b8552600485015260248401525af1908115610da45750610d71575b808080610ccf565b81813d8311610d9d575b610d858183610a8c565b81010312610129575180151503610493578080610d69565b503d610d7b565b513d85823e3d90fd5b6001600160a01b031660008181526006602052604081205490919015610e0c57610de16108ae6040842054600a5490610b11565b908252600660205260016040832001549081811115610e0757610e049250610aae565b90565b505090565b509056fea2646970667358221220bdfc7f0abe73f0bfce3c2f01f9220a81c0e23741e935cc0ee148b2d50c15ded964736f6c63430008110033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85bddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efd491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220ecfeaa3592127e6068b536b47f112cc8829ce899c958931f3974056fd48866c064736f6c63430008110033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.