Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18365263 | 505 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x24E7Fe81...D83f138e1 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
EditionsMetadataRenderer
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "../../abstract/Initializable.sol"; import {IMetadataRenderer} from "../interface/IMetadataRenderer.sol"; import {IHolographDropERC721} from "../interface/IHolographDropERC721.sol"; import {ERC721Metadata} from "../../interface/ERC721Metadata.sol"; import {NFTMetadataRenderer} from "../utils/NFTMetadataRenderer.sol"; import {MetadataRenderAdminCheck} from "./MetadataRenderAdminCheck.sol"; import {Configuration} from "../struct/Configuration.sol"; interface DropConfigGetter { function config() external view returns (Configuration memory config); } /// @notice EditionsMetadataRenderer for editions support contract EditionsMetadataRenderer is Initializable, 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 Used internally to initialize the contract instead of through a constructor * @dev This function is called by the deployer/factory when creating a contract * @dev A blank init function is required to be able to call genesisDeriveFutureAddress to get the deterministic address * @dev Since no data is required to be intialized the selector is just returned and _setInitialized() does not need to be called */ function init(bytes memory /* initPayload */) external pure override returns (bytes4) { return InitializableInterface.init.selector; } /// @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 data data to init with function initializeWithData(bytes memory data) external { // data format: description, imageURI, animationURI (string memory description, string memory imageURI, string memory animationURI) = abi.decode( data, (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]; Configuration memory config = DropConfigGetter(target).config(); return NFTMetadataRenderer.encodeContractURIJSON({ name: ERC721Metadata(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) external view override returns (string memory) { address target = msg.sender; TokenEditionInfo memory info = tokenInfos[target]; IHolographDropERC721 media = IHolographDropERC721(target); uint256 maxSupply = media.saleDetails().maxSupply; // For open editions, set max supply to 0 for renderer to remove the edition max number // This will be added back on once the open edition is "finalized" if (maxSupply == type(uint64).max) { maxSupply = 0; } return NFTMetadataRenderer.createMetadataEdition({ name: ERC721Metadata(target).name(), description: info.description, imageURI: info.imageURI, animationURI: info.animationURI, tokenOfEdition: tokenId, editionSize: maxSupply }); } }
// SPDX-License-Identifier: UNLICENSED /* ┌───────────┐ │ HOLOGRAPH │ └───────────┘ ╔═════════════════════════════════════════════════════════════╗ ║ ║ ║ / ^ \ ║ ║ ~~*~~ ¸ ║ ║ [ '<>:<>' ] │░░░ ║ ║ ╔╗ _/"\_ ╔╣ ║ ║ ┌─╬╬─┐ """ ┌─╬╬─┐ ║ ║ ┌─┬┘ ╠╣ └┬─┐ \_/ ┌─┬┘ ╠╣ └┬─┐ ║ ║ ┌─┬┘ │ ╠╣ │ └┬─┐ ┌─┬┘ │ ╠╣ │ └┬─┐ ║ ║ ┌─┬┘ │ │ ╠╣ │ │ └┬─┐ ┌─┬┘ │ │ ╠╣ │ │ └┬─┐ ║ ║ ┌─┬┘ │ │ │ ╠╣ │ │ │ └┬┐ ┌┬┘ │ │ │ ╠╣ │ │ │ └┬─┐ ║ ╠┬┘ │ │ │ │ ╠╣ │ │ │ │└¤┘│ │ │ │ ╠╣ │ │ │ │ └┬╣ ║│ │ │ │ │ ╠╣ │ │ │ │ │ │ │ │ ╠╣ │ │ │ │ │║ ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣ ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣ ║ ╠╣ ╠╣ ║ ║ ╠╣ ╠╣ ║ ║ , ╠╣ , ,' * ╠╣ ║ ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║ ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝ - one protocol, one bridge = infinite possibilities - *************************************************************** DISCLAIMER: U.S Patent Pending LICENSE: Holograph Limited Public License (H-LPL) https://holograph.xyz/licenses/h-lpl/1.0.0 This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, you are not permitted to use the software. 1. Definitions The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. A "contribution" is the original software, or any additions or changes to the software. A "contributor" is any person that distributes its contribution under this license. "Licensed patents" are a contributor’s patent claims that read directly on its contribution. 2. Grant of Rights A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in sections 3 and 4, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. 3. Conditions and Limitations A) No Trademark License- This license does not grant you rights to use any contributors’ name, logo, or trademarks. B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor is terminated with immediate effect. C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. E) The software is licensed “as-is.” You bear all risks of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude all implied warranties, including those of merchantability, fitness for a particular purpose and non-infringement. 4. (F) Platform Limitation- The licenses granted in sections 2.A & 2.B extend only to the software or derivative works that you create that run on a Holograph system product. *************************************************************** */ pragma solidity 0.8.13; import "../interface/InitializableInterface.sol"; /** * @title Initializable * @author https://github.com/holographxyz * @notice Use init instead of constructor * @dev This allows for use of init function to make one time initializations without the need for a constructor */ abstract contract Initializable is InitializableInterface { /** * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1) */ bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01; /** * @dev Constructor is left empty and init is used instead */ constructor() {} /** * @notice Used internally to initialize the contract instead of through a constructor * @dev This function is called by the deployer/factory when creating a contract * @param initPayload abi encoded payload to use for contract initilaization */ function init(bytes memory initPayload) external virtual returns (bytes4); function _isInitialized() internal view returns (bool initialized) { assembly { initialized := sload(_initializedSlot) } } function _setInitialized() internal { assembly { sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import {IMetadataRenderer} from "./IMetadataRenderer.sol"; import {AddressMintDetails} from "../struct/AddressMintDetails.sol"; import {SaleDetails} from "../struct/SaleDetails.sol"; /// @notice Interface for HOLOGRAPH Drops contract interface IHolographDropERC721 { // 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 Mint fee send failure error MintFee_FundsSendFailure(); /// @notice Call to external metadata renderer failed. error ExternalMetadataRenderer_CallFailed(); /// @notice Thrown when the operator for the contract is not allowed /// @dev Used when strict enforcement of marketplaces for creator royalties is desired. error OperatorNotAllowed(address operator); /// @notice Thrown when there is no active market filter DAO address supported for the current chain /// @dev Used for enabling and disabling filter for the given chain. error MarketFilterDAOAddressNotSupportedForChain(); /// @notice Used when the operator filter registry external call fails /// @dev Used for bubbling error up to clients. error RemoteOperatorFilterRegistryCallFailed(); // Sale/Purchase errors /// @notice Sale is inactive error Sale_Inactive(); /// @notice Presale is inactive error Presale_Inactive(); /// @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(); // Admin errors /// @notice Royalty percentage too high error Setup_RoyaltyPercentageTooHigh(uint16 maxRoyaltyBPS); /// @notice Invalid admin upgrade address error Admin_InvalidUpgradeAddress(address proposedAddress); /// @notice Unable to finalize an edition not marked as open (size set to uint64_max_value) error Admin_UnableToFinalizeNotOpenEdition(); /// @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 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) event Sale( address indexed to, uint256 indexed quantity, uint256 indexed pricePerToken, uint256 firstPurchasedTokenId ); /// @notice Sales configuration has been changed /// @dev To access new sales configuration, use getter function. /// @param changedBy Changed by user event SalesConfigChanged(address indexed changedBy); /// @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 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 Admin function to update the sales configuration settings /// @param publicSalePrice public sale price in ether /// @param maxSalePurchasePerAddress Max # of purchases (public) per address allowed /// @param publicSaleStart unix timestamp when the public sale starts /// @param publicSaleEnd unix timestamp when the public sale ends (set to 0 to disable) /// @param presaleStart unix timestamp when the presale starts /// @param presaleEnd unix timestamp when the presale ends /// @param presaleMerkleRoot merkle root for the presale information function setSaleConfiguration( uint104 publicSalePrice, uint32 maxSalePurchasePerAddress, uint64 publicSaleStart, uint64 publicSaleEnd, uint64 presaleStart, uint64 presaleEnd, bytes32 presaleMerkleRoot ) external; /// @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 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 quantity, uint256 maxQuantity, uint256 pricePerToken, bytes32[] memory merkleProof ) external payable returns (uint256); /// @notice Function to return the global sales details for the given drop function saleDetails() external view returns (SaleDetails memory); /// @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 Update the metadata renderer /// @param newRenderer new address for renderer /// @param setupRenderer data to call to bootstrap data for the new renderer (optional) function setMetadataRenderer(IMetadataRenderer newRenderer, bytes memory setupRenderer) 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 pragma solidity 0.8.13; interface IMetadataRenderer { function tokenURI(uint256) external view returns (string memory); function contractURI() external view returns (string memory); function initializeWithData(bytes memory initData) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import {IHolographDropERC721} from "../interface/IHolographDropERC721.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 && !IHolographDropERC721(target).isAdmin(msg.sender)) { revert Access_OnlyAdmin(); } _; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /// @notice Return type of specific mint counts and details per address struct AddressMintDetails { /// Number of total mints from the given address uint256 totalMints; /// Number of presale mints from the given address uint256 presaleMints; /// Number of public mints from the given address uint256 publicMints; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import {IMetadataRenderer} from "../interface/IMetadataRenderer.sol"; /// @notice General configuration for NFT Minting and bookkeeping struct Configuration { /// @dev Metadata renderer (uint160) IMetadataRenderer metadataRenderer; /// @dev Total size of edition that can be minted (uint160+64 = 224) uint64 editionSize; /// @dev Royalty amount in bps (uint224+16 = 240) uint16 royaltyBPS; /// @dev Funds recipient for sale (new slot, uint160) address payable fundsRecipient; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /// @notice Return value for sales details to use with front-ends struct SaleDetails { // Synthesized status variables for sale and presale bool publicSaleActive; bool presaleActive; // Price for public sale uint256 publicSalePrice; // Timed sale actions for public sale uint64 publicSaleStart; uint64 publicSaleEnd; // Timed sale actions for presale uint64 presaleStart; uint64 presaleEnd; // Merkle root (includes address, quantity, and price data for each entry) bytes32 presaleMerkleRoot; // Limit public sale to a specific number of mints per wallet uint256 maxSalePurchasePerAddress; // Information about the rest of the supply // Total that have been minted uint256 totalMinted; // The total supply available uint256 maxSupply; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; 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); } } } 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 `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); } } 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; } } /// NFT metadata library for rendering metadata associated with editions library NFTMetadataRenderer { /// Generate edition 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 tokenOfEdition Token ID for specific token /// @param editionSize Size of entire edition to show function createMetadataEdition( string memory name, string memory description, string memory imageURI, string memory animationURI, uint256 tokenOfEdition, uint256 editionSize ) internal pure returns (string memory) { string memory _tokenMediaData = tokenMediaData(imageURI, animationURI); bytes memory json = createMetadataJSON(name, description, _tokenMediaData, tokenOfEdition, editionSize); return encodeMetadataJSON(json); } 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, '"}' ) ) ); } /// 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 tokenOfEdition Token ID for specific token /// @param editionSize Size of entire edition to show function createMetadataJSON( string memory name, string memory description, string memory mediaData, uint256 tokenOfEdition, uint256 editionSize ) internal pure returns (bytes memory) { bytes memory editionSizeText; if (editionSize > 0) { editionSizeText = abi.encodePacked("/", Strings.toString(editionSize)); } return abi.encodePacked( '{"name": "', name, " ", Strings.toString(tokenOfEdition), editionSizeText, '", "', 'description": "', description, '", "', mediaData, 'properties": {"number": ', Strings.toString(tokenOfEdition), ', "name": "', name, '"}}' ); } /// 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: UNLICENSED pragma solidity 0.8.13; /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. /* is ERC721 */ interface ERC721Metadata { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string memory _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string memory _symbol); /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string memory); }
// SPDX-License-Identifier: UNLICENSED /* ┌───────────┐ │ HOLOGRAPH │ └───────────┘ ╔═════════════════════════════════════════════════════════════╗ ║ ║ ║ / ^ \ ║ ║ ~~*~~ ¸ ║ ║ [ '<>:<>' ] │░░░ ║ ║ ╔╗ _/"\_ ╔╣ ║ ║ ┌─╬╬─┐ """ ┌─╬╬─┐ ║ ║ ┌─┬┘ ╠╣ └┬─┐ \_/ ┌─┬┘ ╠╣ └┬─┐ ║ ║ ┌─┬┘ │ ╠╣ │ └┬─┐ ┌─┬┘ │ ╠╣ │ └┬─┐ ║ ║ ┌─┬┘ │ │ ╠╣ │ │ └┬─┐ ┌─┬┘ │ │ ╠╣ │ │ └┬─┐ ║ ║ ┌─┬┘ │ │ │ ╠╣ │ │ │ └┬┐ ┌┬┘ │ │ │ ╠╣ │ │ │ └┬─┐ ║ ╠┬┘ │ │ │ │ ╠╣ │ │ │ │└¤┘│ │ │ │ ╠╣ │ │ │ │ └┬╣ ║│ │ │ │ │ ╠╣ │ │ │ │ │ │ │ │ ╠╣ │ │ │ │ │║ ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣ ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣ ║ ╠╣ ╠╣ ║ ║ ╠╣ ╠╣ ║ ║ , ╠╣ , ,' * ╠╣ ║ ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║ ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝ - one protocol, one bridge = infinite possibilities - *************************************************************** DISCLAIMER: U.S Patent Pending LICENSE: Holograph Limited Public License (H-LPL) https://holograph.xyz/licenses/h-lpl/1.0.0 This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, you are not permitted to use the software. 1. Definitions The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. A "contribution" is the original software, or any additions or changes to the software. A "contributor" is any person that distributes its contribution under this license. "Licensed patents" are a contributor’s patent claims that read directly on its contribution. 2. Grant of Rights A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in sections 3 and 4, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. 3. Conditions and Limitations A) No Trademark License- This license does not grant you rights to use any contributors’ name, logo, or trademarks. B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor is terminated with immediate effect. C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. E) The software is licensed “as-is.” You bear all risks of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude all implied warranties, including those of merchantability, fitness for a particular purpose and non-infringement. 4. (F) Platform Limitation- The licenses granted in sections 2.A & 2.B extend only to the software or derivative works that you create that run on a Holograph system product. *************************************************************** */ pragma solidity 0.8.13; /** * @title Initializable * @author https://github.com/holographxyz * @notice Use init instead of constructor * @dev This allows for use of init function to make one time initializations without the need of a constructor */ interface InitializableInterface { /** * @notice Used internally to initialize the contract instead of through a constructor * @dev This function is called by the deployer/factory when creating a contract * @param initPayload abi encoded payload to use for contract initilaization */ function init(bytes memory initPayload) external returns (bytes4); }
{ "optimizer": { "enabled": true, "runs": 999999 }, "metadata": { "bytecodeHash": "none", "useLiteralContent": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "erc721a-upgradeable/=erc721a-upgradeable/", "forge-std/=lib/forge-std/src/" ], "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","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"}],"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"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80638bbb2cf21161005b5780638bbb2cf214610113578063ba46ae7214610126578063c87b56dd14610148578063e8a3d4851461016857600080fd5b80632f17b8f0146100825780634ddf47d414610097578063856a7ffa14610100575b600080fd5b6100956100903660046116c8565b610170565b005b6100ca6100a536600461173e565b507f4ddf47d40000000000000000000000000000000000000000000000000000000090565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61009561010e36600461173e565b610327565b61009561012136600461178f565b6103f6565b6101396101343660046117df565b610569565b6040516100f793929190611876565b61015b6101563660046118af565b610723565b6040516100f791906118c8565b61015b610a55565b8273ffffffffffffffffffffffffffffffffffffffff8116331480159061022257506040517f24d7806c00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8216906324d7806c90602401602060405180830381865afa1580156101fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022091906118f0565b155b15610259576040517f02bd6bd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152602081815260409091208451610293926001909201918601906114be565b5073ffffffffffffffffffffffffffffffffffffffff841660009081526020818152604090912083516102ce926002909201918501906114be565b508373ffffffffffffffffffffffffffffffffffffffff167fc4c1b9223fcebe5f35b9030d3df655018c40e88d70b8a3c63ed851c5d972210f3385856040516103199392919061190b565b60405180910390a250505050565b6000806000838060200190518101906103409190611991565b604080516060810182528481526020808201859052818301849052336000908152808252929092208151805196995094975092955093919261038892849291909101906114be565b5060208281015180516103a192600185019201906114be565b50604082015180516103bd9160028401916020909101906114be565b50506040513391507ff889a5cdc62274389379cbfade0f225b1d30b7395177fd6aeaab61662b1c6edf9061031990869086908690611876565b8173ffffffffffffffffffffffffffffffffffffffff811633148015906104a857506040517f24d7806c00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8216906324d7806c90602401602060405180830381865afa158015610482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a691906118f0565b155b156104df576040517f02bd6bd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081815260409091208351610513928501906114be565b508273ffffffffffffffffffffffffffffffffffffffff167f36195b44a3184513e02477929207751ea9d67026b917ed74d374a7f9e8c5e4d1338460405161055c929190611a0f565b60405180910390a2505050565b60006020819052908152604090208054819061058490611a3e565b80601f01602080910402602001604051908101604052809291908181526020018280546105b090611a3e565b80156105fd5780601f106105d2576101008083540402835291602001916105fd565b820191906000526020600020905b8154815290600101906020018083116105e057829003601f168201915b50505050509080600101805461061290611a3e565b80601f016020809104026020016040519081016040528092919081815260200182805461063e90611a3e565b801561068b5780601f106106605761010080835404028352916020019161068b565b820191906000526020600020905b81548152906001019060200180831161066e57829003601f168201915b5050505050908060020180546106a090611a3e565b80601f01602080910402602001604051908101604052809291908181526020018280546106cc90611a3e565b80156107195780601f106106ee57610100808354040283529160200191610719565b820191906000526020600020905b8154815290600101906020018083116106fc57829003601f168201915b5050505050905083565b33600081815260208190526040808220815160608181019093528154929493929091908290829061075390611a3e565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90611a3e565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b505050505081526020016001820180546107e590611a3e565b80601f016020809104026020016040519081016040528092919081815260200182805461081190611a3e565b801561085e5780601f106108335761010080835404028352916020019161085e565b820191906000526020600020905b81548152906001019060200180831161084157829003601f168201915b5050505050815260200160028201805461087790611a3e565b80601f01602080910402602001604051908101604052809291908181526020018280546108a390611a3e565b80156108f05780601f106108c5576101008083540402835291602001916108f0565b820191906000526020600020905b8154815290600101906020018083116108d357829003601f168201915b5050505050815250509050600082905060008173ffffffffffffffffffffffffffffffffffffffff16633474a4a66040518163ffffffff1660e01b815260040161016060405180830381865afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109729190611aa9565b610140015190507fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000181016109a4575060005b610a4b8473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109f2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a389190810190611b62565b8451602086015160408701518a86610d39565b9695505050505050565b3360008181526020819052604080822081517f79502c55000000000000000000000000000000000000000000000000000000008152915160609493919284916379502c55916004808201926080929091908290030181865afa158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae39190611b97565b9050610d318373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b33573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b799190810190611b62565b83548490610b8690611a3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb290611a3e565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b5050505050846001018054610c1390611a3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90611a3e565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050856002018054610ca090611a3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccc90611a3e565b8015610d195780601f10610cee57610100808354040283529160200191610d19565b820191906000526020600020905b815481529060010190602001808311610cfc57829003601f168201915b5050505050856040015161ffff168660600151610d70565b935050505090565b60606000610d478686610e40565b90506000610d588989848888610ed0565b9050610d6381610f4c565b9998505050505050505050565b60408051602081019091526000815284516060919015610dad5785604051602001610d9b9190611c3d565b60405160208183030381529060405290505b604080516020810190915260008152855115610de65785604051602001610dd49190611c82565b60405160208183030381529060405290505b610d638989610df488610f7d565b610e158873ffffffffffffffffffffffffffffffffffffffff16601461103b565b8686604051602001610e2c96959493929190611cc7565b604051602081830303815290604052610f4c565b81518151606091158015911515908290610e575750805b15610e87578484604051602001610e6f929190611e21565b60405160208183030381529060405292505050610eca565b8115610e9e5784604051602001610e6f9190611ecc565b8015610eb55783604051602001610e6f9190611f38565b60405180602001604052806000815250925050505b92915050565b6060808215610f0457610ee283610f7d565b604051602001610ef29190611fa4565b60405160208183030381529060405290505b86610f0e85610f7d565b828888610f1a89610f7d565b8c604051602001610f319796959493929190611fe9565b60405160208183030381529060405291505095945050505050565b6060610f5782611289565b604051602001610f679190612193565b6040516020818303038152906040529050919050565b60606000610f8a836113dc565b600101905060008167ffffffffffffffff811115610faa57610faa61157c565b6040519080825280601f01601f191660200182016040528015610fd4576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610fde57509392505050565b6060600061104a836002612207565b611055906002612244565b67ffffffffffffffff81111561106d5761106d61157c565b6040519080825280601f01601f191660200182016040528015611097576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106110ce576110ce61225c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106111315761113161225c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061116d846002612207565b611178906001612244565b90505b6001811115611215577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106111b9576111b961225c565b1a60f81b8282815181106111cf576111cf61225c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361120e8161228b565b905061117b565b508315611282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640160405180910390fd5b9392505050565b606081516000036112a857505060408051602081019091526000815290565b60006040518060600160405280604081526020016122fc60409139905060006003845160026112d79190612244565b6112e191906122c0565b6112ec906004612207565b67ffffffffffffffff8111156113045761130461157c565b6040519080825280601f01601f19166020018201604052801561132e576020820181803683370190505b509050600182016020820185865187015b8082101561139a576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061133f565b50506003865106600181146113b657600281146113c9576113d1565b603d6001830353603d60028303536113d1565b603d60018303535b509195945050505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611425577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611451576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061146f57662386f26fc10000830492506010015b6305f5e1008310611487576305f5e100830492506008015b612710831061149b57612710830492506004015b606483106114ad576064830492506002015b600a8310610eca5760010192915050565b8280546114ca90611a3e565b90600052602060002090601f0160209004810192826114ec5760008555611532565b82601f1061150557805160ff1916838001178555611532565b82800160010185558215611532579182015b82811115611532578251825591602001919060010190611517565b5061153e929150611542565b5090565b5b8082111561153e5760008155600101611543565b73ffffffffffffffffffffffffffffffffffffffff8116811461157957600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610160810167ffffffffffffffff811182821017156115cf576115cf61157c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561161c5761161c61157c565b604052919050565b600067ffffffffffffffff82111561163e5761163e61157c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061167d61167884611624565b6115d5565b905082815283838301111561169157600080fd5b828260208301376000602084830101529392505050565b600082601f8301126116b957600080fd5b6112828383356020850161166a565b6000806000606084860312156116dd57600080fd5b83356116e881611557565b9250602084013567ffffffffffffffff8082111561170557600080fd5b611711878388016116a8565b9350604086013591508082111561172757600080fd5b50611734868287016116a8565b9150509250925092565b60006020828403121561175057600080fd5b813567ffffffffffffffff81111561176757600080fd5b8201601f8101841361177857600080fd5b6117878482356020840161166a565b949350505050565b600080604083850312156117a257600080fd5b82356117ad81611557565b9150602083013567ffffffffffffffff8111156117c957600080fd5b6117d5858286016116a8565b9150509250929050565b6000602082840312156117f157600080fd5b813561128281611557565b60005b838110156118175781810151838201526020016117ff565b83811115611826576000848401525b50505050565b600081518084526118448160208601602086016117fc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081526000611889606083018661182c565b828103602084015261189b818661182c565b90508281036040840152610a4b818561182c565b6000602082840312156118c157600080fd5b5035919050565b602081526000611282602083018461182c565b805180151581146118eb57600080fd5b919050565b60006020828403121561190257600080fd5b611282826118db565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061193a606083018561182c565b8281036040840152610a4b818561182c565b600082601f83011261195d57600080fd5b815161196b61167882611624565b81815284602083860101111561198057600080fd5b6117878260208301602087016117fc565b6000806000606084860312156119a657600080fd5b835167ffffffffffffffff808211156119be57600080fd5b6119ca8783880161194c565b945060208601519150808211156119e057600080fd5b6119ec8783880161194c565b93506040860151915080821115611a0257600080fd5b506117348682870161194c565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611787604083018461182c565b600181811c90821680611a5257607f821691505b602082108103611a8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b805167ffffffffffffffff811681146118eb57600080fd5b60006101608284031215611abc57600080fd5b611ac46115ab565b611acd836118db565b8152611adb602084016118db565b602082015260408301516040820152611af660608401611a91565b6060820152611b0760808401611a91565b6080820152611b1860a08401611a91565b60a0820152611b2960c08401611a91565b60c082015260e0838101519082015261010080840151908201526101208084015190820152610140928301519281019290925250919050565b600060208284031215611b7457600080fd5b815167ffffffffffffffff811115611b8b57600080fd5b6117878482850161194c565b600060808284031215611ba957600080fd5b6040516080810181811067ffffffffffffffff82111715611bcc57611bcc61157c565b6040528251611bda81611557565b8152611be860208401611a91565b6020820152604083015161ffff81168114611c0257600080fd5b60408201526060830151611c1581611557565b60608201529392505050565b60008151611c338185602086016117fc565b9290920192915050565b7f222c2022696d616765223a202200000000000000000000000000000000000000815260008251611c7581600d8501602087016117fc565b91909101600d0192915050565b7f222c2022616e696d6174696f6e5f75726c223a20220000000000000000000000815260008251611cba8160158501602087016117fc565b9190910160150192915050565b7f7b226e616d65223a2022000000000000000000000000000000000000000000008152600087516020611d0082600a8601838d016117fc565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600a928501928301528851611d3c81601d8501848d016117fc565b7f222c202273656c6c65725f6665655f62617369735f706f696e7473223a200000601d93909101928301528751611d7981603b8501848c016117fc565b7f2c20226665655f726563697069656e74223a2022000000000000000000000000603b93909101928301528651611db681604f8501848b016117fc565b8651920191611dcb81604f8501848a016117fc565b8551920191611de081604f85018489016117fc565b611e12604f828501017f227d000000000000000000000000000000000000000000000000000000000000815260020190565b9b9a5050505050505050505050565b7f696d616765223a20220000000000000000000000000000000000000000000000815260008351611e598160098501602088016117fc565b7f222c2022616e696d6174696f6e5f75726c223a202200000000000000000000006009918401918201528351611e9681601e8401602088016117fc565b7f222c202200000000000000000000000000000000000000000000000000000000601e9290910191820152602201949350505050565b7f696d616765223a20220000000000000000000000000000000000000000000000815260008251611f048160098501602087016117fc565b7f222c2022000000000000000000000000000000000000000000000000000000006009939091019283015250600d01919050565b7f616e696d6174696f6e5f75726c223a2022000000000000000000000000000000815260008251611f708160118501602087016117fc565b7f222c2022000000000000000000000000000000000000000000000000000000006011939091019283015250601501919050565b7f2f00000000000000000000000000000000000000000000000000000000000000815260008251611fdc8160018501602087016117fc565b9190910160010192915050565b7f7b226e616d65223a20220000000000000000000000000000000000000000000081526000885161202181600a850160208d016117fc565b7f2000000000000000000000000000000000000000000000000000000000000000600a91840191820152885161205e81600b840160208d016117fc565b885191019061207481600b840160208c016117fc565b8082019150507f222c20220000000000000000000000000000000000000000000000000000000080600b8301527f6465736372697074696f6e223a20220000000000000000000000000000000000600f83015287516120da81601e850160208c016117fc565b601e92019182015261218561215c61215661212d6121276120fe602287018c611c21565b7f70726f70657274696573223a207b226e756d626572223a200000000000000000815260180190565b89611c21565b7f2c20226e616d65223a20220000000000000000000000000000000000000000008152600b0190565b86611c21565b7f227d7d0000000000000000000000000000000000000000000000000000000000815260030190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516121cb81601d8501602087016117fc565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561223f5761223f6121d8565b500290565b60008219821115612257576122576121d8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008161229a5761229a6121d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b6000826122f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa164736f6c634300080d000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.