More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 10,058 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy With Eth | 20145286 | 184 days ago | IN | 0.00000822 ETH | 0.00005245 | ||||
Transfer | 17994416 | 486 days ago | IN | 0.092 ETH | 0.00044646 | ||||
Buy With Eth | 17346875 | 577 days ago | IN | 0.00084343 ETH | 0.00056591 | ||||
Buy With Eth | 17346875 | 577 days ago | IN | 0.00141215 ETH | 0.00056728 | ||||
Buy With Eth | 17346801 | 577 days ago | IN | 0.00141215 ETH | 0.00057218 | ||||
Buy With USDT | 17000616 | 626 days ago | IN | 0 ETH | 0.00047289 | ||||
Transfer | 16992243 | 627 days ago | IN | 0.01164556 ETH | 0.00045416 | ||||
Transfer | 16912378 | 638 days ago | IN | 0 ETH | 0.00051363 | ||||
Transfer | 16736317 | 663 days ago | IN | 0.01 ETH | 0.0006666 | ||||
Transfer | 16736269 | 663 days ago | IN | 0 ETH | 0.00064133 | ||||
Buy With Eth | 16654321 | 674 days ago | IN | 0.00199833 ETH | 0.0005752 | ||||
Transfer | 16652242 | 675 days ago | IN | 0.0473567 ETH | 0.00054881 | ||||
Buy With Eth | 16606713 | 681 days ago | IN | 0.00441894 ETH | 0.00052209 | ||||
Transfer | 16579785 | 685 days ago | IN | 0.00165619 ETH | 0.00097088 | ||||
Buy With Eth | 16545745 | 689 days ago | IN | 0.00424766 ETH | 0.00068392 | ||||
Buy With Eth | 16529350 | 692 days ago | IN | 0.03824813 ETH | 0.00126139 | ||||
Buy With Eth | 16527982 | 692 days ago | IN | 0.05129654 ETH | 0.00093819 | ||||
Buy With USDT | 16523181 | 693 days ago | IN | 0 ETH | 0.00044942 | ||||
Buy With USDT | 16523179 | 693 days ago | IN | 0 ETH | 0.00048407 | ||||
Buy With USDT | 16523167 | 693 days ago | IN | 0 ETH | 0.00046548 | ||||
Buy With USDT | 16523151 | 693 days ago | IN | 0 ETH | 0.00050692 | ||||
Buy With USDT | 16523058 | 693 days ago | IN | 0 ETH | 0.00046479 | ||||
Buy With USDT | 16523039 | 693 days ago | IN | 0 ETH | 0.00047665 | ||||
Buy With USDT | 16522988 | 693 days ago | IN | 0 ETH | 0.00043868 | ||||
Buy With Eth | 16522351 | 693 days ago | IN | 0.00841187 ETH | 0.00048258 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16522227 | 693 days ago | 0.87034496 ETH | ||||
16522227 | 693 days ago | 0.00686178 ETH | ||||
16522227 | 693 days ago | 0.02317345 ETH | ||||
16522225 | 693 days ago | 0.10299975 ETH | ||||
16522217 | 693 days ago | 0.0849987 ETH | ||||
16522217 | 693 days ago | 0.00042059 ETH | ||||
16522212 | 693 days ago | 0.21249676 ETH | ||||
16522204 | 693 days ago | 0.04683011 ETH | ||||
16522199 | 693 days ago | 0.42499352 ETH | ||||
16522195 | 693 days ago | 0.00764948 ETH | ||||
16522195 | 693 days ago | 0.06799764 ETH | ||||
16522193 | 693 days ago | 0.02974363 ETH | ||||
16522190 | 693 days ago | 0.00254982 ETH | ||||
16522186 | 693 days ago | 0.1954957 ETH | ||||
16522185 | 693 days ago | 0.21249676 ETH | ||||
16522182 | 693 days ago | 0.01971517 ETH | ||||
16522182 | 693 days ago | 0.07188811 ETH | ||||
16522175 | 693 days ago | 0.31449652 ETH | ||||
16522173 | 693 days ago | 1.28349752 ETH | ||||
16522170 | 693 days ago | 0.3144768 ETH | ||||
16522166 | 693 days ago | 0.04249278 ETH | ||||
16522164 | 693 days ago | 0.16911499 ETH | ||||
16522161 | 693 days ago | 0.00760399 ETH | ||||
16522153 | 693 days ago | 0.04079445 ETH | ||||
16522152 | 693 days ago | 0.03399647 ETH |
Loading...
Loading
Contract Name:
Presale
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity 0.8.17; 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 Presale is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable, PausableUpgradeable { uint256 public totalTokensSold = 0; uint256 public currentStep = 0; uint256 public startTime; uint256 public endTime; uint256 public claimStart; address public constant saleToken = 0xed328E9C1179a30ddC1E7595E036AEd8760C22aF; uint256 public baseDecimals; IERC20Upgradeable public USDTInterface; Aggregator public aggregatorInterface; // https://docs.chain.link/docs/ethereum-addresses/ => (ETH / USD) uint256[8] public token_amount; uint256[8] public token_price; mapping(address => uint256) public userDeposits; mapping(address => bool) public hasClaimed; 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 amountPaid, uint256 timestamp ); event TokensAdded( address indexed token, uint256 noOfTokens, uint256 timestamp ); event TokensClaimed( address indexed user, uint256 amount, uint256 timestamp ); event ClaimStartUpdated( uint256 prevValue, uint256 newValue, uint256 timestamp ); /// @custom:oz-upgrades-unsafe-allow constructor /** * @dev Initializes the contract and sets key parameters * @param _oracle Oracle contract to fetch ETH/USDT price * @param _usdt USDT token contract address * @param _startTime start time of the presale * @param _endTime end time of the presale */ function initialize( address _oracle, address _usdt, uint256 _startTime, uint256 _endTime ) external initializer { require(_oracle != address(0), "Zero aggregator address"); require(_usdt != address(0), "Zero USDT address"); require( _startTime > block.timestamp && _endTime > _startTime, "Invalid time" ); __Pausable_init_unchained(); __Ownable_init_unchained(); __ReentrancyGuard_init_unchained(); baseDecimals = (10**18); token_amount = [ 157_500_000, 315_000_000, 472_500_000, 630_000_000, 787_500_000, 945_000_000, 1_102_500_000, 1_260_000_000 ]; token_price = [ 10_000_000_000_000_000, 10_200_000_000_000_000, 10_300_000_000_000_000, 10_400_000_000_000_000, 10_550_000_000_000_000, 10_700_000_000_000_000, 10_850_000_000_000_000, 20_000_000_000_000_000 ]; aggregatorInterface = Aggregator(_oracle); USDTInterface = IERC20Upgradeable(_usdt); startTime = _startTime; endTime = _endTime; emit SaleTimeSet(startTime, endTime, block.timestamp); } /** * @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 */ function calculatePrice(uint256 _amount) public view returns (uint256) { uint256 USDTAmount; if (_amount + totalTokensSold > token_amount[currentStep]) { require(currentStep < 7, "Insufficient token amount."); uint256 tokenAmountForCurrentPrice = token_amount[currentStep] - totalTokensSold; USDTAmount = tokenAmountForCurrentPrice * token_price[currentStep] + (_amount - tokenAmountForCurrentPrice) * token_price[currentStep + 1]; } else USDTAmount = _amount * token_price[currentStep]; 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 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 buy into a presale using USDT * @param amount No of tokens to buy */ function buyWithUSDT(uint256 amount) external checkSaleState(amount) whenNotPaused returns (bool) { require(amount < 157_500_000, "Can't buy more than 157_500_000 tokens "); uint256 usdPrice = calculatePrice(amount); usdPrice = usdPrice / (10**12); totalTokensSold += amount; if (totalTokensSold > token_amount[currentStep]) currentStep += 1; userDeposits[_msgSender()] += (amount * baseDecimals); 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), usdPrice, block.timestamp ); return true; } /** * @dev To buy into a presale using ETH * @param amount No of tokens to buy */ function buyWithEth(uint256 amount) external payable checkSaleState(amount) whenNotPaused nonReentrant returns (bool) { require(amount < 157_500_000, "Can't buy more than 157_500_000 tokens "); uint256 usdPrice = calculatePrice(amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, "Less payment"); uint256 excess = msg.value - ethAmount; totalTokensSold += amount; if (totalTokensSold > token_amount[currentStep]) currentStep += 1; userDeposits[_msgSender()] += (amount * baseDecimals); sendValue(payable(owner()), ethAmount); if (excess > 0) sendValue(payable(_msgSender()), excess); emit TokensBought( _msgSender(), amount, address(0), ethAmount, block.timestamp ); return true; } /** * @dev Helper function to get ETH price for given amount * @param amount No of tokens to buy */ function ethBuyHelper(uint256 amount) external view returns (uint256 ethAmount) { uint256 usdPrice = calculatePrice(amount); ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); } /** * @dev Helper function to get USDT price for given amount * @param amount No of tokens to buy */ function usdtBuyHelper(uint256 amount) external 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 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 */ function startClaim( uint256 _claimStart, uint256 noOfTokens ) external onlyOwner returns (bool) { require( _claimStart > endTime && _claimStart > block.timestamp, "Invalid claim start time" ); require( noOfTokens >= (totalTokensSold * baseDecimals), "Tokens less than sold" ); require(claimStart == 0, "Claim already set"); claimStart = _claimStart; IERC20Upgradeable(saleToken).transferFrom( _msgSender(), address(this), noOfTokens ); 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 */ function claim() external whenNotPaused returns (bool) { require(block.timestamp >= claimStart, "Claim has not started yet"); require(!hasClaimed[_msgSender()], "Already claimed"); hasClaimed[_msgSender()] = true; uint256 amount = userDeposits[_msgSender()]; require(amount > 0, "Nothing to claim"); delete userDeposits[_msgSender()]; IERC20Upgradeable(saleToken).transfer(_msgSender(), amount); emit TokensClaimed(_msgSender(), amount, block.timestamp); return true; } /** * @dev To change endTime after sale starts * @param _newEndtime new sale end time */ function setEndTime(uint256 _newEndtime) external onlyOwner{ require(startTime > 0, "Sale not started yet"); require(_newEndtime > block.timestamp, "Endtime must be in the future"); endTime = _newEndtime; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // 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.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) (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 (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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.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. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ 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. * * 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. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * 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. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ 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. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 (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); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":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":"amountPaid","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":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":"USDTInterface","outputs":[{"internalType":"contract IERC20Upgradeable","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":"uint256","name":"amount","type":"uint256"}],"name":"buyWithEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","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":"","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":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"changeSaleTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEndtime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"},{"internalType":"uint256","name":"noOfTokens","type":"uint256"}],"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"}],"name":"token_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"token_price","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":"uint256","name":"amount","type":"uint256"}],"name":"usdtBuyHelper","outputs":[{"internalType":"uint256","name":"usdPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600060c955600060ca5534801561001a57600080fd5b50613f558061002a6000396000f3fe6080604052600436106101d85760003560e01c806373b2e80e11610102578063ae10426511610095578063eb990c5911610064578063eb990c59146106df578063f04d688f14610708578063f2fde38b14610733578063f597573f1461075c576101d8565b8063ae10426514610623578063c49cc64514610660578063ccb98ffc1461068b578063e985e367146106b4576101d8565b80638456cb59116100d15780638456cb59146105795780638da5cb5b146105905780638e15f473146105bb578063a7c60160146105e6576101d8565b806373b2e80e146104a457806375834ab5146104e15780637649b9571461051e57806378e979251461054e576101d8565b806333f761781161017a5780635c975abb116101495780635c975abb146103fa57806363b201171461042557806363e4087914610450578063715018a61461048d576101d8565b806333f76178146103625780633f4ba83a1461038d5780634e71d92d146103a45780635bc34f71146103cf576101d8565b806324128ee4116101b657806324128ee4146102805780632818553f146102bd57806329a5a0b6146102fa5780633197cbb614610337576101d8565b806307f18082146101dd5780630ba36dcd1461021a5780630dc9c83814610257575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612770565b610787565b60405161021191906127b8565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612831565b6108af565b60405161024e919061286d565b60405180910390f35b34801561026357600080fd5b5061027e60048036038101906102799190612888565b6108c7565b005b34801561028c57600080fd5b506102a760048036038101906102a29190612770565b610b19565b6040516102b4919061286d565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190612770565b610b34565b6040516102f1919061286d565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612770565b610b4f565b60405161032e919061286d565b60405180910390f35b34801561034357600080fd5b5061034c610b85565b604051610359919061286d565b60405180910390f35b34801561036e57600080fd5b50610377610b8b565b604051610384919061286d565b60405180910390f35b34801561039957600080fd5b506103a2610b91565b005b3480156103b057600080fd5b506103b9610ba3565b6040516103c691906127b8565b60405180910390f35b3480156103db57600080fd5b506103e4610eb6565b6040516103f1919061286d565b60405180910390f35b34801561040657600080fd5b5061040f610ebc565b60405161041c91906127b8565b60405180910390f35b34801561043157600080fd5b5061043a610ed3565b604051610447919061286d565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612770565b610ed9565b604051610484919061286d565b60405180910390f35b34801561049957600080fd5b506104a2610efe565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190612831565b610f12565b6040516104d891906127b8565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190612888565b610f32565b60405161051591906127b8565b60405180910390f35b61053860048036038101906105339190612770565b611133565b60405161054591906127b8565b60405180910390f35b34801561055a57600080fd5b50610563611416565b604051610570919061286d565b60405180910390f35b34801561058557600080fd5b5061058e61141c565b005b34801561059c57600080fd5b506105a561142e565b6040516105b291906128d7565b60405180910390f35b3480156105c757600080fd5b506105d0611458565b6040516105dd919061286d565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190612770565b61150c565b60405161061a91906127b8565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190612770565b6119ca565b604051610657919061286d565b60405180910390f35b34801561066c57600080fd5b50610675611b05565b6040516106829190612951565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad9190612770565b611b2b565b005b3480156106c057600080fd5b506106c9611bc4565b6040516106d691906128d7565b60405180910390f35b3480156106eb57600080fd5b506107066004803603810190610701919061296c565b611bdc565b005b34801561071457600080fd5b5061071d61209d565b60405161072a919061286d565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190612831565b6120a3565b005b34801561076857600080fd5b50610771612126565b60405161077e91906129f4565b60405180910390f35b600061079161214c565b600060cd54116107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd90612a6c565b60405180910390fd5b60cc54821161081a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081190612ad8565b60405180910390fd5b42821161085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390612b44565b60405180910390fd5b600060cd5490508260cd819055507f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a481844260405161089d93929190612b64565b60405180910390a16001915050919050565b60e16020528060005260406000206000915090505481565b6108cf61214c565b60008211806108de5750600081115b61091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490612be7565b60405180910390fd5b6000821115610a185760cb54421061096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190612c53565b60405180910390fd5b8142106109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a390612cbf565b60405180910390fd5b600060cb5490508260cb819055507f53544152540000000000000000000000000000000000000000000000000000007fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2828542604051610a0e93929190612b64565b60405180910390a2505b6000811115610b155760cc544210610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90612d2b565b60405180910390fd5b60cb548111610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa090612d97565b60405180910390fd5b600060cc5490508160cc819055507f454e4400000000000000000000000000000000000000000000000000000000007fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2828442604051610b0b93929190612b64565b60405180910390a2505b5050565b60d18160088110610b2957600080fd5b016000915090505481565b60d98160088110610b4457600080fd5b016000915090505481565b600080610b5b836119ca565b9050610b65611458565b60ce5482610b739190612de6565b610b7d9190612e57565b915050919050565b60cc5481565b60ce5481565b610b9961214c565b610ba16121ca565b565b6000610bad61222d565b60cd54421015610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990612ed4565b60405180910390fd5b60e26000610bfe612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90612f40565b60405180910390fd5b600160e26000610c94612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060e16000610cf3612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90612fac565b60405180910390fd5b60e16000610d7f612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905573ed328e9c1179a30ddc1e7595e036aed8760c22af73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610df5612277565b836040518363ffffffff1660e01b8152600401610e13929190612fcc565b6020604051808303816000875af1158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e569190613021565b50610e5f612277565b73ffffffffffffffffffffffffffffffffffffffff167f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b8242604051610ea692919061304e565b60405180910390a2600191505090565b60ca5481565b6000609760009054906101000a900460ff16905090565b60c95481565b6000610ee4826119ca565b905064e8d4a5100081610ef79190612e57565b9050919050565b610f0661214c565b610f10600061227f565b565b60e26020528060005260406000206000915054906101000a900460ff1681565b6000610f3c61214c565b60cc5483118015610f4c57504283115b610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f82906130c3565b60405180910390fd5b60ce5460c954610f9b9190612de6565b821015610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd49061312f565b60405180910390fd5b600060cd5414611022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110199061319b565b60405180910390fd5b8260cd8190555073ed328e9c1179a30ddc1e7595e036aed8760c22af73ffffffffffffffffffffffffffffffffffffffff166323b872dd611061612277565b30856040518463ffffffff1660e01b8152600401611081939291906131bb565b6020604051808303816000875af11580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613021565b5073ed328e9c1179a30ddc1e7595e036aed8760c22af73ffffffffffffffffffffffffffffffffffffffff167fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8834260405161112192919061304e565b60405180910390a26001905092915050565b60008160cb54421015801561114a575060cc544211155b611189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111809061323e565b60405180910390fd5b600081116111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906132aa565b60405180910390fd5b6111d461222d565b6111dc612345565b63096342608310611222576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112199061333c565b60405180910390fd5b600061122d846119ca565b90506000611239611458565b60ce54836112479190612de6565b6112519190612e57565b905080341015611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906133a8565b60405180910390fd5b600081346112a491906133c8565b90508560c960008282546112b891906133fc565b9250508190555060d160ca54600881106112d5576112d4613430565b5b015460c95411156112fb57600160ca60008282546112f391906133fc565b925050819055505b60ce54866113099190612de6565b60e16000611315612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461135e91906133fc565b9250508190555061137661137061142e565b83612394565b60008111156113915761139061138a612277565b82612394565b5b600073ffffffffffffffffffffffffffffffffffffffff16866113b2612277565b73ffffffffffffffffffffffffffffffffffffffff167f62e796e00a8e66154d78da76daae129635b4795a6e1b889f2caa6c5cea22ac6885426040516113f992919061304e565b60405180910390a460019450505050611410612488565b50919050565b60cb5481565b61142461214c565b61142c612491565b565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060d060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec91906134ec565b5050509150506402540be400816115039190613567565b90508091505090565b60008160cb544210158015611523575060cc544211155b611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115599061323e565b60405180910390fd5b600081116115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c906132aa565b60405180910390fd5b6115ad61222d565b630963426083106115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea9061333c565b60405180910390fd5b60006115fe846119ca565b905064e8d4a51000816116119190612e57565b90508360c9600082825461162591906133fc565b9250508190555060d160ca546008811061164257611641613430565b5b015460c954111561166857600160ca600082825461166091906133fc565b925050819055505b60ce54846116769190612de6565b60e16000611682612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116cb91906133fc565b92505081905550600060cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61171a612277565b306040518363ffffffff1660e01b81526004016117389291906135df565b602060405180830381865afa158015611755573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117799190613608565b9050808211156117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b5906136a7565b60405180910390fd5b600060cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611801612277565b61180961142e565b8560405160240161181c939291906131bb565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516118a69190613738565b6000604051808303816000865af19150503d80600081146118e3576040519150601f19603f3d011682016040523d82523d6000602084013e6118e8565b606091505b505090508061192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119239061379b565b60405180910390fd5b60cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168661196e612277565b73ffffffffffffffffffffffffffffffffffffffff167f62e796e00a8e66154d78da76daae129635b4795a6e1b889f2caa6c5cea22ac6886426040516119b592919061304e565b60405180910390a46001945050505050919050565b60008060d160ca54600881106119e3576119e2613430565b5b015460c954846119f391906133fc565b1115611ad657600760ca5410611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590613807565b60405180910390fd5b600060c95460d160ca5460088110611a5957611a58613430565b5b0154611a6591906133c8565b905060d9600160ca54611a7891906133fc565b60088110611a8957611a88613430565b5b01548185611a9791906133c8565b611aa19190612de6565b60d960ca5460088110611ab757611ab6613430565b5b015482611ac49190612de6565b611ace91906133fc565b915050611afc565b60d960ca5460088110611aec57611aeb613430565b5b015483611af99190612de6565b90505b80915050919050565b60d060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b3361214c565b600060cb5411611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f90613873565b60405180910390fd5b428111611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb1906138df565b60405180910390fd5b8060cc8190555050565b73ed328e9c1179a30ddc1e7595e036aed8760c22af81565b60008060019054906101000a900460ff16159050808015611c0d5750600160008054906101000a900460ff1660ff16105b80611c3a5750611c1c306124f4565b158015611c395750600160008054906101000a900460ff1660ff16145b5b611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7090613971565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015611cb6576001600060016101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c906139dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b90613a49565b60405180910390fd5b4283118015611da257508282115b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890613ab5565b60405180910390fd5b611de9612517565b611df1612583565b611df96125e4565b670de0b6b3a764000060ce81905550604051806101000160405280630963426063ffffffff1681526020016312c684c063ffffffff168152602001631c29c72063ffffffff16815260200163258d098063ffffffff168152602001632ef04be063ffffffff1681526020016338538e4063ffffffff1681526020016341b6d0a063ffffffff168152602001634b1a130063ffffffff1681525060d1906008611ea2929190612685565b50604051806101000160405280662386f26fc1000066ffffffffffffff16815260200166243cd890b5800066ffffffffffffff168152602001662497cba12fc00066ffffffffffffff1681526020016624f2beb1aa000066ffffffffffffff16815260200166257b2b4a61600066ffffffffffffff16815260200166260397e318c00066ffffffffffffff16815260200166268c047bd0200066ffffffffffffff16815260200166470de4df82000066ffffffffffffff1681525060d9906008611f6d9291906126cd565b508460d060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360cf60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260cb819055508160cc819055507f23f6ad8232d75562dd1c6b37dfc895af6bfc1ecd0fb3b88722c6a5e6b4dc9a2060cb5460cc544260405161203593929190612b64565b60405180910390a180156120965760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161208d9190613b1d565b60405180910390a15b5050505050565b60cd5481565b6120ab61214c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190613baa565b60405180910390fd5b6121238161227f565b50565b60cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612154612277565b73ffffffffffffffffffffffffffffffffffffffff1661217261142e565b73ffffffffffffffffffffffffffffffffffffffff16146121c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bf90613c16565b60405180910390fd5b565b6121d261263c565b6000609760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612216612277565b60405161222391906128d7565b60405180910390a1565b612235610ebc565b15612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90613c82565b60405180910390fd5b565b600033905090565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540361238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190613cee565b60405180910390fd5b6002600181905550565b804710156123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90613d5a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123fd90613da0565b60006040518083038185875af1925050503d806000811461243a576040519150601f19603f3d011682016040523d82523d6000602084013e61243f565b606091505b5050905080612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90613e01565b60405180910390fd5b505050565b60018081905550565b61249961222d565b6001609760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586124dd612277565b6040516124ea91906128d7565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255d90613e93565b60405180910390fd5b6000609760006101000a81548160ff021916908315150217905550565b600060019054906101000a900460ff166125d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c990613e93565b60405180910390fd5b6125e26125dd612277565b61227f565b565b600060019054906101000a900460ff16612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90613e93565b60405180910390fd5b60018081905550565b612644610ebc565b612683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267a90613eff565b60405180910390fd5b565b82600881019282156126bc579160200282015b828111156126bb578251829063ffffffff16905591602001919060010190612698565b5b5090506126c99190612718565b5090565b8260088101928215612707579160200282015b82811115612706578251829066ffffffffffffff169055916020019190600101906126e0565b5b5090506127149190612718565b5090565b5b80821115612731576000816000905550600101612719565b5090565b600080fd5b6000819050919050565b61274d8161273a565b811461275857600080fd5b50565b60008135905061276a81612744565b92915050565b60006020828403121561278657612785612735565b5b60006127948482850161275b565b91505092915050565b60008115159050919050565b6127b28161279d565b82525050565b60006020820190506127cd60008301846127a9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127fe826127d3565b9050919050565b61280e816127f3565b811461281957600080fd5b50565b60008135905061282b81612805565b92915050565b60006020828403121561284757612846612735565b5b60006128558482850161281c565b91505092915050565b6128678161273a565b82525050565b6000602082019050612882600083018461285e565b92915050565b6000806040838503121561289f5761289e612735565b5b60006128ad8582860161275b565b92505060206128be8582860161275b565b9150509250929050565b6128d1816127f3565b82525050565b60006020820190506128ec60008301846128c8565b92915050565b6000819050919050565b600061291761291261290d846127d3565b6128f2565b6127d3565b9050919050565b6000612929826128fc565b9050919050565b600061293b8261291e565b9050919050565b61294b81612930565b82525050565b60006020820190506129666000830184612942565b92915050565b6000806000806080858703121561298657612985612735565b5b60006129948782880161281c565b94505060206129a58782880161281c565b93505060406129b68782880161275b565b92505060606129c78782880161275b565b91505092959194509250565b60006129de8261291e565b9050919050565b6129ee816129d3565b82525050565b6000602082019050612a0960008301846129e5565b92915050565b600082825260208201905092915050565b7f496e697469616c20636c61696d2064617461206e6f7420736574000000000000600082015250565b6000612a56601a83612a0f565b9150612a6182612a20565b602082019050919050565b60006020820190508181036000830152612a8581612a49565b9050919050565b7f53616c6520696e2070726f677265737300000000000000000000000000000000600082015250565b6000612ac2601083612a0f565b9150612acd82612a8c565b602082019050919050565b60006020820190508181036000830152612af181612ab5565b9050919050565b7f436c61696d20737461727420696e207061737400000000000000000000000000600082015250565b6000612b2e601383612a0f565b9150612b3982612af8565b602082019050919050565b60006020820190508181036000830152612b5d81612b21565b9050919050565b6000606082019050612b79600083018661285e565b612b86602083018561285e565b612b93604083018461285e565b949350505050565b7f496e76616c696420706172616d65746572730000000000000000000000000000600082015250565b6000612bd1601283612a0f565b9150612bdc82612b9b565b602082019050919050565b60006020820190508181036000830152612c0081612bc4565b9050919050565b7f53616c6520616c72656164792073746172746564000000000000000000000000600082015250565b6000612c3d601483612a0f565b9150612c4882612c07565b602082019050919050565b60006020820190508181036000830152612c6c81612c30565b9050919050565b7f53616c652074696d6520696e2070617374000000000000000000000000000000600082015250565b6000612ca9601183612a0f565b9150612cb482612c73565b602082019050919050565b60006020820190508181036000830152612cd881612c9c565b9050919050565b7f53616c6520616c726561647920656e6465640000000000000000000000000000600082015250565b6000612d15601283612a0f565b9150612d2082612cdf565b602082019050919050565b60006020820190508181036000830152612d4481612d08565b9050919050565b7f496e76616c696420656e6454696d650000000000000000000000000000000000600082015250565b6000612d81600f83612a0f565b9150612d8c82612d4b565b602082019050919050565b60006020820190508181036000830152612db081612d74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612df18261273a565b9150612dfc8361273a565b9250828202612e0a8161273a565b91508282048414831517612e2157612e20612db7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e628261273a565b9150612e6d8361273a565b925082612e7d57612e7c612e28565b5b828204905092915050565b7f436c61696d20686173206e6f7420737461727465642079657400000000000000600082015250565b6000612ebe601983612a0f565b9150612ec982612e88565b602082019050919050565b60006020820190508181036000830152612eed81612eb1565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000612f2a600f83612a0f565b9150612f3582612ef4565b602082019050919050565b60006020820190508181036000830152612f5981612f1d565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000612f96601083612a0f565b9150612fa182612f60565b602082019050919050565b60006020820190508181036000830152612fc581612f89565b9050919050565b6000604082019050612fe160008301856128c8565b612fee602083018461285e565b9392505050565b612ffe8161279d565b811461300957600080fd5b50565b60008151905061301b81612ff5565b92915050565b60006020828403121561303757613036612735565b5b60006130458482850161300c565b91505092915050565b6000604082019050613063600083018561285e565b613070602083018461285e565b9392505050565b7f496e76616c696420636c61696d2073746172742074696d650000000000000000600082015250565b60006130ad601883612a0f565b91506130b882613077565b602082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f546f6b656e73206c657373207468616e20736f6c640000000000000000000000600082015250565b6000613119601583612a0f565b9150613124826130e3565b602082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f436c61696d20616c726561647920736574000000000000000000000000000000600082015250565b6000613185601183612a0f565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b60006060820190506131d060008301866128c8565b6131dd60208301856128c8565b6131ea604083018461285e565b949350505050565b7f496e76616c69642074696d6520666f7220627579696e67000000000000000000600082015250565b6000613228601783612a0f565b9150613233826131f2565b602082019050919050565b600060208201905081810360008301526132578161321b565b9050919050565b7f496e76616c69642073616c6520616d6f756e7400000000000000000000000000600082015250565b6000613294601383612a0f565b915061329f8261325e565b602082019050919050565b600060208201905081810360008301526132c381613287565b9050919050565b7f43616e277420627579206d6f7265207468616e203135375f3530305f3030302060008201527f746f6b656e732000000000000000000000000000000000000000000000000000602082015250565b6000613326602783612a0f565b9150613331826132ca565b604082019050919050565b6000602082019050818103600083015261335581613319565b9050919050565b7f4c657373207061796d656e740000000000000000000000000000000000000000600082015250565b6000613392600c83612a0f565b915061339d8261335c565b602082019050919050565b600060208201905081810360008301526133c181613385565b9050919050565b60006133d38261273a565b91506133de8361273a565b92508282039050818111156133f6576133f5612db7565b5b92915050565b60006134078261273a565b91506134128361273a565b925082820190508082111561342a57613429612db7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600069ffffffffffffffffffff82169050919050565b61347e8161345f565b811461348957600080fd5b50565b60008151905061349b81613475565b92915050565b6000819050919050565b6134b4816134a1565b81146134bf57600080fd5b50565b6000815190506134d1816134ab565b92915050565b6000815190506134e681612744565b92915050565b600080600080600060a0868803121561350857613507612735565b5b60006135168882890161348c565b9550506020613527888289016134c2565b9450506040613538888289016134d7565b9350506060613549888289016134d7565b925050608061355a8882890161348c565b9150509295509295909350565b6000613572826134a1565b915061357d836134a1565b925082820261358b816134a1565b91507f800000000000000000000000000000000000000000000000000000000000000084146000841216156135c3576135c2612db7565b5b82820584148315176135d8576135d7612db7565b5b5092915050565b60006040820190506135f460008301856128c8565b61360160208301846128c8565b9392505050565b60006020828403121561361e5761361d612735565b5b600061362c848285016134d7565b91505092915050565b7f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613691602183612a0f565b915061369c82613635565b604082019050919050565b600060208201905081810360008301526136c081613684565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156136fb5780820151818401526020810190506136e0565b60008484015250505050565b6000613712826136c7565b61371c81856136d2565b935061372c8185602086016136dd565b80840191505092915050565b60006137448284613707565b915081905092915050565b7f546f6b656e207061796d656e74206661696c6564000000000000000000000000600082015250565b6000613785601483612a0f565b91506137908261374f565b602082019050919050565b600060208201905081810360008301526137b481613778565b9050919050565b7f496e73756666696369656e7420746f6b656e20616d6f756e742e000000000000600082015250565b60006137f1601a83612a0f565b91506137fc826137bb565b602082019050919050565b60006020820190508181036000830152613820816137e4565b9050919050565b7f53616c65206e6f74207374617274656420796574000000000000000000000000600082015250565b600061385d601483612a0f565b915061386882613827565b602082019050919050565b6000602082019050818103600083015261388c81613850565b9050919050565b7f456e6474696d65206d75737420626520696e2074686520667574757265000000600082015250565b60006138c9601d83612a0f565b91506138d482613893565b602082019050919050565b600060208201905081810360008301526138f8816138bc565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b600061395b602e83612a0f565b9150613966826138ff565b604082019050919050565b6000602082019050818103600083015261398a8161394e565b9050919050565b7f5a65726f2061676772656761746f722061646472657373000000000000000000600082015250565b60006139c7601783612a0f565b91506139d282613991565b602082019050919050565b600060208201905081810360008301526139f6816139ba565b9050919050565b7f5a65726f20555344542061646472657373000000000000000000000000000000600082015250565b6000613a33601183612a0f565b9150613a3e826139fd565b602082019050919050565b60006020820190508181036000830152613a6281613a26565b9050919050565b7f496e76616c69642074696d650000000000000000000000000000000000000000600082015250565b6000613a9f600c83612a0f565b9150613aaa82613a69565b602082019050919050565b60006020820190508181036000830152613ace81613a92565b9050919050565b6000819050919050565b600060ff82169050919050565b6000613b07613b02613afd84613ad5565b6128f2565b613adf565b9050919050565b613b1781613aec565b82525050565b6000602082019050613b326000830184613b0e565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b94602683612a0f565b9150613b9f82613b38565b604082019050919050565b60006020820190508181036000830152613bc381613b87565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c00602083612a0f565b9150613c0b82613bca565b602082019050919050565b60006020820190508181036000830152613c2f81613bf3565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613c6c601083612a0f565b9150613c7782613c36565b602082019050919050565b60006020820190508181036000830152613c9b81613c5f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cd8601f83612a0f565b9150613ce382613ca2565b602082019050919050565b60006020820190508181036000830152613d0781613ccb565b9050919050565b7f4c6f772062616c616e6365000000000000000000000000000000000000000000600082015250565b6000613d44600b83612a0f565b9150613d4f82613d0e565b602082019050919050565b60006020820190508181036000830152613d7381613d37565b9050919050565b50565b6000613d8a6000836136d2565b9150613d9582613d7a565b600082019050919050565b6000613dab82613d7d565b9150819050919050565b7f455448205061796d656e74206661696c65640000000000000000000000000000600082015250565b6000613deb601283612a0f565b9150613df682613db5565b602082019050919050565b60006020820190508181036000830152613e1a81613dde565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000613e7d602b83612a0f565b9150613e8882613e21565b604082019050919050565b60006020820190508181036000830152613eac81613e70565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613ee9601483612a0f565b9150613ef482613eb3565b602082019050919050565b60006020820190508181036000830152613f1881613edc565b905091905056fea26469706673582212203167c79ffc62c6b4998904fcbd9d1bbbe87947099d9178927996c30c6799545464736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c806373b2e80e11610102578063ae10426511610095578063eb990c5911610064578063eb990c59146106df578063f04d688f14610708578063f2fde38b14610733578063f597573f1461075c576101d8565b8063ae10426514610623578063c49cc64514610660578063ccb98ffc1461068b578063e985e367146106b4576101d8565b80638456cb59116100d15780638456cb59146105795780638da5cb5b146105905780638e15f473146105bb578063a7c60160146105e6576101d8565b806373b2e80e146104a457806375834ab5146104e15780637649b9571461051e57806378e979251461054e576101d8565b806333f761781161017a5780635c975abb116101495780635c975abb146103fa57806363b201171461042557806363e4087914610450578063715018a61461048d576101d8565b806333f76178146103625780633f4ba83a1461038d5780634e71d92d146103a45780635bc34f71146103cf576101d8565b806324128ee4116101b657806324128ee4146102805780632818553f146102bd57806329a5a0b6146102fa5780633197cbb614610337576101d8565b806307f18082146101dd5780630ba36dcd1461021a5780630dc9c83814610257575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612770565b610787565b60405161021191906127b8565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190612831565b6108af565b60405161024e919061286d565b60405180910390f35b34801561026357600080fd5b5061027e60048036038101906102799190612888565b6108c7565b005b34801561028c57600080fd5b506102a760048036038101906102a29190612770565b610b19565b6040516102b4919061286d565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190612770565b610b34565b6040516102f1919061286d565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612770565b610b4f565b60405161032e919061286d565b60405180910390f35b34801561034357600080fd5b5061034c610b85565b604051610359919061286d565b60405180910390f35b34801561036e57600080fd5b50610377610b8b565b604051610384919061286d565b60405180910390f35b34801561039957600080fd5b506103a2610b91565b005b3480156103b057600080fd5b506103b9610ba3565b6040516103c691906127b8565b60405180910390f35b3480156103db57600080fd5b506103e4610eb6565b6040516103f1919061286d565b60405180910390f35b34801561040657600080fd5b5061040f610ebc565b60405161041c91906127b8565b60405180910390f35b34801561043157600080fd5b5061043a610ed3565b604051610447919061286d565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612770565b610ed9565b604051610484919061286d565b60405180910390f35b34801561049957600080fd5b506104a2610efe565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190612831565b610f12565b6040516104d891906127b8565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190612888565b610f32565b60405161051591906127b8565b60405180910390f35b61053860048036038101906105339190612770565b611133565b60405161054591906127b8565b60405180910390f35b34801561055a57600080fd5b50610563611416565b604051610570919061286d565b60405180910390f35b34801561058557600080fd5b5061058e61141c565b005b34801561059c57600080fd5b506105a561142e565b6040516105b291906128d7565b60405180910390f35b3480156105c757600080fd5b506105d0611458565b6040516105dd919061286d565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190612770565b61150c565b60405161061a91906127b8565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190612770565b6119ca565b604051610657919061286d565b60405180910390f35b34801561066c57600080fd5b50610675611b05565b6040516106829190612951565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad9190612770565b611b2b565b005b3480156106c057600080fd5b506106c9611bc4565b6040516106d691906128d7565b60405180910390f35b3480156106eb57600080fd5b506107066004803603810190610701919061296c565b611bdc565b005b34801561071457600080fd5b5061071d61209d565b60405161072a919061286d565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190612831565b6120a3565b005b34801561076857600080fd5b50610771612126565b60405161077e91906129f4565b60405180910390f35b600061079161214c565b600060cd54116107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd90612a6c565b60405180910390fd5b60cc54821161081a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081190612ad8565b60405180910390fd5b42821161085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390612b44565b60405180910390fd5b600060cd5490508260cd819055507f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a481844260405161089d93929190612b64565b60405180910390a16001915050919050565b60e16020528060005260406000206000915090505481565b6108cf61214c565b60008211806108de5750600081115b61091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490612be7565b60405180910390fd5b6000821115610a185760cb54421061096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190612c53565b60405180910390fd5b8142106109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a390612cbf565b60405180910390fd5b600060cb5490508260cb819055507f53544152540000000000000000000000000000000000000000000000000000007fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2828542604051610a0e93929190612b64565b60405180910390a2505b6000811115610b155760cc544210610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90612d2b565b60405180910390fd5b60cb548111610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa090612d97565b60405180910390fd5b600060cc5490508160cc819055507f454e4400000000000000000000000000000000000000000000000000000000007fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2828442604051610b0b93929190612b64565b60405180910390a2505b5050565b60d18160088110610b2957600080fd5b016000915090505481565b60d98160088110610b4457600080fd5b016000915090505481565b600080610b5b836119ca565b9050610b65611458565b60ce5482610b739190612de6565b610b7d9190612e57565b915050919050565b60cc5481565b60ce5481565b610b9961214c565b610ba16121ca565b565b6000610bad61222d565b60cd54421015610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990612ed4565b60405180910390fd5b60e26000610bfe612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90612f40565b60405180910390fd5b600160e26000610c94612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060e16000610cf3612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90612fac565b60405180910390fd5b60e16000610d7f612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905573ed328e9c1179a30ddc1e7595e036aed8760c22af73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610df5612277565b836040518363ffffffff1660e01b8152600401610e13929190612fcc565b6020604051808303816000875af1158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e569190613021565b50610e5f612277565b73ffffffffffffffffffffffffffffffffffffffff167f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b8242604051610ea692919061304e565b60405180910390a2600191505090565b60ca5481565b6000609760009054906101000a900460ff16905090565b60c95481565b6000610ee4826119ca565b905064e8d4a5100081610ef79190612e57565b9050919050565b610f0661214c565b610f10600061227f565b565b60e26020528060005260406000206000915054906101000a900460ff1681565b6000610f3c61214c565b60cc5483118015610f4c57504283115b610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f82906130c3565b60405180910390fd5b60ce5460c954610f9b9190612de6565b821015610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd49061312f565b60405180910390fd5b600060cd5414611022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110199061319b565b60405180910390fd5b8260cd8190555073ed328e9c1179a30ddc1e7595e036aed8760c22af73ffffffffffffffffffffffffffffffffffffffff166323b872dd611061612277565b30856040518463ffffffff1660e01b8152600401611081939291906131bb565b6020604051808303816000875af11580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613021565b5073ed328e9c1179a30ddc1e7595e036aed8760c22af73ffffffffffffffffffffffffffffffffffffffff167fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8834260405161112192919061304e565b60405180910390a26001905092915050565b60008160cb54421015801561114a575060cc544211155b611189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111809061323e565b60405180910390fd5b600081116111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906132aa565b60405180910390fd5b6111d461222d565b6111dc612345565b63096342608310611222576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112199061333c565b60405180910390fd5b600061122d846119ca565b90506000611239611458565b60ce54836112479190612de6565b6112519190612e57565b905080341015611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906133a8565b60405180910390fd5b600081346112a491906133c8565b90508560c960008282546112b891906133fc565b9250508190555060d160ca54600881106112d5576112d4613430565b5b015460c95411156112fb57600160ca60008282546112f391906133fc565b925050819055505b60ce54866113099190612de6565b60e16000611315612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461135e91906133fc565b9250508190555061137661137061142e565b83612394565b60008111156113915761139061138a612277565b82612394565b5b600073ffffffffffffffffffffffffffffffffffffffff16866113b2612277565b73ffffffffffffffffffffffffffffffffffffffff167f62e796e00a8e66154d78da76daae129635b4795a6e1b889f2caa6c5cea22ac6885426040516113f992919061304e565b60405180910390a460019450505050611410612488565b50919050565b60cb5481565b61142461214c565b61142c612491565b565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060d060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec91906134ec565b5050509150506402540be400816115039190613567565b90508091505090565b60008160cb544210158015611523575060cc544211155b611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115599061323e565b60405180910390fd5b600081116115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c906132aa565b60405180910390fd5b6115ad61222d565b630963426083106115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea9061333c565b60405180910390fd5b60006115fe846119ca565b905064e8d4a51000816116119190612e57565b90508360c9600082825461162591906133fc565b9250508190555060d160ca546008811061164257611641613430565b5b015460c954111561166857600160ca600082825461166091906133fc565b925050819055505b60ce54846116769190612de6565b60e16000611682612277565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116cb91906133fc565b92505081905550600060cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61171a612277565b306040518363ffffffff1660e01b81526004016117389291906135df565b602060405180830381865afa158015611755573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117799190613608565b9050808211156117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b5906136a7565b60405180910390fd5b600060cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611801612277565b61180961142e565b8560405160240161181c939291906131bb565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516118a69190613738565b6000604051808303816000865af19150503d80600081146118e3576040519150601f19603f3d011682016040523d82523d6000602084013e6118e8565b606091505b505090508061192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119239061379b565b60405180910390fd5b60cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168661196e612277565b73ffffffffffffffffffffffffffffffffffffffff167f62e796e00a8e66154d78da76daae129635b4795a6e1b889f2caa6c5cea22ac6886426040516119b592919061304e565b60405180910390a46001945050505050919050565b60008060d160ca54600881106119e3576119e2613430565b5b015460c954846119f391906133fc565b1115611ad657600760ca5410611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590613807565b60405180910390fd5b600060c95460d160ca5460088110611a5957611a58613430565b5b0154611a6591906133c8565b905060d9600160ca54611a7891906133fc565b60088110611a8957611a88613430565b5b01548185611a9791906133c8565b611aa19190612de6565b60d960ca5460088110611ab757611ab6613430565b5b015482611ac49190612de6565b611ace91906133fc565b915050611afc565b60d960ca5460088110611aec57611aeb613430565b5b015483611af99190612de6565b90505b80915050919050565b60d060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b3361214c565b600060cb5411611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f90613873565b60405180910390fd5b428111611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb1906138df565b60405180910390fd5b8060cc8190555050565b73ed328e9c1179a30ddc1e7595e036aed8760c22af81565b60008060019054906101000a900460ff16159050808015611c0d5750600160008054906101000a900460ff1660ff16105b80611c3a5750611c1c306124f4565b158015611c395750600160008054906101000a900460ff1660ff16145b5b611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7090613971565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015611cb6576001600060016101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c906139dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b90613a49565b60405180910390fd5b4283118015611da257508282115b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890613ab5565b60405180910390fd5b611de9612517565b611df1612583565b611df96125e4565b670de0b6b3a764000060ce81905550604051806101000160405280630963426063ffffffff1681526020016312c684c063ffffffff168152602001631c29c72063ffffffff16815260200163258d098063ffffffff168152602001632ef04be063ffffffff1681526020016338538e4063ffffffff1681526020016341b6d0a063ffffffff168152602001634b1a130063ffffffff1681525060d1906008611ea2929190612685565b50604051806101000160405280662386f26fc1000066ffffffffffffff16815260200166243cd890b5800066ffffffffffffff168152602001662497cba12fc00066ffffffffffffff1681526020016624f2beb1aa000066ffffffffffffff16815260200166257b2b4a61600066ffffffffffffff16815260200166260397e318c00066ffffffffffffff16815260200166268c047bd0200066ffffffffffffff16815260200166470de4df82000066ffffffffffffff1681525060d9906008611f6d9291906126cd565b508460d060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360cf60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260cb819055508160cc819055507f23f6ad8232d75562dd1c6b37dfc895af6bfc1ecd0fb3b88722c6a5e6b4dc9a2060cb5460cc544260405161203593929190612b64565b60405180910390a180156120965760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161208d9190613b1d565b60405180910390a15b5050505050565b60cd5481565b6120ab61214c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190613baa565b60405180910390fd5b6121238161227f565b50565b60cf60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612154612277565b73ffffffffffffffffffffffffffffffffffffffff1661217261142e565b73ffffffffffffffffffffffffffffffffffffffff16146121c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bf90613c16565b60405180910390fd5b565b6121d261263c565b6000609760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612216612277565b60405161222391906128d7565b60405180910390a1565b612235610ebc565b15612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90613c82565b60405180910390fd5b565b600033905090565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540361238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190613cee565b60405180910390fd5b6002600181905550565b804710156123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90613d5a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123fd90613da0565b60006040518083038185875af1925050503d806000811461243a576040519150601f19603f3d011682016040523d82523d6000602084013e61243f565b606091505b5050905080612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90613e01565b60405180910390fd5b505050565b60018081905550565b61249961222d565b6001609760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586124dd612277565b6040516124ea91906128d7565b60405180910390a1565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255d90613e93565b60405180910390fd5b6000609760006101000a81548160ff021916908315150217905550565b600060019054906101000a900460ff166125d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c990613e93565b60405180910390fd5b6125e26125dd612277565b61227f565b565b600060019054906101000a900460ff16612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90613e93565b60405180910390fd5b60018081905550565b612644610ebc565b612683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267a90613eff565b60405180910390fd5b565b82600881019282156126bc579160200282015b828111156126bb578251829063ffffffff16905591602001919060010190612698565b5b5090506126c99190612718565b5090565b8260088101928215612707579160200282015b82811115612706578251829066ffffffffffffff169055916020019190600101906126e0565b5b5090506127149190612718565b5090565b5b80821115612731576000816000905550600101612719565b5090565b600080fd5b6000819050919050565b61274d8161273a565b811461275857600080fd5b50565b60008135905061276a81612744565b92915050565b60006020828403121561278657612785612735565b5b60006127948482850161275b565b91505092915050565b60008115159050919050565b6127b28161279d565b82525050565b60006020820190506127cd60008301846127a9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127fe826127d3565b9050919050565b61280e816127f3565b811461281957600080fd5b50565b60008135905061282b81612805565b92915050565b60006020828403121561284757612846612735565b5b60006128558482850161281c565b91505092915050565b6128678161273a565b82525050565b6000602082019050612882600083018461285e565b92915050565b6000806040838503121561289f5761289e612735565b5b60006128ad8582860161275b565b92505060206128be8582860161275b565b9150509250929050565b6128d1816127f3565b82525050565b60006020820190506128ec60008301846128c8565b92915050565b6000819050919050565b600061291761291261290d846127d3565b6128f2565b6127d3565b9050919050565b6000612929826128fc565b9050919050565b600061293b8261291e565b9050919050565b61294b81612930565b82525050565b60006020820190506129666000830184612942565b92915050565b6000806000806080858703121561298657612985612735565b5b60006129948782880161281c565b94505060206129a58782880161281c565b93505060406129b68782880161275b565b92505060606129c78782880161275b565b91505092959194509250565b60006129de8261291e565b9050919050565b6129ee816129d3565b82525050565b6000602082019050612a0960008301846129e5565b92915050565b600082825260208201905092915050565b7f496e697469616c20636c61696d2064617461206e6f7420736574000000000000600082015250565b6000612a56601a83612a0f565b9150612a6182612a20565b602082019050919050565b60006020820190508181036000830152612a8581612a49565b9050919050565b7f53616c6520696e2070726f677265737300000000000000000000000000000000600082015250565b6000612ac2601083612a0f565b9150612acd82612a8c565b602082019050919050565b60006020820190508181036000830152612af181612ab5565b9050919050565b7f436c61696d20737461727420696e207061737400000000000000000000000000600082015250565b6000612b2e601383612a0f565b9150612b3982612af8565b602082019050919050565b60006020820190508181036000830152612b5d81612b21565b9050919050565b6000606082019050612b79600083018661285e565b612b86602083018561285e565b612b93604083018461285e565b949350505050565b7f496e76616c696420706172616d65746572730000000000000000000000000000600082015250565b6000612bd1601283612a0f565b9150612bdc82612b9b565b602082019050919050565b60006020820190508181036000830152612c0081612bc4565b9050919050565b7f53616c6520616c72656164792073746172746564000000000000000000000000600082015250565b6000612c3d601483612a0f565b9150612c4882612c07565b602082019050919050565b60006020820190508181036000830152612c6c81612c30565b9050919050565b7f53616c652074696d6520696e2070617374000000000000000000000000000000600082015250565b6000612ca9601183612a0f565b9150612cb482612c73565b602082019050919050565b60006020820190508181036000830152612cd881612c9c565b9050919050565b7f53616c6520616c726561647920656e6465640000000000000000000000000000600082015250565b6000612d15601283612a0f565b9150612d2082612cdf565b602082019050919050565b60006020820190508181036000830152612d4481612d08565b9050919050565b7f496e76616c696420656e6454696d650000000000000000000000000000000000600082015250565b6000612d81600f83612a0f565b9150612d8c82612d4b565b602082019050919050565b60006020820190508181036000830152612db081612d74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612df18261273a565b9150612dfc8361273a565b9250828202612e0a8161273a565b91508282048414831517612e2157612e20612db7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e628261273a565b9150612e6d8361273a565b925082612e7d57612e7c612e28565b5b828204905092915050565b7f436c61696d20686173206e6f7420737461727465642079657400000000000000600082015250565b6000612ebe601983612a0f565b9150612ec982612e88565b602082019050919050565b60006020820190508181036000830152612eed81612eb1565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000612f2a600f83612a0f565b9150612f3582612ef4565b602082019050919050565b60006020820190508181036000830152612f5981612f1d565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000612f96601083612a0f565b9150612fa182612f60565b602082019050919050565b60006020820190508181036000830152612fc581612f89565b9050919050565b6000604082019050612fe160008301856128c8565b612fee602083018461285e565b9392505050565b612ffe8161279d565b811461300957600080fd5b50565b60008151905061301b81612ff5565b92915050565b60006020828403121561303757613036612735565b5b60006130458482850161300c565b91505092915050565b6000604082019050613063600083018561285e565b613070602083018461285e565b9392505050565b7f496e76616c696420636c61696d2073746172742074696d650000000000000000600082015250565b60006130ad601883612a0f565b91506130b882613077565b602082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f546f6b656e73206c657373207468616e20736f6c640000000000000000000000600082015250565b6000613119601583612a0f565b9150613124826130e3565b602082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f436c61696d20616c726561647920736574000000000000000000000000000000600082015250565b6000613185601183612a0f565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b60006060820190506131d060008301866128c8565b6131dd60208301856128c8565b6131ea604083018461285e565b949350505050565b7f496e76616c69642074696d6520666f7220627579696e67000000000000000000600082015250565b6000613228601783612a0f565b9150613233826131f2565b602082019050919050565b600060208201905081810360008301526132578161321b565b9050919050565b7f496e76616c69642073616c6520616d6f756e7400000000000000000000000000600082015250565b6000613294601383612a0f565b915061329f8261325e565b602082019050919050565b600060208201905081810360008301526132c381613287565b9050919050565b7f43616e277420627579206d6f7265207468616e203135375f3530305f3030302060008201527f746f6b656e732000000000000000000000000000000000000000000000000000602082015250565b6000613326602783612a0f565b9150613331826132ca565b604082019050919050565b6000602082019050818103600083015261335581613319565b9050919050565b7f4c657373207061796d656e740000000000000000000000000000000000000000600082015250565b6000613392600c83612a0f565b915061339d8261335c565b602082019050919050565b600060208201905081810360008301526133c181613385565b9050919050565b60006133d38261273a565b91506133de8361273a565b92508282039050818111156133f6576133f5612db7565b5b92915050565b60006134078261273a565b91506134128361273a565b925082820190508082111561342a57613429612db7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600069ffffffffffffffffffff82169050919050565b61347e8161345f565b811461348957600080fd5b50565b60008151905061349b81613475565b92915050565b6000819050919050565b6134b4816134a1565b81146134bf57600080fd5b50565b6000815190506134d1816134ab565b92915050565b6000815190506134e681612744565b92915050565b600080600080600060a0868803121561350857613507612735565b5b60006135168882890161348c565b9550506020613527888289016134c2565b9450506040613538888289016134d7565b9350506060613549888289016134d7565b925050608061355a8882890161348c565b9150509295509295909350565b6000613572826134a1565b915061357d836134a1565b925082820261358b816134a1565b91507f800000000000000000000000000000000000000000000000000000000000000084146000841216156135c3576135c2612db7565b5b82820584148315176135d8576135d7612db7565b5b5092915050565b60006040820190506135f460008301856128c8565b61360160208301846128c8565b9392505050565b60006020828403121561361e5761361d612735565b5b600061362c848285016134d7565b91505092915050565b7f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613691602183612a0f565b915061369c82613635565b604082019050919050565b600060208201905081810360008301526136c081613684565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156136fb5780820151818401526020810190506136e0565b60008484015250505050565b6000613712826136c7565b61371c81856136d2565b935061372c8185602086016136dd565b80840191505092915050565b60006137448284613707565b915081905092915050565b7f546f6b656e207061796d656e74206661696c6564000000000000000000000000600082015250565b6000613785601483612a0f565b91506137908261374f565b602082019050919050565b600060208201905081810360008301526137b481613778565b9050919050565b7f496e73756666696369656e7420746f6b656e20616d6f756e742e000000000000600082015250565b60006137f1601a83612a0f565b91506137fc826137bb565b602082019050919050565b60006020820190508181036000830152613820816137e4565b9050919050565b7f53616c65206e6f74207374617274656420796574000000000000000000000000600082015250565b600061385d601483612a0f565b915061386882613827565b602082019050919050565b6000602082019050818103600083015261388c81613850565b9050919050565b7f456e6474696d65206d75737420626520696e2074686520667574757265000000600082015250565b60006138c9601d83612a0f565b91506138d482613893565b602082019050919050565b600060208201905081810360008301526138f8816138bc565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b600061395b602e83612a0f565b9150613966826138ff565b604082019050919050565b6000602082019050818103600083015261398a8161394e565b9050919050565b7f5a65726f2061676772656761746f722061646472657373000000000000000000600082015250565b60006139c7601783612a0f565b91506139d282613991565b602082019050919050565b600060208201905081810360008301526139f6816139ba565b9050919050565b7f5a65726f20555344542061646472657373000000000000000000000000000000600082015250565b6000613a33601183612a0f565b9150613a3e826139fd565b602082019050919050565b60006020820190508181036000830152613a6281613a26565b9050919050565b7f496e76616c69642074696d650000000000000000000000000000000000000000600082015250565b6000613a9f600c83612a0f565b9150613aaa82613a69565b602082019050919050565b60006020820190508181036000830152613ace81613a92565b9050919050565b6000819050919050565b600060ff82169050919050565b6000613b07613b02613afd84613ad5565b6128f2565b613adf565b9050919050565b613b1781613aec565b82525050565b6000602082019050613b326000830184613b0e565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b94602683612a0f565b9150613b9f82613b38565b604082019050919050565b60006020820190508181036000830152613bc381613b87565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c00602083612a0f565b9150613c0b82613bca565b602082019050919050565b60006020820190508181036000830152613c2f81613bf3565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613c6c601083612a0f565b9150613c7782613c36565b602082019050919050565b60006020820190508181036000830152613c9b81613c5f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cd8601f83612a0f565b9150613ce382613ca2565b602082019050919050565b60006020820190508181036000830152613d0781613ccb565b9050919050565b7f4c6f772062616c616e6365000000000000000000000000000000000000000000600082015250565b6000613d44600b83612a0f565b9150613d4f82613d0e565b602082019050919050565b60006020820190508181036000830152613d7381613d37565b9050919050565b50565b6000613d8a6000836136d2565b9150613d9582613d7a565b600082019050919050565b6000613dab82613d7d565b9150819050919050565b7f455448205061796d656e74206661696c65640000000000000000000000000000600082015250565b6000613deb601283612a0f565b9150613df682613db5565b602082019050919050565b60006020820190508181036000830152613e1a81613dde565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000613e7d602b83612a0f565b9150613e8882613e21565b604082019050919050565b60006020820190508181036000830152613eac81613e70565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613ee9601483612a0f565b9150613ef482613eb3565b602082019050919050565b60006020820190508181036000830152613f1881613edc565b905091905056fea26469706673582212203167c79ffc62c6b4998904fcbd9d1bbbe87947099d9178927996c30c6799545464736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.99927 | 53.6966 | $53.66 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.