Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
435 DAOBNB
Holders
263
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 DAOBNBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DAOBnBNFT
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-22 */ // Sources flattened with hardhat v2.8.4 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // 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; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // 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); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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; } } // File contracts/ERC721Opt.sol pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintToDeadAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error TransferToDeadAddress(); error UnableGetTokenOwnerByIndex(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3..). */ contract ERC721Opt is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; uint256 internal _nextTokenId = 1; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owners details // An empty struct value does not necessarily mean the token is unowned. See ownerOf implementation for details. mapping(uint256 => address) internal _owners; // Mapping owner address to balances 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; // Address to use for burned accounting address constant DEAD_ADDR = 0x000000000000000000000000000000000000dEaD; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { // Counter underflow is impossible as burned cannot be incremented // more than _nextTokenId - 1 times unchecked { return (_nextTokenId - 1) - balanceOf(DEAD_ADDR); } } /** * @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) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address owner) { if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken(); unchecked { for (uint256 curr = tokenId;; curr--) { owner = _owners[curr]; if (owner != address(0)) { 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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 overriden 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 = ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved(); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer(); } function _isApprovedOrOwner(address sender, uint256 tokenId) internal view virtual returns (bool) { address owner = ownerOf(tokenId); return (sender == owner || getApproved(tokenId) == sender || isApprovedForAll(owner, sender)); } /** * @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`), */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId > 0 && tokenId < _nextTokenId && _owners[tokenId] != DEAD_ADDR; } function _mint(address to, uint256 quantity) internal virtual { _mint(to, quantity, '', false); } function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal virtual { uint256 startTokenId = _nextTokenId; if (to == address(0)) revert MintToZeroAddress(); if (to == DEAD_ADDR) revert MintToDeadAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance overflow if current value + quantity > 1.56e77 (2**256) - 1 // updatedIndex overflows if _nextTokenId + quantity > 1.56e77 (2**256) - 1 unchecked { _balances[to] += quantity; _owners[startTokenId] = to; uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { if (!_checkOnERC721Received(address(0), to, updatedIndex, _data)) revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _nextTokenId = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { address owner = ownerOf(tokenId); bool isApprovedOrOwner = (_msgSender() == owner || isApprovedForAll(owner, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (owner != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); if (to == DEAD_ADDR) revert TransferToDeadAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, owner); // Underflow of the sender's balance is impossible because we check for // owner above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; // If the owner slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_owners[nextTokenId] == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _nextTokenId) { _owners[nextTokenId] = owner; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, 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 = ownerOf(tokenId); _beforeTokenTransfers(owner, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, owner); // Underflow of the sender's balance is impossible because we check for // owner above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _balances[owner] -= 1; _balances[DEAD_ADDR] += 1; _owners[tokenId] = DEAD_ADDR; // If the owner slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_owners[nextTokenId] == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _nextTokenId) { _owners[nextTokenId] = owner; } } } emit Transfer(owner, address(0), tokenId); _afterTokenTransfers(owner, address(0), tokenId, 1); } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer(); else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File contracts/extensions/ERC721OptOwnersExplicit.sol pragma solidity ^0.8.4; error AllOwnersHaveBeenSet(); error QuantityMustBeNonZero(); error NoTokensMintedYet(); abstract contract ERC721OptOwnersExplicit is ERC721Opt { uint256 public nextOwnerToExplicitlySet = 1; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { if (quantity == 0) revert QuantityMustBeNonZero(); if (_nextTokenId == 1) revert NoTokensMintedYet(); uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet; if (_nextOwnerToExplicitlySet >= _nextTokenId) revert AllOwnersHaveBeenSet(); // Index underflow is impossible. // Counter or index overflow is incredibly unrealistic. unchecked { uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1; // Set the end index to be the last token index if (endIndex + 1 > _nextTokenId) { endIndex = _nextTokenId - 1; } for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) { if (_owners[i] == address(0) && _owners[i] != DEAD_ADDR) { address ownership = ownerOf(i); _owners[i] = ownership; } } nextOwnerToExplicitlySet = endIndex + 1; } } } // File contracts/extensions/ERC721OptBurnable.sol pragma solidity ^0.8.4; error BurnCallerNotOwnerNorApproved(); /** * @title ERC721Opt Burnable Token * @dev ERC721Opt Token that can be irreversibly burned (destroyed). */ abstract contract ERC721OptBurnable is ERC721Opt { /** * @dev Burns `tokenId`. See {ERC721Opt-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert BurnCallerNotOwnerNorApproved(); _burn(tokenId); } } // File contracts/extensions/ERC721OptBatchBurnable.sol pragma solidity ^0.8.4; /** * @title ERC721Opt Batch Burnable Token * @dev ERC721Opt Token that can be irreversibly batch burned (destroyed). */ abstract contract ERC721OptBatchBurnable is ERC721OptBurnable { /** * @dev Perform burn on a batch of tokens */ function batchBurn(uint16[] memory tokenIds) public virtual { for (uint16 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert BurnCallerNotOwnerNorApproved(); _burn(tokenIds[i]); } } } // File contracts/extensions/ERC721OptBatchTransferable.sol pragma solidity ^0.8.4; /** * @title ERC721Opt Batch Transferable Token * @dev ERC721Opt Token that can be batch transfered */ abstract contract ERC721OptBatchTransferable is ERC721Opt { /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint16[] tokenIds ); /** * @dev Perform transferFrom on a batch of tokens */ function batchTransferFrom( address from, address to, uint16[] memory tokenIds ) public virtual { for (uint16 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved(); transferFrom(from, to, tokenIds[i]); } emit TransferBatch(_msgSender(), from, to, tokenIds); } /** * @dev Perform safeTransferFrom on a batch of tokens */ function safeBatchTransferFrom( address from, address to, uint16[] memory tokenIds ) public virtual { safeBatchTransferFrom(from, to, tokenIds, ''); } /** * @dev Perform safeTransferFrom on a batch of tokens */ function safeBatchTransferFrom( address from, address to, uint16[] memory tokenIds, bytes memory _data ) public virtual { for (uint256 i = 0; i < tokenIds.length; ++i) { if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved(); safeTransferFrom(from, to, tokenIds[i], _data); } emit TransferBatch(_msgSender(), from, to, tokenIds); } } // File contracts/DAOBnBNFT.sol pragma solidity ^0.8.4; contract OpenSeaOwnableDelegateProxy {} contract OpenSeaProxyRegistry { mapping(address => OpenSeaOwnableDelegateProxy) public proxies; } interface IToken { /** * @dev Called from DAOBnBNFT when one is transfered/minted/burned */ function updateRewards(address _user) external; } error CardTypeQueryForNonexistentToken(); error OnlyMintersCanMint(); error NoMintAmountProvided(); error AllSilverCardsMinted(); error AllBlackCardsMinted(); contract DAOBnBNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable { using Strings for uint16; /* Base URI for token URIs */ string public baseURI; /* OpenSea user account proxy */ address public openSeaProxyRegistryAddress; /* Token contract */ IToken public token; uint16 silverCardsMax = 6400; uint16 blackCardsMax = 2700; uint16 blackCardsMinted; /* mapping of each wallets black cards */ mapping(address => uint16) public walletBlackCards; /* Minter addressess */ mapping(address => bool) public minters; /* mapping of each token id to card type 0 = silver, 1 = black */ mapping(uint16 => bool) _blackCardTokenIds; constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) { baseURI = _initialBaseURI; openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress; for (uint256 i = 0; i < _minters.length; i++) { minters[_minters[i]] = true; } } /** * @dev Get silver cards left for sale */ function silverCardsLeft() public view returns (uint256) { return silverCardsMax - (_nextTokenId - 1 - blackCardsMinted); } /** * @dev Get black cards left for sale */ function blackCardsLeft() public view returns (uint256) { return blackCardsMax - blackCardsMinted; } /** * @dev Get the card type for a specific tokenId */ function tokenCardType(uint16 tokenId) public view returns (string memory) { if (!_exists(tokenId)) revert CardTypeQueryForNonexistentToken(); if (_blackCardTokenIds[tokenId]) { return "black"; } return "silver"; } /** * @dev Override to if default approved for OS proxy accounts or normal approval */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Whitelist OpenSea proxy contract for easy trading. OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry( openSeaProxyRegistryAddress ); if (address(openSeaProxyRegistry.proxies(owner)) == operator) { return true; } return ERC721Opt.isApprovedForAll(owner, operator); } /** * @dev Override to change the baseURI used in tokenURI */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @dev Override to change tokenURI format */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(_baseURI(), tokenCardType(uint16(tokenId)), '.json')) : ''; } /** * @dev Mint of specific card type to address. */ function mint(uint16 silverCardsAmount, uint16 blackCardsAmount, address to) public { if(!minters[msg.sender]) revert OnlyMintersCanMint(); if(silverCardsAmount + blackCardsAmount == 0) revert NoMintAmountProvided(); if(_nextTokenId - 1 - blackCardsMinted + silverCardsAmount > silverCardsMax) revert AllSilverCardsMinted(); if(blackCardsMinted + blackCardsAmount > blackCardsMax) revert AllBlackCardsMinted(); if (blackCardsAmount > 0) { blackCardsMinted += blackCardsAmount; uint16 tokenId = uint16(_nextTokenId) + silverCardsAmount; for (uint16 i; i < blackCardsAmount; i++) { _blackCardTokenIds[tokenId++] = true; } } _safeMint(to, silverCardsAmount + blackCardsAmount, ''); } /** * @dev Override so we can update token rewards before transfer happens */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual override { if (address(token) != address(0)) { token.updateRewards(from); token.updateRewards(to); } uint16 blackCards; for(uint16 i = uint16(startTokenId); i < startTokenId + quantity; i++) { if (_blackCardTokenIds[i]) { blackCards += 1; } } if (from != address(0)) { walletBlackCards[from] -= blackCards; } if (to != address(0)) { walletBlackCards[to] += blackCards; } super._beforeTokenTransfers(from, to, startTokenId, quantity); } /** * @dev Set the base uri for token metadata */ function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } /** * @dev Set minter status for addresses */ function setMinters(address[] calldata addresses, bool allowed) external onlyOwner { for(uint256 i = 0; i < addresses.length; i++) { minters[addresses[i]] = allowed; } } /** * @dev Update available cards */ function updateAvailableCards(uint16 silverCards, uint16 blackCards) external onlyOwner { silverCardsMax = silverCards; blackCardsMax = blackCards; } /** * @dev Set the token contract */ function setToken(IToken _token) external onlyOwner { token = _token; } /** * @dev Force update all owners for better transfers */ function updateOwners(uint256 quantity) external onlyOwner { _setOwnersExplicit(quantity); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File contracts/DAOBnBMinter.sol pragma solidity ^0.8.0; contract DAOBnBMinter is Ownable { using Strings for uint16; using ECDSA for bytes32; /* DAObnb NFT contract */ DAOBnBNFT nftContract; /* Is Pre Sale Active */ bool public preSaleIsActive; /* Is Sale Active */ bool public saleIsActive; /* If > 0 limit pre sale silver cards purchases per address */ uint16 public maxPreSaleSilverCardsPerAddress = 2; /* If > 0 limit pre sale black cards purchases per address */ uint16 public maxPreSaleBlackCardsPerAddress = 1; /* Limit how many silver cards can be purchased in single transaction for pre sale */ uint16 public maxPreSaleSilverCardsPerTransaction = 2; /* Limit how many black cards can be purchased in single transaction for pre sale */ uint16 public maxPreSaleBlackCardsPerTransaction = 1; /* Limit how many silver cards can be purchased in single transaction for public sale */ uint16 public maxSilverCardsPerTransaction = 16; /* Limit how many black cards can be purchased in single transaction for public sale */ uint16 public maxBlackCardsPerTransaction = 4; /* silver cards reserved for marketing */ uint16 public reservedSilverCards = 640; /* black cards reserved for marketing */ uint16 public reservedBlackCards = 270; /* Price for silver card during pre sale */ uint256 public preSaleSilverCardPrice = 0.175 ether; /* Price for black card during pre sale */ uint256 public preSaleBlackCardPrice = 0.7 ether; /* Price for silver card during public sale */ uint256 public silverCardPrice = 0.175 ether; /* Price for black card during public sale */ uint256 public blackCardPrice = 0.7 ether; /* PreSaleList Signature Addresses */ mapping(address => bool) public preSaleListSignatureAddresses; /* PreSaleList Signature Nounces used */ mapping(uint16 => address) public preSaleListSignatureUsedNounces; /* PreSaleListed addressess */ mapping(address => bool) public preSaleListedAddresses; /* Silver cards minted per address during pre sale */ mapping(address => uint16) public preSaleSilverCardPurchases; /* Black cards minted per address during pre sale */ mapping(address => uint16) public preSaleBlackCardPurchases; constructor( DAOBnBNFT _nftContract, address[] memory _preSaleListSignatureAddresses ) { nftContract = _nftContract; for (uint256 i = 0; i < _preSaleListSignatureAddresses.length; i++) { preSaleListSignatureAddresses[_preSaleListSignatureAddresses[i]] = true; } } function getPreSaleListMessage(uint16 nounce, address sender) public pure returns (bytes32) { if (nounce > 0) { return keccak256(abi.encodePacked('ProjectId: 621285d3e200cdf5b5ef5704, Nounce: ', nounce)); } return keccak256(abi.encodePacked('ProjectId: 621285d3e200cdf5b5ef5704, Address: ', sender)); } function mintPreSale(uint16 silverCardsAmount, uint16 blackCardsAmount, uint16 nounce, bytes calldata signature) external payable { require(preSaleIsActive, 'Pre sale must be active to mint pre sale'); require(!saleIsActive, 'Regular sale is already active'); require( silverCardsAmount + blackCardsAmount > 0, 'No amounts provided' ); require( silverCardsAmount <= maxPreSaleSilverCardsPerTransaction, 'Can not mint that many silver tokens in a single transaction during the pre sale' ); require( blackCardsAmount <= maxPreSaleBlackCardsPerTransaction, 'Can not mint that many black tokens in a single transaction during the pre sale' ); require( silverCardsAmount <= nftContract.silverCardsLeft() - reservedSilverCards, 'Sold Out' ); require( blackCardsAmount <= nftContract.blackCardsLeft() - reservedBlackCards, 'Sold Out' ); require( preSaleSilverCardPurchases[msg.sender] + silverCardsAmount <= maxPreSaleSilverCardsPerAddress, 'Can only mint so many silver cards during the presale' ); require( preSaleBlackCardPurchases[msg.sender] + blackCardsAmount <= maxPreSaleBlackCardsPerAddress, 'Can only mint so many black cards during the presale' ); require( msg.value >= (preSaleSilverCardPrice * silverCardsAmount) + (preSaleBlackCardPrice * blackCardsAmount), 'Ether value sent is not correct' ); require(preSaleListedAddresses[_msgSender()] || signature.length > 0, 'Signature required for pre sale'); require(nounce == 0 || preSaleListSignatureUsedNounces[nounce] == address(0) || preSaleListSignatureUsedNounces[nounce] == _msgSender(), 'Invalid or used nounce'); if (!preSaleListedAddresses[_msgSender()] && preSaleListSignatureUsedNounces[nounce] != _msgSender()) { bytes32 message = getPreSaleListMessage(nounce, _msgSender()); bytes32 messageHash = message.toEthSignedMessageHash(); address signer = messageHash.recover(signature); require(preSaleListSignatureAddresses[signer], 'Signature invalid'); if (nounce > 0) { preSaleListSignatureUsedNounces[nounce] = _msgSender(); } } preSaleSilverCardPurchases[msg.sender] += silverCardsAmount; preSaleBlackCardPurchases[msg.sender] += blackCardsAmount; nftContract.mint(silverCardsAmount, blackCardsAmount, msg.sender); } function mint(uint16 silverCardsAmount, uint16 blackCardsAmount) external payable { require(saleIsActive, 'Regular sale is not active'); require( silverCardsAmount + blackCardsAmount > 0, 'No amounts provided' ); require( silverCardsAmount <= maxSilverCardsPerTransaction, 'Can not mint that many silver cards in a single transaction during the sale' ); require( blackCardsAmount <= maxBlackCardsPerTransaction, 'Can not mint that many black cards in a single transaction during the sale' ); require( silverCardsAmount <= nftContract.silverCardsLeft() - reservedSilverCards, 'Sold Out' ); require( blackCardsAmount <= nftContract.blackCardsLeft() - reservedBlackCards, 'Sold Out' ); require( msg.value >= (silverCardPrice * silverCardsAmount) + (blackCardPrice * blackCardsAmount), 'Ether value sent is not correct' ); nftContract.mint(silverCardsAmount, blackCardsAmount, _msgSender()); } /** * @dev Update a list of addresses to be allowed to be used for signature based preSaleList */ function updatePreSaleListSignatureAddresses(address[] memory _preSaleListSignatureAddresses, bool allowed) external onlyOwner { for (uint256 i = 0; i < _preSaleListSignatureAddresses.length; i++) { preSaleListSignatureAddresses[_preSaleListSignatureAddresses[i]] = allowed; } } /** * @dev Update a list of addresses to be allowed in preSaleList */ function updatePreSaleListedAddresses(address[] memory _preSaleListedAddresses, bool allowed) external onlyOwner { for (uint256 i = 0; i < _preSaleListedAddresses.length; i++) { preSaleListedAddresses[_preSaleListedAddresses[i]] = allowed; } } function flipPreSaleState() external onlyOwner { preSaleIsActive = !preSaleIsActive; } function flipSaleState() external onlyOwner { saleIsActive = !saleIsActive; } function setMaxPreSaleCardsPerAddress(uint16 _silverCardsAmount, uint16 _blackCardsAmount) external onlyOwner { maxPreSaleSilverCardsPerAddress = _silverCardsAmount; maxPreSaleBlackCardsPerAddress = _blackCardsAmount; } function setMaxPreSaleCardsPerTransaction(uint16 _silverCardsAmount, uint16 _blackCardsAmount) external onlyOwner { maxPreSaleSilverCardsPerTransaction = _silverCardsAmount; maxPreSaleBlackCardsPerTransaction = _blackCardsAmount; } function setMaxCardsPerTransaction(uint16 _silverCardsAmount, uint16 _blackCardsAmount, bool updatePreSaleAlso) external onlyOwner { maxSilverCardsPerTransaction = _silverCardsAmount; maxBlackCardsPerTransaction = _blackCardsAmount; if (updatePreSaleAlso) { maxPreSaleSilverCardsPerTransaction = _silverCardsAmount; maxPreSaleBlackCardsPerTransaction = _blackCardsAmount; } } function setReservedCards(uint16 _silverCardsAmount, uint16 _blackCardsAmount) external onlyOwner { reservedSilverCards = _silverCardsAmount; reservedBlackCards = _blackCardsAmount; } function setPreSalePrice(uint256 _silverCardPrice, uint256 _blackCardPrice) external onlyOwner { preSaleSilverCardPrice = _silverCardPrice; preSaleBlackCardPrice = _blackCardPrice; } function setPrice(uint256 _silverCardPrice, uint256 _blackCardPrice, bool updatePreSaleAlso) external onlyOwner { silverCardPrice = _silverCardPrice; blackCardPrice = _blackCardPrice; if (updatePreSaleAlso) { preSaleSilverCardPrice = _silverCardPrice; preSaleBlackCardPrice = _blackCardPrice; } } function reserveMint(uint16 silverCardsAmount, uint16 blackCardsAmount, address[] calldata to) external onlyOwner { require( (silverCardsAmount * to.length) <= reservedSilverCards, 'Not enough reserve left for team' ); require( (blackCardsAmount * to.length) <= reservedBlackCards, 'Not enough reserve left for team' ); require( silverCardsAmount + blackCardsAmount > 0, 'No amounts provided' ); for (uint16 i = 0; i < to.length; i++) { nftContract.mint(silverCardsAmount, blackCardsAmount, to[i]); } reservedSilverCards = uint16(reservedSilverCards - (silverCardsAmount * to.length)); reservedBlackCards = uint16(reservedBlackCards - (blackCardsAmount * to.length)); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"address","name":"_openSeaProxyRegistryAddress","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllBlackCardsMinted","type":"error"},{"inputs":[],"name":"AllOwnersHaveBeenSet","type":"error"},{"inputs":[],"name":"AllSilverCardsMinted","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BurnCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"CardTypeQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"MintToDeadAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoMintAmountProvided","type":"error"},{"inputs":[],"name":"NoTokensMintedYet","type":"error"},{"inputs":[],"name":"OnlyMintersCanMint","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"QuantityMustBeNonZero","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToDeadAddress","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"TransferBatch","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blackCardsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"silverCardsAmount","type":"uint16"},{"internalType":"uint16","name":"blackCardsAmount","type":"uint16"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSeaProxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"silverCardsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"tokenCardType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"silverCards","type":"uint16"},{"internalType":"uint16","name":"blackCards","type":"uint16"}],"name":"updateAvailableCards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"updateOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletBlackCards","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526001808055600855600b805463ffffffff60a01b1916620a8c1960a81b1790553480156200003157600080fd5b5060405162002bfb38038062002bfb83398101604081905262000054916200032c565b848462000061336200013b565b8151620000769060029060208501906200018b565b5080516200008c9060039060208401906200018b565b50508351620000a4915060099060208601906200018b565b50600a80546001600160a01b0319166001600160a01b03841617905560005b81518110156200012f576001600d6000848481518110620000e857620000e86200046c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620001268162000482565b915050620000c3565b505050505050620004e9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200019990620004ac565b90600052602060002090601f016020900481019282620001bd576000855562000208565b82601f10620001d857805160ff191683800117855562000208565b8280016001018555821562000208579182015b8281111562000208578251825591602001919060010190620001eb565b50620002169291506200021a565b5090565b5b808211156200021657600081556001016200021b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000272576200027262000231565b604052919050565b600082601f8301126200028c57600080fd5b81516001600160401b03811115620002a857620002a862000231565b6020620002be601f8301601f1916820162000247565b8281528582848701011115620002d357600080fd5b60005b83811015620002f3578581018301518282018401528201620002d6565b83811115620003055760008385840101525b5095945050505050565b80516001600160a01b03811681146200032757600080fd5b919050565b600080600080600060a086880312156200034557600080fd5b85516001600160401b03808211156200035d57600080fd5b6200036b89838a016200027a565b96506020915081880151818111156200038357600080fd5b620003918a828b016200027a565b965050604088015181811115620003a757600080fd5b620003b58a828b016200027a565b955050620003c6606089016200030f565b9350608088015181811115620003db57600080fd5b8801601f81018a13620003ed57600080fd5b80518281111562000402576200040262000231565b8060051b92506200041584840162000247565b818152928201840192848101908c8511156200043057600080fd5b928501925b84841015620004595762000449846200030f565b8252928501929085019062000435565b8096505050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620004a557634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c90821680620004c157607f821691505b60208210811415620004e357634e487b7160e01b600052602260045260246000fd5b50919050565b61270280620004f96000396000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c80638da5cb5b11610160578063c87b56dd116100d8578063ebb02ab31161008c578063f46eccc411610071578063f46eccc414610517578063f7a885c91461053a578063fc0c546a1461054d57600080fd5b8063ebb02ab3146104fc578063f2fde38b1461050457600080fd5b8063d4cd296c116100bd578063d4cd296c146104cd578063d7224ba0146104e0578063e985e9c5146104e957600080fd5b8063c87b56dd146104b2578063cf956a93146104c557600080fd5b8063a22cb4651161012f578063b88d4fde11610114578063b88d4fde14610479578063c6b2dd9f1461048c578063c83072381461049f57600080fd5b8063a22cb46514610453578063b7f47d321461046657600080fd5b80638da5cb5b146104145780638f5ea8da1461042557806395d89b41146104385780639b9cf33b1461044057600080fd5b806342842e0e116101f357806368030618116101c257806370a08231116101a757806370a08231146103e6578063715018a6146103f95780638754101c1461040157600080fd5b806368030618146103a75780636c0360eb146103de57600080fd5b806342842e0e1461035b57806342966c681461036e57806355f804b3146103815780636352211e1461039457600080fd5b8063095ea7b31161024a57806318160ddd1161022f57806318160ddd1461031f578063225af1061461033557806323b872dd1461034857600080fd5b8063095ea7b3146102f7578063144fa6d71461030c57600080fd5b806301ffc9a71461027c57806302cfce4e146102a457806306fdde03146102c4578063081812fc146102cc575b600080fd5b61028f61028a366004611ea0565b610560565b60405190151581526020015b60405180910390f35b6102b76102b2366004611edb565b6105b2565b60405161029b9190611f4e565b6102b761066c565b6102df6102da366004611f61565b6106fe565b6040516001600160a01b03909116815260200161029b565b61030a610305366004611f8f565b610742565b005b61030a61031a366004611fbb565b6107d0565b610327610851565b60405190815260200161029b565b61030a610343366004611fd8565b610869565b61030a61035636600461201f565b610a48565b61030a61036936600461201f565b610a53565b61030a61037c366004611f61565b610a6e565b61030a61038f3660046120ff565b610aa1565b6102df6103a2366004611f61565b610b12565b6103cb6103b5366004611fbb565b600c6020526000908152604090205461ffff1681565b60405161ffff909116815260200161029b565b6102b7610b6b565b6103276103f4366004611fbb565b610bf9565b61030a610c3e565b61030a61040f3660046121cf565b610ca4565b6000546001600160a01b03166102df565b61030a6104333660046121cf565b610d9a565b6102b7610db5565b61030a61044e366004612231565b610dc4565b61030a610461366004612276565b610e34565b600a546102df906001600160a01b031681565b61030a6104873660046122cb565b610eca565b61030a61049a366004611f61565b610f04565b61030a6104ad366004612337565b610f67565b6102b76104c0366004611f61565b611032565b6103276110bc565b61030a6104db3660046123bb565b6110e9565b61032760085481565b61028f6104f73660046123e5565b6111ad565b61032761126e565b61030a610512366004611fbb565b6112b4565b61028f610525366004611fbb565b600d6020526000908152604090205460ff1681565b61030a61054836600461241e565b611393565b600b546102df906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061059157506001600160e01b03198216635b5e139f60e01b145b806105ac57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606105c18261ffff1661146d565b6105de57604051631bcabe3360e01b815260040160405180910390fd5b61ffff82166000908152600e602052604090205460ff161561063357505060408051808201909152600581527f626c61636b000000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600681527f73696c7665720000000000000000000000000000000000000000000000000000602082015290565b60606002805461067b9061249b565b80601f01602080910402602001604051908101604052809291908181526020018280546106a79061249b565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b60006107098261146d565b610726576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074d82610b12565b9050806001600160a01b0316836001600160a01b031614156107825760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107a257506107a081336111ad565b155b156107c0576040516367d9dca160e11b815260040160405180910390fd5b6107cb8383836114a9565b505050565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061085e61dead610bf9565b600180540303905090565b336000908152600d602052604090205460ff16610899576040516308db091b60e31b815260040160405180910390fd5b6108a382846124ec565b61ffff166108c457604051632d04645160e21b815260040160405180910390fd5b600b546001805461ffff600160a01b840481169387821693600160c01b909104909116916108f29190612512565b6108fc9190612512565b6109069190612529565b11156109255760405163dd0c7bc960e01b815260040160405180910390fd5b600b5461ffff600160b01b8204811691610948918591600160c01b9004166124ec565b61ffff16111561096b5760405163dc46a6a760e01b815260040160405180910390fd5b61ffff821615610a215781600b60188282829054906101000a900461ffff1661099491906124ec565b92506101000a81548161ffff021916908361ffff1602179055506000836001546109be91906124ec565b905060005b8361ffff168161ffff161015610a1e576001600e6000846109e381612541565b61ffff9190911682526020820192909252604001600020805460ff191692151592909217909155915080610a1681612541565b9150506109c3565b50505b6107cb81610a2f84866124ec565b61ffff1660405180602001604052806000815250611505565b6107cb838383611512565b6107cb83838360405180602001604052806000815250610eca565b610a7833826116f4565b610a955760405163871b97e160e01b815260040160405180910390fd5b610a9e8161174b565b50565b6000546001600160a01b03163314610afb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b8051610b0e906009906020840190611df1565b5050565b6000610b1d8261146d565b610b3a57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610b625750919050565b60001901610b3c565b60098054610b789061249b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba49061249b565b8015610bf15780601f10610bc657610100808354040283529160200191610bf1565b820191906000526020600020905b815481529060010190602001808311610bd457829003601f168201915b505050505081565b60006001600160a01b038216610c22576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610c985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610ca2600061185d565b565b60005b81518161ffff161015610d3957610ce0335b838361ffff1681518110610ccf57610ccf612563565b602002602001015161ffff166116f4565b610cfd57604051632ce44b5f60e11b815260040160405180910390fd5b610d298484848461ffff1681518110610d1857610d18612563565b602002602001015161ffff16610a48565b610d3281612541565b9050610ca7565b50816001600160a01b0316836001600160a01b0316610d553390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20484604051610d8d9190612579565b60405180910390a4505050565b6107cb83838360405180602001604052806000815250611393565b60606003805461067b9061249b565b60005b81518161ffff161015610b0e57610ddd33610cb9565b610dfa5760405163871b97e160e01b815260040160405180910390fd5b610e24828261ffff1681518110610e1357610e13612563565b602002602001015161ffff1661174b565b610e2d81612541565b9050610dc7565b6001600160a01b038216331415610e5e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ed5848484611512565b610ee1848484846118ad565b610efe576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b03163314610f5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610a9e816119ac565b6000546001600160a01b03163314610fc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b60005b82811015610efe5781600d6000868685818110610fe357610fe3612563565b9050602002016020810190610ff89190611fbb565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061102a816125c1565b915050610fc4565b606061103d8261146d565b61105a57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546110699061249b565b90501161108557604051806020016040528060008152506105ac565b61108d611ac6565b611096836105b2565b6040516020016110a79291906125dc565b60405160208183030381529060405292915050565b600b546000906110e09061ffff600160c01b8204811691600160b01b900416612633565b61ffff16905090565b6000546001600160a01b031633146111435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b600b80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff948516027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff1617600160b01b9290931691909102919091179055565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612656565b6001600160a01b0316141561123c5760019150506105ac565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b600b5460018054600092600160c01b900461ffff169161128d91612512565b6112979190612512565b600b546112af9190600160a01b900461ffff16612512565b905090565b6000546001600160a01b0316331461130e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b6001600160a01b03811661138a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610826565b610a9e8161185d565b60005b825181101561140b576113b533848381518110610ccf57610ccf612563565b6113d257604051632ce44b5f60e11b815260040160405180910390fd5b6113fb85858584815181106113e9576113e9612563565b602002602001015161ffff1685610eca565b611404816125c1565b9050611396565b50826001600160a01b0316846001600160a01b03166114273390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d2048560405161145f9190612579565b60405180910390a450505050565b6000808211801561147f575060015482105b80156105ac57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6107cb8383836001611ad5565b600061151d82610b12565b90506000336001600160a01b038316148061153d575061153d82336111ad565b8061155857503361154d846106fe565b6001600160a01b0316145b90508061157857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b0316146115a95760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166115d057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead14156115fc57604051630278d60f60e11b815260040160405180910390fd5b6116098585856001611c1a565b611615600084846114a9565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b03191690911790559086018083529120549091166116aa576001548110156116aa57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008061170083610b12565b9050806001600160a01b0316846001600160a01b0316148061173b5750836001600160a01b0316611730846106fe565b6001600160a01b0316145b80611266575061126681856111ad565b600061175682610b12565b9050611766816000846001611c1a565b611772600083836114a9565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead1790559085018083529120549091166118205760015481101561182057600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156119a157604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118f1903390899088908890600401612673565b6020604051808303816000875af192505050801561192c575060408051601f3d908101601f19168201909252611929918101906126af565b60015b611987573d80801561195a576040519150601f19603f3d011682016040523d82523d6000602084013e61195f565b606091505b50805161197f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611266565b506001949350505050565b806119ca576040516356be441560e01b815260040160405180910390fd5b600154600114156119ee5760405163c0367cab60e01b815260040160405180910390fd5b6008546001548110611a1357604051630a596e2160e21b815260040160405180910390fd5b6001548282016000198101911015611a2e5750600154600019015b815b818111611abb576000818152600460205260409020546001600160a01b0316158015611a7557506000818152600460205260409020546001600160a01b031661dead14155b15611ab3576000611a8582610b12565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101611a30565b506001016008555050565b60606009805461067b9061249b565b6001546001600160a01b038516611afe57604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead1415611b2a57604051631617320f60e01b815260040160405180910390fd5b83611b485760405163b562e8dd60e01b815260040160405180910390fd5b611b556000868387611c1a565b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b85811015611c115760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611c0557611be860008884886118ad565b611c05576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611b95565b506001556116ed565b600b546001600160a01b031615611cea57600b54604051635fd6196560e01b81526001600160a01b03868116600483015290911690635fd6196590602401600060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b5050600b54604051635fd6196560e01b81526001600160a01b0387811660048301529091169250635fd619659150602401600060405180830381600087803b158015611cd157600080fd5b505af1158015611ce5573d6000803e3d6000fd5b505050505b6000825b611cf88385612529565b8161ffff161015611d3f5761ffff81166000908152600e602052604090205460ff1615611d2d57611d2a6001836124ec565b91505b80611d3781612541565b915050611cee565b506001600160a01b03851615611d96576001600160a01b0385166000908152600c602052604081208054839290611d7b90849061ffff16612633565b92506101000a81548161ffff021916908361ffff1602179055505b6001600160a01b03841615611dec576001600160a01b0384166000908152600c602052604081208054839290611dd190849061ffff166124ec565b92506101000a81548161ffff021916908361ffff1602179055505b6116ed565b828054611dfd9061249b565b90600052602060002090601f016020900481019282611e1f5760008555611e65565b82601f10611e3857805160ff1916838001178555611e65565b82800160010185558215611e65579182015b82811115611e65578251825591602001919060010190611e4a565b50611e71929150611e75565b5090565b5b80821115611e715760008155600101611e76565b6001600160e01b031981168114610a9e57600080fd5b600060208284031215611eb257600080fd5b8135611ebd81611e8a565b9392505050565b803561ffff81168114611ed657600080fd5b919050565b600060208284031215611eed57600080fd5b611ebd82611ec4565b60005b83811015611f11578181015183820152602001611ef9565b83811115610efe5750506000910152565b60008151808452611f3a816020860160208601611ef6565b601f01601f19169290920160200192915050565b602081526000611ebd6020830184611f22565b600060208284031215611f7357600080fd5b5035919050565b6001600160a01b0381168114610a9e57600080fd5b60008060408385031215611fa257600080fd5b8235611fad81611f7a565b946020939093013593505050565b600060208284031215611fcd57600080fd5b8135611ebd81611f7a565b600080600060608486031215611fed57600080fd5b611ff684611ec4565b925061200460208501611ec4565b9150604084013561201481611f7a565b809150509250925092565b60008060006060848603121561203457600080fd5b833561203f81611f7a565b9250602084013561204f81611f7a565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561209f5761209f612060565b604052919050565b600067ffffffffffffffff8311156120c1576120c1612060565b6120d4601f8401601f1916602001612076565b90508281528383830111156120e857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561211157600080fd5b813567ffffffffffffffff81111561212857600080fd5b8201601f8101841361213957600080fd5b611266848235602084016120a7565b600082601f83011261215957600080fd5b8135602067ffffffffffffffff82111561217557612175612060565b8160051b612184828201612076565b928352848101820192828101908785111561219e57600080fd5b83870192505b848310156121c4576121b583611ec4565b825291830191908301906121a4565b979650505050505050565b6000806000606084860312156121e457600080fd5b83356121ef81611f7a565b925060208401356121ff81611f7a565b9150604084013567ffffffffffffffff81111561221b57600080fd5b61222786828701612148565b9150509250925092565b60006020828403121561224357600080fd5b813567ffffffffffffffff81111561225a57600080fd5b61126684828501612148565b80358015158114611ed657600080fd5b6000806040838503121561228957600080fd5b823561229481611f7a565b91506122a260208401612266565b90509250929050565b600082601f8301126122bc57600080fd5b611ebd838335602085016120a7565b600080600080608085870312156122e157600080fd5b84356122ec81611f7a565b935060208501356122fc81611f7a565b925060408501359150606085013567ffffffffffffffff81111561231f57600080fd5b61232b878288016122ab565b91505092959194509250565b60008060006040848603121561234c57600080fd5b833567ffffffffffffffff8082111561236457600080fd5b818601915086601f83011261237857600080fd5b81358181111561238757600080fd5b8760208260051b850101111561239c57600080fd5b6020928301955093506123b29186019050612266565b90509250925092565b600080604083850312156123ce57600080fd5b6123d783611ec4565b91506122a260208401611ec4565b600080604083850312156123f857600080fd5b823561240381611f7a565b9150602083013561241381611f7a565b809150509250929050565b6000806000806080858703121561243457600080fd5b843561243f81611f7a565b9350602085013561244f81611f7a565b9250604085013567ffffffffffffffff8082111561246c57600080fd5b61247888838901612148565b9350606087013591508082111561248e57600080fd5b5061232b878288016122ab565b600181811c908216806124af57607f821691505b602082108114156124d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612509576125096124d6565b01949350505050565b600082821015612524576125246124d6565b500390565b6000821982111561253c5761253c6124d6565b500190565b600061ffff80831681811415612559576125596124d6565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156125b557835161ffff1683529284019291840191600101612595565b50909695505050505050565b60006000198214156125d5576125d56124d6565b5060010190565b600083516125ee818460208801611ef6565b835190830190612602818360208801611ef6565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600061ffff8381169083168181101561264e5761264e6124d6565b039392505050565b60006020828403121561266857600080fd5b8151611ebd81611f7a565b60006001600160a01b038087168352808616602084015250836040830152608060608301526126a56080830184611f22565b9695505050505050565b6000602082840312156126c157600080fd5b8151611ebd81611e8a56fea264697066735822122017ab764a21de809f024ab1775d3eaf75d27f9bb30b70a441cc312633746fa02b64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000644414f426e420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644414f424e4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6354615468397465744c72454636414e6252554e635168357933665a4b437439534e76325a545a3656354d512f000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102775760003560e01c80638da5cb5b11610160578063c87b56dd116100d8578063ebb02ab31161008c578063f46eccc411610071578063f46eccc414610517578063f7a885c91461053a578063fc0c546a1461054d57600080fd5b8063ebb02ab3146104fc578063f2fde38b1461050457600080fd5b8063d4cd296c116100bd578063d4cd296c146104cd578063d7224ba0146104e0578063e985e9c5146104e957600080fd5b8063c87b56dd146104b2578063cf956a93146104c557600080fd5b8063a22cb4651161012f578063b88d4fde11610114578063b88d4fde14610479578063c6b2dd9f1461048c578063c83072381461049f57600080fd5b8063a22cb46514610453578063b7f47d321461046657600080fd5b80638da5cb5b146104145780638f5ea8da1461042557806395d89b41146104385780639b9cf33b1461044057600080fd5b806342842e0e116101f357806368030618116101c257806370a08231116101a757806370a08231146103e6578063715018a6146103f95780638754101c1461040157600080fd5b806368030618146103a75780636c0360eb146103de57600080fd5b806342842e0e1461035b57806342966c681461036e57806355f804b3146103815780636352211e1461039457600080fd5b8063095ea7b31161024a57806318160ddd1161022f57806318160ddd1461031f578063225af1061461033557806323b872dd1461034857600080fd5b8063095ea7b3146102f7578063144fa6d71461030c57600080fd5b806301ffc9a71461027c57806302cfce4e146102a457806306fdde03146102c4578063081812fc146102cc575b600080fd5b61028f61028a366004611ea0565b610560565b60405190151581526020015b60405180910390f35b6102b76102b2366004611edb565b6105b2565b60405161029b9190611f4e565b6102b761066c565b6102df6102da366004611f61565b6106fe565b6040516001600160a01b03909116815260200161029b565b61030a610305366004611f8f565b610742565b005b61030a61031a366004611fbb565b6107d0565b610327610851565b60405190815260200161029b565b61030a610343366004611fd8565b610869565b61030a61035636600461201f565b610a48565b61030a61036936600461201f565b610a53565b61030a61037c366004611f61565b610a6e565b61030a61038f3660046120ff565b610aa1565b6102df6103a2366004611f61565b610b12565b6103cb6103b5366004611fbb565b600c6020526000908152604090205461ffff1681565b60405161ffff909116815260200161029b565b6102b7610b6b565b6103276103f4366004611fbb565b610bf9565b61030a610c3e565b61030a61040f3660046121cf565b610ca4565b6000546001600160a01b03166102df565b61030a6104333660046121cf565b610d9a565b6102b7610db5565b61030a61044e366004612231565b610dc4565b61030a610461366004612276565b610e34565b600a546102df906001600160a01b031681565b61030a6104873660046122cb565b610eca565b61030a61049a366004611f61565b610f04565b61030a6104ad366004612337565b610f67565b6102b76104c0366004611f61565b611032565b6103276110bc565b61030a6104db3660046123bb565b6110e9565b61032760085481565b61028f6104f73660046123e5565b6111ad565b61032761126e565b61030a610512366004611fbb565b6112b4565b61028f610525366004611fbb565b600d6020526000908152604090205460ff1681565b61030a61054836600461241e565b611393565b600b546102df906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061059157506001600160e01b03198216635b5e139f60e01b145b806105ac57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606105c18261ffff1661146d565b6105de57604051631bcabe3360e01b815260040160405180910390fd5b61ffff82166000908152600e602052604090205460ff161561063357505060408051808201909152600581527f626c61636b000000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600681527f73696c7665720000000000000000000000000000000000000000000000000000602082015290565b60606002805461067b9061249b565b80601f01602080910402602001604051908101604052809291908181526020018280546106a79061249b565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b60006107098261146d565b610726576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074d82610b12565b9050806001600160a01b0316836001600160a01b031614156107825760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107a257506107a081336111ad565b155b156107c0576040516367d9dca160e11b815260040160405180910390fd5b6107cb8383836114a9565b505050565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061085e61dead610bf9565b600180540303905090565b336000908152600d602052604090205460ff16610899576040516308db091b60e31b815260040160405180910390fd5b6108a382846124ec565b61ffff166108c457604051632d04645160e21b815260040160405180910390fd5b600b546001805461ffff600160a01b840481169387821693600160c01b909104909116916108f29190612512565b6108fc9190612512565b6109069190612529565b11156109255760405163dd0c7bc960e01b815260040160405180910390fd5b600b5461ffff600160b01b8204811691610948918591600160c01b9004166124ec565b61ffff16111561096b5760405163dc46a6a760e01b815260040160405180910390fd5b61ffff821615610a215781600b60188282829054906101000a900461ffff1661099491906124ec565b92506101000a81548161ffff021916908361ffff1602179055506000836001546109be91906124ec565b905060005b8361ffff168161ffff161015610a1e576001600e6000846109e381612541565b61ffff9190911682526020820192909252604001600020805460ff191692151592909217909155915080610a1681612541565b9150506109c3565b50505b6107cb81610a2f84866124ec565b61ffff1660405180602001604052806000815250611505565b6107cb838383611512565b6107cb83838360405180602001604052806000815250610eca565b610a7833826116f4565b610a955760405163871b97e160e01b815260040160405180910390fd5b610a9e8161174b565b50565b6000546001600160a01b03163314610afb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b8051610b0e906009906020840190611df1565b5050565b6000610b1d8261146d565b610b3a57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610b625750919050565b60001901610b3c565b60098054610b789061249b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba49061249b565b8015610bf15780601f10610bc657610100808354040283529160200191610bf1565b820191906000526020600020905b815481529060010190602001808311610bd457829003601f168201915b505050505081565b60006001600160a01b038216610c22576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610c985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610ca2600061185d565b565b60005b81518161ffff161015610d3957610ce0335b838361ffff1681518110610ccf57610ccf612563565b602002602001015161ffff166116f4565b610cfd57604051632ce44b5f60e11b815260040160405180910390fd5b610d298484848461ffff1681518110610d1857610d18612563565b602002602001015161ffff16610a48565b610d3281612541565b9050610ca7565b50816001600160a01b0316836001600160a01b0316610d553390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20484604051610d8d9190612579565b60405180910390a4505050565b6107cb83838360405180602001604052806000815250611393565b60606003805461067b9061249b565b60005b81518161ffff161015610b0e57610ddd33610cb9565b610dfa5760405163871b97e160e01b815260040160405180910390fd5b610e24828261ffff1681518110610e1357610e13612563565b602002602001015161ffff1661174b565b610e2d81612541565b9050610dc7565b6001600160a01b038216331415610e5e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ed5848484611512565b610ee1848484846118ad565b610efe576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b03163314610f5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610a9e816119ac565b6000546001600160a01b03163314610fc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b60005b82811015610efe5781600d6000868685818110610fe357610fe3612563565b9050602002016020810190610ff89190611fbb565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061102a816125c1565b915050610fc4565b606061103d8261146d565b61105a57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546110699061249b565b90501161108557604051806020016040528060008152506105ac565b61108d611ac6565b611096836105b2565b6040516020016110a79291906125dc565b60405160208183030381529060405292915050565b600b546000906110e09061ffff600160c01b8204811691600160b01b900416612633565b61ffff16905090565b6000546001600160a01b031633146111435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b600b80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff948516027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff1617600160b01b9290931691909102919091179055565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612656565b6001600160a01b0316141561123c5760019150506105ac565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b600b5460018054600092600160c01b900461ffff169161128d91612512565b6112979190612512565b600b546112af9190600160a01b900461ffff16612512565b905090565b6000546001600160a01b0316331461130e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b6001600160a01b03811661138a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610826565b610a9e8161185d565b60005b825181101561140b576113b533848381518110610ccf57610ccf612563565b6113d257604051632ce44b5f60e11b815260040160405180910390fd5b6113fb85858584815181106113e9576113e9612563565b602002602001015161ffff1685610eca565b611404816125c1565b9050611396565b50826001600160a01b0316846001600160a01b03166114273390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d2048560405161145f9190612579565b60405180910390a450505050565b6000808211801561147f575060015482105b80156105ac57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6107cb8383836001611ad5565b600061151d82610b12565b90506000336001600160a01b038316148061153d575061153d82336111ad565b8061155857503361154d846106fe565b6001600160a01b0316145b90508061157857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b0316146115a95760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166115d057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead14156115fc57604051630278d60f60e11b815260040160405180910390fd5b6116098585856001611c1a565b611615600084846114a9565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b03191690911790559086018083529120549091166116aa576001548110156116aa57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008061170083610b12565b9050806001600160a01b0316846001600160a01b0316148061173b5750836001600160a01b0316611730846106fe565b6001600160a01b0316145b80611266575061126681856111ad565b600061175682610b12565b9050611766816000846001611c1a565b611772600083836114a9565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead1790559085018083529120549091166118205760015481101561182057600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156119a157604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118f1903390899088908890600401612673565b6020604051808303816000875af192505050801561192c575060408051601f3d908101601f19168201909252611929918101906126af565b60015b611987573d80801561195a576040519150601f19603f3d011682016040523d82523d6000602084013e61195f565b606091505b50805161197f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611266565b506001949350505050565b806119ca576040516356be441560e01b815260040160405180910390fd5b600154600114156119ee5760405163c0367cab60e01b815260040160405180910390fd5b6008546001548110611a1357604051630a596e2160e21b815260040160405180910390fd5b6001548282016000198101911015611a2e5750600154600019015b815b818111611abb576000818152600460205260409020546001600160a01b0316158015611a7557506000818152600460205260409020546001600160a01b031661dead14155b15611ab3576000611a8582610b12565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101611a30565b506001016008555050565b60606009805461067b9061249b565b6001546001600160a01b038516611afe57604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead1415611b2a57604051631617320f60e01b815260040160405180910390fd5b83611b485760405163b562e8dd60e01b815260040160405180910390fd5b611b556000868387611c1a565b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b85811015611c115760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611c0557611be860008884886118ad565b611c05576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611b95565b506001556116ed565b600b546001600160a01b031615611cea57600b54604051635fd6196560e01b81526001600160a01b03868116600483015290911690635fd6196590602401600060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b5050600b54604051635fd6196560e01b81526001600160a01b0387811660048301529091169250635fd619659150602401600060405180830381600087803b158015611cd157600080fd5b505af1158015611ce5573d6000803e3d6000fd5b505050505b6000825b611cf88385612529565b8161ffff161015611d3f5761ffff81166000908152600e602052604090205460ff1615611d2d57611d2a6001836124ec565b91505b80611d3781612541565b915050611cee565b506001600160a01b03851615611d96576001600160a01b0385166000908152600c602052604081208054839290611d7b90849061ffff16612633565b92506101000a81548161ffff021916908361ffff1602179055505b6001600160a01b03841615611dec576001600160a01b0384166000908152600c602052604081208054839290611dd190849061ffff166124ec565b92506101000a81548161ffff021916908361ffff1602179055505b6116ed565b828054611dfd9061249b565b90600052602060002090601f016020900481019282611e1f5760008555611e65565b82601f10611e3857805160ff1916838001178555611e65565b82800160010185558215611e65579182015b82811115611e65578251825591602001919060010190611e4a565b50611e71929150611e75565b5090565b5b80821115611e715760008155600101611e76565b6001600160e01b031981168114610a9e57600080fd5b600060208284031215611eb257600080fd5b8135611ebd81611e8a565b9392505050565b803561ffff81168114611ed657600080fd5b919050565b600060208284031215611eed57600080fd5b611ebd82611ec4565b60005b83811015611f11578181015183820152602001611ef9565b83811115610efe5750506000910152565b60008151808452611f3a816020860160208601611ef6565b601f01601f19169290920160200192915050565b602081526000611ebd6020830184611f22565b600060208284031215611f7357600080fd5b5035919050565b6001600160a01b0381168114610a9e57600080fd5b60008060408385031215611fa257600080fd5b8235611fad81611f7a565b946020939093013593505050565b600060208284031215611fcd57600080fd5b8135611ebd81611f7a565b600080600060608486031215611fed57600080fd5b611ff684611ec4565b925061200460208501611ec4565b9150604084013561201481611f7a565b809150509250925092565b60008060006060848603121561203457600080fd5b833561203f81611f7a565b9250602084013561204f81611f7a565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561209f5761209f612060565b604052919050565b600067ffffffffffffffff8311156120c1576120c1612060565b6120d4601f8401601f1916602001612076565b90508281528383830111156120e857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561211157600080fd5b813567ffffffffffffffff81111561212857600080fd5b8201601f8101841361213957600080fd5b611266848235602084016120a7565b600082601f83011261215957600080fd5b8135602067ffffffffffffffff82111561217557612175612060565b8160051b612184828201612076565b928352848101820192828101908785111561219e57600080fd5b83870192505b848310156121c4576121b583611ec4565b825291830191908301906121a4565b979650505050505050565b6000806000606084860312156121e457600080fd5b83356121ef81611f7a565b925060208401356121ff81611f7a565b9150604084013567ffffffffffffffff81111561221b57600080fd5b61222786828701612148565b9150509250925092565b60006020828403121561224357600080fd5b813567ffffffffffffffff81111561225a57600080fd5b61126684828501612148565b80358015158114611ed657600080fd5b6000806040838503121561228957600080fd5b823561229481611f7a565b91506122a260208401612266565b90509250929050565b600082601f8301126122bc57600080fd5b611ebd838335602085016120a7565b600080600080608085870312156122e157600080fd5b84356122ec81611f7a565b935060208501356122fc81611f7a565b925060408501359150606085013567ffffffffffffffff81111561231f57600080fd5b61232b878288016122ab565b91505092959194509250565b60008060006040848603121561234c57600080fd5b833567ffffffffffffffff8082111561236457600080fd5b818601915086601f83011261237857600080fd5b81358181111561238757600080fd5b8760208260051b850101111561239c57600080fd5b6020928301955093506123b29186019050612266565b90509250925092565b600080604083850312156123ce57600080fd5b6123d783611ec4565b91506122a260208401611ec4565b600080604083850312156123f857600080fd5b823561240381611f7a565b9150602083013561241381611f7a565b809150509250929050565b6000806000806080858703121561243457600080fd5b843561243f81611f7a565b9350602085013561244f81611f7a565b9250604085013567ffffffffffffffff8082111561246c57600080fd5b61247888838901612148565b9350606087013591508082111561248e57600080fd5b5061232b878288016122ab565b600181811c908216806124af57607f821691505b602082108114156124d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612509576125096124d6565b01949350505050565b600082821015612524576125246124d6565b500390565b6000821982111561253c5761253c6124d6565b500190565b600061ffff80831681811415612559576125596124d6565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156125b557835161ffff1683529284019291840191600101612595565b50909695505050505050565b60006000198214156125d5576125d56124d6565b5060010190565b600083516125ee818460208801611ef6565b835190830190612602818360208801611ef6565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600061ffff8381169083168181101561264e5761264e6124d6565b039392505050565b60006020828403121561266857600080fd5b8151611ebd81611f7a565b60006001600160a01b038087168352808616602084015250836040830152608060608301526126a56080830184611f22565b9695505050505050565b6000602082840312156126c157600080fd5b8151611ebd81611e8a56fea264697066735822122017ab764a21de809f024ab1775d3eaf75d27f9bb30b70a441cc312633746fa02b64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000644414f426e420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644414f424e4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6354615468397465744c72454636414e6252554e635168357933665a4b437439534e76325a545a3656354d512f000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): DAOBnB
Arg [1] : symbol_ (string): DAOBNB
Arg [2] : _initialBaseURI (string): ipfs://QmcTaTh9tetLrEF6ANbRUNcQh5y3fZKCt9SNv2ZTZ6V5MQ/
Arg [3] : _openSeaProxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 44414f426e420000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 44414f424e420000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d6354615468397465744c72454636414e6252554e635168
Arg [11] : 357933665a4b437439534e76325a545a3656354d512f00000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
44240:6054:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25037:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25037:305:0;;;;;;;;45904:272;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26136:100::-;;;:::i;27613:212::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2045:55:1;;;2027:74;;2015:2;2000:18;27613:212:0;1881:226:1;27202:345:0;;;;;;:::i;:::-;;:::i;:::-;;50016:85;;;;;;:::i;:::-;;:::i;24676:289::-;;;:::i;:::-;;;3004:25:1;;;2992:2;2977:18;24676:289:0;2858:177:1;47537:833:0;;;;;;:::i;:::-;;:::i;28486:170::-;;;;;;:::i;:::-;;:::i;28727:185::-;;;;;;:::i;:::-;;:::i;40940:176::-;;;;;;:::i;:::-;;:::i;49338:106::-;;;;;;:::i;:::-;;:::i;25662:407::-;;;;;;:::i;:::-;;:::i;44757:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5603:6:1;5591:19;;;5573:38;;5561:2;5546:18;44757:50:0;5429:188:1;44434:21:0;;;:::i;25406:194::-;;;;;;:::i;:::-;;:::i;2713:103::-;;;:::i;42410:427::-;;;;;;:::i;:::-;;:::i;2062:87::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;2062:87;;42922:196;;;;;;:::i;:::-;;:::i;26305:104::-;;;:::i;41477:273::-;;;;;;:::i;:::-;;:::i;27897:287::-;;;;;;:::i;:::-;;:::i;44502:42::-;;;;;-1:-1:-1;;;;;44502:42:0;;;28983:316;;;;;;:::i;:::-;;:::i;50185:106::-;;;;;;:::i;:::-;;:::i;49515:205::-;;;;;;:::i;:::-;;:::i;47065:393::-;;;;;;:::i;:::-;;:::i;45710:114::-;;;:::i;49782:172::-;;;;;;:::i;:::-;;:::i;39223:43::-;;;;;;46288:508;;;;;;:::i;:::-;;:::i;45504:137::-;;;:::i;2971:201::-;;;;;;:::i;:::-;;:::i;44849:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43203:472;;;;;;:::i;:::-;;:::i;44579:19::-;;;;;-1:-1:-1;;;;;44579:19:0;;;25037:305;25139:4;-1:-1:-1;;;;;;25176:40:0;;-1:-1:-1;;;25176:40:0;;:105;;-1:-1:-1;;;;;;;25233:48:0;;-1:-1:-1;;;25233:48:0;25176:105;:158;;;-1:-1:-1;;;;;;;;;;22452:40:0;;;25298:36;25156:178;25037:305;-1:-1:-1;;25037:305:0:o;45904:272::-;45964:13;45995:16;46003:7;45995:16;;:7;:16::i;:::-;45990:64;;46020:34;;-1:-1:-1;;;46020:34:0;;;;;;;;;;;45990:64;46071:27;;;;;;;:18;:27;;;;;;;;46067:74;;;-1:-1:-1;;46115:14:0;;;;;;;;;;;;;;;;;;45904:272::o;46067:74::-;-1:-1:-1;;46153:15:0;;;;;;;;;;;;;;;;;;45904:272::o;26136:100::-;26190:13;26223:5;26216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26136:100;:::o;27613:212::-;27689:7;27714:16;27722:7;27714;:16::i;:::-;27709:64;;27739:34;;-1:-1:-1;;;27739:34:0;;;;;;;;;;;27709:64;-1:-1:-1;27793:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27793:24:0;;27613:212::o;27202:345::-;27283:13;27299:16;27307:7;27299;:16::i;:::-;27283:32;;27336:5;-1:-1:-1;;;;;27330:11:0;:2;-1:-1:-1;;;;;27330:11:0;;27326:48;;;27350:24;;-1:-1:-1;;;27350:24:0;;;;;;;;;;;27326:48;860:10;-1:-1:-1;;;;;27391:21:0;;;;;;:63;;-1:-1:-1;27417:37:0;27434:5;860:10;46288:508;:::i;27417:37::-;27416:38;27391:63;27387:111;;;27463:35;;-1:-1:-1;;;27463:35:0;;;;;;;;;;;27387:111;27511:28;27520:2;27524:7;27533:5;27511:8;:28::i;:::-;27272:275;27202:345;;:::o;50016:85::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;;;;;;;;;50079:5:::1;:14:::0;;-1:-1:-1;;;;;;50079:14:0::1;-1:-1:-1::0;;;;;50079:14:0;;;::::1;::::0;;;::::1;::::0;;50016:85::o;24676:289::-;24728:7;24922:20;24433:42;24922:9;:20::i;:::-;24917:1;24902:12;;:16;24901:41;24894:48;;24676:289;:::o;47537:833::-;47644:10;47636:19;;;;:7;:19;;;;;;;;47632:52;;47664:20;;-1:-1:-1;;;47664:20:0;;;;;;;;;;;47632:52;47698:36;47718:16;47698:17;:36;:::i;:::-;:41;;47695:75;;47748:22;;-1:-1:-1;;;47748:22:0;;;;;;;;;;;47695:75;47842:14;;47799:1;47784:12;;47842:14;-1:-1:-1;;;47842:14:0;;;;;47784:55;;;;-1:-1:-1;;;47803:16:0;;;;;;;47784;;47799:1;47784:16;:::i;:::-;:35;;;;:::i;:::-;:55;;;;:::i;:::-;:72;47781:106;;;47865:22;;-1:-1:-1;;;47865:22:0;;;;;;;;;;;47781:106;47939:13;;;-1:-1:-1;;;47939:13:0;;;;;47901:35;;47920:16;;-1:-1:-1;;;47901:16:0;;;:35;:::i;:::-;:51;;;47898:84;;;47961:21;;-1:-1:-1;;;47961:21:0;;;;;;;;;;;47898:84;47999:20;;;;47995:292;;48056:16;48036;;:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48089:14;48129:17;48113:12;;48106:40;;;;:::i;:::-;48089:57;;48168:8;48163:113;48182:16;48178:20;;:1;:20;;;48163:113;;;48256:4;48224:18;:29;48243:9;;;;:::i;:::-;48224:29;;;;;;;;;;;;;;;;-1:-1:-1;48224:29:0;:36;;-1:-1:-1;;48224:36:0;;;;;;;;;;;:29;-1:-1:-1;48200:3:0;;;;:::i;:::-;;;;48163:113;;;;48021:266;47995:292;48307:55;48317:2;48321:36;48341:16;48321:17;:36;:::i;:::-;48307:55;;;;;;;;;;;;;;:9;:55::i;28486:170::-;28620:28;28630:4;28636:2;28640:7;28620:9;:28::i;28727:185::-;28865:39;28882:4;28888:2;28892:7;28865:39;;;;;;;;;;;;:16;:39::i;40940:176::-;41002:41;860:10;41035:7;41002:18;:41::i;:::-;40997:86;;41052:31;;-1:-1:-1;;;41052:31:0;;;;;;;;;;;40997:86;41094:14;41100:7;41094:5;:14::i;:::-;40940:176;:::o;49338:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;49415:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49338:106:::0;:::o;25662:407::-;25734:13;25765:16;25773:7;25765;:16::i;:::-;25760:61;;25790:31;;-1:-1:-1;;;25790:31:0;;;;;;;;;;;25760:61;25879:7;25859:192;25924:13;;;;:7;:13;;;;;;-1:-1:-1;;;;;25924:13:0;;-1:-1:-1;25960:19:0;;25956:80;;26004:12;25662:407;;;:::o;25956:80::-;-1:-1:-1;;25889:6:0;25859:192;;44434:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25406:194::-;25478:7;-1:-1:-1;;;;;25502:19:0;;25498:60;;25530:28;;-1:-1:-1;;;25530:28:0;;;;;;;;;;;25498:60;-1:-1:-1;;;;;;25576:16:0;;;;;:9;:16;;;;;;;25406:194::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;42410:427::-;42554:8;42549:216;42572:8;:15;42568:1;:19;;;42549:216;;;42614:45;860:10;42633:12;42647:8;42656:1;42647:11;;;;;;;;;;:::i;:::-;;;;;;;42614:45;;:18;:45::i;:::-;42609:94;;42668:35;;-1:-1:-1;;;42668:35:0;;;;;;;;;;;42609:94;42718:35;42731:4;42737:2;42741:8;42750:1;42741:11;;;;;;;;;;:::i;:::-;;;;;;;42718:35;;:12;:35::i;:::-;42589:3;;;:::i;:::-;;;42549:216;;;;42816:2;-1:-1:-1;;;;;42782:47:0;42810:4;-1:-1:-1;;;;;42782:47:0;42796:12;860:10;;780:98;42796:12;-1:-1:-1;;;;;42782:47:0;;42820:8;42782:47;;;;;;:::i;:::-;;;;;;;;42410:427;;;:::o;42922:196::-;43065:45;43087:4;43093:2;43097:8;43065:45;;;;;;;;;;;;:21;:45::i;26305:104::-;26361:13;26394:7;26387:14;;;;;:::i;41477:273::-;41553:8;41548:195;41571:8;:15;41567:1;:19;;;41548:195;;;41613:45;860:10;41632:12;780:98;41613:45;41608:90;;41667:31;;-1:-1:-1;;;41667:31:0;;;;;;;;;;;41608:90;41713:18;41719:8;41728:1;41719:11;;;;;;;;;;:::i;:::-;;;;;;;41713:18;;:5;:18::i;:::-;41588:3;;;:::i;:::-;;;41548:195;;27897:287;-1:-1:-1;;;;;27996:24:0;;860:10;27996:24;27992:54;;;28029:17;;-1:-1:-1;;;28029:17:0;;;;;;;;;;;27992:54;860:10;28059:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28059:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28059:53:0;;;;;;;;;;28128:48;;540:41:1;;;28059:42:0;;860:10;28128:48;;513:18:1;28128:48:0;;;;;;;27897:287;;:::o;28983:316::-;29150:28;29160:4;29166:2;29170:7;29150:9;:28::i;:::-;29194:48;29217:4;29223:2;29227:7;29236:5;29194:22;:48::i;:::-;29189:102;;29251:40;;-1:-1:-1;;;29251:40:0;;;;;;;;;;;29189:102;28983:316;;;;:::o;50185:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;50255:28:::1;50274:8;50255:18;:28::i;49515:205::-:0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;49613:9:::1;49609:104;49628:20:::0;;::::1;49609:104;;;49694:7;49670;:21;49678:9;;49688:1;49678:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49670:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49670:21:0;:31;;-1:-1:-1;;49670:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49650:3;::::1;::::0;::::1;:::i;:::-;;;;49609:104;;47065:393:::0;47183:13;47219:16;47227:7;47219;:16::i;:::-;47214:59;;47244:29;;-1:-1:-1;;;47244:29:0;;;;;;;;;;;47214:59;47330:1;47312:7;47306:21;;;;;:::i;:::-;;;:25;:144;;;;;;;;;;;;;;;;;47375:10;:8;:10::i;:::-;47387:30;47408:7;47387:13;:30::i;:::-;47358:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47286:164;47065:393;-1:-1:-1;;47065:393:0:o;45710:114::-;45800:16;;45757:7;;45784:32;;45800:16;-1:-1:-1;;;45800:16:0;;;;;-1:-1:-1;;;45784:13:0;;;:32;:::i;:::-;45777:39;;;;45710:114;:::o;49782:172::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;49881:14:::1;:28:::0;;49920:26;;-1:-1:-1;;;49881:28:0::1;::::0;;::::1;;49920:26:::0;;;-1:-1:-1;;;49920:26:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;49782:172::o;46288:508::-;46577:27;;46638:35;;-1:-1:-1;;;46638:35:0;;-1:-1:-1;;;;;2045:55:1;;;46638:35:0;;;2027:74:1;46413:4:0;;46577:27;;;46630:56;;;;46577:27;;46638:28;;2000:18:1;;46638:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46630:56:0;;46626:100;;;46710:4;46703:11;;;;;46626:100;-1:-1:-1;;;;;28376:25:0;;;28352:4;28376:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46745:43;46738:50;46288:508;-1:-1:-1;;;;46288:508:0:o;45504:137::-;45616:16;;45612:1;45597:12;;45552:7;;-1:-1:-1;;;45616:16:0;;;;;45597;;;:::i;:::-;:35;;;;:::i;:::-;45579:14;;:54;;;-1:-1:-1;;;45579:14:0;;;;:54;:::i;:::-;45572:61;;45504:137;:::o;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;14993:2:1;3052:73:0::1;::::0;::::1;14975:21:1::0;15032:2;15012:18;;;15005:30;15071:34;15051:18;;;15044:62;15142:8;15122:18;;;15115:36;15168:19;;3052:73:0::1;14791:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;43203:472::-:0;43380:9;43375:228;43399:8;:15;43395:1;:19;43375:228;;;43441:45;860:10;43474:8;43483:1;43474:11;;;;;;;;:::i;43441:45::-;43436:94;;43495:35;;-1:-1:-1;;;43495:35:0;;;;;;;;;;;43436:94;43545:46;43562:4;43568:2;43572:8;43581:1;43572:11;;;;;;;;:::i;:::-;;;;;;;43545:46;;43585:5;43545:16;:46::i;:::-;43416:3;;;:::i;:::-;;;43375:228;;;;43654:2;-1:-1:-1;;;;;43620:47:0;43648:4;-1:-1:-1;;;;;43620:47:0;43634:12;860:10;;780:98;43634:12;-1:-1:-1;;;;;43620:47:0;;43658:8;43620:47;;;;;;:::i;:::-;;;;;;;;43203:472;;;;:::o;29843:167::-;29908:4;29942:1;29932:7;:11;:37;;;;;29957:12;;29947:7;:22;29932:37;:70;;;;-1:-1:-1;29973:16:0;;;;:7;:16;;;;;;-1:-1:-1;;;;;29973:16:0;24433:42;29973:29;;29925:77;29843:167;-1:-1:-1;;29843:167:0:o;34574:196::-;34689:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;34689:29:0;-1:-1:-1;;;;;34689:29:0;;;;;;;;;34734:28;;34689:24;;34734:28;;;;;;;34574:196;;;:::o;30616:171::-;30747:32;30753:2;30757:8;30767:5;30774:4;30747:5;:32::i;32585:1871::-;32700:13;32716:16;32724:7;32716;:16::i;:::-;32700:32;-1:-1:-1;32745:22:0;860:10;-1:-1:-1;;;;;32771:21:0;;;;:75;;-1:-1:-1;32809:37:0;32826:5;860:10;46288:508;:::i;32809:37::-;32771:128;;;-1:-1:-1;860:10:0;32863:20;32875:7;32863:11;:20::i;:::-;-1:-1:-1;;;;;32863:36:0;;32771:128;32745:155;;32918:17;32913:66;;32944:35;;-1:-1:-1;;;32944:35:0;;;;;;;;;;;32913:66;33003:4;-1:-1:-1;;;;;32994:13:0;:5;-1:-1:-1;;;;;32994:13:0;;32990:54;;33016:28;;-1:-1:-1;;;33016:28:0;;;;;;;;;;;32990:54;-1:-1:-1;;;;;33059:16:0;;33055:52;;33084:23;;-1:-1:-1;;;33084:23:0;;;;;;;;;;;33055:52;-1:-1:-1;;;;;33122:15:0;;24433:42;33122:15;33118:51;;;33146:23;;-1:-1:-1;;;33146:23:0;;;;;;;;;;;33118:51;33182:43;33204:4;33210:2;33214:7;33223:1;33182:21;:43::i;:::-;33290:36;33307:1;33311:7;33320:5;33290:8;:36::i;:::-;-1:-1:-1;;;;;33618:15:0;;;;;;;:9;:15;;;;;;;;:20;;-1:-1:-1;;33618:20:0;;;33653:13;;;;;;;;;:18;;33637:1;33653:18;;;;;;33688:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33688:21:0;;;;;;33993:11;;;34023:20;;;;;;33993:11;;34023:20;34019:321;;34240:12;;34226:11;:26;34222:103;;;34277:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;34277:28:0;-1:-1:-1;;;;;34277:28:0;;;;;34222:103;33593:758;34387:7;34383:2;-1:-1:-1;;;;;34368:27:0;34377:4;-1:-1:-1;;;;;34368:27:0;;;;;;;;;;;34406:42;32689:1767;;32585:1871;;;:::o;29307:281::-;29399:4;29416:13;29432:16;29440:7;29432;:16::i;:::-;29416:32;;29479:5;-1:-1:-1;;;;;29469:15:0;:6;-1:-1:-1;;;;;29469:15:0;;:62;;;;29525:6;-1:-1:-1;;;;;29501:30:0;:20;29513:7;29501:11;:20::i;:::-;-1:-1:-1;;;;;29501:30:0;;29469:62;:110;;;;29548:31;29565:5;29572:6;29548:16;:31::i;34999:1422::-;35059:13;35075:16;35083:7;35075;:16::i;:::-;35059:32;;35104:52;35126:5;35141:1;35145:7;35154:1;35104:21;:52::i;:::-;35221:36;35238:1;35242:7;35251:5;35221:8;:36::i;:::-;-1:-1:-1;;;;;35549:16:0;;;;;;;:9;:16;;;;;;;;:21;;-1:-1:-1;;35549:21:0;;;35585:20;:25;;35569:1;35585:25;;;;;;35627:16;;;:7;:16;;;;;;:28;;-1:-1:-1;;;;;;35627:28:0;24433:42;35627:28;;;35939:11;;;35969:20;;;;;;35939:11;;35969:20;35965:322;;36186:12;;36172:11;:26;36168:104;;;36224:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;36224:28:0;-1:-1:-1;;;;;36224:28:0;;;;;36168:104;-1:-1:-1;36315:36:0;;36343:7;;36339:1;;-1:-1:-1;;;;;36315:36:0;;;;;36339:1;;36315:36;49415:21:::1;49338:106:::0;:::o;3332:191::-;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;36986:765::-;37141:4;-1:-1:-1;;;;;37162:13:0;;12332:20;12380:8;37158:586;;37198:72;;-1:-1:-1;;;37198:72:0;;-1:-1:-1;;;;;37198:36:0;;;;;:72;;860:10;;37249:4;;37255:7;;37264:5;;37198:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37198:72:0;;;;;;;;-1:-1:-1;;37198:72:0;;;;;;;;;;;;:::i;:::-;;;37194:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37444:13:0;;37440:234;;37471:40;;-1:-1:-1;;;37471:40:0;;;;;;;;;;;37440:234;37624:6;37618:13;37609:6;37605:2;37601:15;37594:38;37194:495;-1:-1:-1;;;;;;37321:55:0;-1:-1:-1;;;37321:55:0;;-1:-1:-1;37314:62:0;;37158:586;-1:-1:-1;37728:4:0;36986:765;;;;;;:::o;39379:1074::-;39449:13;39445:49;;39471:23;;-1:-1:-1;;;39471:23:0;;;;;;;;;;;39445:49;39509:12;;39525:1;39509:17;39505:49;;;39535:19;;-1:-1:-1;;;39535:19:0;;;;;;;;;;;39505:49;39601:24;;39669:12;;39640:41;;39636:76;;39690:22;;-1:-1:-1;;;39690:22:0;;;;;;;;;;;39636:76;39916:1;40014:12;39877:36;;;-1:-1:-1;;39877:40:0;;;-1:-1:-1;39995:95:0;;;-1:-1:-1;40073:1:0;40058:12;-1:-1:-1;;40058:16:0;39995:95;40123:25;40106:273;40155:8;40150:1;:13;40106:273;;40215:1;40193:10;;;:7;:10;;;;;;-1:-1:-1;;;;;40193:10:0;:24;:51;;;;-1:-1:-1;40221:10:0;;;;:7;:10;;;;;;-1:-1:-1;;;;;40221:10:0;24433:42;40221:23;;40193:51;40189:175;;;40269:17;40289:10;40297:1;40289:7;:10::i;:::-;40322;;;;:7;:10;;;;;:22;;-1:-1:-1;;;;;;40322:22:0;-1:-1:-1;;;;;40322:22:0;;;;;;;;;;-1:-1:-1;40189:175:0;40165:3;;40106:273;;;-1:-1:-1;40433:1:0;40422:12;40395:24;:39;-1:-1:-1;;39379:1074:0:o;46883:108::-;46943:13;46976:7;46969:14;;;;;:::i;31046:1285::-;31216:12;;-1:-1:-1;;;;;31243:16:0;;31239:48;;31268:19;;-1:-1:-1;;;31268:19:0;;;;;;;;;;;31239:48;-1:-1:-1;;;;;31302:15:0;;24433:42;31302:15;31298:47;;;31326:19;;-1:-1:-1;;;31326:19:0;;;;;;;;;;;31298:47;31360:13;31356:44;;31382:18;;-1:-1:-1;;;31382:18:0;;;;;;;;;;;31356:44;31413:61;31443:1;31447:2;31451:12;31465:8;31413:21;:61::i;:::-;-1:-1:-1;;;;;31727:13:0;;;;;;:9;:13;;;;;;;;:25;;;;;;31769:21;;;:7;:21;;;;;:26;;-1:-1:-1;;;;;;31769:26:0;;;;;;;31777:12;;31864:332;31884:8;31880:1;:12;31864:332;;;31923:38;;31948:12;;-1:-1:-1;;;;;31923:38:0;;;31940:1;;31923:38;;31940:1;;31923:38;31984:4;31980:166;;;32018:59;32049:1;32053:2;32057:12;32071:5;32018:22;:59::i;:::-;32013:113;;32086:40;;-1:-1:-1;;;32086:40:0;;;;;;;;;;;32013:113;32166:14;;;;;31894:3;31864:332;;;-1:-1:-1;32212:12:0;:27;32263:60;28983:316;48473:790;48662:5;;-1:-1:-1;;;;;48662:5:0;48654:28;48650:124;;48699:5;;:25;;-1:-1:-1;;;48699:25:0;;-1:-1:-1;;;;;2045:55:1;;;48699:25:0;;;2027:74:1;48699:5:0;;;;:19;;2000:18:1;;48699:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48739:5:0;;:23;;-1:-1:-1;;;48739:23:0;;-1:-1:-1;;;;;2045:55:1;;;48739:23:0;;;2027:74:1;48739:5:0;;;;-1:-1:-1;48739:19:0;;-1:-1:-1;2000:18:1;;48739:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48650:124;48786:17;48838:12;48816:174;48857:23;48872:8;48857:12;:23;:::i;:::-;48853:1;:27;;;48816:174;;;48906:21;;;;;;;:18;:21;;;;;;;;48902:77;;;48948:15;48962:1;48948:15;;:::i;:::-;;;48902:77;48882:3;;;;:::i;:::-;;;;48816:174;;;-1:-1:-1;;;;;;49006:18:0;;;49002:87;;-1:-1:-1;;;;;49041:22:0;;;;;;:16;:22;;;;;:36;;49067:10;;49041:22;:36;;49067:10;;49041:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49002:87;-1:-1:-1;;;;;49103:16:0;;;49099:83;;-1:-1:-1;;;;;49136:20:0;;;;;;:16;:20;;;;;:34;;49160:10;;49136:20;:34;;49160:10;;49136:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49099:83;49194:61;28983:316;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:159::-;659:20;;719:6;708:18;;698:29;;688:57;;741:1;738;731:12;688:57;592:159;;;:::o;756:184::-;814:6;867:2;855:9;846:7;842:23;838:32;835:52;;;883:1;880;873:12;835:52;906:28;924:9;906:28;:::i;945:258::-;1017:1;1027:113;1041:6;1038:1;1035:13;1027:113;;;1117:11;;;1111:18;1098:11;;;1091:39;1063:2;1056:10;1027:113;;;1158:6;1155:1;1152:13;1149:48;;;-1:-1:-1;;1193:1:1;1175:16;;1168:27;945:258::o;1208:::-;1250:3;1288:5;1282:12;1315:6;1310:3;1303:19;1331:63;1387:6;1380:4;1375:3;1371:14;1364:4;1357:5;1353:16;1331:63;:::i;:::-;1448:2;1427:15;-1:-1:-1;;1423:29:1;1414:39;;;;1455:4;1410:50;;1208:258;-1:-1:-1;;1208:258:1:o;1471:220::-;1620:2;1609:9;1602:21;1583:4;1640:45;1681:2;1670:9;1666:18;1658:6;1640:45;:::i;1696:180::-;1755:6;1808:2;1796:9;1787:7;1783:23;1779:32;1776:52;;;1824:1;1821;1814:12;1776:52;-1:-1:-1;1847:23:1;;1696:180;-1:-1:-1;1696:180:1:o;2112:154::-;-1:-1:-1;;;;;2191:5:1;2187:54;2180:5;2177:65;2167:93;;2256:1;2253;2246:12;2271:315;2339:6;2347;2400:2;2388:9;2379:7;2375:23;2371:32;2368:52;;;2416:1;2413;2406:12;2368:52;2455:9;2442:23;2474:31;2499:5;2474:31;:::i;:::-;2524:5;2576:2;2561:18;;;;2548:32;;-1:-1:-1;;;2271:315:1:o;2591:262::-;2665:6;2718:2;2706:9;2697:7;2693:23;2689:32;2686:52;;;2734:1;2731;2724:12;2686:52;2773:9;2760:23;2792:31;2817:5;2792:31;:::i;3040:391::-;3115:6;3123;3131;3184:2;3172:9;3163:7;3159:23;3155:32;3152:52;;;3200:1;3197;3190:12;3152:52;3223:28;3241:9;3223:28;:::i;:::-;3213:38;;3270:37;3303:2;3292:9;3288:18;3270:37;:::i;:::-;3260:47;;3357:2;3346:9;3342:18;3329:32;3370:31;3395:5;3370:31;:::i;:::-;3420:5;3410:15;;;3040:391;;;;;:::o;3436:456::-;3513:6;3521;3529;3582:2;3570:9;3561:7;3557:23;3553:32;3550:52;;;3598:1;3595;3588:12;3550:52;3637:9;3624:23;3656:31;3681:5;3656:31;:::i;:::-;3706:5;-1:-1:-1;3763:2:1;3748:18;;3735:32;3776:33;3735:32;3776:33;:::i;:::-;3436:456;;3828:7;;-1:-1:-1;;;3882:2:1;3867:18;;;;3854:32;;3436:456::o;3897:127::-;3958:10;3953:3;3949:20;3946:1;3939:31;3989:4;3986:1;3979:15;4013:4;4010:1;4003:15;4029:275;4100:2;4094:9;4165:2;4146:13;;-1:-1:-1;;4142:27:1;4130:40;;4200:18;4185:34;;4221:22;;;4182:62;4179:88;;;4247:18;;:::i;:::-;4283:2;4276:22;4029:275;;-1:-1:-1;4029:275:1:o;4309:407::-;4374:5;4408:18;4400:6;4397:30;4394:56;;;4430:18;;:::i;:::-;4468:57;4513:2;4492:15;;-1:-1:-1;;4488:29:1;4519:4;4484:40;4468:57;:::i;:::-;4459:66;;4548:6;4541:5;4534:21;4588:3;4579:6;4574:3;4570:16;4567:25;4564:45;;;4605:1;4602;4595:12;4564:45;4654:6;4649:3;4642:4;4635:5;4631:16;4618:43;4708:1;4701:4;4692:6;4685:5;4681:18;4677:29;4670:40;4309:407;;;;;:::o;4721:451::-;4790:6;4843:2;4831:9;4822:7;4818:23;4814:32;4811:52;;;4859:1;4856;4849:12;4811:52;4899:9;4886:23;4932:18;4924:6;4921:30;4918:50;;;4964:1;4961;4954:12;4918:50;4987:22;;5040:4;5032:13;;5028:27;-1:-1:-1;5018:55:1;;5069:1;5066;5059:12;5018:55;5092:74;5158:7;5153:2;5140:16;5135:2;5131;5127:11;5092:74;:::i;5622:716::-;5675:5;5728:3;5721:4;5713:6;5709:17;5705:27;5695:55;;5746:1;5743;5736:12;5695:55;5782:6;5769:20;5808:4;5831:18;5827:2;5824:26;5821:52;;;5853:18;;:::i;:::-;5899:2;5896:1;5892:10;5922:28;5946:2;5942;5938:11;5922:28;:::i;:::-;5984:15;;;6054;;;6050:24;;;6015:12;;;;6086:15;;;6083:35;;;6114:1;6111;6104:12;6083:35;6150:2;6142:6;6138:15;6127:26;;6162:147;6178:6;6173:3;6170:15;6162:147;;;6244:22;6262:3;6244:22;:::i;:::-;6232:35;;6195:12;;;;6287;;;;6162:147;;;6327:5;5622:716;-1:-1:-1;;;;;;;5622:716:1:o;6343:622::-;6444:6;6452;6460;6513:2;6501:9;6492:7;6488:23;6484:32;6481:52;;;6529:1;6526;6519:12;6481:52;6568:9;6555:23;6587:31;6612:5;6587:31;:::i;:::-;6637:5;-1:-1:-1;6694:2:1;6679:18;;6666:32;6707:33;6666:32;6707:33;:::i;:::-;6759:7;-1:-1:-1;6817:2:1;6802:18;;6789:32;6844:18;6833:30;;6830:50;;;6876:1;6873;6866:12;6830:50;6899:60;6951:7;6942:6;6931:9;6927:22;6899:60;:::i;:::-;6889:70;;;6343:622;;;;;:::o;6970:346::-;7053:6;7106:2;7094:9;7085:7;7081:23;7077:32;7074:52;;;7122:1;7119;7112:12;7074:52;7162:9;7149:23;7195:18;7187:6;7184:30;7181:50;;;7227:1;7224;7217:12;7181:50;7250:60;7302:7;7293:6;7282:9;7278:22;7250:60;:::i;7321:160::-;7386:20;;7442:13;;7435:21;7425:32;;7415:60;;7471:1;7468;7461:12;7486:315;7551:6;7559;7612:2;7600:9;7591:7;7587:23;7583:32;7580:52;;;7628:1;7625;7618:12;7580:52;7667:9;7654:23;7686:31;7711:5;7686:31;:::i;:::-;7736:5;-1:-1:-1;7760:35:1;7791:2;7776:18;;7760:35;:::i;:::-;7750:45;;7486:315;;;;;:::o;7806:221::-;7848:5;7901:3;7894:4;7886:6;7882:17;7878:27;7868:55;;7919:1;7916;7909:12;7868:55;7941:80;8017:3;8008:6;7995:20;7988:4;7980:6;7976:17;7941:80;:::i;8032:665::-;8127:6;8135;8143;8151;8204:3;8192:9;8183:7;8179:23;8175:33;8172:53;;;8221:1;8218;8211:12;8172:53;8260:9;8247:23;8279:31;8304:5;8279:31;:::i;:::-;8329:5;-1:-1:-1;8386:2:1;8371:18;;8358:32;8399:33;8358:32;8399:33;:::i;:::-;8451:7;-1:-1:-1;8505:2:1;8490:18;;8477:32;;-1:-1:-1;8560:2:1;8545:18;;8532:32;8587:18;8576:30;;8573:50;;;8619:1;8616;8609:12;8573:50;8642:49;8683:7;8674:6;8663:9;8659:22;8642:49;:::i;:::-;8632:59;;;8032:665;;;;;;;:::o;8702:689::-;8794:6;8802;8810;8863:2;8851:9;8842:7;8838:23;8834:32;8831:52;;;8879:1;8876;8869:12;8831:52;8919:9;8906:23;8948:18;8989:2;8981:6;8978:14;8975:34;;;9005:1;9002;8995:12;8975:34;9043:6;9032:9;9028:22;9018:32;;9088:7;9081:4;9077:2;9073:13;9069:27;9059:55;;9110:1;9107;9100:12;9059:55;9150:2;9137:16;9176:2;9168:6;9165:14;9162:34;;;9192:1;9189;9182:12;9162:34;9247:7;9240:4;9230:6;9227:1;9223:14;9219:2;9215:23;9211:34;9208:47;9205:67;;;9268:1;9265;9258:12;9205:67;9299:4;9291:13;;;;-1:-1:-1;9323:6:1;-1:-1:-1;9348:37:1;;9364:20;;;-1:-1:-1;9348:37:1;:::i;:::-;9338:47;;8702:689;;;;;:::o;9396:256::-;9462:6;9470;9523:2;9511:9;9502:7;9498:23;9494:32;9491:52;;;9539:1;9536;9529:12;9491:52;9562:28;9580:9;9562:28;:::i;:::-;9552:38;;9609:37;9642:2;9631:9;9627:18;9609:37;:::i;9657:388::-;9725:6;9733;9786:2;9774:9;9765:7;9761:23;9757:32;9754:52;;;9802:1;9799;9792:12;9754:52;9841:9;9828:23;9860:31;9885:5;9860:31;:::i;:::-;9910:5;-1:-1:-1;9967:2:1;9952:18;;9939:32;9980:33;9939:32;9980:33;:::i;:::-;10032:7;10022:17;;;9657:388;;;;;:::o;10050:842::-;10169:6;10177;10185;10193;10246:3;10234:9;10225:7;10221:23;10217:33;10214:53;;;10263:1;10260;10253:12;10214:53;10302:9;10289:23;10321:31;10346:5;10321:31;:::i;:::-;10371:5;-1:-1:-1;10428:2:1;10413:18;;10400:32;10441:33;10400:32;10441:33;:::i;:::-;10493:7;-1:-1:-1;10551:2:1;10536:18;;10523:32;10574:18;10604:14;;;10601:34;;;10631:1;10628;10621:12;10601:34;10654:60;10706:7;10697:6;10686:9;10682:22;10654:60;:::i;:::-;10644:70;;10767:2;10756:9;10752:18;10739:32;10723:48;;10796:2;10786:8;10783:16;10780:36;;;10812:1;10809;10802:12;10780:36;;10835:51;10878:7;10867:8;10856:9;10852:24;10835:51;:::i;11143:380::-;11222:1;11218:12;;;;11265;;;11286:61;;11340:4;11332:6;11328:17;11318:27;;11286:61;11393:2;11385:6;11382:14;11362:18;11359:38;11356:161;;;11439:10;11434:3;11430:20;11427:1;11420:31;11474:4;11471:1;11464:15;11502:4;11499:1;11492:15;11356:161;;11143:380;;;:::o;11889:127::-;11950:10;11945:3;11941:20;11938:1;11931:31;11981:4;11978:1;11971:15;12005:4;12002:1;11995:15;12021:224;12060:3;12088:6;12121:2;12118:1;12114:10;12151:2;12148:1;12144:10;12182:3;12178:2;12174:12;12169:3;12166:21;12163:47;;;12190:18;;:::i;:::-;12226:13;;12021:224;-1:-1:-1;;;;12021:224:1:o;12250:125::-;12290:4;12318:1;12315;12312:8;12309:34;;;12323:18;;:::i;:::-;-1:-1:-1;12360:9:1;;12250:125::o;12380:128::-;12420:3;12451:1;12447:6;12444:1;12441:13;12438:39;;;12457:18;;:::i;:::-;-1:-1:-1;12493:9:1;;12380:128::o;12513:197::-;12551:3;12579:6;12620:2;12613:5;12609:14;12647:2;12638:7;12635:15;12632:41;;;12653:18;;:::i;:::-;12702:1;12689:15;;12513:197;-1:-1:-1;;;12513:197:1:o;12715:127::-;12776:10;12771:3;12767:20;12764:1;12757:31;12807:4;12804:1;12797:15;12831:4;12828:1;12821:15;12847:643;13016:2;13068:21;;;13138:13;;13041:18;;;13160:22;;;12987:4;;13016:2;13239:15;;;;13213:2;13198:18;;;12987:4;13282:182;13296:6;13293:1;13290:13;13282:182;;;13361:13;;13376:6;13357:26;13345:39;;13439:15;;;;13404:12;;;;13318:1;13311:9;13282:182;;;-1:-1:-1;13481:3:1;;12847:643;-1:-1:-1;;;;;;12847:643:1:o;13495:135::-;13534:3;-1:-1:-1;;13555:17:1;;13552:43;;;13575:18;;:::i;:::-;-1:-1:-1;13622:1:1;13611:13;;13495:135::o;13635:637::-;13915:3;13953:6;13947:13;13969:53;14015:6;14010:3;14003:4;13995:6;13991:17;13969:53;:::i;:::-;14085:13;;14044:16;;;;14107:57;14085:13;14044:16;14141:4;14129:17;;14107:57;:::i;:::-;14229:7;14186:20;;14215:22;;;14264:1;14253:13;;13635:637;-1:-1:-1;;;;13635:637:1:o;14277:217::-;14316:4;14345:6;14401:10;;;;14371;;14423:12;;;14420:38;;;14438:18;;:::i;:::-;14475:13;;14277:217;-1:-1:-1;;;14277:217:1:o;14499:287::-;14605:6;14658:2;14646:9;14637:7;14633:23;14629:32;14626:52;;;14674:1;14671;14664:12;14626:52;14706:9;14700:16;14725:31;14750:5;14725:31;:::i;15198:512::-;15392:4;-1:-1:-1;;;;;15502:2:1;15494:6;15490:15;15479:9;15472:34;15554:2;15546:6;15542:15;15537:2;15526:9;15522:18;15515:43;;15594:6;15589:2;15578:9;15574:18;15567:34;15637:3;15632:2;15621:9;15617:18;15610:31;15658:46;15699:3;15688:9;15684:19;15676:6;15658:46;:::i;:::-;15650:54;15198:512;-1:-1:-1;;;;;;15198:512:1:o;15715:249::-;15784:6;15837:2;15825:9;15816:7;15812:23;15808:32;15805:52;;;15853:1;15850;15843:12;15805:52;15885:9;15879:16;15904:30;15928:5;15904:30;:::i
Swarm Source
ipfs://17ab764a21de809f024ab1775d3eaf75d27f9bb30b70a441cc312633746fa02b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.