Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EthereumPresale
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol'; interface IAggregator { function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } contract EthereumPresale is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable, PausableUpgradeable { uint256 public totalTokensSold; uint256 public claimStart; uint256 public baseScale; uint256 public baseDecimals; uint256 public maxTokensToBuy; uint256 public minTokensToBuy; uint256 public currentStep; uint256 public checkPoint; uint256 public usdRaised; uint256 public timeConstant; uint256[][3] private rounds; uint256[] private remainingTokensTracker; address public saleToken; address private paymentWallet; address public USDTtoken; address public USDCtoken; address public DAItoken; address public aggregatorInterface; bool public dynamicTimeFlag; mapping(address => uint256) public userDeposits; mapping(uint256 => uint256) public usdTokenDecimals; event TokensBought( address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp ); event TokensAdded( address indexed token, uint256 noOfTokens, uint256 timestamp ); event TokensClaimed( address indexed user, uint256 amount, uint256 timestamp ); event StepIncremented(uint256 newStep, uint256 timestamp); constructor() initializer {} function initialize( address _oracle, address _usdt, address _usdc, address _dai, uint256[][3] memory _rounds, uint256 _timeConstant, uint256 _maxTokensToBuy, uint256 _minTokensToBuy, address _paymentWallet ) external initializer { require(_oracle != address(0), 'Zero aggregator address'); require(_usdt != address(0), 'Zero USDT address'); require(_usdc != address(0), 'Zero USDC address'); require(_dai != address(0), 'Zero DAI address'); __Pausable_init_unchained(); __Ownable_init_unchained(_msgSender()); __ReentrancyGuard_init_unchained(); baseScale = 18; baseDecimals = (10 ** baseScale); aggregatorInterface = _oracle; USDTtoken = _usdt; USDCtoken = _usdc; DAItoken = _dai; rounds = _rounds; maxTokensToBuy = _maxTokensToBuy > _rounds[0][0] ? _rounds[0][0] : _maxTokensToBuy; minTokensToBuy = _minTokensToBuy >= _maxTokensToBuy ? 0 : _minTokensToBuy; paymentWallet = _paymentWallet; dynamicTimeFlag = true; timeConstant = _timeConstant; usdTokenDecimals[0] = 6; //USDT usdTokenDecimals[1] = 6; //USDC usdTokenDecimals[2] = 18; //DAI } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function calculatePrice(uint256 _amount) public view returns (uint256) { uint256 usdAmount; bool isLastRound = currentStep >= rounds[0].length - 1; uint256 total = (isLastRound || checkPoint == 0) ? totalTokensSold : checkPoint; if ( !isLastRound && (_amount + total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) ) { if (block.timestamp >= rounds[2][currentStep]) { require( rounds[0][currentStep] + _amount <= rounds[0][currentStep + 1], 'Cant purchase more in one transaction' ); usdAmount = _amount * rounds[1][currentStep + 1]; } else { uint256 tokenAmountForCurrentPrice = rounds[0][currentStep] - total; uint256 tokenAmountForNextPrice = _amount - tokenAmountForCurrentPrice; usdAmount = tokenAmountForCurrentPrice * rounds[1][currentStep] + tokenAmountForNextPrice * rounds[1][currentStep + 1]; } } else { usdAmount = _amount * rounds[1][currentStep]; } return usdAmount; } function getLatestPrice() public view returns (uint256) { (, int256 price, , , ) = IAggregator(aggregatorInterface) .latestRoundData(); price = (price * (10 ** 10)); return uint256(price); } function manageRounds(uint256 amount) private { uint256 totalBefore = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; totalTokensSold += amount; if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if ( currentStep < (rounds[0].length - 1) && (total >= rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) ) { uint256 unsoldTokens = total >= rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total; if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; unsoldTokens = totalBefore >= rounds[0][currentStep] ? 0 : rounds[0][currentStep] - totalBefore; } if (dynamicTimeFlag) manageTimeDiff(); remainingTokensTracker.push(unsoldTokens); currentStep += 1; } } modifier checkSaleState(uint256 amount) { require( amount >= minTokensToBuy && amount <= maxTokensToBuy && totalTokensSold + amount <= rounds[0][rounds[0].length - 1], 'Invalid sale amount' ); _; } function buyWithUSD( uint256 amount, uint256 purchaseToken ) external checkSaleState(amount) whenNotPaused { require( usdTokenDecimals[purchaseToken] != 0, 'Incorrect USD token provided' ); uint256 usdPrice = calculatePrice(amount); uint256 price = usdPrice / getDecimalsDivider(usdTokenDecimals[purchaseToken]); manageRounds(amount); userDeposits[_msgSender()] += (amount * baseDecimals); usdRaised += usdPrice; IERC20 usdInterface; if (purchaseToken == 0) usdInterface = IERC20(USDTtoken); else if (purchaseToken == 1) usdInterface = IERC20(USDCtoken); else if (purchaseToken == 2) usdInterface = IERC20(DAItoken); else revert('Incorrect USD token provided'); uint256 ourAllowance = usdInterface.allowance( _msgSender(), address(this) ); require(price <= ourAllowance, 'Make sure to add enough allowance'); (bool success, ) = address(usdInterface).call( abi.encodeWithSignature( 'transferFrom(address,address,uint256)', _msgSender(), paymentWallet, price ) ); require(success, 'Token payment failed'); emit TokensBought( _msgSender(), amount, address(usdInterface), price, usdPrice, block.timestamp ); } function buyWithETH( uint256 amount ) external payable checkSaleState(amount) whenNotPaused nonReentrant { uint256 usdPrice = calculatePrice(amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, 'Less payment'); uint256 excess = msg.value - ethAmount; manageRounds(amount); userDeposits[_msgSender()] += (amount * baseDecimals); usdRaised += usdPrice; sendValue(payable(paymentWallet), ethAmount); if (excess > 0) sendValue(payable(_msgSender()), excess); emit TokensBought( _msgSender(), amount, address(0), ethAmount, usdPrice, block.timestamp ); } function ethBuyHelper( uint256 amount ) external view returns (uint256 ethAmount) { uint256 usdPrice = calculatePrice(amount); ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); } function usdBuyHelper( uint256 amount, uint256 purchaseToken ) external view returns (uint256 usdPrice) { require( usdTokenDecimals[purchaseToken] != 0, 'Incorrect USD token provided' ); usdPrice = calculatePrice(amount); usdPrice = usdPrice / getDecimalsDivider(usdTokenDecimals[purchaseToken]); } function claim() external whenNotPaused { require(saleToken != address(0), 'Sale token not added'); require(block.timestamp >= claimStart, 'Claim has not started yet'); uint256 amount = userDeposits[_msgSender()]; require(amount > 0, 'Nothing to claim'); delete userDeposits[_msgSender()]; bool success = IERC20(saleToken).transfer(_msgSender(), amount); require(success, 'Token transfer failed'); emit TokensClaimed(_msgSender(), amount, block.timestamp); } function getDecimalsDivider( uint256 decimals ) internal view returns (uint256) { if (baseDecimals > (10 ** decimals)) return (10 ** (baseScale - decimals)); else return 1; } 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'); } function changeMaxTokensToBuy(uint256 _maxTokensToBuy) external onlyOwner { require( _maxTokensToBuy > 0 && _maxTokensToBuy <= rounds[0][0], 'Zero max tokens to buy value' ); maxTokensToBuy = _maxTokensToBuy; } function changeMinTokensToBuy(uint256 _minTokensToBuy) external onlyOwner { require( _minTokensToBuy >= 0 && _minTokensToBuy < maxTokensToBuy, 'Invalid min tokens to buy value' ); minTokensToBuy = _minTokensToBuy; } function startClaim( uint256 _claimStart, uint256 amountOfTokens, address _saleToken ) external onlyOwner { require(_saleToken != address(0), 'Zero token address'); require(claimStart == 0, 'Claim already set'); claimStart = _claimStart; saleToken = _saleToken; bool success = IERC20(saleToken).transferFrom( _msgSender(), address(this), amountOfTokens ); require(success, 'Token transfer failed'); emit TokensAdded(saleToken, amountOfTokens, block.timestamp); } function changeClaimStart(uint256 _claimStart) external onlyOwner { require(claimStart > 0, 'Initial claim data not set'); claimStart = _claimStart; } function changeRoundsData(uint256[][3] memory _rounds) external onlyOwner { rounds = _rounds; } function changePaymentWallet(address _newPaymentWallet) external onlyOwner { require(_newPaymentWallet != address(0), 'Address cannot be zero'); paymentWallet = _newPaymentWallet; } function manageTimeDiff() internal { for (uint256 i; i < rounds[2].length - currentStep; i++) { rounds[2][currentStep + i] = block.timestamp + i * timeConstant; } } function setTimeConstant(uint256 _timeConstant) external onlyOwner { timeConstant = _timeConstant; } function updateUserDeposits( address[] calldata _users, uint256[] calldata _userDeposits ) external onlyOwner { require(_users.length == _userDeposits.length, 'Length mismatch'); for (uint256 i = 0; i < _users.length; i++) { userDeposits[_users[i]] += _userDeposits[i]; } } function incrementCurrentStep() external onlyOwner { require( currentStep < (rounds[0].length - 1), 'Current round is the last one' ); if (dynamicTimeFlag) manageTimeDiff(); if (checkPoint < rounds[0][currentStep]) { uint256 sub = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; remainingTokensTracker.push(rounds[0][currentStep] - sub); checkPoint = rounds[0][currentStep]; } currentStep++; emit StepIncremented(currentStep, block.timestamp); } function setDynamicTimeFlag(bool _dynamicTimeFlag) external onlyOwner { dynamicTimeFlag = _dynamicTimeFlag; } function setCurrentStep( uint256 _step, uint256 _checkpoint ) external onlyOwner { currentStep = _step; checkPoint = _checkpoint; } function trackRemainingTokens() external view returns (uint256[] memory) { return remainingTokensTracker; } function setRemainingTokensArray( uint256[] memory _unsoldTokens ) public onlyOwner { require(_unsoldTokens.length != 0, 'cannot update invalid values'); delete remainingTokensTracker; for (uint256 i; i < _unsoldTokens.length; i++) { remainingTokensTracker.push(_unsoldTokens[i]); } } function roundDetails( uint256 _no ) external view returns (uint256[] memory) { return rounds[_no]; } function withdrawTokens(address token, uint256 amount) external onlyOwner { IERC20(token).transfer(paymentWallet, amount); } function withdrawEthers() external onlyOwner { (bool success, ) = paymentWallet.call{value: address(this).balance}(''); require(success, 'Failed to withdraw'); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; import {Initializable} from "../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. * * The initial owner is set to the address provided by the deployer. 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 { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @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] * ```solidity * 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 Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 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 in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._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 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._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() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @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 { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; import {Initializable} from "../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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; import {Initializable} from "../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 { /// @custom:storage-location erc7201:openzeppelin.storage.Pausable struct PausableStorage { bool _paused; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300; function _getPausableStorage() private pure returns (PausableStorage storage $) { assembly { $.slot := PausableStorageLocation } } /** * @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); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { PausableStorage storage $ = _getPausableStorage(); $._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) { PausableStorage storage $ = _getPausableStorage(); return $._paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; import {Initializable} from "../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; /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard struct ReentrancyGuardStorage { uint256 _status; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) { assembly { $.slot := ReentrancyGuardStorageLocation } } /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); $._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 { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); // On the first call to nonReentrant, _status will be NOT_ENTERED if ($._status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail $._status = ENTERED; } function _nonReentrantAfter() private { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) $._status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); return $._status == ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"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":"newStep","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StepIncremented","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":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":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":"DAItoken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDCtoken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDTtoken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregatorInterface","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseScale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"purchaseToken","type":"uint256"}],"name":"buyWithUSD","outputs":[],"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensToBuy","type":"uint256"}],"name":"changeMaxTokensToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokensToBuy","type":"uint256"}],"name":"changeMinTokensToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPaymentWallet","type":"address"}],"name":"changePaymentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[][3]","name":"_rounds","type":"uint256[][3]"}],"name":"changeRoundsData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicTimeFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"incrementCurrentStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_dai","type":"address"},{"internalType":"uint256[][3]","name":"_rounds","type":"uint256[][3]"},{"internalType":"uint256","name":"_timeConstant","type":"uint256"},{"internalType":"uint256","name":"_maxTokensToBuy","type":"uint256"},{"internalType":"uint256","name":"_minTokensToBuy","type":"uint256"},{"internalType":"address","name":"_paymentWallet","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTokensToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_no","type":"uint256"}],"name":"roundDetails","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"},{"internalType":"uint256","name":"_checkpoint","type":"uint256"}],"name":"setCurrentStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_dynamicTimeFlag","type":"bool"}],"name":"setDynamicTimeFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_unsoldTokens","type":"uint256[]"}],"name":"setRemainingTokensArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeConstant","type":"uint256"}],"name":"setTimeConstant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"},{"internalType":"uint256","name":"amountOfTokens","type":"uint256"},{"internalType":"address","name":"_saleToken","type":"address"}],"name":"startClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeConstant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trackRemainingTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_userDeposits","type":"uint256[]"}],"name":"updateUserDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"purchaseToken","type":"uint256"}],"name":"usdBuyHelper","outputs":[{"internalType":"uint256","name":"usdPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usdTokenDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b507ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03166000811580156200005d5750825b90506000826001600160401b031660011480156200007a5750303b155b90508115801562000089575080155b15620000a85760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b03191660011785558315620000d757845460ff60401b1916680100000000000000001785555b83156200011e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050506130c780620001336000396000f3fe6080604052600436106102935760003560e01c8063740730401161015a578063bf2ef7a3116100c1578063e0f106d21161007a578063e0f106d21461079d578063e985e367146107bd578063eadd94ec146107dd578063ee20aeaa146107f3578063f04d688f14610820578063f2fde38b1461083657600080fd5b8063bf2ef7a3146106f2578063c49cc64514610712578063c8adff0114610732578063cad0055614610747578063cff805ab14610767578063df5bc83b1461077d57600080fd5b80639a89c1fb116101135780639a89c1fb1461062f5780639cfa0f7c1461064f578063a6d42e4e14610665578063ae10426514610685578063b2caaebd146106a5578063ba166a39146106c557600080fd5b806374073040146105755780638456cb59146105955780638da5cb5b146105aa5780638e15f473146105e757806394dc9cf3146105fc57806399f029351461060f57600080fd5b80633f4ba83a116101fe5780635bc34f71116101b75780635bc34f71146104e55780635c975abb146104fb57806363b2011714610520578063641046f414610536578063687e6f441461054b578063715018a61461056057600080fd5b80633f4ba83a146104375780634185e5071461044c57806343568eae1461048457806344c1e5eb1461049a578063484c3766146104b05780634e71d92d146104d057600080fd5b8063242b9ab011610250578063242b9ab01461038b578063278c278b146103ab57806329a5a0b6146103cb5780632dc358e8146103eb57806333f761781461040b5780633b574beb1461042157600080fd5b806306b091f91461029857806307f18082146102ba5780630a200fc7146102da5780630ba36dcd146102fa5780631fa2bc921461033a57806323a8f1c01461036b575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612969565b610856565b005b3480156102c657600080fd5b506102b86102d5366004612993565b6108da565b3480156102e657600080fd5b506102b86102f53660046129ba565b61093e565b34801561030657600080fd5b506103276103153660046129d7565b60146020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561034657600080fd5b5060135461035b90600160a01b900460ff1681565b6040519015158152602001610331565b34801561037757600080fd5b506102b8610386366004612993565b610964565b34801561039757600080fd5b506102b86103a6366004612993565b610971565b3480156103b757600080fd5b506102b86103c6366004612993565b6109cf565b3480156103d757600080fd5b506103276103e6366004612993565b610a55565b3480156103f757600080fd5b506102b8610406366004612aa6565b610a89565b34801561041757600080fd5b5061032760035481565b34801561042d57600080fd5b5061032760055481565b34801561044357600080fd5b506102b8610b3d565b34801561045857600080fd5b5060115461046c906001600160a01b031681565b6040516001600160a01b039091168152602001610331565b34801561049057600080fd5b5061032760095481565b3480156104a657600080fd5b5061032760025481565b3480156104bc57600080fd5b506102b86104cb366004612b71565b610b4f565b3480156104dc57600080fd5b506102b8610f75565b3480156104f157600080fd5b5061032760065481565b34801561050757600080fd5b506000805160206130728339815191525460ff1661035b565b34801561052c57600080fd5b5061032760005481565b34801561054257600080fd5b506102b8611183565b34801561055757600080fd5b506102b8611307565b34801561056c57600080fd5b506102b86113aa565b34801561058157600080fd5b5060105461046c906001600160a01b031681565b3480156105a157600080fd5b506102b86113bc565b3480156105b657600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661046c565b3480156105f357600080fd5b506103276113cc565b6102b861060a366004612993565b611463565b34801561061b57600080fd5b506102b861062a366004612c1f565b611676565b34801561063b57600080fd5b506102b861064a366004612c1f565b611a5b565b34801561065b57600080fd5b5061032760045481565b34801561067157600080fd5b506102b8610680366004612c41565b611a6e565b34801561069157600080fd5b506103276106a0366004612993565b611a83565b3480156106b157600080fd5b506102b86106c0366004612c76565b611d49565b3480156106d157600080fd5b506106e56106e0366004612993565b611f17565b6040516103319190612cab565b3480156106fe57600080fd5b506102b861070d366004612d3b565b611f83565b34801561071e57600080fd5b5060135461046c906001600160a01b031681565b34801561073e57600080fd5b506106e561205e565b34801561075357600080fd5b506102b86107623660046129d7565b6120b6565b34801561077357600080fd5b5061032760075481565b34801561078957600080fd5b50610327610798366004612c1f565b61212f565b3480156107a957600080fd5b5060125461046c906001600160a01b031681565b3480156107c957600080fd5b50600e5461046c906001600160a01b031681565b3480156107e957600080fd5b5061032760085481565b3480156107ff57600080fd5b5061032761080e366004612993565b60156020526000908152604090205481565b34801561082c57600080fd5b5061032760015481565b34801561084257600080fd5b506102b86108513660046129d7565b61218a565b61085e6121c5565b600f5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156108b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d59190612da7565b505050565b6108e26121c5565b6000600154116109395760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b600155565b6109466121c5565b60138054911515600160a01b0260ff60a01b19909216919091179055565b61096c6121c5565b600955565b6109796121c5565b60045481106109ca5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964206d696e20746f6b656e7320746f206275792076616c7565006044820152606401610930565b600555565b6109d76121c5565b600081118015610a045750600a80546000906109f5576109f5612dc4565b90600052602060002001548111155b610a505760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610930565b600455565b600080610a6183611a83565b9050610a6b6113cc565b600354610a789083612df0565b610a829190612e07565b9392505050565b610a916121c5565b8051600003610ae25760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f742075706461746520696e76616c69642076616c756573000000006044820152606401610930565b610aee600d600061286b565b60005b8151811015610b3957600d828281518110610b0e57610b0e612dc4565b6020908102919091018101518254600181810185556000948552929093209092019190915501610af1565b5050565b610b456121c5565b610b4d612220565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610b955750825b905060008267ffffffffffffffff166001148015610bb25750303b155b905081158015610bc0575080155b15610bde5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0857845460ff60401b1916600160401b1785555b6001600160a01b038e16610c5e5760405162461bcd60e51b815260206004820152601760248201527f5a65726f2061676772656761746f7220616464726573730000000000000000006044820152606401610930565b6001600160a01b038d16610ca85760405162461bcd60e51b81526020600482015260116024820152705a65726f2055534454206164647265737360781b6044820152606401610930565b6001600160a01b038c16610cf25760405162461bcd60e51b81526020600482015260116024820152705a65726f2055534443206164647265737360781b6044820152606401610930565b6001600160a01b038b16610d3b5760405162461bcd60e51b815260206004820152601060248201526f5a65726f20444149206164647265737360801b6044820152606401610930565b610d43612280565b610d4c336122a1565b610d546122a9565b60126002819055610d6690600a612f0d565b6003819055508d601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055508c601060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b601160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555089600a906003610e19929190612889565b5089518051600090610e2d57610e2d612dc4565b60200260200101518811610e415787610e5d565b89518051600090610e5457610e54612dc4565b60200260200101515b60045587871015610e6e5786610e71565b60005b600555600f80546001600160a01b0388166001600160a01b03199091161790556013805460ff60a01b1916600160a01b1790556009899055601560205260067fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed8190557f27739e4bb5e6f8b5e4b57a047dca8767cc9b982a011081e086cbb0dfa9de818d55600260005260127f07d4ff730d9753101d832555708a37d38c2c45fce8cacaefc99f06074e93fe0b558315610f6557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050505050565b610f7d6122d7565b600e546001600160a01b0316610fcc5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610930565b60015442101561101e5760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f74207374617274656420796574000000000000006044820152606401610930565b336000908152601460205260409020548061106e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610930565b336000818152601460209081526040808320839055600e54815163a9059cbb60e01b8152600481019590955260248501869052905192936001600160a01b039091169263a9059cbb92604480840193919291829003018187875af11580156110da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fe9190612da7565b9050806111455760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610930565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a25050565b61118b6121c5565b600a5461119a90600190612f19565b600654106111ea5760405162461bcd60e51b815260206004820152601d60248201527f43757272656e7420726f756e6420697320746865206c617374206f6e650000006044820152606401610930565b601354600160a01b900460ff161561120457611204612308565b600a6000016006548154811061121c5761121c612dc4565b906000526020600020015460075410156112b55760006007546000541161124557600754611249565b6000545b9050600d81600a6000016006548154811061126657611266612dc4565b906000526020600020015461127b9190612f19565b81546001810183556000928352602083200155600a01600654815481106112a4576112a4612dc4565b600091825260209091200154600755505b600680549060006112c583612f2c565b9091555050600654604080519182524260208301527f809ad8b3f3a3498b814a6b179d3e4b6f212c7830909b1e71aef9d637dd336ce7910160405180910390a1565b61130f6121c5565b600f546040516000916001600160a01b03169047908381818185875af1925050503d806000811461135c576040519150601f19603f3d011682016040523d82523d6000602084013e611361565b606091505b50509050806113a75760405162461bcd60e51b81526020600482015260126024820152714661696c656420746f20776974686472617760701b6044820152606401610930565b50565b6113b26121c5565b610b4d600061236e565b6113c46121c5565b610b4d6123df565b600080601360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114469190612f5f565b505050915050806402540be40061145d9190612faf565b92915050565b80600554811015801561147857506004548111155b80156114bb5750600a805461148f90600190612f19565b8154811061149f5761149f612dc4565b9060005260206000200154816000546114b89190612fdf565b11155b6114fd5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b6044820152606401610930565b6115056122d7565b61150d612428565b600061151883611a83565b905060006115246113cc565b6003546115319084612df0565b61153b9190612e07565b90508034101561157c5760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610930565b60006115888234612f19565b905061159385612472565b6003546115a09086612df0565b33600090815260146020526040812080549091906115bf908490612fdf565b9250508190555082600860008282546115d89190612fdf565b9091555050600f546115f3906001600160a01b0316836126e0565b80156116035761160333826126e0565b604080518381526020810185905242818301529051600091879133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a4505050610b3960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b81600554811015801561168b57506004548111155b80156116ce5750600a80546116a290600190612f19565b815481106116b2576116b2612dc4565b9060005260206000200154816000546116cb9190612fdf565b11155b6117105760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b6044820152606401610930565b6117186122d7565b60008281526015602052604081205490036117455760405162461bcd60e51b815260040161093090612ff2565b600061175084611a83565b6000848152601560205260408120549192509061176c906127b6565b6117769083612e07565b905061178185612472565b60035461178e9086612df0565b33600090815260146020526040812080549091906117ad908490612fdf565b9250508190555081600860008282546117c69190612fdf565b90915550600090508481036117e757506010546001600160a01b0316611833565b8460010361180157506011546001600160a01b0316611833565b8460020361181b57506012546001600160a01b0316611833565b60405162461bcd60e51b815260040161093090612ff2565b60006001600160a01b03821663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190613029565b90508083111561190f5760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610930565b60006001600160a01b03831633600f546040516001600160a01b039283166024820152911660448201526064810186905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516119789190613042565b6000604051808303816000865af19150503d80600081146119b5576040519150601f19603f3d011682016040523d82523d6000602084013e6119ba565b606091505b5050905080611a025760405162461bcd60e51b8152602060048201526014602482015273151bdad95b881c185e5b595b9d0819985a5b195960621b6044820152606401610930565b6040805185815260208101879052428183015290516001600160a01b038516918a9133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a45050505050505050565b611a636121c5565b600691909155600755565b611a766121c5565b610b39600a826003612889565b600080806001600a820154611a989190612f19565b6006541015905060008180611aad5750600754155b611ab957600754611abd565b6000545b905081158015611b255750600a60000160065481548110611ae057611ae0612dc4565b90600052602060002001548186611af79190612fdf565b1180611b255750600a60020160065481548110611b1657611b16612dc4565b90600052602060002001544210155b15611d0f57600a60020160065481548110611b4257611b42612dc4565b90600052602060002001544210611c5757600654600a90611b64906001612fdf565b81548110611b7457611b74612dc4565b906000526020600020015485600a600060038110611b9457611b94612dc4565b0160065481548110611ba857611ba8612dc4565b9060005260206000200154611bbd9190612fdf565b1115611c195760405162461bcd60e51b815260206004820152602560248201527f43616e74207075726368617365206d6f726520696e206f6e65207472616e736160448201526431ba34b7b760d91b6064820152608401610930565b600654600b90611c2a906001612fdf565b81548110611c3a57611c3a612dc4565b906000526020600020015485611c509190612df0565b9250611d40565b600081600a820160065481548110611c7157611c71612dc4565b9060005260206000200154611c869190612f19565b90506000611c948288612f19565b600654909150600b90611ca8906001612fdf565b81548110611cb857611cb8612dc4565b906000526020600020015481611cce9190612df0565b600a60010160065481548110611ce657611ce6612dc4565b906000526020600020015483611cfc9190612df0565b611d069190612fdf565b94505050611d40565b600a60010160065481548110611d2757611d27612dc4565b906000526020600020015485611d3d9190612df0565b92505b50909392505050565b611d516121c5565b6001600160a01b038116611d9c5760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610930565b60015415611de05760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610930565b6001839055600e80546001600160a01b0319166001600160a01b0383169081179091556000906323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018690526064016020604051808303816000875af1158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e839190612da7565b905080611eca5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610930565b600e54604080518581524260208201526001600160a01b03909216917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a250505050565b6060600a8260038110611f2c57611f2c612dc4565b01805480602002602001604051908101604052809291908181526020018280548015611f7757602002820191906000526020600020905b815481526020019060010190808311611f63575b50505050509050919050565b611f8b6121c5565b828114611fcc5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610930565b60005b8381101561205757828282818110611fe957611fe9612dc4565b905060200201356014600087878581811061200657612006612dc4565b905060200201602081019061201b91906129d7565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461204a9190612fdf565b9091555050600101611fcf565b5050505050565b6060600d8054806020026020016040519081016040528092919081815260200182805480156120ac57602002820191906000526020600020905b815481526020019060010190808311612098575b5050505050905090565b6120be6121c5565b6001600160a01b03811661210d5760405162461bcd60e51b8152602060048201526016602482015275416464726573732063616e6e6f74206265207a65726f60501b6044820152606401610930565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260156020526040812054810361215c5760405162461bcd60e51b815260040161093090612ff2565b61216583611a83565b600083815260156020526040902054909150612180906127b6565b610a829082612e07565b6121926121c5565b6001600160a01b0381166121bc57604051631e4fbdf760e01b815260006004820152602401610930565b6113a78161236e565b336121f77f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b4d5760405163118cdaa760e01b8152336004820152602401610930565b6122286127f2565b600080516020613072833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b612288612822565b600080516020613072833981519152805460ff19169055565b612192612822565b6122b1612822565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6000805160206130728339815191525460ff1615610b4d5760405163d93c066560e01b815260040160405180910390fd5b60005b600654600c5461231b9190612f19565b8110156113a75760095461232f9082612df0565b6123399042612fdf565b600654600c9061234a908490612fdf565b8154811061235a5761235a612dc4565b60009182526020909120015560010161230b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6123e76122d7565b600080516020613072833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612262565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161246c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6000600754600054116124875760075461248b565b6000545b90508160008082825461249e9190612fdf565b9091555050600754156124c35781600760008282546124bd9190612fdf565b90915550505b6000600754600054116124d8576007546124dc565b6000545b600a549091506124ee90600190612f19565b60065410801561254c5750600a6000016006548154811061251157612511612dc4565b90600052602060002001548110158061254c5750600a6002016006548154811061253d5761253d612dc4565b90600052602060002001544210155b156108d5576000600a81016006548154811061256a5761256a612dc4565b90600052602060002001548210156125af5781600a6000016006548154811061259557612595612dc4565b90600052602060002001546125aa9190612f19565b6125b2565b60005b9050600a600201600654815481106125cc576125cc612dc4565b906000526020600020015442106126715783600a600001600654815481106125f6576125f6612dc4565b906000526020600020015461260b9190612fdf565b600755600a6000016006548154811061262657612626612dc4565b906000526020600020015483101561266b5782600a6000016006548154811061265157612651612dc4565b90600052602060002001546126669190612f19565b61266e565b60005b90505b601354600160a01b900460ff161561268b5761268b612308565b600d80546001818101835560009283527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb590910183905560068054919290916126d5908490612fdf565b909155505050505050565b8047101561271e5760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610930565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461276b576040519150601f19603f3d011682016040523d82523d6000602084013e612770565b606091505b50509050806108d55760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610930565b60006127c382600a612f0d565b60035411156127e557816002546127da9190612f19565b61145d90600a612f0d565b506001919050565b919050565b6000805160206130728339815191525460ff16610b4d57604051638dfc202b60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b4d57604051631afcd79f60e31b815260040160405180910390fd5b50805460008255906000526020600020908101906113a791906128d9565b82600381019282156128c9579160200282015b828111156128c957825180516128b99184916020909101906128ee565b509160200191906001019061289c565b506128d5929150612935565b5090565b5b808211156128d557600081556001016128da565b828054828255906000526020600020908101928215612929579160200282015b8281111561292957825182559160200191906001019061290e565b506128d59291506128d9565b808211156128d5576000612949828261286b565b50600101612935565b80356001600160a01b03811681146127ed57600080fd5b6000806040838503121561297c57600080fd5b61298583612952565b946020939093013593505050565b6000602082840312156129a557600080fd5b5035919050565b80151581146113a757600080fd5b6000602082840312156129cc57600080fd5b8135610a82816129ac565b6000602082840312156129e957600080fd5b610a8282612952565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612a1957600080fd5b8135602067ffffffffffffffff80831115612a3657612a366129f2565b8260051b604051601f19603f83011681018181108482111715612a5b57612a5b6129f2565b6040529384526020818701810194908101925087851115612a7b57600080fd5b6020870191505b84821015612a9b57813583529183019190830190612a82565b979650505050505050565b600060208284031215612ab857600080fd5b813567ffffffffffffffff811115612acf57600080fd5b612adb84828501612a08565b949350505050565b600082601f830112612af457600080fd5b6040516060810167ffffffffffffffff8282108183111715612b1857612b186129f2565b816040528291506060850186811115612b3057600080fd5b855b81811015612b6557803583811115612b4a5760008081fd5b612b5689828a01612a08565b85525060209384019301612b32565b50929695505050505050565b60008060008060008060008060006101208a8c031215612b9057600080fd5b612b998a612952565b9850612ba760208b01612952565b9750612bb560408b01612952565b9650612bc360608b01612952565b955060808a013567ffffffffffffffff811115612bdf57600080fd5b612beb8c828d01612ae3565b95505060a08a0135935060c08a0135925060e08a01359150612c106101008b01612952565b90509295985092959850929598565b60008060408385031215612c3257600080fd5b50508035926020909101359150565b600060208284031215612c5357600080fd5b813567ffffffffffffffff811115612c6a57600080fd5b612adb84828501612ae3565b600080600060608486031215612c8b57600080fd5b8335925060208401359150612ca260408501612952565b90509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612ce357835183529284019291840191600101612cc7565b50909695505050505050565b60008083601f840112612d0157600080fd5b50813567ffffffffffffffff811115612d1957600080fd5b6020830191508360208260051b8501011115612d3457600080fd5b9250929050565b60008060008060408587031215612d5157600080fd5b843567ffffffffffffffff80821115612d6957600080fd5b612d7588838901612cef565b90965094506020870135915080821115612d8e57600080fd5b50612d9b87828801612cef565b95989497509550505050565b600060208284031215612db957600080fd5b8151610a82816129ac565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761145d5761145d612dda565b600082612e2457634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e64578160001904821115612e4a57612e4a612dda565b80851615612e5757918102915b93841c9390800290612e2e565b509250929050565b600082612e7b5750600161145d565b81612e885750600061145d565b8160018114612e9e5760028114612ea857612ec4565b600191505061145d565b60ff841115612eb957612eb9612dda565b50506001821b61145d565b5060208310610133831016604e8410600b8410161715612ee7575081810a61145d565b612ef18383612e29565b8060001904821115612f0557612f05612dda565b029392505050565b6000610a828383612e6c565b8181038181111561145d5761145d612dda565b600060018201612f3e57612f3e612dda565b5060010190565b805169ffffffffffffffffffff811681146127ed57600080fd5b600080600080600060a08688031215612f7757600080fd5b612f8086612f45565b9450602086015193506040860151925060608601519150612fa360808701612f45565b90509295509295909350565b80820260008212600160ff1b84141615612fcb57612fcb612dda565b818105831482151761145d5761145d612dda565b8082018082111561145d5761145d612dda565b6020808252601c908201527f496e636f72726563742055534420746f6b656e2070726f766964656400000000604082015260600190565b60006020828403121561303b57600080fd5b5051919050565b6000825160005b818110156130635760208186018101518583015201613049565b50600092019182525091905056fecd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a26469706673582212205c0d1d8802a773550c56d47e20189375c74d32835926663ddeb5344d626fc21a64736f6c63430008180033
Deployed Bytecode
0x6080604052600436106102935760003560e01c8063740730401161015a578063bf2ef7a3116100c1578063e0f106d21161007a578063e0f106d21461079d578063e985e367146107bd578063eadd94ec146107dd578063ee20aeaa146107f3578063f04d688f14610820578063f2fde38b1461083657600080fd5b8063bf2ef7a3146106f2578063c49cc64514610712578063c8adff0114610732578063cad0055614610747578063cff805ab14610767578063df5bc83b1461077d57600080fd5b80639a89c1fb116101135780639a89c1fb1461062f5780639cfa0f7c1461064f578063a6d42e4e14610665578063ae10426514610685578063b2caaebd146106a5578063ba166a39146106c557600080fd5b806374073040146105755780638456cb59146105955780638da5cb5b146105aa5780638e15f473146105e757806394dc9cf3146105fc57806399f029351461060f57600080fd5b80633f4ba83a116101fe5780635bc34f71116101b75780635bc34f71146104e55780635c975abb146104fb57806363b2011714610520578063641046f414610536578063687e6f441461054b578063715018a61461056057600080fd5b80633f4ba83a146104375780634185e5071461044c57806343568eae1461048457806344c1e5eb1461049a578063484c3766146104b05780634e71d92d146104d057600080fd5b8063242b9ab011610250578063242b9ab01461038b578063278c278b146103ab57806329a5a0b6146103cb5780632dc358e8146103eb57806333f761781461040b5780633b574beb1461042157600080fd5b806306b091f91461029857806307f18082146102ba5780630a200fc7146102da5780630ba36dcd146102fa5780631fa2bc921461033a57806323a8f1c01461036b575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612969565b610856565b005b3480156102c657600080fd5b506102b86102d5366004612993565b6108da565b3480156102e657600080fd5b506102b86102f53660046129ba565b61093e565b34801561030657600080fd5b506103276103153660046129d7565b60146020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561034657600080fd5b5060135461035b90600160a01b900460ff1681565b6040519015158152602001610331565b34801561037757600080fd5b506102b8610386366004612993565b610964565b34801561039757600080fd5b506102b86103a6366004612993565b610971565b3480156103b757600080fd5b506102b86103c6366004612993565b6109cf565b3480156103d757600080fd5b506103276103e6366004612993565b610a55565b3480156103f757600080fd5b506102b8610406366004612aa6565b610a89565b34801561041757600080fd5b5061032760035481565b34801561042d57600080fd5b5061032760055481565b34801561044357600080fd5b506102b8610b3d565b34801561045857600080fd5b5060115461046c906001600160a01b031681565b6040516001600160a01b039091168152602001610331565b34801561049057600080fd5b5061032760095481565b3480156104a657600080fd5b5061032760025481565b3480156104bc57600080fd5b506102b86104cb366004612b71565b610b4f565b3480156104dc57600080fd5b506102b8610f75565b3480156104f157600080fd5b5061032760065481565b34801561050757600080fd5b506000805160206130728339815191525460ff1661035b565b34801561052c57600080fd5b5061032760005481565b34801561054257600080fd5b506102b8611183565b34801561055757600080fd5b506102b8611307565b34801561056c57600080fd5b506102b86113aa565b34801561058157600080fd5b5060105461046c906001600160a01b031681565b3480156105a157600080fd5b506102b86113bc565b3480156105b657600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661046c565b3480156105f357600080fd5b506103276113cc565b6102b861060a366004612993565b611463565b34801561061b57600080fd5b506102b861062a366004612c1f565b611676565b34801561063b57600080fd5b506102b861064a366004612c1f565b611a5b565b34801561065b57600080fd5b5061032760045481565b34801561067157600080fd5b506102b8610680366004612c41565b611a6e565b34801561069157600080fd5b506103276106a0366004612993565b611a83565b3480156106b157600080fd5b506102b86106c0366004612c76565b611d49565b3480156106d157600080fd5b506106e56106e0366004612993565b611f17565b6040516103319190612cab565b3480156106fe57600080fd5b506102b861070d366004612d3b565b611f83565b34801561071e57600080fd5b5060135461046c906001600160a01b031681565b34801561073e57600080fd5b506106e561205e565b34801561075357600080fd5b506102b86107623660046129d7565b6120b6565b34801561077357600080fd5b5061032760075481565b34801561078957600080fd5b50610327610798366004612c1f565b61212f565b3480156107a957600080fd5b5060125461046c906001600160a01b031681565b3480156107c957600080fd5b50600e5461046c906001600160a01b031681565b3480156107e957600080fd5b5061032760085481565b3480156107ff57600080fd5b5061032761080e366004612993565b60156020526000908152604090205481565b34801561082c57600080fd5b5061032760015481565b34801561084257600080fd5b506102b86108513660046129d7565b61218a565b61085e6121c5565b600f5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156108b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d59190612da7565b505050565b6108e26121c5565b6000600154116109395760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b600155565b6109466121c5565b60138054911515600160a01b0260ff60a01b19909216919091179055565b61096c6121c5565b600955565b6109796121c5565b60045481106109ca5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964206d696e20746f6b656e7320746f206275792076616c7565006044820152606401610930565b600555565b6109d76121c5565b600081118015610a045750600a80546000906109f5576109f5612dc4565b90600052602060002001548111155b610a505760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610930565b600455565b600080610a6183611a83565b9050610a6b6113cc565b600354610a789083612df0565b610a829190612e07565b9392505050565b610a916121c5565b8051600003610ae25760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f742075706461746520696e76616c69642076616c756573000000006044820152606401610930565b610aee600d600061286b565b60005b8151811015610b3957600d828281518110610b0e57610b0e612dc4565b6020908102919091018101518254600181810185556000948552929093209092019190915501610af1565b5050565b610b456121c5565b610b4d612220565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610b955750825b905060008267ffffffffffffffff166001148015610bb25750303b155b905081158015610bc0575080155b15610bde5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0857845460ff60401b1916600160401b1785555b6001600160a01b038e16610c5e5760405162461bcd60e51b815260206004820152601760248201527f5a65726f2061676772656761746f7220616464726573730000000000000000006044820152606401610930565b6001600160a01b038d16610ca85760405162461bcd60e51b81526020600482015260116024820152705a65726f2055534454206164647265737360781b6044820152606401610930565b6001600160a01b038c16610cf25760405162461bcd60e51b81526020600482015260116024820152705a65726f2055534443206164647265737360781b6044820152606401610930565b6001600160a01b038b16610d3b5760405162461bcd60e51b815260206004820152601060248201526f5a65726f20444149206164647265737360801b6044820152606401610930565b610d43612280565b610d4c336122a1565b610d546122a9565b60126002819055610d6690600a612f0d565b6003819055508d601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055508c601060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b601160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555089600a906003610e19929190612889565b5089518051600090610e2d57610e2d612dc4565b60200260200101518811610e415787610e5d565b89518051600090610e5457610e54612dc4565b60200260200101515b60045587871015610e6e5786610e71565b60005b600555600f80546001600160a01b0388166001600160a01b03199091161790556013805460ff60a01b1916600160a01b1790556009899055601560205260067fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed8190557f27739e4bb5e6f8b5e4b57a047dca8767cc9b982a011081e086cbb0dfa9de818d55600260005260127f07d4ff730d9753101d832555708a37d38c2c45fce8cacaefc99f06074e93fe0b558315610f6557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050505050565b610f7d6122d7565b600e546001600160a01b0316610fcc5760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610930565b60015442101561101e5760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f74207374617274656420796574000000000000006044820152606401610930565b336000908152601460205260409020548061106e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610930565b336000818152601460209081526040808320839055600e54815163a9059cbb60e01b8152600481019590955260248501869052905192936001600160a01b039091169263a9059cbb92604480840193919291829003018187875af11580156110da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fe9190612da7565b9050806111455760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610930565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a25050565b61118b6121c5565b600a5461119a90600190612f19565b600654106111ea5760405162461bcd60e51b815260206004820152601d60248201527f43757272656e7420726f756e6420697320746865206c617374206f6e650000006044820152606401610930565b601354600160a01b900460ff161561120457611204612308565b600a6000016006548154811061121c5761121c612dc4565b906000526020600020015460075410156112b55760006007546000541161124557600754611249565b6000545b9050600d81600a6000016006548154811061126657611266612dc4565b906000526020600020015461127b9190612f19565b81546001810183556000928352602083200155600a01600654815481106112a4576112a4612dc4565b600091825260209091200154600755505b600680549060006112c583612f2c565b9091555050600654604080519182524260208301527f809ad8b3f3a3498b814a6b179d3e4b6f212c7830909b1e71aef9d637dd336ce7910160405180910390a1565b61130f6121c5565b600f546040516000916001600160a01b03169047908381818185875af1925050503d806000811461135c576040519150601f19603f3d011682016040523d82523d6000602084013e611361565b606091505b50509050806113a75760405162461bcd60e51b81526020600482015260126024820152714661696c656420746f20776974686472617760701b6044820152606401610930565b50565b6113b26121c5565b610b4d600061236e565b6113c46121c5565b610b4d6123df565b600080601360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114469190612f5f565b505050915050806402540be40061145d9190612faf565b92915050565b80600554811015801561147857506004548111155b80156114bb5750600a805461148f90600190612f19565b8154811061149f5761149f612dc4565b9060005260206000200154816000546114b89190612fdf565b11155b6114fd5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b6044820152606401610930565b6115056122d7565b61150d612428565b600061151883611a83565b905060006115246113cc565b6003546115319084612df0565b61153b9190612e07565b90508034101561157c5760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610930565b60006115888234612f19565b905061159385612472565b6003546115a09086612df0565b33600090815260146020526040812080549091906115bf908490612fdf565b9250508190555082600860008282546115d89190612fdf565b9091555050600f546115f3906001600160a01b0316836126e0565b80156116035761160333826126e0565b604080518381526020810185905242818301529051600091879133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a4505050610b3960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b81600554811015801561168b57506004548111155b80156116ce5750600a80546116a290600190612f19565b815481106116b2576116b2612dc4565b9060005260206000200154816000546116cb9190612fdf565b11155b6117105760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b6044820152606401610930565b6117186122d7565b60008281526015602052604081205490036117455760405162461bcd60e51b815260040161093090612ff2565b600061175084611a83565b6000848152601560205260408120549192509061176c906127b6565b6117769083612e07565b905061178185612472565b60035461178e9086612df0565b33600090815260146020526040812080549091906117ad908490612fdf565b9250508190555081600860008282546117c69190612fdf565b90915550600090508481036117e757506010546001600160a01b0316611833565b8460010361180157506011546001600160a01b0316611833565b8460020361181b57506012546001600160a01b0316611833565b60405162461bcd60e51b815260040161093090612ff2565b60006001600160a01b03821663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190613029565b90508083111561190f5760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610930565b60006001600160a01b03831633600f546040516001600160a01b039283166024820152911660448201526064810186905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516119789190613042565b6000604051808303816000865af19150503d80600081146119b5576040519150601f19603f3d011682016040523d82523d6000602084013e6119ba565b606091505b5050905080611a025760405162461bcd60e51b8152602060048201526014602482015273151bdad95b881c185e5b595b9d0819985a5b195960621b6044820152606401610930565b6040805185815260208101879052428183015290516001600160a01b038516918a9133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a45050505050505050565b611a636121c5565b600691909155600755565b611a766121c5565b610b39600a826003612889565b600080806001600a820154611a989190612f19565b6006541015905060008180611aad5750600754155b611ab957600754611abd565b6000545b905081158015611b255750600a60000160065481548110611ae057611ae0612dc4565b90600052602060002001548186611af79190612fdf565b1180611b255750600a60020160065481548110611b1657611b16612dc4565b90600052602060002001544210155b15611d0f57600a60020160065481548110611b4257611b42612dc4565b90600052602060002001544210611c5757600654600a90611b64906001612fdf565b81548110611b7457611b74612dc4565b906000526020600020015485600a600060038110611b9457611b94612dc4565b0160065481548110611ba857611ba8612dc4565b9060005260206000200154611bbd9190612fdf565b1115611c195760405162461bcd60e51b815260206004820152602560248201527f43616e74207075726368617365206d6f726520696e206f6e65207472616e736160448201526431ba34b7b760d91b6064820152608401610930565b600654600b90611c2a906001612fdf565b81548110611c3a57611c3a612dc4565b906000526020600020015485611c509190612df0565b9250611d40565b600081600a820160065481548110611c7157611c71612dc4565b9060005260206000200154611c869190612f19565b90506000611c948288612f19565b600654909150600b90611ca8906001612fdf565b81548110611cb857611cb8612dc4565b906000526020600020015481611cce9190612df0565b600a60010160065481548110611ce657611ce6612dc4565b906000526020600020015483611cfc9190612df0565b611d069190612fdf565b94505050611d40565b600a60010160065481548110611d2757611d27612dc4565b906000526020600020015485611d3d9190612df0565b92505b50909392505050565b611d516121c5565b6001600160a01b038116611d9c5760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610930565b60015415611de05760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610930565b6001839055600e80546001600160a01b0319166001600160a01b0383169081179091556000906323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018690526064016020604051808303816000875af1158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e839190612da7565b905080611eca5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610930565b600e54604080518581524260208201526001600160a01b03909216917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a250505050565b6060600a8260038110611f2c57611f2c612dc4565b01805480602002602001604051908101604052809291908181526020018280548015611f7757602002820191906000526020600020905b815481526020019060010190808311611f63575b50505050509050919050565b611f8b6121c5565b828114611fcc5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610930565b60005b8381101561205757828282818110611fe957611fe9612dc4565b905060200201356014600087878581811061200657612006612dc4565b905060200201602081019061201b91906129d7565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461204a9190612fdf565b9091555050600101611fcf565b5050505050565b6060600d8054806020026020016040519081016040528092919081815260200182805480156120ac57602002820191906000526020600020905b815481526020019060010190808311612098575b5050505050905090565b6120be6121c5565b6001600160a01b03811661210d5760405162461bcd60e51b8152602060048201526016602482015275416464726573732063616e6e6f74206265207a65726f60501b6044820152606401610930565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260156020526040812054810361215c5760405162461bcd60e51b815260040161093090612ff2565b61216583611a83565b600083815260156020526040902054909150612180906127b6565b610a829082612e07565b6121926121c5565b6001600160a01b0381166121bc57604051631e4fbdf760e01b815260006004820152602401610930565b6113a78161236e565b336121f77f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b4d5760405163118cdaa760e01b8152336004820152602401610930565b6122286127f2565b600080516020613072833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b612288612822565b600080516020613072833981519152805460ff19169055565b612192612822565b6122b1612822565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6000805160206130728339815191525460ff1615610b4d5760405163d93c066560e01b815260040160405180910390fd5b60005b600654600c5461231b9190612f19565b8110156113a75760095461232f9082612df0565b6123399042612fdf565b600654600c9061234a908490612fdf565b8154811061235a5761235a612dc4565b60009182526020909120015560010161230b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6123e76122d7565b600080516020613072833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612262565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161246c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6000600754600054116124875760075461248b565b6000545b90508160008082825461249e9190612fdf565b9091555050600754156124c35781600760008282546124bd9190612fdf565b90915550505b6000600754600054116124d8576007546124dc565b6000545b600a549091506124ee90600190612f19565b60065410801561254c5750600a6000016006548154811061251157612511612dc4565b90600052602060002001548110158061254c5750600a6002016006548154811061253d5761253d612dc4565b90600052602060002001544210155b156108d5576000600a81016006548154811061256a5761256a612dc4565b90600052602060002001548210156125af5781600a6000016006548154811061259557612595612dc4565b90600052602060002001546125aa9190612f19565b6125b2565b60005b9050600a600201600654815481106125cc576125cc612dc4565b906000526020600020015442106126715783600a600001600654815481106125f6576125f6612dc4565b906000526020600020015461260b9190612fdf565b600755600a6000016006548154811061262657612626612dc4565b906000526020600020015483101561266b5782600a6000016006548154811061265157612651612dc4565b90600052602060002001546126669190612f19565b61266e565b60005b90505b601354600160a01b900460ff161561268b5761268b612308565b600d80546001818101835560009283527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb590910183905560068054919290916126d5908490612fdf565b909155505050505050565b8047101561271e5760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610930565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461276b576040519150601f19603f3d011682016040523d82523d6000602084013e612770565b606091505b50509050806108d55760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610930565b60006127c382600a612f0d565b60035411156127e557816002546127da9190612f19565b61145d90600a612f0d565b506001919050565b919050565b6000805160206130728339815191525460ff16610b4d57604051638dfc202b60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b4d57604051631afcd79f60e31b815260040160405180910390fd5b50805460008255906000526020600020908101906113a791906128d9565b82600381019282156128c9579160200282015b828111156128c957825180516128b99184916020909101906128ee565b509160200191906001019061289c565b506128d5929150612935565b5090565b5b808211156128d557600081556001016128da565b828054828255906000526020600020908101928215612929579160200282015b8281111561292957825182559160200191906001019061290e565b506128d59291506128d9565b808211156128d5576000612949828261286b565b50600101612935565b80356001600160a01b03811681146127ed57600080fd5b6000806040838503121561297c57600080fd5b61298583612952565b946020939093013593505050565b6000602082840312156129a557600080fd5b5035919050565b80151581146113a757600080fd5b6000602082840312156129cc57600080fd5b8135610a82816129ac565b6000602082840312156129e957600080fd5b610a8282612952565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612a1957600080fd5b8135602067ffffffffffffffff80831115612a3657612a366129f2565b8260051b604051601f19603f83011681018181108482111715612a5b57612a5b6129f2565b6040529384526020818701810194908101925087851115612a7b57600080fd5b6020870191505b84821015612a9b57813583529183019190830190612a82565b979650505050505050565b600060208284031215612ab857600080fd5b813567ffffffffffffffff811115612acf57600080fd5b612adb84828501612a08565b949350505050565b600082601f830112612af457600080fd5b6040516060810167ffffffffffffffff8282108183111715612b1857612b186129f2565b816040528291506060850186811115612b3057600080fd5b855b81811015612b6557803583811115612b4a5760008081fd5b612b5689828a01612a08565b85525060209384019301612b32565b50929695505050505050565b60008060008060008060008060006101208a8c031215612b9057600080fd5b612b998a612952565b9850612ba760208b01612952565b9750612bb560408b01612952565b9650612bc360608b01612952565b955060808a013567ffffffffffffffff811115612bdf57600080fd5b612beb8c828d01612ae3565b95505060a08a0135935060c08a0135925060e08a01359150612c106101008b01612952565b90509295985092959850929598565b60008060408385031215612c3257600080fd5b50508035926020909101359150565b600060208284031215612c5357600080fd5b813567ffffffffffffffff811115612c6a57600080fd5b612adb84828501612ae3565b600080600060608486031215612c8b57600080fd5b8335925060208401359150612ca260408501612952565b90509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612ce357835183529284019291840191600101612cc7565b50909695505050505050565b60008083601f840112612d0157600080fd5b50813567ffffffffffffffff811115612d1957600080fd5b6020830191508360208260051b8501011115612d3457600080fd5b9250929050565b60008060008060408587031215612d5157600080fd5b843567ffffffffffffffff80821115612d6957600080fd5b612d7588838901612cef565b90965094506020870135915080821115612d8e57600080fd5b50612d9b87828801612cef565b95989497509550505050565b600060208284031215612db957600080fd5b8151610a82816129ac565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761145d5761145d612dda565b600082612e2457634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e64578160001904821115612e4a57612e4a612dda565b80851615612e5757918102915b93841c9390800290612e2e565b509250929050565b600082612e7b5750600161145d565b81612e885750600061145d565b8160018114612e9e5760028114612ea857612ec4565b600191505061145d565b60ff841115612eb957612eb9612dda565b50506001821b61145d565b5060208310610133831016604e8410600b8410161715612ee7575081810a61145d565b612ef18383612e29565b8060001904821115612f0557612f05612dda565b029392505050565b6000610a828383612e6c565b8181038181111561145d5761145d612dda565b600060018201612f3e57612f3e612dda565b5060010190565b805169ffffffffffffffffffff811681146127ed57600080fd5b600080600080600060a08688031215612f7757600080fd5b612f8086612f45565b9450602086015193506040860151925060608601519150612fa360808701612f45565b90509295509295909350565b80820260008212600160ff1b84141615612fcb57612fcb612dda565b818105831482151761145d5761145d612dda565b8082018082111561145d5761145d612dda565b6020808252601c908201527f496e636f72726563742055534420746f6b656e2070726f766964656400000000604082015260600190565b60006020828403121561303b57600080fd5b5051919050565b6000825160005b818110156130635760208186018101518583015201613049565b50600092019182525091905056fecd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a26469706673582212205c0d1d8802a773550c56d47e20189375c74d32835926663ddeb5344d626fc21a64736f6c63430008180033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.