Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16918881 | 681 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GlitchGeneralMintSpots
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./ERC721.sol"; import "../util/OwnableAndAdministrable.sol"; import "../libraries/UriEncode.sol"; contract GlitchGeneralMintSpots is ERC721, OwnableAndAdministrable { using Strings for uint256; using UriEncode for string; /** * @dev Revert if the royalty basis points is greater than 10_000. */ error InvalidRoyaltyBasisPoints(uint256 basisPoints); /** * @dev Revert if the royalty address is being set to the zero address. */ error RoyaltyAddressCannotBeZeroAddress(); /** * @dev Emit an event when the royalties info is updated. */ event RoyaltyInfoUpdated(address receiver, uint256 bps); /** * @notice A struct defining royalty info for the contract. */ struct RoyaltyInfo { address royaltyAddress; uint96 royaltyBps; } /// @notice Track the royalty info: address to receive royalties, and /// royalty basis points. RoyaltyInfo _royaltyInfo; uint256 private _tokenIdCounter = 1; mapping(uint256 => uint256) private _tokenSize; event MetadataUpdate(uint256 _tokenId); address public darkEnergyContract; constructor() ERC721("Glitchs Army: The Generals mint spot", "GMS") { _setOwner(tx.origin); _setRole(tx.origin, 0, true); _setRole(msg.sender, 0, true); _royaltyInfo.royaltyBps = 500; _royaltyInfo.royaltyAddress = tx.origin; darkEnergyContract = msg.sender; } /** * @notice Returns whether the interface is supported. * * @param interfaceId The interface id to check against. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721) returns (bool) { return interfaceId == 0x01ffc9a7 || // ER165 interfaceId == 0x80ac58cd || // ERC721 interfaceId == 0x5b5e139f || // ERC721-Metadata interfaceId == 0x2a55205a; // ERC2981 } /** * @notice Sets the address and basis points for royalties. * * @param newInfo The struct to configure royalties. */ function setRoyaltyInfo(RoyaltyInfo calldata newInfo) external { // Ensure the sender is only the owner or contract itself. _checkRoleOrOwner(msg.sender, 1); // Revert if the new royalty address is the zero address. if (newInfo.royaltyAddress == address(0)) { revert RoyaltyAddressCannotBeZeroAddress(); } // Revert if the new basis points is greater than 10_000. if (newInfo.royaltyBps > 10_000) { revert InvalidRoyaltyBasisPoints(newInfo.royaltyBps); } // Set the new royalty info. _royaltyInfo = newInfo; // Emit an event with the updated params. emit RoyaltyInfoUpdated(newInfo.royaltyAddress, newInfo.royaltyBps); } /** * @notice Returns the address that receives royalties. */ function royaltyAddress() external view returns (address) { return _royaltyInfo.royaltyAddress; } /** * @notice Returns the royalty basis points out of 10_000. */ function royaltyBasisPoints() external view returns (uint256) { return _royaltyInfo.royaltyBps; } /** * @notice Called with the sale price to determine how much royalty * is owed and to whom. * * @return receiver Address of who should be sent the royalty payment. * @return royaltyAmount The royalty payment amount for _salePrice. */ function royaltyInfo( uint256, uint256 _salePrice ) external view returns (address receiver, uint256 royaltyAmount) { royaltyAmount = (_salePrice * _royaltyInfo.royaltyBps) / 10_000; receiver = _royaltyInfo.royaltyAddress; } function adminMint(address to, uint256 tokenId, uint256 size) external { _checkRoleOrOwner(msg.sender, 0); if(tokenId == _tokenIdCounter) { _tokenIdCounter++; } _tokenSize[tokenId] = size; _safeMint(to, tokenId); } function adminBurn(uint256 tokenId) external { _checkRoleOrOwner(msg.sender, 0); _burn(tokenId); } function adminSetTokenSize(uint256 tokenId, uint256 size) external { _checkRoleOrOwner(msg.sender, 0); _requireMinted(tokenId); _tokenSize[tokenId] = size; emit MetadataUpdate(tokenId); } function nextId() external view returns(uint256) { return _tokenIdCounter; } function tokenURI(uint256 tokenId) public view override returns(string memory) { _requireMinted(tokenId); uint256 size = _tokenSize[tokenId]; uint256 center = 500; bytes6 color = bytes6(bytes("DDC159")); bytes6 background = bytes6(bytes("0B0B0B")); string memory svgData = string(abi.encodePacked( "<svg viewBox='0 0 1e3 1e3' xmlns='http://www.w3.org/2000/svg'><defs><radialGradient id='a' cx='500' cy='", center.toString(), "' r='", size.toString(), "' gradientUnits='userSpaceOnUse'><stop stop-color='#fff' stop-opacity='.6' offset='.17'/><stop stop-color='#fff' stop-opacity='0' offset='1'/></radialGradient></defs><circle cx='500' cy='", center.toString(), "' r='", size.toString(), "' fill='#", color, "'/><circle id='cg' cx='500' cy='", center.toString(), "' r='", size.toString(), "' fill='url(#a)' opacity='0'/><style>svg{background:#", background, "}#cg{-webkit-animation:1.5s ease-in-out infinite alternate p;animation:1.5s ease-in-out infinite alternate p}@-webkit-keyframes p{to{opacity:1}}@keyframes p{to{opacity:1}}</style></svg>" )); return string( abi.encodePacked( 'data:application/json,{"name":"Glitch\'s Army: The Generals mint spot #', tokenId.toString(), '","image_data":"', svgData, '"}' ) ).uriEncode(); } function contractURI() external pure returns(string memory) { return string(abi.encodePacked( 'data:application/json,{"name": "Glitch\'s Army: The Generals mint spot"}' )).uriEncode(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "../libraries/Strings.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string internal _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; library DarkEnergyPackedStruct { // ============================================================= // Structs // ============================================================= /// @dev All 256 bits from a PlayerData (from right to left) struct PlayerData { bool isHolder; int40 energyAmount; uint16 gamePasses; uint16 mintCount; uint16 mergeCount; uint16 noRiskPlayCount; uint16 noRiskWinCount; uint16 highStakesPlayCount; uint16 highStakesWinCount; uint16 highStakesLossCount; uint32 totalEarned; uint32 totalRugged; uint16 unused; bool flagA; bool flagB; bool flagC; bool flagD; bool flagE; bool flagF; bool flagG; } /// @dev All 256 bits from a GameRules (from right to left) struct GameRules { bool isActive; uint16 oddsNoRiskEarn100; uint16 oddsNoRiskEarn300; uint16 oddsNoRiskEarn500; uint16 oddsHighStakesWinOrdinal; uint16 oddsHighStakesLose100; uint16 oddsHighStakesLose300; uint16 oddsHighStakesLose500; uint16 oddsHighStakesLose1000; uint16 oddsHighStakesEarn100; uint16 oddsHighStakesEarn300; uint16 oddsHighStakesEarn500; uint16 oddsHighStakesEarn1000; uint16 oddsHighStakesDoubles; uint16 oddsHighStakesHalves; uint16 oddsGamePassOnMint; uint8 remainingOrdinals; bool flagA; bool flagB; bool flagC; bool flagD; bool flagE; bool flagF; bool flagG; } // ============================================================= // Unpacking by type and offset // ============================================================= /** * @dev unpack bit [offset] (bool) */ function getBool(bytes32 p, uint8 offset) internal pure returns (bool r) { assembly { r := and(shr(offset, p), 1) } } /** * @dev unpack bits [offset..offset + 8] */ function getUint8(bytes32 p, uint8 offset) internal pure returns (uint8 r) { assembly { r := and(shr(offset, p), 0xFF) } } /** * @dev unpack bits [offset..offset + 16] */ function getUint16( bytes32 p, uint8 offset ) internal pure returns (uint16 r) { assembly { r := and(shr(offset, p), 0xFFFF) } } /** * @dev unpack bits [offset..offset + 32] */ function getUint32( bytes32 p, uint8 offset ) internal pure returns (uint32 r) { assembly { r := and(shr(offset, p), 0xFFFFFFFF) } } /** * @dev unpack bits[offset..offset + 40] */ function getInt40(bytes32 p, uint8 offset) internal pure returns (int40 r) { assembly { r := and(shr(offset, p), 0xFFFFFFFFFF) } } // ============================================================= // Unpacking whole structs // ============================================================= function playerData(bytes32 p) internal pure returns (PlayerData memory r) { return PlayerData({ isHolder: getBool(p, 0), energyAmount: getInt40(p, 1), gamePasses: getUint16(p, 41), mintCount: getUint16(p, 57), mergeCount: getUint16(p, 73), noRiskPlayCount: getUint16(p, 89), noRiskWinCount: getUint16(p, 105), highStakesPlayCount: getUint16(p, 121), highStakesWinCount: getUint16(p, 137), highStakesLossCount: getUint16(p, 153), totalEarned: getUint32(p, 169), totalRugged: getUint32(p, 201), unused: getUint16(p, 169), flagA: getBool(p, 249), flagB: getBool(p, 250), flagC: getBool(p, 251), flagD: getBool(p, 252), flagE: getBool(p, 253), flagF: getBool(p, 254), flagG: getBool(p, 255) }); } function gameRules(bytes32 p) internal pure returns (GameRules memory r) { return GameRules({ isActive: getBool(p, 0), oddsNoRiskEarn100: getUint16(p, 1), oddsNoRiskEarn300: getUint16(p, 17), oddsNoRiskEarn500: getUint16(p, 33), oddsHighStakesWinOrdinal: getUint16(p, 49), oddsHighStakesLose100: getUint16(p, 65), oddsHighStakesLose300: getUint16(p, 81), oddsHighStakesLose500: getUint16(p, 97), oddsHighStakesLose1000: getUint16(p, 113), oddsHighStakesEarn100: getUint16(p, 129), oddsHighStakesEarn300: getUint16(p, 145), oddsHighStakesEarn500: getUint16(p, 161), oddsHighStakesEarn1000: getUint16(p, 177), oddsHighStakesDoubles: getUint16(p, 193), oddsHighStakesHalves: getUint16(p, 209), oddsGamePassOnMint: getUint16(p, 225), remainingOrdinals: getUint8(p, 241), flagA: getBool(p, 249), flagB: getBool(p, 250), flagC: getBool(p, 251), flagD: getBool(p, 252), flagE: getBool(p, 253), flagF: getBool(p, 254), flagG: getBool(p, 255) }); } // ============================================================= // Setting Bits // ============================================================= /** * @dev set bit [{offset}] to {value} */ function setBit( bytes32 p, uint8 offset, bool value ) internal pure returns (bytes32 np) { assembly { np := or( and( p, xor( 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, shl(offset, 1) ) ), shl(offset, value) ) } } /** * @dev set 8 bits to {value} at [{offset}] */ function setUint8( bytes32 p, uint8 offset, uint8 value ) internal pure returns (bytes32 np) { assembly { np := or( and( p, xor( 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, shl(offset, 0xFF) ) ), shl(offset, and(value, 0xFF)) ) } } /** * @dev set 16 bits to {value} at [{offset}] */ function setUint16( bytes32 p, uint8 offset, uint16 value ) internal pure returns (bytes32 np) { assembly { np := or( and( p, xor( 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, shl(offset, 0xFFFF) ) ), shl(offset, and(value, 0xFFFF)) ) } } /** * @dev set 32 bits to {value} at [{offset}] */ function setUint32( bytes32 p, uint8 offset, uint32 value ) internal pure returns (bytes32 np) { assembly { np := or( and( p, xor( 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, shl(offset, 0xFFFFFFFF) ) ), shl(offset, and(value, 0xFFFFFFFF)) ) } } /** * @dev set 40 bits to {value} at [{offset}] */ function setInt40( bytes32 p, uint8 offset, int40 value ) internal pure returns (bytes32 np) { assembly { np := or( and( p, xor( 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, shl(offset, 0xFFFFFFFFFF) ) ), shl(offset, and(value, 0xFFFFFFFFFF)) ) } } // ============================================================= // DarkEnergy-specific // ============================================================= /** * @dev get _playerData.isHolder */ function isHolder(bytes32 p) internal pure returns (bool) { return getBool(p, 0); } /** * @dev get _playerData.energyAmount */ function getEnergy(bytes32 p) internal pure returns (int40) { return getInt40(p, 1); } /** * @dev get _playerData.gamePasses */ function getGamePasses(bytes32 p) internal pure returns (uint16) { return getUint16(p, 41); } /** * @dev get _playerData.mintCount */ function getMintCount(bytes32 p) internal pure returns (uint16) { return getUint16(p, 57); } /** * @dev get _playerData.mergeCount */ function getMergeCount(bytes32 p) internal pure returns (uint16) { return getUint16(p, 73); } /** * @dev get _playerData.noRiskPlayCount */ function getNoRiskPlayCount(bytes32 p) internal pure returns (uint16) { return getUint16(p, 89); } /** * @dev get _playerData.noRiskWinCount */ function getNoRiskWinCount(bytes32 p) internal pure returns (uint16) { return getUint16(p, 105); } /** * @dev get _playerData.highStakesPlayCount */ function getHighStakesPlayCount(bytes32 p) internal pure returns (uint16) { return getUint16(p, 121); } /** * @dev get _playerData.highStakesWinCount */ function getHighStakesWinCount(bytes32 p) internal pure returns (uint16) { return getUint16(p, 137); } /** * @dev get _playerData.highStakesLossCount */ function getHighStakesLossCount(bytes32 p) internal pure returns (uint16) { return getUint16(p, 153); } /** * @dev get _playerData.totalEarned */ function getTotalEarned(bytes32 p) internal pure returns (uint32) { return getUint32(p, 169); } /** * @dev get _playerData.totalRugged */ function getTotalRugged(bytes32 p) internal pure returns (uint32) { return getUint32(p, 201); } /** * @dev sets _playerData.isHolder */ function setHolder(bytes32 p, bool status) internal pure returns (bytes32 np) { return setBit(p, 0, status); } /** * @dev sets _playerData.energyAmount */ function setEnergy(bytes32 p, int40 value) internal pure returns (bytes32 np) { return setInt40(p, 1, value); } /** * @dev sets _playerData.gamePasses */ function setGamePasses(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 41, value); } /** * @dev sets _playerData.mintCount */ function setMintCount(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 57, value); } /** * @dev sets _playerData.mergeCount */ function setMergeCount(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 73, value); } /** * @dev sets _playerData.noRiskPlayCount */ function setNoRiskPlayCount(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 89, value); } /** * @dev sets _playerData.noRiskWinCount */ function setNoRiskWinCount(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 105, value); } /** * @dev sets _playerData.highStakesPlayCount */ function setHighStakesPlayCount(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 121, value); } /** * @dev sets _playerData.highStakesWinCount */ function setHighStakesWinCount(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 137, value); } /** * @dev sets _playerData.highStakesLossCount */ function setHighStakesLossCount(bytes32 p, uint16 value) internal pure returns (bytes32 np) { return setUint16(p, 153, value); } /** * @dev sets _playerData.totalEarned */ function setTotalEarned(bytes32 p, uint32 value) internal pure returns (bytes32 np) { return setUint32(p, 169, value); } /** * @dev sets _playerData.totalRugged */ function setTotalRugged(bytes32 p, uint32 value) internal pure returns (bytes32 np) { return setUint32(p, 201, value); } /** * @dev Clears the last 57 bits (isHolder, energyAmount, gamePasses) */ function clearHoldingData(bytes32 p) internal pure returns (bytes32 np) { assembly { np := and( p, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000 ) } } /** * @dev Replace the last 57 bits (isHolder, energyAmount, gamePasses) from * another packed bytes variable (to be used for transfers) */ function setHoldingData( bytes32 p, bytes32 q ) internal pure returns (bytes32 np) { assembly { np := or( and( p, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000 ), and(q, 0x1FFFFFFFFFFFFFF) ) } } /** * @dev tight-pack a GameRules struct into a uint256 */ function packGameRules( GameRules calldata ) internal pure returns (bytes32 result) { assembly { result := calldataload(4) result := or(result, shl(1, calldataload(36))) result := or(result, shl(17, calldataload(68))) result := or(result, shl(33, calldataload(100))) result := or(result, shl(49, calldataload(132))) result := or(result, shl(65, calldataload(164))) result := or(result, shl(81, calldataload(196))) result := or(result, shl(97, calldataload(228))) result := or(result, shl(113, calldataload(260))) result := or(result, shl(129, calldataload(292))) result := or(result, shl(145, calldataload(324))) result := or(result, shl(161, calldataload(356))) result := or(result, shl(177, calldataload(388))) result := or(result, shl(193, calldataload(420))) result := or(result, shl(209, calldataload(452))) result := or(result, shl(225, calldataload(484))) result := or(result, shl(241, calldataload(516))) result := or(result, shl(249, calldataload(548))) result := or(result, shl(250, calldataload(580))) result := or(result, shl(251, calldataload(612))) result := or(result, shl(252, calldataload(644))) result := or(result, shl(253, calldataload(676))) result := or(result, shl(254, calldataload(708))) result := or(result, shl(255, calldataload(740))) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) // Added support for int256 pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { if (value >= 0) { return toString(uint256(value)); } return string( abi.encodePacked( "-", toString(uint256(-value)) ) ); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; library UriEncode { string internal constant _TABLE = "0123456789abcdef"; function uriEncode( string memory uri ) internal pure returns (string memory) { bytes memory bytesUri = bytes(uri); string memory table = _TABLE; // Max size is worse case all chars need to be encoded bytes memory result = new bytes(3 * bytesUri.length); /// @solidity memory-safe-assembly assembly { // Get the lookup table let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Keep track of the final result size string length let resultSize := 0 for { let dataPtr := bytesUri let endPtr := add(bytesUri, mload(bytesUri)) } lt(dataPtr, endPtr) { } { // advance 1 byte dataPtr := add(dataPtr, 1) // bytemask out a char let char := and(mload(dataPtr), 255) // Check if is valid URI character let isInvalidUriChar := or( or( lt(char, 33), // lower than "!" gt(char, 122) // higher than "z" ), or( or( eq(char, 37), // "%" or( eq(char, 60), // "<" eq(char, 62) // ">" ) ), or( and(gt(char, 90), lt(char, 95)), // "[\]^" eq(char, 96) // "`" ) ) ) if eq(char, 35) { isInvalidUriChar := 1 } switch isInvalidUriChar // If is valid uri character copy character over and increment the result case 0 { mstore8(resultPtr, char) resultPtr := add(resultPtr, 1) resultSize := add(resultSize, 1) } // If the char is not a valid uri character, uriencode the character case 1 { mstore8(resultPtr, 37) resultPtr := add(resultPtr, 1) // table[character >> 4] (take the last 4 bits) mstore8(resultPtr, mload(add(tablePtr, shr(4, char)))) resultPtr := add(resultPtr, 1) // table & 15 (take the first 4 bits) mstore8(resultPtr, mload(add(tablePtr, and(char, 15)))) resultPtr := add(resultPtr, 1) resultSize := add(resultSize, 3) } } // Set size of result string in memory mstore(result, resultSize) } return string(result); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.19; import "../libraries/DarkEnergyPackedStruct.sol"; contract OwnableAndAdministrable { using DarkEnergyPackedStruct for bytes32; error MissingRole(address user, uint256 role); error NotOwner(address user); event OwnershipTransferred(address indexed user, address indexed newOwner); event RoleUpdated(address indexed user, uint256 indexed role, bool indexed status); /** * @dev There is a maximum of 256 roles: each bit says if the role is on or off */ mapping(address => bytes32) private _addressRoles; /** * @dev There is one owner */ address internal _owner; function _isOwner(address sender) internal view returns(bool) { return (sender == _owner || sender == address(this)); } function _hasRole(address sender, uint8 role) internal view returns(bool) { bytes32 roles = _addressRoles[sender]; return roles.getBool(role); } function _checkOwner(address sender) internal virtual view { if (!_isOwner(sender)) { revert NotOwner(sender); } } function _checkRoleOrOwner(address sender, uint8 role) internal virtual view { if (_isOwner(sender)) return; _checkRole(sender, role); } function _checkRole(address sender, uint8 role) internal virtual view { if (sender == address(this)) return; bytes32 roles = _addressRoles[sender]; bool allowed = roles.getBool(role); if (!allowed) { revert MissingRole(sender, role); } } function _setOwner(address newOwner) internal virtual { _owner = newOwner; emit OwnershipTransferred(_owner, newOwner); } function _setRole(address user, uint8 role, bool status) internal virtual { _addressRoles[user] = _addressRoles[user].setBit(role, status); emit RoleUpdated(user, role, status); } function setRole(address user, uint8 role, bool status) external virtual { _checkOwner(msg.sender); _setRole(user, role, status); } function transferOwnership(address newOwner) external virtual { _checkOwner(msg.sender); _setOwner(newOwner); } function owner() external virtual view returns(address) { return _owner; } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"InvalidRoyaltyBasisPoints","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"MissingRole","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"NotOwner","type":"error"},{"inputs":[],"name":"RoyaltyAddressCannotBeZeroAddress","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":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"role","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"RoleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"RoyaltyInfoUpdated","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"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"adminBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"adminSetTokenSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"darkEnergyContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"address","name":"user","type":"address"},{"internalType":"uint8","name":"role","type":"uint8"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"royaltyAddress","type":"address"},{"internalType":"uint96","name":"royaltyBps","type":"uint96"}],"internalType":"struct GlitchGeneralMintSpots.RoyaltyInfo","name":"newInfo","type":"tuple"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","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":[{"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"}]
Contract Creation Code
608034620003b1576001600160401b03906060810190828211818310176200039b5760409182526024908181526020937f476c69746368732041726d793a205468652047656e6572616c73206d696e742085830152631cdc1bdd60e21b8483015283519484860186811083821117620003865785526003865262474d5360e81b8187015282519082821162000386576000948554926001958685811c951680156200037b575b8486101462000368578190601f9586811162000315575b508490868311600114620002b1578992620002a5575b5050600019600383901b1c191690861b1786555b875193841162000293578454908582811c9216801562000288575b838310146200027657508281116200022e575b5080918311600114620001c7575083949582939492620001bb575b5050600019600383901b1c191690821b1781555b60095560078054326001600160a01b031991821681179092559181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36200018e32620003b6565b6200019933620003b6565b32607d60a21b176008553390600b541617600b5551611e929081620004038239f35b0151905038806200012f565b90601f198316968486528286209286905b89821062000216575050838596979810620001fc575b505050811b01815562000143565b015160001960f88460031b161c19169055388080620001ee565b808785968294968601518155019501930190620001d8565b8486528186208380860160051c8201928487106200026c575b0160051c019085905b8281106200026057505062000114565b87815501859062000250565b9250819262000247565b634e487b7160e01b8752602260045286fd5b91607f169162000101565b634e487b7160e01b8652604160045285fd5b015190503880620000d2565b898052858a208994509190601f1984168b5b88828210620002fe5750508411620002e4575b505050811b018655620000e6565b015160001960f88460031b161c19169055388080620002d6565b8385015186558c97909501949384019301620002c3565b9091508880528489208680850160051c8201928786106200035e575b918a91869594930160051c01915b8281106200034f575050620000bc565b8b81558594508a91016200033f565b9250819262000331565b634e487b7160e01b885260226004528288fd5b94607f1694620000a5565b84634e487b7160e01b60005260416004526000fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b6001600160a01b031660008181526006602052604081208054600119166001908117909155917f3e4657b0da61ffd251af36cb52bd766075e299a246b4cb5f3a200bdbdea2c0938280a456fe6040608081526004908136101561001557600080fd5b600091823560e01c9081624a84cb1461120357816301ffc9a71461117d57816306fdde03146110d0578163081812fc146110b0578163095ea7b314610f4257816323b872dd14610f1d5781632a55205a14610ec057816342260b5d14610e9e57816342842e0e14610e6a57816344dae42c14610d8357816361b8ce8c14610d645781636352211e14610d3357816368c0bfef14610ccf57816370a0823114610c395781638da5cb5b14610c1057816395d89b4114610b18578163a22cb46514610a50578163ad2f852a14610a27578163b88d4fde1461097357838263badb97ff146108df57508163c87b56dd14610387578163d5102a1c1461035e578163e8a3d4851461029957508063e985e9c51461024c578063f2fde38b146101df5763f6bb6b371461014257600080fd5b346101db5760603660031901126101db5761015b611342565b906024359060ff8216918281036101d75760443590811515948583036101d35761018433611e09565b6001600160a01b03168087526006602052928620805492821b600190921b600019189092161790557f3e4657b0da61ffd251af36cb52bd766075e299a246b4cb5f3a200bdbdea2c0938480a480f35b8680fd5b8480fd5b5080fd5b8234610249576020366003190112610249576101f9611342565b61020233611e09565b600780546001600160a01b0319166001600160a01b03929092169182179055807f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b80fd5b50346101db57806003193601126101db5760ff8160209361026b611342565b61027361135d565b6001600160a01b0391821683526005875283832091168252855220549151911615158152f35b82843461024957806003193601126102495781517f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a202260208201527f476c6974636827732041726d793a205468652047656e6572616c73206d696e7481840152662073706f74227d60c81b6060820152604781529060808201906001600160401b0382118383101761034b576103478461033485858352611be0565b9051918291602083526020830190611396565b0390f35b634e487b7160e01b815260418552602490fd5b5050346101db57816003193601126101db57600b5490516001600160a01b039091168152602090f35b9050823461024957602091826003193601126101db5783809135926103ab846117c1565b6103b490611490565b838152600a855220549181516103c981611437565b600681526544444331353960d01b858201526103e4906119fc565b82516103ef81611437565b600681526518211821182160d11b8682015261040a906119fc565b610412611a31565b9161041c86611a7e565b91610425611a31565b9661042f81611a7e565b9389610439611a31565b9261044390611a7e565b9589519a8b98838a019b7f3c7376672076696577426f783d2730203020316533203165332720786d6c6e738d528a017f3d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e3c64905260608a017f6566733e3c72616469616c4772616469656e742069643d2761272063783d2735905260808a01673030272063793d2760c01b9052805190818560888d019201916104e392611373565b8901642720723d2760d81b9481866088819401528151918287608d840192019161050c92611373565b01608d81017f27206772616469656e74556e6974733d277573657253706163654f6e55736527905260ad81017f3e3c73746f702073746f702d636f6c6f723d2723666666272073746f702d6f70905260cd81017f61636974793d272e3627206f66667365743d272e3137272f3e3c73746f702073905260ed81017f746f702d636f6c6f723d2723666666272073746f702d6f7061636974793d2730905261010d81017f27206f66667365743d2731272f3e3c2f72616469616c4772616469656e743e3c905261012d81017a2f646566733e3c636972636c652063783d27353030272063793d2760281b905282519061014893828786840192019161060f92611373565b01918201528151918261014d9485840192019161062b92611373565b68272066696c6c3d272360b81b9101918201526001600160d01b03199485166101568201527f272f3e3c636972636c652069643d276367272063783d27353030272063793d2761015c820152825161017c93909190610691908390868401908f01611373565b019182015283519061018194828b8784019201916106ae92611373565b7f272066696c6c3d2775726c2823612927206f7061636974793d2730272f3e3c739101938401527474796c653e7376677b6261636b67726f756e643a2360581b6101a1840152166101b68201527f7d2363677b2d7765626b69742d616e696d6174696f6e3a312e357320656173656101bc8201527f2d696e2d6f757420696e66696e69746520616c7465726e61746520703b616e696101dc8201527f6d6174696f6e3a312e357320656173652d696e2d6f757420696e66696e6974656101fc8201527f20616c7465726e61746520707d402d7765626b69742d6b65796672616d65732061021c8201527f707b746f7b6f7061636974793a317d7d406b65796672616d657320707b746f7b61023c8201527837b830b1b4ba3c9d18bebe9e17b9ba3cb6329f1e17b9bb339f60391b61025c82015203610255810184526107f7906102750184611452565b61080090611a7e565b9084519283928584017f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a224790528684017f6c6974636827732041726d793a205468652047656e6572616c73206d696e74209052606084016573706f74202360d01b905280519081876066870192019161087792611373565b8301906f11161134b6b0b3b2afb230ba30911d1160811b6066830152519182607683016108a392611373565b0161227d60f01b6076820152036058810182526078016108c39082611452565b6108cc90611be0565b9151918183928352820161034791611396565b915091346101db5760203660031901126101db578235926108ff33611d20565b610908846114d7565b50610912846114d7565b848452602091825282842080546001600160a01b03199081169091556001600160a01b0390911680855260038352838520805460001901905585855260029092529183208054909216909155600080516020611e3d8339815191528280a480f35b91905034610a23576080366003190112610a235761098f611342565b9061099861135d565b6064359360443591906001600160401b0386116101d357366023870112156101d357850135936109d36109ca86611475565b94519485611452565b84845286366024878901011161024957602086610a1b976024610a209a018389013786010152610a0b610a0684336115fd565b611524565b610a168383836116c5565b6118fa565b6115d9565b80f35b8280fd5b5050346101db57816003193601126101db5760085490516001600160a01b039091168152602090f35b91905034610a235780600319360112610a2357610a6b611342565b90602435918215158093036101d7576001600160a01b031692338414610ada5750338452600560205280842083855260205280842060ff1981541660ff8416179055519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b6020606492519162461bcd60e51b8352820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152fd5b8284346102495780600319360112610249578151918160019283549384811c91818616958615610c06575b6020968785108114610bf3578899509688969785829a529182600014610bcc575050600114610b8f575b5050506103479291610b80910385611452565b51928284938452830190611396565b91908693508083528383205b828410610bb45750505082010181610b80610347610b6d565b8054848a018601528895508794909301928101610b9b565b60ff19168782015293151560051b86019093019350849250610b8091506103479050610b6d565b634e487b7160e01b835260228a52602483fd5b92607f1692610b43565b5050346101db57816003193601126101db5760075490516001600160a01b039091168152602090f35b839150346101db5760203660031901126101db576001600160a01b03610c5d611342565b16908115610c7a5760208480858581526003845220549051908152f35b608490602085519162461bcd60e51b8352820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152fd5b5050346101db5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791610d03366113f0565b610d0f92919233611d20565b610d20610d1b846117c1565b611490565b828652600a84528186205551908152a180f35b8284346102495760203660031901126102495750610d53602092356114d7565b90516001600160a01b039091168152f35b5050346101db57816003193601126101db576020906009549051908152f35b905034610a235781600319360112610a2357610d9e33611d3b565b6001600160a01b039081610db0611985565b1615610e5c576001600160601b039061271082610dcb61199b565b1611610e3b5750907ff21fccf4d64d86d532c4e4eb86c007b6ad57a460c27d724188625e755ec6cf6d929181610dff611985565b166001600160a01b0319610e1161199b565b60a01b1617600855610e21611985565b91610e2a61199b565b90845193168352166020820152a180f35b8390602492610e4861199b565b9251633cadbafb60e01b8152921690820152fd5b8251631cc0baef60e01b8152fd5b5050346101db57610a1b610a2091610e81366113bb565b91925192610e8e84611406565b868452610a0b610a0684336115fd565b5050346101db57816003193601126101db5760209060085460a01c9051908152f35b9050823461024957610ed1366113f0565b919050600854928360a01c92838102938185041490151715610f0a57505082516001600160a01b03909216825261271090046020820152f35b634e487b7160e01b825260119052602490fd5b833461024957610a20610f2f366113bb565b91610f3d610a0684336115fd565b6116c5565b905034610a235781600319360112610a2357610f5c611342565b6024359290916001600160a01b0391908280610f77876114d7565b1694169380851461106357803314908115611044575b5015610fdc57848652602052842080546001600160a01b03191683179055610fb4836114d7565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b6020608492519162461bcd60e51b8352820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b90508652600560205281862033875260205260ff828720541638610f8d565b506020608492519162461bcd60e51b8352820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b8284346102495760203660031901126102495750610d53602092356114fd565b82843461024957806003193601126102495781519181825492600184811c91818616958615611173575b6020968785108114610bf3578899509688969785829a529182600014610bcc575050600114611136575050506103479291610b80910385611452565b91908693508280528383205b82841061115b5750505082010181610b80610347610b6d565b8054848a018601528895508794909301928101611142565b92607f16926110fa565b905034610a23576020366003190112610a2357359063ffffffff60e01b8216809203610a2357602092506301ffc9a760e01b82149182156111f2575b82156111e1575b82156111d0575b50519015158152f35b63152a902d60e11b149150386111c7565b635b5e139f60e01b811492506111c0565b6380ac58cd60e01b811492506111b9565b839150346101db5760603660031901126101db5761121f611342565b6024359061122c33611d20565b60095480831461131a575b50818452600a6020526044358585205584519261125384611406565b8484526001600160a01b0382169081156112d7575091610a20939181610a1b9488611286611280846117c1565b156119b1565b611292611280846117c1565b81895260036020908152818a2080546001019055838a5260029052882080546001600160a01b0319168217905587600080516020611e3d8339815191528180a46117de565b606490602088519162461bcd60e51b8352820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b600019811461132f5760010160095585611237565b634e487b7160e01b855260118452602485fd5b600435906001600160a01b038216820361135857565b600080fd5b602435906001600160a01b038216820361135857565b60005b8381106113865750506000910152565b8181015183820152602001611376565b906020916113af81518092818552858086019101611373565b601f01601f1916010190565b6060906003190112611358576001600160a01b0390600435828116810361135857916024359081168103611358579060443590565b6040906003190112611358576004359060243590565b602081019081106001600160401b0382111761142157604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761142157604052565b601f909101601f19168101906001600160401b0382119082101761142157604052565b6001600160401b03811161142157601f01601f191660200190565b1561149757565b60405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606490fd5b6000908152600260205260409020546001600160a01b03166114fa811515611490565b90565b611509610d1b826117c1565b6000908152600460205260409020546001600160a01b031690565b1561152b57565b60405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b156115e057565b60405162461bcd60e51b8152806115f960048201611586565b0390fd5b906001600160a01b038080611611846114d7565b16931691838314938415611644575b50831561162e575b50505090565b61163a919293506114fd565b1614388080611628565b909350600052600560205260406000208260005260205260ff604060002054169238611620565b1561167257565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b906116ed916116d3846114d7565b6001600160a01b039391841692849290918316841461166b565b16918215611770578161170a91611703866114d7565b161461166b565b600080516020611e3d833981519152600084815260046020526040812060018060a01b03199081815416905583825260036020526040822060001981540190558482526040822060018154019055858252600260205284604083209182541617905580a4565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6000908152600260205260409020546001600160a01b0316151590565b9192600092909190803b156118f05761182c946040518092630a85bd0160e11b9485835233600484015287602484015260448301526080606483015281878160209a8b966084830190611396565b03926001600160a01b03165af18491816118b0575b5061189f575050503d600014611897573d61185b81611475565b906118696040519283611452565b81528091833d92013e5b805191826118945760405162461bcd60e51b8152806115f960048201611586565b01fd5b506060611873565b6001600160e01b0319161492509050565b9091508581813d83116118e9575b6118c88183611452565b810103126101d757516001600160e01b0319811681036101d7579038611841565b503d6118be565b5050915050600190565b9293600093909291803b1561197a579484916119549660405180948193630a85bd0160e11b9788845233600485015260018060a01b0380921660248501526044840152608060648401528260209b8c976084830190611396565b0393165af18491816118b0575061189f575050503d600014611897573d61185b81611475565b505050915050600190565b6004356001600160a01b03811681036113585790565b6024356001600160601b03811681036113585790565b156119b857565b60405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606490fd5b80516020909101516001600160d01b0319808216939290919060068110611a2257505050565b60060360031b82901b16169150565b6040516101f4611a4082611437565b6003825260203681840137602382015b6000190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049081611a5057505090565b6000908072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b80821015611bd2575b506904ee2d6d415b85acef8160201b80831015611bc3575b50662386f26fc1000080831015611bb4575b506305f5e10080831015611ba5575b5061271080831015611b96575b506064821015611b86575b600a80921015611b7c575b60019081602181860195611b1187611475565b96611b1f6040519889611452565b808852611b2e601f1991611475565b01366020890137860101905b611b46575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215611b7757919082611b3a565b611b3f565b9160010191611afe565b9190606460029104910191611af3565b60049193920491019138611ae8565b60089193920491019138611adb565b60109193920491019138611acc565b60209193920491019138611aba565b604093508104915038611aa2565b60405190611bed82611437565b601082526f181899199a1a9b1b9c1cb0b131b232b360811b60208301528051916003908382029382850403611d0a57611c3e611c2885611475565b94611c366040519687611452565b808652611475565b6020850190601f1901368237600093808051015b808210611c63575050505050815290565b600180920191825160ff811660259060608114605f8210605a83111617603e8214603c8314178383141717607a821160218310171760238214611d03575b908115611cec5750600114611cb9575b505050611c52565b9185918894999693859453600f9082828260041c168a010151838501531687010151600282015301920194388080611cb1565b915050858394999692505301920194388080611cb1565b5083611ca1565b634e487b7160e01b600052601160045260246000fd5b611d2981611d51565b611d3857611d3690611d75565b565b50565b611d4481611d51565b611d3857611d3690611dbe565b6007546001600160a01b0391821691168114908115611d6e575090565b9050301490565b6001600160a01b0316308114611d385780600052600660205260016040600020541615611d9f5750565b6044906040519063607b74c960e11b8252600482015260006024820152fd5b6001600160a01b0316308114611d38578060005260066020526001604060002054811c1615611dea5750565b6044906040519063607b74c960e11b8252600482015260016024820152fd5b611e1281611d51565b15611e1a5750565b60405163245aecd360e01b81526001600160a01b039091166004820152602490fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122097a404baae027c0643c52fd3bd44897a9f5ec8e779e3b0744d7bb3045f40d63864736f6c63430008130033
Deployed Bytecode
0x6040608081526004908136101561001557600080fd5b600091823560e01c9081624a84cb1461120357816301ffc9a71461117d57816306fdde03146110d0578163081812fc146110b0578163095ea7b314610f4257816323b872dd14610f1d5781632a55205a14610ec057816342260b5d14610e9e57816342842e0e14610e6a57816344dae42c14610d8357816361b8ce8c14610d645781636352211e14610d3357816368c0bfef14610ccf57816370a0823114610c395781638da5cb5b14610c1057816395d89b4114610b18578163a22cb46514610a50578163ad2f852a14610a27578163b88d4fde1461097357838263badb97ff146108df57508163c87b56dd14610387578163d5102a1c1461035e578163e8a3d4851461029957508063e985e9c51461024c578063f2fde38b146101df5763f6bb6b371461014257600080fd5b346101db5760603660031901126101db5761015b611342565b906024359060ff8216918281036101d75760443590811515948583036101d35761018433611e09565b6001600160a01b03168087526006602052928620805492821b600190921b600019189092161790557f3e4657b0da61ffd251af36cb52bd766075e299a246b4cb5f3a200bdbdea2c0938480a480f35b8680fd5b8480fd5b5080fd5b8234610249576020366003190112610249576101f9611342565b61020233611e09565b600780546001600160a01b0319166001600160a01b03929092169182179055807f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b80fd5b50346101db57806003193601126101db5760ff8160209361026b611342565b61027361135d565b6001600160a01b0391821683526005875283832091168252855220549151911615158152f35b82843461024957806003193601126102495781517f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a202260208201527f476c6974636827732041726d793a205468652047656e6572616c73206d696e7481840152662073706f74227d60c81b6060820152604781529060808201906001600160401b0382118383101761034b576103478461033485858352611be0565b9051918291602083526020830190611396565b0390f35b634e487b7160e01b815260418552602490fd5b5050346101db57816003193601126101db57600b5490516001600160a01b039091168152602090f35b9050823461024957602091826003193601126101db5783809135926103ab846117c1565b6103b490611490565b838152600a855220549181516103c981611437565b600681526544444331353960d01b858201526103e4906119fc565b82516103ef81611437565b600681526518211821182160d11b8682015261040a906119fc565b610412611a31565b9161041c86611a7e565b91610425611a31565b9661042f81611a7e565b9389610439611a31565b9261044390611a7e565b9589519a8b98838a019b7f3c7376672076696577426f783d2730203020316533203165332720786d6c6e738d528a017f3d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e3c64905260608a017f6566733e3c72616469616c4772616469656e742069643d2761272063783d2735905260808a01673030272063793d2760c01b9052805190818560888d019201916104e392611373565b8901642720723d2760d81b9481866088819401528151918287608d840192019161050c92611373565b01608d81017f27206772616469656e74556e6974733d277573657253706163654f6e55736527905260ad81017f3e3c73746f702073746f702d636f6c6f723d2723666666272073746f702d6f70905260cd81017f61636974793d272e3627206f66667365743d272e3137272f3e3c73746f702073905260ed81017f746f702d636f6c6f723d2723666666272073746f702d6f7061636974793d2730905261010d81017f27206f66667365743d2731272f3e3c2f72616469616c4772616469656e743e3c905261012d81017a2f646566733e3c636972636c652063783d27353030272063793d2760281b905282519061014893828786840192019161060f92611373565b01918201528151918261014d9485840192019161062b92611373565b68272066696c6c3d272360b81b9101918201526001600160d01b03199485166101568201527f272f3e3c636972636c652069643d276367272063783d27353030272063793d2761015c820152825161017c93909190610691908390868401908f01611373565b019182015283519061018194828b8784019201916106ae92611373565b7f272066696c6c3d2775726c2823612927206f7061636974793d2730272f3e3c739101938401527474796c653e7376677b6261636b67726f756e643a2360581b6101a1840152166101b68201527f7d2363677b2d7765626b69742d616e696d6174696f6e3a312e357320656173656101bc8201527f2d696e2d6f757420696e66696e69746520616c7465726e61746520703b616e696101dc8201527f6d6174696f6e3a312e357320656173652d696e2d6f757420696e66696e6974656101fc8201527f20616c7465726e61746520707d402d7765626b69742d6b65796672616d65732061021c8201527f707b746f7b6f7061636974793a317d7d406b65796672616d657320707b746f7b61023c8201527837b830b1b4ba3c9d18bebe9e17b9ba3cb6329f1e17b9bb339f60391b61025c82015203610255810184526107f7906102750184611452565b61080090611a7e565b9084519283928584017f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a224790528684017f6c6974636827732041726d793a205468652047656e6572616c73206d696e74209052606084016573706f74202360d01b905280519081876066870192019161087792611373565b8301906f11161134b6b0b3b2afb230ba30911d1160811b6066830152519182607683016108a392611373565b0161227d60f01b6076820152036058810182526078016108c39082611452565b6108cc90611be0565b9151918183928352820161034791611396565b915091346101db5760203660031901126101db578235926108ff33611d20565b610908846114d7565b50610912846114d7565b848452602091825282842080546001600160a01b03199081169091556001600160a01b0390911680855260038352838520805460001901905585855260029092529183208054909216909155600080516020611e3d8339815191528280a480f35b91905034610a23576080366003190112610a235761098f611342565b9061099861135d565b6064359360443591906001600160401b0386116101d357366023870112156101d357850135936109d36109ca86611475565b94519485611452565b84845286366024878901011161024957602086610a1b976024610a209a018389013786010152610a0b610a0684336115fd565b611524565b610a168383836116c5565b6118fa565b6115d9565b80f35b8280fd5b5050346101db57816003193601126101db5760085490516001600160a01b039091168152602090f35b91905034610a235780600319360112610a2357610a6b611342565b90602435918215158093036101d7576001600160a01b031692338414610ada5750338452600560205280842083855260205280842060ff1981541660ff8416179055519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b6020606492519162461bcd60e51b8352820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152fd5b8284346102495780600319360112610249578151918160019283549384811c91818616958615610c06575b6020968785108114610bf3578899509688969785829a529182600014610bcc575050600114610b8f575b5050506103479291610b80910385611452565b51928284938452830190611396565b91908693508083528383205b828410610bb45750505082010181610b80610347610b6d565b8054848a018601528895508794909301928101610b9b565b60ff19168782015293151560051b86019093019350849250610b8091506103479050610b6d565b634e487b7160e01b835260228a52602483fd5b92607f1692610b43565b5050346101db57816003193601126101db5760075490516001600160a01b039091168152602090f35b839150346101db5760203660031901126101db576001600160a01b03610c5d611342565b16908115610c7a5760208480858581526003845220549051908152f35b608490602085519162461bcd60e51b8352820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152fd5b5050346101db5760207ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791610d03366113f0565b610d0f92919233611d20565b610d20610d1b846117c1565b611490565b828652600a84528186205551908152a180f35b8284346102495760203660031901126102495750610d53602092356114d7565b90516001600160a01b039091168152f35b5050346101db57816003193601126101db576020906009549051908152f35b905034610a235781600319360112610a2357610d9e33611d3b565b6001600160a01b039081610db0611985565b1615610e5c576001600160601b039061271082610dcb61199b565b1611610e3b5750907ff21fccf4d64d86d532c4e4eb86c007b6ad57a460c27d724188625e755ec6cf6d929181610dff611985565b166001600160a01b0319610e1161199b565b60a01b1617600855610e21611985565b91610e2a61199b565b90845193168352166020820152a180f35b8390602492610e4861199b565b9251633cadbafb60e01b8152921690820152fd5b8251631cc0baef60e01b8152fd5b5050346101db57610a1b610a2091610e81366113bb565b91925192610e8e84611406565b868452610a0b610a0684336115fd565b5050346101db57816003193601126101db5760209060085460a01c9051908152f35b9050823461024957610ed1366113f0565b919050600854928360a01c92838102938185041490151715610f0a57505082516001600160a01b03909216825261271090046020820152f35b634e487b7160e01b825260119052602490fd5b833461024957610a20610f2f366113bb565b91610f3d610a0684336115fd565b6116c5565b905034610a235781600319360112610a2357610f5c611342565b6024359290916001600160a01b0391908280610f77876114d7565b1694169380851461106357803314908115611044575b5015610fdc57848652602052842080546001600160a01b03191683179055610fb4836114d7565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b6020608492519162461bcd60e51b8352820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b90508652600560205281862033875260205260ff828720541638610f8d565b506020608492519162461bcd60e51b8352820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b8284346102495760203660031901126102495750610d53602092356114fd565b82843461024957806003193601126102495781519181825492600184811c91818616958615611173575b6020968785108114610bf3578899509688969785829a529182600014610bcc575050600114611136575050506103479291610b80910385611452565b91908693508280528383205b82841061115b5750505082010181610b80610347610b6d565b8054848a018601528895508794909301928101611142565b92607f16926110fa565b905034610a23576020366003190112610a2357359063ffffffff60e01b8216809203610a2357602092506301ffc9a760e01b82149182156111f2575b82156111e1575b82156111d0575b50519015158152f35b63152a902d60e11b149150386111c7565b635b5e139f60e01b811492506111c0565b6380ac58cd60e01b811492506111b9565b839150346101db5760603660031901126101db5761121f611342565b6024359061122c33611d20565b60095480831461131a575b50818452600a6020526044358585205584519261125384611406565b8484526001600160a01b0382169081156112d7575091610a20939181610a1b9488611286611280846117c1565b156119b1565b611292611280846117c1565b81895260036020908152818a2080546001019055838a5260029052882080546001600160a01b0319168217905587600080516020611e3d8339815191528180a46117de565b606490602088519162461bcd60e51b8352820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b600019811461132f5760010160095585611237565b634e487b7160e01b855260118452602485fd5b600435906001600160a01b038216820361135857565b600080fd5b602435906001600160a01b038216820361135857565b60005b8381106113865750506000910152565b8181015183820152602001611376565b906020916113af81518092818552858086019101611373565b601f01601f1916010190565b6060906003190112611358576001600160a01b0390600435828116810361135857916024359081168103611358579060443590565b6040906003190112611358576004359060243590565b602081019081106001600160401b0382111761142157604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761142157604052565b601f909101601f19168101906001600160401b0382119082101761142157604052565b6001600160401b03811161142157601f01601f191660200190565b1561149757565b60405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606490fd5b6000908152600260205260409020546001600160a01b03166114fa811515611490565b90565b611509610d1b826117c1565b6000908152600460205260409020546001600160a01b031690565b1561152b57565b60405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b156115e057565b60405162461bcd60e51b8152806115f960048201611586565b0390fd5b906001600160a01b038080611611846114d7565b16931691838314938415611644575b50831561162e575b50505090565b61163a919293506114fd565b1614388080611628565b909350600052600560205260406000208260005260205260ff604060002054169238611620565b1561167257565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b906116ed916116d3846114d7565b6001600160a01b039391841692849290918316841461166b565b16918215611770578161170a91611703866114d7565b161461166b565b600080516020611e3d833981519152600084815260046020526040812060018060a01b03199081815416905583825260036020526040822060001981540190558482526040822060018154019055858252600260205284604083209182541617905580a4565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6000908152600260205260409020546001600160a01b0316151590565b9192600092909190803b156118f05761182c946040518092630a85bd0160e11b9485835233600484015287602484015260448301526080606483015281878160209a8b966084830190611396565b03926001600160a01b03165af18491816118b0575b5061189f575050503d600014611897573d61185b81611475565b906118696040519283611452565b81528091833d92013e5b805191826118945760405162461bcd60e51b8152806115f960048201611586565b01fd5b506060611873565b6001600160e01b0319161492509050565b9091508581813d83116118e9575b6118c88183611452565b810103126101d757516001600160e01b0319811681036101d7579038611841565b503d6118be565b5050915050600190565b9293600093909291803b1561197a579484916119549660405180948193630a85bd0160e11b9788845233600485015260018060a01b0380921660248501526044840152608060648401528260209b8c976084830190611396565b0393165af18491816118b0575061189f575050503d600014611897573d61185b81611475565b505050915050600190565b6004356001600160a01b03811681036113585790565b6024356001600160601b03811681036113585790565b156119b857565b60405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606490fd5b80516020909101516001600160d01b0319808216939290919060068110611a2257505050565b60060360031b82901b16169150565b6040516101f4611a4082611437565b6003825260203681840137602382015b6000190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049081611a5057505090565b6000908072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b80821015611bd2575b506904ee2d6d415b85acef8160201b80831015611bc3575b50662386f26fc1000080831015611bb4575b506305f5e10080831015611ba5575b5061271080831015611b96575b506064821015611b86575b600a80921015611b7c575b60019081602181860195611b1187611475565b96611b1f6040519889611452565b808852611b2e601f1991611475565b01366020890137860101905b611b46575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215611b7757919082611b3a565b611b3f565b9160010191611afe565b9190606460029104910191611af3565b60049193920491019138611ae8565b60089193920491019138611adb565b60109193920491019138611acc565b60209193920491019138611aba565b604093508104915038611aa2565b60405190611bed82611437565b601082526f181899199a1a9b1b9c1cb0b131b232b360811b60208301528051916003908382029382850403611d0a57611c3e611c2885611475565b94611c366040519687611452565b808652611475565b6020850190601f1901368237600093808051015b808210611c63575050505050815290565b600180920191825160ff811660259060608114605f8210605a83111617603e8214603c8314178383141717607a821160218310171760238214611d03575b908115611cec5750600114611cb9575b505050611c52565b9185918894999693859453600f9082828260041c168a010151838501531687010151600282015301920194388080611cb1565b915050858394999692505301920194388080611cb1565b5083611ca1565b634e487b7160e01b600052601160045260246000fd5b611d2981611d51565b611d3857611d3690611d75565b565b50565b611d4481611d51565b611d3857611d3690611dbe565b6007546001600160a01b0391821691168114908115611d6e575090565b9050301490565b6001600160a01b0316308114611d385780600052600660205260016040600020541615611d9f5750565b6044906040519063607b74c960e11b8252600482015260006024820152fd5b6001600160a01b0316308114611d38578060005260066020526001604060002054811c1615611dea5750565b6044906040519063607b74c960e11b8252600482015260016024820152fd5b611e1281611d51565b15611e1a5750565b60405163245aecd360e01b81526001600160a01b039091166004820152602490fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122097a404baae027c0643c52fd3bd44897a9f5ec8e779e3b0744d7bb3045f40d63864736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.