Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
Multi Chain
Multichain Addresses
5 addresses found via
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Mint Leading Zer... | 9294896 | 84 days 18 mins ago | IN | 0 ETH | 0.00026308 | ||||
Mint Sandwich | 8019292 | 305 days 19 hrs ago | IN | 0 ETH | 0.0045591 | ||||
Mint Sandwich | 8019292 | 305 days 19 hrs ago | IN | 0 ETH | 0.00197 | ||||
Mint Sandwich | 8019292 | 305 days 19 hrs ago | IN | 0 ETH | 0.00197 | ||||
Mint Leading Zer... | 7792788 | 343 days 19 hrs ago | IN | 0 ETH | 0.00002557 | ||||
Mint Sandwich | 7670863 | 364 days 18 hrs ago | IN | 0 ETH | 0.00021656 | ||||
Mint Sandwich | 7670863 | 364 days 18 hrs ago | IN | 0 ETH | 0.0000788 | ||||
Mint Sandwich | 7670863 | 364 days 18 hrs ago | IN | 0 ETH | 0.0001528 | ||||
Set UR Is | 7621230 | 373 days 3 hrs ago | IN | 0 ETH | 0.00100695 | ||||
Set UR Is | 7621224 | 373 days 3 hrs ago | IN | 0 ETH | 0.00098484 | ||||
Set UR Is | 7621220 | 373 days 3 hrs ago | IN | 0 ETH | 0.00090542 | ||||
Set UR Is | 7621203 | 373 days 3 hrs ago | IN | 0 ETH | 0.00012621 | ||||
Mint Sandwich | 7619247 | 373 days 11 hrs ago | IN | 0 ETH | 0.0001416 | ||||
0x60806040 | 7577364 | 380 days 5 hrs ago | IN | Create: MevOlympics | 0 ETH | 0.0262592 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
8019292 | 305 days 19 hrs ago | 0 ETH | ||||
7670863 | 364 days 18 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621230 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621224 | 373 days 3 hrs ago | 0 ETH | ||||
7621220 | 373 days 3 hrs ago | 0 ETH | ||||
7621220 | 373 days 3 hrs ago | 0 ETH | ||||
7621220 | 373 days 3 hrs ago | 0 ETH |
Loading...
Loading
Contract Name:
MevOlympics
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "./OneNFT.sol"; /** * @title MEV Olympics * @author Stuxden * @notice Implementation of challenge segments. * each segment contains its own ladder, implemented as an NFT */ contract MevOlympics is AccessControl { /// @notice leading zeroes segment OneNFT public zeroesNFT; uint public leadingZeroes; /// @notice for the sandwich segment OneNFT public sandwichNFT; uint256 private blockNumber1; uint256 private blockNumber2; address private txOrigin1; address private txOrigin2; /// @notice the MergeNft OneNFT public mergeNFT; uint256 public mergeBlockNumbner; constructor(uint leadingZeroes_, uint256 mergeBlockNumbner_) { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); zeroesNFT = new OneNFT("LeadingZeroes", "LZNFT"); sandwichNFT = new OneNFT("Sandwich", "SNFT"); mergeNFT = new OneNFT("MintOnMerge", "MNFT"); leadingZeroes = leadingZeroes_; mergeBlockNumbner = mergeBlockNumbner_; } function setURIs(address token, uint[] memory tokenIds, string [] memory uris) external onlyRole(DEFAULT_ADMIN_ROLE) { for (uint i=0; i<uris.length; i++){ OneNFT(token).setTokenURI(tokenIds[i], uris[i]); } } function getLeadingZeroesRanks(uint amountOfRanks) public view returns (address[] memory) { return getTokenOwnersInRange(address(zeroesNFT), 0, amountOfRanks); } function getSandwichRanks(uint amountOfRanks) public view returns (address[] memory) { return getTokenOwnersInRange(address(sandwichNFT), 0, amountOfRanks); } function getMergeRanks(uint amountOfRanks) public view returns (address[] memory) { return getTokenOwnersInRange(address(mergeNFT), 0, amountOfRanks); } /// @notice gets an ordered array of tokenOwners, assumes linearly incremented tokenId by 1 and not burnable function getTokenOwnersInRange(address tokenAddr, uint startRank, uint amountOfRanks) public view returns (address[] memory) { address[] memory owners = new address[](amountOfRanks); for (uint i=0; i < amountOfRanks; i++) { try IERC721(tokenAddr).ownerOf(startRank+i) returns (address ranked) { owners[i] = ranked; } catch { // tokenId value does not exist return owners; } } return owners; } /// @notice leading zeroes challenge segment function mintLeadingZeroes() external returns (uint256) { require( getLeadingZeroes(msg.sender) >= leadingZeroes, "not enough leading zeroes" ); return zeroesNFT.mint(msg.sender); } /** @notice sandwich challenge segment * requires calling by address whome we wish to mint for. * thereafter calling it again with a different address (simulated sandwich) * and then calling it again all in the same block inorder to mint */ function mintSandwich() external returns (uint256) { if(sandwichTest()) { return sandwichNFT.mint(msg.sender); } setBlockAndOrigin(); return 0; } /// @notice merge challenge segment function mintMerge() external returns (uint256) { require( block.number == mergeBlockNumbner, "can only mint on mergeblock" ); return mergeNFT.mint(msg.sender); } /// @dev Leading Zeroes segment helper func, Returns amount of leading zero bytes in a given address function getLeadingZeroes(address addr) internal pure returns (uint) { bytes20 bytesAdr = bytes20(addr); uint counter = 0; for (uint i = 0; i < 20; i++) { if (uint8(bytesAdr[i]) == 0) { counter++; } else { break; } } return counter; } /// @notice sandwich segment functions function setBlockAndOrigin() internal { txOrigin2 = txOrigin1; txOrigin1 = tx.origin; blockNumber2 = blockNumber1; blockNumber1 = block.number; } function sandwichTest() internal view returns (bool) { if ((tx.origin != txOrigin1) && (tx.origin == txOrigin2)) if ( (block.number == blockNumber1) && (block.number == blockNumber2) ) { return true; } return false; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; /** * @title MEV Olympics One NFT * @author Stuxden * @notice Implementation of a mintable NFT with modifier based access controls * which allows only one nft minted per address */ contract OneNFT is ERC721, AccessControl { using Counters for Counters.Counter; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); Counters.Counter private _tokenIdCounter; mapping(uint256 => string) private _tokenURIs; constructor(string memory name, string memory symbol) ERC721(name, symbol) { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(MINTER_ROLE, msg.sender); } /// @notice allows only one token per address modifier notNftOwner(address addr) { require(balanceOf(addr) == 0, "can only own one token"); _; } function setTokenURI(uint256 tokenId, string memory _tokenURI) external onlyRole(MINTER_ROLE) { _tokenURIs[tokenId] = _tokenURI; } /** * @dev Returns an URI for a given token ID */ function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { return _tokenURIs[tokenId]; } function mint(address to) public onlyRole(MINTER_ROLE) notNftOwner(to) returns (uint256) { uint256 tokenId = _tokenIdCounter.current(); _mint(to, tokenId); _tokenIdCounter.increment(); return tokenId; } /// @notice disallow transfers to token holders function transferFrom( address from, address to, uint256 tokenId ) public notNftOwner(to) override(ERC721) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public notNftOwner(to) override(ERC721) { super.safeTransferFrom(from, to, tokenId, data); } function safeTransferFrom( address from, address to, uint256 tokenId ) public notNftOwner(to) override(ERC721) { super.safeTransferFrom(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @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, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) 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 IERC721Receiver { /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
[{"inputs":[{"internalType":"uint256","name":"leadingZeroes_","type":"uint256"},{"internalType":"uint256","name":"mergeBlockNumbner_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfRanks","type":"uint256"}],"name":"getLeadingZeroesRanks","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfRanks","type":"uint256"}],"name":"getMergeRanks","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfRanks","type":"uint256"}],"name":"getSandwichRanks","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"startRank","type":"uint256"},{"internalType":"uint256","name":"amountOfRanks","type":"uint256"}],"name":"getTokenOwnersInRange","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leadingZeroes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mergeBlockNumbner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mergeNFT","outputs":[{"internalType":"contract OneNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLeadingZeroes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintMerge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintSandwich","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sandwichNFT","outputs":[{"internalType":"contract OneNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zeroesNFT","outputs":[{"internalType":"contract OneNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620061b8380380620061b883398181016040528101906200003791906200038e565b6200004c6000801b33620001c760201b60201c565b6040516200005a9062000340565b620000659062000486565b604051809103906000f08015801562000082573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051620000d19062000340565b620000dc906200055d565b604051809103906000f080158015620000f9573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051620001489062000340565b620001539062000634565b604051809103906000f08015801562000170573d6000803e3d6000fd5b50600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816002819055508060098190555050506200066b565b620001d98282620001dd60201b60201c565b5050565b620001ef8282620002ce60201b60201c565b620002ca57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200026f6200033860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b613ad780620026e183390190565b600080fd5b6000819050919050565b620003688162000353565b81146200037457600080fd5b50565b60008151905062000388816200035d565b92915050565b60008060408385031215620003a857620003a76200034e565b5b6000620003b88582860162000377565b9250506020620003cb8582860162000377565b9150509250929050565b600082825260208201905092915050565b7f4c656164696e675a65726f657300000000000000000000000000000000000000600082015250565b60006200041e600d83620003d5565b91506200042b82620003e6565b602082019050919050565b7f4c5a4e4654000000000000000000000000000000000000000000000000000000600082015250565b60006200046e600583620003d5565b91506200047b8262000436565b602082019050919050565b60006040820190508181036000830152620004a1816200040f565b90508181036020830152620004b6816200045f565b9050919050565b7f53616e6477696368000000000000000000000000000000000000000000000000600082015250565b6000620004f5600883620003d5565b91506200050282620004bd565b602082019050919050565b7f534e465400000000000000000000000000000000000000000000000000000000600082015250565b600062000545600483620003d5565b915062000552826200050d565b602082019050919050565b600060408201905081810360008301526200057881620004e6565b905081810360208301526200058d8162000536565b9050919050565b7f4d696e744f6e4d65726765000000000000000000000000000000000000000000600082015250565b6000620005cc600b83620003d5565b9150620005d98262000594565b602082019050919050565b7f4d4e465400000000000000000000000000000000000000000000000000000000600082015250565b60006200061c600483620003d5565b91506200062982620005e4565b602082019050919050565b600060408201905081810360008301526200064f81620005bd565b9050818103602083015262000664816200060d565b9050919050565b612066806200067b6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80637714b02e116100ad578063a97232f411610071578063a97232f41461035b578063c016217c14610379578063c190e06f146103a9578063cb4a64ba146103c7578063d547741f146103e35761012c565b80637714b02e146102b35780638f966c55146102d157806391d14854146102ef578063a217fddf1461031f578063a56889eb1461033d5761012c565b8063379bc1f1116100f4578063379bc1f1146101e75780634ab84891146102055780634e74d8eb1461023557806356b823b9146102655780636eb034bb146102955761012c565b806301ffc9a714610131578063248a9ca3146101615780632d63f81e146101915780632f2ff15d146101af57806336568abe146101cb575b600080fd5b61014b60048036038101906101469190611346565b6103ff565b604051610158919061138e565b60405180910390f35b61017b600480360381019061017691906113df565b610479565b604051610188919061141b565b60405180910390f35b610199610498565b6040516101a6919061144f565b60405180910390f35b6101c960048036038101906101c491906114c8565b61055c565b005b6101e560048036038101906101e091906114c8565b61057d565b005b6101ef610600565b6040516101fc9190611567565b60405180910390f35b61021f600480360381019061021a91906115ae565b610626565b60405161022c9190611699565b60405180910390f35b61024f600480360381019061024a91906115ae565b61065d565b60405161025c9190611699565b60405180910390f35b61027f600480360381019061027a91906115ae565b610694565b60405161028c9190611699565b60405180910390f35b61029d6106cb565b6040516102aa919061144f565b60405180910390f35b6102bb6107bd565b6040516102c8919061144f565b60405180910390f35b6102d96107c3565b6040516102e6919061144f565b60405180910390f35b610309600480360381019061030491906114c8565b6108ac565b604051610316919061138e565b60405180910390f35b610327610916565b604051610334919061141b565b60405180910390f35b61034561091d565b604051610352919061144f565b60405180910390f35b610363610923565b6040516103709190611567565b60405180910390f35b610393600480360381019061038e91906116bb565b610949565b6040516103a09190611699565b60405180910390f35b6103b1610a9e565b6040516103be9190611567565b60405180910390f35b6103e160048036038101906103dc91906119fd565b610ac4565b005b6103fd60048036038101906103f891906114c8565b610b98565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610472575061047182610bb9565b5b9050919050565b6000806000838152602001908152602001600020600101549050919050565b60006104a2610c23565b1561054c57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016105029190611a97565b6020604051808303816000875af1158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190611ac7565b9050610559565b610554610cfe565b600090505b90565b61056582610479565b61056e81610db4565b6105788383610dc8565b505050565b610585610ea8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e990611b77565b60405180910390fd5b6105fc8282610eb0565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610656600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600084610949565b9050919050565b606061068d600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600084610949565b9050919050565b60606106c4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600084610949565b9050919050565b60006002546106d933610f91565b101561071a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190611be3565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016107759190611a97565b6020604051808303816000875af1158015610794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b89190611ac7565b905090565b60025481565b60006009544314610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090611c4f565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016108649190611a97565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190611ac7565b905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b60095481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008267ffffffffffffffff81111561096757610966611724565b5b6040519080825280602002602001820160405280156109955781602001602082028036833780820191505090505b50905060005b83811015610a91578573ffffffffffffffffffffffffffffffffffffffff16636352211e82876109cb9190611c9e565b6040518263ffffffff1660e01b81526004016109e7919061144f565b602060405180830381865afa925050508015610a2157506040513d601f19601f82011682018060405250810190610a1e9190611ce7565b60015b610a2f578192505050610a97565b80838381518110610a4357610a42611d14565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050508080610a8990611d43565b91505061099b565b50809150505b9392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b610ad181610db4565b60005b8251811015610b91578473ffffffffffffffffffffffffffffffffffffffff1663162094c4858381518110610b0c57610b0b611d14565b5b6020026020010151858481518110610b2757610b26611d14565b5b60200260200101516040518363ffffffff1660e01b8152600401610b4c929190611df9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b505050508080610b8990611d43565b915050610ad4565b5050505050565b610ba182610479565b610baa81610db4565b610bb48383610eb0565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614158015610cd05750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b15610cf65760045443148015610ce7575060055443145b15610cf55760019050610cfb565b5b600090505b90565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555032600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060045460058190555043600481905550565b610dc581610dc0610ea8565b611001565b50565b610dd282826108ac565b610ea457600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e49610ea8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b610eba82826108ac565b15610f8d57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610f32610ea8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808260601b90506000805b6014811015610ff6576000838260148110610fbc57610fbb611d14565b5b1a60f81b60f81c60ff1603610fde578180610fd690611d43565b925050610fe3565b610ff6565b8080610fee90611d43565b915050610f9e565b508092505050919050565b61100b82826108ac565b61109a576110308173ffffffffffffffffffffffffffffffffffffffff16601461109e565b61103e8360001c602061109e565b60405160200161104f929190611efd565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110919190611f37565b60405180910390fd5b5050565b6060600060028360026110b19190611f59565b6110bb9190611c9e565b67ffffffffffffffff8111156110d4576110d3611724565b5b6040519080825280601f01601f1916602001820160405280156111065781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061113e5761113d611d14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106111a2576111a1611d14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026111e29190611f59565b6111ec9190611c9e565b90505b600181111561128c577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061122e5761122d611d14565b5b1a60f81b82828151811061124557611244611d14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061128590611f9b565b90506111ef565b50600084146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790612010565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611323816112ee565b811461132e57600080fd5b50565b6000813590506113408161131a565b92915050565b60006020828403121561135c5761135b6112e4565b5b600061136a84828501611331565b91505092915050565b60008115159050919050565b61138881611373565b82525050565b60006020820190506113a3600083018461137f565b92915050565b6000819050919050565b6113bc816113a9565b81146113c757600080fd5b50565b6000813590506113d9816113b3565b92915050565b6000602082840312156113f5576113f46112e4565b5b6000611403848285016113ca565b91505092915050565b611415816113a9565b82525050565b6000602082019050611430600083018461140c565b92915050565b6000819050919050565b61144981611436565b82525050565b60006020820190506114646000830184611440565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114958261146a565b9050919050565b6114a58161148a565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b600080604083850312156114df576114de6112e4565b5b60006114ed858286016113ca565b92505060206114fe858286016114b3565b9150509250929050565b6000819050919050565b600061152d6115286115238461146a565b611508565b61146a565b9050919050565b600061153f82611512565b9050919050565b600061155182611534565b9050919050565b61156181611546565b82525050565b600060208201905061157c6000830184611558565b92915050565b61158b81611436565b811461159657600080fd5b50565b6000813590506115a881611582565b92915050565b6000602082840312156115c4576115c36112e4565b5b60006115d284828501611599565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6116108161148a565b82525050565b60006116228383611607565b60208301905092915050565b6000602082019050919050565b6000611646826115db565b61165081856115e6565b935061165b836115f7565b8060005b8381101561168c5781516116738882611616565b975061167e8361162e565b92505060018101905061165f565b5085935050505092915050565b600060208201905081810360008301526116b3818461163b565b905092915050565b6000806000606084860312156116d4576116d36112e4565b5b60006116e2868287016114b3565b93505060206116f386828701611599565b925050604061170486828701611599565b9150509250925092565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61175c82611713565b810181811067ffffffffffffffff8211171561177b5761177a611724565b5b80604052505050565b600061178e6112da565b905061179a8282611753565b919050565b600067ffffffffffffffff8211156117ba576117b9611724565b5b602082029050602081019050919050565b600080fd5b60006117e36117de8461179f565b611784565b90508083825260208201905060208402830185811115611806576118056117cb565b5b835b8181101561182f578061181b8882611599565b845260208401935050602081019050611808565b5050509392505050565b600082601f83011261184e5761184d61170e565b5b813561185e8482602086016117d0565b91505092915050565b600067ffffffffffffffff82111561188257611881611724565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156118b3576118b2611724565b5b6118bc82611713565b9050602081019050919050565b82818337600083830152505050565b60006118eb6118e684611898565b611784565b90508281526020810184848401111561190757611906611893565b5b6119128482856118c9565b509392505050565b600082601f83011261192f5761192e61170e565b5b813561193f8482602086016118d8565b91505092915050565b600061195b61195684611867565b611784565b9050808382526020820190506020840283018581111561197e5761197d6117cb565b5b835b818110156119c557803567ffffffffffffffff8111156119a3576119a261170e565b5b8086016119b0898261191a565b85526020850194505050602081019050611980565b5050509392505050565b600082601f8301126119e4576119e361170e565b5b81356119f4848260208601611948565b91505092915050565b600080600060608486031215611a1657611a156112e4565b5b6000611a24868287016114b3565b935050602084013567ffffffffffffffff811115611a4557611a446112e9565b5b611a5186828701611839565b925050604084013567ffffffffffffffff811115611a7257611a716112e9565b5b611a7e868287016119cf565b9150509250925092565b611a918161148a565b82525050565b6000602082019050611aac6000830184611a88565b92915050565b600081519050611ac181611582565b92915050565b600060208284031215611add57611adc6112e4565b5b6000611aeb84828501611ab2565b91505092915050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000611b61602f83611af4565b9150611b6c82611b05565b604082019050919050565b60006020820190508181036000830152611b9081611b54565b9050919050565b7f6e6f7420656e6f756768206c656164696e67207a65726f657300000000000000600082015250565b6000611bcd601983611af4565b9150611bd882611b97565b602082019050919050565b60006020820190508181036000830152611bfc81611bc0565b9050919050565b7f63616e206f6e6c79206d696e74206f6e206d65726765626c6f636b0000000000600082015250565b6000611c39601b83611af4565b9150611c4482611c03565b602082019050919050565b60006020820190508181036000830152611c6881611c2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611ca982611436565b9150611cb483611436565b9250828201905080821115611ccc57611ccb611c6f565b5b92915050565b600081519050611ce18161149c565b92915050565b600060208284031215611cfd57611cfc6112e4565b5b6000611d0b84828501611cd2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d4e82611436565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d8057611d7f611c6f565b5b600182019050919050565b600081519050919050565b60005b83811015611db4578082015181840152602081019050611d99565b60008484015250505050565b6000611dcb82611d8b565b611dd58185611af4565b9350611de5818560208601611d96565b611dee81611713565b840191505092915050565b6000604082019050611e0e6000830185611440565b8181036020830152611e208184611dc0565b90509392505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000611e6a601783611e29565b9150611e7582611e34565b601782019050919050565b6000611e8b82611d8b565b611e958185611e29565b9350611ea5818560208601611d96565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000611ee7601183611e29565b9150611ef282611eb1565b601182019050919050565b6000611f0882611e5d565b9150611f148285611e80565b9150611f1f82611eda565b9150611f2b8284611e80565b91508190509392505050565b60006020820190508181036000830152611f518184611dc0565b905092915050565b6000611f6482611436565b9150611f6f83611436565b9250828202611f7d81611436565b91508282048414831517611f9457611f93611c6f565b5b5092915050565b6000611fa682611436565b915060008203611fb957611fb8611c6f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000611ffa602083611af4565b915061200582611fc4565b602082019050919050565b6000602082019050818103600083015261202981611fed565b905091905056fea26469706673582212207378af7a887aeb59f76a3f555768f32be8c413a3cca518c4a82584c0def5cefb64736f6c6343000811003360806040523480156200001157600080fd5b5060405162003ad738038062003ad78339818101604052810190620000379190620003bc565b818181600090816200004a91906200068c565b5080600190816200005c91906200068c565b505050620000746000801b33620000ae60201b60201c565b620000a67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000ae60201b60201c565b505062000773565b620000c08282620000c460201b60201c565b5050565b620000d68282620001b660201b60201c565b620001b25760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001576200022160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002928262000247565b810181811067ffffffffffffffff82111715620002b457620002b362000258565b5b80604052505050565b6000620002c962000229565b9050620002d7828262000287565b919050565b600067ffffffffffffffff821115620002fa57620002f962000258565b5b620003058262000247565b9050602081019050919050565b60005b838110156200033257808201518184015260208101905062000315565b60008484015250505050565b6000620003556200034f84620002dc565b620002bd565b90508281526020810184848401111562000374576200037362000242565b5b6200038184828562000312565b509392505050565b600082601f830112620003a157620003a06200023d565b5b8151620003b38482602086016200033e565b91505092915050565b60008060408385031215620003d657620003d562000233565b5b600083015167ffffffffffffffff811115620003f757620003f662000238565b5b620004058582860162000389565b925050602083015167ffffffffffffffff81111562000429576200042862000238565b5b620004378582860162000389565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049457607f821691505b602082108103620004aa57620004a96200044c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004d5565b620005208683620004d5565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200056d62000567620005618462000538565b62000542565b62000538565b9050919050565b6000819050919050565b62000589836200054c565b620005a1620005988262000574565b848454620004e2565b825550505050565b600090565b620005b8620005a9565b620005c58184846200057e565b505050565b5b81811015620005ed57620005e1600082620005ae565b600181019050620005cb565b5050565b601f8211156200063c576200060681620004b0565b6200061184620004c5565b8101602085101562000621578190505b620006396200063085620004c5565b830182620005ca565b50505b505050565b600082821c905092915050565b6000620006616000198460080262000641565b1980831691505092915050565b60006200067c83836200064e565b9150826002028217905092915050565b620006978262000441565b67ffffffffffffffff811115620006b357620006b262000258565b5b620006bf82546200047b565b620006cc828285620005f1565b600060209050601f831160018114620007045760008415620006ef578287015190505b620006fb85826200066e565b8655506200076b565b601f1984166200071486620004b0565b60005b828110156200073e5784890151825560018201915060208501945060208101905062000717565b868310156200075e57848901516200075a601f8916826200064e565b8355505b6001600288020188555050505b505050505050565b61335480620007836000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636a627842116100b8578063a22cb4651161007c578063a22cb46514610399578063b88d4fde146103b5578063c87b56dd146103d1578063d539139314610401578063d547741f1461041f578063e985e9c51461043b57610142565b80636a627842146102cd57806370a08231146102fd57806391d148541461032d57806395d89b411461035d578063a217fddf1461037b57610142565b806323b872dd1161010a57806323b872dd146101fd578063248a9ca3146102195780632f2ff15d1461024957806336568abe1461026557806342842e0e146102815780636352211e1461029d57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c5578063162094c4146101e1575b600080fd5b610161600480360381019061015c9190611eee565b61046b565b60405161016e9190611f36565b60405180910390f35b61017f61047d565b60405161018c9190611fe1565b60405180910390f35b6101af60048036038101906101aa9190612039565b61050f565b6040516101bc91906120a7565b60405180910390f35b6101df60048036038101906101da91906120ee565b610555565b005b6101fb60048036038101906101f69190612263565b61066c565b005b610217600480360381019061021291906122bf565b6106bc565b005b610233600480360381019061022e9190612348565b610719565b6040516102409190612384565b60405180910390f35b610263600480360381019061025e919061239f565b610739565b005b61027f600480360381019061027a919061239f565b61075a565b005b61029b600480360381019061029691906122bf565b6107dd565b005b6102b760048036038101906102b29190612039565b61083a565b6040516102c491906120a7565b60405180910390f35b6102e760048036038101906102e291906123df565b6108eb565b6040516102f4919061241b565b60405180910390f35b610317600480360381019061031291906123df565b610990565b604051610324919061241b565b60405180910390f35b6103476004803603810190610342919061239f565b610a47565b6040516103549190611f36565b60405180910390f35b610365610ab2565b6040516103729190611fe1565b60405180910390f35b610383610b44565b6040516103909190612384565b60405180910390f35b6103b360048036038101906103ae9190612462565b610b4b565b005b6103cf60048036038101906103ca9190612543565b610b61565b005b6103eb60048036038101906103e69190612039565b610bc0565b6040516103f89190611fe1565b60405180910390f35b610409610c65565b6040516104169190612384565b60405180910390f35b6104396004803603810190610434919061239f565b610c89565b005b610455600480360381019061045091906125c6565b610caa565b6040516104629190611f36565b60405180910390f35b600061047682610d3e565b9050919050565b60606000805461048c90612635565b80601f01602080910402602001604051908101604052809291908181526020018280546104b890612635565b80156105055780601f106104da57610100808354040283529160200191610505565b820191906000526020600020905b8154815290600101906020018083116104e857829003601f168201915b5050505050905090565b600061051a82610db8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105608261083a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c7906126d8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105ef610e03565b73ffffffffffffffffffffffffffffffffffffffff16148061061e575061061d81610618610e03565b610caa565b5b61065d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106549061276a565b60405180910390fd5b6106678383610e0b565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661069681610ec4565b816008600085815260200190815260200160002090816106b69190612936565b50505050565b8160006106c882610990565b14610708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ff90612a54565b60405180910390fd5b610713848484610ed8565b50505050565b600060066000838152602001908152602001600020600101549050919050565b61074282610719565b61074b81610ec4565b6107558383610f38565b505050565b610762610e03565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c690612ae6565b60405180910390fd5b6107d98282611019565b5050565b8160006107e982610990565b14610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082090612a54565b60405180910390fd5b6108348484846110fb565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990612b52565b60405180910390fd5b80915050919050565b60007f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661091781610ec4565b82600061092382610990565b14610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095a90612a54565b60405180910390fd5b600061096f600761111b565b905061097b8582611129565b6109856007611302565b809350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f790612be4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610ac190612635565b80601f0160208091040260200160405190810160405280929190818152602001828054610aed90612635565b8015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b5050505050905090565b6000801b81565b610b5d610b56610e03565b8383611318565b5050565b826000610b6d82610990565b14610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490612a54565b60405180910390fd5b610bb985858585611484565b5050505050565b6060600860008381526020019081526020016000208054610be090612635565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0c90612635565b8015610c595780601f10610c2e57610100808354040283529160200191610c59565b820191906000526020600020905b815481529060010190602001808311610c3c57829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610c9282610719565b610c9b81610ec4565b610ca58383611019565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610db15750610db0826114e6565b5b9050919050565b610dc1816115c8565b610e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df790612b52565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610e7e8361083a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610ed581610ed0610e03565b611634565b50565b610ee9610ee3610e03565b826116d1565b610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f90612c76565b60405180910390fd5b610f33838383611766565b505050565b610f428282610a47565b6110155760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610fba610e03565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6110238282610a47565b156110f75760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061109c610e03565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61111683838360405180602001604052806000815250610b61565b505050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90612ce2565b60405180910390fd5b6111a1816115c8565b156111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890612d4e565b60405180910390fd5b6111ed600083836119cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461123d9190612d9d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112fe600083836119d1565b5050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90612e1d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114779190611f36565b60405180910390a3505050565b61149561148f610e03565b836116d1565b6114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90612c76565b60405180910390fd5b6114e0848484846119d6565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115b157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115c157506115c082611a32565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61163e8282610a47565b6116cd576116638173ffffffffffffffffffffffffffffffffffffffff166014611a9c565b6116718360001c6020611a9c565b604051602001611682929190612f11565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c49190611fe1565b60405180910390fd5b5050565b6000806116dd8361083a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061171f575061171e8185610caa565b5b8061175d57508373ffffffffffffffffffffffffffffffffffffffff166117458461050f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117868261083a565b73ffffffffffffffffffffffffffffffffffffffff16146117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d390612fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118429061304f565b60405180910390fd5b6118568383836119cc565b611861600082610e0b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118b1919061306f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119089190612d9d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119c78383836119d1565b505050565b505050565b505050565b6119e1848484611766565b6119ed84848484611cd8565b611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390613115565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060006002836002611aaf9190613135565b611ab99190612d9d565b67ffffffffffffffff811115611ad257611ad1612138565b5b6040519080825280601f01601f191660200182016040528015611b045781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611b3c57611b3b613177565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ba057611b9f613177565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611be09190613135565b611bea9190612d9d565b90505b6001811115611c8a577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611c2c57611c2b613177565b5b1a60f81b828281518110611c4357611c42613177565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611c83906131a6565b9050611bed565b5060008414611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc59061321b565b60405180910390fd5b8091505092915050565b6000611cf98473ffffffffffffffffffffffffffffffffffffffff16611e5f565b15611e52578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d22610e03565b8786866040518563ffffffff1660e01b8152600401611d449493929190613290565b6020604051808303816000875af1925050508015611d8057506040513d601f19601f82011682018060405250810190611d7d91906132f1565b60015b611e02573d8060008114611db0576040519150601f19603f3d011682016040523d82523d6000602084013e611db5565b606091505b506000815103611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df190613115565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611e57565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ecb81611e96565b8114611ed657600080fd5b50565b600081359050611ee881611ec2565b92915050565b600060208284031215611f0457611f03611e8c565b5b6000611f1284828501611ed9565b91505092915050565b60008115159050919050565b611f3081611f1b565b82525050565b6000602082019050611f4b6000830184611f27565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f8b578082015181840152602081019050611f70565b60008484015250505050565b6000601f19601f8301169050919050565b6000611fb382611f51565b611fbd8185611f5c565b9350611fcd818560208601611f6d565b611fd681611f97565b840191505092915050565b60006020820190508181036000830152611ffb8184611fa8565b905092915050565b6000819050919050565b61201681612003565b811461202157600080fd5b50565b6000813590506120338161200d565b92915050565b60006020828403121561204f5761204e611e8c565b5b600061205d84828501612024565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061209182612066565b9050919050565b6120a181612086565b82525050565b60006020820190506120bc6000830184612098565b92915050565b6120cb81612086565b81146120d657600080fd5b50565b6000813590506120e8816120c2565b92915050565b6000806040838503121561210557612104611e8c565b5b6000612113858286016120d9565b925050602061212485828601612024565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61217082611f97565b810181811067ffffffffffffffff8211171561218f5761218e612138565b5b80604052505050565b60006121a2611e82565b90506121ae8282612167565b919050565b600067ffffffffffffffff8211156121ce576121cd612138565b5b6121d782611f97565b9050602081019050919050565b82818337600083830152505050565b6000612206612201846121b3565b612198565b90508281526020810184848401111561222257612221612133565b5b61222d8482856121e4565b509392505050565b600082601f83011261224a5761224961212e565b5b813561225a8482602086016121f3565b91505092915050565b6000806040838503121561227a57612279611e8c565b5b600061228885828601612024565b925050602083013567ffffffffffffffff8111156122a9576122a8611e91565b5b6122b585828601612235565b9150509250929050565b6000806000606084860312156122d8576122d7611e8c565b5b60006122e6868287016120d9565b93505060206122f7868287016120d9565b925050604061230886828701612024565b9150509250925092565b6000819050919050565b61232581612312565b811461233057600080fd5b50565b6000813590506123428161231c565b92915050565b60006020828403121561235e5761235d611e8c565b5b600061236c84828501612333565b91505092915050565b61237e81612312565b82525050565b60006020820190506123996000830184612375565b92915050565b600080604083850312156123b6576123b5611e8c565b5b60006123c485828601612333565b92505060206123d5858286016120d9565b9150509250929050565b6000602082840312156123f5576123f4611e8c565b5b6000612403848285016120d9565b91505092915050565b61241581612003565b82525050565b6000602082019050612430600083018461240c565b92915050565b61243f81611f1b565b811461244a57600080fd5b50565b60008135905061245c81612436565b92915050565b6000806040838503121561247957612478611e8c565b5b6000612487858286016120d9565b92505060206124988582860161244d565b9150509250929050565b600067ffffffffffffffff8211156124bd576124bc612138565b5b6124c682611f97565b9050602081019050919050565b60006124e66124e1846124a2565b612198565b90508281526020810184848401111561250257612501612133565b5b61250d8482856121e4565b509392505050565b600082601f83011261252a5761252961212e565b5b813561253a8482602086016124d3565b91505092915050565b6000806000806080858703121561255d5761255c611e8c565b5b600061256b878288016120d9565b945050602061257c878288016120d9565b935050604061258d87828801612024565b925050606085013567ffffffffffffffff8111156125ae576125ad611e91565b5b6125ba87828801612515565b91505092959194509250565b600080604083850312156125dd576125dc611e8c565b5b60006125eb858286016120d9565b92505060206125fc858286016120d9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061264d57607f821691505b6020821081036126605761265f612606565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006126c2602183611f5c565b91506126cd82612666565b604082019050919050565b600060208201905081810360008301526126f1816126b5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612754603e83611f5c565b915061275f826126f8565b604082019050919050565b6000602082019050818103600083015261278381612747565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026127ec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826127af565b6127f686836127af565b95508019841693508086168417925050509392505050565b6000819050919050565b600061283361282e61282984612003565b61280e565b612003565b9050919050565b6000819050919050565b61284d83612818565b6128616128598261283a565b8484546127bc565b825550505050565b600090565b612876612869565b612881818484612844565b505050565b5b818110156128a55761289a60008261286e565b600181019050612887565b5050565b601f8211156128ea576128bb8161278a565b6128c48461279f565b810160208510156128d3578190505b6128e76128df8561279f565b830182612886565b50505b505050565b600082821c905092915050565b600061290d600019846008026128ef565b1980831691505092915050565b600061292683836128fc565b9150826002028217905092915050565b61293f82611f51565b67ffffffffffffffff81111561295857612957612138565b5b6129628254612635565b61296d8282856128a9565b600060209050601f8311600181146129a0576000841561298e578287015190505b612998858261291a565b865550612a00565b601f1984166129ae8661278a565b60005b828110156129d6578489015182556001820191506020850194506020810190506129b1565b868310156129f357848901516129ef601f8916826128fc565b8355505b6001600288020188555050505b505050505050565b7f63616e206f6e6c79206f776e206f6e6520746f6b656e00000000000000000000600082015250565b6000612a3e601683611f5c565b9150612a4982612a08565b602082019050919050565b60006020820190508181036000830152612a6d81612a31565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612ad0602f83611f5c565b9150612adb82612a74565b604082019050919050565b60006020820190508181036000830152612aff81612ac3565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612b3c601883611f5c565b9150612b4782612b06565b602082019050919050565b60006020820190508181036000830152612b6b81612b2f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612bce602983611f5c565b9150612bd982612b72565b604082019050919050565b60006020820190508181036000830152612bfd81612bc1565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612c60602e83611f5c565b9150612c6b82612c04565b604082019050919050565b60006020820190508181036000830152612c8f81612c53565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612ccc602083611f5c565b9150612cd782612c96565b602082019050919050565b60006020820190508181036000830152612cfb81612cbf565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612d38601c83611f5c565b9150612d4382612d02565b602082019050919050565b60006020820190508181036000830152612d6781612d2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612da882612003565b9150612db383612003565b9250828201905080821115612dcb57612dca612d6e565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612e07601983611f5c565b9150612e1282612dd1565b602082019050919050565b60006020820190508181036000830152612e3681612dfa565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e7e601783612e3d565b9150612e8982612e48565b601782019050919050565b6000612e9f82611f51565b612ea98185612e3d565b9350612eb9818560208601611f6d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612efb601183612e3d565b9150612f0682612ec5565b601182019050919050565b6000612f1c82612e71565b9150612f288285612e94565b9150612f3382612eee565b9150612f3f8284612e94565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612fa7602583611f5c565b9150612fb282612f4b565b604082019050919050565b60006020820190508181036000830152612fd681612f9a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613039602483611f5c565b915061304482612fdd565b604082019050919050565b600060208201905081810360008301526130688161302c565b9050919050565b600061307a82612003565b915061308583612003565b925082820390508181111561309d5761309c612d6e565b5b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006130ff603283611f5c565b915061310a826130a3565b604082019050919050565b6000602082019050818103600083015261312e816130f2565b9050919050565b600061314082612003565b915061314b83612003565b925082820261315981612003565b915082820484148315176131705761316f612d6e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006131b182612003565b9150600082036131c4576131c3612d6e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613205602083611f5c565b9150613210826131cf565b602082019050919050565b60006020820190508181036000830152613234816131f8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006132628261323b565b61326c8185613246565b935061327c818560208601611f6d565b61328581611f97565b840191505092915050565b60006080820190506132a56000830187612098565b6132b26020830186612098565b6132bf604083018561240c565b81810360608301526132d18184613257565b905095945050505050565b6000815190506132eb81611ec2565b92915050565b60006020828403121561330757613306611e8c565b5b6000613315848285016132dc565b9150509291505056fea264697066735822122048955a93cca11e8157cc2c8b98883c3ae23779348b42451943f5f2c37108900764736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000ed2baa
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80637714b02e116100ad578063a97232f411610071578063a97232f41461035b578063c016217c14610379578063c190e06f146103a9578063cb4a64ba146103c7578063d547741f146103e35761012c565b80637714b02e146102b35780638f966c55146102d157806391d14854146102ef578063a217fddf1461031f578063a56889eb1461033d5761012c565b8063379bc1f1116100f4578063379bc1f1146101e75780634ab84891146102055780634e74d8eb1461023557806356b823b9146102655780636eb034bb146102955761012c565b806301ffc9a714610131578063248a9ca3146101615780632d63f81e146101915780632f2ff15d146101af57806336568abe146101cb575b600080fd5b61014b60048036038101906101469190611346565b6103ff565b604051610158919061138e565b60405180910390f35b61017b600480360381019061017691906113df565b610479565b604051610188919061141b565b60405180910390f35b610199610498565b6040516101a6919061144f565b60405180910390f35b6101c960048036038101906101c491906114c8565b61055c565b005b6101e560048036038101906101e091906114c8565b61057d565b005b6101ef610600565b6040516101fc9190611567565b60405180910390f35b61021f600480360381019061021a91906115ae565b610626565b60405161022c9190611699565b60405180910390f35b61024f600480360381019061024a91906115ae565b61065d565b60405161025c9190611699565b60405180910390f35b61027f600480360381019061027a91906115ae565b610694565b60405161028c9190611699565b60405180910390f35b61029d6106cb565b6040516102aa919061144f565b60405180910390f35b6102bb6107bd565b6040516102c8919061144f565b60405180910390f35b6102d96107c3565b6040516102e6919061144f565b60405180910390f35b610309600480360381019061030491906114c8565b6108ac565b604051610316919061138e565b60405180910390f35b610327610916565b604051610334919061141b565b60405180910390f35b61034561091d565b604051610352919061144f565b60405180910390f35b610363610923565b6040516103709190611567565b60405180910390f35b610393600480360381019061038e91906116bb565b610949565b6040516103a09190611699565b60405180910390f35b6103b1610a9e565b6040516103be9190611567565b60405180910390f35b6103e160048036038101906103dc91906119fd565b610ac4565b005b6103fd60048036038101906103f891906114c8565b610b98565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610472575061047182610bb9565b5b9050919050565b6000806000838152602001908152602001600020600101549050919050565b60006104a2610c23565b1561054c57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016105029190611a97565b6020604051808303816000875af1158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190611ac7565b9050610559565b610554610cfe565b600090505b90565b61056582610479565b61056e81610db4565b6105788383610dc8565b505050565b610585610ea8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e990611b77565b60405180910390fd5b6105fc8282610eb0565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610656600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600084610949565b9050919050565b606061068d600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600084610949565b9050919050565b60606106c4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600084610949565b9050919050565b60006002546106d933610f91565b101561071a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190611be3565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016107759190611a97565b6020604051808303816000875af1158015610794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b89190611ac7565b905090565b60025481565b60006009544314610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090611c4f565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016108649190611a97565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190611ac7565b905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b60095481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008267ffffffffffffffff81111561096757610966611724565b5b6040519080825280602002602001820160405280156109955781602001602082028036833780820191505090505b50905060005b83811015610a91578573ffffffffffffffffffffffffffffffffffffffff16636352211e82876109cb9190611c9e565b6040518263ffffffff1660e01b81526004016109e7919061144f565b602060405180830381865afa925050508015610a2157506040513d601f19601f82011682018060405250810190610a1e9190611ce7565b60015b610a2f578192505050610a97565b80838381518110610a4357610a42611d14565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050508080610a8990611d43565b91505061099b565b50809150505b9392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b610ad181610db4565b60005b8251811015610b91578473ffffffffffffffffffffffffffffffffffffffff1663162094c4858381518110610b0c57610b0b611d14565b5b6020026020010151858481518110610b2757610b26611d14565b5b60200260200101516040518363ffffffff1660e01b8152600401610b4c929190611df9565b600060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b505050508080610b8990611d43565b915050610ad4565b5050505050565b610ba182610479565b610baa81610db4565b610bb48383610eb0565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614158015610cd05750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b15610cf65760045443148015610ce7575060055443145b15610cf55760019050610cfb565b5b600090505b90565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555032600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060045460058190555043600481905550565b610dc581610dc0610ea8565b611001565b50565b610dd282826108ac565b610ea457600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e49610ea8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b610eba82826108ac565b15610f8d57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610f32610ea8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808260601b90506000805b6014811015610ff6576000838260148110610fbc57610fbb611d14565b5b1a60f81b60f81c60ff1603610fde578180610fd690611d43565b925050610fe3565b610ff6565b8080610fee90611d43565b915050610f9e565b508092505050919050565b61100b82826108ac565b61109a576110308173ffffffffffffffffffffffffffffffffffffffff16601461109e565b61103e8360001c602061109e565b60405160200161104f929190611efd565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110919190611f37565b60405180910390fd5b5050565b6060600060028360026110b19190611f59565b6110bb9190611c9e565b67ffffffffffffffff8111156110d4576110d3611724565b5b6040519080825280601f01601f1916602001820160405280156111065781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061113e5761113d611d14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106111a2576111a1611d14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026111e29190611f59565b6111ec9190611c9e565b90505b600181111561128c577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061122e5761122d611d14565b5b1a60f81b82828151811061124557611244611d14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061128590611f9b565b90506111ef565b50600084146112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790612010565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611323816112ee565b811461132e57600080fd5b50565b6000813590506113408161131a565b92915050565b60006020828403121561135c5761135b6112e4565b5b600061136a84828501611331565b91505092915050565b60008115159050919050565b61138881611373565b82525050565b60006020820190506113a3600083018461137f565b92915050565b6000819050919050565b6113bc816113a9565b81146113c757600080fd5b50565b6000813590506113d9816113b3565b92915050565b6000602082840312156113f5576113f46112e4565b5b6000611403848285016113ca565b91505092915050565b611415816113a9565b82525050565b6000602082019050611430600083018461140c565b92915050565b6000819050919050565b61144981611436565b82525050565b60006020820190506114646000830184611440565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114958261146a565b9050919050565b6114a58161148a565b81146114b057600080fd5b50565b6000813590506114c28161149c565b92915050565b600080604083850312156114df576114de6112e4565b5b60006114ed858286016113ca565b92505060206114fe858286016114b3565b9150509250929050565b6000819050919050565b600061152d6115286115238461146a565b611508565b61146a565b9050919050565b600061153f82611512565b9050919050565b600061155182611534565b9050919050565b61156181611546565b82525050565b600060208201905061157c6000830184611558565b92915050565b61158b81611436565b811461159657600080fd5b50565b6000813590506115a881611582565b92915050565b6000602082840312156115c4576115c36112e4565b5b60006115d284828501611599565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6116108161148a565b82525050565b60006116228383611607565b60208301905092915050565b6000602082019050919050565b6000611646826115db565b61165081856115e6565b935061165b836115f7565b8060005b8381101561168c5781516116738882611616565b975061167e8361162e565b92505060018101905061165f565b5085935050505092915050565b600060208201905081810360008301526116b3818461163b565b905092915050565b6000806000606084860312156116d4576116d36112e4565b5b60006116e2868287016114b3565b93505060206116f386828701611599565b925050604061170486828701611599565b9150509250925092565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61175c82611713565b810181811067ffffffffffffffff8211171561177b5761177a611724565b5b80604052505050565b600061178e6112da565b905061179a8282611753565b919050565b600067ffffffffffffffff8211156117ba576117b9611724565b5b602082029050602081019050919050565b600080fd5b60006117e36117de8461179f565b611784565b90508083825260208201905060208402830185811115611806576118056117cb565b5b835b8181101561182f578061181b8882611599565b845260208401935050602081019050611808565b5050509392505050565b600082601f83011261184e5761184d61170e565b5b813561185e8482602086016117d0565b91505092915050565b600067ffffffffffffffff82111561188257611881611724565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156118b3576118b2611724565b5b6118bc82611713565b9050602081019050919050565b82818337600083830152505050565b60006118eb6118e684611898565b611784565b90508281526020810184848401111561190757611906611893565b5b6119128482856118c9565b509392505050565b600082601f83011261192f5761192e61170e565b5b813561193f8482602086016118d8565b91505092915050565b600061195b61195684611867565b611784565b9050808382526020820190506020840283018581111561197e5761197d6117cb565b5b835b818110156119c557803567ffffffffffffffff8111156119a3576119a261170e565b5b8086016119b0898261191a565b85526020850194505050602081019050611980565b5050509392505050565b600082601f8301126119e4576119e361170e565b5b81356119f4848260208601611948565b91505092915050565b600080600060608486031215611a1657611a156112e4565b5b6000611a24868287016114b3565b935050602084013567ffffffffffffffff811115611a4557611a446112e9565b5b611a5186828701611839565b925050604084013567ffffffffffffffff811115611a7257611a716112e9565b5b611a7e868287016119cf565b9150509250925092565b611a918161148a565b82525050565b6000602082019050611aac6000830184611a88565b92915050565b600081519050611ac181611582565b92915050565b600060208284031215611add57611adc6112e4565b5b6000611aeb84828501611ab2565b91505092915050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000611b61602f83611af4565b9150611b6c82611b05565b604082019050919050565b60006020820190508181036000830152611b9081611b54565b9050919050565b7f6e6f7420656e6f756768206c656164696e67207a65726f657300000000000000600082015250565b6000611bcd601983611af4565b9150611bd882611b97565b602082019050919050565b60006020820190508181036000830152611bfc81611bc0565b9050919050565b7f63616e206f6e6c79206d696e74206f6e206d65726765626c6f636b0000000000600082015250565b6000611c39601b83611af4565b9150611c4482611c03565b602082019050919050565b60006020820190508181036000830152611c6881611c2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611ca982611436565b9150611cb483611436565b9250828201905080821115611ccc57611ccb611c6f565b5b92915050565b600081519050611ce18161149c565b92915050565b600060208284031215611cfd57611cfc6112e4565b5b6000611d0b84828501611cd2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d4e82611436565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d8057611d7f611c6f565b5b600182019050919050565b600081519050919050565b60005b83811015611db4578082015181840152602081019050611d99565b60008484015250505050565b6000611dcb82611d8b565b611dd58185611af4565b9350611de5818560208601611d96565b611dee81611713565b840191505092915050565b6000604082019050611e0e6000830185611440565b8181036020830152611e208184611dc0565b90509392505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000611e6a601783611e29565b9150611e7582611e34565b601782019050919050565b6000611e8b82611d8b565b611e958185611e29565b9350611ea5818560208601611d96565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000611ee7601183611e29565b9150611ef282611eb1565b601182019050919050565b6000611f0882611e5d565b9150611f148285611e80565b9150611f1f82611eda565b9150611f2b8284611e80565b91508190509392505050565b60006020820190508181036000830152611f518184611dc0565b905092915050565b6000611f6482611436565b9150611f6f83611436565b9250828202611f7d81611436565b91508282048414831517611f9457611f93611c6f565b5b5092915050565b6000611fa682611436565b915060008203611fb957611fb8611c6f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000611ffa602083611af4565b915061200582611fc4565b602082019050919050565b6000602082019050818103600083015261202981611fed565b905091905056fea26469706673582212207378af7a887aeb59f76a3f555768f32be8c413a3cca518c4a82584c0def5cefb64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000ed2baa
-----Decoded View---------------
Arg [0] : leadingZeroes_ (uint256): 6
Arg [1] : mergeBlockNumbner_ (uint256): 15543210
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [1] : 0000000000000000000000000000000000000000000000000000000000ed2baa
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.