Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EditionMetadataRenderer
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {IMetadataRenderer} from "../interfaces/IMetadataRenderer.sol"; import {IERC721Collection} from "../interfaces/IERC721Collection.sol"; import {IERC721MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/interfaces/IERC721MetadataUpgradeable.sol"; import {IERC2981Upgradeable} from "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol"; import {DynamicMetadataRenderer} from "../utils/DynamicMetadataRenderer.sol"; import {MetadataRenderAdminCheck} from "./MetadataRenderAdminCheck.sol"; interface CollectionConfigGetter { function config() external view returns (IERC721Collection.Configuration memory config); } /// @notice EditionMetadataRenderer for editions support contract EditionMetadataRenderer is IMetadataRenderer, MetadataRenderAdminCheck { /// @notice Storage for token edition information struct TokenEditionInfo { string description; string imageURI; string animationURI; } /// @notice Event for updated Media URIs event MediaURIsUpdated(address indexed target, address sender, string imageURI, string animationURI); /// @notice Event for a new edition initialized /// @dev admin function indexer feedback event EditionInitialized(address indexed target, string description, string imageURI, string animationURI); /// @notice Description updated for this edition /// @dev admin function indexer feedback event DescriptionUpdated(address indexed target, address sender, string newDescription); /// @notice Token information mapping storage mapping(address => TokenEditionInfo) public tokenInfos; /// @notice Update media URIs /// @param target target for contract to update metadata for /// @param imageURI new image uri address /// @param animationURI new animation uri address function updateMediaURIs(address target, string memory imageURI, string memory animationURI) external requireSenderAdmin(target) { tokenInfos[target].imageURI = imageURI; tokenInfos[target].animationURI = animationURI; emit MediaURIsUpdated({target: target, sender: msg.sender, imageURI: imageURI, animationURI: animationURI}); } /// @notice Admin function to update description /// @param target target description /// @param newDescription new description function updateDescription(address target, string memory newDescription) external requireSenderAdmin(target) { tokenInfos[target].description = newDescription; emit DescriptionUpdated({target: target, sender: msg.sender, newDescription: newDescription}); } /// @notice Default initializer for edition data from a specific contract /// @param dynamicTokenData data to init with function initializeWithData(bytes memory, bytes memory dynamicTokenData) external { // data format: description, imageURI, animationURI (string memory description, string memory imageURI, string memory animationURI) = abi.decode(dynamicTokenData, (string, string, string)); tokenInfos[msg.sender] = TokenEditionInfo({description: description, imageURI: imageURI, animationURI: animationURI}); emit EditionInitialized({target: msg.sender, description: description, imageURI: imageURI, animationURI: animationURI}); } /// @notice Contract URI information getter /// @return contract uri (if set) function contractURI() external view override returns (string memory) { address target = msg.sender; TokenEditionInfo storage editionInfo = tokenInfos[target]; IERC721Collection.Configuration memory config = CollectionConfigGetter(target).config(); return DynamicMetadataRenderer.encodeContractURIJSON({ name: IERC721MetadataUpgradeable(target).name(), description: editionInfo.description, imageURI: editionInfo.imageURI, animationURI: editionInfo.animationURI, royaltyBPS: uint256(config.royaltyBPS), royaltyRecipient: config.fundsRecipient }); } /// @notice Token URI information getter /// @param tokenId to get uri for /// @return contract uri (if set) function tokenURI(uint256 tokenId, bool) public view override returns (string memory) { address target = msg.sender; TokenEditionInfo memory info = tokenInfos[target]; return DynamicMetadataRenderer.createMetadata({ name: IERC721MetadataUpgradeable(target).name(), description: info.description, imageURI: info.imageURI, animationURI: info.animationURI, isEdition: true, tokenId: tokenId }); } function updateMetadataBase(address collection, string memory baseURI, string memory metadataURI) external override { // no-op } function dynamicTokenURI(uint256) external pure override returns (string memory) { return ''; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface IMetadataRenderer { function tokenURI(uint256, bool) external view returns (string memory); function contractURI() external view returns (string memory); function initializeWithData(bytes memory metadataBase, bytes memory dynamicTokenData) external; function updateMetadataBase( address collection, string memory baseURI, string memory metadataURI ) external; function dynamicTokenURI(uint256) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {IMetadataRenderer} from "../interfaces/IMetadataRenderer.sol"; /// @notice Interface for Freee Collection contract interface IERC721Collection { // Enums /// @notice Phase type enum PhaseType { Public, Presale, Airdrop, AdminMint } // Access errors /// @notice Only admin can access this function error Access_OnlyAdmin(); /// @notice Missing the given role or admin access error Access_MissingRoleOrAdmin(bytes32 role); /// @notice Withdraw is not allowed by this user error Access_WithdrawNotAllowed(); /// @notice Cannot withdraw funds due to ETH send failure. error Withdraw_FundsSendFailure(); /// @notice Call to external metadata renderer failed. error ExternalMetadataRenderer_CallFailed(); // Sale/Purchase errors /// @notice Sale is inactive error Sale_Inactive(); /// @notice Presale is inactive error Presale_Inactive(); /// @notice Presale invalid, out of range error Presale_Invalid(); /// @notice Exceed presale stage supply error Presale_ExceedStageSupply(); /// @notice Presale merkle root is invalid error Presale_MerkleNotApproved(); /// @notice Wrong price for purchase error Purchase_WrongPrice(uint256 correctPrice); /// @notice NFT sold out error Mint_SoldOut(); /// @notice Too many purchase for address error Purchase_TooManyForAddress(); /// @notice Too many presale for address error Presale_TooManyForAddress(); /// @notice Collection already revealed error Collection_Aready_Revealed(); /// @notice Trading locked before mint out error Collection_TradingLocked(); // Admin errors /// @notice invalid collection size when publish error Setup_InvalidCollectionSize(); /// @notice Presale stage out of supported range error Setup_Presale_StageOutOfRange(); /// @notice Royalty percentage too high error Setup_RoyaltyPercentageTooHigh(uint16 maxRoyaltyBPS); /// @notice Unable to finalize an edition not marked as open (size set to uint64_max_value) error Admin_UnableToFinalizeNotOpenEdition(); /// @notice Invalid admin upgrade address error Admin_InvalidUpgradeAddress(address proposedAddress); /// @notice Event emitted for mint fee payout /// @param mintFeeAmount amount of the mint fee /// @param mintFeeRecipient recipient of the mint fee /// @param success if the payout succeeded event MintFeePayout(uint256 mintFeeAmount, address mintFeeRecipient, bool success); /// @notice Event emitted for each sale /// @param phase phase of the sale /// @param to address sale was made to /// @param quantity quantity of the minted nfts /// @param pricePerToken price for each token /// @param firstPurchasedTokenId first purchased token ID (to get range add to quantity for max) /// @param presaleStage stageIndex of presale stage if applicable, else return 0 event Sale(PhaseType phase, address indexed to, uint256 indexed quantity, uint256 indexed pricePerToken, uint256 firstPurchasedTokenId, uint256 presaleStage); /// @notice Event emitted for each sale /// @param sender address sale was made to /// @param tokenContract address of the token contract /// @param tokenId first purchased token ID (to get range add to quantity for max) /// @param quantity quantity of the minted nfts /// @param comment caller provided comment event MintComment(address indexed sender, address indexed tokenContract, uint256 indexed tokenId, uint256 quantity, string comment); /// @notice Contract has been configured and published /// @param changedBy Changed by user event ContractStatusChanged(address indexed changedBy); /// @notice Sales configuration has been changed /// @dev To access new sales configuration, use getter function. /// @param changedBy Changed by user event PublicSaleConfigChanged(address indexed changedBy); /// @notice Presale config changed /// @param changedBy changed by user event PresaleConfigChanged(address indexed changedBy); /// @notice event emit when user change the lock trading func /// @param changedBy changed by user /// @param status new status event LockTradingStatusChanged(address indexed changedBy, bool status); /// @notice Event emitted when the royalty percentage changed /// @param changedBy address that change the royalty /// @param newPercentage new royalty percentage event RoyaltyChanged(address indexed changedBy, uint256 newPercentage); /// @notice Event emitted when the funds recipient is changed /// @param newAddress new address for the funds recipient /// @param changedBy address that the recipient is changed by event FundsRecipientChanged(address indexed newAddress, address indexed changedBy); /// @notice Event emitted when the funds are withdrawn from the minting contract /// @param withdrawnBy address that issued the withdraw /// @param withdrawnTo address that the funds were withdrawn to /// @param amount amount that was withdrawn /// @param feeRecipient user getting withdraw fee (if any) /// @param feeAmount amount of the fee getting sent (if any) event FundsWithdrawn(address indexed withdrawnBy, address indexed withdrawnTo, uint256 amount, address feeRecipient, uint256 feeAmount); /// @notice Collection dynamic metadata changed /// @param changedBy address that changed the info event DynamicMetadataChanged(address changedBy); /// @notice Collection has been revealed /// @param revealedBy Revealed by user event CollectionRevealed(address indexed revealedBy); /// @notice Event emitted when an open mint is finalized and further minting is closed forever on the contract. /// @param sender address sending close mint /// @param numberOfMints number of mints the contract is finalized at event OpenMintFinalized(address indexed sender, uint256 numberOfMints); /// @notice Event emitted when metadata renderer is updated. /// @param sender address of the updater /// @param renderer new metadata renderer address event UpdatedMetadataRenderer(address sender, IMetadataRenderer renderer); /// @notice General configuration for NFT Minting and bookkeeping struct Configuration { /// @dev Metadata renderer (uint160) IMetadataRenderer metadataRenderer; /// @dev Max supply of collection (uint160+64 = 224) uint64 collectionSize; /// @dev Royalty amount in bps (uint224+16 = 240) uint16 royaltyBPS; /// @dev Funds recipient for sale (new slot, uint160) address payable fundsRecipient; /// @dev collection reveal status bool revealed; /// @dev lock trading before mint out bool lockBeforeMintOut; } /// @notice Public sale configuration /// @dev Uses 1 storage slot struct PublicSaleConfiguration { /// @dev Public sale price (max ether value > 1000 ether with this value) uint104 publicSalePrice; /// @notice Purchase mint limit per address (if set to 0 === unlimited mints) uint32 maxSalePurchasePerAddress; /// @dev uint64 type allows for dates into 292 billion years /// @notice Public sale start timestamp (136+64 = 186) uint64 publicSaleStart; /// @notice Public sale end timestamp (186+64 = 250) uint64 publicSaleEnd; } /// @notice Presale stage configuration struct PresaleConfiguration { /// @notice Presale stage human readable name string presaleName; /// @notice Presale start timestamp uint64 presaleStart; /// @notice Presale end timestamp uint64 presaleEnd; /// @notice Presale price in ether uint104 presalePrice; /// @notice Purchase mint limit per address (if set to 0 === unlimited mints) uint32 presaleMaxPurchasePerAddress; /// @notice supply allocated for presale stage uint32 presaleSupply; /// @notice amount minted for presale stage uint32 presaleMinted; /// @notice Presale merkle root bytes32 presaleMerkleRoot; } /// @notice Return type of specific mint counts and details per address struct AddressMintDetails { /// Number of presale mints for each stage from the given address uint256[] presaleMintsByStage; /// Number of presale mints from the given address uint256 presaleMints; /// Number of public mints from the given address uint256 publicMints; /// Number of total mints from the given address uint256 totalMints; } /// @notice External purchase function (payable in eth) /// @param quantity to purchase /// @return first minted token ID function purchase(uint256 quantity) external payable returns (uint256); /// @notice External purchase presale function (takes a merkle proof and matches to root) (payable in eth) /// @param stageIndex targetted presale stage /// @param quantity to purchase /// @param maxQuantity can purchase (verified by merkle root) /// @param pricePerToken price per token allowed (verified by merkle root) /// @param merkleProof input for merkle proof leaf verified by merkle root /// @return first minted token ID function purchasePresale(uint256 stageIndex, uint256 quantity, uint256 maxQuantity, uint256 pricePerToken, bytes32[] memory merkleProof) external payable returns (uint256); /// @notice Function to return the specific sales details for a given address /// @param minter address for minter to return mint information for function mintedPerAddress(address minter) external view returns (AddressMintDetails memory); /// @notice This is the opensea/public owner setting that can be set by the contract admin function owner() external view returns (address); /// @notice Admin function to update the public sale configuration settings /// @param newConfig updated public stage config function setPublicSaleConfiguration(PublicSaleConfiguration memory newConfig) external; /// @notice Admin function to update the presale configuration settings /// @param newConfig new presale configuration function setPresaleConfiguration(PresaleConfiguration[] memory newConfig) external; /// @dev Reveal collection artworks /// @param collectionURI collection artwork URI function revealCollection(string memory collectionURI) external; /// @notice Update the metadata renderer /// @param newRenderer new address for renderer /// @param metadataBase data to call to bootstrap data for the new renderer (optional) /// @param dynamicMetadataInfo data to call to bootstrap dynamic metadata for the new renderer (optional) function setMetadataRenderer(IMetadataRenderer newRenderer, bytes memory metadataBase, bytes memory dynamicMetadataInfo) external; /// @notice This is an admin mint function to mint a quantity to a specific address /// @param to address to mint to /// @param quantity quantity to mint /// @return the id of the first minted NFT function adminMint(address to, uint256 quantity) external returns (uint256); /// @notice This is an admin mint function to mint a single nft each to a list of addresses /// @param to list of addresses to mint an NFT each to /// @return the id of the first minted NFT function adminMintAirdrop(address[] memory to) external returns (uint256); /// @dev Getter for admin role associated with the contract to handle metadata /// @return boolean if address is admin function isAdmin(address user) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../token/ERC721/extensions/IERC721MetadataUpgradeable.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981Upgradeable is IERC165Upgradeable { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {Base64} from "@openzeppelin/contracts/utils/Base64.sol"; /// NFT metadata library for dynamically render metadata library DynamicMetadataRenderer { /// Generate metadata from storage information as base64-json blob /// Combines the media data and metadata /// @param name Name of NFT in metadata /// @param description Description of NFT in metadata /// @param imageURI URI of image to render for edition /// @param animationURI URI of animation to render for edition /// @param isEdition collection type /// @param tokenId Token ID for specific token function createMetadata( string memory name, string memory description, string memory imageURI, string memory animationURI, bool isEdition, uint256 tokenId ) internal pure returns (string memory) { string memory _tokenMediaData = tokenMediaData(imageURI, animationURI); bytes memory json = createMetadataJSON(name, description, _tokenMediaData, isEdition, tokenId); return encodeMetadataJSON(json); } /// Function to create the metadata json string for the nft edition /// @param name Name of NFT in metadata /// @param description Description of NFT in metadata /// @param mediaData Data for media to include in json object /// @param isEdition different format for edition metadata /// @param tokenId Token ID for specific token function createMetadataJSON( string memory name, string memory description, string memory mediaData, bool isEdition, uint256 tokenId ) internal pure returns (bytes memory) { if (isEdition) { return abi.encodePacked( '{"name": "', name, " #", Strings.toString(tokenId), '", "', 'description": "', description, '", "', mediaData, ',' '"properties": {"number": ', Strings.toString(tokenId), ', "name": "', name, '"}}' ); } else { return abi.encodePacked('{"name": "', name, " #", Strings.toString(tokenId), '", "', 'description": "', description, '", "', mediaData, "}"); } } function encodeContractURIJSON( string memory name, string memory description, string memory imageURI, string memory animationURI, uint256 royaltyBPS, address royaltyRecipient ) internal pure returns (string memory) { bytes memory imageSpace = bytes(""); if (bytes(imageURI).length > 0) { imageSpace = abi.encodePacked('", "image": "', imageURI); } bytes memory animationSpace = bytes(""); if (bytes(animationURI).length > 0) { animationSpace = abi.encodePacked('", "animation_url": "', animationURI); } return string( encodeMetadataJSON( abi.encodePacked( '{"name": "', name, '", "description": "', description, // this is for opensea since they don't respect ERC2981 right now '", "seller_fee_basis_points": ', Strings.toString(royaltyBPS), ', "fee_recipient": "', Strings.toHexString(uint256(uint160(royaltyRecipient)), 20), imageSpace, animationSpace, '"}' ) ) ); } /// Encodes the argument json bytes into base64-data uri format /// @param json Raw json to base64 and turn into a data-uri function encodeMetadataJSON(bytes memory json) internal pure returns (string memory) { return string(abi.encodePacked("data:application/json;base64,", Base64.encode(json))); } /// Generates edition metadata from storage information as base64-json blob /// Combines the media data and metadata /// @param imageUrl URL of image to render for edition /// @param animationUrl URL of animation to render for edition function tokenMediaData(string memory imageUrl, string memory animationUrl) internal pure returns (string memory) { bool hasImage = bytes(imageUrl).length > 0; bool hasAnimation = bytes(animationUrl).length > 0; if (hasImage && hasAnimation) { return string(abi.encodePacked('image": "', imageUrl, '", "animation_url": "', animationUrl, '"')); } if (hasImage) { return string(abi.encodePacked('image": "', imageUrl, '"')); } if (hasAnimation) { return string(abi.encodePacked('animation_url": "', animationUrl, '"')); } return ""; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import {IERC721Collection} from "../interfaces/IERC721Collection.sol"; contract MetadataRenderAdminCheck { error Access_OnlyAdmin(); /// @notice Modifier to require the sender to be an admin /// @param target address that the user wants to modify modifier requireSenderAdmin(address target) { if (target != msg.sender && !IERC721Collection(target).isAdmin(msg.sender)) { revert Access_OnlyAdmin(); } _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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 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 IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.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) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
{ "remappings": [ "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "erc721a-upgradeable/=lib/ERC721A-Upgradeable/contracts/", "forge-std/=lib/forge-std/src/", "ERC721A-Upgradeable/=lib/ERC721A-Upgradeable/contracts/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"Access_OnlyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"newDescription","type":"string"}],"name":"DescriptionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string","name":"imageURI","type":"string"},{"indexed":false,"internalType":"string","name":"animationURI","type":"string"}],"name":"EditionInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"imageURI","type":"string"},{"indexed":false,"internalType":"string","name":"animationURI","type":"string"}],"name":"MediaURIsUpdated","type":"event"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dynamicTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"dynamicTokenData","type":"bytes"}],"name":"initializeWithData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenInfos","outputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"imageURI","type":"string"},{"internalType":"string","name":"animationURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"newDescription","type":"string"}],"name":"updateDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"imageURI","type":"string"},{"internalType":"string","name":"animationURI","type":"string"}],"name":"updateMediaURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"updateMetadataBase","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608080604052346015576119b2908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80632f17b8f014610ed8578063301a326014610cd15780636bbde001146108335780638bbb2cf2146105e8578063af806d56146105d8578063ba46ae7214610579578063e8a3d485146100b55763ea58a14d1461007457600080fd5b346100b05760203660031901126100b0576100ac6040516100948161123d565b60008152604051918291602083526020830190611357565b0390f35b600080fd5b346100b05760003660031901126100b0573360005260206000815260406000206040516379502c5560e01b815260c081600481335afa908115610495576000916104a1575b506040516306fdde0360e01b815291600083600481335afa92831561049557600093610470575b50600161ffff60408401511692606060018060a01b0391015116610144836113b6565b9061015d6002610156600187016113b6565b95016113b6565b9460405161016a8161123d565b60008152948051610424575b506040516101838161123d565b600081529580516103cd575b50610199906116ee565b9091604051926101a884611222565b602a84528884019460403687378451156103b757603086538451600110156103b757607860218601536029905b808211610359575050610316579360719361030197936102ba61022498946102fc988c610253602a6040519d8e809c693d913730b6b2911d101160b11b86830152858151948593019101611334565b8a019172111610113232b9b1b934b83a34b7b7111d101160691b602a8401528351938491603d85019101611334565b017f222c202273656c6c65725f6665655f62617369735f706f696e7473223a200000603d82015261028e8d8351938491605b85019101611334565b0191731610113332b2afb932b1b4b834b2b73a111d101160611b605b840152518093606f840190611334565b016102ce825180938b606f85019101611334565b016102e2825180938a606f85019101611334565b0161227d60f01b606f820152036051810184520182611258565b611660565b906100ac604051928284938452830190611357565b6064886040519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f811660108110156103b75786518410156103b7576f181899199a1a9b1b9c1cb0b131b232b360811b901a8684018c015360041c9180156103a15760001901906101d5565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b61019991965061041d60356040518093741116101130b734b6b0ba34b7b72fbab936111d101160591b8d83015261040d8d82519283918686019101611334565b8101036015810184520182611258565b959061018f565b909450610469602d60405180936c1116101134b6b0b3b2911d101160991b8c8301526104598c82519283918686019101611334565b810103600d810184520182611258565b9388610176565b61048e9193503d806000833e6104868183611258565b8101906114e1565b9184610121565b6040513d6000823e3d90fd5b905060c0813d60c011610571575b816104bc60c09383611258565b810103126100b057604051906001600160401b0360c083018181118482101761055b5760405281516001600160a01b03919082811681036100b05784528583015190811681036100b05785840152604082015161ffff811681036100b0576040840152606082015190811681036100b0576105509160a091606085015261054560808201611492565b608085015201611492565b60a0820152836100fa565b634e487b7160e01b600052604160045260246000fd5b3d91506104af565b346100b05760203660031901126100b0576001600160a01b0361059a61120c565b16600052600060205260406000206105b1816113b6565b6100ac6105cc60026105c5600186016113b6565b94016113b6565b6040519384938461145b565b346100b0576105e6366112db565b005b346100b05760403660031901126100b05761060161120c565b6001600160401b036024358181116100b057610621903690600401611294565b6001600160a01b039092169133831415806107c6575b6107b4578260005260209160008352604060002090825190811161055b5761065f825461137c565b601f811161076e575b5083601f82116001146106e257927f36195b44a3184513e02477929207751ea9d67026b917ed74d374a7f9e8c5e4d19492826106d2936040966000916106d7575b508160011b916000199060031b1c19161790555b83519384933385528401526040830190611357565b0390a2005b9050830151896106a9565b601f1982169083600052856000209160005b818110610757575083604096937f36195b44a3184513e02477929207751ea9d67026b917ed74d374a7f9e8c5e4d19896936106d2966001941061073e575b5050811b0190556106bd565b85015160001960f88460031b161c191690558980610732565b91928760018192868a0151815501940192016106f4565b8260005284600020601f830160051c8101918684106107aa575b601f0160051c01905b81811061079e5750610668565b60008155600101610791565b9091508190610788565b6040516302bd6bd160e01b8152600490fd5b50604051630935e01b60e21b8152336004820152602081602481875afa908115610495576000916107f9575b5015610637565b90506020813d60201161082b575b8161081460209383611258565b810103126100b05761082590611492565b846107f2565b3d9150610807565b346100b05760403660031901126100b0576004356001600160401b0381116100b057610863903690600401611294565b506024356001600160401b0381116100b057610883903690600401611294565b8051810190606081602084019303126100b05760208101516001600160401b0381116100b0578260206108b89284010161149f565b9060408101516001600160401b0381116100b0578360206108db9284010161149f565b926060820151916001600160401b0383116100b0576108fd920160200161149f565b6040519261090a84611222565b828452806020850152816040850152336000526000602052604060002084518051906001600160401b03821161055b578190610946845461137c565b601f8111610c7e575b50602090601f8311600114610c1857600092610c0d575b50508160011b916000199060031b1c19161781555b60208501518051906001600160401b03821161055b5761099e600184015461137c565b601f8111610bc6575b50602090601f8311600114610b5357918060409492600294600092610b48575b50508160011b916000199060031b1c19161760018201555b01940151938451946001600160401b03861161055b576109ff825461137c565b601f8111610b00575b50602090601f8711600114610a76579580917ff889a5cdc62274389379cbfade0f225b1d30b7395177fd6aeaab61662b1c6edf9697600092610a6b575b50508160011b916000199060031b1c19161790555b6106d260405192839233968461145b565b015190508780610a45565b90601f198716918360005260206000209260005b818110610ae857509160019391897ff889a5cdc62274389379cbfade0f225b1d30b7395177fd6aeaab61662b1c6edf999a9410610acf575b505050811b019055610a5a565b015160001960f88460031b161c19169055878080610ac2565b92936020600181928786015181550195019301610a8a565b826000526020600020601f880160051c81019160208910610b3e575b601f0160051c01905b818110610b325750610a08565b60008155600101610b25565b9091508190610b1c565b0151905089806109c7565b90601f198316916001850160005260206000209260005b818110610bae57509260019285926002966040989610610b95575b505050811b0160018201556109df565b015160001960f88460031b161c19169055898080610b85565b92936020600181928786015181550195019301610b6a565b600184016000526020600020601f840160051c810160208510610c06575b601f830160051c82018110610bfa5750506109a7565b60008155600101610be4565b5080610be4565b015190508780610966565b6000858152602081209350601f198516905b818110610c665750908460019594939210610c4d575b505050811b01815561097b565b015160001960f88460031b161c19169055878080610c40565b92936020600181928786015181550195019301610c2a565b909150836000526020600020601f840160051c81019160208510610cc7575b90601f859493920160051c01905b818110610cb8575061094f565b60008155849350600101610cab565b9091508190610c9d565b346100b05760403660031901126100b057600435602435801515036100b05733600052602090600082526040600020604051610d0c81611222565b610d15826113b6565b8152610d356002610d28600185016113b6565b93868401948552016113b6565b6040828101918252516306fdde0360e01b81529092600082600481335afa948515610495576103019587956102fc95606b95600093610eb1575b50610e9691610d8391519551905190611506565b610d95610d8f856116ee565b946116ee565b90604051988996693d913730b6b2911d101160b11b8289015285519682870197610dc381602a8c018b611334565b890161202360f01b602a820152610de38251809386602c85019101611334565b01610e1e631116101160e11b9384602c8401526e3232b9b1b934b83a34b7b7111d101160891b60308401528351938491603f85019101611334565b0190603f820152610e398c8351938491604385019101611334565b017f2c2270726f70657274696573223a207b226e756d626572223a200000000000006043820152610e73825180938d605d85019101611334565b01916a1610113730b6b2911d101160a91b605d8401525180936068840190611334565b0162227d7d60e81b606882015203604b810184520182611258565b610d8391935091610ecf610e96933d806000833e6104868183611258565b93915091610d6f565b346100b057610ee6366112db565b6001600160a01b0390921691338314158061119f575b6107b45782600052602091600083526001806040600020018251916001600160401b039182841161055b57610f31815461137c565b93601f94858111611159575b5080888682116001146110f8576000916110ed575b50600019600383901b1c191690831b1790555b8660005260008652600260406000200192855192831161055b57610f89845461137c565b8181116110a7575b508690831160011461101757936106d293838060609895610ffe957fc4c1b9223fcebe5f35b9030d3df655018c40e88d70b8a3c63ed851c5d972210f9b9960009361100c575b501b916000199060031b1c19161790555b6040519586953387528601526060850190611357565b908382036040850152611357565b88015192508d610fd7565b601f9291921982169084600052876000209160005b818110611092575093837fc4c1b9223fcebe5f35b9030d3df655018c40e88d70b8a3c63ed851c5d972210f9997936106d29793610ffe9660609b9810611079575b5050811b019055610fe8565b87015160001960f88460031b161c191690558b8061106d565b8883015184559285019291890191890161102c565b84600052876000208280860160051c8201928a87106110e4575b0160051c019083905b8281106110d8575050610f91565b600081550183906110ca565b925081926110c1565b90508601518a610f52565b849250601f19821690846000528a6000209160005b8c828210611143575050831161112a575b5050811b019055610f65565b88015160001960f88460031b161c191690558a8061111e565b838c01518555889690940193928301920161110d565b82600052886000208680840160051c8201928b8510611196575b0160051c019084905b82811061118a575050610f3d565b6000815501849061117c565b92508192611173565b50604051630935e01b60e21b8152336004820152602081602481875afa908115610495576000916111d2575b5015610efc565b90506020813d602011611204575b816111ed60209383611258565b810103126100b0576111fe90611492565b846111cb565b3d91506111e0565b600435906001600160a01b03821682036100b057565b606081019081106001600160401b0382111761055b57604052565b602081019081106001600160401b0382111761055b57604052565b90601f801991011681019081106001600160401b0382111761055b57604052565b6001600160401b03811161055b57601f01601f191660200190565b81601f820112156100b0578035906112ab82611279565b926112b96040519485611258565b828452602083830101116100b057816000926020809301838601378301015290565b60606003198201126100b0576004356001600160a01b03811681036100b057916001600160401b036024358181116100b0578361131a91600401611294565b926044359182116100b05761133191600401611294565b90565b60005b8381106113475750506000910152565b8181015183820152602001611337565b9060209161137081518092818552858086019101611334565b601f01601f1916010190565b90600182811c921680156113ac575b602083101461139657565b634e487b7160e01b600052602260045260246000fd5b91607f169161138b565b906040519182600082546113c98161137c565b9081845260209460019160018116908160001461143957506001146113fa575b5050506113f892500383611258565b565b600090815285812095935091905b8183106114215750506113f893508201013880806113e9565b85548884018501529485019487945091830191611408565b925050506113f894925060ff191682840152151560051b8201013880806113e9565b91611484906114766113319593606086526060860190611357565b908482036020860152611357565b916040818403910152611357565b519081151582036100b057565b81601f820112156100b05780516114b581611279565b926114c36040519485611258565b818452602082840101116100b0576113319160208085019101611334565b906020828203126100b05781516001600160401b0381116100b057611331920161149f565b805115159082511515918080611659575b6115d75761158a575061153857506040516115318161123d565b6000815290565b611331603260405180937030b734b6b0ba34b7b72fbab936111d101160791b6020830152611570815180926020603186019101611334565b8101601160f91b6031820152036012810184520182611258565b915050611331602a60405180936834b6b0b3b2911d101160b91b60208301526115bd815180926020602986019101611334565b8101601160f91b602982015203600a810184520182611258565b506113319150603f906040519384916834b6b0b3b2911d101160b91b602084015261160c815180926020602987019101611334565b8201741116101130b734b6b0ba34b7b72fbab936111d101160591b6029820152611640825180936020603e85019101611334565b01601160f91b603e82015203601f810184520182611258565b5082611517565b61166990611832565b611331603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526116ac8151809260208686019101611334565b810103601d810184520182611258565b906116c682611279565b6116d36040519182611258565b82815280926116e4601f1991611279565b0190602036910137565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015611824575b506d04ee2d6d415b85acef810000000080831015611815575b50662386f26fc1000080831015611806575b506305f5e100808310156117f7575b50612710808310156117e8575b5060648210156117d8575b600a809210156117ce575b600190816021611786600187016116bc565b95860101905b611798575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156117c95791908261178c565b611791565b9160010191611774565b9190606460029104910191611769565b6004919392049101913861175e565b60089193920491019138611751565b60109193920491019138611742565b60209193920491019138611730565b604093508104915038611717565b80511561196f5760405161184581611222565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040820152815191600292600281018091116103a1576003908190046001600160fe1b03811681036103a1576118cc906002959492951b6116bc565b936020850193839284518501935b84811061191c575050505050600390510680600114611909576002146118fe575090565b603d90600019015390565b50603d9081600019820153600119015390565b8360049197929394959701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151868201530195939291906118da565b506040516115318161123d56fea26469706673582212207218d96f35e074d19750f74e21c887305cde345fa422fc7968d18f263d5ea10b64736f6c63430008190033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c80632f17b8f014610ed8578063301a326014610cd15780636bbde001146108335780638bbb2cf2146105e8578063af806d56146105d8578063ba46ae7214610579578063e8a3d485146100b55763ea58a14d1461007457600080fd5b346100b05760203660031901126100b0576100ac6040516100948161123d565b60008152604051918291602083526020830190611357565b0390f35b600080fd5b346100b05760003660031901126100b0573360005260206000815260406000206040516379502c5560e01b815260c081600481335afa908115610495576000916104a1575b506040516306fdde0360e01b815291600083600481335afa92831561049557600093610470575b50600161ffff60408401511692606060018060a01b0391015116610144836113b6565b9061015d6002610156600187016113b6565b95016113b6565b9460405161016a8161123d565b60008152948051610424575b506040516101838161123d565b600081529580516103cd575b50610199906116ee565b9091604051926101a884611222565b602a84528884019460403687378451156103b757603086538451600110156103b757607860218601536029905b808211610359575050610316579360719361030197936102ba61022498946102fc988c610253602a6040519d8e809c693d913730b6b2911d101160b11b86830152858151948593019101611334565b8a019172111610113232b9b1b934b83a34b7b7111d101160691b602a8401528351938491603d85019101611334565b017f222c202273656c6c65725f6665655f62617369735f706f696e7473223a200000603d82015261028e8d8351938491605b85019101611334565b0191731610113332b2afb932b1b4b834b2b73a111d101160611b605b840152518093606f840190611334565b016102ce825180938b606f85019101611334565b016102e2825180938a606f85019101611334565b0161227d60f01b606f820152036051810184520182611258565b611660565b906100ac604051928284938452830190611357565b6064886040519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f811660108110156103b75786518410156103b7576f181899199a1a9b1b9c1cb0b131b232b360811b901a8684018c015360041c9180156103a15760001901906101d5565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b61019991965061041d60356040518093741116101130b734b6b0ba34b7b72fbab936111d101160591b8d83015261040d8d82519283918686019101611334565b8101036015810184520182611258565b959061018f565b909450610469602d60405180936c1116101134b6b0b3b2911d101160991b8c8301526104598c82519283918686019101611334565b810103600d810184520182611258565b9388610176565b61048e9193503d806000833e6104868183611258565b8101906114e1565b9184610121565b6040513d6000823e3d90fd5b905060c0813d60c011610571575b816104bc60c09383611258565b810103126100b057604051906001600160401b0360c083018181118482101761055b5760405281516001600160a01b03919082811681036100b05784528583015190811681036100b05785840152604082015161ffff811681036100b0576040840152606082015190811681036100b0576105509160a091606085015261054560808201611492565b608085015201611492565b60a0820152836100fa565b634e487b7160e01b600052604160045260246000fd5b3d91506104af565b346100b05760203660031901126100b0576001600160a01b0361059a61120c565b16600052600060205260406000206105b1816113b6565b6100ac6105cc60026105c5600186016113b6565b94016113b6565b6040519384938461145b565b346100b0576105e6366112db565b005b346100b05760403660031901126100b05761060161120c565b6001600160401b036024358181116100b057610621903690600401611294565b6001600160a01b039092169133831415806107c6575b6107b4578260005260209160008352604060002090825190811161055b5761065f825461137c565b601f811161076e575b5083601f82116001146106e257927f36195b44a3184513e02477929207751ea9d67026b917ed74d374a7f9e8c5e4d19492826106d2936040966000916106d7575b508160011b916000199060031b1c19161790555b83519384933385528401526040830190611357565b0390a2005b9050830151896106a9565b601f1982169083600052856000209160005b818110610757575083604096937f36195b44a3184513e02477929207751ea9d67026b917ed74d374a7f9e8c5e4d19896936106d2966001941061073e575b5050811b0190556106bd565b85015160001960f88460031b161c191690558980610732565b91928760018192868a0151815501940192016106f4565b8260005284600020601f830160051c8101918684106107aa575b601f0160051c01905b81811061079e5750610668565b60008155600101610791565b9091508190610788565b6040516302bd6bd160e01b8152600490fd5b50604051630935e01b60e21b8152336004820152602081602481875afa908115610495576000916107f9575b5015610637565b90506020813d60201161082b575b8161081460209383611258565b810103126100b05761082590611492565b846107f2565b3d9150610807565b346100b05760403660031901126100b0576004356001600160401b0381116100b057610863903690600401611294565b506024356001600160401b0381116100b057610883903690600401611294565b8051810190606081602084019303126100b05760208101516001600160401b0381116100b0578260206108b89284010161149f565b9060408101516001600160401b0381116100b0578360206108db9284010161149f565b926060820151916001600160401b0383116100b0576108fd920160200161149f565b6040519261090a84611222565b828452806020850152816040850152336000526000602052604060002084518051906001600160401b03821161055b578190610946845461137c565b601f8111610c7e575b50602090601f8311600114610c1857600092610c0d575b50508160011b916000199060031b1c19161781555b60208501518051906001600160401b03821161055b5761099e600184015461137c565b601f8111610bc6575b50602090601f8311600114610b5357918060409492600294600092610b48575b50508160011b916000199060031b1c19161760018201555b01940151938451946001600160401b03861161055b576109ff825461137c565b601f8111610b00575b50602090601f8711600114610a76579580917ff889a5cdc62274389379cbfade0f225b1d30b7395177fd6aeaab61662b1c6edf9697600092610a6b575b50508160011b916000199060031b1c19161790555b6106d260405192839233968461145b565b015190508780610a45565b90601f198716918360005260206000209260005b818110610ae857509160019391897ff889a5cdc62274389379cbfade0f225b1d30b7395177fd6aeaab61662b1c6edf999a9410610acf575b505050811b019055610a5a565b015160001960f88460031b161c19169055878080610ac2565b92936020600181928786015181550195019301610a8a565b826000526020600020601f880160051c81019160208910610b3e575b601f0160051c01905b818110610b325750610a08565b60008155600101610b25565b9091508190610b1c565b0151905089806109c7565b90601f198316916001850160005260206000209260005b818110610bae57509260019285926002966040989610610b95575b505050811b0160018201556109df565b015160001960f88460031b161c19169055898080610b85565b92936020600181928786015181550195019301610b6a565b600184016000526020600020601f840160051c810160208510610c06575b601f830160051c82018110610bfa5750506109a7565b60008155600101610be4565b5080610be4565b015190508780610966565b6000858152602081209350601f198516905b818110610c665750908460019594939210610c4d575b505050811b01815561097b565b015160001960f88460031b161c19169055878080610c40565b92936020600181928786015181550195019301610c2a565b909150836000526020600020601f840160051c81019160208510610cc7575b90601f859493920160051c01905b818110610cb8575061094f565b60008155849350600101610cab565b9091508190610c9d565b346100b05760403660031901126100b057600435602435801515036100b05733600052602090600082526040600020604051610d0c81611222565b610d15826113b6565b8152610d356002610d28600185016113b6565b93868401948552016113b6565b6040828101918252516306fdde0360e01b81529092600082600481335afa948515610495576103019587956102fc95606b95600093610eb1575b50610e9691610d8391519551905190611506565b610d95610d8f856116ee565b946116ee565b90604051988996693d913730b6b2911d101160b11b8289015285519682870197610dc381602a8c018b611334565b890161202360f01b602a820152610de38251809386602c85019101611334565b01610e1e631116101160e11b9384602c8401526e3232b9b1b934b83a34b7b7111d101160891b60308401528351938491603f85019101611334565b0190603f820152610e398c8351938491604385019101611334565b017f2c2270726f70657274696573223a207b226e756d626572223a200000000000006043820152610e73825180938d605d85019101611334565b01916a1610113730b6b2911d101160a91b605d8401525180936068840190611334565b0162227d7d60e81b606882015203604b810184520182611258565b610d8391935091610ecf610e96933d806000833e6104868183611258565b93915091610d6f565b346100b057610ee6366112db565b6001600160a01b0390921691338314158061119f575b6107b45782600052602091600083526001806040600020018251916001600160401b039182841161055b57610f31815461137c565b93601f94858111611159575b5080888682116001146110f8576000916110ed575b50600019600383901b1c191690831b1790555b8660005260008652600260406000200192855192831161055b57610f89845461137c565b8181116110a7575b508690831160011461101757936106d293838060609895610ffe957fc4c1b9223fcebe5f35b9030d3df655018c40e88d70b8a3c63ed851c5d972210f9b9960009361100c575b501b916000199060031b1c19161790555b6040519586953387528601526060850190611357565b908382036040850152611357565b88015192508d610fd7565b601f9291921982169084600052876000209160005b818110611092575093837fc4c1b9223fcebe5f35b9030d3df655018c40e88d70b8a3c63ed851c5d972210f9997936106d29793610ffe9660609b9810611079575b5050811b019055610fe8565b87015160001960f88460031b161c191690558b8061106d565b8883015184559285019291890191890161102c565b84600052876000208280860160051c8201928a87106110e4575b0160051c019083905b8281106110d8575050610f91565b600081550183906110ca565b925081926110c1565b90508601518a610f52565b849250601f19821690846000528a6000209160005b8c828210611143575050831161112a575b5050811b019055610f65565b88015160001960f88460031b161c191690558a8061111e565b838c01518555889690940193928301920161110d565b82600052886000208680840160051c8201928b8510611196575b0160051c019084905b82811061118a575050610f3d565b6000815501849061117c565b92508192611173565b50604051630935e01b60e21b8152336004820152602081602481875afa908115610495576000916111d2575b5015610efc565b90506020813d602011611204575b816111ed60209383611258565b810103126100b0576111fe90611492565b846111cb565b3d91506111e0565b600435906001600160a01b03821682036100b057565b606081019081106001600160401b0382111761055b57604052565b602081019081106001600160401b0382111761055b57604052565b90601f801991011681019081106001600160401b0382111761055b57604052565b6001600160401b03811161055b57601f01601f191660200190565b81601f820112156100b0578035906112ab82611279565b926112b96040519485611258565b828452602083830101116100b057816000926020809301838601378301015290565b60606003198201126100b0576004356001600160a01b03811681036100b057916001600160401b036024358181116100b0578361131a91600401611294565b926044359182116100b05761133191600401611294565b90565b60005b8381106113475750506000910152565b8181015183820152602001611337565b9060209161137081518092818552858086019101611334565b601f01601f1916010190565b90600182811c921680156113ac575b602083101461139657565b634e487b7160e01b600052602260045260246000fd5b91607f169161138b565b906040519182600082546113c98161137c565b9081845260209460019160018116908160001461143957506001146113fa575b5050506113f892500383611258565b565b600090815285812095935091905b8183106114215750506113f893508201013880806113e9565b85548884018501529485019487945091830191611408565b925050506113f894925060ff191682840152151560051b8201013880806113e9565b91611484906114766113319593606086526060860190611357565b908482036020860152611357565b916040818403910152611357565b519081151582036100b057565b81601f820112156100b05780516114b581611279565b926114c36040519485611258565b818452602082840101116100b0576113319160208085019101611334565b906020828203126100b05781516001600160401b0381116100b057611331920161149f565b805115159082511515918080611659575b6115d75761158a575061153857506040516115318161123d565b6000815290565b611331603260405180937030b734b6b0ba34b7b72fbab936111d101160791b6020830152611570815180926020603186019101611334565b8101601160f91b6031820152036012810184520182611258565b915050611331602a60405180936834b6b0b3b2911d101160b91b60208301526115bd815180926020602986019101611334565b8101601160f91b602982015203600a810184520182611258565b506113319150603f906040519384916834b6b0b3b2911d101160b91b602084015261160c815180926020602987019101611334565b8201741116101130b734b6b0ba34b7b72fbab936111d101160591b6029820152611640825180936020603e85019101611334565b01601160f91b603e82015203601f810184520182611258565b5082611517565b61166990611832565b611331603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526116ac8151809260208686019101611334565b810103601d810184520182611258565b906116c682611279565b6116d36040519182611258565b82815280926116e4601f1991611279565b0190602036910137565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015611824575b506d04ee2d6d415b85acef810000000080831015611815575b50662386f26fc1000080831015611806575b506305f5e100808310156117f7575b50612710808310156117e8575b5060648210156117d8575b600a809210156117ce575b600190816021611786600187016116bc565b95860101905b611798575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156117c95791908261178c565b611791565b9160010191611774565b9190606460029104910191611769565b6004919392049101913861175e565b60089193920491019138611751565b60109193920491019138611742565b60209193920491019138611730565b604093508104915038611717565b80511561196f5760405161184581611222565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040820152815191600292600281018091116103a1576003908190046001600160fe1b03811681036103a1576118cc906002959492951b6116bc565b936020850193839284518501935b84811061191c575050505050600390510680600114611909576002146118fe575090565b603d90600019015390565b50603d9081600019820153600119015390565b8360049197929394959701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c1688010151888501531685010151868201530195939291906118da565b506040516115318161123d56fea26469706673582212207218d96f35e074d19750f74e21c887305cde345fa422fc7968d18f263d5ea10b64736f6c63430008190033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.