Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 16968973 | 544 days ago | IN | 0 ETH | 0.15374226 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PresaleV10
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT /* $$$$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$$$\ $$$$$$\ $$\ $$\ $$$$$$$$\ $$ _____|\_$$ _|$$ __$$\ $$ | $$ |\__$$ __|$$ __$$\ $$ | $$ |\__$$ __| $$ | $$ | $$ / \__|$$ | $$ | $$ | $$ / $$ |$$ | $$ | $$ | $$$$$\ $$ | $$ |$$$$\ $$$$$$$$ | $$ | $$ | $$ |$$ | $$ | $$ | $$ __| $$ | $$ |\_$$ |$$ __$$ | $$ | $$ | $$ |$$ | $$ | $$ | $$ | $$ | $$ | $$ |$$ | $$ | $$ | $$ | $$ |$$ | $$ | $$ | $$ | $$$$$$\ \$$$$$$ |$$ | $$ | $$ | $$$$$$ |\$$$$$$ | $$ | \__| \______| \______/ \__| \__| \__| \______/ \______/ \__| */ pragma solidity 0.8.9; import '@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol'; import '@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol'; interface Aggregator { function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } contract PresaleV10 is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable, PausableUpgradeable { uint256 public totalTokensSold; uint256 public totalBonus; uint256 public startTime; uint256 public endTime; uint256 public claimStart; address public saleToken; uint256 public baseDecimals; uint256 public maxTokensToBuy; uint256 public currentStep; IERC20Upgradeable public USDTInterface; Aggregator public aggregatorInterface; // https://docs.chain.link/docs/ethereum-addresses/ => (ETH / USD) uint256[1][2] public rounds; uint256[][2] public token_quantity_bonus; uint256 public default_lockup; uint256 public MONTH; uint256 public initialClaimPercent; struct UserDeposits { uint256 depositAmount; uint256 bonusAmount; uint256 initialClaim; uint256 claimedAmount; uint256 claimTime; } mapping(address => UserDeposits[]) public userDeposits; mapping(uint256 => uint256) public lockup_bonus; uint256 public linearStartTime; mapping(address => bool) public isBlacklisted; mapping(address => bool) public isWhitelisted; bool public whitelistClaimOnly; uint256 public increment; uint256 public linearPriceUsdRaised; mapping(address => bool) public wertWhitelisted; mapping(address => mapping(uint256 => bool)) public newUser; bool public changeLinearStartTimeFlag; uint256 public newLinearStartTime; uint256 public newLinearPrice; uint256 public newIncrement; uint256 public capPrice; address public admin; bool public setAdminFlag; event SaleTimeSet(uint256 _start, uint256 _end, uint256 timestamp); event SaleTimeUpdated(bytes32 indexed key, uint256 prevValue, uint256 newValue, uint256 timestamp); event TokensBought(address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 bonus, uint256 amountPaid, uint256 usdEq, uint256 timestamp); event TokensAdded(address indexed token, uint256 noOfTokens, uint256 timestamp); event TokensClaimed(address indexed user, uint256 indexed id, uint256 amount, uint256 timestamp); event ClaimStartUpdated(uint256 prevValue, uint256 newValue, uint256 timestamp); event MaxTokensUpdated(uint256 prevValue, uint256 newValue, uint256 timestamp); /// @custom:oz-upgrades-unsafe-allow constructor constructor() initializer {} /** * @dev To pause the presale */ function pause() external onlyOwner { _pause(); } /** * @dev To unpause the presale */ function unpause() external onlyOwner { _unpause(); } /** * @dev To calculate the price in USD for given amount of tokens. * @param _amount No of tokens * @notice Since this presale has only one round, current step should not go above 0 * in case of multiple rounds, current step has to be set accordingly */ function calculatePrice(uint256 _amount) public view returns (uint256 totalValue) { uint256 USDTAmount; require(_amount <= maxTokensToBuy, 'Amount exceeds max tokens to buy'); if (_amount + totalTokensSold > rounds[0][currentStep]) { require(currentStep < 0, 'Insufficient token amount.'); uint256 tokenAmountForCurrentPrice = rounds[0][currentStep] - totalTokensSold; USDTAmount = tokenAmountForCurrentPrice * rounds[1][currentStep] + (_amount - tokenAmountForCurrentPrice) * rounds[1][currentStep + 1]; } else { if (linearStartTime == 0 || linearStartTime >= block.timestamp) { USDTAmount = _amount * rounds[1][currentStep]; } else { if (newLinearStartTime != 0 && block.timestamp > newLinearStartTime) { uint256 priceStep = (block.timestamp - newLinearStartTime) / (7 * 24 * 60 * 60); if (newLinearPrice + (priceStep * newIncrement) > capPrice) { USDTAmount = capPrice * _amount; } else { USDTAmount = (newLinearPrice + (priceStep * newIncrement)) * _amount; } } else { uint256 priceStep = (block.timestamp - linearStartTime) / (12 * 60 * 60); priceStep += 1; USDTAmount = (rounds[1][currentStep] + (priceStep * increment)) * _amount; } } } return USDTAmount; } /** * @dev To update the sale times * @param _startTime New start time * @param _endTime New end time */ function changeSaleTimes(uint256 _startTime, uint256 _endTime) external onlyOwner { require(_startTime > 0 || _endTime > 0, 'Invalid parameters'); if (_startTime > 0) { require(block.timestamp < startTime, 'Sale already started'); require(block.timestamp < _startTime, 'Sale time in past'); uint256 prevValue = startTime; startTime = _startTime; emit SaleTimeUpdated(bytes32('START'), prevValue, _startTime, block.timestamp); } if (_endTime > 0) { require(block.timestamp < endTime, 'Sale already ended'); require(_endTime > startTime, 'Invalid endTime'); uint256 prevValue = endTime; endTime = _endTime; emit SaleTimeUpdated(bytes32('END'), prevValue, _endTime, block.timestamp); } } /** * @dev To update max tokens to buy * @param _maxTokensToBuy New max tokens value */ function changeMaxTokensToBuy(uint256 _maxTokensToBuy) external onlyOwner { require(_maxTokensToBuy > 0, 'Zero max tokens to buy value'); uint256 prevValue = maxTokensToBuy; maxTokensToBuy = _maxTokensToBuy; emit MaxTokensUpdated(prevValue, _maxTokensToBuy, block.timestamp); } /** * @dev To update rounds info * @param _rounds New rounds array */ function changeRoundsData(uint256[1][2] memory _rounds) external onlyOwner { rounds = _rounds; } /** * @dev To get latest ethereum price in 10**18 format */ function getLatestPrice() public view returns (uint256) { (, int256 price, , , ) = aggregatorInterface.latestRoundData(); price = (price * (10 ** 10)); return uint256(price); } modifier checkSaleState(uint256 amount) { require(block.timestamp >= startTime && block.timestamp <= endTime, 'Invalid time for buying'); require(amount > 0, 'Invalid sale amount'); _; } /** * @dev To check total amount of bonus tokens user will get for particular amount and months locked * @param amount amount of tokens to be locked * @param lockup_months number of months tokens will be locked */ function checkBonus(uint256 amount, uint256 lockup_months) public view returns (uint256, uint256) { (uint256 lbonus, ) = checkLockupBonus(amount, lockup_months); return (checkTokenQuantityBonus(amount), lbonus); } /** * @dev To check amount of bonus tokens user will get for particular amount purchased * compared with equivalent amount of tokens in USDT * @param amount amount of tokens to be locked */ function checkTokenQuantityBonus(uint256 amount) public view returns (uint256) { uint256 price = calculatePrice(amount) / baseDecimals; if (price < token_quantity_bonus[0][0]) return 0; if (price >= token_quantity_bonus[0][token_quantity_bonus[0].length - 1]) return ((amount * baseDecimals) * token_quantity_bonus[1][token_quantity_bonus[1].length - 1]) / 10000; uint256 bonus; for (uint256 i = 0; i < (token_quantity_bonus[0].length); i++) { if (price < token_quantity_bonus[0][i]) { bonus = (token_quantity_bonus[1][i - 1]); break; } else if (price == token_quantity_bonus[0][i]) { bonus = (token_quantity_bonus[1][i]); break; } } return ((amount * baseDecimals) * bonus) / 10000; } /** * @dev To check amount of bonus tokens user will get for particular amount and months locked * @param amount amount of tokens to be locked * @param lockup_months number of months tokens will be locked */ function checkLockupBonus(uint256 amount, uint256 lockup_months) public view returns (uint256 bonus, uint256 timeLockedFor) { if (lockup_bonus[lockup_months] == 0) { return (0, 0); } else { bonus = ((amount * baseDecimals) * lockup_bonus[lockup_months]) / 10000; timeLockedFor = lockup_months * MONTH; } } /** * @dev To buy into a presale using USDT * @param amount No of tokens to buy */ function buyWithUSDT(uint256 amount, uint256 lockup_months) external checkSaleState(amount) whenNotPaused returns (bool) { uint256 usdPrice = usdtBuyHelper(amount); uint256 usdEq = calculatePrice(amount); uint256 newBonus = update(amount, lockup_months, usdEq, _msgSender()); uint256 ourAllowance = USDTInterface.allowance(_msgSender(), address(this)); require(usdPrice <= ourAllowance, 'Make sure to add enough allowance'); (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), owner(), usdPrice)); require(success, 'Token payment failed'); emit TokensBought(_msgSender(), amount, address(USDTInterface), (newBonus), usdPrice, usdEq, block.timestamp); return true; } /** * @dev To buy into a presale using ETH * @param amount No of tokens to buy */ function buyWithEth(uint256 amount, uint256 lockup_months) external payable checkSaleState(amount) whenNotPaused nonReentrant returns (bool) { uint256 ethAmount = ethBuyHelper(amount); uint256 usdEq = calculatePrice(amount); require(msg.value >= ethAmount, 'Less payment'); uint256 excess = msg.value - ethAmount; uint256 newBonus = update(amount, lockup_months, usdEq, _msgSender()); sendValue(payable(owner()), ethAmount); if (excess > 0) sendValue(payable(_msgSender()), excess); emit TokensBought(_msgSender(), amount, address(0), (newBonus), ethAmount, usdEq, block.timestamp); return true; } /** * @dev helper function to calculate LockupBonus & InvestmentBonus * @param amount No of tokens user has purchased * @param lockup_months number of months tokens will be locked */ function update(uint256 amount, uint256 lockup_months, uint256 _linearPriceUsdRaised, address _user) internal returns (uint256) { uint256 quantityBonus = checkTokenQuantityBonus(amount); (uint256 lockupBonus, uint256 time) = checkLockupBonus(amount, lockup_months); totalTokensSold += amount; if (totalTokensSold > rounds[0][currentStep]) { currentStep += 1; } uint256 newBonus = quantityBonus + lockupBonus; linearPriceUsdRaised += _linearPriceUsdRaised; userDeposits[_user].push(UserDeposits(amount * baseDecimals, newBonus, (((amount * baseDecimals) + newBonus) * initialClaimPercent) / 10000, 0, time)); newUser[_user][userDeposits[_user].length - 1] = true; totalBonus += (newBonus); return newBonus; } function updateLinearStartTime(uint256 time) external onlyOwner { require(linearStartTime == 0, 'Linear time already set'); linearStartTime = time; } function updateIncrement(uint256 _increment) external onlyOwner { require(increment == 0, 'increment already set'); increment = _increment; } /** * @dev Helper funtion to get ETH price for given amount * @param amount No of tokens to buy */ function ethBuyHelper(uint256 amount) public view returns (uint256 ethAmount) { uint256 usdPrice = calculatePrice(amount); ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); } /** * @dev Helper funtion to get USDT price for given amount * @param amount No of tokens to buy */ function usdtBuyHelper(uint256 amount) public view returns (uint256 usdPrice) { usdPrice = calculatePrice(amount); usdPrice = usdPrice / (10 ** 12); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Low balance'); (bool success, ) = recipient.call{value: amount}(''); require(success, 'ETH Payment failed'); } /** * @dev To check details of transactions done by the user * @param user user's address */ function deposits(address user) external view returns (UserDeposits[] memory) { return userDeposits[user]; } /** * @dev To set the claim start time and sale token address by the owner * @param _claimStart claim start time * @param noOfTokens no of tokens to add to the contract * @param _saleToken sale toke address */ function startClaim(uint256 _claimStart, uint256 noOfTokens, address _saleToken) external onlyOwner returns (bool) { require(_claimStart > endTime && _claimStart > block.timestamp, 'Invalid claim start time'); require(noOfTokens >= (totalTokensSold * baseDecimals) + totalBonus, 'Tokens less than sold'); require(_saleToken != address(0), 'Zero token address'); require(claimStart == 0, 'Claim already set'); claimStart = _claimStart; saleToken = _saleToken; bool success = IERC20Upgradeable(_saleToken).transferFrom(_msgSender(), address(this), noOfTokens); require(success, 'Token transfer failed'); emit TokensAdded(saleToken, noOfTokens, block.timestamp); return true; } /** * @dev To change the claim start time by the owner * @param _claimStart new claim start time */ function changeClaimStart(uint256 _claimStart) external onlyOwner returns (bool) { require(claimStart > 0, 'Initial claim data not set'); require(_claimStart > endTime, 'Sale in progress'); require(_claimStart > block.timestamp, 'Claim start in past'); uint256 prevValue = claimStart; claimStart = _claimStart; emit ClaimStartUpdated(prevValue, _claimStart, block.timestamp); return true; } /** * @dev To claim tokens after claiming starts * @param _id Id of the transaction */ function claim(uint256 _id) public whenNotPaused returns (bool) { require(saleToken != address(0), 'Sale token not added'); require(!isBlacklisted[_msgSender()], 'This Address is Blacklisted'); if (whitelistClaimOnly) { require(isWhitelisted[_msgSender()], 'User not whitelisted for claim'); } uint256 tokens = getClaimableAmount(_msgSender(), _id); require(tokens > 0, 'No claimable tokens available'); if (!newUser[_msgSender()][_id]) { userDeposits[_msgSender()][_id].claimedAmount += tokens - ((tokens * 10) / 100); } else { userDeposits[_msgSender()][_id].claimedAmount += tokens; } bool success = IERC20Upgradeable(saleToken).transfer(_msgSender(), tokens); require(success, 'Token transfer failed'); emit TokensClaimed(_msgSender(), _id, tokens, block.timestamp); return true; } /** * @dev To claim multiple tokens after claiming starts * @param _id array of id's of the transaction */ function claimMultiple(uint256[] memory _id) external whenNotPaused { require(_id.length > 0, 'Invalid length'); for (uint256 i; i < _id.length; i++) { require(claim(_id[i]), 'Claiming failed'); } } /** * @dev Helper funtion to get claimable tokens for a user after claiming starts * @param _user Address of the user * @param _id Id of the transaction */ function getClaimableAmount(address _user, uint256 _id) public view returns (uint256 claimableAmount) { require(claimStart > 0, 'Claim start time not set'); require(_id < userDeposits[_user].length, 'Invalid Id'); UserDeposits memory deposit = userDeposits[_user][_id]; uint256 amount = deposit.depositAmount; uint256 bonus = deposit.bonusAmount; amount += bonus; uint256 claimedAmount = deposit.claimedAmount; require(amount > 0, 'Nothing to claim'); if (amount - claimedAmount == 0) return 0; if (block.timestamp < claimStart) return 0; if (block.timestamp < (claimStart + deposit.claimTime)) { uint256 timePassedRatio = ((block.timestamp - claimStart) * baseDecimals) / ((deposit.claimTime)); claimableAmount = (((amount - deposit.initialClaim) * timePassedRatio) / baseDecimals) + deposit.initialClaim; } else { claimableAmount = amount; } claimableAmount = claimableAmount - claimedAmount; if (!newUser[_msgSender()][_id]) { claimableAmount += (claimableAmount * 10) / 100; } } /** * @dev To update Investment bonus structure * @param _tokenQuantity updated values array */ function updateInvestmentBonus(uint256[][2] memory _tokenQuantity) public onlyOwner { require(_tokenQuantity[0].length == _tokenQuantity[1].length, 'Mismatch length for token quantity bonus'); token_quantity_bonus = _tokenQuantity; } /** * @dev To update LockUp bonus structure * @param _lockup updated values array */ function updateLockUpBonus(uint256[][] memory _lockup) public onlyOwner { require(_lockup[0].length == _lockup[1].length, 'Mismatch length for token lockup bonus'); for (uint256 i; i < _lockup[0].length; i++) { lockup_bonus[_lockup[0][i]] = _lockup[1][i]; } } /** * @dev To buy ETH directly from wert .*wert contract address should be whitelisted if wertBuyRestrictionStatus is set true * @param user address of the user * @param amount No of ETH to buy */ function buyWithETHWert(address user, uint256 amount, uint256 lockup_months) external payable checkSaleState(amount) whenNotPaused nonReentrant returns (bool) { require(wertWhitelisted[_msgSender()], 'User not whitelisted for this tx'); uint256 ethAmount = ethBuyHelper(amount); uint256 usdEq = calculatePrice(amount); require(msg.value >= ethAmount, 'Less payment'); uint256 excess = msg.value - ethAmount; uint256 newBonus = update(amount, lockup_months, usdEq, user); sendValue(payable(owner()), ethAmount); if (excess > 0) sendValue(payable(user), excess); emit TokensBought(user, amount, address(0), (newBonus), ethAmount, usdEq, block.timestamp); return true; } /** * @dev To add wert contract addresses to whitelist * @param _addressesToWhitelist addresses of the contract */ function whitelistUsersForWERT(address[] calldata _addressesToWhitelist) external onlyOwner { for (uint256 i = 0; i < _addressesToWhitelist.length; i++) { wertWhitelisted[_addressesToWhitelist[i]] = true; } } /** * @dev To remove wert contract addresses to whitelist * @param _addressesToRemoveFromWhitelist addresses of the contracts */ function removeFromWhitelistForWERT(address[] calldata _addressesToRemoveFromWhitelist) external onlyOwner { for (uint256 i = 0; i < _addressesToRemoveFromWhitelist.length; i++) { wertWhitelisted[_addressesToRemoveFromWhitelist[i]] = false; } } /** * @dev To add users to blacklist which restricts blacklisted users from claiming * @param _usersToBlacklist addresses of the users */ function blacklistUsers(address[] calldata _usersToBlacklist) external onlyOwner { for (uint256 i = 0; i < _usersToBlacklist.length; i++) { isBlacklisted[_usersToBlacklist[i]] = true; } } /** * @dev To remove users from blacklist which restricts blacklisted users from claiming * @param _userToRemoveFromBlacklist addresses of the users */ function removeFromBlacklist(address[] calldata _userToRemoveFromBlacklist) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromBlacklist.length; i++) { isBlacklisted[_userToRemoveFromBlacklist[i]] = false; } } /** * @dev To add users to whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _usersToWhitelist addresses of the users */ function whitelistUsers(address[] calldata _usersToWhitelist) external onlyOwner { for (uint256 i = 0; i < _usersToWhitelist.length; i++) { isWhitelisted[_usersToWhitelist[i]] = true; } } /** * @dev To remove users from whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _userToRemoveFromWhitelist addresses of the users */ function removeFromWhitelist(address[] calldata _userToRemoveFromWhitelist) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromWhitelist.length; i++) { isWhitelisted[_userToRemoveFromWhitelist[i]] = false; } } /** * @dev To set status for claim whitelisting * @param _status bool value */ function setClaimWhitelistStatus(bool _status) external onlyOwner { whitelistClaimOnly = _status; } function changeLinearStartTime(uint256 _newLinearStartTime, uint256 _newIncrement, uint256 _newLinearPrice, uint256 _capPrice) external { require(!changeLinearStartTimeFlag, 'LinearStartTime already changed'); newLinearStartTime = _newLinearStartTime; newIncrement = _newIncrement; newLinearPrice = _newLinearPrice; capPrice = _capPrice; changeLinearStartTimeFlag = true; } modifier onlyAdmin() { require(_msgSender() == admin, 'caller is not the admin'); _; } function updateFromBSC(address user, UserDeposits[] calldata _userDeposits, bool[] calldata _boolean) public onlyAdmin { require(_userDeposits.length == _boolean.length, 'Length mismatch'); for (uint256 i; i < _userDeposits.length; i++) { userDeposits[user].push(_userDeposits[i]); newUser[user][userDeposits[user].length - 1] = _boolean[i]; } } function updateFromBSCMultiple(address[] calldata users, UserDeposits[][] calldata _userDeposits, bool[][] calldata _boolean) external onlyAdmin { for (uint256 i; i < users.length; i++) { updateFromBSC(users[i], _userDeposits[i], _boolean[i]); } } function editUserDeposit(address user, uint256 index, UserDeposits calldata _userDeposit) public onlyAdmin { require(index < userDeposits[user].length, 'Out of bounds'); userDeposits[user][index] = _userDeposit; } function editUserDeposits(address[] calldata users, uint256[] calldata index, UserDeposits[] calldata _userDeposits) external onlyAdmin { for (uint256 i; i < users.length; i++) { editUserDeposit(users[i], index[i], _userDeposits[i]); } } function setAdmin(address _admin) external { require(!setAdminFlag, 'admin already set'); admin = _admin; setAdminFlag = true; } function updateFromBSC(address[] calldata user, uint256[] calldata depositAmount, uint256[] calldata bonusAmounts, uint256[] calldata claimTimes, bool[] calldata newUsers) external onlyAdmin{ require(user.length == depositAmount.length && depositAmount.length == bonusAmounts.length && newUsers.length == bonusAmounts.length, 'Length mismatch'); for (uint256 i; i < user.length; i++) { address _user = user[i]; UserDeposits memory _userDeposit = UserDeposits(depositAmount[i], bonusAmounts[i], 0, 0, claimTimes[i]); userDeposits[_user].push(_userDeposit); newUser[_user][userDeposits[_user].length - 1] = newUsers[i]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
{ "optimizer": { "enabled": true, "runs": 200 }, "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":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimStartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MaxTokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"noOfTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MONTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDTInterface","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregatorInterface","outputs":[{"internalType":"contract Aggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToBlacklist","type":"address[]"}],"name":"blacklistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockup_months","type":"uint256"}],"name":"buyWithETHWert","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockup_months","type":"uint256"}],"name":"buyWithEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockup_months","type":"uint256"}],"name":"buyWithUSDT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"totalValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"}],"name":"changeClaimStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLinearStartTime","type":"uint256"},{"internalType":"uint256","name":"_newIncrement","type":"uint256"},{"internalType":"uint256","name":"_newLinearPrice","type":"uint256"},{"internalType":"uint256","name":"_capPrice","type":"uint256"}],"name":"changeLinearStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeLinearStartTimeFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensToBuy","type":"uint256"}],"name":"changeMaxTokensToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[1][2]","name":"_rounds","type":"uint256[1][2]"}],"name":"changeRoundsData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"changeSaleTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockup_months","type":"uint256"}],"name":"checkBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockup_months","type":"uint256"}],"name":"checkLockupBonus","outputs":[{"internalType":"uint256","name":"bonus","type":"uint256"},{"internalType":"uint256","name":"timeLockedFor","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"checkTokenQuantityBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"claimMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"default_lockup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"deposits","outputs":[{"components":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"bonusAmount","type":"uint256"},{"internalType":"uint256","name":"initialClaim","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"internalType":"struct PresaleV10.UserDeposits[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"bonusAmount","type":"uint256"},{"internalType":"uint256","name":"initialClaim","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"internalType":"struct PresaleV10.UserDeposits","name":"_userDeposit","type":"tuple"}],"name":"editUserDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"index","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"bonusAmount","type":"uint256"},{"internalType":"uint256","name":"initialClaim","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"internalType":"struct PresaleV10.UserDeposits[]","name":"_userDeposits","type":"tuple[]"}],"name":"editUserDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ethBuyHelper","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getClaimableAmount","outputs":[{"internalType":"uint256","name":"claimableAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialClaimPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linearPriceUsdRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linearStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockup_bonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newIncrement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newLinearPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newLinearStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"newUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromBlacklist","type":"address[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelistForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAdminFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setClaimWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"},{"internalType":"uint256","name":"noOfTokens","type":"uint256"},{"internalType":"address","name":"_saleToken","type":"address"}],"name":"startClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token_quantity_bonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"uint256[]","name":"depositAmount","type":"uint256[]"},{"internalType":"uint256[]","name":"bonusAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"claimTimes","type":"uint256[]"},{"internalType":"bool[]","name":"newUsers","type":"bool[]"}],"name":"updateFromBSC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"components":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"bonusAmount","type":"uint256"},{"internalType":"uint256","name":"initialClaim","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"internalType":"struct PresaleV10.UserDeposits[]","name":"_userDeposits","type":"tuple[]"},{"internalType":"bool[]","name":"_boolean","type":"bool[]"}],"name":"updateFromBSC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"components":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"bonusAmount","type":"uint256"},{"internalType":"uint256","name":"initialClaim","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"internalType":"struct PresaleV10.UserDeposits[][]","name":"_userDeposits","type":"tuple[][]"},{"internalType":"bool[][]","name":"_boolean","type":"bool[][]"}],"name":"updateFromBSCMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_increment","type":"uint256"}],"name":"updateIncrement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[][2]","name":"_tokenQuantity","type":"uint256[][2]"}],"name":"updateInvestmentBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"updateLinearStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[][]","name":"_lockup","type":"uint256[][]"}],"name":"updateLockUpBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"usdtBuyHelper","outputs":[{"internalType":"uint256","name":"usdPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"bonusAmount","type":"uint256"},{"internalType":"uint256","name":"initialClaim","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wertWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistClaimOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToWhitelist","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToWhitelist","type":"address[]"}],"name":"whitelistUsersForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50600054610100900460ff1615808015620000335750600054600160ff909116105b8062000063575062000050306200013d60201b620035a31760201c565b15801562000063575060005460ff166001145b620000cb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff191660011790558015620000ef576000805461ff0019166101001790555b801562000136576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b506200014c565b6001600160a01b03163b151590565b6147b7806200015c6000396000f3fe6080604052600436106104475760003560e01c80638d5268af11610234578063d5999a5c1161012e578063f2fde38b116100b6578063f9ac505b1161007a578063f9ac505b14610cd4578063fc1c085814610d0f578063fc7e286d14610d25578063fcade42814610d52578063fe575a8714610d6857600080fd5b8063f2fde38b14610c34578063f446374314610c54578063f577b1c214610c74578063f597573f14610c94578063f851a44014610cb457600080fd5b8063e985e367116100fd578063e985e36714610baa578063eb517e4d14610bca578063edec5f2714610beb578063eeb38ab414610c0b578063f04d688f14610c1e57600080fd5b8063d5999a5c14610b34578063dd113c3e14610b4a578063e651372514610b6a578063e6da921314610b8a57600080fd5b8063a129dc75116101bc578063b3743f6011610180578063b3743f6014610aa8578063bb3d676a14610ac8578063c49cc64514610ae8578063cbe8d1cf14610b08578063d09de08a14610b1e57600080fd5b8063a129dc7514610a12578063a6520d2014610a32578063a8dd07dc14610a52578063ae10426514610a68578063b2caaebd14610a8857600080fd5b80639051cce9116102035780639051cce91461097c57806399630d781461099c5780639cdde4f7146109bc5780639cfa0f7c146109dc5780639d47b704146109f257600080fd5b80638d5268af146108fb5780638da5cb5b1461091b5780638e15f4731461094d5780638ee8574b1461096257600080fd5b806353d9920711610345578063715018a6116102cd57806381255dcf1161029157806381255dcf1461087d5780638456cb591461089d57806387831159146108b257806389daf799146108c55780638b697e7d146108e557600080fd5b8063715018a6146107fc57806373f799391461081157806376c85f421461082757806378e979251461084757806379f1a16b1461085d57600080fd5b80635c975abb116103145780635c975abb1461075e5780635df4f3531461077657806363b20117146107a657806363e40879146107bc578063704b6c02146107dc57600080fd5b806353d99207146106e1578063548db174146106fb57806357f37d0c1461071b5780635bc34f711461074857600080fd5b80632320eaec116103d3578063379607f511610397578063379607f5146106315780633af32abf146106515780633f4ba83a1461068157806341cf19ba1461069657806347bd03c1146106ac57600080fd5b80632320eaec146105a5578063278c278b146105c557806329a5a0b6146105e55780633197cbb61461060557806333f761781461061b57600080fd5b80630dc9c8381161041a5780630dc9c8381461050b57806316b1b8bf1461052b57806318f479f81461054f5780631ddc60911461056f57806322203f341461058f57600080fd5b806303b9c5ad1461044c57806307f180821461046e57806308f43333146104a35780630a4bfb55146104eb575b600080fd5b34801561045857600080fd5b5061046c610467366004613bd3565b610d98565b005b34801561047a57600080fd5b5061048e610489366004613c14565b610e17565b60405190151581526020015b60405180910390f35b3480156104af57600080fd5b506104c36104be366004613c44565b610f53565b604080519586526020860194909452928401919091526060830152608082015260a00161049a565b3480156104f757600080fd5b5061046c610506366004613c6e565b610fa1565b34801561051757600080fd5b5061046c610526366004613d07565b61106c565b34801561053757600080fd5b5061054160e75481565b60405190815260200161049a565b34801561055b57600080fd5b5061046c61056a366004613c14565b61128e565b34801561057b57600080fd5b5061046c61058a366004613d37565b6112eb565b34801561059b57600080fd5b5061054160d85481565b3480156105b157600080fd5b5061046c6105c0366004613e72565b611306565b3480156105d157600080fd5b5061046c6105e0366004613c14565b611459565b3480156105f157600080fd5b50610541610600366004613c14565b6114fc565b34801561061157600080fd5b5061054160cc5481565b34801561062757600080fd5b5061054160cf5481565b34801561063d57600080fd5b5061048e61064c366004613c14565b611530565b34801561065d57600080fd5b5061048e61066c366004613f22565b60df6020526000908152604090205460ff1681565b34801561068d57600080fd5b5061046c6118ac565b3480156106a257600080fd5b5061054160da5481565b3480156106b857600080fd5b506106cc6106c7366004613d07565b6118be565b6040805192835260208301919091520161049a565b3480156106ed57600080fd5b5060e05461048e9060ff1681565b34801561070757600080fd5b5061046c610716366004613bd3565b61192d565b34801561072757600080fd5b50610541610736366004613c14565b60dc6020526000908152604090205481565b34801561075457600080fd5b5061054160d15481565b34801561076a57600080fd5b5060975460ff1661048e565b34801561078257600080fd5b5061048e610791366004613f22565b60e36020526000908152604090205460ff1681565b3480156107b257600080fd5b5061054160c95481565b3480156107c857600080fd5b506105416107d7366004613c14565b6119a7565b3480156107e857600080fd5b5061046c6107f7366004613f22565b6119c9565b34801561080857600080fd5b5061046c611a3e565b34801561081d57600080fd5b5061054160e25481565b34801561083357600080fd5b50610541610842366004613d07565b611a50565b34801561085357600080fd5b5061054160cb5481565b34801561086957600080fd5b50610541610878366004613c14565b611a84565b34801561088957600080fd5b5061046c610898366004613f3d565b611c28565b3480156108a957600080fd5b5061046c611ca4565b61048e6108c0366004613fd7565b611cb4565b3480156108d157600080fd5b5061046c6108e0366004613bd3565b611ed1565b3480156108f157600080fd5b5061054160e65481565b34801561090757600080fd5b5061046c61091636600461400a565b611f4b565b34801561092757600080fd5b506065546001600160a01b03165b6040516001600160a01b03909116815260200161049a565b34801561095957600080fd5b5061054161217a565b34801561096e57600080fd5b5060e55461048e9060ff1681565b34801561098857600080fd5b5061046c6109973660046140fa565b61221a565b3480156109a857600080fd5b506106cc6109b7366004613d07565b6122e2565b3480156109c857600080fd5b5061046c6109d7366004614172565b612307565b3480156109e857600080fd5b5061054160d05481565b3480156109fe57600080fd5b5061046c610a0d3660046141f9565b6123b7565b348015610a1e57600080fd5b5061046c610a2d366004614279565b61254d565b348015610a3e57600080fd5b5061046c610a4d3660046142ab565b6125c1565b348015610a5e57600080fd5b5061054160ca5481565b348015610a7457600080fd5b50610541610a83366004613c14565b6126bc565b348015610a9457600080fd5b5061048e610aa33660046142f3565b6128ce565b348015610ab457600080fd5b50610541610ac3366004613c44565b612b72565b348015610ad457600080fd5b5061046c610ae3366004613bd3565b612dfa565b348015610af457600080fd5b5060d354610935906001600160a01b031681565b348015610b1457600080fd5b5061054160e95481565b348015610b2a57600080fd5b5061054160e15481565b348015610b4057600080fd5b5061054160d95481565b348015610b5657600080fd5b5061046c610b65366004614328565b612e74565b348015610b7657600080fd5b5061048e610b85366004613d07565b612e89565b348015610b9657600080fd5b50610541610ba5366004613d07565b613164565b348015610bb657600080fd5b5060ce54610935906001600160a01b031681565b348015610bd657600080fd5b5060ea5461048e90600160a01b900460ff1681565b348015610bf757600080fd5b5061046c610c06366004613bd3565b61318c565b61048e610c19366004613d07565b613206565b348015610c2a57600080fd5b5061054160cd5481565b348015610c4057600080fd5b5061046c610c4f366004613f22565b6133b4565b348015610c6057600080fd5b5061046c610c6f366004613bd3565b61342d565b348015610c8057600080fd5b5061046c610c8f366004613c14565b6134a7565b348015610ca057600080fd5b5060d254610935906001600160a01b031681565b348015610cc057600080fd5b5060ea54610935906001600160a01b031681565b348015610ce057600080fd5b5061048e610cef366004613c44565b60e460209081526000928352604080842090915290825290205460ff1681565b348015610d1b57600080fd5b5061054160dd5481565b348015610d3157600080fd5b50610d45610d40366004613f22565b6134fc565b60405161049a91906143d0565b348015610d5e57600080fd5b5061054160e85481565b348015610d7457600080fd5b5061048e610d83366004613f22565b60de6020526000908152604090205460ff1681565b610da06135b2565b60005b81811015610e1257600160e36000858585818110610dc357610dc361443e565b9050602002016020810190610dd89190613f22565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610e0a8161446a565b915050610da3565b505050565b6000610e216135b2565b600060cd5411610e785760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b60cc548211610ebc5760405162461bcd60e51b815260206004820152601060248201526f53616c6520696e2070726f677265737360801b6044820152606401610e6f565b428211610f015760405162461bcd60e51b815260206004820152601360248201527210db185a5b481cdd185c9d081a5b881c185cdd606a1b6044820152606401610e6f565b60cd8054908390556040805182815260208101859052428183015290517f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a49181900360600190a160019150505b919050565b60db6020528160005260406000208181548110610f6f57600080fd5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b60ea546001600160a01b0316336001600160a01b031614610fd45760405162461bcd60e51b8152600401610e6f90614485565b60005b8581101561106357611051878783818110610ff457610ff461443e565b90506020020160208101906110099190613f22565b86868481811061101b5761101b61443e565b905060200281019061102d91906144bc565b86868681811061103f5761103f61443e565b9050602002810190610a0d9190614504565b8061105b8161446a565b915050610fd7565b50505050505050565b6110746135b2565b60008211806110835750600081115b6110c45760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401610e6f565b81156111a95760cb5442106111125760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610e6f565b8142106111555760405162461bcd60e51b815260206004820152601160248201527014d85b19481d1a5b59481a5b881c185cdd607a1b6044820152606401610e6f565b60cb8054908390556040805182815260208101859052428183015290516414d510549560da1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b801561128a5760cc5442106111f55760405162461bcd60e51b815260206004820152601260248201527114d85b1948185b1c9958591e48195b99195960721b6044820152606401610e6f565b60cb5481116112385760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420656e6454696d6560881b6044820152606401610e6f565b60cc8054908290556040805182815260208101849052428183015290516211539160ea1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b5050565b6112966135b2565b60dd54156112e65760405162461bcd60e51b815260206004820152601760248201527f4c696e6561722074696d6520616c7265616479207365740000000000000000006044820152606401610e6f565b60dd55565b6112f36135b2565b60e0805460ff1916911515919091179055565b61130e6135b2565b806001815181106113215761132161443e565b6020026020010151518160008151811061133d5761133d61443e565b602002602001015151146113a25760405162461bcd60e51b815260206004820152602660248201527f4d69736d61746368206c656e67746820666f7220746f6b656e206c6f636b757060448201526520626f6e757360d01b6064820152608401610e6f565b60005b816000815181106113b8576113b861443e565b60200260200101515181101561128a57816001815181106113db576113db61443e565b602002602001015181815181106113f4576113f461443e565b602002602001015160dc6000846000815181106114135761141361443e565b6020026020010151848151811061142c5761142c61443e565b602002602001015181526020019081526020016000208190555080806114519061446a565b9150506113a5565b6114616135b2565b600081116114b15760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610e6f565b60d08054908290556040805182815260208101849052428183015290517f76f9e5e1f6af6a9f180708b77a5c99210fbf19b91f1f194f3918c262b8edf77c9181900360600190a15050565b600080611508836126bc565b905061151261217a565b60cf5461151f908361454d565b611529919061456c565b9392505050565b600061153a61360c565b60ce546001600160a01b03166115895760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610e6f565b33600090815260de602052604090205460ff16156115e95760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610e6f565b60e05460ff16156116535733600090815260df602052604090205460ff166116535760405162461bcd60e51b815260206004820152601e60248201527f55736572206e6f742077686974656c697374656420666f7220636c61696d00006044820152606401610e6f565b600061165f3384612b72565b9050600081116116b15760405162461bcd60e51b815260206004820152601d60248201527f4e6f20636c61696d61626c6520746f6b656e7320617661696c61626c650000006044820152606401610e6f565b33600090815260e46020908152604080832086845290915290205460ff166117405760646116e082600a61454d565b6116ea919061456c565b6116f4908261458e565b33600090815260db602052604090208054859081106117155761171561443e565b9060005260206000209060050201600301600082825461173591906145a5565b9091555061178a9050565b33600090815260db602052604090208054829190859081106117645761176461443e565b9060005260206000209060050201600301600082825461178491906145a5565b90915550505b60ce546000906001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381600087803b1580156117e757600080fd5b505af11580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f91906145bd565b9050806118665760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610e6f565b60408051838152426020820152859133917fe49649ad7d04a14b0d2a43dae89f207c0822143ff6f88a6480e88907e4e5c548910160405180910390a35060019392505050565b6118b46135b2565b6118bc613652565b565b600081815260dc602052604081205481906118de57506000905080611926565b600083815260dc602052604090205460cf5461271091906118ff908761454d565b611909919061454d565b611913919061456c565b915060d95483611923919061454d565b90505b9250929050565b6119356135b2565b60005b81811015610e1257600060df60008585858181106119585761195861443e565b905060200201602081019061196d9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061199f8161446a565b915050611938565b60006119b2826126bc565b90506119c364e8d4a510008261456c565b92915050565b60ea54600160a01b900460ff1615611a175760405162461bcd60e51b815260206004820152601160248201527018591b5a5b88185b1c9958591e481cd95d607a1b6044820152606401610e6f565b60ea80546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611a466135b2565b6118bc60006136a4565b60d68260028110611a6057600080fd5b018181548110611a6f57600080fd5b90600052602060002001600091509150505481565b60008060cf54611a93846126bc565b611a9d919061456c565b905060d6600001600081548110611ab657611ab661443e565b9060005260206000200154811015611ad15750600092915050565b60d68054611ae19060019061458e565b81548110611af157611af161443e565b90600052602060002001548110611b4a5760d780546127109190611b179060019061458e565b81548110611b2757611b2761443e565b906000526020600020015460cf5485611b40919061454d565b61151f919061454d565b6000805b60d654811015611bf95760d6805482908110611b6c57611b6c61443e565b9060005260206000200154831015611bad5760d7611b8b60018361458e565b81548110611b9b57611b9b61443e565b90600052602060002001549150611bf9565b60d6805482908110611bc157611bc161443e565b9060005260206000200154831415611be75760d7805482908110611b9b57611b9b61443e565b80611bf18161446a565b915050611b4e565b506127108160cf5486611c0c919061454d565b611c16919061454d565b611c20919061456c565b949350505050565b611c306135b2565b60208101515181515114611c975760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206c656e67746820666f7220746f6b656e207175616e7469604482015267747920626f6e757360c01b6064820152608401610e6f565b61128a60d6826002613a22565b611cac6135b2565b6118bc6136f6565b60008260cb544210158015611ccb575060cc544211155b611ce75760405162461bcd60e51b8152600401610e6f906145da565b60008111611d075760405162461bcd60e51b8152600401610e6f90614611565b611d0f61360c565b60026001541415611d625760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e6f565b600260015533600090815260e3602052604090205460ff16611dc65760405162461bcd60e51b815260206004820181905260248201527f55736572206e6f742077686974656c697374656420666f7220746869732074786044820152606401610e6f565b6000611dd1856114fc565b90506000611dde866126bc565b905081341015611e1f5760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610e6f565b6000611e2b833461458e565b90506000611e3b8888858c613733565b9050611e58611e526065546001600160a01b031690565b85613903565b8115611e6857611e688983613903565b604080518281526020810186905290810184905242606082015260009089906001600160a01b038c16907f657d63cda61c052b36c80ba631550b0ad0351460aacb7620bd8003638959deb39060800160405180910390a450506001808055979650505050505050565b611ed96135b2565b60005b81811015610e1257600060de6000858585818110611efc57611efc61443e565b9050602002016020810190611f119190613f22565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611f438161446a565b915050611edc565b60ea546001600160a01b0316336001600160a01b031614611f7e5760405162461bcd60e51b8152600401610e6f90614485565b8887148015611f8c57508685145b8015611f9757508085145b611fd55760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610e6f565b60005b8981101561216d5760008b8b83818110611ff457611ff461443e565b90506020020160208101906120099190613f22565b905060006040518060a001604052808c8c8681811061202a5761202a61443e565b9050602002013581526020018a8a868181106120485761204861443e565b90506020020135815260200160008152602001600081526020018888868181106120745761207461443e565b602090810292909201359092526001600160a01b038516600090815260db8252604080822080546001818101835591845292849020865160059094020192835592850151928201929092559083015160028201556060830151600382015560808301516004909101555090508484848181106120f2576120f261443e565b90506020020160208101906121079190613d37565b6001600160a01b038316600090815260e46020908152604080832060db9092528220549091906121399060019061458e565b81526020810191909152604001600020805460ff1916911515919091179055508190506121658161446a565b915050611fd8565b5050505050505050505050565b60008060d360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156121cb57600080fd5b505afa1580156121df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122039190614658565b505050915050806402540be4006119c391906146a8565b61222261360c565b60008151116122645760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b6044820152606401610e6f565b60005b815181101561128a576122928282815181106122855761228561443e565b6020026020010151611530565b6122d05760405162461bcd60e51b815260206004820152600f60248201526e10db185a5b5a5b99c819985a5b1959608a1b6044820152606401610e6f565b806122da8161446a565b915050612267565b60008060006122f185856118be565b5090506122fd85611a84565b9590945092505050565b60ea546001600160a01b0316336001600160a01b03161461233a5760405162461bcd60e51b8152600401610e6f90614485565b60005b85811015611063576123a587878381811061235a5761235a61443e565b905060200201602081019061236f9190613f22565b8686848181106123815761238161443e565b9050602002013585858581811061239a5761239a61443e565b905060a002016125c1565b806123af8161446a565b91505061233d565b60ea546001600160a01b0316336001600160a01b0316146123ea5760405162461bcd60e51b8152600401610e6f90614485565b82811461242b5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610e6f565b60005b83811015612545576001600160a01b038616600090815260db602052604090208585838181106124605761246061443e565b83546001810185556000948552602090942060a0909102929092019260050290910190506124b9828281358155602082013560018201556040820135600282015560608201356003820155608082013560048201555050565b50508282828181106124cd576124cd61443e565b90506020020160208101906124e29190613d37565b6001600160a01b038716600090815260e46020908152604080832060db9092528220549091906125149060019061458e565b81526020810191909152604001600020805460ff19169115159190911790558061253d8161446a565b91505061242e565b505050505050565b60e55460ff16156125a05760405162461bcd60e51b815260206004820152601f60248201527f4c696e656172537461727454696d6520616c7265616479206368616e676564006044820152606401610e6f565b60e69390935560e89190915560e75560e95560e5805460ff19166001179055565b60ea546001600160a01b0316336001600160a01b0316146125f45760405162461bcd60e51b8152600401610e6f90614485565b6001600160a01b038316600090815260db6020526040902054821061264b5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f6620626f756e647360981b6044820152606401610e6f565b6001600160a01b038316600090815260db602052604090208054829190849081106126785761267861443e565b600091825260209182902083356005909202019081559082013560018201556040820135600282015560608201356003820155608082013560048201555050505050565b60008060d0548311156127115760405162461bcd60e51b815260206004820181905260248201527f416d6f756e742065786365656473206d617820746f6b656e7320746f206275796044820152606401610e6f565b60d15460d490600181106127275761272761443e565b015460c95461273690856145a5565b111561278c5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e20616d6f756e742e0000000000006044820152606401610e6f565b9150506119c3565b60dd54158061279d57504260dd5410155b156127cb5760d15460d590600181106127b8576127b861443e565b01546127c4908461454d565b90506119c3565b60e654158015906127dd575060e65442115b1561286757600062093a8060e654426127f6919061458e565b612800919061456c565b905060e95460e85482612813919061454d565b60e75461282091906145a5565b111561283b578360e954612834919061454d565b9150612861565b8360e8548261284a919061454d565b60e75461285791906145a5565b612784919061454d565b506119c3565b600061a8c060dd544261287a919061458e565b612884919061456c565b90506128916001826145a5565b90508360e154826128a2919061454d565b60d15460d590600181106128b8576128b861443e565b01546128c491906145a5565b611c20919061454d565b60006128d86135b2565b60cc54841180156128e857504284115b6129345760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636c61696d2073746172742074696d6500000000000000006044820152606401610e6f565b60ca5460cf5460c954612947919061454d565b61295191906145a5565b8310156129985760405162461bcd60e51b8152602060048201526015602482015274151bdad95b9cc81b195cdcc81d1a185b881cdbdb19605a1b6044820152606401610e6f565b6001600160a01b0382166129e35760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610e6f565b60cd5415612a275760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610e6f565b60cd84905560ce80546001600160a01b0319166001600160a01b0384169081179091556000906323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606401602060405180830381600087803b158015612aa157600080fd5b505af1158015612ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad991906145bd565b905080612b205760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610e6f565b60ce54604080518681524260208201526001600160a01b03909216917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a2506001949350505050565b60008060cd5411612bc55760405162461bcd60e51b815260206004820152601860248201527f436c61696d2073746172742074696d65206e6f742073657400000000000000006044820152606401610e6f565b6001600160a01b038316600090815260db60205260409020548210612c195760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a5908125960b21b6044820152606401610e6f565b6001600160a01b038316600090815260db60205260408120805484908110612c4357612c4361443e565b60009182526020918290206040805160a0810182526005909302909101805480845260018201549484018590526002820154928401929092526003810154606084015260040154608083015290925090612c9d81836145a5565b606084015190925082612ce55760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610e6f565b612cef818461458e565b612d005760009450505050506119c3565b60cd54421015612d175760009450505050506119c3565b836080015160cd54612d2991906145a5565b421015612d99576000846080015160cf5460cd5442612d48919061458e565b612d52919061454d565b612d5c919061456c565b604086015160cf549192509082612d73838861458e565b612d7d919061454d565b612d87919061456c565b612d9191906145a5565b955050612d9d565b8294505b612da7818661458e565b33600090815260e4602090815260408083208a845290915290205490955060ff16612df0576064612dd986600a61454d565b612de3919061456c565b612ded90866145a5565b94505b5050505092915050565b612e026135b2565b60005b81811015610e1257600160de6000858585818110612e2557612e2561443e565b9050602002016020810190612e3a9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612e6c8161446a565b915050612e05565b612e7c6135b2565b61128a60d4826002613a72565b60008260cb544210158015612ea0575060cc544211155b612ebc5760405162461bcd60e51b8152600401610e6f906145da565b60008111612edc5760405162461bcd60e51b8152600401610e6f90614611565b612ee461360c565b6000612eef856119a7565b90506000612efc866126bc565b90506000612f0c87878433613733565b60d2549091506000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b158015612f6957600080fd5b505afa158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa1919061472d565b905080841115612ffd5760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610e6f565b60d2546000906001600160a01b0316336065546001600160a01b03166040516001600160a01b039283166024820152911660448201526064810187905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516130729190614746565b6000604051808303816000865af19150503d80600081146130af576040519150601f19603f3d011682016040523d82523d6000602084013e6130b4565b606091505b50509050806130fc5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b881c185e5b595b9d0819985a5b195960621b6044820152606401610e6f565b60d254604080518581526020810188905280820187905242606082015290516001600160a01b03909216918b9133917f657d63cda61c052b36c80ba631550b0ad0351460aacb7620bd8003638959deb39181900360800190a450600198975050505050505050565b60d4826002811061317457600080fd5b01816001811061318357600080fd5b01549150829050565b6131946135b2565b60005b81811015610e1257600160df60008585858181106131b7576131b761443e565b90506020020160208101906131cc9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806131fe8161446a565b915050613197565b60008260cb54421015801561321d575060cc544211155b6132395760405162461bcd60e51b8152600401610e6f906145da565b600081116132595760405162461bcd60e51b8152600401610e6f90614611565b61326161360c565b600260015414156132b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e6f565b600260015560006132c4856114fc565b905060006132d1866126bc565b9050813410156133125760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610e6f565b600061331e833461458e565b9050600061332e88888533613733565b9050613345611e526065546001600160a01b031690565b8115613355576133553383613903565b604080518281526020810186905280820185905242606082015290516000918a9133917f657d63cda61c052b36c80ba631550b0ad0351460aacb7620bd8003638959deb3919081900360800190a4505060018080559695505050505050565b6133bc6135b2565b6001600160a01b0381166134215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6f565b61342a816136a4565b50565b6134356135b2565b60005b81811015610e1257600060e360008585858181106134585761345861443e565b905060200201602081019061346d9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061349f8161446a565b915050613438565b6134af6135b2565b60e154156134f75760405162461bcd60e51b81526020600482015260156024820152741a5b98dc995b595b9d08185b1c9958591e481cd95d605a1b6044820152606401610e6f565b60e155565b6001600160a01b038116600090815260db60209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561359857838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190613534565b505050509050919050565b6001600160a01b03163b151590565b6065546001600160a01b031633146118bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6f565b60975460ff16156118bc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610e6f565b61365a6139d9565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6136fe61360c565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136873390565b60008061373f86611a84565b905060008061374e88886118be565b915091508760c9600082825461376491906145a5565b909155505060d15460d4906001811061377f5761377f61443e565b015460c95411156137a357600160d1600082825461379d91906145a5565b90915550505b60006137af83856145a5565b90508660e260008282546137c391906145a5565b90915550506001600160a01b038616600090815260db602052604090819020815160a0810190925260cf5490919081906137fd908d61454d565b815260200183815260200161271060da548560cf548f61381d919061454d565b61382791906145a5565b613831919061454d565b61383b919061456c565b815260006020808301829052604092830187905284546001818101875595835281832085516005909202019081558482015181870155848401516002820155606085015160038201556080909401516004909401939093556001600160a01b038a16815260e4835281812060db909352908120546138ba90849061458e565b815260200190815260200160002060006101000a81548160ff0219169083151502179055508060ca60008282546138f191906145a5565b90915550909998505050505050505050565b804710156139415760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610e6f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461398e576040519150601f19603f3d011682016040523d82523d6000602084013e613993565b606091505b5050905080610e125760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610e6f565b60975460ff166118bc5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610e6f565b8260028101928215613a62579160200282015b82811115613a625782518051613a52918491602090910190613ab8565b5091602001919060010190613a35565b50613a6e929150613aff565b5090565b8260028101928215613aac579160200282015b82811115613aac578251613a9c9083906001613b1c565b5091602001919060010190613a85565b50613a6e929150613b49565b828054828255906000526020600020908101928215613af3579160200282015b82811115613af3578251825591602001919060010190613ad8565b50613a6e929150613b5d565b80821115613a6e576000613b138282613b71565b50600101613aff565b8260018101928215613af35791602002820182811115613af3578251825591602001919060010190613ad8565b80821115613a6e5760008155600101613b49565b80821115613a6e5760008155600101613b49565b508054600082559060005260206000209081019061342a9190613b5d565b60008083601f840112613ba157600080fd5b5081356001600160401b03811115613bb857600080fd5b6020830191508360208260051b850101111561192657600080fd5b60008060208385031215613be657600080fd5b82356001600160401b03811115613bfc57600080fd5b613c0885828601613b8f565b90969095509350505050565b600060208284031215613c2657600080fd5b5035919050565b80356001600160a01b0381168114610f4e57600080fd5b60008060408385031215613c5757600080fd5b613c6083613c2d565b946020939093013593505050565b60008060008060008060608789031215613c8757600080fd5b86356001600160401b0380821115613c9e57600080fd5b613caa8a838b01613b8f565b90985096506020890135915080821115613cc357600080fd5b613ccf8a838b01613b8f565b90965094506040890135915080821115613ce857600080fd5b50613cf589828a01613b8f565b979a9699509497509295939492505050565b60008060408385031215613d1a57600080fd5b50508035926020909101359150565b801515811461342a57600080fd5b600060208284031215613d4957600080fd5b813561152981613d29565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613d8c57613d8c613d54565b60405290565b604051602081016001600160401b0381118282101715613d8c57613d8c613d54565b604051601f8201601f191681016001600160401b0381118282101715613ddc57613ddc613d54565b604052919050565b60006001600160401b03821115613dfd57613dfd613d54565b5060051b60200190565b600082601f830112613e1857600080fd5b81356020613e2d613e2883613de4565b613db4565b82815260059290921b84018101918181019086841115613e4c57600080fd5b8286015b84811015613e675780358352918301918301613e50565b509695505050505050565b60006020808385031215613e8557600080fd5b82356001600160401b0380821115613e9c57600080fd5b818501915085601f830112613eb057600080fd5b8135613ebe613e2882613de4565b81815260059190911b83018401908481019088831115613edd57600080fd5b8585015b83811015613f1557803585811115613ef95760008081fd5b613f078b89838a0101613e07565b845250918601918601613ee1565b5098975050505050505050565b600060208284031215613f3457600080fd5b61152982613c2d565b60006020808385031215613f5057600080fd5b82356001600160401b0380821115613f6757600080fd5b818501915085601f830112613f7b57600080fd5b613f83613d6a565b806040840188811115613f9557600080fd5b845b81811015613fc957803585811115613faf5760008081fd5b613fbb8b828901613e07565b855250928601928601613f97565b509098975050505050505050565b600080600060608486031215613fec57600080fd5b613ff584613c2d565b95602085013595506040909401359392505050565b60008060008060008060008060008060a08b8d03121561402957600080fd5b8a356001600160401b038082111561404057600080fd5b61404c8e838f01613b8f565b909c509a5060208d013591508082111561406557600080fd5b6140718e838f01613b8f565b909a50985060408d013591508082111561408a57600080fd5b6140968e838f01613b8f565b909850965060608d01359150808211156140af57600080fd5b6140bb8e838f01613b8f565b909650945060808d01359150808211156140d457600080fd5b506140e18d828e01613b8f565b915080935050809150509295989b9194979a5092959850565b60006020828403121561410c57600080fd5b81356001600160401b0381111561412257600080fd5b611c2084828501613e07565b60008083601f84011261414057600080fd5b5081356001600160401b0381111561415757600080fd5b60208301915083602060a08302850101111561192657600080fd5b6000806000806000806060878903121561418b57600080fd5b86356001600160401b03808211156141a257600080fd5b6141ae8a838b01613b8f565b909850965060208901359150808211156141c757600080fd5b6141d38a838b01613b8f565b909650945060408901359150808211156141ec57600080fd5b50613cf589828a0161412e565b60008060008060006060868803121561421157600080fd5b61421a86613c2d565b945060208601356001600160401b038082111561423657600080fd5b61424289838a0161412e565b9096509450604088013591508082111561425b57600080fd5b5061426888828901613b8f565b969995985093965092949392505050565b6000806000806080858703121561428f57600080fd5b5050823594602084013594506040840135936060013592509050565b600080600083850360e08112156142c157600080fd5b6142ca85613c2d565b93506020850135925060a0603f19820112156142e557600080fd5b506040840190509250925092565b60008060006060848603121561430857600080fd5b833592506020840135915061431f60408501613c2d565b90509250925092565b60006040828403121561433a57600080fd5b601f838184011261434a57600080fd5b614352613d6a565b80604085018681111561436457600080fd5b855b818110156143c457878582011261437d5760008081fd5b614385613d92565b8060208084018b8111156143995760008081fd5b845b818110156143b2578035855293820193820161439b565b50509086529094019350602001614366565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156144315781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a090930192908501906001016143ed565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561447e5761447e614454565b5060010190565b60208082526017908201527f63616c6c6572206973206e6f74207468652061646d696e000000000000000000604082015260600190565b6000808335601e198436030181126144d357600080fd5b8301803591506001600160401b038211156144ed57600080fd5b602001915060a08102360382131561192657600080fd5b6000808335601e1984360301811261451b57600080fd5b8301803591506001600160401b0382111561453557600080fd5b6020019150600581901b360382131561192657600080fd5b600081600019048311821515161561456757614567614454565b500290565b60008261458957634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156145a0576145a0614454565b500390565b600082198211156145b8576145b8614454565b500190565b6000602082840312156145cf57600080fd5b815161152981613d29565b60208082526017908201527f496e76616c69642074696d6520666f7220627579696e67000000000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b805169ffffffffffffffffffff81168114610f4e57600080fd5b600080600080600060a0868803121561467057600080fd5b6146798661463e565b945060208601519350604086015192506060860151915061469c6080870161463e565b90509295509295909350565b60006001600160ff1b03818413828413808216868404861116156146ce576146ce614454565b600160ff1b60008712828116878305891216156146ed576146ed614454565b6000871292508782058712848416161561470957614709614454565b8785058712818416161561471f5761471f614454565b505050929093029392505050565b60006020828403121561473f57600080fd5b5051919050565b6000825160005b81811015614767576020818601810151858301520161474d565b81811115614776576000828501525b50919091019291505056fea2646970667358221220fc3f8706de8c37e81945647c9f5447c2c62b948c95ec10938c87dfbb6e6a67f864736f6c63430008090033
Deployed Bytecode
0x6080604052600436106104475760003560e01c80638d5268af11610234578063d5999a5c1161012e578063f2fde38b116100b6578063f9ac505b1161007a578063f9ac505b14610cd4578063fc1c085814610d0f578063fc7e286d14610d25578063fcade42814610d52578063fe575a8714610d6857600080fd5b8063f2fde38b14610c34578063f446374314610c54578063f577b1c214610c74578063f597573f14610c94578063f851a44014610cb457600080fd5b8063e985e367116100fd578063e985e36714610baa578063eb517e4d14610bca578063edec5f2714610beb578063eeb38ab414610c0b578063f04d688f14610c1e57600080fd5b8063d5999a5c14610b34578063dd113c3e14610b4a578063e651372514610b6a578063e6da921314610b8a57600080fd5b8063a129dc75116101bc578063b3743f6011610180578063b3743f6014610aa8578063bb3d676a14610ac8578063c49cc64514610ae8578063cbe8d1cf14610b08578063d09de08a14610b1e57600080fd5b8063a129dc7514610a12578063a6520d2014610a32578063a8dd07dc14610a52578063ae10426514610a68578063b2caaebd14610a8857600080fd5b80639051cce9116102035780639051cce91461097c57806399630d781461099c5780639cdde4f7146109bc5780639cfa0f7c146109dc5780639d47b704146109f257600080fd5b80638d5268af146108fb5780638da5cb5b1461091b5780638e15f4731461094d5780638ee8574b1461096257600080fd5b806353d9920711610345578063715018a6116102cd57806381255dcf1161029157806381255dcf1461087d5780638456cb591461089d57806387831159146108b257806389daf799146108c55780638b697e7d146108e557600080fd5b8063715018a6146107fc57806373f799391461081157806376c85f421461082757806378e979251461084757806379f1a16b1461085d57600080fd5b80635c975abb116103145780635c975abb1461075e5780635df4f3531461077657806363b20117146107a657806363e40879146107bc578063704b6c02146107dc57600080fd5b806353d99207146106e1578063548db174146106fb57806357f37d0c1461071b5780635bc34f711461074857600080fd5b80632320eaec116103d3578063379607f511610397578063379607f5146106315780633af32abf146106515780633f4ba83a1461068157806341cf19ba1461069657806347bd03c1146106ac57600080fd5b80632320eaec146105a5578063278c278b146105c557806329a5a0b6146105e55780633197cbb61461060557806333f761781461061b57600080fd5b80630dc9c8381161041a5780630dc9c8381461050b57806316b1b8bf1461052b57806318f479f81461054f5780631ddc60911461056f57806322203f341461058f57600080fd5b806303b9c5ad1461044c57806307f180821461046e57806308f43333146104a35780630a4bfb55146104eb575b600080fd5b34801561045857600080fd5b5061046c610467366004613bd3565b610d98565b005b34801561047a57600080fd5b5061048e610489366004613c14565b610e17565b60405190151581526020015b60405180910390f35b3480156104af57600080fd5b506104c36104be366004613c44565b610f53565b604080519586526020860194909452928401919091526060830152608082015260a00161049a565b3480156104f757600080fd5b5061046c610506366004613c6e565b610fa1565b34801561051757600080fd5b5061046c610526366004613d07565b61106c565b34801561053757600080fd5b5061054160e75481565b60405190815260200161049a565b34801561055b57600080fd5b5061046c61056a366004613c14565b61128e565b34801561057b57600080fd5b5061046c61058a366004613d37565b6112eb565b34801561059b57600080fd5b5061054160d85481565b3480156105b157600080fd5b5061046c6105c0366004613e72565b611306565b3480156105d157600080fd5b5061046c6105e0366004613c14565b611459565b3480156105f157600080fd5b50610541610600366004613c14565b6114fc565b34801561061157600080fd5b5061054160cc5481565b34801561062757600080fd5b5061054160cf5481565b34801561063d57600080fd5b5061048e61064c366004613c14565b611530565b34801561065d57600080fd5b5061048e61066c366004613f22565b60df6020526000908152604090205460ff1681565b34801561068d57600080fd5b5061046c6118ac565b3480156106a257600080fd5b5061054160da5481565b3480156106b857600080fd5b506106cc6106c7366004613d07565b6118be565b6040805192835260208301919091520161049a565b3480156106ed57600080fd5b5060e05461048e9060ff1681565b34801561070757600080fd5b5061046c610716366004613bd3565b61192d565b34801561072757600080fd5b50610541610736366004613c14565b60dc6020526000908152604090205481565b34801561075457600080fd5b5061054160d15481565b34801561076a57600080fd5b5060975460ff1661048e565b34801561078257600080fd5b5061048e610791366004613f22565b60e36020526000908152604090205460ff1681565b3480156107b257600080fd5b5061054160c95481565b3480156107c857600080fd5b506105416107d7366004613c14565b6119a7565b3480156107e857600080fd5b5061046c6107f7366004613f22565b6119c9565b34801561080857600080fd5b5061046c611a3e565b34801561081d57600080fd5b5061054160e25481565b34801561083357600080fd5b50610541610842366004613d07565b611a50565b34801561085357600080fd5b5061054160cb5481565b34801561086957600080fd5b50610541610878366004613c14565b611a84565b34801561088957600080fd5b5061046c610898366004613f3d565b611c28565b3480156108a957600080fd5b5061046c611ca4565b61048e6108c0366004613fd7565b611cb4565b3480156108d157600080fd5b5061046c6108e0366004613bd3565b611ed1565b3480156108f157600080fd5b5061054160e65481565b34801561090757600080fd5b5061046c61091636600461400a565b611f4b565b34801561092757600080fd5b506065546001600160a01b03165b6040516001600160a01b03909116815260200161049a565b34801561095957600080fd5b5061054161217a565b34801561096e57600080fd5b5060e55461048e9060ff1681565b34801561098857600080fd5b5061046c6109973660046140fa565b61221a565b3480156109a857600080fd5b506106cc6109b7366004613d07565b6122e2565b3480156109c857600080fd5b5061046c6109d7366004614172565b612307565b3480156109e857600080fd5b5061054160d05481565b3480156109fe57600080fd5b5061046c610a0d3660046141f9565b6123b7565b348015610a1e57600080fd5b5061046c610a2d366004614279565b61254d565b348015610a3e57600080fd5b5061046c610a4d3660046142ab565b6125c1565b348015610a5e57600080fd5b5061054160ca5481565b348015610a7457600080fd5b50610541610a83366004613c14565b6126bc565b348015610a9457600080fd5b5061048e610aa33660046142f3565b6128ce565b348015610ab457600080fd5b50610541610ac3366004613c44565b612b72565b348015610ad457600080fd5b5061046c610ae3366004613bd3565b612dfa565b348015610af457600080fd5b5060d354610935906001600160a01b031681565b348015610b1457600080fd5b5061054160e95481565b348015610b2a57600080fd5b5061054160e15481565b348015610b4057600080fd5b5061054160d95481565b348015610b5657600080fd5b5061046c610b65366004614328565b612e74565b348015610b7657600080fd5b5061048e610b85366004613d07565b612e89565b348015610b9657600080fd5b50610541610ba5366004613d07565b613164565b348015610bb657600080fd5b5060ce54610935906001600160a01b031681565b348015610bd657600080fd5b5060ea5461048e90600160a01b900460ff1681565b348015610bf757600080fd5b5061046c610c06366004613bd3565b61318c565b61048e610c19366004613d07565b613206565b348015610c2a57600080fd5b5061054160cd5481565b348015610c4057600080fd5b5061046c610c4f366004613f22565b6133b4565b348015610c6057600080fd5b5061046c610c6f366004613bd3565b61342d565b348015610c8057600080fd5b5061046c610c8f366004613c14565b6134a7565b348015610ca057600080fd5b5060d254610935906001600160a01b031681565b348015610cc057600080fd5b5060ea54610935906001600160a01b031681565b348015610ce057600080fd5b5061048e610cef366004613c44565b60e460209081526000928352604080842090915290825290205460ff1681565b348015610d1b57600080fd5b5061054160dd5481565b348015610d3157600080fd5b50610d45610d40366004613f22565b6134fc565b60405161049a91906143d0565b348015610d5e57600080fd5b5061054160e85481565b348015610d7457600080fd5b5061048e610d83366004613f22565b60de6020526000908152604090205460ff1681565b610da06135b2565b60005b81811015610e1257600160e36000858585818110610dc357610dc361443e565b9050602002016020810190610dd89190613f22565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610e0a8161446a565b915050610da3565b505050565b6000610e216135b2565b600060cd5411610e785760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b60cc548211610ebc5760405162461bcd60e51b815260206004820152601060248201526f53616c6520696e2070726f677265737360801b6044820152606401610e6f565b428211610f015760405162461bcd60e51b815260206004820152601360248201527210db185a5b481cdd185c9d081a5b881c185cdd606a1b6044820152606401610e6f565b60cd8054908390556040805182815260208101859052428183015290517f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a49181900360600190a160019150505b919050565b60db6020528160005260406000208181548110610f6f57600080fd5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b60ea546001600160a01b0316336001600160a01b031614610fd45760405162461bcd60e51b8152600401610e6f90614485565b60005b8581101561106357611051878783818110610ff457610ff461443e565b90506020020160208101906110099190613f22565b86868481811061101b5761101b61443e565b905060200281019061102d91906144bc565b86868681811061103f5761103f61443e565b9050602002810190610a0d9190614504565b8061105b8161446a565b915050610fd7565b50505050505050565b6110746135b2565b60008211806110835750600081115b6110c45760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401610e6f565b81156111a95760cb5442106111125760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610e6f565b8142106111555760405162461bcd60e51b815260206004820152601160248201527014d85b19481d1a5b59481a5b881c185cdd607a1b6044820152606401610e6f565b60cb8054908390556040805182815260208101859052428183015290516414d510549560da1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b801561128a5760cc5442106111f55760405162461bcd60e51b815260206004820152601260248201527114d85b1948185b1c9958591e48195b99195960721b6044820152606401610e6f565b60cb5481116112385760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420656e6454696d6560881b6044820152606401610e6f565b60cc8054908290556040805182815260208101849052428183015290516211539160ea1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b5050565b6112966135b2565b60dd54156112e65760405162461bcd60e51b815260206004820152601760248201527f4c696e6561722074696d6520616c7265616479207365740000000000000000006044820152606401610e6f565b60dd55565b6112f36135b2565b60e0805460ff1916911515919091179055565b61130e6135b2565b806001815181106113215761132161443e565b6020026020010151518160008151811061133d5761133d61443e565b602002602001015151146113a25760405162461bcd60e51b815260206004820152602660248201527f4d69736d61746368206c656e67746820666f7220746f6b656e206c6f636b757060448201526520626f6e757360d01b6064820152608401610e6f565b60005b816000815181106113b8576113b861443e565b60200260200101515181101561128a57816001815181106113db576113db61443e565b602002602001015181815181106113f4576113f461443e565b602002602001015160dc6000846000815181106114135761141361443e565b6020026020010151848151811061142c5761142c61443e565b602002602001015181526020019081526020016000208190555080806114519061446a565b9150506113a5565b6114616135b2565b600081116114b15760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610e6f565b60d08054908290556040805182815260208101849052428183015290517f76f9e5e1f6af6a9f180708b77a5c99210fbf19b91f1f194f3918c262b8edf77c9181900360600190a15050565b600080611508836126bc565b905061151261217a565b60cf5461151f908361454d565b611529919061456c565b9392505050565b600061153a61360c565b60ce546001600160a01b03166115895760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610e6f565b33600090815260de602052604090205460ff16156115e95760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610e6f565b60e05460ff16156116535733600090815260df602052604090205460ff166116535760405162461bcd60e51b815260206004820152601e60248201527f55736572206e6f742077686974656c697374656420666f7220636c61696d00006044820152606401610e6f565b600061165f3384612b72565b9050600081116116b15760405162461bcd60e51b815260206004820152601d60248201527f4e6f20636c61696d61626c6520746f6b656e7320617661696c61626c650000006044820152606401610e6f565b33600090815260e46020908152604080832086845290915290205460ff166117405760646116e082600a61454d565b6116ea919061456c565b6116f4908261458e565b33600090815260db602052604090208054859081106117155761171561443e565b9060005260206000209060050201600301600082825461173591906145a5565b9091555061178a9050565b33600090815260db602052604090208054829190859081106117645761176461443e565b9060005260206000209060050201600301600082825461178491906145a5565b90915550505b60ce546000906001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381600087803b1580156117e757600080fd5b505af11580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f91906145bd565b9050806118665760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610e6f565b60408051838152426020820152859133917fe49649ad7d04a14b0d2a43dae89f207c0822143ff6f88a6480e88907e4e5c548910160405180910390a35060019392505050565b6118b46135b2565b6118bc613652565b565b600081815260dc602052604081205481906118de57506000905080611926565b600083815260dc602052604090205460cf5461271091906118ff908761454d565b611909919061454d565b611913919061456c565b915060d95483611923919061454d565b90505b9250929050565b6119356135b2565b60005b81811015610e1257600060df60008585858181106119585761195861443e565b905060200201602081019061196d9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061199f8161446a565b915050611938565b60006119b2826126bc565b90506119c364e8d4a510008261456c565b92915050565b60ea54600160a01b900460ff1615611a175760405162461bcd60e51b815260206004820152601160248201527018591b5a5b88185b1c9958591e481cd95d607a1b6044820152606401610e6f565b60ea80546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611a466135b2565b6118bc60006136a4565b60d68260028110611a6057600080fd5b018181548110611a6f57600080fd5b90600052602060002001600091509150505481565b60008060cf54611a93846126bc565b611a9d919061456c565b905060d6600001600081548110611ab657611ab661443e565b9060005260206000200154811015611ad15750600092915050565b60d68054611ae19060019061458e565b81548110611af157611af161443e565b90600052602060002001548110611b4a5760d780546127109190611b179060019061458e565b81548110611b2757611b2761443e565b906000526020600020015460cf5485611b40919061454d565b61151f919061454d565b6000805b60d654811015611bf95760d6805482908110611b6c57611b6c61443e565b9060005260206000200154831015611bad5760d7611b8b60018361458e565b81548110611b9b57611b9b61443e565b90600052602060002001549150611bf9565b60d6805482908110611bc157611bc161443e565b9060005260206000200154831415611be75760d7805482908110611b9b57611b9b61443e565b80611bf18161446a565b915050611b4e565b506127108160cf5486611c0c919061454d565b611c16919061454d565b611c20919061456c565b949350505050565b611c306135b2565b60208101515181515114611c975760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206c656e67746820666f7220746f6b656e207175616e7469604482015267747920626f6e757360c01b6064820152608401610e6f565b61128a60d6826002613a22565b611cac6135b2565b6118bc6136f6565b60008260cb544210158015611ccb575060cc544211155b611ce75760405162461bcd60e51b8152600401610e6f906145da565b60008111611d075760405162461bcd60e51b8152600401610e6f90614611565b611d0f61360c565b60026001541415611d625760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e6f565b600260015533600090815260e3602052604090205460ff16611dc65760405162461bcd60e51b815260206004820181905260248201527f55736572206e6f742077686974656c697374656420666f7220746869732074786044820152606401610e6f565b6000611dd1856114fc565b90506000611dde866126bc565b905081341015611e1f5760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610e6f565b6000611e2b833461458e565b90506000611e3b8888858c613733565b9050611e58611e526065546001600160a01b031690565b85613903565b8115611e6857611e688983613903565b604080518281526020810186905290810184905242606082015260009089906001600160a01b038c16907f657d63cda61c052b36c80ba631550b0ad0351460aacb7620bd8003638959deb39060800160405180910390a450506001808055979650505050505050565b611ed96135b2565b60005b81811015610e1257600060de6000858585818110611efc57611efc61443e565b9050602002016020810190611f119190613f22565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611f438161446a565b915050611edc565b60ea546001600160a01b0316336001600160a01b031614611f7e5760405162461bcd60e51b8152600401610e6f90614485565b8887148015611f8c57508685145b8015611f9757508085145b611fd55760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610e6f565b60005b8981101561216d5760008b8b83818110611ff457611ff461443e565b90506020020160208101906120099190613f22565b905060006040518060a001604052808c8c8681811061202a5761202a61443e565b9050602002013581526020018a8a868181106120485761204861443e565b90506020020135815260200160008152602001600081526020018888868181106120745761207461443e565b602090810292909201359092526001600160a01b038516600090815260db8252604080822080546001818101835591845292849020865160059094020192835592850151928201929092559083015160028201556060830151600382015560808301516004909101555090508484848181106120f2576120f261443e565b90506020020160208101906121079190613d37565b6001600160a01b038316600090815260e46020908152604080832060db9092528220549091906121399060019061458e565b81526020810191909152604001600020805460ff1916911515919091179055508190506121658161446a565b915050611fd8565b5050505050505050505050565b60008060d360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156121cb57600080fd5b505afa1580156121df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122039190614658565b505050915050806402540be4006119c391906146a8565b61222261360c565b60008151116122645760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b6044820152606401610e6f565b60005b815181101561128a576122928282815181106122855761228561443e565b6020026020010151611530565b6122d05760405162461bcd60e51b815260206004820152600f60248201526e10db185a5b5a5b99c819985a5b1959608a1b6044820152606401610e6f565b806122da8161446a565b915050612267565b60008060006122f185856118be565b5090506122fd85611a84565b9590945092505050565b60ea546001600160a01b0316336001600160a01b03161461233a5760405162461bcd60e51b8152600401610e6f90614485565b60005b85811015611063576123a587878381811061235a5761235a61443e565b905060200201602081019061236f9190613f22565b8686848181106123815761238161443e565b9050602002013585858581811061239a5761239a61443e565b905060a002016125c1565b806123af8161446a565b91505061233d565b60ea546001600160a01b0316336001600160a01b0316146123ea5760405162461bcd60e51b8152600401610e6f90614485565b82811461242b5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610e6f565b60005b83811015612545576001600160a01b038616600090815260db602052604090208585838181106124605761246061443e565b83546001810185556000948552602090942060a0909102929092019260050290910190506124b9828281358155602082013560018201556040820135600282015560608201356003820155608082013560048201555050565b50508282828181106124cd576124cd61443e565b90506020020160208101906124e29190613d37565b6001600160a01b038716600090815260e46020908152604080832060db9092528220549091906125149060019061458e565b81526020810191909152604001600020805460ff19169115159190911790558061253d8161446a565b91505061242e565b505050505050565b60e55460ff16156125a05760405162461bcd60e51b815260206004820152601f60248201527f4c696e656172537461727454696d6520616c7265616479206368616e676564006044820152606401610e6f565b60e69390935560e89190915560e75560e95560e5805460ff19166001179055565b60ea546001600160a01b0316336001600160a01b0316146125f45760405162461bcd60e51b8152600401610e6f90614485565b6001600160a01b038316600090815260db6020526040902054821061264b5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f6620626f756e647360981b6044820152606401610e6f565b6001600160a01b038316600090815260db602052604090208054829190849081106126785761267861443e565b600091825260209182902083356005909202019081559082013560018201556040820135600282015560608201356003820155608082013560048201555050505050565b60008060d0548311156127115760405162461bcd60e51b815260206004820181905260248201527f416d6f756e742065786365656473206d617820746f6b656e7320746f206275796044820152606401610e6f565b60d15460d490600181106127275761272761443e565b015460c95461273690856145a5565b111561278c5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e20616d6f756e742e0000000000006044820152606401610e6f565b9150506119c3565b60dd54158061279d57504260dd5410155b156127cb5760d15460d590600181106127b8576127b861443e565b01546127c4908461454d565b90506119c3565b60e654158015906127dd575060e65442115b1561286757600062093a8060e654426127f6919061458e565b612800919061456c565b905060e95460e85482612813919061454d565b60e75461282091906145a5565b111561283b578360e954612834919061454d565b9150612861565b8360e8548261284a919061454d565b60e75461285791906145a5565b612784919061454d565b506119c3565b600061a8c060dd544261287a919061458e565b612884919061456c565b90506128916001826145a5565b90508360e154826128a2919061454d565b60d15460d590600181106128b8576128b861443e565b01546128c491906145a5565b611c20919061454d565b60006128d86135b2565b60cc54841180156128e857504284115b6129345760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636c61696d2073746172742074696d6500000000000000006044820152606401610e6f565b60ca5460cf5460c954612947919061454d565b61295191906145a5565b8310156129985760405162461bcd60e51b8152602060048201526015602482015274151bdad95b9cc81b195cdcc81d1a185b881cdbdb19605a1b6044820152606401610e6f565b6001600160a01b0382166129e35760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610e6f565b60cd5415612a275760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610e6f565b60cd84905560ce80546001600160a01b0319166001600160a01b0384169081179091556000906323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606401602060405180830381600087803b158015612aa157600080fd5b505af1158015612ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad991906145bd565b905080612b205760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610e6f565b60ce54604080518681524260208201526001600160a01b03909216917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a2506001949350505050565b60008060cd5411612bc55760405162461bcd60e51b815260206004820152601860248201527f436c61696d2073746172742074696d65206e6f742073657400000000000000006044820152606401610e6f565b6001600160a01b038316600090815260db60205260409020548210612c195760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a5908125960b21b6044820152606401610e6f565b6001600160a01b038316600090815260db60205260408120805484908110612c4357612c4361443e565b60009182526020918290206040805160a0810182526005909302909101805480845260018201549484018590526002820154928401929092526003810154606084015260040154608083015290925090612c9d81836145a5565b606084015190925082612ce55760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610e6f565b612cef818461458e565b612d005760009450505050506119c3565b60cd54421015612d175760009450505050506119c3565b836080015160cd54612d2991906145a5565b421015612d99576000846080015160cf5460cd5442612d48919061458e565b612d52919061454d565b612d5c919061456c565b604086015160cf549192509082612d73838861458e565b612d7d919061454d565b612d87919061456c565b612d9191906145a5565b955050612d9d565b8294505b612da7818661458e565b33600090815260e4602090815260408083208a845290915290205490955060ff16612df0576064612dd986600a61454d565b612de3919061456c565b612ded90866145a5565b94505b5050505092915050565b612e026135b2565b60005b81811015610e1257600160de6000858585818110612e2557612e2561443e565b9050602002016020810190612e3a9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612e6c8161446a565b915050612e05565b612e7c6135b2565b61128a60d4826002613a72565b60008260cb544210158015612ea0575060cc544211155b612ebc5760405162461bcd60e51b8152600401610e6f906145da565b60008111612edc5760405162461bcd60e51b8152600401610e6f90614611565b612ee461360c565b6000612eef856119a7565b90506000612efc866126bc565b90506000612f0c87878433613733565b60d2549091506000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b158015612f6957600080fd5b505afa158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa1919061472d565b905080841115612ffd5760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610e6f565b60d2546000906001600160a01b0316336065546001600160a01b03166040516001600160a01b039283166024820152911660448201526064810187905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516130729190614746565b6000604051808303816000865af19150503d80600081146130af576040519150601f19603f3d011682016040523d82523d6000602084013e6130b4565b606091505b50509050806130fc5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b881c185e5b595b9d0819985a5b195960621b6044820152606401610e6f565b60d254604080518581526020810188905280820187905242606082015290516001600160a01b03909216918b9133917f657d63cda61c052b36c80ba631550b0ad0351460aacb7620bd8003638959deb39181900360800190a450600198975050505050505050565b60d4826002811061317457600080fd5b01816001811061318357600080fd5b01549150829050565b6131946135b2565b60005b81811015610e1257600160df60008585858181106131b7576131b761443e565b90506020020160208101906131cc9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806131fe8161446a565b915050613197565b60008260cb54421015801561321d575060cc544211155b6132395760405162461bcd60e51b8152600401610e6f906145da565b600081116132595760405162461bcd60e51b8152600401610e6f90614611565b61326161360c565b600260015414156132b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e6f565b600260015560006132c4856114fc565b905060006132d1866126bc565b9050813410156133125760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610e6f565b600061331e833461458e565b9050600061332e88888533613733565b9050613345611e526065546001600160a01b031690565b8115613355576133553383613903565b604080518281526020810186905280820185905242606082015290516000918a9133917f657d63cda61c052b36c80ba631550b0ad0351460aacb7620bd8003638959deb3919081900360800190a4505060018080559695505050505050565b6133bc6135b2565b6001600160a01b0381166134215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6f565b61342a816136a4565b50565b6134356135b2565b60005b81811015610e1257600060e360008585858181106134585761345861443e565b905060200201602081019061346d9190613f22565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061349f8161446a565b915050613438565b6134af6135b2565b60e154156134f75760405162461bcd60e51b81526020600482015260156024820152741a5b98dc995b595b9d08185b1c9958591e481cd95d605a1b6044820152606401610e6f565b60e155565b6001600160a01b038116600090815260db60209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561359857838290600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505081526020019060010190613534565b505050509050919050565b6001600160a01b03163b151590565b6065546001600160a01b031633146118bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6f565b60975460ff16156118bc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610e6f565b61365a6139d9565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6136fe61360c565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136873390565b60008061373f86611a84565b905060008061374e88886118be565b915091508760c9600082825461376491906145a5565b909155505060d15460d4906001811061377f5761377f61443e565b015460c95411156137a357600160d1600082825461379d91906145a5565b90915550505b60006137af83856145a5565b90508660e260008282546137c391906145a5565b90915550506001600160a01b038616600090815260db602052604090819020815160a0810190925260cf5490919081906137fd908d61454d565b815260200183815260200161271060da548560cf548f61381d919061454d565b61382791906145a5565b613831919061454d565b61383b919061456c565b815260006020808301829052604092830187905284546001818101875595835281832085516005909202019081558482015181870155848401516002820155606085015160038201556080909401516004909401939093556001600160a01b038a16815260e4835281812060db909352908120546138ba90849061458e565b815260200190815260200160002060006101000a81548160ff0219169083151502179055508060ca60008282546138f191906145a5565b90915550909998505050505050505050565b804710156139415760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610e6f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461398e576040519150601f19603f3d011682016040523d82523d6000602084013e613993565b606091505b5050905080610e125760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610e6f565b60975460ff166118bc5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610e6f565b8260028101928215613a62579160200282015b82811115613a625782518051613a52918491602090910190613ab8565b5091602001919060010190613a35565b50613a6e929150613aff565b5090565b8260028101928215613aac579160200282015b82811115613aac578251613a9c9083906001613b1c565b5091602001919060010190613a85565b50613a6e929150613b49565b828054828255906000526020600020908101928215613af3579160200282015b82811115613af3578251825591602001919060010190613ad8565b50613a6e929150613b5d565b80821115613a6e576000613b138282613b71565b50600101613aff565b8260018101928215613af35791602002820182811115613af3578251825591602001919060010190613ad8565b80821115613a6e5760008155600101613b49565b80821115613a6e5760008155600101613b49565b508054600082559060005260206000209081019061342a9190613b5d565b60008083601f840112613ba157600080fd5b5081356001600160401b03811115613bb857600080fd5b6020830191508360208260051b850101111561192657600080fd5b60008060208385031215613be657600080fd5b82356001600160401b03811115613bfc57600080fd5b613c0885828601613b8f565b90969095509350505050565b600060208284031215613c2657600080fd5b5035919050565b80356001600160a01b0381168114610f4e57600080fd5b60008060408385031215613c5757600080fd5b613c6083613c2d565b946020939093013593505050565b60008060008060008060608789031215613c8757600080fd5b86356001600160401b0380821115613c9e57600080fd5b613caa8a838b01613b8f565b90985096506020890135915080821115613cc357600080fd5b613ccf8a838b01613b8f565b90965094506040890135915080821115613ce857600080fd5b50613cf589828a01613b8f565b979a9699509497509295939492505050565b60008060408385031215613d1a57600080fd5b50508035926020909101359150565b801515811461342a57600080fd5b600060208284031215613d4957600080fd5b813561152981613d29565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613d8c57613d8c613d54565b60405290565b604051602081016001600160401b0381118282101715613d8c57613d8c613d54565b604051601f8201601f191681016001600160401b0381118282101715613ddc57613ddc613d54565b604052919050565b60006001600160401b03821115613dfd57613dfd613d54565b5060051b60200190565b600082601f830112613e1857600080fd5b81356020613e2d613e2883613de4565b613db4565b82815260059290921b84018101918181019086841115613e4c57600080fd5b8286015b84811015613e675780358352918301918301613e50565b509695505050505050565b60006020808385031215613e8557600080fd5b82356001600160401b0380821115613e9c57600080fd5b818501915085601f830112613eb057600080fd5b8135613ebe613e2882613de4565b81815260059190911b83018401908481019088831115613edd57600080fd5b8585015b83811015613f1557803585811115613ef95760008081fd5b613f078b89838a0101613e07565b845250918601918601613ee1565b5098975050505050505050565b600060208284031215613f3457600080fd5b61152982613c2d565b60006020808385031215613f5057600080fd5b82356001600160401b0380821115613f6757600080fd5b818501915085601f830112613f7b57600080fd5b613f83613d6a565b806040840188811115613f9557600080fd5b845b81811015613fc957803585811115613faf5760008081fd5b613fbb8b828901613e07565b855250928601928601613f97565b509098975050505050505050565b600080600060608486031215613fec57600080fd5b613ff584613c2d565b95602085013595506040909401359392505050565b60008060008060008060008060008060a08b8d03121561402957600080fd5b8a356001600160401b038082111561404057600080fd5b61404c8e838f01613b8f565b909c509a5060208d013591508082111561406557600080fd5b6140718e838f01613b8f565b909a50985060408d013591508082111561408a57600080fd5b6140968e838f01613b8f565b909850965060608d01359150808211156140af57600080fd5b6140bb8e838f01613b8f565b909650945060808d01359150808211156140d457600080fd5b506140e18d828e01613b8f565b915080935050809150509295989b9194979a5092959850565b60006020828403121561410c57600080fd5b81356001600160401b0381111561412257600080fd5b611c2084828501613e07565b60008083601f84011261414057600080fd5b5081356001600160401b0381111561415757600080fd5b60208301915083602060a08302850101111561192657600080fd5b6000806000806000806060878903121561418b57600080fd5b86356001600160401b03808211156141a257600080fd5b6141ae8a838b01613b8f565b909850965060208901359150808211156141c757600080fd5b6141d38a838b01613b8f565b909650945060408901359150808211156141ec57600080fd5b50613cf589828a0161412e565b60008060008060006060868803121561421157600080fd5b61421a86613c2d565b945060208601356001600160401b038082111561423657600080fd5b61424289838a0161412e565b9096509450604088013591508082111561425b57600080fd5b5061426888828901613b8f565b969995985093965092949392505050565b6000806000806080858703121561428f57600080fd5b5050823594602084013594506040840135936060013592509050565b600080600083850360e08112156142c157600080fd5b6142ca85613c2d565b93506020850135925060a0603f19820112156142e557600080fd5b506040840190509250925092565b60008060006060848603121561430857600080fd5b833592506020840135915061431f60408501613c2d565b90509250925092565b60006040828403121561433a57600080fd5b601f838184011261434a57600080fd5b614352613d6a565b80604085018681111561436457600080fd5b855b818110156143c457878582011261437d5760008081fd5b614385613d92565b8060208084018b8111156143995760008081fd5b845b818110156143b2578035855293820193820161439b565b50509086529094019350602001614366565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156144315781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a090930192908501906001016143ed565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561447e5761447e614454565b5060010190565b60208082526017908201527f63616c6c6572206973206e6f74207468652061646d696e000000000000000000604082015260600190565b6000808335601e198436030181126144d357600080fd5b8301803591506001600160401b038211156144ed57600080fd5b602001915060a08102360382131561192657600080fd5b6000808335601e1984360301811261451b57600080fd5b8301803591506001600160401b0382111561453557600080fd5b6020019150600581901b360382131561192657600080fd5b600081600019048311821515161561456757614567614454565b500290565b60008261458957634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156145a0576145a0614454565b500390565b600082198211156145b8576145b8614454565b500190565b6000602082840312156145cf57600080fd5b815161152981613d29565b60208082526017908201527f496e76616c69642074696d6520666f7220627579696e67000000000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b805169ffffffffffffffffffff81168114610f4e57600080fd5b600080600080600060a0868803121561467057600080fd5b6146798661463e565b945060208601519350604086015192506060860151915061469c6080870161463e565b90509295509295909350565b60006001600160ff1b03818413828413808216868404861116156146ce576146ce614454565b600160ff1b60008712828116878305891216156146ed576146ed614454565b6000871292508782058712848416161561470957614709614454565b8785058712818416161561471f5761471f614454565b505050929093029392505050565b60006020828403121561473f57600080fd5b5051919050565b6000825160005b81811015614767576020818601810151858301520161474d565b81811115614776576000828501525b50919091019291505056fea2646970667358221220fc3f8706de8c37e81945647c9f5447c2c62b948c95ec10938c87dfbb6e6a67f864736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.