Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 14051996 | 968 days ago | IN | 0 ETH | 0.82785504 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
WhitelistSimpleSale
Compiler Version
v0.8.3+commit.8d00100c
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.3; import { SimpleSale, IBasicController, IERC721Upgradeable } from "./SimpleSale.sol"; import { MerkleProofUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; contract WhitelistSimpleSale is UUPSUpgradeable, SimpleSale { bytes32 public whitelistMerkleRoot; bool public saleStarted; uint256 public saleStartBlock; uint256 public whitelistSaleDuration; // in blocks uint256 public postWhitelistMaxPurchases; bool public paused; event SaleStarted(); function __WhitelistSimpleSale_init( IBasicController controller_, uint256 parentDomainId_, uint256 price, uint256 maxPurchasesPerAccount_, uint256 postWhitelistMaxPurchases_, IERC721Upgradeable zNSRegistrar_, address sellerWallet_, uint256 whitelistSaleDuration_, bytes32 merkleRoot, uint256 startIndex_ ) public initializer { __Ownable_init(); __ERC721Holder_init(); __UUPSUpgradeable_init(); __SimpleSale_init( controller_, parentDomainId_, price, maxPurchasesPerAccount_, zNSRegistrar_, sellerWallet_, startIndex_ ); whitelistSaleDuration = whitelistSaleDuration_; whitelistMerkleRoot = merkleRoot; postWhitelistMaxPurchases = postWhitelistMaxPurchases_; paused = false; } function updateMerkleRoot(bytes32 root) external onlyOwner { require(whitelistMerkleRoot != root, "same root"); whitelistMerkleRoot = root; } function startSale() public onlyOwner { require(!saleStarted, "Sale already started"); saleStarted = true; saleStartBlock = block.number; emit SaleStarted(); } function setSaleDuration(uint256 durationInBlocks) public onlyOwner { require(whitelistSaleDuration != durationInBlocks, "No state change"); whitelistSaleDuration = durationInBlocks; } function setPauseStatus(bool pauseStatus) public onlyOwner { require(paused != pauseStatus, "No state change"); paused = pauseStatus; } function stopSale() public onlyOwner { require(saleStarted, "Sale not started"); saleStarted = false; } function setSalePrice(uint256 newPrice) public onlyOwner { require(newPrice != salePrice, "Same price"); salePrice = newPrice; } function purchaseDomains(uint8 count) public payable override onlyOwner { revert("No public sale"); } function mintRemainingDomains(address destination) public onlyOwner { _mintRemaining(destination); } function purchaseDomainsWhitelisted( uint8 count, uint256 index, bytes32[] calldata merkleProof ) public payable { require(!paused, "paused"); require(saleStarted, "Sale has not started yet"); require( block.number < saleStartBlock + whitelistSaleDuration, "Sale Ended" ); bytes32 node = keccak256(abi.encodePacked(index, msg.sender)); require( MerkleProofUpgradeable.verify(merkleProof, whitelistMerkleRoot, node), "Invalid Merkle Proof" ); SimpleSale.purchaseDomains(count); } function releaseParentDomain() public onlyOwner { zNSRegistrar.transferFrom(address(this), owner(), parentDomainId); } function currentMaxPurchaseCount() public view returns (uint256) { uint256 maxPurchaseCount = maxPurchasesPerAccount; if (block.number > saleStartBlock + whitelistSaleDuration) { maxPurchaseCount = postWhitelistMaxPurchases; } return maxPurchaseCount; } function _canAccountPurchase(address account, uint8 count) internal view override { uint256 maxPurchaseCount = currentMaxPurchaseCount(); // Chech new purchase limit require( domainsPurchasedByAccount[account] + count <= maxPurchaseCount, "Purchasing beyond limit." ); } function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.3; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import { ERC721HolderUpgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol"; import { IERC721Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import {IBasicController} from "./interfaces/IBasicController.sol"; contract SimpleSale is Initializable, OwnableUpgradeable, ERC721HolderUpgradeable { event DomainPurchased(address buyer, uint256 domainId); event RefundedEther(address buyer, uint256 amount); struct Domain { string metadataUri; } IBasicController public controller; uint256 public parentDomainId; uint256 public salePrice; uint256 public maxPurchasesPerAccount; IERC721Upgradeable public zNSRegistrar; address public sellerWallet; Domain[] public domainsForSale; uint256 public totalForSale; uint256 public domainsSold; uint256 public startIndex; mapping(address => uint256) public domainsPurchasedByAccount; function __SimpleSale_init( IBasicController controller_, uint256 parentDomainId_, uint256 price, uint256 maxPurchasesPerAccount_, IERC721Upgradeable zNSRegistrar_, address sellerWallet_, uint256 startIndex_ ) public initializer { __Ownable_init(); __ERC721Holder_init(); controller = controller_; parentDomainId = parentDomainId_; maxPurchasesPerAccount = maxPurchasesPerAccount_; salePrice = price; zNSRegistrar = zNSRegistrar_; sellerWallet = sellerWallet_; startIndex = startIndex_; } function addDomainsToSell(string[] calldata metadataUris) external onlyOwner { // Take each pair and create a domain to sell from it for (uint256 i = 0; i < metadataUris.length; ++i) { domainsForSale.push(Domain({metadataUri: metadataUris[i]})); } totalForSale += metadataUris.length; } function addDomainsToSellOptimized( bytes12[] calldata chunk1, bytes32[] calldata chunk2 ) external onlyOwner { require(chunk2.length == chunk1.length, "invalid arrays"); string memory uri; for (uint256 i = 0; i < chunk1.length; ++i) { uri = string(abi.encodePacked("ipfs://Qm", chunk1[i], chunk2[i])); domainsForSale.push(Domain({metadataUri: uri})); } totalForSale += chunk1.length; } function setSellerWallet(address wallet) external onlyOwner { require(wallet != sellerWallet, "Same Wallet"); sellerWallet = wallet; } function setParentDomainId(uint256 parentId) external onlyOwner { require(parentDomainId != parentId, "Same parent id"); parentDomainId = parentId; } function setStartIndex(uint256 index) external onlyOwner { require(startIndex != index, "same index"); startIndex = index; } function purchaseDomains(uint8 count) public payable virtual { require(count > 0, "Zero purchase count"); require(domainsSold < domainsForSale.length, "No domains left"); // Make sure enough eth was sent to purchase domains require(msg.value == salePrice * count, "Invalid amount of eth"); _canAccountPurchase(msg.sender, count); _purchaseDomains(count); } function _canAccountPurchase(address account, uint8 count) internal view virtual { // Chech new purchase limit require( domainsPurchasedByAccount[account] + count <= maxPurchasesPerAccount, "Purchasing beyond limit." ); } function _purchaseDomains(uint8 count) private { uint8 numPurchased = 0; uint256[] memory purchasedIndices = new uint256[](count); uint256 initialIndex = startIndex + domainsSold; // Iterate through until we find a domain that can be purchased: while (numPurchased < count && domainsSold < domainsForSale.length) { purchasedIndices[numPurchased] = domainsSold; numPurchased++; domainsSold++; } // Update number of domains this account has purchased // This is done before minting domains or sending any eth to prevent // a re-entrance attack through a recieve() or a safe transfer callback domainsPurchasedByAccount[msg.sender] = domainsPurchasedByAccount[msg.sender] + numPurchased; // transfer paid ETH to the "seller" wallet uint256 proceeds = salePrice * numPurchased; payable(sellerWallet).transfer(proceeds); // refund any extra ETH if (numPurchased < count) { uint256 refundAmount = msg.value - proceeds; payable(msg.sender).transfer(refundAmount); emit RefundedEther(msg.sender, refundAmount); } // Mint the domains for (uint8 i = 0; i < numPurchased; ++i) { // The sale contract will be the minter and own them at this point controller.registerSubdomainExtended( parentDomainId, uint2str(initialIndex + i), msg.sender, domainsForSale[purchasedIndices[i]].metadataUri, 0, true ); } } function _mintRemaining(address destination) internal { uint256 initialIndex = startIndex + domainsSold; uint256 remaining = domainsForSale.length - domainsSold; for (uint256 i = 0; i < remaining; ++i) { controller.registerSubdomainExtended( parentDomainId, uint2str(initialIndex + i), destination, domainsForSale[initialIndex + i].metadataUri, 0, true ); } domainsSold = domainsForSale.length; } function changeSoldAmount(uint256 newAmount) public onlyOwner { require(newAmount != domainsSold, "Same"); domainsSold = newAmount; } function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProofUpgradeable { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal initializer { __ERC1967Upgrade_init_unchained(); __UUPSUpgradeable_init_unchained(); } function __UUPSUpgradeable_init_unchained() internal initializer { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallSecure(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallSecure(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * 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. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721ReceiverUpgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721HolderUpgradeable is Initializable, IERC721ReceiverUpgradeable { function __ERC721Holder_init() internal initializer { __ERC721Holder_init_unchained(); } function __ERC721Holder_init_unchained() internal initializer { } /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.3; interface IBasicController { function registerSubdomainExtended( uint256 parentId, string memory label, address owner, string memory metadata, uint256 royaltyAmount, bool lockOnCreation ) external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal initializer { __ERC1967Upgrade_init_unchained(); } function __ERC1967Upgrade_init_unchained() internal initializer { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallSecure( address newImplementation, bytes memory data, bool forceCall ) internal { address oldImplementation = _getImplementation(); // Initial upgrade and setup call _setImplementation(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } // Perform rollback test if not already in progress StorageSlotUpgradeable.BooleanSlot storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT); if (!rollbackTesting.value) { // Trigger rollback using upgradeTo from the new implementation rollbackTesting.value = true; _functionDelegateCall( newImplementation, abi.encodeWithSignature("upgradeTo(address)", oldImplementation) ); rollbackTesting.value = false; // Check rollback was effective require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades"); // Finally reset to the new implementation and log the upgrade _upgradeTo(newImplementation); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"domainId","type":"uint256"}],"name":"DomainPurchased","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":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefundedEther","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"contract IBasicController","name":"controller_","type":"address"},{"internalType":"uint256","name":"parentDomainId_","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPurchasesPerAccount_","type":"uint256"},{"internalType":"contract IERC721Upgradeable","name":"zNSRegistrar_","type":"address"},{"internalType":"address","name":"sellerWallet_","type":"address"},{"internalType":"uint256","name":"startIndex_","type":"uint256"}],"name":"__SimpleSale_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IBasicController","name":"controller_","type":"address"},{"internalType":"uint256","name":"parentDomainId_","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPurchasesPerAccount_","type":"uint256"},{"internalType":"uint256","name":"postWhitelistMaxPurchases_","type":"uint256"},{"internalType":"contract IERC721Upgradeable","name":"zNSRegistrar_","type":"address"},{"internalType":"address","name":"sellerWallet_","type":"address"},{"internalType":"uint256","name":"whitelistSaleDuration_","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"startIndex_","type":"uint256"}],"name":"__WhitelistSimpleSale_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"metadataUris","type":"string[]"}],"name":"addDomainsToSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes12[]","name":"chunk1","type":"bytes12[]"},{"internalType":"bytes32[]","name":"chunk2","type":"bytes32[]"}],"name":"addDomainsToSellOptimized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"changeSoldAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IBasicController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMaxPurchaseCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"domainsForSale","outputs":[{"internalType":"string","name":"metadataUri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"domainsPurchasedByAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainsSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchasesPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"}],"name":"mintRemainingDomains","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentDomainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postWhitelistMaxPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"}],"name":"purchaseDomains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"purchaseDomainsWhitelisted","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"releaseParentDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellerWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"parentId","type":"uint256"}],"name":"setParentDomainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pauseStatus","type":"bool"}],"name":"setPauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"durationInBlocks","type":"uint256"}],"name":"setSaleDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setSellerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setStartIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalForSale","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":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSaleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zNSRegistrar","outputs":[{"internalType":"contract IERC721Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523060601b60805234801561001757600080fd5b5060805160601c612dd961004b600039600081816107ce0152818161080e0152818161096901526109a90152612dd96000f3fe6080604052600436106102515760003560e01c80638eaefd3a11610139578063c623d0f2116100b6578063f2279dd61161007a578063f2279dd6146106a1578063f2fde38b146106c1578063f51f96dd146106e1578063f6e1edfd146106f7578063f77c47911461070c578063fb8b74c21461072c57610251565b8063c623d0f21461061f578063df47f4b814610636578063e25acff314610656578063e36b0b371461066c578063ec4e07bc1461068157610251565b80639e7bed06116100fd5780639e7bed061461059c578063aa98e0c6146105b3578063b66a0e5d146105ca578063c10e235b146105df578063c38bb537146105ff57610251565b80638eaefd3a146105125780639633c07514610529578063981372161461053c57806399eb58961461055c5780639df2fb0b1461057c57610251565b80635c975abb116101d2578063715018a611610196578063715018a6146104395780637e12180e1461044e5780638460a5de1461046e57806389a49413146104a75780638c8fdb01146104c75780638da5cb5b146104f457610251565b80635c975abb146103a45780635ff7d9d5146103bf57806365285462146103df578063673ae06d1461040d5780636cedc6091461042257610251565b80633e0e828b116102195780633e0e828b1461031c5780634783f0ef146103335780634816ff02146103535780634f1ef286146103665780635c474f9e1461037957610251565b8063150b7a02146102565780631919fed71461029f57806320027275146102c1578063285e63b7146102e65780633659cfe6146102fc575b600080fd5b34801561026257600080fd5b50610281610271366004612622565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156102ab57600080fd5b506102bf6102ba3660046127cb565b61074c565b005b3480156102cd57600080fd5b506102d86101085481565b604051908152602001610296565b3480156102f257600080fd5b506102d860fe5481565b34801561030857600080fd5b506102bf610317366004612606565b6107c3565b34801561032857600080fd5b506102d86101045481565b34801561033f57600080fd5b506102bf61034e3660046127cb565b61088c565b6102bf6103613660046128fc565b6108fb565b6102bf61037436600461268c565b61095e565b34801561038557600080fd5b50610107546103949060ff1681565b6040519015158152602001610296565b3480156103b057600080fd5b5061010b546103949060ff1681565b3480156103cb57600080fd5b506102bf6103da3660046127cb565b610a18565b3480156103eb57600080fd5b506102d86103fa366004612606565b6101056020526000908152604090205481565b34801561041957600080fd5b506102bf610a88565b34801561042e57600080fd5b506102d861010a5481565b34801561044557600080fd5b506102bf610b42565b34801561045a57600080fd5b506102bf6104693660046127cb565b610b78565b34801561047a57600080fd5b506101005461048f906001600160a01b031681565b6040516001600160a01b039091168152602001610296565b3480156104b357600080fd5b506102bf6104c23660046127e3565b610bed565b3480156104d357600080fd5b506104e76104e23660046127cb565b610cc3565b60405161029691906129aa565b34801561050057600080fd5b506097546001600160a01b031661048f565b34801561051e57600080fd5b506102d86101025481565b6102bf610537366004612916565b610d72565b34801561054857600080fd5b506102bf610557366004612743565b610f2c565b34801561056857600080fd5b506102bf610577366004612606565b611038565b34801561058857600080fd5b506102bf6105973660046126da565b61106b565b3480156105a857600080fd5b506102d86101095481565b3480156105bf57600080fd5b506102d86101065481565b3480156105d657600080fd5b506102bf611211565b3480156105eb57600080fd5b506102bf6105fa3660046127cb565b6112c4565b34801561060b57600080fd5b506102bf61061a366004612783565b611330565b34801561062b57600080fd5b506102d86101035481565b34801561064257600080fd5b5060ff5461048f906001600160a01b031681565b34801561066257600080fd5b506102d860fc5481565b34801561067857600080fd5b506102bf6113ba565b34801561068d57600080fd5b506102bf61069c366004612854565b611437565b3480156106ad57600080fd5b506102bf6106bc366004612606565b6114f1565b3480156106cd57600080fd5b506102bf6106dc366004612606565b61158b565b3480156106ed57600080fd5b506102d860fd5481565b34801561070357600080fd5b506102d8611623565b34801561071857600080fd5b5060fb5461048f906001600160a01b031681565b34801561073857600080fd5b506102bf6107473660046127cb565b61164d565b6097546001600160a01b0316331461077f5760405162461bcd60e51b815260040161077690612aa3565b60405180910390fd5b60fd548114156107be5760405162461bcd60e51b815260206004820152600a60248201526953616d6520707269636560b01b6044820152606401610776565b60fd55565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561080c5760405162461bcd60e51b8152600401610776906129bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661083e6116bf565b6001600160a01b0316146108645760405162461bcd60e51b815260040161077690612a09565b61086d816116ed565b6040805160008082526020820190925261088991839190611717565b50565b6097546001600160a01b031633146108b65760405162461bcd60e51b815260040161077690612aa3565b806101065414156108f55760405162461bcd60e51b81526020600482015260096024820152681cd85b59481c9bdbdd60ba1b6044820152606401610776565b61010655565b6097546001600160a01b031633146109255760405162461bcd60e51b815260040161077690612aa3565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f207075626c69632073616c6560901b6044820152606401610776565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156109a75760405162461bcd60e51b8152600401610776906129bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109d96116bf565b6001600160a01b0316146109ff5760405162461bcd60e51b815260040161077690612a09565b610a08826116ed565b610a1482826001611717565b5050565b6097546001600160a01b03163314610a425760405162461bcd60e51b815260040161077690612aa3565b80610104541415610a825760405162461bcd60e51b815260206004820152600a6024820152690e6c2daca40d2dcc8caf60b31b6044820152606401610776565b61010455565b6097546001600160a01b03163314610ab25760405162461bcd60e51b815260040161077690612aa3565b60ff546001600160a01b03166323b872dd30610ad66097546001600160a01b031690565b60fc546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610b2857600080fd5b505af1158015610b3c573d6000803e3d6000fd5b50505050565b6097546001600160a01b03163314610b6c5760405162461bcd60e51b815260040161077690612aa3565b610b76600061185b565b565b6097546001600160a01b03163314610ba25760405162461bcd60e51b815260040161077690612aa3565b80610109541415610be75760405162461bcd60e51b815260206004820152600f60248201526e4e6f207374617465206368616e676560881b6044820152606401610776565b61010955565b600054610100900460ff1680610c06575060005460ff16155b610c225760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015610c44576000805461ffff19166101011790555b610c4c6118ad565b610c54611928565b60fb80546001600160a01b03808b166001600160a01b03199283161790925560fc89905560fe87905560fd88905560ff80548784169083161790556101008054928616929091169190911790556101048290558015610cb9576000805461ff00191690555b5050505050505050565b6101018181548110610cd457600080fd5b600091825260209091200180549091508190610cef90612cc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b90612cc5565b8015610d685780601f10610d3d57610100808354040283529160200191610d68565b820191906000526020600020905b815481529060010190602001808311610d4b57829003601f168201915b5050505050905081565b61010b5460ff1615610daf5760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610776565b6101075460ff16610e025760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610776565b6101095461010854610e149190612c06565b4310610e4f5760405162461bcd60e51b815260206004820152600a60248201526914d85b1948115b99195960b21b6044820152606401610776565b60008333604051602001610e7f92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050610ed983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610106549150849050611987565b610f1c5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21026b2b935b63290283937b7b360611b6044820152606401610776565b610f2585611a46565b5050505050565b6097546001600160a01b03163314610f565760405162461bcd60e51b815260040161077690612aa3565b60005b81811015611018576101016040518060200160405280858585818110610f8f57634e487b7160e01b600052603260045260246000fd5b9050602002810190610fa19190612bc1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250508354600181018555938152602090819020835180519495919091019361100493508492919091019061248b565b5050508061101190612d00565b9050610f59565b5081819050610102600082825461102f9190612c06565b90915550505050565b6097546001600160a01b031633146110625760405162461bcd60e51b815260040161077690612aa3565b61088981611b40565b6097546001600160a01b031633146110955760405162461bcd60e51b815260040161077690612aa3565b8083146110d55760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642061727261797360901b6044820152606401610776565b606060005b848110156111ee5785858281811061110257634e487b7160e01b600052603260045260246000fd5b905060200201602081019061111791906127a3565b84848381811061113757634e487b7160e01b600052603260045260246000fd5b9050602002013560405160200161117692919068697066733a2f2f516d60b81b81526001600160a01b0319929092166009830152601582015260350190565b60408051601f1981840301815260208381019092528083526101018054600181018255600091909152835180519296507f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689909101926111da9284929091019061248b565b505050806111e790612d00565b90506110da565b508484905061010260008282546112059190612c06565b90915550505050505050565b6097546001600160a01b0316331461123b5760405162461bcd60e51b815260040161077690612aa3565b6101075460ff16156112865760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610776565b610107805460ff1916600117905543610108556040517f912ee23dde46ec889d6748212cce445d667f7041597691dc89e8549ad8bc0acb90600090a1565b6097546001600160a01b031633146112ee5760405162461bcd60e51b815260040161077690612aa3565b6101035481141561132a5760405162461bcd60e51b81526004016107769060208082526004908201526353616d6560e01b604082015260600190565b61010355565b6097546001600160a01b0316331461135a5760405162461bcd60e51b815260040161077690612aa3565b61010b5460ff16151581151514156113a65760405162461bcd60e51b815260206004820152600f60248201526e4e6f207374617465206368616e676560881b6044820152606401610776565b61010b805460ff1916911515919091179055565b6097546001600160a01b031633146113e45760405162461bcd60e51b815260040161077690612aa3565b6101075460ff1661142a5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610776565b610107805460ff19169055565b600054610100900460ff1680611450575060005460ff16155b61146c5760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff1615801561148e576000805461ffff19166101011790555b6114966118ad565b61149e611928565b6114a6611c72565b6114b58b8b8b8b8a8a88610bed565b61010984905561010683905561010a87905561010b805460ff1916905580156114e4576000805461ff00191690555b5050505050505050505050565b6097546001600160a01b0316331461151b5760405162461bcd60e51b815260040161077690612aa3565b610100546001600160a01b03828116911614156115685760405162461bcd60e51b815260206004820152600b60248201526a14d85b594815d85b1b195d60aa1b6044820152606401610776565b61010080546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031633146115b55760405162461bcd60e51b815260040161077690612aa3565b6001600160a01b03811661161a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610776565b6108898161185b565b60fe5461010954610108546000929161163b91612c06565b431115611648575061010a545b905090565b6097546001600160a01b031633146116775760405162461bcd60e51b815260040161077690612aa3565b8060fc5414156116ba5760405162461bcd60e51b815260206004820152600e60248201526d14d85b59481c185c995b9d081a5960921b6044820152606401610776565b60fc55565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6097546001600160a01b031633146108895760405162461bcd60e51b815260040161077690612aa3565b60006117216116bf565b905061172c84611cd1565b6000835111806117395750815b1561174a576117488484611d76565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff16610f2557805460ff191660011781556040516001600160a01b03831660248201526117c990869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b179052611d76565b50805460ff191681556117da6116bf565b6001600160a01b0316826001600160a01b0316146118525760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b6064820152608401610776565b610f2585611e61565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806118c6575060005460ff16155b6118e25760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611904576000805461ffff19166101011790555b61190c611ea1565b611914611f0b565b8015610889576000805461ff001916905550565b600054610100900460ff1680611941575060005460ff16155b61195d5760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff1615801561197f576000805461ffff19166101011790555b611914611ea1565b600081815b8551811015611a395760008682815181106119b757634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116119f9576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611a26565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611a3181612d00565b91505061198c565b50831490505b9392505050565b60008160ff1611611a8f5760405162461bcd60e51b815260206004820152601360248201527216995c9bc81c1d5c98da185cd94818dbdd5b9d606a1b6044820152606401610776565b610101546101035410611ad65760405162461bcd60e51b815260206004820152600f60248201526e139bc8191bdb585a5b9cc81b19599d608a1b6044820152606401610776565b8060ff1660fd54611ae79190612c63565b3414611b2d5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840c2dadeeadce840decc40cae8d605b1b6044820152606401610776565b611b373382611f6b565b61088981611ff5565b60006101035461010454611b549190612c06565b6101035461010154919250600091611b6c9190612c82565b905060005b81811015611c645760fb5460fc546001600160a01b039091169063f5a2981c90611ba3611b9e8588612c06565b61230a565b87610101611bb1878a612c06565b81548110611bcf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001600001600060016040518763ffffffff1660e01b8152600401611c0196959493929190612ad8565b602060405180830381600087803b158015611c1b57600080fd5b505af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5391906128e4565b50611c5d81612d00565b9050611b71565b505061010154610103555050565b600054610100900460ff1680611c8b575060005460ff16155b611ca75760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611cc9576000805461ffff19166101011790555b61197f611ea1565b803b611d355760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610776565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b611dd55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610776565b600080846001600160a01b031684604051611df0919061298e565b600060405180830381855af49150503d8060008114611e2b576040519150601f19603f3d011682016040523d82523d6000602084013e611e30565b606091505b5091509150611e588282604051806060016040528060278152602001612d7d60279139612452565b95945050505050565b611e6a81611cd1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b600054610100900460ff1680611eba575060005460ff16155b611ed65760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611914576000805461ffff19166101011790558015610889576000805461ff001916905550565b600054610100900460ff1680611f24575060005460ff16155b611f405760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611f62576000805461ffff19166101011790555b6119143361185b565b6000611f75611623565b6001600160a01b038416600090815261010560205260409020549091508190611fa29060ff851690612c06565b1115611ff05760405162461bcd60e51b815260206004820152601860248201527f50757263686173696e67206265796f6e64206c696d69742e00000000000000006044820152606401610776565b505050565b6000808260ff1667ffffffffffffffff81111561202257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561204b578160200160208202803683370190505b509050600061010354610104546120629190612c06565b90505b8360ff168360ff1610801561207f57506101015461010354105b156120e05761010354828460ff16815181106120ab57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152826120c081612d1b565b610103805491955090915060006120d683612d00565b9190505550612065565b33600090815261010560205260409020546120ff9060ff851690612c06565b336000908152610105602052604081209190915560fd546121249060ff861690612c63565b610100546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612160573d6000803e3d6000fd5b508460ff168460ff1610156121e757600061217b8234612c82565b604051909150339082156108fc029083906000818181858888f193505050501580156121ab573d6000803e3d6000fd5b5060408051338152602081018390527f5e90a7af0e257106295d4cabfe31a7f0bc7100b422f59e277d09b25932f9aa74910160405180910390a1505b60005b8460ff168160ff1610156123025760fb5460fc546001600160a01b039091169063f5a2981c90612220611b9e60ff861688612c06565b33610101898760ff168151811061224757634e487b7160e01b600052603260045260246000fd5b60200260200101518154811061226d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001600001600060016040518763ffffffff1660e01b815260040161229f96959493929190612ad8565b602060405180830381600087803b1580156122b957600080fd5b505af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f191906128e4565b506122fb81612d1b565b90506121ea565b505050505050565b60608161232f57506040805180820190915260018152600360fc1b602082015261244d565b8160005b8115612359578061234381612d00565b91506123529050600a83612c43565b9150612333565b60008167ffffffffffffffff81111561238257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123ac576020820181803683370190505b509050815b8515612447576123c2600182612c82565b905060006123d1600a88612c43565b6123dc90600a612c63565b6123e69088612c82565b6123f1906030612c1e565b905060008160f81b90508084848151811061241c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061243e600a89612c43565b975050506123b1565b50925050505b919050565b60608315612461575081611a3f565b8251156124715782518084602001fd5b8160405162461bcd60e51b815260040161077691906129aa565b82805461249790612cc5565b90600052602060002090601f0160209004810192826124b957600085556124ff565b82601f106124d257805160ff19168380011785556124ff565b828001600101855582156124ff579182015b828111156124ff5782518255916020019190600101906124e4565b5061250b92915061250f565b5090565b5b8082111561250b5760008155600101612510565b60008083601f840112612535578081fd5b50813567ffffffffffffffff81111561254c578182fd5b6020830191508360208260051b850101111561256757600080fd5b9250929050565b600082601f83011261257e578081fd5b813567ffffffffffffffff8082111561259957612599612d51565b604051601f8301601f19908116603f011681019082821181831017156125c1576125c1612d51565b816040528381528660208588010111156125d9578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff8116811461244d57600080fd5b600060208284031215612617578081fd5b8135611a3f81612d67565b60008060008060808587031215612637578283fd5b843561264281612d67565b9350602085013561265281612d67565b925060408501359150606085013567ffffffffffffffff811115612674578182fd5b6126808782880161256e565b91505092959194509250565b6000806040838503121561269e578182fd5b82356126a981612d67565b9150602083013567ffffffffffffffff8111156126c4578182fd5b6126d08582860161256e565b9150509250929050565b600080600080604085870312156126ef578384fd5b843567ffffffffffffffff80821115612706578586fd5b61271288838901612524565b9096509450602087013591508082111561272a578384fd5b5061273787828801612524565b95989497509550505050565b60008060208385031215612755578182fd5b823567ffffffffffffffff81111561276b578283fd5b61277785828601612524565b90969095509350505050565b600060208284031215612794578081fd5b81358015158114611a3f578182fd5b6000602082840312156127b4578081fd5b81356001600160a01b031981168114611a3f578182fd5b6000602082840312156127dc578081fd5b5035919050565b600080600080600080600060e0888a0312156127fd578283fd5b873561280881612d67565b9650602088013595506040880135945060608801359350608088013561282d81612d67565b925060a088013561283d81612d67565b8092505060c0880135905092959891949750929550565b6000806000806000806000806000806101408b8d031215612873578384fd5b8a3561287e81612d67565b995060208b0135985060408b0135975060608b0135965060808b0135955060a08b01356128aa81612d67565b945060c08b01356128ba81612d67565b8094505060e08b013592506101008b013591506101208b013590509295989b9194979a5092959850565b6000602082840312156128f5578081fd5b5051919050565b60006020828403121561290d578081fd5b611a3f826125f5565b6000806000806060858703121561292b578182fd5b612934856125f5565b935060208501359250604085013567ffffffffffffffff811115612956578283fd5b61273787828801612524565b6000815180845261297a816020860160208601612c99565b601f01601f19169290920160200192915050565b600082516129a0818460208701612c99565b9190910192915050565b600060208252611a3f6020830184612962565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000878252602060c081840152612af260c0840189612962565b6001600160a01b0388166040850152838103606085015286548390600181811c9082811680612b2257607f831692505b868310811415612b4057634e487b7160e01b88526022600452602488fd5b828652602086019550808015612b5d5760018114612b6e57612b98565b60ff19851687528787019550612b98565b60008d815260209020895b85811015612b9257815489820152908401908901612b79565b88019650505b50505050506080850187905285151560a08601529250612bb6915050565b979650505050505050565b6000808335601e19843603018112612bd7578283fd5b83018035915067ffffffffffffffff821115612bf1578283fd5b60200191503681900382131561256757600080fd5b60008219821115612c1957612c19612d3b565b500190565b600060ff821660ff84168060ff03821115612c3b57612c3b612d3b565b019392505050565b600082612c5e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612c7d57612c7d612d3b565b500290565b600082821015612c9457612c94612d3b565b500390565b60005b83811015612cb4578181015183820152602001612c9c565b83811115610b3c5750506000910152565b600181811c90821680612cd957607f821691505b60208210811415612cfa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d1457612d14612d3b565b5060010190565b600060ff821660ff811415612d3257612d32612d3b565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461088957600080fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212207ba270d8efc81a0ebfbd2e49ecd014f1b8701839a94610b38d5c1e5191e96ae664736f6c63430008030033
Deployed Bytecode
0x6080604052600436106102515760003560e01c80638eaefd3a11610139578063c623d0f2116100b6578063f2279dd61161007a578063f2279dd6146106a1578063f2fde38b146106c1578063f51f96dd146106e1578063f6e1edfd146106f7578063f77c47911461070c578063fb8b74c21461072c57610251565b8063c623d0f21461061f578063df47f4b814610636578063e25acff314610656578063e36b0b371461066c578063ec4e07bc1461068157610251565b80639e7bed06116100fd5780639e7bed061461059c578063aa98e0c6146105b3578063b66a0e5d146105ca578063c10e235b146105df578063c38bb537146105ff57610251565b80638eaefd3a146105125780639633c07514610529578063981372161461053c57806399eb58961461055c5780639df2fb0b1461057c57610251565b80635c975abb116101d2578063715018a611610196578063715018a6146104395780637e12180e1461044e5780638460a5de1461046e57806389a49413146104a75780638c8fdb01146104c75780638da5cb5b146104f457610251565b80635c975abb146103a45780635ff7d9d5146103bf57806365285462146103df578063673ae06d1461040d5780636cedc6091461042257610251565b80633e0e828b116102195780633e0e828b1461031c5780634783f0ef146103335780634816ff02146103535780634f1ef286146103665780635c474f9e1461037957610251565b8063150b7a02146102565780631919fed71461029f57806320027275146102c1578063285e63b7146102e65780633659cfe6146102fc575b600080fd5b34801561026257600080fd5b50610281610271366004612622565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156102ab57600080fd5b506102bf6102ba3660046127cb565b61074c565b005b3480156102cd57600080fd5b506102d86101085481565b604051908152602001610296565b3480156102f257600080fd5b506102d860fe5481565b34801561030857600080fd5b506102bf610317366004612606565b6107c3565b34801561032857600080fd5b506102d86101045481565b34801561033f57600080fd5b506102bf61034e3660046127cb565b61088c565b6102bf6103613660046128fc565b6108fb565b6102bf61037436600461268c565b61095e565b34801561038557600080fd5b50610107546103949060ff1681565b6040519015158152602001610296565b3480156103b057600080fd5b5061010b546103949060ff1681565b3480156103cb57600080fd5b506102bf6103da3660046127cb565b610a18565b3480156103eb57600080fd5b506102d86103fa366004612606565b6101056020526000908152604090205481565b34801561041957600080fd5b506102bf610a88565b34801561042e57600080fd5b506102d861010a5481565b34801561044557600080fd5b506102bf610b42565b34801561045a57600080fd5b506102bf6104693660046127cb565b610b78565b34801561047a57600080fd5b506101005461048f906001600160a01b031681565b6040516001600160a01b039091168152602001610296565b3480156104b357600080fd5b506102bf6104c23660046127e3565b610bed565b3480156104d357600080fd5b506104e76104e23660046127cb565b610cc3565b60405161029691906129aa565b34801561050057600080fd5b506097546001600160a01b031661048f565b34801561051e57600080fd5b506102d86101025481565b6102bf610537366004612916565b610d72565b34801561054857600080fd5b506102bf610557366004612743565b610f2c565b34801561056857600080fd5b506102bf610577366004612606565b611038565b34801561058857600080fd5b506102bf6105973660046126da565b61106b565b3480156105a857600080fd5b506102d86101095481565b3480156105bf57600080fd5b506102d86101065481565b3480156105d657600080fd5b506102bf611211565b3480156105eb57600080fd5b506102bf6105fa3660046127cb565b6112c4565b34801561060b57600080fd5b506102bf61061a366004612783565b611330565b34801561062b57600080fd5b506102d86101035481565b34801561064257600080fd5b5060ff5461048f906001600160a01b031681565b34801561066257600080fd5b506102d860fc5481565b34801561067857600080fd5b506102bf6113ba565b34801561068d57600080fd5b506102bf61069c366004612854565b611437565b3480156106ad57600080fd5b506102bf6106bc366004612606565b6114f1565b3480156106cd57600080fd5b506102bf6106dc366004612606565b61158b565b3480156106ed57600080fd5b506102d860fd5481565b34801561070357600080fd5b506102d8611623565b34801561071857600080fd5b5060fb5461048f906001600160a01b031681565b34801561073857600080fd5b506102bf6107473660046127cb565b61164d565b6097546001600160a01b0316331461077f5760405162461bcd60e51b815260040161077690612aa3565b60405180910390fd5b60fd548114156107be5760405162461bcd60e51b815260206004820152600a60248201526953616d6520707269636560b01b6044820152606401610776565b60fd55565b306001600160a01b037f00000000000000000000000028a82124699dd61fbadbdecede4e8a3fd80140df16141561080c5760405162461bcd60e51b8152600401610776906129bd565b7f00000000000000000000000028a82124699dd61fbadbdecede4e8a3fd80140df6001600160a01b031661083e6116bf565b6001600160a01b0316146108645760405162461bcd60e51b815260040161077690612a09565b61086d816116ed565b6040805160008082526020820190925261088991839190611717565b50565b6097546001600160a01b031633146108b65760405162461bcd60e51b815260040161077690612aa3565b806101065414156108f55760405162461bcd60e51b81526020600482015260096024820152681cd85b59481c9bdbdd60ba1b6044820152606401610776565b61010655565b6097546001600160a01b031633146109255760405162461bcd60e51b815260040161077690612aa3565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f207075626c69632073616c6560901b6044820152606401610776565b306001600160a01b037f00000000000000000000000028a82124699dd61fbadbdecede4e8a3fd80140df1614156109a75760405162461bcd60e51b8152600401610776906129bd565b7f00000000000000000000000028a82124699dd61fbadbdecede4e8a3fd80140df6001600160a01b03166109d96116bf565b6001600160a01b0316146109ff5760405162461bcd60e51b815260040161077690612a09565b610a08826116ed565b610a1482826001611717565b5050565b6097546001600160a01b03163314610a425760405162461bcd60e51b815260040161077690612aa3565b80610104541415610a825760405162461bcd60e51b815260206004820152600a6024820152690e6c2daca40d2dcc8caf60b31b6044820152606401610776565b61010455565b6097546001600160a01b03163314610ab25760405162461bcd60e51b815260040161077690612aa3565b60ff546001600160a01b03166323b872dd30610ad66097546001600160a01b031690565b60fc546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610b2857600080fd5b505af1158015610b3c573d6000803e3d6000fd5b50505050565b6097546001600160a01b03163314610b6c5760405162461bcd60e51b815260040161077690612aa3565b610b76600061185b565b565b6097546001600160a01b03163314610ba25760405162461bcd60e51b815260040161077690612aa3565b80610109541415610be75760405162461bcd60e51b815260206004820152600f60248201526e4e6f207374617465206368616e676560881b6044820152606401610776565b61010955565b600054610100900460ff1680610c06575060005460ff16155b610c225760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015610c44576000805461ffff19166101011790555b610c4c6118ad565b610c54611928565b60fb80546001600160a01b03808b166001600160a01b03199283161790925560fc89905560fe87905560fd88905560ff80548784169083161790556101008054928616929091169190911790556101048290558015610cb9576000805461ff00191690555b5050505050505050565b6101018181548110610cd457600080fd5b600091825260209091200180549091508190610cef90612cc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b90612cc5565b8015610d685780601f10610d3d57610100808354040283529160200191610d68565b820191906000526020600020905b815481529060010190602001808311610d4b57829003601f168201915b5050505050905081565b61010b5460ff1615610daf5760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610776565b6101075460ff16610e025760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610776565b6101095461010854610e149190612c06565b4310610e4f5760405162461bcd60e51b815260206004820152600a60248201526914d85b1948115b99195960b21b6044820152606401610776565b60008333604051602001610e7f92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050610ed983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610106549150849050611987565b610f1c5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21026b2b935b63290283937b7b360611b6044820152606401610776565b610f2585611a46565b5050505050565b6097546001600160a01b03163314610f565760405162461bcd60e51b815260040161077690612aa3565b60005b81811015611018576101016040518060200160405280858585818110610f8f57634e487b7160e01b600052603260045260246000fd5b9050602002810190610fa19190612bc1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250508354600181018555938152602090819020835180519495919091019361100493508492919091019061248b565b5050508061101190612d00565b9050610f59565b5081819050610102600082825461102f9190612c06565b90915550505050565b6097546001600160a01b031633146110625760405162461bcd60e51b815260040161077690612aa3565b61088981611b40565b6097546001600160a01b031633146110955760405162461bcd60e51b815260040161077690612aa3565b8083146110d55760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642061727261797360901b6044820152606401610776565b606060005b848110156111ee5785858281811061110257634e487b7160e01b600052603260045260246000fd5b905060200201602081019061111791906127a3565b84848381811061113757634e487b7160e01b600052603260045260246000fd5b9050602002013560405160200161117692919068697066733a2f2f516d60b81b81526001600160a01b0319929092166009830152601582015260350190565b60408051601f1981840301815260208381019092528083526101018054600181018255600091909152835180519296507f109ea3cebb188b9c1b9fc5bb3920be60dfdc8699098dff92f3d80daaca747689909101926111da9284929091019061248b565b505050806111e790612d00565b90506110da565b508484905061010260008282546112059190612c06565b90915550505050505050565b6097546001600160a01b0316331461123b5760405162461bcd60e51b815260040161077690612aa3565b6101075460ff16156112865760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610776565b610107805460ff1916600117905543610108556040517f912ee23dde46ec889d6748212cce445d667f7041597691dc89e8549ad8bc0acb90600090a1565b6097546001600160a01b031633146112ee5760405162461bcd60e51b815260040161077690612aa3565b6101035481141561132a5760405162461bcd60e51b81526004016107769060208082526004908201526353616d6560e01b604082015260600190565b61010355565b6097546001600160a01b0316331461135a5760405162461bcd60e51b815260040161077690612aa3565b61010b5460ff16151581151514156113a65760405162461bcd60e51b815260206004820152600f60248201526e4e6f207374617465206368616e676560881b6044820152606401610776565b61010b805460ff1916911515919091179055565b6097546001600160a01b031633146113e45760405162461bcd60e51b815260040161077690612aa3565b6101075460ff1661142a5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610776565b610107805460ff19169055565b600054610100900460ff1680611450575060005460ff16155b61146c5760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff1615801561148e576000805461ffff19166101011790555b6114966118ad565b61149e611928565b6114a6611c72565b6114b58b8b8b8b8a8a88610bed565b61010984905561010683905561010a87905561010b805460ff1916905580156114e4576000805461ff00191690555b5050505050505050505050565b6097546001600160a01b0316331461151b5760405162461bcd60e51b815260040161077690612aa3565b610100546001600160a01b03828116911614156115685760405162461bcd60e51b815260206004820152600b60248201526a14d85b594815d85b1b195d60aa1b6044820152606401610776565b61010080546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031633146115b55760405162461bcd60e51b815260040161077690612aa3565b6001600160a01b03811661161a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610776565b6108898161185b565b60fe5461010954610108546000929161163b91612c06565b431115611648575061010a545b905090565b6097546001600160a01b031633146116775760405162461bcd60e51b815260040161077690612aa3565b8060fc5414156116ba5760405162461bcd60e51b815260206004820152600e60248201526d14d85b59481c185c995b9d081a5960921b6044820152606401610776565b60fc55565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6097546001600160a01b031633146108895760405162461bcd60e51b815260040161077690612aa3565b60006117216116bf565b905061172c84611cd1565b6000835111806117395750815b1561174a576117488484611d76565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff16610f2557805460ff191660011781556040516001600160a01b03831660248201526117c990869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b179052611d76565b50805460ff191681556117da6116bf565b6001600160a01b0316826001600160a01b0316146118525760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b6064820152608401610776565b610f2585611e61565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806118c6575060005460ff16155b6118e25760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611904576000805461ffff19166101011790555b61190c611ea1565b611914611f0b565b8015610889576000805461ff001916905550565b600054610100900460ff1680611941575060005460ff16155b61195d5760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff1615801561197f576000805461ffff19166101011790555b611914611ea1565b600081815b8551811015611a395760008682815181106119b757634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116119f9576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611a26565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611a3181612d00565b91505061198c565b50831490505b9392505050565b60008160ff1611611a8f5760405162461bcd60e51b815260206004820152601360248201527216995c9bc81c1d5c98da185cd94818dbdd5b9d606a1b6044820152606401610776565b610101546101035410611ad65760405162461bcd60e51b815260206004820152600f60248201526e139bc8191bdb585a5b9cc81b19599d608a1b6044820152606401610776565b8060ff1660fd54611ae79190612c63565b3414611b2d5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840c2dadeeadce840decc40cae8d605b1b6044820152606401610776565b611b373382611f6b565b61088981611ff5565b60006101035461010454611b549190612c06565b6101035461010154919250600091611b6c9190612c82565b905060005b81811015611c645760fb5460fc546001600160a01b039091169063f5a2981c90611ba3611b9e8588612c06565b61230a565b87610101611bb1878a612c06565b81548110611bcf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001600001600060016040518763ffffffff1660e01b8152600401611c0196959493929190612ad8565b602060405180830381600087803b158015611c1b57600080fd5b505af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5391906128e4565b50611c5d81612d00565b9050611b71565b505061010154610103555050565b600054610100900460ff1680611c8b575060005460ff16155b611ca75760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611cc9576000805461ffff19166101011790555b61197f611ea1565b803b611d355760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610776565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b611dd55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610776565b600080846001600160a01b031684604051611df0919061298e565b600060405180830381855af49150503d8060008114611e2b576040519150601f19603f3d011682016040523d82523d6000602084013e611e30565b606091505b5091509150611e588282604051806060016040528060278152602001612d7d60279139612452565b95945050505050565b611e6a81611cd1565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b600054610100900460ff1680611eba575060005460ff16155b611ed65760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611914576000805461ffff19166101011790558015610889576000805461ff001916905550565b600054610100900460ff1680611f24575060005460ff16155b611f405760405162461bcd60e51b815260040161077690612a55565b600054610100900460ff16158015611f62576000805461ffff19166101011790555b6119143361185b565b6000611f75611623565b6001600160a01b038416600090815261010560205260409020549091508190611fa29060ff851690612c06565b1115611ff05760405162461bcd60e51b815260206004820152601860248201527f50757263686173696e67206265796f6e64206c696d69742e00000000000000006044820152606401610776565b505050565b6000808260ff1667ffffffffffffffff81111561202257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561204b578160200160208202803683370190505b509050600061010354610104546120629190612c06565b90505b8360ff168360ff1610801561207f57506101015461010354105b156120e05761010354828460ff16815181106120ab57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152826120c081612d1b565b610103805491955090915060006120d683612d00565b9190505550612065565b33600090815261010560205260409020546120ff9060ff851690612c06565b336000908152610105602052604081209190915560fd546121249060ff861690612c63565b610100546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612160573d6000803e3d6000fd5b508460ff168460ff1610156121e757600061217b8234612c82565b604051909150339082156108fc029083906000818181858888f193505050501580156121ab573d6000803e3d6000fd5b5060408051338152602081018390527f5e90a7af0e257106295d4cabfe31a7f0bc7100b422f59e277d09b25932f9aa74910160405180910390a1505b60005b8460ff168160ff1610156123025760fb5460fc546001600160a01b039091169063f5a2981c90612220611b9e60ff861688612c06565b33610101898760ff168151811061224757634e487b7160e01b600052603260045260246000fd5b60200260200101518154811061226d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001600001600060016040518763ffffffff1660e01b815260040161229f96959493929190612ad8565b602060405180830381600087803b1580156122b957600080fd5b505af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f191906128e4565b506122fb81612d1b565b90506121ea565b505050505050565b60608161232f57506040805180820190915260018152600360fc1b602082015261244d565b8160005b8115612359578061234381612d00565b91506123529050600a83612c43565b9150612333565b60008167ffffffffffffffff81111561238257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123ac576020820181803683370190505b509050815b8515612447576123c2600182612c82565b905060006123d1600a88612c43565b6123dc90600a612c63565b6123e69088612c82565b6123f1906030612c1e565b905060008160f81b90508084848151811061241c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061243e600a89612c43565b975050506123b1565b50925050505b919050565b60608315612461575081611a3f565b8251156124715782518084602001fd5b8160405162461bcd60e51b815260040161077691906129aa565b82805461249790612cc5565b90600052602060002090601f0160209004810192826124b957600085556124ff565b82601f106124d257805160ff19168380011785556124ff565b828001600101855582156124ff579182015b828111156124ff5782518255916020019190600101906124e4565b5061250b92915061250f565b5090565b5b8082111561250b5760008155600101612510565b60008083601f840112612535578081fd5b50813567ffffffffffffffff81111561254c578182fd5b6020830191508360208260051b850101111561256757600080fd5b9250929050565b600082601f83011261257e578081fd5b813567ffffffffffffffff8082111561259957612599612d51565b604051601f8301601f19908116603f011681019082821181831017156125c1576125c1612d51565b816040528381528660208588010111156125d9578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff8116811461244d57600080fd5b600060208284031215612617578081fd5b8135611a3f81612d67565b60008060008060808587031215612637578283fd5b843561264281612d67565b9350602085013561265281612d67565b925060408501359150606085013567ffffffffffffffff811115612674578182fd5b6126808782880161256e565b91505092959194509250565b6000806040838503121561269e578182fd5b82356126a981612d67565b9150602083013567ffffffffffffffff8111156126c4578182fd5b6126d08582860161256e565b9150509250929050565b600080600080604085870312156126ef578384fd5b843567ffffffffffffffff80821115612706578586fd5b61271288838901612524565b9096509450602087013591508082111561272a578384fd5b5061273787828801612524565b95989497509550505050565b60008060208385031215612755578182fd5b823567ffffffffffffffff81111561276b578283fd5b61277785828601612524565b90969095509350505050565b600060208284031215612794578081fd5b81358015158114611a3f578182fd5b6000602082840312156127b4578081fd5b81356001600160a01b031981168114611a3f578182fd5b6000602082840312156127dc578081fd5b5035919050565b600080600080600080600060e0888a0312156127fd578283fd5b873561280881612d67565b9650602088013595506040880135945060608801359350608088013561282d81612d67565b925060a088013561283d81612d67565b8092505060c0880135905092959891949750929550565b6000806000806000806000806000806101408b8d031215612873578384fd5b8a3561287e81612d67565b995060208b0135985060408b0135975060608b0135965060808b0135955060a08b01356128aa81612d67565b945060c08b01356128ba81612d67565b8094505060e08b013592506101008b013591506101208b013590509295989b9194979a5092959850565b6000602082840312156128f5578081fd5b5051919050565b60006020828403121561290d578081fd5b611a3f826125f5565b6000806000806060858703121561292b578182fd5b612934856125f5565b935060208501359250604085013567ffffffffffffffff811115612956578283fd5b61273787828801612524565b6000815180845261297a816020860160208601612c99565b601f01601f19169290920160200192915050565b600082516129a0818460208701612c99565b9190910192915050565b600060208252611a3f6020830184612962565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000878252602060c081840152612af260c0840189612962565b6001600160a01b0388166040850152838103606085015286548390600181811c9082811680612b2257607f831692505b868310811415612b4057634e487b7160e01b88526022600452602488fd5b828652602086019550808015612b5d5760018114612b6e57612b98565b60ff19851687528787019550612b98565b60008d815260209020895b85811015612b9257815489820152908401908901612b79565b88019650505b50505050506080850187905285151560a08601529250612bb6915050565b979650505050505050565b6000808335601e19843603018112612bd7578283fd5b83018035915067ffffffffffffffff821115612bf1578283fd5b60200191503681900382131561256757600080fd5b60008219821115612c1957612c19612d3b565b500190565b600060ff821660ff84168060ff03821115612c3b57612c3b612d3b565b019392505050565b600082612c5e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612c7d57612c7d612d3b565b500290565b600082821015612c9457612c94612d3b565b500390565b60005b83811015612cb4578181015183820152602001612c9c565b83811115610b3c5750506000910152565b600181811c90821680612cd957607f821691505b60208210811415612cfa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d1457612d14612d3b565b5060010190565b600060ff821660ff811415612d3257612d32612d3b565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461088957600080fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212207ba270d8efc81a0ebfbd2e49ecd014f1b8701839a94610b38d5c1e5191e96ae664736f6c63430008030033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.