diff --git a/index.html b/index.html
index ce3b859b..6bb70605 100644
--- a/index.html
+++ b/index.html
@@ -6,7 +6,7 @@
diff --git a/resources/js/config.js b/resources/js/config.js
index ed72d6bf..c1a3e05e 100644
--- a/resources/js/config.js
+++ b/resources/js/config.js
@@ -1 +1 @@
-var __DOCS_CONFIG__ = {"id":"ZCONQhKL0j9OTSw9Zvq4ujteecqUL15124H","key":"e5bL2ZdG/YqNqjbRy8ggWeOCmEESD70wo1mqs1TGRCs.FejEvXhp6w6b3e7JwUFA4hWa78H09qLBmT56pcXcTlUD7caTimVNfV2wuxNZZnl3WsNPdJrvpYNKQyogD+ip7w.300075","base":"/","host":"docs.artblocks.io","version":"1.0.0","useRelativePaths":true,"documentName":"index.html","appendDocumentName":false,"trailingSlash":true,"preloadSearch":false,"cacheBustingToken":"3.5.0.761767859866","cacheBustingStrategy":"query","sidebarFilterPlaceholder":"Filter","toolbarFilterPlaceholder":"Filter","showSidebarFilter":true,"filterNotFoundMsg":"No member names found containing the query \"{query}\"","maxHistoryItems":15,"homeIcon":"
","access":[{"value":"public","label":"Public"},{"value":"protected","label":"Protected"}],"toolbarLinks":[{"id":"fields","label":"Fields"},{"id":"properties","label":"Properties"},{"id":"methods","label":"Methods"},{"id":"events","label":"Events"}],"sidebar":[{"n":"/","l":"Welcome","s":"
"},{"n":"/creator-docs/art-blocks-101","l":"Art Blocks 101","c":false,"o":true,"i":[{"n":"on-chain","l":"NFT Metadata Storage at Art Blocks"}]},{"n":"/creator-docs/art-blocks-engine-onboarding","l":"Art Blocks Engine Onboarding","c":false,"o":true,"i":[{"n":"art-blocks-engine-101","l":"Art Blocks Engine 101","i":[{"n":"what-is-art-blocks-engine","l":"What is Art Blocks Engine and Engine Flex?"},{"n":"engine-partner-onboarding-steps","l":"Engine Partner Onboarding Steps"},{"n":"engine-project-launch","l":"Engine Project Deployment and Launch Guide"},{"n":"engine-opensea-setup","l":"Art Blocks Engine OpenSea Setup"},{"n":"engine-royalty-registry-setup-(v2-only)","l":"Art Blocks Engine Royalty Registry Setup (V2 contracts only)"},{"n":"embroidery-on-art-blocks-engine","l":"Embroidery on Art Blocks Engine"},{"n":"mobile-minter","l":"Mobile Minting for In-Person Activations"},{"n":"ipfs-setup","l":"Using Pinata for External Assets"},{"n":"filebase-ipfs","l":"Using Filebase for External Assets"},{"n":"faqs","l":"FAQs"},{"n":"engine-technical-details","l":"Art Blocks Engine Flex Technical Details"},{"n":"custom-dashboard-mutations","l":"Common Custom Dashboard Mutations"},{"n":"minter-suite-migration-runbook","l":"Minter Suite Migration Runbook"}]}],"s":"
"},{"n":"/creator-docs/creator-onboarding","l":"Creator Onboarding","c":false,"i":[{"n":"readme","l":"Art Blocks 101 for Creators","i":[{"n":"artist-onboarding-steps","l":"Artist onboarding steps"},{"n":"best-practices","l":"Best practices"},{"n":"project-form-fields-guide","l":"Project Form Fields Guide"},{"n":"minter-suite","l":"Minter Suite"},{"n":"features","l":"Art Blocks Features Script"},{"n":"faqs","l":"FAQs"},{"n":"opensea-personalization","l":"OpenSea Personalization"},{"n":"charitable-donations","l":"Charitable Donation Information"},{"n":"community-agreements","l":"Community Agreements"},{"n":"discord","l":"Discord"},{"n":"marketing101","l":"Marketing 101"},{"n":"project-pricing-model","l":"Project Pricing: Dutch Auction Settings"}]},{"n":"testnet-checklist","l":"Staging Shell Checklist"},{"n":"curated-checklist","l":"Checklist for Curated Projects"},{"n":"presents","l":"Checklist for Presents Projects"}],"s":"
"},{"n":"/creator-docs/minter-suite","l":"Minter Suite","c":false,"o":true,"i":[{"n":"minting-philosophy","l":"Minting Philosophy"},{"n":"shared-minter-suite","l":"Shared Minter Suite"},{"n":"custom-minters","l":"Custom, One-Off Minters"},{"n":"minter-suite-supplemental","l":"Minter Suite Supplemental Information"}]},{"n":"/creator-docs/art-blocks-api","l":"Art Blocks API","c":false,"o":true,"i":[{"n":"api-overview","l":"API Overview"},{"n":"artblocks-viewer","l":"Artblocks Viewer"},{"n":"queries","l":"Querying and API Overview"},{"n":"entities","l":"Subgraph Entities"}],"s":"
"}],"search":{"mode":0,"minChars":2,"maxResults":20,"placeholder":"Search","hotkeys":["k"],"noResultsFoundMsg":"Sorry, no results found.","recognizeLanguages":true,"languages":[0],"preload":false},"resources":{"History_Title_Label":"History","History_ClearLink_Label":"Clear","History_NoHistory_Label":"No history items","API_AccessFilter_Label":"Access","API_ParameterSection_Label":"PARAMETERS","API_SignatureSection_Label":"SIGNATURE","API_CopyHint_Label":"Copy","API_CopyNameHint_Label":"Copy name","API_CopyLinkHint_Label":"Copy link","API_CopiedAckHint_Label":"Copied!","API_MoreOverloads_Label":"more","API_MoreDropdownItems_Label":"More","API_OptionalParameter_Label":"optional","API_DefaultParameterValue_Label":"Default value","API_InheritedFilter_Label":"Inherited","Search_Input_Placeholder":"Search","Toc_Contents_Label":"Contents","Toc_RelatedClasses_Label":"Related Classes","History_JustNowTime_Label":"just now","History_AgoTime_Label":"ago","History_YearTime_Label":"y","History_MonthTime_Label":"mo","History_DayTime_Label":"d","History_HourTime_Label":"h","History_MinuteTime_Label":"m","History_SecondTime_Label":"s"}};
+var __DOCS_CONFIG__ = {"id":"151bDA5QshmJMQEMtu+CzFMV0tyTCoVFUcK","key":"z9DJ2tdRZQOo/RNs5IAlTf8rC79FGrBt/zi5zcoQ3KI.EE1x+hNp3zPjzDdbnyTcwUnWfXt1tap4sBgDlzplpdW2kZTqAT3CP3TzUAw2cqNwlZTr8omND5x/ujWI60HA/Q.300091","base":"/","host":"docs.artblocks.io","version":"1.0.0","useRelativePaths":true,"documentName":"index.html","appendDocumentName":false,"trailingSlash":true,"preloadSearch":false,"cacheBustingToken":"3.5.0.762521338803","cacheBustingStrategy":"query","sidebarFilterPlaceholder":"Filter","toolbarFilterPlaceholder":"Filter","showSidebarFilter":true,"filterNotFoundMsg":"No member names found containing the query \"{query}\"","maxHistoryItems":15,"homeIcon":"
","access":[{"value":"public","label":"Public"},{"value":"protected","label":"Protected"}],"toolbarLinks":[{"id":"fields","label":"Fields"},{"id":"properties","label":"Properties"},{"id":"methods","label":"Methods"},{"id":"events","label":"Events"}],"sidebar":[{"n":"/","l":"Welcome","s":"
"},{"n":"/creator-docs/art-blocks-101","l":"Art Blocks 101","c":false,"o":true,"i":[{"n":"on-chain","l":"NFT Metadata Storage at Art Blocks"}]},{"n":"/creator-docs/art-blocks-engine-onboarding","l":"Art Blocks Engine Onboarding","c":false,"o":true,"i":[{"n":"art-blocks-engine-101","l":"Art Blocks Engine 101","i":[{"n":"what-is-art-blocks-engine","l":"What is Art Blocks Engine and Engine Flex?"},{"n":"engine-partner-onboarding-steps","l":"Engine Partner Onboarding Steps"},{"n":"engine-project-launch","l":"Engine Project Deployment and Launch Guide"},{"n":"engine-opensea-setup","l":"Art Blocks Engine OpenSea Setup"},{"n":"engine-royalty-registry-setup-(v2-only)","l":"Art Blocks Engine Royalty Registry Setup (V2 contracts only)"},{"n":"embroidery-on-art-blocks-engine","l":"Embroidery on Art Blocks Engine"},{"n":"mobile-minter","l":"Mobile Minting for In-Person Activations"},{"n":"ipfs-setup","l":"Using Pinata for External Assets"},{"n":"filebase-ipfs","l":"Using Filebase for External Assets"},{"n":"faqs","l":"FAQs"},{"n":"engine-technical-details","l":"Art Blocks Engine Flex Technical Details"},{"n":"custom-dashboard-mutations","l":"Common Custom Dashboard Mutations"},{"n":"minter-suite-migration-runbook","l":"Minter Suite Migration Runbook"}]}],"s":"
"},{"n":"/creator-docs/creator-onboarding","l":"Creator Onboarding","c":false,"i":[{"n":"readme","l":"Art Blocks 101 for Creators","i":[{"n":"artist-onboarding-steps","l":"Artist onboarding steps"},{"n":"best-practices","l":"Best practices"},{"n":"project-form-fields-guide","l":"Project Form Fields Guide"},{"n":"minter-suite","l":"Minter Suite"},{"n":"features","l":"Art Blocks Features Script"},{"n":"faqs","l":"FAQs"},{"n":"opensea-personalization","l":"OpenSea Personalization"},{"n":"charitable-donations","l":"Charitable Donation Information"},{"n":"community-agreements","l":"Community Agreements"},{"n":"discord","l":"Discord"},{"n":"marketing101","l":"Marketing 101"},{"n":"project-pricing-model","l":"Project Pricing: Dutch Auction Settings"}]},{"n":"testnet-checklist","l":"Staging Shell Checklist"},{"n":"curated-checklist","l":"Checklist for Curated Projects"},{"n":"presents","l":"Checklist for Presents Projects"}],"s":"
"},{"n":"/creator-docs/minter-suite","l":"Minter Suite","c":false,"o":true,"i":[{"n":"minting-philosophy","l":"Minting Philosophy"},{"n":"shared-minter-suite","l":"Shared Minter Suite"},{"n":"custom-minters","l":"Custom, One-Off Minters"},{"n":"minter-suite-supplemental","l":"Minter Suite Supplemental Information"}]},{"n":"/creator-docs/art-blocks-api","l":"Art Blocks API","c":false,"o":true,"i":[{"n":"api-overview","l":"API Overview"},{"n":"artblocks-viewer","l":"Artblocks Viewer"},{"n":"queries","l":"Querying and API Overview"},{"n":"entities","l":"Subgraph Entities"}],"s":"
"}],"search":{"mode":0,"minChars":2,"maxResults":20,"placeholder":"Search","hotkeys":["k"],"noResultsFoundMsg":"Sorry, no results found.","recognizeLanguages":true,"languages":[0],"preload":false},"resources":{"History_Title_Label":"History","History_ClearLink_Label":"Clear","History_NoHistory_Label":"No history items","API_AccessFilter_Label":"Access","API_ParameterSection_Label":"PARAMETERS","API_SignatureSection_Label":"SIGNATURE","API_CopyHint_Label":"Copy","API_CopyNameHint_Label":"Copy name","API_CopyLinkHint_Label":"Copy link","API_CopiedAckHint_Label":"Copied!","API_MoreOverloads_Label":"more","API_MoreDropdownItems_Label":"More","API_OptionalParameter_Label":"optional","API_DefaultParameterValue_Label":"Default value","API_InheritedFilter_Label":"Inherited","Search_Input_Placeholder":"Search","Toc_Contents_Label":"Contents","Toc_RelatedClasses_Label":"Related Classes","History_JustNowTime_Label":"just now","History_AgoTime_Label":"ago","History_YearTime_Label":"y","History_MonthTime_Label":"mo","History_DayTime_Label":"d","History_HourTime_Label":"h","History_MinuteTime_Label":"m","History_SecondTime_Label":"s"}};
diff --git a/resources/js/search.json b/resources/js/search.json
index 6f4db4c4..1bae87b3 100644
--- a/resources/js/search.json
+++ b/resources/js/search.json
@@ -1 +1 @@
-[[{"i":"welcome-to-the-art-blocks-docs","l":"Welcome to the Art Blocks Docs!","p":["This documentation seeks to provide guidance for 3 primary audiences:","artists/creators preparing their projects to launch on Art Blocks or an Art Blocks Engine platform","current and prospective Engine partners","integrators/aggregators/marketplaces etc., looking to integrate with the Art Blocks APIs","You will find the three main sections in our documentation mirrors these three primary audiences. Please explore the docs here, and let us know if you have any questions.","For any issues with the docs, please file a bug here, or send us a PR with a suggested change!","GitPOAPs"]}],[{"i":"#","p":["An overview of different NFT metadata storage mechanisms used by Art Blocks NFTs."]},{"l":"NFT Metadata Storage at Art Blocks","p":["An overview of NFT metadata storage philosophy and implementations at Art Blocks."]},{"l":"Summary","p":["Art Blocks tokens store their metadata fully on-chain, ensuring collectors that their NFTs will always remain accessible and immutable.","For projects that require dependencies (e.g. p5js), Art Blocks provides the Art Blocks Dependency Registry, a fully on-chain software registry that can be used to optionally store dependency releases on-chain, as well as reference preferred software storage networks.","Art Blocks Engine Flex NFTs also provide the option to store metadata on decentralized storage networks, such as IPFS or Arweave, to enable larger sized assets to be used when generating outputs."]},{"l":"Overview of NFT Metadata Storage Options","p":["~ Yes","~ Yes ","Cost","Decentralized","Decentralized Storage Network","Fully On-Chain","Guaranteed to Persist Forever ","Hash On-Chain","High","Immutable","Low","Medium","No","No ","No, Very Low Risk","Servers/Hosting","Software Registry","Storage Type","While all NFTs track token ownership on a blockchain, the metadata for the NFT (image or audio information, artist information, etc.) may be stored in a variety of ways. Common options include:","Yes"]},{"i":"servershosting","l":"Servers/Hosting","p":["The metadata are stored on a server or cloud hosting service, such as AWS. This is a convenient and cheap option, but it has a few drawbacks:","The metadata can be changed by the server owner, so the NFT is not immutable.","The metadata can be lost if the server goes down or an admin decides not to discontinue paying for the service.","The metadata can be censored by the server owner."]},{"l":"Hash On-Chain","p":["The hash of the metadata is stored on-chain, and the metadata are stored on a server. Storing the hash of the metadata makes the NFT immutable, while keeping it much cheaper than storing all of the metadata on-chain. However, it has a few drawbacks:","The metadata can be lost if the server goes down or an admin decides not to discontinue paying for the service.","The metadata can be censored by the server owner.","Projects such as CryptoPunks originally stored the hash of the metadata on-chain, but the metadata were stored on a server. They have since upgraded to a fully on-chain solution."]},{"l":"Decentralized Storage Network","p":["The metadata are stored on a decentralized storage network, such as IPFS or Arweave. This is a popular option, and enables the NFT to be immutable. Drawbacks include:","The metadata must remain pinned by at least one party in order to be accessible."]},{"l":"Fully On-Chain","p":["The metadata are stored on the blockchain. This is the most expensive option, but it has many advantages. The metadata are always accessible and available, as long as the NFT exists. Collectors and artists never have to worry about a token's outputs disappearing."]},{"l":"Software Registries","p":["Some NFTs (like some Art Blocks project tokens) may rely on published software libraries when generating outputs. In these cases, the NFT metadata may include information about dependencies and where to find them (e.g. \"p5js, v1.0.0 on the cdnjs software registry\"). Software registries are a special form of decentralized storage, because of the distributed nature of the software repositories and many downloads on developers' computers worldwide."]},{"l":"Art Blocks Storage Solutions"},{"l":"Art Blocks Fully On-Chain","p":["Art Blocks Flagship and Art Blocks Engine NFTs only rely on fully on-chain storage solutions, plus allowing a single dependency to be housed on a software registry. This provides an extremely high level of confidence that the NFTs will remain fully accessible and immutable for the foreseeable future.","While Art Blocks originally relied on widly used software registries to house dependencies, the Art Blocks team has since created a fully on-chain software registry called the Art Blocks Dependency Registry. The registry is fully decentralized and is used by all Art Blocks Flagship NFTs. The registry enables dependencies to be stored fully on-chain, when the gas costs are justified. Art Blocks uploaded their first dependency, p5js v1.0.0, to the registry in January 2024, retiring any doubt that projects relying on p5js@1.0.0 would ever be unable to generate their outputs in the future."]},{"l":"Engine Flex","p":["Art Blocks Engine Flex NFTs provide an additional option for storing metadata. Flex NFTs can store metadata on-chain, or they can store the metadata immutably on the IPFS or Arweave decentralized storage networks. This allows Flex NFTs to utilize larger sized assets when generating outputs, while still providing the option for fully on-chain metadata where possible."]},{"l":"Examples"},{"l":"On-Chain Script Example","p":["Let's review an example of how to retrieve the token and script metadata for the first Art Blocks Token, token zero of project 0, Chromie Squiggle by Snowfro.","Note: Newer versions of Art Blocks core contracts have different function names than the V0 Art Blocks core contract shown in this example.","While we could query the Art Blocks Subgraph or API to retrieve the metadata, we will retrieve the metadata directly from the blockchain.","Visit the original Art Blocks Core Contract on Etherscan: 0x059EDD72Cd353dF5106D2B9cC5ab83a52287aC3a","Get project 0's metadata by calling the projectDetails function with the project ID as the input parameter:","projectDetails","Get project 0's script details by calling the projectScriptInfo function with the project ID as the input parameter:","scriptDetails","Get the script javascript by calling the projectScriptByIndex function with the project ID and index 0 as the input parameter. The returned text is the javascript code that is used to generate Chromie Squiggles!","scriptByIndex","Get token 0's token hash by calling the showTokenHashes function with the token ID as the input parameter. This is the hash that is injected into the script to generate the token's unique output.","tokenHash"]},{"l":"On-Chain Dependency Example","p":["Let's review an example of how to retrieve the dependency metadata for the first Art Blocks Token, token zero of project 0, Chromie Squiggle by Snowfro.","In this case, the project uses the p5js v1.0.0 dependency, which is stored fully on-chain via the Art Blocks Dependency Registry. While we could query the Art Blocks Subgraph or API to retrieve the metadata, we will retrieve the metadata directly from the blockchain.","Visit the Art Blocks Dependency Registry on Etherscan: 0x37861f95882ACDba2cCD84F5bFc4598e2ECDDdAF","Get the dependency details by calling the getDependencyDetails function with the dependency name and version as the input parameters. At this time, we translate from the string p5@1.0.0 to its bytes representation 0x703540312e302e30:","dependencyDetails","Get the dependency code by calling the getDependencyScript function with the dependency name and version as the input parameters. We again translate to the bytes representation 0x703540312e302e30, and can increment the index to get all 10 chunks of the dependency code:","dependencyScript","And that's it! We now have all of the information we need to generate the token's output, and we can be confident that the metadata will always be available and immutable!","Note: At this time, dependency scripts are stored compressed via gzip on-chain. Updates are planned to store code that can unzip the dependencies.","As long as the blockchain network continues to exist.","Requires ≥1 interested party","Typically hash of release is published to prevent tampering/changes"]}],[{"l":"Art Blocks Engine 101","p":["** Note: ** It is possible to use multisig wallets if our client's front-end properly populates access lists in their front end, but minting from Etherscan will not work.","8.** Repeat steps 2-7 for mainnet deployment.**","A high-level process map for Art Blocks Engine onboarding.","After testnet deployment, there are two steps that may proceed in parallel.","After the above has all been performed, you should run through the following \"pre-flight\" checklist and ensure there are no loose threads:","After the complete end-to-end integration has been vetted on testnet, the above process may proceed on mainnet.","After the terms of engagement are finalized, you’ll sign the Engine service and setup agreement.","After you've set up and tested an Engine project, you can request a script audit from Art Blocks to guarantee resolution-agnosticism and determinism.","An ETA for this infrastructure integration piece will be given at the time of testnet contract deployment. On average, this will take 1 week from the time of testnet deployment.","Art Blocks will need to integrate your newly deployed testnet smart contracts with our rendering infrastructure on testnet. After that, your team will connect to the staging site https://artist-staging.artblocks.io and interact with projects on the testing network you created as if they were on Art Blocks.","Art Blocks' will deploy a set of testnet smart contracts for your team to begin integrating with.","artist website","Create a new mainnet project shell on your smart contract using addProject, and upload all project details and project script using the artist interface at https://artblocks.io.","Deploy mainnet contracts.","etc.","If a 0% margin is used during a live NFT sale, the blockchain state will likely change between a user-submitted transaction and when it's mined. Therefore, small changes in the required Gas Limit will likely result in transaction failures if the gas necessary increases.","If accepting ETH, check that the wallets are not multisig wallets like Gnosis Safe (check the minter owner, rendering provider, artist, and any additional payee).","If actions of changing max invocations are expected, test those actions.","If actions of whitelisting/removing minters are expected, test those actions.","If you need help, the Art Blocks team will help guide you through the process.","Important for mainnet: Test-mint a token in each currency that will be accepted for a project. Verify that your front end is used to successfully mint using each currency to ensure a proper end-to-end test.","In summary, mainnet deployment entails:","Integrate mainnet contracts with Art Blocks' rendering and API infrastructure.","Interested in learning about an Art Blocks Engine partnership? Email engine@artblocks.io to get the conversation started!","Mint at least one piece (mint #0) in a controlled environment on mainnet, being sure to mint in each format you plan to for your open release.","project description","Provide the following information to Art Blocks for your Engine project: 1 The admin address to own these contracts. This address controls the core contract and the minter contract. 2 The name of tokens from your contract (e.g. for Art Blocks it is \"Art Blocks\" https://etherscan.io/address/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270#code). 3 The ticker for tokens from your contract (e.g. for Art Blocks it is \"BLOCKS\" https://etherscan.io/address/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270#code).","the license associated with outputs","To create a new project shell, you should use the addProject method of your newly deployed Engine Core Contract. This can be done by connecting to the contract via Etherscan.","Update your mainnet website to reference deployed mainnet contracts.","Vetting includes minting in (1) each minting format, (2) from the Engine partner's frontend minting experience, and (3) while integrated with the Art Blocks' provided rendering infrastructure.","Warning: if you opt-out of this step, it may result in undiagnosed issues with the rendered outputs. An unaudited project may not conform to the Art Blocks resolution-agnostic and deterministic standards. This means outputs may differ between screen sizes, devices, and operating systems or could be different from view to view.","When using your front-end to mint, ensure at least a 10% margin is added to each transaction's estimated Gas Limit, as originated by your frontend logic.","You are now ready to sync with the Art Blocks team on planning for a launch date, which is at least 1 week from when the above steps have all been completed.","Your team can integrate your front end to allow for minting via your new Engine smart contract (using deployed Engine smart contracts).","Your team will integrate a custom web frontend with your deployed Engine smart contracts (e.g., implementing their own purchase + display flow) and with the Art Blocks API as needed. An example of frontend purchase flow logic is provided here as a reference for integrating partners:","Your team will use https://artist-staging.artblocks.io site to upload your project script source code and configure all project metadata details:"]}],[{"i":"what-is-art-blocks-engine-and-engine-flex","l":"What is Art Blocks Engine and Engine Flex?","p":["Art Blocks Engine and Engine Flex are custom branded solutions from Art Blocks. Our offerings allow the generative NFT minting technology used by artists at Art Blocks to be integrated with third-party sites.","Engine allows partners to release generative outputs using our existing smart contracts and rendering infrastructure resulting in turnkey and branded generative projects. Engine partners own their smart contracts and can use them to release as many projects as they like as often as they like.","We currently partner with organizations from every sector that are interested in launching generative collections, but are particularly interested in the fashion, sports, media, manufacturing, and fine art industries.","For more information on Art Blocks Engine partnerships please contact: info@artblocks.io"]},{"i":"what-is-the-difference-between-art-blocks-engine-and-engine-flex","l":"What is the difference between Art Blocks Engine and Engine Flex?","p":["Art Blocks Engine is our offering that aligns most closely with the Art Blocks flagship product ( https://artblocks.io), and has the same technical approach to on-chain art where artists store the entirety of their generative algorithms on-chain within the Engine smart contract and are limited to a single, widely-distributed, off-chain dependency (e.g. p5js).","With Art Blocks Engine Flex artists are able to include off-chain assets, stored on the decentralized storage solutions of IPFS or Arweave, as additional inputs into their creative coding practice. This allows, for example, a project that takes an image as an input and creates 1of1ofX outputs applying a generative practice to this input image. This final output combines a generative script, a token hash, and additional off-chain assets."]},{"i":"how-does-art-blocks-engine-flex-work","l":"How does Art Blocks Engine Flex work?","p":["With Art Blocks Engine Flex contracts, a per-project (as opposed to per-contract) field is available on all projects that allows an artist to set a single off-chain dependency or set of multiple off-chain dependencies based on the content ID locations where these dependencies are stored on IPFS or Arweave.","Currently, we do not yet support the turnkey ability to programically upload/pin these dependencies to IPFS/Arweave within the Engine experience directly; however, our team is more than happy to assist partners in the process of uploading/pinning assets on IPFS/Arweave using existing third party solutions for doing so (e.g. Pinata in the case of IPFS).","Note that for a single project, it is possible to have a single off-chain dependency (e.g. a single image file) or a set of off-chain dependencies (e.g. a series of images from a set). This means that is possible, for example, to have a project that creates 1of1ofX generative variants of a single base image asset, or one in which for a given token a random image is selected from the base image asset set, and then a generative process is applied to it.","It is also important to note that images are not the only supported external asset dependency type. It is possible to reference any file type that can be pinned/uploaded to IPFS or Arweave and intelligbly incorporated into a generative algorithm to create interesting artistic outputs. For example, a project could use tensorflow.js as its single-depedency, have its generative script be a tensorflow based creative coding algorithm, and store the model file for the machine learning model on IPFS or Arweave to support a ML/AI based project."]},{"i":"what-is-the-smart-contract-architecture-for-art-blocks-engine","l":"What is the smart contract architecture for Art Blocks Engine?","p":["The Art Blocks Engine offers two core contract options: the V3 Engine core contract and the V3 Engine Flex core contract. These contracts are mutually exclusive, and partners should select the appropriate core contract based on their needs and whether they require the flex capabilities.","The V3 Engine core contract is an ERC-721 NFT contract that manages metadata for all Art Blocks NFTs, including artist scripts, token hashes, and token royalty data.","The V3 Engine Flex core contract includes everything in the V3 Engine contract, but also allows artists to use external assets in their Engine tokens. These external assets can be images, videos, audio, or other data and may be stored on decentralized storage systems such as IPFS, Arweave, or on the Ethereum blockchain","Both core contracts integrate with various peripheral contracts to provide flexible, customizable, and extensible functionality. These peripheral contracts are:","Admin Access Control List (ACL) contract: Manages granting admin access to the core contract and related contracts. It is designed to be highly flexible, extensible, and upgradable.","Randomizer contract: Generates pseudo-random numbers for the core contract when new tokens are minted. This architecture is designed to be highly flexible, enabling designs that may desire asynchronous random number generation or other hash generation methods.","Core Registry contract: Notifies the subgraph indexing service of new Art Blocks Engine tokens. When the Core Registry emits an event, the subgraph indexing service is notified, and the Engine contract is indexed and made available for querying on the Art Blocks subgraph. It also notifies a shared minter suite to allow the new Engine contract to be used by minters.","Minter Suite contracts: A collection of contracts used to mint Art Blocks Engine tokens. The Minter Suite is designed to be highly flexible and can be used to mint tokens in various ways.","Partners should choose between the V3 Engine core contract and the V3 Engine Flex core contract based on their project's goals and technical capabilities. The smart contract architecture for Art Blocks Engine provides a robust and flexible system for managing and creating generative NFTs while integrating with various peripheral contracts to extend its capabilities.","For additional context, please check out this architecture overview (with accompanying diagrams)."]},{"i":"what-is-the-minter-suite","l":"What is the \"minter suite\"?","p":["A summary of the division of responsibilities between the MinterFilter and individual Minters can be summarized as:","Assigns a specific minter to each project, which can be updated by the project's artist or the platform's Admin ACL.","Checks if the minter is the assigned minter for a project before allowing the token to be minted.","Checks that a project is on a registered Art Blocks Engine contract before allowing a minter to be assigned.","Defines price information for tokens in a project, including token price in wei, currency symbol, and currency address.","For additional context, please check out this architecture overview (with accompanying diagrams).","Handles the token purchase process through the \"purchase\" and \"purchaseTo\" functions for specific projects.","Legacy Minter Suite","Maintains a list of approved minters that can mint tokens for projects on the platform.","Managed the maximum number of invocations (for the given minter) for each project.","MinterFilter:","Minters:","Provides information about the minter type and associated core contract and MinterFilter addresses.","Shared Minter Suite","The Art Blocks minter suite is a collection of smart contracts that facilitate the secure and efficient minting of generative art tokens for all Art Blocks contracts in the V3 architecture. Originally, each contract had its own minter suite. The new shared minter suite enables Engine contracts use the same minting contracts as Art Blocks Flagship, which enables a seamless experience for collectors and artists.","The legacy minter suite is very similar to the new, shared minter suite, except that each minter filter and minter contract is connected to a single core contract. The general roles and responsibilities of the Minter Filter and Minter contracts are the same, except that they limit minting to a single core contract instead of a set of allowlisted core contracts.","tl;dr: The MinterFilter serves as a control layer that ensures the correct minter is used for each project, while Minters handle token purchase processes and project-specific settings. This division of responsibilities enables a secure, efficient, and flexible set of contracts that we call the \"minter suite\"."]},{"i":"what-is-generative-art","l":"What is generative art?","p":["Generative art is about developing systems that define rules for creating art. By introducing randomness to those systems, core concepts are expressed through unique outputs. In a contemporary sense, this means writing computer algorithms to define the system and introduce randomness, which allows for conceptual exploration and rapid iteration.","Creative coders write scripts with specific parameters that introduce and explore features, which generate the final outputs in a collection. With Art Blocks’ generative minting technology, collectors participate in the creation of the art. No one knows exactly what a piece will look like before it's minted, not even the artist. Each NFT is generated at the time of purchase using the buyer’s unique transaction hash to create a ‘1 of 1 of X’, which adds an extra layer of magic as the creator and collector watch a project come alive.","The interesting part of modern generative art is that it involves working in series - often a large series. So instead of pursuing a single compelling work of art, a generative artist creates an algorithm capable of tens, hundreds, or thousands of compelling works of art. Which, when taken as a whole, expresses the range of possibilities contained in a single algorithm."]},{"i":"what-are-nfts","l":"What are NFTs?","p":["Nonfungible tokens (NFT) are unique digital assets stored on blockchain technology that can represent any digital or physical asset."]},{"l":"On-chain vs. off-chain","p":["Art Blocks Engine enables creators to immutably store their generative NFT directly on the Ethereum blockchain (on-chain) or reference an external library or asset (off-chain). For an off-chain implimentation, partners can reference external off-chain assets using decentralized storage solutions like IPFS.","Decentralized and fully on-chain content is the most durable digital asset available. Typically, a creative coder writes a generative script in JavaScript and stores it directly on the blockchain. As long as you have access to a computer, a web browser, and Ethereum’s public ledger, you’ll always be able to reproduce the NFT in its original form and track ownership since creation. An on-chain NFT inherits the provenance, security, and durability of Ethereum itself, making them the highest quality digital asset available.","So, if Art Blocks ever shut down, all on-chain work would still be accessible since it's stored on the decentralized Ethereum blockchain and able to be viewed, bought, sold, and transferred without involving Art Blocks at all.","In contrast, if we store generative algorithms on an Art Blocks-owned database, the NFTs would rely on Art Blocks to return the assets - and if we go offline, the assets would not be retrievable. Similarly, if a script is stored on-chain but uses data from off-chain sources, it's vulnerable to the host of that off-chain data going offline.","Off-chain NFTs rely on assets stored on external servers. There are many reasons to reference off-chain assets - data storage is expensive on Ethereum, and using external assets can reduce the cost of putting data on-chain. It also allows for interesting applications of generative art using external assets. However, if your NFT references external sources and those sources go offline, the NFT will only track ownership of unretrievable data.","For this reason, we only allow certain external libraries to be used in project scripts given their general recognition as extremely reliable file storage sources.","Art Blocks Engine offers on-chain and off-chain solutions with our generative NFT minting technology. Which one is right for you depends on your project’s goals and technical capabilities."]},{"l":"Creating durable digital assets","p":["Creating on-chain generative NFTs ensures your collectors can expect their digital assets to stay the same forever. But if you choose to launch a generative project with off-chain assets, there are ways to mitigate the risk of going off-line using technology like IPFS or Arweave. We’re happy to chat about the right Art Blocks Engine implementation for your next project."]},{"l":"Potential use-cases","p":["The landscape of on-demand generative content has plenty of room to experiment. Some of our current partners include artists, galleries, art houses, online publications, and game developers. If you’re exploring an interesting project, get in touch, and let’s build together.","Current and upcoming use cases:","Fashion","Premier Artists","Media / Tech / Consumer brands","Gaming","Sports","BYOP - build your own platform"]}],[{"l":"Engine Partner Onboarding Steps","p":["An overview of the steps required to onboard as an Art Blocks Engine partner."]},{"l":"1. Initial outreach","p":["Interested in using Art Blocks Engine to launch a generative content platform?","Reach out to info@artblocks.io to get started. We'll discuss your needs, explain what we offer in a partnership, and align expectations.","Timeline: typically 1-2 weeks"]},{"l":"2. Project scope","p":["The Art Blocks team will work with you to determine the scope of the Art Blocks Engine project.","Timeline: 1-2 weeks"]},{"l":"3. Contract agreement","p":["Once the project objectives and scope are agreed upon, you'll work with our operations team to sign our partnership agreement.","Timeline: 1 week"]},{"l":"4. Smart contract details","p":["To get started, you'll provide our team with:","An Ethereum wallet address (that you currently own and control) you'll use to manage your Art Blocks Engine smart contracts","The name you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"Art Blocks\")","The ticker symbol you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"BLOCKS\")","Deployment Type: V3 Engine or V3 Engine Flex","Minter Type: flat price eth only, set price custom erc20, merkle tree allowlist, holder-gated, linear DA, exponential DA, and exponential DA with settlement","Starting project ID # (>=0):","Set autoApproveArtistSplitProposals: true or false","Regarding \"autoApproveArtistSplitProposals\" - It needs to be set at deployment and cannot be changed later.","tldr - if true, artist royalty wallet changes are auto-approved. If false, the contract admin will need to approve the artist's royalty wallet changes. This is an added check to ensure your artists aren't changing royalty wallets to a random address, which could complicate accounting/ OFAC compliance.","Note: We cannot deploy your contract until you provide the above information. The name and symbol tied to your contract cannot change once it’s deployed._","Timeline: 1-2 days"]},{"i":"5-contract-configuration--testnet-deployment","l":"5. Contract configuration & testnet deployment","p":["We will configure your smart contract before transferring ownership to Ethereum address provided in Step 4. Once we deploy your contract on the test network, you can start testing your generative script.","Timeline: 1 week"]},{"l":"6. Testnet infrastructure integration","p":["Art Blocks will integrate your contracts with our rendering infrastructure and provide access to our staging website for you to perform project onboarding and configuration via the Art Blocks site on the test network.","Contracts are deployed twice per month and typically take 1 week to complete and transfer.","Timeline: 1 week"]},{"i":"7-integration-with-partners-site","l":"7. Integration with partner’s site","p":["Your team will integrate your site’s front-end with the contract created by Art Blocks to test your outputs on the testnet.","Timeline: weeks-months (depends on partner)","Connect your front end to testnet contracts"]},{"l":"8. Test mints on partner site","p":["Your team ensures the minting process is working on the test network by minting your NFTs using the front-end of your site.","Timeline: weeks-months (depends on partner)","Mint test outputs","Test drop mechanic (flat price, Dutch Auction, whitelists, etc.)","Test purchase with custom ERC20 (if applicable)","Request a script audit from Art Blocks","Test your script across different hardware/software ( browserstack.com)","Let the Art Blocks team know testing is complete and you're ready for a mainnet deployment"]},{"l":"9. Deployment to mainnet","p":["Art Blocks deploys the mainnet version of your contract and integrates it with our infrastructure.","Timeline: 2 weeks"]},{"i":"10-infrastructure-integration-mainnet","l":"10. Infrastructure integration (mainnet)","p":["Your team integrates the mainnet contract with your site and prepares to generate your first NFT (mint #0)","Timeline: Depends on partner","Connect your front end with the new mainnet contracts, using the same minting mechanics from testnet (drop type & currency)","Mint #0 from your front end"]},{"i":"11-mint-0","l":"11. Mint #0","p":["You can mint your project's first official token via your site!"]},{"l":"12. Set secondary royalties","p":["Art Blocks will set our secondary royalty before we transfer contract ownership, but you are responsible for setting your own secondary royalty across all secondary marketplaces.","OpenSea - https://docs.opensea.io/docs/10-setting-fees-on-secondary-sales LooksRare - https://docs.looksrare.org/guides/collection-management/set-or-edit-collection-royalties x2y2 - https://docs.x2y2.io/guides/collection-management/manage-your-collection","Note: The vast majority of secondary activity takes place on OpenSea. Currently, OpenSea does not recognize on-chain roylaties and needs to be set through their interface. However, they plan to recognize Roylaty Registry in the near-ish future. We highly encourage you to sign up for the Royalty Registry to avoid missed secondary roylaties.","Instructions on setting up Royalty Registry - https://docs.artblocks.io/creator-docs/art-blocks-engine-onboarding/art-blocks-engine-101/engine-royalty-registry-setup/"]},{"l":"13. Project launch","p":["You can choose a launch date for your project. Please allow at least one week between a successful mint #0 and a go-live date.","Timeline: 1 week from completion of step 11"]}],[{"l":"Engine Project Deployment and Launch Guide","p":["This guide provides basic instructions for deploying and launching a new project on the V2 and V3 Engine smart contracts. You will learn how to create a project shell, assign a minter to each project, and setup the necessary configurations before minting and launching your project. This documentation aims to simplify the process and ensure a smooth project launch on the Art Blocks Engine platform.","There are slight variations between V2 and V3 contracts, which will be noted in the relevant sections."]},{"l":"Project Shell Deployment","p":["Collect the required information for the project:","Project title (e.g., \"Fun Lines\")","Artist's wallet address (e.g., 0x78592a6fBE68fEBf226040a5D25ad7e69F2FeAb6)","(V2 only) Price-per-mint specified in WEI (e.g., 350000000000000000, or 0.35 ETH)","Navigate to your Engine Core Contract on Etherscan and connect your wallet. You can find this link in your DEPLOYMENTS.md log. https://goerli.etherscan.io/address/0xd2363Acbf8CdF01A5FdfcB8f0295e0a5dF94518D#code)","Click the \"Write contract\" tab and use the addProject method to create a new project shell, specifying the information collected in step 1.","Connect to the Art Blocks website with the artist wallet used in in Step 3. Your artist should be able to begin entering project details.","Testnet URL: https://artist-staging.artblocks.io/engine/[flex OR fullyonchain]/projects/[coreContractAddress]/[projectID] example: https://artist-staging.artblocks.io/engine/flex/projects/0x28b82AA5bb6d00363ae0FBC5ecaD689Ae49BC82B/0","Mainnet URL: https://www.artblocks.io/engine/[flex OR fullyonchain]/projects/[coreContractAddress]/[projectID] example: https://www.artblocks.io/engine/fullyonchain/projects/0xa319C382a702682129fcbF55d514E61a16f97f9c/1","If you encounter issues finding or seeing your project on the Art Blocks site, disconnect and reconnect your wallet, ensuring you are connected with the previously specified artist wallet."]},{"i":"assigning-a-minter-v3-only-new-shared-minter-suite","l":"Assigning a Minter (V3 only, New Shared Minter Suite)","p":["Minters are assigned on a per-project basis on V3 contracts, and minters must be assigned by the artist's wallet.","note: for legacy minter suite directions, see the next section","Art Blocks is working on a new creator dashboard that will more easily facilitate the minter assignment process. This will only be possible using the new shared minter suite, because those minters are indexed by the subgraph. Until the new creator dashboard is released, please follow these instructions to assign a minter to your project.","Assign the minter to your project by using the MinterFilterV2 contract found in your deployment file. The artist's wallet should use function #9 setMinterForProject, entering the _projectID, _coreContract address, and _minter address. You can get the globally approved minter addresses via the getAllGloballyApprovedMinters() view function on the MinterFilterV2 contract.","Once the minter is linked to your project, set the project details on the minter contract.","For example, if you are using a shared Dutch Auction minter, navigate to the contract on Etherscan. Then, use the function setAuctionDetails to enter details like _projectId, _coreContract, _auctionTimestampStart, _priceDecayHalfLifeSeconds, _startPrice, and _basePrice. This must be done using the artist's wallet."]},{"i":"assigning-a-minter-v3-only-legacy-non-shared-minter-suite","l":"Assigning a Minter (V3 only, Legacy Non-Shared Minter Suite)","p":["We recommend using the new shared minter suite, which is easier to use and more flexible. If you are using the legacy non-shared minter suite, follow these instructions. For more information about migrating to the new shared minter suite, please see the Minter Suite Migration Runbook.","Minters are assigned on a per-project basis on V3 contracts, and minters must be assigned by the artist's wallet. For the artist wallet to assign a minter, follow these steps:","Assign the minter to your project by using the MinterFilterV1 contract found in your deployment file. The artist's wallet should use function #6 setMinterForProject, entering the _projectID and _minterAddress. You can find the minter address in your deployment log, which is pinned in your partner channel.","Once the minter is linked to your project, set the project details on the minter contract. The deployed minter addresses can be found in your deployment file.","For example, if Art Blocks deployed a Dutch Auction minter for your core contract, navigate to the MinterDAExpV4 contract on Etherscan (in your DEPLOYMENT.md log). Then, use the function setAuctionDetails to enter details like _projectId, _auctionTimestampStart, _priceDecayHalfLifeSeconds, _startPrice, and _basePrice. Make sure this is done using the artist's wallet."]},{"i":"pre-mint-0-flight-check","l":"Pre-mint-#0 Flight Check","p":["Before minting your first token (#0) on your new project shell, verify the following:","The baseTokenURI has been set, following the format:","Mainnet: http://token.artblocks.io/{CORE_CONTRACT_ADDRESS}/","Testnet: https://token.staging.artblocks.io/{CONTRACT_ADDRESS}/","The max invocations for the project have been set. (note: project size cannot be increased once set on V3 contracts)","Mint through your own front end. On testnet, you'll want to test each minter type and currency you plan to use on mainnet."]},{"i":"pre-launch-pre-open-minting-flight-check","l":"Pre-launch (pre-open-minting) Flight Check","p":["For a project to be avaialble for public purchase, the project must be activated by the admin, and unpaused by the artist.","tldr: inactive + paused (default state) = private project shell and unable to purchase active + paused = public project shell and only the artist wallet can purchase active + unpaused = open to purchase","Before launching your project for open minting, verify the following:","The project has been activated by the contract admin.","The project is not yet unpaused.","Once unpaused the project will be open, depending on the minter being used (DA will not open until specified startTime)"]}],[{"l":"Art Blocks Engine OpenSea Setup","p":["Setting up the OpenSea storefront for your Art Blocks Engine contract."]},{"l":"OpenSea Storefront Ownership Transfer","p":["After the first token has been minted on your new Art Blocks Engine contract, you should be able to see this token in the OpenSea storefront. You will find this in the format https://opensea.io/assets/{CONTRACT_ADDRESS}/{TOKEN_ID} e.g. https://opensea.io/assets/0x13aae6f9599880edbb7d144bb13f1212cee99533/1000167.","Once this first token is populated, the Art Blocks team will be able to transfer the OpenSea collection for your project to a wallet that you control. By default, the Art Blocks team will plan to use the same address for the OpenSea collection ownership as it is designated to be the admin of your smart contract. However, if you prefer that a different wallet address manages the OpenSea collection, please reach out to Art Blocks to request this before the project has been transferred to your team.","After your OpenSea collection has your designated wallet added as the collection administrator, you may remove the wallet that Art Blocks controls from being an additional admin. It’s added automatically at the time of collection creation based on the contract deployer wallet address at the time of collection creation. We recommend that you do so. That way, only you control your OpenSea storefront.","Please contact the Art Blocks and/or OpenSea teams if you have any issues during this process."]},{"l":"OpenSea Storefront Options","p":["For Art Blocks Engine projects, there are two options that OpenSea can provide for collection organization:","1. All projects are grouped in one large collection, where individual projects within a collection are shown as filter traits on the sidebar of the OpenSea UI.","All projects in one collection.","2. Each new project on your contract is handled as its own collection on OpenSea, where project traits are properties.","Each project as its own collection.","By default, collections are organized via method 1. above. However, if you would like your collection to be handled via method 2., please reach out to the Art Blocks team, and we can facilitate this change by OpenSea on your behalf."]}],[{"i":"art-blocks-engine-royalty-registry-setup-v2-contracts-only","l":"Art Blocks Engine Royalty Registry Setup (V2 contracts only)"},{"l":"Royalty Registry","p":["The Royalty Registry is an on-chain tool used by many marketplaces ((soon) OpenSea, Coinbase NFT, etc.) to query royalty payment addresses and percentages when a token is sold. The Royalty Registry lives on the Ethereum blockchain and is decentralized.","Art Blocks Engine contracts integrate with the Royalty Registry directly to handle many projects and artists on a single contract. Please do not use the Royalty Registry's \"Configure\" UI to configure the royalties for your Engine contracts. Doing so will result in incorrect royalty payments across many projects. Instead, see the documentation below.","Note that the Royalty Registry's \"Lookup\" UI is a great tool for confirming that your Engine contracts are configured correctly after the configuration steps below have been completed."]},{"l":"Royalty Payment Addresses","p":["For Engine contracts, the following addresses may receive royalties:","Party","Typical Royalty Percentage","Platform (Engine Partner)","default 2.5%","Render Provider (Art Blocks)","Artist","typically 5%, but configurable by artist","Additional Payee","split between Artist & Additional Payee varies across projects"]},{"l":"Configuring Royalties","p":["V3 and V2 Engine contracts are configured differently. V3 Engine contracts are the latest version of the Art Blocks Engine contracts. Since they were designed after the Royalty Registry was released, they automatically integrate with with the Royalty Registry. V2 Engine contracts also integrate with the Royalty Registry, but have a shim-layer that must also be configured. This is because V2 Engine contracts were designed before the Royalty Registry was released."]},{"l":"Configuring V3 Engine Contracts","p":["Simply configure the relevant royalty payment details on the token contract itself:","admin (contract-wide):","Ensuring platform and render provider payment addresses are correct, updateable by contract admin by calling updateProviderSalesAddresses on the Engine core contract","Ensuring platform and render provider payment percentages are correct, updateable by contract admin by calling updateProviderSecondarySalesBPS on the Engine core contract","artist (project-specific):","Ensuring the project's artist royalty percentage is correct, updateable on the website by the artist in their project dashboard.","Ensuring the project's artist and additional payee splits are correct, updateable on the website by the artist in their project dashboard."]},{"l":"Configuring V2 Engine Contracts"},{"l":"Required V2 Setup","p":["A. Pre-setup:","B. Royalty Registry Integration:","Call the setRoyaltyLookupAddress function with the following arguments:","Call the updatePlatformRoyaltyAddressForContract function with your Engine token contract address as _tokenContract, and your desired platform royalty payment address as _platformRoyaltyAddress","Connect your Engine admin wallet to the Art Blocks Engine royalty override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f, on etherscan","Create a new override on the Royalty Registry for your Engine core contract","Ensure every project has the desired artist royalty percentage set on the Engine contract.","IMPORTANT: This percentage represents the percentage of the total token sale that will be paid to a combination of artist & additional payee. It is typically 5%. Additionally, the default 2.5% to the Engine platform (you) and 2.5% to render provider (Art Blocks) will be also added by the Royalty Registry override contracts below.","Note: This percentage is different than what OpenSea has asked us to do with their off-chain royalty system. In the old system, typically 5%+2.5%+2.5%=10% was set on OpenSea's website because they only supported bulk payments to a single address. In the new on-chain system, payments to more than a single address will be supported.","Now you will automatically be receiving royalties from sales on secondary markets that support use of the Royalty Registry!","Only artists may update their project's royalty percentage. They can call updateProjectSecondaryMarketRoyaltyPercentage(_projectId, _royaltyPercentage) on the Engine contract from their artist wallet. Typically royalty percentage would be the number 5, representing 5%.","royaltyLookupAddress: The address of the standard Art Blocks Engine Royalty Registry override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f","Set your Platform royalty payment address","The following steps are required before Art Blocks Engine contracts will integrate properly with the Royalty Registry.","tokenAddress: The address of your Engine core contract","Using the Connect to Web3 button, connect your Engine admin wallet to etherscan when on the \"Write as Proxy\" tab.","View the Royalty Registry's mainnet registry contract on etherscan: https://etherscan.io/address/0xad2184fb5dbcfc05d8f056542fb25b04fa32a95d#writeProxyContract"]},{"l":"Optional V2 Configuring","p":["Royalty percentages of 2.5% are used by default by the Art Blocks Engine royalty override contract. The admin of any given Engine core contract can override these percentages by calling updatePlatformBpsForContract or updateRenderProviderBpsForContract on the Art Blocks Engine royalty override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f, on etherscan","Note that royalty proportions are defined in terms of Basis points. For example, 250 BPS = 2.5% royalty. See this article for more information.","After initial setup, the Platform (Engine partner) royalty payment address may be updated at any time by the admin of a given Engine core contract by calling the updatePlatformRoyaltyAddressForContract function on the Art Blocks Engine royalty override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f, on etherscan"]}],[{"l":"Embroidery on Art Blocks Engine","p":["In addition to providing a browser-based live view and media files generated from your project script, Art Blocks Engine provides tools to embroider your generative artwork on garments and accessories."]},{"l":"Requirements","p":["In order to get started, you will need:","Testnet project shell on Art Blocks Engine Refer to documentation for setup instructions*","Embroidery machine and software drivers compatible with DST or PES files If you are new to embroidery, we recommend the Brother PE800","JavaScript utilities for manipulating SVG markup Clone the embroidery template repository for an example: ‣"]},{"l":"Quick Start","p":["Deploy a new project shell to your Art Blocks Engine testnet contract","Upload a project script that includes a global function named generateEmbroiderySVG that returns a string containing SVG markup for embroidery","Use the Embroidery File Downloader to generate embroidery files for minted tokens"]},{"l":"Project Script Requirements","p":["In addition to following the typical guidelines and constraints for Art Blocks projects, your project script should include a global function that is only used for embroidery."]},{"l":"Generating SVG for Embroidery","p":["Implement a global function with the following type signature:","For example, you may include a function similar to code below:"]},{"l":"Functional Requirements","p":["In order to correctly generate files for embroidery, you must:","Implement a generateEmbroiderySVG global function that returns the full markup of an svg element as a string","Optional: accept a width and height parameter (millimeters) used to resize the contents of the SVG to accomodate different garment sizes","Render a digital-only version of the art using a separate svg or canvas that is displayed to the user and thumbnailed in token metadata (similar to any digital-only Art Blocks project)","Inline all libraries and code used in your project that are not configured as an on-chain dependency"]},{"l":"Known Limitations","p":["Avoid using SVG fills - instead, to create the visual appearance of a fill, the SVG should contains the exact paths the embroidery needle should follow","Avoid using asynchronous code or promises inside of the generateEmbroiderySVG function - the function should return valid SVG markup immediately","Provide margins (bleed) matching the precision of the embroidery machine to improve manufacturing yield","Match all colors used in your design to the colors of thread available to you for embroidering"]},{"l":"Embroidery in Production","p":["In addition to the typical steps required for moving an Art Blocks Engine project to mainnet, there are additional considerations for embroidery projects."]},{"l":"Logistics and Fulfillment","p":["There are three primary customer experiences enabled for embroidery on Art Blocks Engine:","Drop-shipped or batched production Consider the lead times, available materials, and the process for sending files to embroidery service providers.","Live in-person pop-up events Consider space constraints and measure the amount of time required to fulfill a single embroidered object.","At-home embroidery for token holders Consider how and when you would like to provide your users with a link to download embroidery files for a project."]},{"i":"option-1-batched-production","l":"Option 1: Batched Production","p":["To facilitate automated testing and batched production, we provide a rate-limited API for converting Art Blocks Engine projects into DST and PES embroidery files. Note: the API endpoints provided for batched production are rate-limited, and cannot be linked from a public web site.","For example, the following commands illustrate how you can download individual embroidery files for tokens on an Art Blocks Engine project:"]},{"i":"option-2-live-events","l":"Option 2: Live Events","p":["To facilitate live events, operators of a pop-up booth can use the Embroidery File Downloader on a laptop or iPad to quickly download the relevant embroidery files for a given minted token.","Embroidery File Downloader"]},{"i":"option-3-home-embroidery","l":"Option 3: Home Embroidery","p":["If you would like to provide your token holders with a link to download DST or PES files of their minted tokens, please contact us for access to the API dashboard. To generate embroidery files in an S3 bucket that may be linked from a public web site, you will need to add your project in the API dashboard here: https://minting-api.artblocks.io/admin/embroidery/embroideryproject/"]},{"l":"References","p":["https://github.com/embroidepy/vpype-embroidery/","https://github.com/EmbroidePy/pyembroidery","10 Best Print on Demand Companies and Sites (2023)","The 7 Best Embroidery Machines of 2023"]}],[{"l":"Mobile Minting for In-Person Activations","p":["The Art Blocks Mobile Minter is a specialized app for iPad and iPhone designed to streamline the minting process during in-person events. Unlike the standard Art Blocks website, which is accessible from any device, the Mobile Minter is tailored for events where minting is exclusive to attendees or offered as an event gift."]},{"l":"Features","p":["The Mobile Minter is capable of:","Minting Art Blocks tokens with a pre-funded wallet to cover gas fees","Minting tokens to an ENS name or a copied Ethereum address","Authenticating users with FaceID/TouchID for quick access during live events","Minting tokens without requiring manual signing and submission of Ethereum transactions"]},{"l":"Requirements","p":["The Mobile Minter is perfect for situations where:","A project is paused and not available for online minting","An artist wants to distribute their work at a live event","An iPad or iPhone with the latest iOS version is available","A small amount of Ethereum is on hand to cover gas fees for token recipients","You've set up a Stripe account to accept fiat payment (optional)"]},{"l":"Getting Started","p":["To use the Mobile Minter, follow these steps to set up your project and device according to the system requirements."]},{"l":"Step 1. Project Configuration","p":["To set up the Mobile Minter for your project:","Send a Slack message in Slack requesting access to the Mobile Minter","Art Blocks staff (@Shantanu Bala) will provide a wallet address that will be used to pay for gas fees for transactions Note: The app manages this wallet, and any remaining funds can be returned to you at any time","Pause your project to restrict minting to the artist only","Transfer artist ownership to the wallet address from Step #2, making the Mobile Minter the sole minting wallet for the project","After completing these steps, Art Blocks staff (@Shantanu Bala) will give you login details to start using the mobile app"]},{"l":"Step 2. Device Setup","p":["To prepare your mobile device:","Update your iPhone or iPad to the latest iOS version","Set up and ensure FaceID or TouchID is functional on your device","Download the TestFlight app from the App Store: TestFlight","Join the Mobile Minter beta on TestFlight:","Sign in, set up FaceID, and proceed to minting"]},{"l":"Step 3. Minting","p":["Mobile Minter iPad app","Click the link above to view a screen recording of the Mobile Minter app on iPad. This test demonstrates the steps to mint a project on the Goerli test network. To mint a new token, users follow these steps:","Open the Mobile Minter app on an iPhone or iPad device","Sign in using FaceID","Select a project from the list of available projects","Input an ENS name or wallet address","Confirm the minting details","Wait for the token minting transaction to be confirmed"]},{"l":"Payment Processing","p":["The Mobile Minter utilizes Stripe Terminal for handling payments. Art Blocks does not offer merchant accounts or handle tax remittance for partners. To process fiat payments with Stripe Terminal, all Art Blocks Engine partners must create and configure their own Stripe account.","The backend (Art Blocks Minting API) and point of sale (Mobile Minter app) software are provided by Art Blocks. However, the hardware must be procured by Art Blocks Engine customers."]},{"l":"Stripe Reader M2","p":["We recommend using the Stripe Reader M2 with the Mobile Minter due to its convenient NFC payment support, Bluetooth connectivity, long-term SDK support, and reliable chip/magstripe fallback. You will need to order the M2 directly from Stripe."]},{"l":"Direct Charges","p":["The Mobile Minter uses Stripe Connect to make a direct charge using your Stripe account. Stripe Connect processes direct charges for your Art Blocks Engine project using your own Stripe account (connected account) while using our platform - note that the charge amounts and fees are mock examples provided by Stripe."]},{"l":"Stripe API Secrets","p":["Do not share your live Stripe API keys with anyone, including Art Blocks employees. Instead, Art Blocks will supply a secure OAuth link from Stripe for your usage. Connected accounts are managed using the process outlined by Stripe:","Managing connected accounts with the Dashboard"]},{"l":"Displaying Live Mints","p":["Web-enabled TVs or displays can showcase a real-time view of the latest tokens minted through the Mobile Minter. The Art Blocks documentation site offers an overview of configuration options for the live viewer."]},{"l":"Example Embed","p":["You can embed live.artblocks.io using an iframe on a web page containing your organization’s branding.","[Example embed of live.artblocks.io without any configuration parameters ( docs)]( https://live.artblocks.io/)","Example embed of live.artblocks.io without any configuration parameters ( docs)"]},{"l":"Frequently Asked Questions"},{"i":"can-the-mobile-minter-be-used-with-projects-that-are-not-paused","l":"Can the Mobile Minter be used with projects that are not paused?","p":["Yes, the Mobile Minter can be used for active projects. However, pausing the project and transferring artist ownership to the app restricts minting exclusively through the app. If a project remains unpaused, anyone online can mint tokens."]},{"i":"can-users-pay-for-gas-fees-themselves","l":"Can users pay for gas fees themselves?","p":["Currently, gas fees must be pre-funded by the artist or the organization using the Mobile Minter app, through the Mobile Minter's hot wallet."]},{"i":"can-my-prepaid-gas-fee-balance-be-returned-to-me","l":"Can my prepaid gas fee balance be returned to me?","p":["Yes, please contact us to arrange the return of any remaining funds to the original depositing wallet. To have the remaining ETH returned, ensure that the funds were initially transferred to the Mobile Minter's hot wallet from an address capable of receiving ETH on behalf of your organization. The unspent ETH can only be sent back to the original sender's wallet."]},{"i":"can-multiple-projects-be-managed-simultaneously-through-the-mobile-minter-app","l":"Can multiple projects be managed simultaneously through the Mobile Minter app?","p":["Yes, the Mobile Minter app allows you to manage multiple projects for in-person events. You can easily switch between projects during the event, ensuring a seamless minting experience for attendees."]},{"i":"what-currencies-are-supported-for-payments-in-the-mobile-minter-app","l":"What currencies are supported for payments in the Mobile Minter app?","p":["The Mobile Minter app processes fiat payments via Stripe Terminal, which supports a variety of currencies. The available currencies depend on your Stripe account and the country where your business operates. You will be the merchant of record, and Art Blocks will collect its platform fees in ETH or USD. For a list of supported currencies for your customers, please refer to the Stripe documentation."]},{"i":"is-it-possible-to-customize-the-appearance-of-the-mobile-minter-app-for-my-event","l":"Is it possible to customize the appearance of the Mobile Minter app for my event?","p":["While the Mobile Minter app does not offer customization, you can embed live.artblocks.io inside of a page that showcases your event's theme and branding. Please refer to the Art Blocks documentation site for an overview of configuration options for the live viewer."]}],[{"l":"Using Pinata for External Assets","p":["Pinata is an excellent IPFS resource built with creators and non-technical users in mind, making it easy to upload content that you can use inside Art Blocks! This will walk you through the basics of uploading content to Pinata."]},{"l":"Signing Up","p":["You can sign up for a free account which will allow up to 100 files and 1GB of storage! To get started visit pinata.cloud and click the “Sign Up” button in the top right. It will ask you for a name, email, and password."]},{"l":"Uploading Content","p":["Once you’re signed in you will see the Files Page which looks something like this: setup","To start uploading content, simply click on the “Upload +” button and select “File” upload","Of course from there click “Select File” and choose the file on your computer select","Then give it a name, and click upload; that’s it! name","Once it’s done uploading you will see the file listed on your files page! complete","What’s important to note is the “CID” which stands for “Content Identifier.” It’s the core of IPFS and how files can be shared across the IPFS network. This is what you would input into the “cid” portion of an Art Blocks generative script and would look something like this:","QmNrCnsNazd54aAQixQCVtikJNfizEXGKR6yLhr9P1TTJV","If you want to preview your file you can simply click on the name of the file on the left side and it will open a preview in a new window.","The default Pinata gateway is https://gateway.pinata.cloud but keep in mind that it should only be used for testing files. For production work you may want to consider getting a Dedicated Gateway on a paid plan.","If you have further questions be sure to visit Pinata's docs and do not hesitate to send them an email at team@pinata.cloud! or reach out directly to the Art Blocks team."]}],[{"l":"Using Filebase for External Assets","p":["Filebase is a geo-redundant IPFS pinning service and decentralized storage provider. When a file is uploaded to an IPFS bucket on Filebase, it is automatically pinned to the IPFS network with 3 duplicate copies, each of which is stored on an IPFS node located across 3 unique, geographic regions.","Filebase offers an easy-to-use Web Console Dashboard for non-technical users, and an S3-compatible API for developers to utilize in a wide variety of tool configurations or SDKs."]},{"l":"Signing Up","p":["Filebase uses a web-based console that can be found at https://filebase.com/signup. Existing accounts can go directly to https://console.filebase.com.","To sign up for a Filebase account, navigate to https://filebase.com. To make a new account, click the ‘Try for Free’ button in the top right corner of the webpage. signup","Filebase is a free-to-use platform for all users. All users can store up to 5GB of data, with a maximum of 1,000 individual files on the IPFS network with no credit card required.","Next, fill out the fields of the form, including an email address and password, and agree to the Filebase terms to create your account.","You will receive an email with confirmation instructions. Click the link included in the email to confirm your account and finish the registration process. Once you’ve completed these steps, your Filebase account has been created."]},{"l":"Uploading Content","p":["Once signed in, you will be brought to the Filebase dashboard. web_dashboard","To upload content, first you will need an IPFS bucket. Select 'Buckets' from the left menu bar, then select 'Create Bucket'. buckets","Give your bucket a name, then select IPFS for the network. bucket_ipfs","Then, select your bucket from the Buckets menu and select 'Upload'. You can choose to upload a File, Folder, or existing IPFS CID to Filebase. For this example, we'll use a single file. upload","You will be prompted to select a file from your computer. Once uploaded, it'll be displayed in the Filebase web console and it will be given an IPFS CID value. cid","When a file is uploaded to IPFS, the file’s contents are used to generate a cryptographic hash value. Then, this hash value is used to generate another value, which is used as the file’s content identifier (CID). CIDs are used to access files stored on IPFS, but instead of locating the file on the network based on it's name, the CID is based on the file's contents. Any changes to the file's contents or metadata will result in a new, unique CID.","The CID value is what is used within an Art Blocks generative script, under the 'CID' field.","To preview your file using it's IPFS CID and the Filebase public gateway, you can use the following URL format in any web browser:","https://ipfs.filebase.io/ipfs/[CID]","The Filebase public IPFS gateway is https://ipfs.filebase.io/ipfs and can be used by all Filebase uses to host Filebase pinned CIDs. For increased configuration options, performance, content whitelisting, and custom branding, a Filebase Dedicated Gateway can be used through one of Filebase's paid IPFS plans.","For more information, visit Filebase's extensive documentation or send them an email at hello@filebase.com! or reach out directly to the Art Blocks team."]}],[{"l":"FAQs","p":["Core contract vs. Minter contract?","Does Art Blocks create a front-end site for our project?","Flex: Can JS external asset dependencies make external calls to other APIs/assets?","Flex: What are the limitations around file size and file type for external assets? How many external assets can a project have?","How can we add more team members to Discord?","How do we list Art Blocks Engine pieces on OpenSea?","How does autoApproveArtistSplitProposals work?","How does project size work on the Minter contract vs Core contract?","How long will each stage of the process take?","How long will the process take from start to public launch?","What are the Art Blocks Engine offerings?","What effect does ‘locking’ a project have?","What information do we need to provide?","What's included with Art Blocks Engine?","What's the difference between a testnet token and a mainnet token?","When should I enable GPU rendering?"]},{"i":"what-are-the-art-blocks-engine-offerings","l":"What are the Art Blocks Engine offerings?","p":["Art Blocks Engine: Used for on-chain storage of generative systems. Projects can use no dependencies or one dependency from a list of decentralized libraries. See the allowed dependencies here.","Art Blocks Engine Flex: Allows generative systems to reference off-chain assets stored on IPFS or Arweave, enabling creative tools like photography, AI, and GAN.","Email us at Engine@artblocks.io to discuss which offering best suits your needs."]},{"i":"whats-included-with-art-blocks-engine","l":"What's included with Art Blocks Engine?","p":["For a new partnership, the standard current Art Blocks Engine offerings include:","Deployment of Engine smart contracts suite to testnet and mainnet (includes gas costs).","Integration of deployed Core contract with decentralized Graph indexing architecture on testnet and mainnet, includes GRT costs incurred for subgraph update deployment.","Integration of deployed contracts and subgraph with Art Blocks' project setup site and rendering/metadata infrastructure (APIs: Token, Generator, Rendered Image).","(in-migration) Integration with the shared Art Blocks Minter Suite. Art Blocks is rolling out a shared minter suite that will be available for Engine Partners to use to mint their projects. Previously deployed V3 Engine contracts will have the ability to migrate to the new shared minter suite. This means the same minting contracts used for Art Blocks Flagship will be available for Engine partners. In addition to the ability to query minter state via subgraph or Hasura queries, Art Blocks has future plans to expand our offering to include the ability to configure minter settings in an Artist Dashboard, and the ability to use a new Art Blocks minting SDK to more easily mint tokens on your frontend."]},{"i":"what-effect-does-locking-a-project-have","l":"What effect does ‘locking’ a project have?","p":["A summary of how the smart contract functions behave:","addProjectScript","after being locked, maximum invocations may only be decreased","before being locked, maximum invocations may be increased","can only lock projects (i.e. locked projects can not be unlocked)","Locked projects can not be unlocked","Locking a project (specifically on V2 Contracts) permanently freezes the artist name, project name, project scripts, project license, and project IPFS hash on the blockchain. Additionally, maximum invocations of a project can never be increased.","only callable by admin whitelisted wallets on the core contract","project script changes:","removeProjectLastScript","The following functionality is affected by a project being unlocked vs. locked:","The following functionality is only allowed on unlocked projects:","toggleProjectIsLocked","updateProjectArtistName","updateProjectIpfsHash","updateProjectLicense","updateProjectMaxInvocations","updateProjectName","updateProjectScript","updateProjectScriptJSON"]},{"i":"changes-for-v3-contracts-deployed-after-march-23","l":"Changes for V3 contracts (deployed after March '23)","p":["In addition to the above, artists can update project description when project is unlocked. However, only contract admins can update project the description when the project is locked.","V3 contracts autolock four weeks after a project is complete."]},{"i":"how-can-we-add-more-team-members-to-discord","l":"How can we add more team members to Discord?","p":["Contact your account manager for an invite link to the private Discord server."]},{"i":"how-long-will-the-process-take-from-start-to-public-launch","l":"How long will the process take from start to public launch?","p":["The process typically takes 10 weeks from initial conversation to public launch, but is highly dependent on partner's resource allocation. To reduce delays, have a front-end developer, artist, go-to-market strategy, and sufficient onboarding time ready."]},{"i":"what-information-do-we-need-to-provide-to-deploy-our-smart-contracts","l":"What information do we need to provide to deploy our smart contracts?","p":["To get started, you'll provide our team with:","Network: (Mainnet or Testnet)","A testnet/mainnet Ethereum wallet address (that you currently own and control) you'll use to manage your Art Blocks Engine smart contracts.","The name you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"Art Blocks\")","The ticker symbol you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"BLOCKS\")","Deployment Type: V3 Onchain Engine or V3 Flex Engine","Minter Type: set price eth only, set price custom erc20, merkle tree allowlist holder-gated, linear DA, exponential DA, and exponential DA with settlement","note: minter selection will not be needed after migrating to shared minter suite","Starting project ID # (>=0):","Set autoApproveArtistSplitProposals true or false**","**It needs to be set at deployment and cannot be changed later.","tldr - if true, artist royalty wallet changes are auto-approved. If false, the contract admin will need to approve the artist's royalty wallet changes. This is an added check to ensure your artists aren't changing royalty wallets to a random address, which could complicate accounting/ OFAC compliance.","We cannot deploy your contract until you provide the above information. The name and symbol tied to your contract cannot change once your contract is deployed."]},{"i":"does-art-blocks-create-a-front-end-site-for-our-project","l":"Does Art Blocks create a front-end site for our project?","p":["No, partners are responsible for creating and designing their customer-facing experience.","However, we do have a front-end React template with web3 functionality you need to launch a minting site. You will still be responsible for designing the user exerpeicne, but this significantly reduces the time needed to complete a front-end."]},{"i":"how-long-will-each-stage-of-the-process-take","l":"How long will each stage of the process take?","p":["Initial outreach - 1-2 weeks","Project scope - 1-2 weeks","Contract agreement - 1 week","Smart contract details - 1-2 days","Contract configuration & testnet deployment - 1 week","Testnet infrastructure integration -** 1 week**","Integration with partner’s site - Varies(dependent on partner)","Test mints on partner site - Varies(dependent on partner)","Deployment to mainnet - 1-2 weeks","Mainnet infrastructure integration -** Varies**(dependent on partner)","Mint #0 - Instant","Project launch! - 1 week after step 11"]},{"l":"Contract Ecosystem","p":["Core contract: This is the smart contract that controls the artwork created by the artist. No financial transactions occur on this smart contract.","AdminACL: By default, Engine smart contracts have two sets of permissions, Admin and Artist. The AdminACL contract controls which wallets can access which functions on your core contract. If you'd like to assign more granular control of your smart contract to different wallets, you can fork and customize the AdminACL contract.","Minter Filer: The minter filter configures minter-types to specific projects.","Minter contract: These smart contracts receive funds and split them between the artist(s) and the platform. Artists receive funds directly from these contracts."]},{"i":"how-do-we-list-art-blocks-engine-pieces-on-secondary-markets","l":"How do we list Art Blocks Engine pieces on secondary markets?","p":["Secondary marketplaces will automatically detect and display projects on your contract. If you’d like each project to have its own storefront on OpenSea, please contact an account manager to facilitate the change."]},{"i":"whats-the-difference-between-a-testnet-token-and-a-mainnet-token","l":"What's the difference between a testnet token and a mainnet token?","p":["Testnet tokens are free, unlimited, and worthless. They only exist as a tool for the testing environment before spending actual money (Ether) deploying on Ethereum’s mainnet."]},{"i":"flex-what-are-the-limitations-around-file-size-and-file-type-for-external-assets-how-many-external-assets-can-a-project-have","l":"Flex: What are the limitations around file size and file type for external assets? How many external assets can a project have?","p":["There are no explicit limitations on the contract side, neither for file size or type or how many external assets a project can have. Ultimately, this is at the discretion of the artist, but Art Blocks recommends paying close attention to ensure that artworks are as accessible as possible for as many different types of users as possible. Generally speaking, the above factors should be influenced by trying to achieve the best user experience for the artwork in terms of performance and load time.","Some additional recommendations:","Try to keep the overall download size for users viewing the work to be under ~ 10mb OR ensure the artwork description mentions the heavier load/longer loading time. Additionally, consider whether or not it may make sense to have a loading indicator as part of the artwork itself.","When working with less common file types, remember to test on various platforms/browsers, to ensure the best cross-platform compatibility possible."]},{"i":"flex-can-js-external-asset-dependencies-make-external-calls-to-other-apisassets","l":"Flex: Can JS external asset dependencies make external calls to other APIs/assets?","p":["Having your JS external asset dependencies making external calls, whether it's to an API or other assets, is not a supported use of the Engine Flex offering, as it breaks the assumption of only utilizing off-chain decentralized platforms. We encourage you to, instead, serialize any data you may need from these external calls into assets (JSON, TXT, etc) that are also stored on the platforms Engine Flex currently supports (IPFS and Arweave)."]},{"i":"for-the-status-of-a-project-on-the-contract-how-does-active-and-paused-differ","l":"For the status of a project on the contract, how does 'active' and 'paused' differ?","p":["The value of paused is determined by artist, whereas active is determined by contract admin. Both need to be in a mintable state ( paused=false, active=true) for a project to be publicly available to mint."]},{"i":"why-is-there-a-small-delay-between-the-tokens-mint-transaction-confirming-and-it-being-viewable-on-the-art-blocks-generator-live-view","l":"Why is there a small delay between the token's mint transaction confirming and it being viewable on the Art Blocks Generator (live view)?","p":["Art Blocks uses the decentralized Graph network to index on-chain data in our publicly available subgraph. There can be a slight delay between the first block confirmation on the ethereum network for a transaction and that transaction being indexed by our subgraph. To mitigate this, as an Art Blocks engine provider, your client should be waiting multiple block confirmations (we recommend at least 2 blocks) before it shows the generator view to the user. The generator will return an error message if the token is not indexed yet, accompanied by 4XX status code. Many clients also employ a polling strategy, only showing the requested generator view once the requested generator url is returning a 2XX status code."]},{"i":"how-does-project-size-work-on-the-minter-contract-vs-core-contract","l":"How does project size work on the Minter contract vs Core contract?","p":["A project's max invocations on Art Blocks contracts are handled differently on the Core contract and the Minter contract.","On the Core contract, setting a project size establishes the project's maximum size, and this value cannot be increased once set. The max invocations on the core contract define the absolute upper limit for the number of mints for a specific project.","On the other hand, each Minter contract allows you to set max invocations for the specific minter using the manuallyLimitProjectMaxInvocations function. This setting does not lock the project size but controls the maximum number of mints allowed by that particular minter. When updating the maxInvocations value for a project in the Minter contract, you must adhere to these conditions:","The new value of _maxInvocations should not be greater than the maxInvocations set in the core contract.","The new value of _maxInvocations should not be less than the current number of invocations."]},{"i":"how-does-autoapproveartistsplitproposals-work","l":"How does autoApproveArtistSplitProposals work?","p":["When true, aproveArtistSplitProposals is a feature thatallows artists to automatically change their royalty split payout address and the split percentage without requiring approval from the contract admin. This makes the process faster and more convenient for artists but may increase the risk of unauthorized changes to royalty wallets, which could complicate accounting or OFAC compliance.","If set to else the contract admin will need to approve any changes to the artist's royalty wallet, adding a layer of security and control."]},{"i":"when-should-i-enable-gpu-rendering","l":"When should I enable GPU rendering?","p":["If your image preview is showing a blank, incomplete, or invalid rendering for a token, turning on GPU rendering may resolve the issue. GPU rendering is managed by the Art Blocks team and enabling is determined on a case-by-case basis. Before requesting GPU rendering, check your project script code for any potential issues and/or try increasing your render delay (up to 10min). Reach out to the Art Blocks team to enable GPU rendering on a specific project if the token issues continue after adjusting the delay."]}],[{"l":"Art Blocks Engine Flex Technical Details","p":["This page goes deeper into some technical considerations when working with the most current version of Artblocks Engine Flex. The latest version of the Engine Flex contract (v3) and interface can be found here:","https://github.com/ArtBlocks/artblocks-contracts/blob/main/packages/contracts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol","https://github.com/ArtBlocks/artblocks-contracts/blob/main/packages/contracts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol"]},{"l":"Introduction To External Asset Dependencies","p":["The Engine Flex contract introduces the concept of external asset dependencies. These essentially function as on-chain pointers to off-chain assets stored using decentralized storage technologies and, with the latest version of flex, also supports fully on-chain data storage. An external asset dependency is comprised of its content identifier (CID), if it's using Arweave or IPFS, a bytecodeAddress if it's specifically dealing with fully on-chain data, and a dependencyType, which maps to an Engine Flex supported platform.","Engine Flex currently supports adding external asset dependencies of the following types:","IPFS","Arweave","Onchain (data lives entirely on the blockchain)"]},{"i":"adding-updating--removing-external-asset-dependencies","l":"Adding, Updating & Removing External Asset Dependencies","p":["When working with and manipulating a project's external asset dependencies, you'll be relying on the following functions:","Note the parameter _cidOrData, which allows you to either pass in a CID if you are working with the IPFS/Arweave dependencyTypes or a data string if you are working with the onchain dependencyType.","For convenience and utility, the contract also provides the following function, allowing you to easily grab a project's external asset dependency at a specific index:","This convenience function returns data in the form of the following format:","Note that for dependencyTypes other than onchain (IPFS, Arweave), the returned bytecodeAddress will be the zero address and data will be an empty string. Conversely, if the dependencyType is onchain, the returned cid will be an empty string.","Some important factors to keep in mind with the above functions:","Only allowlisted/artist addresses can call these.","ExternalAssetDependencyType _dependencyType is a solidity enum, which can be passed into these functions as a uint8. This enum only defines three options as of now, IPFS, ARWEAVE, and ONCHAIN, which can be represented as 0, 1, and 2 respectively."]},{"l":"Note On Removing External Asset Dependencies","p":["In the interest of saving gas, the removeProjectExternalAssetDependency() function is implemented in such a way that it does not preserve the order of the project's external asset dependency mapping. Specifically, the way this removal logic works is as follows: when an index to remove is passed in, the element at that index being removed is swapped with the element at the last index of the list of assets. Now that the last index holds the element to be removed, that element is removed off the list. This method, in addition to being more gas efficient, also ensures that our list/mapping does not have any \"holes\". The tradeoff, however, is that the removal causes the order of the external asset dependencies in this list to change, albeit in a deterministic manner: the element at the last index always moves to the removed index. This is important to keep in mind when writing your project script, though you can always update the ordering manually as you see fit by utilizing the updateProjectExternalAssetDependency() function.","You can view directly the full implementation of this removal function here: https://github.com/ArtBlocks/artblocks-contracts/blob/main/packages/contracts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol#L524"]},{"l":"Preferred Gateways","p":["The Engine Flex contract allows you to specify preferred gateways for the currently supported dependency types (IPFS & Arweave). Gateways are accessible HTTP interfaces and, when combined with an asset CID, expose urls for assets being stored on these off-chain decentralized platforms. These preferred gateways are updateable with a string param via the following functions: updateArweaveGateway()& updateIPFSGateway().","Please note that these preferred gateways are set per-contract, not per-project."]},{"l":"Working With External Asset Dependencies In Your Project Script","p":["When you request the live view for a given token of a project, the hash and tokenId of the token are provided in the tokenData object and the Art Blocks Generator injects this into the served HTML live view. This tokenData object has now been extended with the following external asset dependency related data, if it is available:","Your project script can then easily make use of these dependencies by combining the CID of the asset with the appropriate gateway, if you are dealing with IPFS/Arweave dependencies. As a simple example: If you have an external asset dependency with a CID QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg and a dependencyType of IPFS, you can construct the full url of your external asset dependency by combining the preferredIPFSGateway, which let's assume is https://ipfs.io/ipfs/, with the asset CID. This gives you the full url of the asset, https://ipfs.io/ipfs/QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg, and allows your project script to download it with fetch and use it as it sees fit. For fully onchain external asset dependencies, the full data string that is stored on the blockchain will be injected.","Note that for IPFS/Arweave external asset dependencies if your CID is pointing to a directory of assets, rather than a single asset, your project script will need to be aware of the file naming structure of this directory to fetch the assets individually. Using the previous example, imagine that CID QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg was pointing to a directory of 10 PNG images, with filenames corresponding to the numbers 1-10. Your project script would generate the same full url with the information provided, https://ipfs.io/ipfs/QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg, but also append the specific file you want to fetch by being aware of the naming conventions, ie https://ipfs.io/ipfs/QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg/1.png."]},{"l":"Loading JS Libraries As External Asset Dependencies","p":["If you are specifically looking to utilize an IPFS/ARWEAVE type external asset dependency as a JavaScript library in your project script, you cannot simply add it as a script element onto the page. You must load it in a blocking manner so that the browser does not attempt to run your project script code before the lib is fully loaded. Here is an example of how to do this with ES6 dynamic imports (supported by most modern browsers: https://caniuse.com/es6-module-dynamic-import):","Here's another method without using ES6 dynamic imports, instead relying on using a callback that gets fired after the JS external asset dependency is injected into the html via a script tag:"]},{"i":"locking-a-projects-external-asset-dependencies","l":"Locking A Project's External Asset Dependencies","p":["Artists and allowlisted addresses also have the ability to lock a project's external asset dependencies:","This irreversible action removes the ability to add, update or remove from a project's external asset dependencies.","Important notes:","Preferred gateways do not get locked with this action and, in general, cannot be locked. This is intentional to allow support for modifying the preferred gateway over time, which may change while CIDs remain fixed/permanent.","You can lock a project's external asset dependencies regardless of whether or not the project itself is locked. And you can continue to modify a project's external dependencies even if the project is locked, as long as the external asset dependencies for the project are not locked."]},{"i":"why-should-i-use-the-engine-flex-specific-fields-for-cids-and-ipfs-gateways-rather-than-hard-coding-these-values-in-the-script","l":"Why should I use the Engine Flex specific fields for CIDs and IPFS gateways rather than hard-coding these values in the script?","p":["The Engine Flex contract was designed to expose specific on-contract fields for storing external asset dependencies (either via auxiliary on-chain storage, IPFS CIDs, or Arweave CIDs). For collectors and archivists preserving these art works, this increases the introspect-ability of where these external assets are stored, e.g. allowing for a more streamlined and robust process for replicating external assets stored on IPFS for a given project in the future.","Additionally, after project scripts are locked, if an IPFS gateway is hardcoded it isn't possible to update this in the future if the gateway (but not the underlying asset CIDs) needs to change for whatever reason (partner is migrating gateway providers from Pinata to Infura, partner is shutting down private gateway in favor of a public one, etc.). If using the specified on-chain fields, the CIDs can be locked independently from the gateway, allowing flexibility to preserve future compatibility of the on-chain generator down the road."]}],[{"l":"Common Custom Dashboard Mutations"},{"l":"Introduction","p":["As an Engine partner, you have the option to create a custom artist/admin dashboard. While the majority of your project configuration will occur through on-chain transactions, there are specific off-chain fields that need to be set directly via our GraphQL API.","This documentation outlines the permissions necessary for executing relevant actions and mutations. Please note that a user can only execute a mutation with the artist role for a project if their public address matches the artist address set for the project. A user can execute a mutation with the allowlisted role only if they are the super admin on the project's contract's ACL contract (V3 and up), or if they have been whitelisted on the project's contract (V2 and below).","For all mutations listed in this documentation, the user must include the x-hasura-role header in their request, specifying either artist or allowlisted as the role, as appropriate."]},{"l":"Actions","p":["Actions are specialized mutations that go beyond simple CRUD operations. Within your custom creator dashboard, you might find the updateFeatures and updateProjectMedia actions particularly useful.","The updateFeatures action initiates a test run of a feature script for a test token. Upon validating that the output aligns with the provided feature fields, it updates both the feature_fields and feature_script on the project. Both artists and allowlisted users can execute this action. Artists can make updates either before the project is completed, or afterwards, if the allowlisted user has toggled the enable_artist_update_after_completion flag on the project's associated features row.","The updateProjectMedia action refreshes various media assets linked to a project's tokens. The refreshed media depends on the parameters passed to the action, which may include different formats of preview images and features. This action is accessible to both artists and allowlisted users. However, the execution of this action is rate-limited to once 24 hours for artists.","Here are the parameters accepted by the updateProjectMedia action:","projectId: The ID of the project to be updated.","features: A boolean that indicates whether to recalculate features for the project's tokens.","render: A boolean that indicates whether to re-render the preview images for the project.","renderVideo: A boolean that indicates whether to re-render preview videos/gifs for the project.","All these actions are executed via specific mutations in the GraphQL API."]},{"l":"Tags","p":["Tags and projects share a many-to-many relationship, managed through the entity_tags table. Tags serve as non-functional descriptors that can be used to categorize projects. To associate a tag with a project, the insert_entity_tags mutation is used.","In the context of an Engine dashboard, you're likely most interested in presentation tags, which can be fetched with the following query:","Both the artist and contract admin roles have the permissions to execute the insert_entity_tags mutation. Here's an example of how to use this mutation:"]},{"l":"Project","p":["-","All these fields are updated using the update_projects_metadata_by_pk mutation.","Allowlisted Permission","Allows artists to acknowledge contributors, inspirations, or other sources of influence.","Artist Permission","artist_display_notes","artist_interview","charitable_giving_details","Contains the artist's intentions for how the artwork should be displayed.","creative_credit","Description","Determines whether GIFs and MP4s are generated during individual token refreshes, batch token refreshes, and new token mints.","disable_sample_generator","Enables the artist to specify a token ID to feature. Determines the token displayed as the project's cover image on our flagship site.","featured_token_id","Field","generate_video_assets*","Indicates the artist's preference for displaying project previews. Influences whether the \"explore possibilities\" modal is displayed on the project page on our flagship site.","link_to_license","Outlines any charitable giving aspects associated with the project.","Please note: In the tables above, 'X' stands for write permissions, and '-' stands for no write permissions.","preview_render_type","primary_render_type","Provides a link to an interview with the artist.","Provides a link to the copyright license for the project (e.g., \"https://creativecommons.org/licenses/by-nc-nd/4.0/\").","Provides specific details about the sales mechanics of the project.","render_delay*","sales_notes","Sets the delay (in seconds) before our renderer captures a snapshot of the project for preview images.","Sets the intended start time of the project, indicating when it will become unpaused and active.","Specifies the preferred format for displaying the project on detail pages.","Specifies the preferred format for the project's preview images.","start_date","The table below lists permissions for directly updating relevant off-chain fields on the project row. Many of these fields are optional and are intended to enrich the descriptive content on your frontend. Fields marked with an asterisk (*) have a functional impact on the project.","X"]}],[{"l":"Minter Suite Migration Runbook","p":["This documentation is a work in progress. Minter suite migration is ongoing, and initial migrations are being actively worked. Please reach out to the Art Blocks team with any questions.","This page provides a step-by-step guide on how to migrate a V3 Art Blocks Engine core contract from the legacy non-shared minter suite to the new shared minter suite. This migration is required for all V3 Engine contracts that want to use the new shared minter suite, which has the following benefits:","All minter contracts are indexed by the Art Blocks subgraph, and can therefore be configured in the new Artist Dashboard website (coming soon)","All minter Art Blocks Flagship minting contracts become available for use by Engine projects","Collectors can purchase from the same trusted contract they interact with on Flagship.","Art Blocks will release an SDK to simplify the minting process for Engine projects (coming soon)","Migration is not available for V2 Engine contracts; for Engine partners that wish to upgrade to a V3 Engine contract, please contact the Art Blocks team.","Migration is not required for V3 Engine contracts that wish to continue using the legacy non-shared minter suite. However, we recommend migrating to the new shared minter suite for the benefits listed above."]},{"l":"Migration Steps"},{"l":"1. Engine partner frontend updated to support new minter suite","p":["In the coming months, the Art Blocks team will be releasing a new minting SDK that can be used to support the new shared minter suite. Documentation for the SDK will be referenced here when it becomes available.","MinterDAExpHolderV5","MinterDAExpSettlementV3","MinterDAExpV5","MinterDALinHolderV5","MinterDALinV5","MinterSetPriceERC20V5","MinterSetPriceHolderV5","MinterSetPriceMerkleV5","MinterSetPricePolyptychERC20V5","MinterSetPricePolyptychV5","MinterSetPriceV5","The Engine partner's frontend must be updated to support the new shared minter suite. In general, the new shared minter suite requires the following changes:","The source code of all new, shared minter contracts is available on the Art Blocks smart contracts monrorepo. The complete list of all new, shared minter contracts is:","View functions on the minter contracts may have changed slightly. This is due to some minor architectural changes to the minter contracts that we believe simplifies their codebase and make them more extensible.","When specifying a project to configure or purchase from, an additional input arg of coreContract(address) must be specified. This is because one minter/minter filter contract is used for many core contracts."]},{"l":"2. Schedule downtime for any live projects","p":["The migration process requires all artists with live projects configure a new minter. All live projects should be paused during the migration process. Switching to the new minter filter is simple, but after migrating to the new minter filter, the artist of every live project must configure their minter in the new minter suite. This is also only a few transactions, but it is fully reliant on coordinating with artists to be ready to re-configure minters of open projects after switching to the new minter filter."]},{"i":"3-core-contract-admin-sends-migration-transactions-testnet-before-mainnet","l":"3. Core contract admin sends migration transactions (testnet before mainnet)","p":["0x13178A7a8A1A9460dBE39f7eCcEbD91B31752b91","0x28f2D3805652FB5d359486dFfb7D08320D403240","0x6a5976391E708fBf918c3786cd1FcbB88732fbc1","0x94560abECb897f359ee1A6Ed0E922315Da11752d","0xa07f47c30C262adcC263A4D44595972c50e04db7","0xa2ccfE293bc2CDD78D8166a82D1e18cD2148122b","0xC91CFC2062D8B4Ff53A7c8836CAEf925a7C78c81","0xD1d9aD8B1B520F19DFE43Cc975b9470840e8b824","Arbitrum One","Artist Staging Arbitrum-Sepolia","Artist Staging Goerli","Artist Staging Sepolia","Engine Admin calls updateMinterContract on the core contract, passing in the address of the shared minter filter.","Engine Admin calls updateRandomizerAddress on the core contract, passing in the address of the shared randomizer","Mainnet (Ethereum)","Network","Shared Minter Filter Contract Address","Shared Randomizer Contract Address","The Engine partner's core contract admin should send 2 transactions to the core contract:","You are now using the new shared minter suite!"]},{"l":"4. Artists re-configure minters for ALL LIVE PROJECTS","p":["AFTER step 3, artists must re-configure their minters for all live projects. This is a quick process, but requires coordination with artists to ensure they are ready to re-configure their minters after the switch.","Artists can re-configure their minters manually by following the instructions documented in the engine project launch/assigning a minter section. Additionally, soon, artists will be able to configure their project minters via the (new) Artist Dashboard.","The process for most open projects will likely be to switch to a fixed price minter.","After configuring a minter, the project is now using the new shared minter suite and live for minting!"]},{"l":"5. Engine partner monitors migration progress","p":["It is recommended that the Engine partner monitor the migration process to ensure that all artists have successfully re-configured their minters. Additionally, the Engine partner should use diligence to ensure that purchases and payment splits after the migration are working as expected."]},{"i":"6-add-any-custom-one-off-minters-to-the-shared-minter-suite","l":"6. Add any custom, one-off minters to the shared minter suite","p":["The new shared minter suite provides all Art Blocks Flagship minters to Engine projects. However, if the Engine partner has any custom, one-off minters that they would like to use for their core contract, they can be added for their specific contract. Please see please see the Adding custom, one-off minters page for steps on how to do this.","Note that at this time, custom, one-off minters will not be indexed in the Art Blocks Subgraph or API. This is likely not a change for custom minters being used prior to migration."]},{"l":"7. Explore new minter suite features","p":["The new shared minter suite provides all Art Blocks Flagship minters to Engine projects. Feel free to explore integrating new minters into your product!"]},{"l":"Migration FAQ"},{"i":"what-happens-if-an-artist-does-not-re-configure-their-minter","l":"What happens if an artist does not re-configure their minter?","p":["If an artist does not re-configure their minter, their project will not be able to mint tokens. The artist will need to re-configure their minter before their project can mint tokens."]},{"i":"what-happens-if-an-artist-re-configures-their-minter-incorrectly","l":"What happens if an artist re-configures their minter incorrectly?","p":["If an artist re-configures their minter incorrectly, best case scenario is that their project will not be able to mint tokens, and troubleshooting can identify the issue. Worst case scenario is that their project will be able to mint tokens, but the price per token will be incorrect (e.g. incorrect price entered) or the maximum invocations will be too high (e.g. forgot to set minter-max-invocations to a lower value than set on the core contract, if desired). For these reasons, artists should use diligence when re-configuring their minters."]},{"i":"what-happens-if-i-migrate-to-the-new-shared-minter-suite","l":"What happens if I migrate to the new shared minter suite?","p":["If you migrate to the new shared minter suite, you will be able to use any new minters developed for Art Blocks Flagship. Additionally, you will be able to use the Artist Dashboard to configure your minters, because your minter suite will be indexed. You will also be able to use the new minting SDK to simplify your minting process."]},{"i":"what-happens-if-i-do-not-migrate-to-the-new-shared-minter-suite","l":"What happens if I do not migrate to the new shared minter suite?","p":["If you do not migrate to the new shared minter suite, nothing will change, but you will miss out on new developments. You will not be able to use any new minters developed for Art Blocks Flagship. Additionally, you will not be able to use the Artist Dashboard to configure your minters, because your minter suite will not be indexed. You will need to continue to use the legacy non-shared minter suite."]},{"i":"what-happens-if-i-migrate-to-the-new-shared-minter-suite-but-i-do-not-want-to-use-the-coming-soon-artist-dashboard-to-configure-my-minters","l":"What happens if I migrate to the new shared minter suite, but I do not want to use the (coming soon) Artist Dashboard to configure my minters?","p":["There are many reasons why a partner might want to do this!","If you migrate to the new shared minter suite, but you do not want to use the Artist Dashboard to configure your minters, you can continue to configure your minters via your frontend, etherscan, etc., but your process will be slightly updated to support the new shared minter suite. Comparing the new minter contracts and the legacy minter contracts will help you understand the changes."]},{"i":"what-happens-if-i-migrate-to-the-new-shared-minter-suite-but-i-do-not-want-to-use-the-new-coming-soon-minting-sdk","l":"What happens if I migrate to the new shared minter suite, but I do not want to use the new (coming soon) minting SDK?","p":["No problem!","If you migrate to the new shared minter suite, but you do not want to use the new minting SDK, you can continue to use your existing minting process, but your process will be slightly updated to support the new shared minter suite."]}],[{"l":"Art Blocks 101 for Creators","p":["A guide on getting started as a creator with Art Blocks.","The primary audience for this document is artists who have already entered the pipeline for launching a project on Art Blocks. If you are an artist currently waiting in the applications queue or applying to Art Blocks, this documentation will provide a helpful guide for you in terms of what to expect, but many of the steps here will not be actionable for you until you have had a project shell set up by the Art Blocks team.","Artists will likely need to tweak/optimize their project code to get it working in the Art Blocks environment. Specifically, static images are rendered for all projects (used as thumbnails, on other platforms, etc.). To generate these, Art Blocks currently uses compute instances running headless Chromium with Puppeteer. Headless Chromium requires the use of SwiftShader, a CPU implementation of the GPU API. This means GPU intensive projects will render slower and may require code optimization and performance improvements from the artist. To closely replicate this environment on your end while developing, we recommend using Chrome and turning off\"Use Hardware Acceleration\" in Settings."]},{"l":"Documentation","p":["The Art Blocks platform hosts generative projects for the production of verifiably deterministic outputs. A generative script (using p5js for example) is stored immutably on the Ethereum blockchain for each project. When a user wants to purchase an iteration of a project hosted on the platform, they purchase an ERC721 compliant \"non-fungible\" token, also stored on the Ethereum blockchain, containing a provably unique \"seed\" which controls variables in the generative script. These variables, in turn, control the way the output looks and operates.","Each \"seed\", also known as a \"hash string\" is a hexadecimal string generated in a pseudo-random manner at the time the token is minted. Each character (0-9, a-f) represents a value from 0-15 and each pair of characters (\"aa\", or \"f2\") represents a value from 0-255.","For example:","This hash will be the source of entropy or variation use to determine the output of your algorithm. When your art is rendered on Art Blocks, your script will have access to a global variable called tokenData. One of the first lines in your script should be to read in the hash from this variable.","Included in the tokenData is also the tokenId. The tokenId encodes both the project and mint.","Please note: if you include using the tokenId as a way to determine the outputs of your script you must disclose this as part of the release communications for your project.","If your script needs to know the mint number or project number, it can do so like this:","When you are testing locally, this variable obviously will not be defined in your browser environment. This here is a simple function to generate valid hashes and tokenIds."]},{"l":"Safely deriving randomness from the token hash","p":["Art Blocks requires that all artists use an instance of the following Random class to feed all of their project's randomness. If you need to modify/customize the Random class, please flag this to our team during the review process.","Note that the class uses the prng algorithm sfc32, which was designed and coded by Chris Doty-Humphry and is public domain. More information can be found at http://pracrand.sourceforge.net.","The convenience methods random_num, random_int, random_bool, and random_choice may be removed if not needed for a specific project. Artists may also add their own convenience methods, but all randomness should be originally sourced from the random_dec() function.","We can get an instance of the Random class like so:","Now each time we need some randomness we can call various helper functions:","Every time one of these functions is called, random_dec() will also be called somewhere in the stack, applying the deterministic arithmetic to the seed and returning a new random number."]},{"i":"i-heard-i-shouldnt-use-mathrandom-why-not","l":"I heard I shouldn't use Math.random(). Why not?","p":["When users mint each piece, they are creating a hash token on the blockchain. All the attributes of your piece should be derived from that token so that user will be able to render their piece and get the same results each time. Math.random is derived from the computer's clock, so there is no guarantee you will get the same output on different computing environments in the future."]},{"l":"Guidelines and Constraints","p":["Now you have the basics here are some general principles you need to consider when making your art."]},{"l":"Limited Dependencies","p":["a-frame","Additional libraries may be added at moderator discretion, but the rule is only one external library per project.","babylon.js","Canvas element provided by template (#babylon-canvas)","Each project can have zero or one library dependency. The approved dependencies are currently the following:","http://paperjs.org","https://aframe.io","https://babylonjs.com","https://github.com/metafizzy/zdog","https://github.com/twitter/twemoji","https://p5js.org","https://processing.org","https://threejs.org","https://tonejs.github.io","Library","megavox","No Library at all","Notes","p5.js","paper.js","processing.js","r124","regl","Source","svg","three.js","tone.js","twemoji","v0.12.15","v1.0.0","v1.1.0-beta","v1.1.2","v1.2.0","v1.4.6","v14.0.2","v14.8.15","v2.1.0","v5.0.0","Vanilla JS, CSS, HTML, WebGL","Version","vox","Zdog"]},{"l":"Code templates by dependency type","p":["When uploading your project to testnet, you may refer to this script template: https://github.com/ArtBlocks/node-artblocks/blob/main/src/templates.js"]},{"l":"Deterministic","p":["Each output must be deterministic based on a single hash. More specifically, the initial output or frame must be the same. If your piece is animated, some randomness is okay. This is so when the art is rendered as an image (e.g. for OpenSea) it is always the same."]},{"l":"Dimensionless","p":["The output must be dimension agnostic. Meaning it scales seamlessly to any dimension. While you can control the dimension ratio (e.g. width/height can be 1.0, 1.5, 0.75 etc.) you have no control over the dimensions of the browser someone else might be using. The output will be rendered by the server at 2400x2400 (see below for ratios other than 1) and typically displayed in most browsers at 1000x1000 but your output should be the same at higher resolutions. Obviously, at lower resolutions, fewer pixels may limit what your output looks like, such as the smoothness of lines, which is okay. This is mainly to ensure your work can be reproduced at print quality.","A simple way to account for this is to define a default dimension and create a multiplier to scale coordinates or sizes relative to the canvas dimensions. Below uses p5js as an example but the same principle applies regardless of the language.","Before submitting your script, it's probably a good idea to test it in different resolutions and aspect ratios.","Set the hash to a constant value:","And then play with the browser window size, and refresh to check that your art looks the same at any resolution."]},{"l":"Shaders","p":["If you are using shaders, you must include the shader code in the script itself (not in a separate file). A typical vertex & fragment shader might be defined like the following:","These can then be used by the library you are using to render your art. For example, if using p5js:"]},{"l":"Cost","p":["Storing code on Ethereum is expensive! Taking average gas prices, you can generally expect to pay ~$10 for each full line of code your script requires. With that in mind - keep things efficient, maximize code reuse with functions, remove comments, and minify your finished code.","Based on previous projects, we've estimated the cost of uploading a script to be the following; where Bytes is the size of your project and gwei price is the price you set when submitting your transaction. It always helps to wait until non-peak hours to upload your script.","So a 10 KB project at 100 gwei would be:","Artists have recently targeted between ~5-20 KB for their code (without the library), but obviously this will vary by project scope."]},{"l":"Data Compression","p":["We allow artists to compress data stored within their scripts (e.g. SVG data); but in the case where the logic of the script itself is compressed to the point of obfuscating the auditing process we may ask that artists remove this level of compression."]},{"l":"Attribution","p":["Much (generative art) source code is published under permissive copyleft licenses, making it available to be used by everybody and depending on the license even for commercial purposes. In case your project's code contains any code not written by yourself, please inform the Art Blocks team about it so the appropriate considerations and attributions can be made.","Common source code licenses (in creative coding):","CC BY: The original author and license must be clearly and appropriately stated.","CC BY-SA: As CC BY, but all derivates must also be licensed under CC BY-SA.","CC BY-NC-SA: As CC BY-SA, but no commercial use is allowed.","MIT: similar to CC BY","GPL: similar to CC BY-SA","There are many other free-to-use licenses commonly used on open source software. Please carefully read the full details on any licensed code you re-use or modify, before including it in your project."]},{"l":"Testing on Goerli","p":["Once your application is approved and your script is ready, you will test it out on an Art Blocks staging site running on one of Ethereum's test networks (Goerli). This will make sure there aren't any bugs or errors and that if it's working on Goerli, it will work on Mainnet. You can connect to this site by changing the network in your browser wallet (e.g. the very top button of MetaMask). You'll still be using the same wallet and address, except on the test network.","Note: If you don't have \"Goerly ETH\" ask a mod or previous artist, we'll send you some to play with. Or if you don't feel like waiting, request some from the faucet: - - https://goerlifaucet.com/ https://goerli-faucet.pk910.de/(POW faucet so this can run in the background and accumulate goerliETH over time)"]},{"i":"ropsten--goerli-upgrade","l":"ROPSTEN > GOERLI UPGRADE","p":["As of Aug 2, 2022","Ropsten is being deprecated entirely as a network. New testnet means new smart contracts: Ropsten artist-staging data will be preserved in a read-only state to be accessed at https://ropsten-artist-staging.artblocks.io/ after August 2nd.","The website for AB core will remain the same: You will still visit https://artist-staging.artblocks.io/, but you will be asked to connect with the Goerli Test Network rather than the Ropsten Test Network.","If you previously had a testnet shell on the Ropsten network, you may still access your project shell using https://ropsten-artist-staging.artblocks.io/ as a frozen read-only set of data. If you are a returning artist, please send( Discord: madpinney#1183) a DM to set up a Goerli project shell.","As a reminder, you can stock up on Goerli ETH here: https://goerlifaucet.com/ https://goerli-faucet.pk910.de/(POW faucet so this can run in the background and accumulate goerliETH over time)"]},{"l":"Interacting with your Project","p":["If you made it this far, we have probably requested a project name and an Ethereum address from you. If not, that probably means your an artist who is in our pipeline and pending being onboarded–once we get you processed the following instructions will make more sense!","If you have provided a project name and Ethereum address to our team, this address you provided to our team will be used on mainnet and on Ropsten. So at this point change your network to Ropsten in MetaMask. On Ropsten, we'll practice uploading everything so that it all goes smooth on mainnet when the ETH is real. After loading the page and connecting your wallet, you should see a button labeled \"Edit Project\". A multi-tabbed form will pop up. You only need to focus on the following:"]},{"l":"Project","p":["This should all be self-explanatory. Just fill and submit each one separately."]},{"l":"Token","p":["In this tab you'll set the price and max invocations for your project. If you're accepting ETH as payment you don't need to worry about \"Updated Currency Information\" and should not change the currency address. To reiterate, do not update the currency address to be your wallet address–this field should only be set if you are accepting payment for your project in some non-ETH ERC20-compliant token.","You can though specify any ERC20-compliant token if you choose, just give someone on the Art Blocks team a heads up that you wish to go down this route.","Set the baseURI: https://api.artblocks.io/token/"]},{"l":"Script","p":["Here you'll first specify the dependency of your project including the script type and the version number of that dependency. For most scripts, you can leave the version blank or enter 1. The aspect ratio is a single number. E.g. 1 or 0.75 etc. If your piece takes a certain amount of time to fully render you can type in the render delay to let the server know when to render the canvas.","Once you've submitted your script details add your script to the \"Project Scripts\" box. Remember, tokenData.hash is a global variable in the environment this script will live in, so you do not need to define tokenData in your script, just expect your script will have access to it.","If your script is big, consider minifying it. If your script is so big that you cannot fit it in a single transaction (you're getting an error when you submit), you may need to split it up and submit each part subsequently."]},{"l":"Splitting","p":["Once you have a working minified version of your project, a recommended way of splitting the file in parts for upload is to use the \"split\" command in Unix systems (Linux, Mac), like this:","That will create an evenly distributed set of files with the splitted code, automatically. The maximum size you can upload to Artblocks per transaction is around 24KB (you can center that as -b 23900 in the split tool, since it does not take decimals)","if you are on Windows, you can use the same command if you have git bash, or a tool like 7-Zip, which allows you to split without compression."]},{"l":"Finishing Actions","p":["Once all of the necessary fields have been submitted, you can then click \"Purchases Paused\" to test out the minting. Once your test mints are working in the livescript view, mint 20-40.","Make sure you've tested your code on multiple browsers (Chrome / Firefox / Safari) and on multiple device types (desktop / mobile) to ensure consistent output."]},{"i":"how-does-my-project-get-those-opensea-attributes","l":"How does my project get those OpenSea attributes?","p":["Once your project is selected to be included in one of the Art Blocks collections, the onboarding team will help you with this. The one thing to keep in mind is that all of the attributes you want displayed should be directly generated from the transaction hash and should not depend on any other randomness.","This script is essentially a copy of your rendering script but without any dependencies present (the server won't have access to them).","For full details on how to structure your project features, please see Art Blocks Features Script."]}],[{"l":"Artist onboarding steps"},{"l":"Artist Onboarding Flow","p":["Artist Onboarding Process-1-page-001","Below, you'll find an overview of each step of our onboarding process, as well as an , estimated time required for each step."]},{"l":"1. Application","p":["You may apply using this link. We expect that artists have a creative history and the ability to provide an original generative script. If you plan to work collaboratively, please provide complete information for all contributors. All submitted work must be original. We do not intend to release projects that use licensed, purchased, or recycled content. Please make sure you’re bringing your unique project to Art Blocks. You will receive a project shell on our staging site when you apply. This project shell is where you will upload your project to Art Blocks for review. Only the wallet address connected to Art Blocks will have access to the project shell when applying. The shell creation ensures that all projects are compatible with Art Blocks and reviewed using a standard format.","To learn more about the application process please visit artblocks.io/apply."]},{"l":"2. Upload to testnet","p":["You'll be asked to upload your project to the artist staging site on the Goerli test network. Here you can mint test outputs of your project and work out any kinks in your script before the Art Blocks selection committee reviews it.","Ensure the work has a project description that explains the work's technical, aesthetic, and conceptual approaches. Prototypes should have 20-40 mints, as well as feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. To confirm you’ve included everything in your staging shell, refer to the [Testnet Checklist] (testnet-checklist.md). Required fields are marked in testnet with a “\uD83D\uDCC4: fields required for artist screening” indication. As you are uploading to testnet, you only need to fill in fields with this indication.","Please note that all Art Blocks team members are working within US time zones, which means that there may be a delay in processing requests.","Timeline: Artist-dependent, but most artists spend about 1 week on this step"]},{"l":"3. Script test runs and project review","p":["Before Art Blocks considers projects for release, the project must be completely finished and uploaded to artist-staging.artblocks.io. All staging shells must have 20-40 mints, a project description, an artist bio, and features traits that follow the conceptual and formal logic of the collection. We are superseding the chronological queue of applications. When your project is ready for review, you must email apply@artblocks.io indicating you are ready to be considered for release.","All prototypes should be completely finished before review. The team will let you know when the work will be screened and give you a timeline for the acceptance decision.","Successful projects will go through two screenings, the first is mediated by an internal committee on the Art Blocks team, and the second is by the Art Blocks Curation Board. Art Blocks Curation Board members are responsible for reviewing, critiquing, and selecting projects included in Art Blocks’ Curated Collection, a group of projects that have been recognized for significant accomplishment in aesthetics, conceptual rigor, technical quality, and innovation. Releasing on Art Blocks is a selective process, and projects should be outstanding in their aesthetics, innovation, technical quality, and concept. We are currently accepting 10% of projects submitted to release. Artists will receive, upon acceptance to the platform, the product category under which they will release, Presents or Curated, and collection size and pricing recommendations. Artists are provided clear and constructive feedback, opportunities to engage with artists, curators and collectors to promote learning, inquiry, and dialogue with on-chain generative art, and lastly, hands-on support in marketing and writing about the work. We appreciate your patience as you wait to be reviewed, accepted, and on-boarded onto Art Blocks.","Projects are selected for release based on the criteria outlined here: Project scoring rubric v1","If your project is selected, you'll move into the Creator Terms step.","Timeline: 3-6 weeks"]},{"l":"4. Creator terms","p":["Our team will send you Art Blocks' Creator Terms via email to sign. These documents include Creator Terms and a W-9 or W-8 form that is necessary for Art Blocks to pay you artist royalties. In addition, you will be asked to complete an Artist Information Form to collate your artist bio, recent exhibitions, projects, and press. You can move forward once we have received the proper paperwork.","Timeline: Artist dependent. Typically 1-2 days"]},{"l":"5. Discord DM Created","p":["Once creator terms have been accepted, the artist will be connected with the Art Team to prepare their project for release. Curated projects will be connected with the Artistic Director for 1:1 studio visit. You will have the opportunity to incorporate feedback from the selection review before moving to mainnet.","Timeline: 7-10 days"]},{"l":"6. Finalize your script and do QA testing","p":["After you’ve received notes from the Curation Board and made final edits to your project, our team will audit your script. Art Blocks’ audit ensures the project meets the technical requirements of the platform. During the audit, your project will be checked for security concerns and consistency across different resolutions and aspect ratios will be verified. Your script can be minified for the audit.","Timeline: 5-7 days"]},{"l":"8. Finalizations and upload to mainnet","p":["Once the audit is complete, you'll move on to the mainnet finalization stage and get your project ready for launch, as either Curated or Presents.","Timeline: Artist-dependent, but most artists spend about 1 week on this step"]},{"l":"9. Finalize project logistics and schedule project launch","p":["Lock in series size, price mechanics (Dutch Auction, Linear Auction, or Fixed Price), launch date, revenue splits, and charity component for your project. For more information about price mechanics, revenue splits, and the charity component, please see our FAQs. For more information about price mechanics and the charity component, please see our FAQs. Art Blocks releases three projects weekly; due to the number of artists in our pipeline, there is often a 2-6 week runway for release. After you have scheduled your project for release, you may begin promoting the project. For tips on marketing, please see our Marketing 101. After your project is scheduled, you must complete our Cover Pages, an official record of the agreed terms. You must complete the document to receive royalty payments.","Timeline: 1-2 days"]},{"i":"9a-artist-interview-curated-projects-only","l":"9a. Artist Interview [Curated projects only]","p":["Complete an interview with the Art Team to be published the week of your project launch. This interview will highlight your background, creative history, and Art Blocks project.","Timeline: dependant on release runway"]},{"l":"10. Project Launch","p":["Congratulations, you have made it! Your project is ready to be unpaused and opened for minting. You can participate in an optional live Pre-Drop Talk on Twitter with one of our Community Team members to answer questions and chat with the community.","Timeline: typically ~4-6 weeks after the completion of Step 8"]},{"l":"11. Post-Launch","p":["After you’ve released your project, you will be asked to fill out an Art Blocks Feedback Survey. In addition to your feedback, we will inquire about your interest in being considered for commissions, partnerships, contract work, and more with our Art Blocks Engine partners. Please also report charitable donations to your mainnet DM.","You may also personalize your collection layout on OpenSea. Learn how to do so here","Post-launch, you will still have access to your shell, where you can start uploading a new project at your leisure. Once your project has been 100% minted, you may submit another project for review."]}],[{"i":"#","p":["Best Practices for Applying Artists, Non-Selection Policy"]},{"l":"Best practices","p":["Aesthetic excellence: Your project description and or satellite site should closely outline aesthetic details such as color palette and compositional types, and variability. Each output should be distinctive but also clearly connected to other outputs within the project, and their relationship to each other should be an expression of the conceptual frame of the project as a whole","Anticipate and Address Questions: Think about potential questions that the screening committees will consider about your project. For instance, if you were asked about the new ground you're trying to break with your work, what would your provisional answer be? How does it relate to, or build on, other artistic work you have done in the past? How does it relate to the work of other artists working in creative coding and blockchain technology? How does this project advance the medium of generative art? These are tough questions, but they are the curation board's criteria in reviewing projects, and anticipating line of thinking can help you provide a richer description. Don’t be afraid to keep it simple and direct.","Art Blocks is a highly selective platform, and submitting a project for consideration is a multi-step process. With careful preparation and a keen focus on specific criteria, however, you can reduce the potential intensity of the process and significantly enhance the likelihood of a successful application. Remember, the process demands an investment of your time and effort that matches the high standard of projects Art Blocks looks to release. Even if your project is not selected, a strong application can provide inroads to other opportunities in our community such as the opportunity to connect with the Art Blocks Engine, an invitation to participate in artist-specific programming, or being identified as a potential future candidate for project release and mentorship. Numerous generative artists have gotten their start with an Art Blocks release, and we maintain a steadfast commitment to discovering and promoting a diverse range of unique talents.","Articulating your artistic vision effectively is key to capturing the interest and appreciation of the Art Blocks community. Here you will find effective strategies for successful applications:","Code Meets Platform Requirements: Please read the Guidelines & Constraints section of the creator documentation to ensure your project uses the approved code libraries and the outputs are dimensionless and deterministic.","Complete your Staging Shell: After you have minted your test outputs, make sure to include a project description, an artist bio, interactivity instructions (if applicable), and feature traits that align with the conceptual and visual logic of the project.","Distinctive Position: Your project should exhibit a distinctive and personal point of view. It should be designed and produced to communicate your intention and concept, while also leaving room for the viewer to bring their interpretation of your work.","First, let’s review the basics:","Focus on your own contribution: Ensure your project doesn't merely follow coding templates but rather showcases what you have done with code. Ideally, the visual outputs and underlying concepts align and strengthen each other.","Maximize Your Space: Use your project description space to speak directly to the viewer. This can be a simple, clear bit of text that elaborates on work's distinctiveness, the new territories it explores, and how it contributes to or diverges from the broader context of generative art and computational art history. It needn’t be more than 750 words. It is also recommended that you set up a space on a satellite site, which can be linked in the project description. This satellite site will allow additional space for you to outline your project’s history and evolution. It is a great place to showcase the iteration of your ideas, source materials, and examples of different types of outputs.","Notify Art Blocks: Once you have completed steps 1-3 and feel your project is ready for review, send an email to apply@artblocks.io indicating your readiness for consideration for release. Upon receipt of your email, a member of the Art Team will confirm your submission and provide an estimated timeline for the review process.","Project Completion: Your project needs to be completely finished and uploaded to artist-staging.artblocks.io before it is screened for release consideration.. Once your algorithm has been uploaded, you will need to mint test outputs, each staging shell should have between 40 to 60 test outputs for review.","Remember, applying to release a project on Art Blocks is a multi-step process that requires creativity, technical skill, and a deep understanding of the platform's requirements and expectations. Articulating your artistic vision effectively is key to capturing the interest and appreciation of the Art Blocks community. Thank you so much for bringing you project to Art Blocks for consideration. We really look forward to seeing what you have been working on!","Score 0: The project is not visually/sonically well composed.","Score 1: The project is visually/sonically well composed.","Score 2: The project demonstrates strong aesthetic choices, cohesive design and concepts, functional and appropriate programming techniques, and clear understanding of generative and computational aesthetics and concepts.","Score 3: The project shows careful consideration of aesthetic details, such as color palette and compositional rhythm. The visuals are unique, relevant, and supportive of the project concept. Code is functional, detailed, and well-executed, integrating computation and aesthetics effectively. The project uses common generative styles to create unique aesthetics & compositional forms.","Score 4: The work exhibits emotional, intellectual, and conceptual qualities through aesthetics, and is successful from an aesthetic point of view. It showcases an authentic and original point of view, clear communication of intention and concept, and a compelling description. Code employs inventive techniques and supports the underlying concept. The project covers new ground and brings something new into the world.","Screening Process: Once we’ve verified that your project code, the test outputs, project description, artist bio, and features list as complete, your project will go through two screenings: first by an internal Art Team committee and, second,by the Art Blocks Curation Board.","Technical excellence and innovation: Your project should integrate computation and aesthetics effectively, with well-designed and executed details. Innovative, never-before-seen coding techniques will score highly in review.","Understand the Process: Familiarize yourself with the application process, which can be found at artblocks.io/apply. This portal gives you access to the Art Blocks staging environment, where you can upload your algorithm onto the test network. Please use this guide to all form fields and buttons within testnet and mainnet project environments.","Understanding the Evaluation Criteria: Familiarize yourself with the Art Blocks scoring system, which ranges from 0 to 4.","Work on Your Project Description: Your project description is your opportunity to speak on behalf of your work. It is where you can express your intentions as an artist and help viewers get a foothold in what they are looking at. It's also a place for you to offer some bigger claims about your work. Consider the new ground you have been exploring—technical, conceptual, or aesthetic. Be sure to clarify your ideas about your project's purpose, significance, and distinctiveness. This can be challenging, but providing your own perspective can help frame the interpretation of your work for the internal selection committee, the Art Blocks Curation Board, and, eventually, the audience of collectors, artist peers, critics, and curators."]},{"l":"Non-Selection Policy","p":["At Art Blocks, we highly value the creative contributions of artists and creators who submit their work for consideration. However, due to the volume of submissions we receive, and limited release slots available, we do not provide specific feedback for rejected projects.","Reasons for Non-selection:","Please note that these reasons are not exhaustive, and our screening committees carefully assess each submission based on a range of factors. While we understand that receiving specific feedback can be helpful, we are unable to provide feedback for individual cases of non-selection"]}],[{"l":"Project Form Fields Guide","p":["Below, you'll find a guide to all form fields and buttons within testnet and mainnet project environments.","⛽: fields with associated gas costs\uD83D\uDCC4: fields required for artist screening"]},{"i":"project-page","l":"Project Page:"},{"l":"Purchases Paused","p":["The Purchases Paused button is located above additional details can be used to mint on both the artist staging platform and mainnet without unpausing your project. We suggest using this method to mint token #0 and mints on testnet to avoid any accidental early mints from other collectors."]},{"l":"Edit Project","p":["The Edit Project button will lead to the back end of your shell, where you will set up your project."]},{"i":"project","l":"Project:"},{"i":"project-name","l":"Project name ⛽\uD83D\uDCC4","p":["This is the public name of your project."]},{"i":"artist-name","l":"Artist name ⛽\uD83D\uDCC4","p":["This is how your name will appear on Art Blocks. What you choose to enter here is up to your personal preference."]},{"i":"project-website","l":"Project website ⛽","p":["This field is optional. The link entered in your project website field should lead to a place that exhibits more about your presented project or your background as an artist. This can link to a page specific to your project, your website, your Instagram, your Twitter, your GitHub, or something else.","Make sure to enter a fully defined website link, including the https://"]},{"i":"project-description","l":"Project description ⛽\uD83D\uDCC4","p":["The project description is a key opportunity to highlight your intentions and provide an interpretative frame around how you want a viewer/collector to approach your project. If you are struggling with this element, we have a series of prompts to guide your first draft.• Begin with a strong, clear opening sentence.","• Lead with the artistic inquiry; what questions can be prompted or answered through this work?","• How would you describe this project to someone unfamiliar with your work?","• What inspiration, color palette influences, themes, and techniques were used?","• Examine the outputs. What can the viewer see?","• Be sure to describe any interactivity features, if applicable.","• End by summarizing how the medium, outputs, and algorithm achieve your initial inquiry or concept."]},{"i":"project-license","l":"Project license ⛽","p":["Enter the copyright license here for your art (eg. NFT License 2.0, CC BY-NC 4.0, CC BY 4.0, etc)","Art Blocks recommends selecting a license that aligns with your values as a creator."]},{"i":"token","l":"Token:"},{"l":"Sales Notes","p":["This describes project-specific sales mechanics."]},{"l":"Charitable Giving Details","p":["This is where you will describe the charitable giving component of your drop, if applicable. The majority of projects released on Art Blocks choose to earmark at least 25% for this giving opportunity, but the final figure is up to you. An example of a charitable giving description is: 25% of proceeds above the resting price will be donated to non-profit educational organizations in Arizona dedicated to protecting the Sonoran Desert and its Native culture."]},{"i":"maximum-invocations","l":"Maximum invocations ⛽","p":["This is your total project series size."]},{"i":"base-uri","l":"Base uri ⛽","p":["[Mainnet Only] If you are an artist, your project base uri field should be: https://api.artblocks.io/token/."]},{"i":"script","l":"Script:"},{"i":"script-type","l":"Script type ⛽\uD83D\uDCC4","p":["Select your script type and the version number of that dependency from the drop-down menu provided. Artists must define the library AND version (when applicable)."]},{"i":"aspect-ratio-widthheight","l":"Aspect ratio (width/height)","p":["Your project’s outputs must be dimension agnostic, meaning they will scale seamlessly to any window size. See more on this here. This field sets the aspect ratio for image renders but does not impact an output’s live view.","While you can control the aspect ratio, you will have no control over the dimensions of the browser on which your project will be viewed.","Your aspect ratio should be a single number. This will be your token’s width divided by height. For example, if your tokens are square, your aspect ratio should be 1."]},{"i":"png-render-delay","l":"PNG Render delay \uD83D\uDCC4","p":["If your piece takes a certain amount of time to render fully, you can type in the render delay to let the server know when to render your output’s static images. This render time will be in milliseconds. If your algorithm is GPU intensive, and thumbnails do not render after the render delay, request Enhanced GPU Rendering. For accepted artists, file the request in your artist DM. For applying artists, file your request in the Art Blocks’ Discord Channel #artist-application-support."]},{"i":"canvas-mode-toggle","l":"Canvas Mode (toggle) \uD83D\uDCC4","p":["If checked, data is directly pulled from the Canvas element using .toDataURL() when producing static image renders. This additional rendering mode can be leveraged for projects with varying aspect ratios across different tokens.","Please note that scripts containing multiple Canvas elements may not render as intended."]},{"i":"generate-mp4-assets-toggle","l":"Generate MP4 assets (toggle) \uD83D\uDCC4","p":["If checked, GIFs and MP4s will be generated on individual token refreshes, batch token refreshes, and new token mints. There will be a link to the MP4 under the token display component when the MP4 is created and available for that token. If checked, the MP4 render delay, MP4 duration, MP4 frame rate, and MP4 aspect ratio settings will be visible in the UI.","Please note that scripts utilizing CSS rules for transitions and animations may not render as intended."]},{"l":"MP4 Render delay","p":["The render delay in milliseconds to start animation capture for GIF and MP4 outputs."]},{"l":"MP4 Duration","p":["The total length of the MP4, between 1 and 30 seconds. Setting this does not affect GIFs, they are set to 5 seconds."]},{"l":"MP4 Frame rate","p":["The number of frames per second of the MP4. Setting this does not affect GIFs, they are set to 24 fps."]},{"l":"MP4 Aspect ratio","p":["The aspect ratio of GIF and MP4 outputs. Due to limitations with the video codec the options are 1:1, 16:9, 9:16, 3:4, and 4:3."]},{"l":"Primary display format","p":["The project's primary view asset. This setting will be reflected on token and project detail pages on Art Blocks and secondary markets. For optimized performance, select PNG or MP4 for animated projects, if outputs take a long time to render."]},{"l":"Thumbnail preview format","p":["The project's thumbnail preview asset. This setting will be reflected on grid pages on Art Blocks and secondary markets. It will also be reflected in the gallery view section on project pages within Art Blocks. For the gallery view, if the chosen asset type is MP4 or GIF, an MP4 will be displayed due to the inferior resolution of GIF in this context. If PNG is selected, the gallery view will display the PNG asset."]},{"i":"project-scripts","l":"Project scripts ⛽\uD83D\uDCC4","p":["Here, you will upload your project’s script. Your features script should be separate from your project script.","Remember, tokenData.hash is a global variable in the environment this script will live in, so you do not need to define tokenData in your script, except your script will have access to it.","If your script is big, consider minifying it. There are no limits to the total script length. That said, scripts larger than 24 kilobytes will need to be broken up into segments of 24kb. Segments can be added using the \"add script segment\" button when uploading a script. Be aware that you will have to pay transaction gas fees proportional to the size of the script upload."]},{"l":"Features","p":["For filtering and rarity (% occurrence of different features) to be accessible via the Art Blocks website, the feature fields must be added in the artist interface UI on the Art Blocks website.","There are two types of feature fields: enum and number:","For enum fields, values should be outputted as strings in your features scripts. These should be entered as comma-delimited strings with no quotation marks.","For number fields, the step size set in the feature fields is used for the step size of the slider in the filters. This step size is set in the feature fields UI, not the script, and should be on a per-field basis.","Suppose there are only a few specific numerical values. In that case, you may want to use an enum field and output the enumerated possible numeric values as strings (e.g., if the slider UI would not be the best way to navigate these features)."]},{"l":"Feature script","p":["All code required for calculating your features (including any necessary helper functions) must be defined and implemented within the single top-level calculateFeatures function.","For many artists, the process for writing your features script will likely entail starting with your project script, copying it into the calculateFeatures interface/shell found [here](features.md #features-script-interface), and then trimming it down to remove all library (e.g., p5js) references and draw functionality and instead to build the relative key-value object map for your features."]},{"i":"minter","l":"Minter:","p":["For an overview of all minters available on Art Blocks, please see the Shared Minter Suite page."]},{"i":"configuring-your-minter","l":"Configuring Your Minter ⛽\uD83D\uDCC4","p":["Go to the Minter tab within your shell and select the ‘minter for project’ drop-down menu. From that menu, select your desired MinterSuite option. [Please note that mint #0 will be created using the Set Price- ETH option.]","Once the desired minter is selected, you will be able to input and configure your minter's pricing and other relevant information, performing any necessary transactions along the way. For help determining pricing and configuration, please see the Minting on Mainnet section below."]},{"l":"Minting on Staging","p":["After you’ve uploaded your script and you’re ready to start minting, ensure your minter is set to Set Price - ETH (V4). You’ll want to set your mint price at .0 since you’re using Goerli ETH."]},{"l":"Minting on Mainnet","p":["Artists are able to claim revenue after either:","Artists are responsible for crafting their allowlist and uploading a comma-separated list of ETH addresses in a .txt or .CSV file to the artist dashboard. These wallet addresses cannot be ENS names, but list the full address of the wallet. Premint is a super helpful tool for creating an allowlist by using social channels to reach collectors, friends, family, etc. In addition, Art Blocks hosts a Python script for retrieving & snapshotting either a list of all Art Blocks token holders or the token-holders of a specific project.","Artists may use the artist dashboard to pre-select a list of allowlisted Art Blocks or Art Blocks Engine projects, of which any valid token holders will be able to purchase for the upcoming project. Note that a \"snapshot\" won't apply to this minter -- after the project has been made public, users can purchase a token from any allowlisted project and mint freely.","Automated Exponential Dutch Auction (with settlement | without settlement)","Automated Linear Dutch Auction","Based on your selected minter option, you will need to set your project price. The different pricing mechanics are outlined below.","Click the Claim Revenue button that becomes available in your artist dashboard, which will prompt you to send a transaction","Consider Exponential Dutch auction was starting at 1 ETH and lowering to 0.1 ETH over 30 minutes.","Enter your fixed price","For exponential Dutch auctions, artists specify the start time, starting price, ending price, and half-life for price drops. These auction mechanisms aim to allow collectors to achieve price discovery on the blockchain.","For linear Dutch auctions, artists will specify the starting time, starting price, ending price, and ending time of the auction. The price will then linearly decrease each block over the total auction time.","Half-life is the least intuitive of the parameters. One way to determine half-life is to think of the total duration of the auction and then work backward to find the half-life at that total time. . For example:","If the button is selected after the auction reaches resting price, but before all tokens have been sold, revenue from previous purchases will be transferred. Revenue from subsequent purchases at resting price will be distributed immediately at the time of of each purchse.","If the button is selected after the project has sold out, all revenue from the project will be distributed at the time of claim","If using an ERC20 minter, the artist will need to specify the ERC20 token address for the custom token sale.","In addition to the information below, please see the Project Pricing: Dutch Auction Settings section for more information on how to determine the appropriate pricing parameters for your auction.","Note that all current production minters support the ability to limit the number of mints on that specific minter for your project. This means that multiple minters may be used sequentially for a given project.","One way to think of an exponential auction is that the rate of price percent decrease is constant throughout the auction.","Pricing of tokens on this minter is only supported as a fixed price, in ETH.","Select Set Price - ETH, Allowlisted Users Only","Set Price - ETH, Allowlisted Users Only","Set Price - ETH, Token Holders Only","Set Price Minters (ETH | ERC20)","the dutch auction reaches resting price","The price to purchase a token is set by the artist and is the same for all purchasers.","the project’s sell out, or","This section provides an overview of how to configure your selected minters on mainnet. The Art Blocks team can assist and advise in determining the best type of minter and associated pricing parameters.","To set up an allowlist for your project:","Upload your .csv or .txt file. See info box below for more details.","Using this calculator, the half-life can be determined to be 9 minutes (540 seconds). This means every 9 minutes, the price would gradually be cut in half. After 9 minutes, the auction will reach 0.5, and after 18 minutes, the auction will reach 0.25. The price drops within those half-life steps will gradually lower every block until the auction ends, at which point the auction will remain constant at the ending price.","We ask that artists promptly collect revenue when it becomes available. To collect revenue:","We recommend leaving the mint per wallet limit to 1 for allowlist. If you would like to adjust this, please let the Art Blocks Team know."]},{"l":"Tags","p":["Tags are labels you can assign to your project. Users can now filter collections based on the following tags: animated, interactive, evolving, audio, and responsive.","You may add tags to your project in edit project on the tags button in your shell. If you’ve already released your work on Art Blocks, we encourage you to go in and add relevant tags to your project.","animated- moving image projects","interactive- projects respond to user’s input","evolving- project tokens develop gradually over time","audio- project token incorporates sound elements","responsive- project outputs scale to any screen size","If you have a suggested tag for your project that you would like to be considered, please post your suggestions in Discord in #artist-general."]},{"i":"payout","l":"Payout ⛽","p":["Projects with multiple artists can use the additional payee address field to split project payments between multiple wallets for primary and secondary sales. When a project only has one artist, the additional payee field is commonly used to manage on-chain charitable donations. The charity’s wallet can be entered in the additional payee field. The percentage entered in the additional payee field will then be directly transferred to the charity as sales are made.","Artists must propose changes to their payment addresses (and splits between primary/additional) for admin approval. Approval is granted before Mint #0"]},{"l":"Revenue splits with multiple artists","p":["For projects with multiple artists, we recommend using 0xSplits to split revenue among the group. Instructions on how to create a Split can be found here. Once you’ve created your Split, paste the address into the additional payee field. You can also include a charitable giving donation directly in the Split."]},{"l":"Propose current artist address or add a new one","p":["This address will have access to edit the project in Art Blocks’ staging environment."]},{"l":"Propose additional payee address for primary sales","p":["Input collaborator’s or charity wallet address here."]},{"l":"Propose additional payee percentage for primary sales","p":["Payout percentages are at the artist’s discretion."]},{"l":"Propose additional payee address for secondary sales","p":["Additional address that will receive a portion of secondary sales."]},{"i":"propose-additional-payee-percentage-for-primary-sales-1","l":"Propose additional payee percentage for primary sales","p":["The royalty field should be entered as a number and does not require a % symbol."]},{"l":"Understanding secondary sales","p":["Secondary marketplaces can choose if they’d like to honor the secondary market royalty amount. Please note that OpenSea does not currently honor this field. On OpenSea, artists receive 5% of all secondary sales. Because of this, for consistency, we recommend setting your secondary market royalty to 5%. Note that all secondary details are for on-chain royalties, which OpenSea is not yet supporting (but we expect that will happen soon). For OpenSea royalties, Art Blocks will redistribute secondary sales monthly.","To learn more about royalty distributions, see here."]},{"i":"danger","l":"Danger:"},{"i":"artist-address","l":"Artist address ⛽","p":["This will be the wallet address you provide to us when setting up your shell. Should you need to transfer ownership, we cannot whitelist multiple wallets. Only the address entered in the artist address field will have access to the backend of your project.","This is the address that will be used for payout."]},{"l":"Unpause","p":["When it is time for your project to go live, you will press the “Unpause” button in your mainnet shell. Once the transaction clears, your project will be live for minting."]},{"l":"On Tokens"},{"l":"Refresh Token Image","p":["This button will queue your token thumbnail to be refreshed. The refresh takes time to process fully. If a script update was successful, and live views are correct, but thumbnails haven’t refreshed, please clear your cache. If you have cleared your cache and are still not seeing the correct thumbnail view,a subgraph delay may be the reason. Stay updated on system operations at [status.artblocks.io] (status.artblocks.io).","Rendering tokens does take computing power, of which we have a limited amount. Please feel free to refresh tokens after making updates, but note that if our rendering pipeline starts clogging up requests, we may have to consider rate-limiting refresh requests. In summary, use this button when testing out updates, but avoid spamming, or things will get jammed up.","With this button, you can refresh per token. The Art BlocksTeam has the power to refresh all thumbnails in a project at once, and we are happy to do so for you. Request a batch refresh after updating your script in your artist DM. If you are still in the application queue, you may request a batch refresh in the #artist-application-support channel in Discord."]},{"l":"Details","p":["The details page is specific to each token. On the details page, you will find the token’s features and links to secondary marketplaces."]},{"l":"Image","p":["The image button will generate a PNG of the token’s thumbnail."]},{"l":"Live","p":["As a note, the live generator view will give a bad request error until the project is public. To access the live view add /?render=true to the end of the generator link. I.e. https://generator-staging-goerli.artblocks.io/0x00000000000000000/46000000/?render=true","Once a project is public, this link will function. While a project is private, live views can also be viewed on the details section of the individual token."]}],[{"l":"Minter Suite","p":["Art Blocks has migrated to a new, shared minter suite! Please see the Shared Minter Suite page for more details."]}],[{"l":"Art Blocks Features Script","p":["A guide on how to structure the features script for your Art Blocks project."]},{"l":"Features Overview","p":["All feature attributes that you want displayed should be directly generated from the transaction hash and should not depend on any other randomness.","This function should essentially encapsulate the feature-determining logic within rendering script but without any library dependencies (e.g. p5js) present (the server won't have access to them).","The function should assume that it receives the tokenData object as an input (containing both a tokenId and hash string), and should use these to return the correct desired feature metadata for a given mint.","Properly displaying your project features requires both a a) feature calculation script and b) setting the feature fields for your project in the Art Blocks website's artist interface.","Updating the features script or features fields for a given project will recalculate features for all tokens within that project."]},{"l":"Features Script Interface","p":["Important Note: All code required for calculating your features (including any necessary helper functions) must be defined and implemented within the single top-level calculateFeatures function.","For many artists, the process for writing your features script will likely entail starting with your project script, copying it into the calculateFeatures interface/shell above, and then trimming it down to remove all library (e.g. p5js) references and draw functionality and instead to build the relative key-value object map for your features."]},{"l":"Features Fields","p":["In order for filtering and rarity (% occurrence of different features) to be accessible via the Art Blocks website, the feature fields must be added in the artist interface UI on the Art Blocks website.","There are three types of feature fields: enum, number, and boolean:","For enum fields, values should be outputted as strings in your features scripts.","For number fields, the step size set in the feature fields is used for the step size of the slider in the filters. This step size is set in the feature fields UI, not in the script, and should be on a per field basis.","For boolean fields, the only values are true and false, so you just need to give the field a name.","If there are only a few specific number values expected to be output, an artist might want to use an enum field and output the enumerated possible numeric values as strings (e.g. if the slider UI would not be the best way to navigate these features)."]},{"l":"Migration From Legacy Features Arrays","p":["Previously the features for a given project were defined in a less structured way, via a script that could set a given array of features (e.g. [Palette: Rosy, Scale: Big, Tilt: 72]) to a globally available features array.","This process is being standardized for the Art Blocks V2 website and token API, which may require some involvement from artists to migrate old projects in alignment with their desires.","To simplify this process, Rev Dan Catt has provided an amazing tool to generate a features script with the new format based on the features of existing projects, which you can find at https://rarity.guide/project/{ProjectNumber}/featurescript(where {ProjectNumber} is swapped out with your project of interest).","This tool is being used to assist the Art Blocks team in attempting to automatically migrate projects, but if you are an artist with an existing project that needs to or would like to modify the output of this automated result, Rev Dan's script is a great starting place."]},{"l":"Additional Notes","p":["For future projects (that have not yet minted out, which is necessary for Rev Dan's automated migration approach), it is necessary that this data be determined based on the tokenData itself rather than just mapping the tokenId to a given existing set of features as the features cannot be known until time of mint (unless all named features are purely based on the tokenId and not the hash).","You also have the option to upload a json file to set all of your feature fields. The shape of the file should be in the following format:","On upload of the json file it will overrwrite any existing feature fields in the current form. You also are able to download your existing feature fields as a json file using the buttons found in the feature fields form."]}],[{"i":"#","p":["Frequently asked questions."]},{"l":"FAQs","p":["To suggest a question to be added, fill out this form: Creator FAQs Suggestion Box"]},{"l":"Application"},{"i":"how-can-a-generative-artist-be-published-in-art-blocks","l":"How can a generative artist be published in Art Blocks?","p":["Art Blocks has an application form that generative artists can submit. Please note that we are becoming increasingly selective, only accepting around 2% of projects submitted for release.","You can find out an application here: artblocks.io/apply","You will receive a project shell on our staging site when you apply. This project shell is where you will upload your project to Art Blocks for review. Only the wallet address connected to Art Blocks will have access to the project shell when applying. The shell creation ensures that all projects are compatible with Art Blocks and reviewed using a standard format."]},{"i":"when-can-i-expect-to-hear-back-after-i-submit-an-application","l":"When can I expect to hear back after I submit an application?","p":["When you're ready to proceed to our screening stage, please email apply@artblocks.io with a link to your staging shell. Before the screening, ensure the work has a project description that explains the work's technical, aesthetic, and conceptual approaches. Prototypes should have 40-50 mints, as well as feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. All prototypes should be completely finished before review. The team will let you know when the work will be screened and give you a timeline for the acceptance decision."]},{"i":"are-we-notified-of-the-result-acceptedrejected-or-only-if-it-is-accepted","l":"Are we notified of the result (accepted/rejected) or only if it is accepted?","p":["After you notify the team that you are ready for review by emailing apply@artblocks.io, the team will let you know when the work will be screened and give you a timeline for the acceptance decision."]},{"i":"if-i-change-my-mind-about-the-collection-i-am-trying-to-release-can-i-just-change-it-in-my-current-project-id-or-should-i-re-apply","l":"If I change my mind about the collection I am trying to release, can I just change it in my current project id, or should I re-apply?","p":["Please reuse the shell that was created upon application if you’d like to submit a new project, and this process is applied to artists who were rejected and would like to re-submit a prototype for review. Upload your new script and refresh the thumbnails to update your staging shell."]},{"i":"what-happens-after-i-apply","l":"What happens after I apply?","p":["Once you apply, you will have access to a staging shell on testnet. There, you can upload your generative script and mint test outputs. Prototypes should have 40-50 mints, a project description, and feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. When you're ready to proceed to our screening stage, please email apply@artblocks.io with a link to your staging shell. All prototypes should be completely finished before review. The Art Blocks team will give you a timeline as to when the project will be reviewed and when you will be notified whether or not your project is selected for an Art Blocks launch. Please note, we are becoming increasingly selective, only accepting 2% of projects submitted for release. Take your time in the artistic process to ensure you are bringing forth your best work."]},{"i":"i-cannot-fill-out-the-application-form-on-typeform","l":"I cannot fill out the application form on Typeform.","p":["Please note that we have moved our application to artblocks.io/apply. You will receive a project shell on our staging site when you apply. This project shell is where you will upload your project to Art Blocks for review. Only the wallet address connected to Art Blocks will have access to the project shell when applying. The shell creation ensures that all projects are compatible with Art Blocks and reviewed using a standard format."]},{"i":"how-do-i-know-the-application-period-to-send-my-first-work","l":"How do I know the application period to send my first work?","p":["Applications will remain open indefinitely. To learn more about the application process, visit artblocks.io/apply."]},{"i":"what-is-the-process-for-submitting-my-first-work","l":"What is the process for submitting my first work?","p":["You may apply using this application form."]},{"i":"i-received-a-link-to-upload-my-prototype-but-its-not-working-what-should-i-do","l":"I received a link to upload my prototype, but it's not working; what should I do?","p":["Clear your cache and ensure you are connected to the wallet you applied with and using the Goerli test network."]},{"i":"at-the-time-of-submission-i-did-not-put-a-project-preview-if-i-do-it-now-does-it-restart-the-application-process-to-zero-can-it-help-in-the-process","l":"At the time of submission, I did not put a project preview. If I do it now, does it restart the application process to zero? Can it help in the process?","p":["Applications are logged in chronological order in our database. You will let us know that your prototype is ready to be reviewed for release by emailing apply@artblocks.io. Before the screening, ensure the work has a project description that explains the work's technical, aesthetic, and conceptual approaches. Prototypes should have 40-50 mints, a project description, and feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. All prototypes should be completely finished before review."]},{"l":"Staging"},{"i":"is-it-possible-to-see-my-project-without-being-connected-to-my-wallet-so-i-can-test-it-across-different-devices-and-browsers-without-connecting","l":"Is it possible to see my project without being connected to my wallet? So I can test it across different devices and browsers without connecting?","p":["No, this is not currently possible. You'll need to be signed in with your wallet to access your project. You can however view live view links without being connected to a wallet. To view a live view link while your shell is private, add ?render=true/ to the end of the URL."]},{"i":"what-is-the-mintersuite-and-how-does-it-work","l":"What is the MinterSuite, and how does it work?","p":["The MinterSuite allows artists to set specific minting contracts on a per-project basis. The MinterSuite currently includes the following minter options, which will continue to be expanded over time:","Set Price - ETH is used for fixed price releases.","Automated Exponential Dutch Auction: For exponential Dutch auctions, artists specify the starting price, ending price, and the half-life for price drops.","Automated Linear Dutch Auction: For linear Dutch auctions, artists will specify the starting price, ending price, starting time, and ending time of the auction. The price will then gradually decrease each block over the total auction time.","Set price in custom ERC20: Set price in ERC20 is a fixed price for your sale with a custom token. Artists will specify the address for the custom token sale.","Set Price - ETH, Allowlisted Users Only (V1) these are addresses that are allowed to mint as many times as they want until they reach the mint limit (artists sets mint/wallet)","To find out how to set your project price using the MinterSuite visit this page."]},{"i":"the-documentation-states-that-only-one-external-library-can-be-used-and-then-there-is-a-list-of-some-libraries-im-unsure-if-this-is-the-list-of-libraries-allowed-to-use-or-only-examples-of-popular-libraries-can-i-for-example-use-a-game-engine-library-that-is-not-on-that-list","l":"The documentation states that only one external library can be used, and then there is a list of some libraries. I’m unsure if this is the list of libraries allowed to use or only examples of popular libraries. Can I, for example, use a game engine library that is not on that list?","p":["Everything on the limited dependencies list in our Creator Documentation is compatible with the platform. See here: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/#limited-dependencies"]},{"i":"i-have-opened-my-shell-on-the-staging-site-but-cannot-upload-sample-outputs-of-my-prototype","l":"I have opened my shell on the staging site but cannot upload sample outputs of my prototype.","p":["You must first upload your prototype script and then mint test outputs. Learn how to mint without unpausing your project here: https://docs.artblocks.io/creator-docs/creator-onboarding/testnet-checklist/#test-minting"]},{"i":"is-it-possible-to-create-a-project-on-the-site-without-a-library-code-is-it-possible-to-do-a-project-based-on-ipfs-or-should-everything-be-generated-exclusively-on-art-blocks","l":"Is it possible to create a project on the site without a library code? Is it possible to do a project based on ipfs, or should everything be generated exclusively on Art Blocks?","p":["All Art Blocks work is completely on-chain. Artists must upload their technically-compatible project scripts to their staging shell to produce a collection. All projects must use the limited dependencies outlined in our Creator Documentation: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/#limited-dependencies"]},{"i":"my-script-works-and-is-shown-in-explore-possibilities-but-my-test-mints-are-not-showing-the-console-is-showing-many-nextjs-script-errors-any-suggestions-could-it-be-my-scripts-fault","l":"My script works and is shown in \"Explore Possibilities,\" but my test mints are not showing. The console is showing many NextJs script errors. Any suggestions? Could it be my script's fault?","p":["Your script must be the same version of the limited dependencies accepted by the platform.","Consider using this starter template, which gives you an environment similar to Art Blocks: https://github.com/ArtBlocks/artblocks-starter-template"]},{"i":"where-do-i-add-my-public-files-in-the-staging-environment-html-css","l":"Where do I add my public files in the staging environment (html, CSS)?","p":["You only need to submit the prototype script, then you can choose a library in the script tab of the edit project which will add the container(canvas) and the script import."]},{"i":"there-is-a-difference-between-my-thumbnails-and-the-live-views","l":"There is a difference between my thumbnails and the live views.","p":["Randomness becomes deterministic when it's seeded, which is what's happening with the Art Blocks token data and suggested Random class. Once initialized, all calls to the random_dec method must remain consistent. Resolving anything random before starting to draw is handy in that regard, plus you'll also need to provide that code for the calculateFeatures function.","If you're getting inconsistent outputs, the first thing would be to ensure there's no any forgotten Math.random() in your code and that your token data looks okay."]},{"i":"my-artwork-depends-on-some-deterministic-random-function-calls-and-features-depend-on-it-in-the-staging-environment-the-features-script-is-completely-separated-from-the-artwork-script-how-can-i-calculate-the-features-the-only-solution-i-can-see-is-to-rewrite-the-random-calls-in-the-feature-script-in-the-same-order-they-are-called-in-the-artwork-script-any-different-simpler-and-safer-approach-to-suggest-me","l":"My artwork depends on some deterministic Random function calls, and features depend on it. In the staging environment, the features script is completely separated from the artwork script. How can I calculate the features? The only solution I can see is to rewrite the random calls in the feature script in the same order they are called in the artwork script. Any different, simpler, and safer. approach to suggest me?","p":["You will rewrite the random calls in the feature script in the same order they are called in the artwork script. More info here: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/features/"]},{"i":"i-set-up-the-features-types-and-options-in-my-staging-shell-and-copied-my-original-code-into-the-calculate-features-section-removed-all-the-p5js-drawing-then-set-it-up-to-build-key-value-pairs-right-now-i-have-the-key-value-pairs-being-assigned-to-an-object-called-features-how-do-i-get-the-script-to-return-the-right-object-the-code-isnt-giving-me-any-errors-but-no-features-appear-when-i-look-at-the-mints","l":"I set up the features, types, and options in my staging shell, and copied my original code into the Calculate Features section, removed all the p5.js drawing, then set it up to build key-value pairs. Right now, I have the key-value pairs being assigned to an object called \"features.\" How do I get the script to return the right object? The code isn't giving me any errors, but no features appear when I look at the mints.","p":["You should have the function return the dictionary with the features iirc, using the syntax return {object name}. If the problem still occurs, clear your cache. There may also be an authentication issue, so log out and log back into your wallet."]},{"i":"can-i-visually-verify-my-code-is-working-properly-through-the-art-blocks-staging-platform","l":"Can I visually verify my code is working properly through the Art Blocks staging platform?","p":["If you can mint test outputs successfully, your script will likely be compatible with the platform. Check out our technical documentation here: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/#documentation"]},{"i":"where-is-the-mint-button-do-we-have-to-set-a-price","l":"Where is the mint button? Do we have to set a price?","p":["Learn how to mint without unpausing your project here: https://docs.artblocks.io/creator-docs/creator-onboarding/testnet-checklist/#test-minting"]},{"l":"Artist Pipeline"},{"i":"what-are-the-steps-in-the-process-and-how-do-i-know-when-ive-completed-them","l":"What are the steps in the process and how do I know when I've completed them?","p":["Please see Artist Onboarding Steps for a more detailed overview of the onboarding process."]},{"i":"approximately-how-long-will-each-step-of-the-process-take","l":"Approximately how long will each step of the process take?","p":["Once a project is accepted for release, it will take approximately 1-2 months to finalize your project on testnet, submit it for curation review, upload the script on mainnet, schedule a launch date, and finally release the project. The length of each step differs and depends somewhat on how quickly you, the artist, finalize your scripts. Please see our Artist Onboarding Steps for more information about the timeline of each step."]},{"i":"who-can-i-reach-out-to-if-i-have-questions","l":"Who can I reach out to if I have questions?","p":["For questions related to your application, please post your inquiry in #artist-applications. You may also use the #help channel"]},{"l":"Curation Review"},{"i":"what-are-the-general-standards-for-achieving-curation-status","l":"What are the general standards for achieving curation status?","p":["The Curated Collection is a group of projects that pushes the boundaries of Generative Art. A project in the Curated Collection covers new territory using code that employs inventive, never-before-seen techniques to support an original intention and concept. Board members look for collections that evoke emotional, intellectual, and conceptual qualities through aesthetics while sustaining the viewer’s interest."]},{"i":"are-rarities-judged-as-a-metric-for-curation","l":"Are rarities judged as a metric for curation?","p":["Rarities aren't included as a metric for determining curation status. However, the overall variety of a collection is important so that the project contains diversity over the course of a large number of mints."]},{"i":"will-i-receive-feedback-from-the-curation-board-on-my-submissions","l":"Will I receive feedback from the curation board on my submissions?","p":["Feedback from the Curation Board will be provided. The goal of this feedback will be to highlight observations that our Curation Board made about your current project upon their review."]},{"i":"who-is-on-the-curation-board","l":"Who is on the curation board?","p":["Art Blocks has invited individuals to our Curation Board based on their expertise, passion for the evolution and growth of on-chain generative art, and their industry leadership.","You can read more about the Curation Board here."]},{"l":"Technical Requirements"},{"i":"are-all-browsers-supported-for-art-blocks-drops-is-mobile-supported","l":"Are all browsers supported for Art Blocks drops? Is mobile supported?","p":["All modern browsers are supported (including mobile), though you may run into issues using Internet Explorer. We recommend using Browserstack https://www.browserstack.com/ to test across devices."]},{"i":"do-i-need-to-know-solidity-to-write-my-own-smart-contract","l":"Do I need to know Solidity (to write my own smart contract)?","p":["No. Art Blocks handles all of that for you. All you need to create is the artwork."]},{"i":"can-i-load-external-assets-into-my-project-textures-audio-etc","l":"Can I load external assets into my project (textures, audio, etc)?","p":["Not at this time. Currently, everything must be included in the script file. For small and critical assets, you may be able to use base-64 encoding to encode the asset into your script, but that will count as data to be stored."]},{"i":"can-i-use-text-what-fonts-can-i-use","l":"Can I use text? What fonts can I use?","p":["You can use text in your project! Font choice is technically at your discretion, but you're encouraged to embed them in your scripts directly or use the core web fonts to ensure universal support and maintain the piece's integrity over the longer term. ( serif, sans-serif, monospace, and less commonly, cursive and fantasy.)"]},{"i":"what-are-the-minimum-hardware-requirements-what-type-of-graphics-card-do-i-need","l":"What are the minimum hardware requirements? What type of graphics card do I need?","p":["Any computer with an internet connection will work! No special graphics cards are required."]},{"l":"Uploading Your Script to Mainnet"},{"i":"how-much-money--eth-do-i-need-to-upload-my-project","l":"How much money / ETH do I need to upload my project?","p":["The cost depends on the complexity of your project and how many lines of code it requires. See here for more specific information about how to budget for a drop."]},{"i":"my-project-is-uploaded-and-ready-to-go-how-do-i-mint-my-first-output","l":"My project is uploaded and ready to go. How do I mint my first output?","p":["You can use the “Purchases Paused” button to mint both on the artist staging platform and mainnet without unpausing your project. We suggest using this method to mint Token #0 to avoid any accidental early mints."]},{"i":"are-there-limits-on-script-length","l":"Are there limits on script length?","p":["If your script is big, consider minifying it. There are no limits to the total script length. That said, scripts that are larger than 24 kilobytes will need to be broken up into segments of 24kb. Segments can be added using the \"add script segment\" button when uploading a script. Be aware that you will have to pay transaction gas fees proportional to the size of the script upload."]},{"i":"does-the-size-include-the-library-that-im-using","l":"Does the size include the library that I'm using?","p":["No, the library you use is not stored on-chain with your project. A script tag linking to a CDN hosting the library you choose will be injected into the window scope when the project runs."]},{"l":"Preparing for your drop"},{"i":"what-information-will-i-need-to-provide-about-my-project","l":"What information will I need to provide about my project?","p":["If your project is selected for a drop on Art Blocks, you'll need to have the following information ready. This is typically collected near the end of the process, so you'll have time to make these decisions as you're onboarding."]},{"i":"can-i-share-information-about-my-drop-on-social-media-before-its-announced","l":"Can I share information about my drop on social media before it's announced?","p":["Once you finalize a drop date with the Art Blocks team, you're welcome to share and promote your drop on all social media! We have created a Marketing 101 document to support your efforts in the lead-up to your drop."]},{"i":"when-will-i-know-when-my-drop-is-scheduled-when-will-the-drop-be-announced","l":"When will I know when my drop is scheduled? When will the drop be announced?","p":["Once your application is approved, it takes approximately 6-8 weeks to reach a launch date for your project. You'll work closely with our team to schedule a drop date, which typically will be about 2 weeks after your project is finalized on mainnet. Every Friday, our team announces the following week's projects in the Discord channel, #upcoming-projects."]},{"i":"can-i-mint-pieces-of-my-own-artwork-how-many","l":"Can I mint pieces of my own artwork? How many?","p":["All artists on Art Blocks will mint the first piece (mint #0) of the collection for themselves. If you collaborated with other artists, you can each mint one of the first outputs before the project goes live.","If you're dropping in the Presents category and you'd like to mint more pieces of the collection (for gifts or giveaways), let us know in your artist DM. If you’d like to mint more than just Mint #0, wee ask that you clearly communicate why you're minting more than one to the community."]},{"l":"Price Mechanics"},{"i":"how-should-i-price-my-artwork","l":"How should I price my artwork?","p":["Once you near the finalization of your project, you'll be in close dialogue with our team about how to price your work. We have a Project Pricing Model that guides the decision on the pricing of Art Blocks collections."]},{"i":"what-percent-of-secondary-royalty-sales-do-artists-receive","l":"What percent of secondary royalty sales do artists receive?","p":["As an artist, you should be aware of recent changes in royalty rate determination at OpenSea and Blur, which have resulted in a range of royalty payment percentages (from 0% to 5%). Due to this change, we've had to adjust our royalty payout calculations.","We've chosen to uphold the same royalty split ratio between our Artists and Art Blocks (2/3 for the Artist and 1/3 for Art Blocks). Art Blocks handles the distribution of royalty payments received from marketplaces that do not offer direct splits through the Royalty Registry, following an internal review of secondary sales transactions.","If you have any questions regarding this updated split methodology or information regarding royalty payouts, please post in #artist-general on Discord."]},{"i":"how-can-i-customize-revenue-splits","l":"How can I customize revenue splits?","p":["Setting up revenue splits can be done through the Payout fields in your project form. You can use the additional payee field within the form directly to send a portion of the revenue to that account. Many artists use this to make a charitable donation. To split revenue with more than one account, we recommend using 0xSplits. Instructions on how to create a Split can be found here. Once your Split is created, paste the address into the additional payee field."]},{"i":"do-you-have-access-to-historical-data-of-other-art-blocks-sales","l":"Do you have access to historical data of other Art Blocks sales?","p":["There are a few helpful tools for this:","https://artacle.io/","This resource has most Art Blocks projects and will show the distribution of sales for Dutch Auctions.","https://rarity.guide/","This focuses on the rarity of mints per project, the time between mint #2, and the rate of sales."]},{"l":"Charitable Giving"},{"i":"what-is-art-blocks-commitment-to-charitable-giving","l":"What is Art Blocks' commitment to charitable giving?","p":["To maintain our commitment to charitable giving, we ask artists to consider donating 25% of sales above the resting price via Dutch auction to a charity of their choice. If you elect to participate in this way, please determine your chosen charity, and confirm its eligibility, before mint #0. To whom and how you donate is entirely up to you. Art Blocks does not require you to donate any proceeds in order to engage with our platform. If you do elect to donate to a charity, it is advisable to consider whether the charity which you choose to support qualifies under United States tax law to receive tax-deductible donations. If your project designates only one primary wallet, you may use the additional payee field to manage on-chain donations. All revenue may also be routed to a single wallet and donated after your drop. We encourage you to consult with a tax professional to understand any potential tax implications of your planned giving, as these can be widely variable."]},{"i":"where-can-i-find-a-list-of-charities-that-accept-crypto-donations","l":"Where can I find a list of charities that accept crypto donations?","p":["To find a list of charities, you can ask for advice in #artist-general and check the pinned messages for a charity guide.","If the charity you’d like to donate to is not set up to receive crypto donations, we recommend checking out endaoment.org or CryptoForCharity.io. They both enable on-chain donations to any US-based 501c(3). Endaoment uses a Donor Advised Fund (DAF) model and has a 1.5% fee; CryptoForCharity sends the gifts on as they're made and is zero fee. This method can also be done fully on-chain, so the donations go directly to the charity, as opposed to going through the project’s designated primary wallet. Please note: different methods of distribution can have different tax implications, and Art Blocks advises every artist to consult with a tax professional when making these plans.."]},{"i":"how-can-i-donate-to-charity","l":"How can I donate to charity?","p":["Here are a few donation options:","1) On-chain donations through Endaoment.org","Endaoment is a 501(c)(3) organization that accepts crypto and distributes donations to any US-based 501(c)(3) charity in good standing with the IRS. Donations through Endaoment are set at the contract level and automatically routed at the time of payment without touching your wallet (potentially avoiding tax liability/deductibility).","To use Endaoment, go to Endaoment.org, connect your wallet and create a fund. Then, enter your fund's contract address (shown on your newly created fund page) in the additional payee field. If using the additional payee field for donations, this field can be cleared before lowering to resting price. Many artists prefer this route so they can support multiple charities with smaller donations rather than a single charity with one large donation, but you can also set up organization as additional payee directly. In this case, go to Endaoment.org, use their search bar to locate the org in question, and copy the contract address directly from the organization's profile page to the payee field (you can do this for multiple charities if desired). If the organization(s) shows as 'Not Deployed', simply click 'Deploy' to create a smart contract for that nonprofit. When that process completes, a contract address will populate on the organization's profile page. After the mint concludes, contact Dan (Druid#4611 on Discord) with your fund’s URL or smart contract address. Endaoment will then process contributed ETH into USDC, allowing you to send donations in any amount to any charity in the US using their UI. Please note - Endaoment charges 1.5% to receive, convert, and distribute money to nonprofits.","You can also find a tutorial of how to use Endaoment here, can find direct support in their Discord server here by creating a ticket in the #\uD83D\uDE4B|get․help channel, and can read up on their documentation here.","2) Make a zero-fee on-chain donation with CryptoforCharity.io","CryptoForCharity is a zero-fee platform enabling donations in crypto assets directly to charity. You can support any US-based 501(c)(3) charity in good standing with the IRS, or donate to any of several cause funds focused on a specific issue.","Donations through CryptoForCharity are set at the contract level and automatically routed at the time of payment without touching your wallet (and potentially avoiding tax liability or the need to account for and deduct the income/donation). Donated funds can also be held for a short time following your drop, if you'd prefer to designate the charity or cause fund you wish to support after the fact, but they cannot be held indefinitely.","Generating a charity or cause fund wallet is straightforward -- simply fill out the form here. You can also reach out directly to SimonSays#0670 in the AB discord for help.","For a bit more on how it's set up under the hood, CryptoForCharity put together this tax guidance for NFT creators.","3) Create a second wallet","If you’d like to create a second wallet separate from your personal wallet, you can enter the wallet's address in the additional payee field to collect the total donation amount you intend to donate. If using the additional payee field for donations, this field can be cleared before lowering to resting price.","4) Receive funds in your primary wallet","If you’d like to receive all funds from your project’s sale in your primary wallet, that’s fine, but please communicate the total donations with Art Blocks and the community. Please be aware that receiving money in your personal wallet may incur tax obligations and reduce the total donation amount."]},{"i":"how-do-i-remove-charitable-giving-information-from-the-additional-payee-field-mid-dutch-auction","l":"How do I remove charitable giving information from the additional payee field mid-Dutch Auction?","p":["If charity information is entered as an additional payee field and you would like to remove this information prior to decreasing your tier below 0.25 ETH, please adjust the additional payee field to either 0x0000000000000000000000000000000000000000 or to your own wallet address and adjust the additional payee percentage to 0% before submitting the next price tier. These fields cannot be blank once the dutch auction has begun."]},{"i":"what-has-art-blocks-donated-to-charity-in-the-past","l":"What has Art Blocks donated to charity in the past?","p":["To learn more about Art Blocks commitment to charitable giving, see our Charity on Chain: 2021 Wrap-Up."]},{"l":"Security"},{"i":"where-can-i-learn-more-about-best-practices-for-security-including-hardware-wallets","l":"Where can I learn more about best practices for security, including hardware wallets?","p":["We recommend that all users have a hardware wallet that they use to interact with MetaMask.","You can learn more about security in the NFT space here(how to keep your collection safe) and here(how to avoid scams).","You can also check out our After Dinner Mints episode dedicated to security!"]},{"l":"Artist Community"},{"i":"is-there-a-place-i-can-connect-with-other-artists-and-chat","l":"Is there a place I can connect with other artists and chat?","p":["All artists are added to the artist-exclusive #artist-general channel in Discord, where you can interact with other Art Blocks artists, share projects, and ask questions. We encourage artists to participate in our Discord community. In addition, Art Blocks hosts a weekly Office Hours. This dedicated time is the place for artists to chat synchronously, meet the Art Blocks team, participate in artist development-focused programming, and group critiques. If your project has been chosen for an Art Blocks Curated release, we will establish a dedicated artist’s Discord channel for you to centralize discussions of that project. For all artists releasing on Art Blocks, , the #block-talk channel is a great place to interact with fellow artists, collectors, and community members."]},{"l":"Post-Drop"},{"i":"how-long-do-i-need-to-wait-before-releasing-a-project-through-art-blocks-again","l":"How long do I need to wait before releasing a project through Art Blocks again?","p":["When an artist’s project is 100% minted (i.e. “complete”), the artist is eligible to submit a new project for screening. Please note: there is a six month “cool-off” period after a Curated project is complete before the artist may submit another project for consideration as Curated.."]},{"i":"will-i-have-access-to-my-testnet-shell-after-i-release-my-project","l":"Will I have access to my testnet shell after I release my project?","p":["Yes. Please note, as of Aug 2, 2022, Art Blocks switched testing networks from Ropsten to Goerli.","If you previously had a testnet shell on the Ropsten network, you may still access your project shell using https://ropsten-artist-staging.artblocks.io/ as a read-only set of data. If you are a returning artist, please write in your artist DM, or in #artist-general."]},{"i":"what-is-the-process-upon-returning-to-art-blocks-as-a-non-curated-artist","l":"What is the process upon returning to Art Blocks as a non-Curated artist?","p":["After your project is completed, you will be eligible to submit a new project for screening consideration. You will continue to have access to your testnet shell. New projects can be submitted for review either via a working prototype or via your existing testnet shell, to which you will continue to have access. To submit a new project for screening by sending a message to your Artist DM.","The first screening determines if a work is accepted onto the platform. A committee made up of Art Blocks' staff and generative art experts conducts this screening. This review focuses on overall aesthetics, mint variety, and the degree to which a project explores new territory technically, visually, and conceptually. Returning artists are still subject to the highly-selective screening process.","If the work is accepted to be released on Art Blocks you will then move through the same onboarding process as your previous project, which is also outlined here."]}],[{"i":"#","p":["OpenSea Personalization"]},{"l":"OpenSea Personalization","p":["Artists will now automatically be added as editors to their Art Blocks project's OpenSea collection! Collection access will be based on the wallet address that created each collection (the same as the wallet in the artist address field under the danger tab in the back end of your AB project). Artists will not have access to adjust royalty information or payment token options. To maintain consistent branding across AB collections, collection banner images will revert to AB’s default image if adjusted."]},{"i":"please-read-the-following-to-understand-the-os-field-and-what-you-may-adjust","l":"Please read the following to understand the OS field and what you may adjust:"},{"l":"Logo image","p":["This image will also be used for navigation. 350 x 350 recommended. this should be a mint from your project or a branded logo for your project. OS accepts gifs as logo images, so this can be animated!"]},{"l":"Featured image","p":["This image will be used for featuring your collection on the homepage, category pages, or other promotional areas of OpenSea. 600 x 400 recommended. This should be a mint from your project or a branded logo for your project. OS accepts gifs as featured images, so this can be animated!"]},{"l":"Banner image","p":["This field cannot be altered by artists. while you can submit an alternative banner image, your banner image will revert to Art Blocks’ default banner once submitted. This is to maintain consistency across AB collections."]},{"l":"Project description","p":["We ask that you do not change your project description. project descriptions currently match the descriptions entered in your Art Blocks project shells. To maintain consistency between AB and OS, please keep your collection’s project description."]},{"i":"social-connections","l":"Social connections:","p":["Twitter (optional): feel free to connect your Twitter handle to your collection","Links: personal website: keep this link as your Art Blocks project link. This is important for maintaining a connection to your collection page on Art Blocks. Please do not change this link to your website.","Discord (optional): if you have a personal discord server, include the link here. You can also link to Art Blocks’ Discord server by adding /artblocks","Instagram handle (optional): add your Instagram handle here","Medium handle (optional): add your Medium handle here","Telegram handle (optional): add your Telegram handle here"]},{"i":"display-theme-paddedcontainedcovered","l":"Display theme (padded/contained/covered)","p":["For consistency across collections, please keep this setting contained."]},{"l":"Toggling attribute-based collection","p":["Allow people to make collection offers based on a specific attribute. You may turn this on if you’d like once your collection is sold out/once your attributes are finalized and won't change in the future."]}],[{"i":"#","p":["Charitable Donation Information"]},{"l":"Charitable Donation Information","p":["To maintain our commitment to charitable giving, we ask artists to consider donating a portion of artist proceeds to an eligible charity of their choice. To whom and how you donate is up to you but you should consider whether the charity or the cause you are donating to qualifies under United States tax laws as a charity/cause that is qualified to receive tax-deductible donations. We highly recommend consulting with a tax professional to understand your local tax liability, especially if you plan to personally receive all funds before donating. Below answers a number of common questions about how to donate and where to find crypto-friendly charities."]},{"i":"where-can-i-find-a-list-of-charities-that-accept-crypto-donations","l":"Where can I find a list of charities that accept crypto donations?","p":["To find a list of charities, you can ask for advice in #artist-general and check the pinned messages for a charity guide.","If the charity you’d like to donate to is not crypto-friendly, we recommend checking out endaoment.org. They are a 501(c)(3) that enables on-chain donations to any US-based 501(c)(3) via a Donor Advised Fund (DAF). This method can also be done fully on-chain, so the donations never touch your personal wallet."]},{"i":"how-can-i-donate-to-charity","l":"How can I donate to charity?","p":["Here are a few donation options:","1) On-chain donations through Endaoment.org","Endaoment is a 501(c)(3) organization that accepts crypto and distributes donations to any US-based 501(c)(3) charity in good standing with the IRS. Donations through Endaoment are set at the contract level and automatically routed at the time of payment without touching your wallet (potentially avoiding tax liability/deductibility).","To use Endaoment, go to Endaoment.org, connect your wallet and create a fund. Then, enter your fund's contract address (shown on your newly created fund page) in the additional payee field. If using the additional payee field for donations, this field can be cleared before lowering to resting price. Many artists prefer this route so they can support multiple charities with smaller donations rather than a single charity with one large donation, but you can also set up organization as additional payee directly. In this case, go to Endaoment.org, use their search bar to locate the org in question, and copy the contract address directly from the organization's profile page to the payee field (you can do this for multiple charities if desired). If the organization(s) shows as 'Not Deployed', simply click 'Deploy' to create a smart contract for that nonprofit. When that process completes, a contract address will populate on the organization's profile page. After the mint concludes, contact Dan (Druid#4611 on Discord) with your fund’s URL or smart contract address. Endaoment will then process contributed ETH into USDC, allowing you to send donations in any amount to any charity in the US using their UI. Please note - Endaoment charges 1.5% to receive, convert, and distribute money to nonprofits.","You can also find a tutorial of how to use Endaoment here, can find direct support in their Discord server here by creating a ticket in the #\uD83D\uDE4B|get․help channel, and can read up on their documentation here.","2) Make a zero-fee on-chain donation with CryptoforCharity.io","CryptoForCharity is a zero-fee platform enabling donations in crypto assets directly to charity. You can support any US-based 501(c)(3) charity in good standing with the IRS, or donate to any of several cause funds focused on a specific issue.","Donations through CryptoForCharity are set at the contract level and automatically routed at the time of payment without touching your wallet (and potentially avoiding tax liability or the need to account for and deduct the income/donation). Donated funds can also be held for a short time following your drop, if you'd prefer to designate the charity or cause fund you wish to support after the fact, but they cannot be held indefinitely.","Generating a charity or cause fund wallet is straightforward -- simply fill out the form here.","For a bit more on how it's set up under the hood, CryptoForCharity put together this tax guidance for NFT creators.","3) Create a second wallet","If you’d like to create a second wallet separate from your personal wallet, you can enter the wallet's address in the additional payee field to collect the total donation amount you intend to donate. If using the additional payee field for donations, this field can be cleared before lowering to resting price.","4) Receive funds in your primary wallet","If you’d like to receive all funds from your project’s sale in your primary wallet, that’s fine, but please communicate the total donations with Art Blocks and the community. Please be aware that receiving money in your personal wallet may incur tax obligations and reduce the total donation amount."]},{"i":"how-do-i-remove-charitable-giving-information-from-the-additional-payee-field-mid-dutch-auction","l":"How do I remove charitable giving information from the additional payee field mid-Dutch Auction?","p":["If charity information is entered as an additional payee field and you would like to remove this information prior to decreasing your tier below 0.25 ETH, please adjust the additional payee field to either 0x0000000000000000000000000000000000000000 or to your own wallet address and adjust the additional payee percentage to 0% before submitting the next price tier. These fields cannot be blank once the dutch auction has begun."]},{"i":"what-has-art-blocks-donated-to-charity-in-the-past","l":"What has Art Blocks donated to charity in the past?","p":["To learn more about Art Blocks commitment to charitable giving, see our Charity on Chain: 2021 Wrap-Up."]}],[{"i":"#","p":["Community Agreements"]},{"l":"Community Agreements","p":["These community guidelines have been inspired by BUFU By Us For Us, Flatbush Mixtape, Binch Press (BP), and Queer.Archive.Work (QAW) Community Agreements.","The aim of having community agreements is to provide a space that is welcoming, comfortable, inspiring, and beneficial for all. Using such practices and tools we can challenge ourselves and each other while still recognizing that we all contribute unique knowledge and experience, while hopefully creating a positive impact on our community/ies.","We respect the diversity of identities including gender, pronouns, race, nationality, immigrant status, religious background, disability status, work experiences, and other vibrant multi-faceted aspects of who we are. We honor each other's boundaries and communicate with care. Withhold unsolicited advice, and assumptions about other participants, and agree to disagree. Comment only from your own perspective, don’t interrupt others, and be mindful to allow time for others to speak. Please feel empowered to move up to take up more space, if that’s not your tendency. Move back to allow others to speak who might not be as heard, and listen with respect.","This is a consent-forward space, virtually and in-person. We commit to being accountable to one another. We strive to make our spaces safe and inclusive. If anyone is feeling disrespected or unsafe at any time, we hope you feel comfortable speaking directly with a member of Art Block’s team who is present to support our community’s comfort in this space. And to that end, we acknowledge these guidelines are a work in progress and welcome your suggestions and feedback."]},{"l":"Hard NOs","p":["No anti-Blackness. No violence, threats of violence, or violent language directed against another person. No sexist, racist, homophobic, transphobic, xenophobic, ableist, fat-shaming, or otherwise discriminatory jokes and language. No personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. No inappropriate physical contact. No unwelcome sexual attention. This includes sexualized comments or jokes, inappropriate touching, groping, and sexual advances. No deliberate intimidation, stalking or following (online or in-person). No “one-upping” or uninvited interruptions. No advocating for, or encouraging, any of the above behavior."]}],[{"i":"#","p":["Guide to Art Blocks’ Discord Server"]},{"l":"Discord"},{"i":"what-is-discord","l":"What is Discord?","p":["Discord is a free communications app that lets users share voice, video, and text chat with friends and various communities. Historically, its largest use case has been gaming-related but now with over 150 million monthly active users, the communities have blossomed across technology, art, music, investing universities, and fashion.","If you’re brand new to Discord, reviewing this Beginner’s Guide may be helpful as you set up your account."]},{"i":"why-does-art-blocks-use-discord","l":"Why does Art Blocks use Discord?","p":["Art Blocks Discord server is a virtual real-time hub for the Art Blocks community. Our server hosts over 46,000 members who collect, discuss, and learn about Art Blocks and generative art on a daily basis. It allows us to organize information into relevant and easily searchable topics and help artists connect directly with their collectors. Discord also allows for neat Bot integrations that keep the community safe and engaged such as Sales reporting and our own custom Bot, ArtBot!"]},{"i":"how-is-our-server-organized","l":"How is our Server organized?","p":["Our server is subdivided into various Category topics and beneath those Channel topics. Major Categories include Announcements, Info, Social, Trading, and Curated Artists. Some of these are read-only (Announcements & Info) but most allow for active communication. Additionally, as an Artist, you will have access to private Discord channels to receive updates from the Art Blocks team and connect with other Art Blocks artists! There are a large number of channels so don’t worry if it takes some time to become orientated."]},{"i":"as-an-artist-in-what-channels-should-i-be-spending-my-time","l":"As an artist, in what channels should I be spending my time?","p":["Wherever you enjoy! But we have some special channels for you as well as advice on engaging with the community:"]},{"i":"artist-announcements","l":"#artist-announcements","p":["This is for all Art Blocks artists to share announcements regarding an upcoming Art Blocks drop. Additionally, an artist may post a message if they are sharing info on physical mints, have upcoming exhibits, or an external site with an explanation of a project, cutting the total # of mints/setting the last day for their project to be open."]},{"i":"artist-general-private","l":"#artist-general (private)","p":["General discussion for Art Blocks artists. Most private updates from the team will be shared here too."]},{"i":"artist-tech-private","l":"#artist-tech (private)","p":["Tech-focused discussion for artists."]},{"i":"artist-project-feedback-private","l":"#artist-project-feedback (private)","p":["Channel for feedback from other artists on your Art Blocks works in progress."]},{"i":"curated-artists-private","l":"#curated-artists (private)","p":["Channel for Curated Artists."]},{"i":"os-private","l":"#os (private)","p":["To report any issues or scam collections to OpenSea."]},{"i":"block-talk","l":"#block-talk","p":["Our most popular channel with 50k+ messages a month. This is where a majority of discussion takes place and culture is shaped. Topics are primarily generative art and NFTs but can vary widely on daily events and which members are present.","ArtBot also has the most functionality here. Users can call any Art Blocks project and output at their will and sales are posted live as they occur.","Although discussion can move at a rapid pace, engaging here with the community will have the greatest reward for you as a new artist. Feel free to lurk and get a feel for the discussion but even reacting with emojis/GIFs will help the community become familiar with your name (Remember, as an artist you will have a special Role in the server including an Orange colored handle!)."]},{"i":"ab-only-project-share","l":"#ab-only-project-share","p":["For sharing your works-in-progress with the community. Sharing outputs on a regular basis here is a great way to get the community interested in an unannounced project and feel involved in the creation process."]}],[{"i":"#","p":["Marketing 101"]},{"l":"Marketing 101","p":["Marketing can help projects reach their widest audiences. Crypto markets are volatile, and sales are not guaranteed. One way artists achieve sustainable success can be to build an active and engaged audience. Art Blocks has a thriving community on several social media channels that is enthusiastic to engage with new artists and new projects. We encourage you to engage with this community and provide resources for doing so, as you prepare to release your work."]},{"l":"Guidelines","p":["Please adhere to the following guidelines for public communication prior to the launch of your Art Blocks drop:","If you are working on a project for Art Blocks without an approved release, announce it as a \"planned submission\" to Art Blocks.","If your project is approved for release but not yet scheduled, announce it as a \"planned release\" on Art Blocks.","If your project has a scheduled release date, announce it as an \"upcoming release\" on Art Blocks.","For artists with projects designated as Curated releases, wait to reveal the project and its Curated status until after Art Blocks has made an official announcement."]},{"l":"Art Blocks Promotion Resources"},{"l":"Art Blocks Presents Releases","p":["Twitter: Every Monday, we tweet links to the upcoming week’s events and releases. Newsletter: Art Blocks announces upcoming releases on Tuesday via our newsletter, The Link. Discord: The following week's releases are announced in #upcoming-projects on Discord at the end of each week."]},{"l":"Curated Releases","p":["Curated releases are included in the weekly Twitter roundup, newsletter, and #upcoming-projects announcement. Curated releases are also announced by the Art Team with a global ping in #community-announcements (typically) on the Thursday before their release. In addition, the Art Team will publish an interview with the artist. Curated artists will have their own dedicated Discord channel on the Art Blocks server to engage with community members."]},{"l":"Art Blocks Community Programming","p":["The Art Blocks community team hosts a series of public programs to help facilitate conversation around generative art and its contexts, upcoming projects, and the creative coding process. All Art Blocks artists are invited to participate in these programs. If you are interested in joining, please message your artist DM to be connected with our Community Team.","Pre-Drop Talk Pre-Drop Talks happen on Twitter Spaces 15 minutes prior to the release of your project. A member of the Community Team will ask you a series of questions to help collectors get to know more about your creative process and the decisions behind your project. Pre-drop talks are announced on Twitter a few days before release, and you’ll be connected with the host of your talk after your project is announced in #upcoming-projects. You will receive interview questions in advance of the live show. If you do not have a Twitter account, the Community Team will explore alternative ways to host this conversation with you.","Minters & Makers Minters & Makers is a weekly Twitter Space hosted by Art Blocks about generative art. Guests include artists, community members, curators, and generative art experts. Episodes are recorded and subsequently released as a podcast.","After Dinner Mints, ADM An Art Blocks show released on Youtube revolving around conversations with Art blocks artists, staff, and community members. Episodes are recorded and subsequently released as a podcast.","ADM: Behind the Code A subset of “After Dinner Mints” that happens bi-monthly and features artists’ behind the scenes discussions on the technical aspects of their Art Blocks project.","Artists are welcome to participate in all community programs and should reach out to on Discord if they are interested."]},{"l":"Marketing Tools for Artists","p":["One benefit of releasing on Art Blocks is that you are now entering a vibrant ecosystem of generative art experts and enthusiasts. Our main piece of advice for promoting your work/artist profile is to participate in the community. If you have been selected to release on our platform, your work is strong and valuable, no matter the curatorial status."]},{"l":"Art Blocks Discord Server","p":["#artist-general, #artist-tech, #artist-project-feedback Once you’ve been accepted to release on Art Blocks, you’ll be assigned an Artist role in Discord. Here’s your chance to tap into a community of artists preparing for their first release or have already released on Art Blocks! Building your audience begins with leveraging connections with your peers. This is a space to talk shop, ask technical questions, give feedback, and make friends. Build relationships here that extend outside the channel and into other spaces, both AFK (away from the keyboard) and online. Tweeted about your upcoming release? Ask fellow Art Blocks artists to engage with your content. Collaborate on boosting each other’s visibility. Social media can be emotionally taxing, so use this channel as a space to build supportive and genuine relationships. On Tuesdays at 11 PM CT/12 PM ET, Art Blocks hosts Office Hours on Google Meet. This meeting is an open invitation to chat with other artists and the Art Blocks team face-to-face (or audio-to-audio). With our communities spread worldwide, it can be difficult to connect. Through this standing meeting, we hope to bring artists together and strengthen our artist community. Add this meeting to your calendar here.","#artist-announcements Once your project is scheduled, you can use this channel to make an announcement for our larger discord audience. This is an opportunity to narrate the story behind your work. If you have created any additional content, like a Medium article or Youtube video, this would be the place to share.","#block-talk Block Talk is the water cooler for Art Blocks collectors. Our community team does its best to keep a good vibe, but as with any high-speed internet forum filled with many passionate contributors, the conversations can become negative. That being said, bearing in mind your mental health and capacity, it’s the prime location to get your name out there. Hanging out in Block Talk is like being in the kitchen at a big party. Jump in and participate in the conversation. Have some thoughts about the color and composition of a recent project? This would be the place to voice that. Participation is key. Not only do community members respond well to artist input on this channel, but it’s also a great way to build name recognition. This is also the place you’ll want to lurk during your drop; here, you can elucidate and respond to collectors in real-time.","#block-talk // #curated-artist#block-talk is the designated area for collector discussions about Presents projects. Artists can use this space to announce their releases and make updates about their projects to collectors. This is especially useful for upcoming exhibitions, updates on physical shipments, and other pertinent information regarding a specific drop.","Curated artists will have their own channels. Artists can use this space to announce their releases and directly engage with collectors.","Twitter Web3 trends towards Twitter and Discord. In addition to participating on the Art Blocks Discord Server, Twitter is a great place to promote your project. Again, our main piece of advice is to participate! Tweet, reply, and share works in progress. Engage with those who comment on your posts. Follow other generative artists and Web3 thought-leaders. Alongside Discord, this is the place to start conversations with fellow artists and collectors. Sharing your work is equally as important as participating in conversations.","Other Tips","Collaborate with an institution or gallery to showcase your work","Have a virtual hype-man? Gift them with a token! Show appreciation to your fans","Create additional materials that frame and give context to your work as an artist, this can be done through a project website, Youtube video, Medium article, etc."]},{"i":"mental-health--social-media","l":"Mental Health & Social Media","p":["As told by Natalie Christensen"]},{"i":"tips-for-managing-social-media-use","l":"Tips for managing social media use:","p":["For anyone who is considering reducing time on social media, it is a good idea to find out how much time you are spending there. There are apps that will help you get a baseline of how much time you are spending before setting a goal of reducing that time.","This article from March 2022 recommends the best apps for tracking and reducing time on social media."]},{"i":"make-a-routine-that-works-for-you","l":"Make a routine that works for you:","p":["After determining how much time you are spending on social media, start to pay close attention to the emotions you feel when scrolling through a social media feed. If the emotions are negative (FOMO, anxiety, jealousy, anger, or depression) it may not be the best place for you. Consider removing the apps that bring up this feeling most. Choose an activity that can replace social media at that time – taking a walk, reading a book, breathing exercises, calling a friend, etc. can be a remedy for these negative emotions.","For those of us who need to use social media for work, promoting art, etc. it can help to set specific times of day and a specific amount of time to attend to social media responsibilities and then set it aside for the day. Set daily limits and stick to it. That may not be easily done but keep setting it as a goal until you accomplish the daily time limits. Move on to other tasks after the time you allotted for social media is complete. Consider turning off social media notifications so your phone is not distracting you from other tasks."]},{"i":"other-things-to-consider","l":"Other things to consider:","p":["Sharing parts of your personal story on social media can be risky and uncomfortable. If you choose to share, do it safely and manage expectations. Tell other friends you will be doing this and ask for feedback before sharing. Ask for their support in the social media space if possible.","Using social media one hour or less before bedtime can interfere with sleep, the quality of sleep, etc. Consider keeping your phone in a place away from your bedside. Carefully consider the accounts you follow and consider their purpose and why you think it is important to follow them. If you don’t have a clear answer, consider unfollowing.","Avoid online arguments or engaging with users you perceive to be negative: If you post a controversial opinion, don’t engage if you are attacked or negatively confronted. Your social media is your own space and defending your work or beliefs constantly is emotionally depleting. If someone tries to pull you into an argument, remember that kindness is much more effective than anger."]},{"i":"remember-the-benefits-of-life-offline","l":"Remember the benefits of life offline:","p":["Remember why you set the goal of less time online. If it was due to negative emotions or too little time for other things, then that is a reason to continue working towards your goal. Limiting time improves sleep and prioritizing in-person connections also reduces negative emotions and comparisons to others."]}],[{"i":"project-pricing-dutch-auction-settings","l":"Project Pricing: Dutch Auction Settings","p":["This resource intends for artists to better understand exponential Dutch auction settings. Dutch auctions are the recommended model for project economics. The project pricing model has been updated to allow for more price discovery based on market conditions.","Dutch Auction settings are based on the project collection type (Curated vs. Presents) and whether the project is the first release by the artist. For exponential Dutch auctions, artists specify the starting price, ending price, and half-life for price drops. Each collection is assigned a recommended starting value and maximum resting price guided by the collection size and series category. The recommended starting price is the value you should use for the start of the auction. The maximum resting price refers to the base price of an auction; this is the final price tier of the auction sequence.","Art Blocks recommends using exponential decay with these values for no longer than an hour. We will monitor market conditions and adjust these values as needed over time. If you'd like to explore a project size of less than 100, alternate sales mechanics, or have an established sales history outside of these parameters, please speak with Art Blocks’ Art Team for a specialized recommendation."]},{"l":"Price Reductions","p":["A project's pricing cannot be altered after release. Instead, you may reduce your project size but must run the change by the Art Blocks Art Team in your [M_] DM on Discord. We recommend waiting at least 4 weeks before reducing collection size.","Our contract automatically locks projects FOUR WEEKS after their final mint.","Note: If the artist reduces maxInvocations to current invocations, that tx is considered the start of the four-week timer until lock."]}],[{"i":"#","p":["Staging Checklist"]},{"l":"Staging Shell Checklist","p":["For Accepted Artists: Ask questions in the Discord DM titled [G_] the Art Team provided to you For Applying Artists: Ask questions in #artist-applications on Art Blocks’ Discord Server"]},{"l":"Connect Your Wallet","p":["Within your MetaMask plugin, change your network to “Goerli Test Network”. You should see this as a drop-down option at the top of your MetaMask window. [Note: If you do not see this drop-down as an option, please go to Account > Settings > Advanced and toggle “Show test networks” to YES. Once toggled to YES, you should see Goerli Test Network and others as a drop-down option.]","Go to https://artist-staging.artblocks.io/","Click the Connect button in the upper right corner if you are not already connected, and sign the presented transaction. If you are not connected when accessing project pages, a 404 error will appear.","Note: For your Art Blocks application, please connect with a hot wallet. Hardware wallets are not currently compatible with Art Blocks staging."]},{"l":"Upload","p":["Please ensure that you have reviewed and abided by our Documentation and Guidelines & Constraints. Suppose you are assigning rarity to different things. In that case, Art Blocks strongly recommends using an instance of the Random class found here to feed all of your project's randomness. Before uploading, please verify that your script meets this requirement.","Ensure your wallet is funded with enough Goerli ETH to pay the gas fees for the upload and unpausing process. You can harvest Goerli here.","Submit one field at a time. Wait for that transaction to clear before attempting the next field.","Upload your script. Guide to uploading your script can be found in the Project Form Fields Guide"]},{"l":"Test Minting","p":["Before minting, go to the minter tab and set the minter to Set Price - ETH (V2). Set the base price low as to not waste GoerliEth.","After you submit the minter to Set Price - ETH (V2) and entered the base price, go back to your project page and scroll down.","You will find the button that says Artist Mint. By pressing this button, you can mint outputs without unpausing your project.","Press PURCHASE.","Success! You've minted your first test output. In order for your project shell to be reviewed by the internal screening committee, you will need to mint 50-70 test outputs."]},{"l":"Features","p":["Please see Features for full details on how you set your project features as an artist."]},{"l":"Add your project description","p":["The project description is an opportunity for you to highlight your intentions and provide an interpretative frame around how you want the viewer/collector to approach your project. For this reason, we find it very important. We have a series of prompts to help artists get started with this. Here is a suggested guideline.","• Begin with a strong, clear opening sentence.","• Lead with the artistic inquiry; what questions can be prompted or answered through this work?","• How would you describe this project to someone unfamiliar with your work?","• What inspiration, color palette influences, themes, and techniques were used?","• Examine the outputs. What can the viewer see?","• Be sure to describe any interactivity features, if applicable.","• End by summarizing how the medium, outputs, and algorithm achieve your initial inquiry or concept."]},{"l":"Updating your script","p":["If you make changes to your script, you may individually refresh your tokens. If you’ve refreshed your tokens, but do not see changes reflected, make sure that you have cleated your cache."]}],[{"i":"#","p":["A project checklist to walk through for Curated projects."]},{"l":"Checklist for Curated Projects","p":["Before proceeding to mainnet upload, please verify that your script behaves as expected across all major web browsers (e.g. Chrome, Firefox, Safari, etc.). We recommend using Browserstack to test across devices. If you do not already have an account, select Get started free and set up a free account."]},{"l":"Upload","p":["Please ensure that you have reviewed and abided by our Documentation and Guidelines & Constraints. If you are assigning rarity to different things, Art Blocks requires that you use an instance of the Random class found here to feed all of your project's randomness. Prior to uploading, please verify that your script meets this requirement.","Ensure your wallet is funded with enough ETH to pay the gas fees for the upload and unpausing process. For more information on the estimated cost of these steps, click here.","Submit one field at a time. Wait for that transaction to clear before attempting the next field.","When you upload your script, please copy it exactly from testnet.","Please double-check, triple-check, and then check again the generated features script results on staging to ensure they are 100% accurate. This is extremely important to get right, as it changes to fix any bugs you may introduce in this script may have a massive impact on how the artwork is perceived by collectors and may cause confusion in the secondary market. It is your responsibility to guarantee that your features script is properly verified in the artist staging environment."]},{"l":"Features","p":["Please see Features for full details on how you set your project features as an artist.","The features script for your project should first be tested on the Goerli testnet ( https://artist-staging.artblocks.io) alongside your art script. Ensure that your features are being displayed as expected on testnet before proceeding to project deployment to mainnet.","When uploading your feature script to mainnet ( https://www.artblocks.io/), please ensure that you are uploading the same features script, taking the same care that you would with your art script itself.","While the features script is not stored on-chain like the art script is, bugs in your features script will cause meaningful disruptions for collectors trying to explore your work on a per-feature basis."]},{"l":"Tags","p":["Add relevant tags to your project. More on tags here."]},{"l":"Economics","p":["Review the Project Pricing Model for Dutch auctions here","Consider the overall economics of your project for a successful release.","Artists can only have one active project at a time.","As a note, we require artists to take a 6 month cooldown period between considerations for Curated projects. The cooldown period begins when your project sells out (i.e. when minting is 100% complete)."]},{"l":"Charity Component","p":["To maintain our commitment to charitable giving, we ask artists to consider donating 25% of sales above the resting price via Dutch auction to a charity of their choice. If you elect to participate in this way, please determine your chosen charity, and confirm its eligibility, before mint #0. To whom and how you donate is entirely up to you. Art Blocks does not require you to donate any proceeds in order to engage with our platform. If you do elect to donate to a charity, it is advisable to consider whether the charity which you choose to support qualifies under United States tax law to receive tax-deductible donations. If your project designates only one primary wallet, you may use the additional payee field to manage on-chain donations. All revenue may also be routed to a single wallet and donated after your drop. We encourage you to consult with a tax professional to understand any potential tax implications of your planned giving, as these can be widely variable.","Learn more about Charitable Donation here."]},{"i":"approve-additional-payee-info-for-primary-and-secondary-sales","l":"Approve additional payee info for primary and secondary sales⛽","p":["Include the wallet addresses for primary and secondary sales to be distributed. Once submitted, the details will be approved by the Art Team. If you do not have additional wallet addresses that will receive funds from primary or secondary sales you must input 0x0000000000000000000000000000000000000000 in the blank fields."]},{"i":"mint-0","l":"Mint #0","p":["Note: Mint #0 will be completed with the Set Price minter. Set the minter to Set Price ETH with the set price as your Dutch Auction’s base price for Mint #0. Mint #0 must be left up to chance, artists cannot use tokenId to control the features of the output.","Before minting Mint #0, ensure that your \"additional payee wallet\" has been set for the same configuration that you will use it for in your project release. E.g., if you are using the \"additional payee wallet\" field to donate to charity at the time of mint, you must set this before minting your #0. This is done to ensure that this full functionality is tested end-to-end as part of the mint #0 process, and that there are no issues with the wallet selected for the additional payee. Please note: Art Blocks does not currently support sending primary sales payments into a multi-sig contract and there are known issues when attempting to do so. While we plan to update our minting smart contracts in the near future to resolve this, multi-sig wallets should not be used for this purpose at this time.","Once your project information has been uploaded, please confirm in your artist DM that you're ready for mint #0. The Art Blocks Team will look over your project shell and then give you the go-ahead to mint #0.","Mint #0 must occur before your release can be scheduled."]},{"l":"Payout Details","p":["Be sure that you've input information in all field forms. If you do not have an additional payee for primary or secondary sales, you may put 0x0000000000000000000000000000000000000000 in the field and 0% for the payee percentage."]},{"l":"Initiating your Minter Suite choice","p":["We have a variaty of minters available for you to choose from to best suit your project.","For an overview of all minters available for artists, please see the Shared Minter Suite page.","For more detailed instructions on how to configure your selected minter, please see the Minter section of the Project Form Fields Guide.","If you are using the Dutch auction - Exponential Price Decrease(with or without settlement) or Dutch auction - Linear Price Decrease, you will need to unpause your project before your auction's start time. Your project can be unpaused under the Danger tab any time prior to the starting time of your auction. We recommend unpausing projects on the morning of your release. Once unpaused, your project will be marked as “Upcoming,” and the Dutch auction will automatically begin at your start time, leaving the beginning of the auction hands-free."]},{"l":"Scheduling","p":["Once mint #0 and the features script are in place, Art Blocks will work with you to schedule/announce your curated release.","Curated releases will include an artist feature with a Q&A to be gathered following scheduling.","Curated artists will also have an artist channel created in Discord. To pin messages in your artist channel, you must enable two-factor authentication within User Settings > My Account in Discord.","After your project has been scheduled, you are free to announce and promote your project on your social media."]},{"l":"Pre-Drop Talk","p":["Pre-Drop Talks happen on Twitter Spaces 15 minutes prior to the release of your project. A member of the Community Team will ask you a series of questions to help collectors get to know more about your creative process and the decisions behind your project. Pre-drop talks are announced on Twitter a few days before release, and you’ll be connected with the host of your talk after your project is announced in #upcoming-projects. You will receive interview questions in advance of the live show. If you do not have a Twitter account, the Community Team will explore alternative ways to host this conversation with you."]},{"l":"Unpausing","p":["When it's time, you'll click the Unpause button under the Danger tab.","You may unpause your Dutch auction release up to 24 hours in advance.","For fixed price releases, please send in the tx 30 seconds prior to the top of the hour. To unpause the project, please send high gas (2-3x what is suggested as high gas on https://etherscan.io/gastracker). If you have questions about what you should set your gas to, please ask in your project DM and the Art Blocks Team can advise.","Once the transaction clears, your project will be live for minting."]},{"l":"Rarities","p":["Do not discuss odds or feature rarities about your project until it is completely sold out."]},{"l":"Finishing Steps","p":["If you are using Settlement in your auction, after the auction has completed, you must go to Payout Tab and claim revenue.","Once your project is completely sold out, you may reset the Additional Payee Percentage to 0% for any charitable giving that was conducted during minting. If removing, you will need to edit the secondary payee info to your wallet or set the percentage to 0. In order to successfully complete this change, you will need to input information in all fields in the Payout tab.","Report final charity donation totals in your Mainnet DM","Please fill out the appropriate form to add bot-support to your Discord channel for your completed project: https://github.com/ArtBlocks/artbot/issues/new/choose.","Personalize your OpenSea Collection. Learn more about doing so here.","Last, please feel free to hang out as much or as little as you'd like in your channel going forward. If you plan to take an extended amount of time away from the community in the next month, we'd appreciate it if you would communicate that you are disconnecting to your collectors in case they have any questions in the interim."]}],[{"i":"#","p":["A project checklist to walk through for Presents projects."]},{"l":"Checklist for Presents Projects","p":["Before proceeding to mainnet upload, please verify that your script behaves as expected across all major web browsers (e.g. Chrome, Firefox, Safari, etc.) We recommend using Browserstack to test across devices. If you do not already have an account, select Get started free and set up a free account."]},{"l":"Upload","p":["Please ensure that you have reviewed and abided by our Documentation and Guidelines & Constraints. If you are assigning rarity to different things, Art Blocks strongly recommends that you use an instance of the Random class found here to feed all of your project's randomness. Prior to uploading, please verify that your script meets this requirement.","Ensure your wallet is funded with enough ETH to pay the gas fees for the upload and unpausing process. For more information on the estimated cost of these steps, click here.","Submit one field at a time. Wait for that transaction to clear before attempting the next field.","When you upload your script, please copy it exactly from testnet.","Please double-check, triple-check, and then check again the generated features script results on staging to ensure they are 100% accurate. This is extremely important to get right, as it changes to fix any bugs you may introduce in this script may have a massive impact on how the artwork is perceived by collectors and may cause confusion in the secondary market. It is your responsibility to guarantee that your features script is properly verified in the artist staging environment."]},{"l":"Features","p":["Please see Features for full details on how you set your project features as an artist.","The features script for your project should first be tested on the Goerli testnet ( https://artist-staging.artblocks.io), alongside your art script. Ensure that your features are being displayed as expected on testnet before proceeding to project deployment to mainnet.","When uploading your feature script to mainnet ( https://www.artblocks.io/), please ensure that you are uploading the exact same features script, taking the same care that you would with your art script itself.","While the features script is not stored on-chain like the art script is, bugs in your features script will cause meaningful disruptions for collectors trying to explore your work on a per-feature basis."]},{"l":"Tags","p":["Add relevant tags to your project. More on tags here."]},{"l":"Economics","p":["Review the Project Pricing Model for Dutch auctions here","Consider the overall economics of your project for a successful release.","Artists can only have one active project at a time.","In order to submit a new project, your previous project must be closed (sold out/completed)."]},{"l":"Charity Component","p":["To maintain our commitment to charitable giving, we ask artists to consider donating 25% of sales above the resting price via Dutch auction to a charity of their choice. If you elect to participate in this way, please determine your chosen charity, and confirm its eligibility, before mint #0. To whom and how you donate is entirely up to you. Art Blocks does not require you to donate any proceeds in order to engage with our platform. If you do elect to donate to a charity, it is advisable to consider whether the charity which you choose to support qualifies under United States tax law to receive tax-deductible donations. If your project designates only one primary wallet, you may use the additional payee field to manage on-chain donations. All revenue may also be routed to a single wallet and donated after your drop. We encourage you to consult with a tax professional to understand any potential tax implications of your planned giving, as these can be widely variable.","Learn more about Charitable Donation here."]},{"i":"approve-additional-payee-info-for-primary-and-secondary-sales","l":"Approve additional payee info for primary and secondary sales⛽","p":["Include the wallet addresses for primary and secondary sales to be distributed. Once submitted, the details will be approved by the Art Team. If you do not have additional wallet addresses that will receive funds from primary or secondary sales you must input 0x0000000000000000000000000000000000000000 in the blank fields."]},{"i":"mint-0","l":"Mint #0","p":["Note: Mint #0 will be completed with the Set Price minter. If you use a fixed price, your project will be unpaused under the Danger tab right before your project’s release. Once a project using Set Price - ETH or Custom ERC20 is unpaused, it will be live for minting. If your project is sold via a Dutch auction, please set the minter to Set Price ETH with the set price as your Dutch Auction’s base price for Mint #0. Mint #0 must be left up to chance, artists cannot use tokenId to control the features of the output.","Before minting Mint #0, ensure that your \"additional payee wallet\" has been set for the same configuration that you will use it for in your project release. E.g., if you are using the \"additional payee wallet\" field to donate to charity at the time of mint, you must set this before minting your #0. This is done to ensure that this full functionality is tested end-to-end as part of the mint #0 process, and that there are no issues with the wallet selected for the additional payee. Please note: Art Blocks does not currently support sending primary sales payments into a multi-sig contract and there are known issues when attempting to do so. While we plan to update our minting smart contracts in the near future to resolve this, multi-sig wallets should not be used for this purpose at this time.","Once your project information has been uploaded, please confirm in your artist DM that you're ready for mint #0. The Art Blocks Team will look over your project shell and then give you the go-ahead to mint #0.","Mint #0 must occur before your release can be scheduled."]},{"l":"Payout Details","p":["Be sure that you've input information in all field forms. If you do not have an additional payee for primary or secondary sales, you may put 0x0000000000000000000000000000000000000000 in the field and 0% for the payee percentage."]},{"l":"Initiating your Minter Suite choice","p":["We have a variaty of minters available for you to choose from to best suit your project.","For an overview of all minters available for artists, please see the Shared Minter Suite page.","For more detailed instructions on how to configure your selected minter, please see the Minter section of the Project Form Fields Guide.","If you are using the Dutch auction - Exponential Price Decrease(with or without settlement) or Dutch auction - Linear Price Decrease, you will need to unpause your project before your auction's start time. Your project can be unpaused under the Danger tab any time prior to the starting time of your auction. We recommend unpausing projects on the morning of your release. Once unpaused, your project will be marked as “Upcoming,” and the Dutch auction will automatically begin at your start time, leaving the beginning of the auction hands-free."]},{"l":"Scheduling","p":["Once mint #0 and the features script are in place, Art Blocks will work with you to schedule/announce your release.","After your project has been scheduled, you are free to announce and promote your project on your social media.","Refer to our Marketing 101 Guide here"]},{"l":"Pre-Drop Talk","p":["Pre-Drop Talks happen on Twitter Spaces 15 minutes prior to the release of your project. A member of the Community Team will ask you a series of questions to help collectors get to know more about your creative process and the decisions behind your project. Pre-drop talks are announced on Twitter a few days before release, and you’ll be connected with the host of your talk after your project is announced in #upcoming-projects. You will receive interview questions in advance of the live show. If you do not have a Twitter account, the Community Team will explore alternative ways to host this conversation with you."]},{"l":"Unpausing","p":["When it's time, you'll click the Unpause button under the Danger tab.","You may unpause your Dutch auction release up to 24 hours in advance.","For unpausing fixed price releases, please send in the tx 30 seconds prior to the top of the hour. To unpause the project, please send high gas (2-3x what is suggested as high gas on https://etherscan.io/gastracker). If you have questions about what you should set your gas to, please ask in your project DM and the Art Blocks Team can advise.","Once the transaction clears, your project will be live for minting."]},{"l":"Rarities","p":["Do not discuss odds or feature rarities about your project until it is completely sold out."]},{"l":"Finishing Steps","p":["If you are using Settlement in your auction, after the auction has completed, you must go to Payout Tab and claim revenue.","Once your project is complete, you may reset the “Additional Payee Percentage” to 0% for any charitable giving conducted during minting. If removing, you will need to edit the secondary payee info to your wallet or set the percentage to 0. In order to successfully update payout details, you will need to enter information into all fields to submit the change.","Report final charity donation totals in your artist DM","Personalize your OpenSea Collection. Learn more about doing so here.","[For previously Curated only] Please fill out the appropriate form to add bot support to your Discord channel for your completed project: https://github.com/ArtBlocks/artbot/issues/new/choose."]}],[{"i":"#","p":["An overview of minting philosophy at Art Blocks."]},{"l":"Minting Philosophy","p":["An overview of the generative art minting philosophy at Art Blocks."]},{"l":"Introduction","p":["At Art Blocks, minting is a particularly special occasion where a new generative art piece is created. It is the final step in the generative art creation process, and enables collectors to partner with artists to create a unique, one-of-a-kind piece of generative art!","On a blockchain, \"minting\" is the process of creating new tokens. So not only is minting the process of creating new generative art pieces, it is also the process of creating new tokens on a blockchain. Typically, minting is also the point where a collector will pay for the generative art piece.","A few key points about minting at Art Blocks:","Minting is the process of creating new generative art pieces.","Minting is the process of creating new tokens on a blockchain.","Minting generally involves a collector paying for the right to create a generative art piece."]},{"l":"Core Principles","p":["At Art Blocks, we are committed to providing a transparent minting toolkit for artists, and a transparent minting experience for collectors.","The following principles, when used together, are important ideals that we believe enable artists to achieve some sort of \"fairness\" during their drop. They also are key to collector safety when interacting on a blockchain."]},{"l":"1. Transparency","p":["We believe that minting should be transparent and easy to understand for collectors. Verified source code is provided for all minter smart contracts, and we develop our minters publically in our open source GitHub repository."]},{"i":"2-decentralized--trust-minimized","l":"2. Decentralized & Trust-Minimized","p":["We believe that minting should rely heavily on immutable smart contract code deployed to decentralized networks, and should be as trustless as possible. We aim to minimize the amount of trust in any centralized party when minting. This is important because collectors must feel safe when purchasing high-value generative art pieces, and trusting a centralized party to mint a generative art piece is often not an acceptable option.","Of course Artists and Art Blocks will have some elevated privileges, such as configuring auctions, but we aim to minimize those privileges and implement only when necessary. Those privileges will be documented and transparent, and should align incentives."]},{"l":"3. Non-Custodial","p":["Minting should be a transaction between the collector and the minter smart contract, and the contract should handle logic related to settlements, price changes over time, etc.","The minter smart contract should empower the collector to make their own decisions, and should not be custodial in nature."]},{"l":"4. Honest","p":["Blockchains have a unique set of technical quirks that can be exploited by opportunistic or malicious actors. These result in frequent discussions about bots, \"flipping\", and front-running.","We are committed to providing solutions to help alleviate these issues, but we are also committed to being honest about their limitations. Solutions must have sound fundamentals, and ones that only hide or obfuscate minting bots or other issues are not real solutions, and therefore should not be implemented. See the Lessons Learned section for more examples of this."]},{"l":"5. Flexible","p":["In some situations, a project may desire to mint in a way that is highly centralized or in some other non-traditional manner. An example of this would be a project that utilizes in-person minting at an event. In this case, the project may choose to mint from a single, centralized mobile device, but should be transparent about that decision."]},{"i":"fairness-ideals","l":"\"Fairness\" Ideals","p":["Fairness is a concept that is often discussed in the context of minting, and is worth investigating in some amount of nuance.","In an abstract sense, fairness is easy to define. Merriam-Webster defines fairness as:","\"marked by impartiality and honesty: free from self-interest, prejudice, or favoritism\".","In practice, however, fairness of a project's mint is much more difficult to define. In one sense, Art Blocks drops are entirely fair:","Open sale at a defined price or auction","Mint success is determined by transaction time/order","Transaction confirmation time is determined by the network's gas price auction","In another sense, there are many different ways to define fairness, and each definition has its own set of tradeoffs. In general, we believe there are a few types of fairness that are important to consider when an artist is considering how to distribute their project to collectors:"]},{"l":"1. Capitalist Fairness","p":["Capitalist fairness suggests that those who are willing to pay the most for a given drop should be the ones who are able to participate.","An example of a drop paradigm that is capitalist fair is a Dutch auction. In a Dutch auction, the price of a generative art piece starts high, and decreases over time until a collector is willing to pay the price. This ensures that the collector who is willing to pay the most for a generative art piece is the one who is able to mint it."]},{"l":"2. Insider Fairness","p":["Insider fairness suggests that those within an existing community should be the ones who are able to participate.","An example of a drop paradigm that is insider fair is an allowlist. In that paradigm, a collector must have reached out to an artist before the project was released to be allowed to mint. This ensures that the collector who is most involved and interested in a community is the one who is able to mint a generative art piece."]},{"l":"3. Communist Fairness","p":["Communist fairness suggests that all collectors should have an equal chance to participate, regardless of their technical skills or willingness to pay.","An example of a drop paradigm that optimizes for communist fairness would be a pure lottery, where all collectors have an equal chance to mint a generative art piece. This ensures that all collectors have an equal chance to mint a generative art piece."]},{"l":"Fairness in Practice","p":["In practice, it is difficult to achieve any of the above definitions of fairness in a pure sense. For example, a pure lottery is not possible on Ethereum, because the network is not able to discern humans from bots, and therefore a pure lottery would be susceptible to bots spamming entries and disproportionately winning the lottery.","Art Blocks aims to provide a variety of minting options for artists to choose from, each with their own set of tradeoffs. We believe that artists should be able to choose the minting paradigm that best fits their project's goals.","The minters provided by Art Blocks are intended to follow our design principles while also achieving some kind of fairness. However, each minter's amount of fairness and suceptibility to bots will vary based on:","project demand/hype","project price","market conditions","gas prices","etc.","For example, if a highly-anticipated project is sold at a low fixed-price, it is likely that bots will be able to mint a large number of generative art pieces. However, if a less-anticipated project is sold at a fixed-price, it is likely that bots will not mint a large number of generative art pieces because the speculative value of the generative art piece is not high enough to flip for a short-term profit.","The minters provided by Art Blocks are not inherently fair or unfair in nature, but that when used carefully, they can provide a minting experience that stays true to our principles while also providing some amount of fairness. We believe that it is important for artists to understand the tradeoffs of each minter, and to choose the minter(s) that best fits their project's goals."]},{"l":"Minter Suite","p":["The minter suite is a collection of smart contracts that aim to provide different options for artists to distribute their project's tokens to collectors. A variety of minters are available for artists to choose from that can be used to create a variety of different minting experiences. The minters are designed to be flexible and extensible, but also to provide a consistent and familiar minting experience for collectors.","The shared minter suite is used by Art Blocks, and is also available for use with Art Blocks Engine contracts (V3 only).","More details will be added regarding the shared minter suite in the future, but for now, please see the Shared Minter Suite page for an overview of all available flagship minters at this time."]},{"l":"Lessons Learned","p":["Below is a collection of lessons that we have learned from our experience with minting generative art pieces on Ethereum."]},{"i":"one-mint-per-wallet-does-not-prevent-bots-without-an-allowlist","l":"One mint per wallet does not prevent bots (without an allowlist)","p":["In the past, we have implemented a \"1 mint per wallet\" rule, which was intended to prevent bots from minting a large number of generative art pieces. However, this rule was not effective, and actually gave an advantage to bots.","For a botter, minting from 1 or 100 wallets is nearly the same difficulty. However, for a typical collector not using bots, minting from multiple wallets adds a lot of difficulty. Ultimately, the \"1-per\" restriction puts the average collector at a huge disadvantage relative to a botter.","The \"1 mint per wallet\" rule is also somewhat misleading because it may lead collectors to believe that a project's distribution is well-diversified, when in reality, it might only be owned by a network of bots operating at many addresses.","In the end, this rule was not effective, harmed less-technical collectors, and was therefore abandoned.","Note: Limiting the number of mints per wallet on an allowlist is a different paradigm, and is a valid way to limit the number of mints per wallet."]},{"l":"Disabling minting from smart contracts does not prevent bots","p":["In the past, we have implemented a rule that prevented minting from smart contracts. This was intended to prevent bots from minting a large number of generative art pieces. However, this rule was not effective, because bots are able to mint from EOAs (externally owned accounts), and therefore are still able to mint a large number of generative art pieces.","The \"no minting from smart contracts\" rule is also somewhat misleading because it may cause collectors to believe that a project's was bot-resistant, when in reality, it is not an effective way to prevent bots from minting.","In the end, this rule was not effective, harmed collectors that wanted to mint from a smart contract (including from security-forward multi-sig wallets such as Gnosis Safe), and was therefore abandoned."]},{"l":"One mint per transaction does not prevent bots","p":["This is a rule that is implemented by some NFT projects, and is intended to prevent bots from minting a large number of generative art pieces. However, this rule is not effective, because bots are able to mint a large number of generative art pieces by submitting multiple transactions to the network's pending transaction pool.","Additionally, most implementations of this rule prevent minting from smart contracts, which is harmful to collectors that want to mint from multi-sig wallets. Other solutions require collectors to pay for additional gas fees for on-chain storage to support the rule's logic, which is also harmful to collectors.","In the end, this rule is not effective, harms less-technical and/or security-conscious collectors, and was therefore abandoned."]},{"i":"low-fixed-prices-favor-bots","l":"Low, fixed prices favor bots","p":["In general, low, fixed prices favor bots because they are able to mint a large number of generative art pieces and flip them for a short-term profit. This is especially true when the project is highly-anticipated, and when the project's generative art pieces are expected to have a high speculative value.","Bots have a large advantage over humans when it comes to minting at low, fixed prices, because they are able to submit transactions to the network's pending transaction pool at a high rate, and are able to pay high gas prices to ensure that their transactions are confirmed quickly.","In general, we recommend that artists consider using a Dutch auction or an allowlist to mitigate the effects of bots when minting at low, fixed prices."]}],[{"l":"Shared Minter Suite","p":["This page provides an overview of the Art Blocks Shared Minter Suite, which enables artists to choose how they distribute their artwork to collectors.","The Shared Minter Suite is available for all projects, including Art Blocks Engine projects.","Only projects on contracts that have been migrated to the Shared Minter Suite will be able to use the new minter options. Engine core contract admins can view the Minter Migration Runbok for more details."]},{"l":"Mix-and-Match","p":["Artists can mix-and-match minter options to create a custom minter configuration for their project. For example, an artist could initially use the allowlist minter to allow a specific set of collectors to mint one token per allowlisted wallet, and then could open up minting to the public via a switch to a Dutch auction with settlement minter.","Each minter supports limiting to a certain number of project invocations. For example, an artist could allow Minter A to be used for the first 1000 project invocations, and then switch to Minter B for the remaining project invocations."]},{"l":"Globally Available Minter Options","p":["The current available Minter options are discussed below. We are continually expanding our shared minter suite over time."]},{"i":"set-price-eth","l":"Set Price, ETH","p":["The set price minter is used for fixed price releases. It is the simplest minter and prices all tokens at the same price, in ETH."]},{"i":"set-price-erc20","l":"Set Price, ERC20","p":["Set price in ERC20 is a fixed price minter that allows accepting any ERC20 token as payment for your sale of tokens. In addition to specifying a fixed price, artists will specify the ERC20 token address for the custom token sale.","Custom ERC20 tokens can be used for a variety of purposes, including for a \"mint pass\" style experience."]},{"i":"dutch-auction-with-settlement---exponential-price-decrease","l":"Dutch Auction with Settlement - Exponential Price Decrease","p":["When this minter is used, all collectors will pay the same net-price as the final purchaser. This is typically the most fair and equitable Dutch auction type for buyers because all buyers pay the same price, making it a great auction type for many projects.","Collectors who purchase above the lowest price will be able to claim a settlement after the auction. The settlement will be the difference between the price they purchased at and the final purchase price. All funds are held non-custodially by the smart contract until the auction ends and revenues are collected by the artist or admin.","If an artist reduces the max supply of their project mid-auction, and the project sells out above auction base price, revenues must be withdrawn by core contract admin. This was implemented to protect collectors from an artist unilaterally potentially inflating sellout price during an action, and immediately withdrawing revenues. Admin concurrence is required to withdraw revenues in this case.","For supplemental information about the auction reset process, please see the Auction Reset Process section.","For Art Blocks Flagship, please see the Project Pricing: Dutch Auction Settings section for more information on how to determine the appropriate pricing parameters for your auction."]},{"l":"Dutch Auction without Settlement","p":["For Dutch auctions without settlement, artists specify the starting price, ending price, and the half-life for price drops. Collectors will pay more for tokens purchased earlier in the auction, and less for tokens purchased later in the auction.","Two price curves are available for Dutch auctions without settlement: exponential and linear. Exponential price curves approximate a constant percent decrease over time, while linear price curves provide a constant price decrease over time.","Variants of this minter are also provided that support limiting purchasing to wallets that hold a token from a specified list of allowlisted Art Blocks or Art Blocks Engine projects.","For supplemental information about the auction reset process, please see the Auction Reset Process section."]},{"i":"set-price-allowlisted-users-only","l":"Set Price, Allowlisted Users Only","p":["This minter enables the artist to limit minting of their project's tokens to a predetermined list of wallet addresses. Artists upload a list of allowlisted wallet addresses, and may also specify the number of mints allowed per wallet. Mints per wallet can be set to a value, or may be set to unlimited (limited only by project maximum invocations).","Artists are responsible for crafting their allowlist and uploading a comma-separated list of ETH addresses in a .txt or .CSV file to the creator dashboard. These wallet addresses cannot be ENS names, but list the full address of the wallet. Premint is a super helpful tool for creating an allowlist by using social channels to reach collectors, friends, family, etc. In addition, Art Blocks hosts a Python script for retrieving & snapshotting either a list of all Art Blocks token holders or the token-holders of a specific project.","Variants of this minter are provided that support purchasing in ETH, or in a custom ERC20 token.","Allowlists use Merkle trees, which enables them to be verified on-chain and to be decentralized. It also is efficient, enabling very large allowlists. For example, ~ 40,000 wallet addresses were used for the Friendship Bracelet project's allowlist.","Note that vault delegation via Delegate Cash is available for the Allowlisted Users minter. Only V1 of the delegation registry is supported at this time. For more details please visit this video walkthrough."]},{"i":"set-price-token-holders-only","l":"Set Price, Token Holders Only","p":["This minter allows tokens to be minted with ETH when the purchaser owns a token from one or more allowlisted Art Blocks or Art Blocks Engine project. This contract does not track if a purchaser has/has not minted already (ie. a \"mint limit\" is not available) -- it simply restricts purchasing to anybody that holds one or more of a specified list of ERC-721 NFTs.","Artists may use the artist dashboard to pre-select a list of allowlisted Art Blocks or Art Blocks Engine projects, of which any valid token holders will be able to purchase for the upcoming project. Note that a \"snapshot\" won't apply to this minter -- after the project has been made public, users can purchase a token from any allowlisted project and mint freely.","Note that vault delegation via Delegate Cash is available for the Token Holders Only minter. Only V1 of the delegation registry is supported at this time. For more details please visit this video walkthrough."]},{"i":"serial-english-auction-sea","l":"Serial English Auction (SEA)","p":["The Serial English Auction (SEA) minter allows for a series of English auctions for individual tokens to be run in sequence. The minter was originally inspired by the popular nouns.wtf project, and was implemented with minor adjustments to provide a seamless experience for Art Blocks artists and collectors.","Artists may configure future token auction parameters, such as starting auction price and minimum auction length. Collectors may then kick off token auctions by submitting a bid for a pre-minted token. Once an auction begins, any wallet may submit a higher bid for the token up for sale. Losing bids are refunded automatically when outbid. If a bid is submitted near the end of an auction, the auction is extended such that a human is able to submit a higher bid, ensuring a human can fairly compete against a bot.","Once an auction is complete, another token auction may be started by any collector submitting a bid for the next token, while also sending the previous auction winner their token.","The minter pre-mints tokens before their auction, so bids are placed on an already-existing token, not on hypothetical tokens.","The minter may be used for any project, and is certainly ideal for projects that have a series of tokens that are released in a sequence. It may also be used to auction off a 1:1 token. The minter is also ideal for projects that have a strong community, as it allows for community members to participate in the auction process over a long period of time, carefully considering each generative output.","Bids and auction parameters are stored on-chain, and the Art Blocks subgraph and API index all historical bids in bids_metadata as well as auction parameters in project_minter_configurations."]},{"i":"set-price-polyptych","l":"Set Price, Polyptych","p":["This minter enables the artist to mint tokens with identical token hashes. This is useful for projects that are intended to be displayed as a polyptych.","This minter allows either artists to mint child tokens to a parent token holder's wallet, or allows the parent token holder to mint child tokens.","An artist's script must work closely with the minter to ensure that the correct frame is used for each token number. For example, if a project has 3 frames, the artist's script must ensure that e.g. tokens 0-99 are minted with frame 1, tokens 100-199 are minted with frame 2, and tokens 200-299 are minted with frame 3. The artist is able to increment the frame number for their project on the minter.","This minter is technically complex, and artists must also configure the shared randomizer when using this minter.","Limited creator dashboard support is available for this minter at this time, so some interactions with the minter must be done via a service such as [Etherscan]]( https://etherscan.io/).","Despite the complexity of this minter, the resulting outputs can be very powerful and rewarding for artists and collectors!"]},{"i":"custom-one-off-minters","l":"Custom, One-Off Minters","p":["Engine partners can also create custom, one-off minters for their projects. These minters are only available to projects on the Engine contract that approves them, extending the globally set of available minters for their contract.","For more information about adding custom minters to your Engine contract, please see the Minter Migration Runbok."]}],[{"i":"custom-one-off-minters","l":"Custom, One-Off Minters","p":["Some Engine partners may wish to add custom, one-off minters to the shared minter suite. This is able to be done by the admin of an Engine partner's core contract.","Due to the high flexibility available to custom minters, they are not indexed by the Art Blocks subgraph, and therefore are not able to be configured by artists via the Art Blocks frontend. Instead, the custom minter will need to be configured via the Engine partner's frontend, etherscan, etc.","The steps to add a custom, one-off minter to the shared minter suite are as follows:"]},{"l":"1. Write the custom minter contract","p":["The Engine partner will need to write the custom minter contract. The Art Blocks team can assist with providing guidance on how to translate a previously written, non-shared custom minter contract to be compatible with the new shared minter suite, if needed.","At a minimum, the custom minter contract will need to implement the ISharedMinterRequired interface, which is available in the Art Blocks smart contracts monrorepo. This interface requires the custom minter contract to implement the following functions:","Additionally, the custom minter contract will need to call the mint_joo function on the shared minter filter contract to mint tokens. This function is included in the IMinterFilterV1 interface in the Art Blocks smart contracts monrorepo."]},{"l":"2. Deploy the custom minter contract","p":["The Engine partner will need to deploy the custom minter contract to the desired network."]},{"l":"3. Allowlist the minter for the core contract on the shared minter filter contract","p":["The Engine partner will need to allowlist the custom minter contract for their contract, on the shared minter filter contract. This is done by doing the following:","Engine Admin calls approveMinterForContract on the shared minter filter contract, passing in the address of their core contract, and the custom minter contract","The custom minter is now ready to be used by projects on the Engine partner's core contract!"]},{"l":"4. Artist configures the custom minter for their project","p":["The artist will need to configure the custom minter for their project. Custom, one-off minters are not indexed by the Art Blocks subgraph (due to the minter being arbitrary and open-ended), so the artist will need to configure the custom minter via the Engine partner's frontend, etherscan, etc. Note that the typical minter filter function for setting a minter for a project, setMinterForProject should be used by the artist or admin to assign the custom minter for the project."]}],[{"l":"Minter Suite Supplemental Information","p":["This page provides supplemental information for the Art Blocks Shared Minter Suite.","The information below is generally most relevant for Engine core contract admins."]},{"l":"Auction Reset Process","p":["A subset of minters utilize automated, scheduled auctions to distribute artwork to collectors. The auction reset process is a mechanism that allows artists to pause and reschedule their auction, within certain limitations, if an issue arises during a live project release. Example situations may be:","Unexpected website downtime","Artist unintentionally left project in a paused state","Auction parameters were not set as intended","Some of the possible failure modes above can result in a state where:","Collectors are not able to purchase tokens from the website","Bots are still able to purchase tokens by submitting transactions directly to the blockchain","If in a state where bots can purchase but humans can not, the situation requires immediate action to prevent or minimize damage."]},{"i":"1-urgent-pause-the-auction","l":"1. [URGENT] Pause the Auction","p":["The most important step in the auction reset process is for the Artist pause the auction. This prevents any further purchases from being made.","Tips:","Ensure that the project is not already paused (i.e. this step is already complete), and do not toggle the pause button more than once (i.e. pause then unpause)","Artist should use a very high gas price to ensure that the pause transaction is mined quickly","Artist should use a tool like Etherscan to monitor the status of the pause transaction","Verify the paused state of the contract by checking the project's core contract on a tool like Etherscan","DA with Settlement: This step is especially urgent! Settlement minters require that every new purchase price is less than or equal to the previous purchase price (even after an auction is reset). If a bot purchases a token prior to a project being paused, that project’s reconfigured auction (even after reset) is constrained to only be able to start at the bot’s purchase price."]},{"l":"2. Reset auction","p":["When using a Dutch auction, the auction will need to be reset and reconfigured.","This is a 2-step provess, and requires admin-intervention for security:","ADMIN - Call resetAuctionDetails on the minter contract","ARTIST - Configure the auction parameters via your typical process (e.g. artist dashboard)"]},{"i":"3-communicate-and-enjoy","l":"3. Communicate and enjoy!","p":["Ensure your collectors are aware of the new auction parameters, and enjoy the new auction!"]},{"i":"allowlist-minter-details-non-shared-minter-suite-only","l":"Allowlist Minter Details (non-shared minter suite only)","p":["The Allowlist Minter uses a Merkle tree to gas-efficiently allow a set of addresses to mint tokens from a project.","Merkle trees are a data structure that allow for efficient verification of whether a given element is contained in a set. In the case of the Allowlist Minter, the Merkle root is stored on-chain, and Merkle proofs are included with every purchase transaction to verify that a given address is allowed to mint a token.","The information below is included to assist Engine partners in using the Allowlist minter with their projects. However, if using the shared minter suite, the Art Blocks subgraph and api are available to index Engine minter suite data, and this information is not required.","Fundamentals","The Merkle allowlist minter follows the following basic process:","An allowlist of wallet addresses is stored off-chain (e.g. in a csv file)","The artist uploads the Merkle root of the list of addresses to the Minter contract via function updateMerkleRoot","Collectors calculate and include a Merkle proof with their purchase transaction to verify that their address is included in the allowlist","Example Usage","The following typescript code demonstrates how a Merkle root and proof may be calculated for a given allowlist:"]}],[{"l":"API Overview","p":["An overview of the current Art Blocks APIs.","Quick Links:","Token API","Generator API","Media API/Media Server","Art Blocks Subgraph","GraphQL API"]},{"l":"Hosted APIs","p":["As a quick overview, the main APIs that exist currently are:"]},{"l":"Token API","p":["Arbitrum One","Arbitrum Testnet","Contract Type","Engine","Flagship","https://token.arbitrum-staging.artblocks.io/{contractAddress}/{tokenID}","https://token.arbitrum.artblocks.io/{contractAddress}/{tokenID}","https://token.artblocks.io/0","https://token.artblocks.io/0x0a1bbd57033f57e7b6743621b79fcb9eb2ce3676/110000","https://token.staging.artblocks.io/0x81236b5a105d3ad6b56ac41a03e1fd8893a08859/1000001","https://token.staging.artblocks.io/0xda62f67be7194775a75be91cbf9feedcc5776d4b/103000000","https:token.artblocks.io/{contractAddress}/{tokenID}","https:token.artblocks.io/{tokenID}","https:token.staging.artblocks.io/{contractAddress}/{tokenID}","Mainnet","Note: Contract address is required","Note: Contract address is required for Engine","Pattern","Provides the token metadata for a given Art Blocks token.","Sample","Testnet"]},{"l":"Generator API","p":["Arbitrum One","Arbitrum Testnet","Contract Type","Engine","Flagship","https://generator-staging-goerli.artblocks.io/0xda62f67be7194775a75be91cbf9feedcc5776d4b/8000002","https://generator-staging-goerli.artblocks.io/0xe745243b82ebc46e5c23d9b1b968612c65d45f3d/1000001","https://generator-staging-sepolia.artblocks.io/{contractAddress}/{tokenID}","https://generator.arbitrum-staging.artblocks.io/{contractAddress}/{tokenID}","https://generator.arbitrum.artblocks.io/{contractAddress}/{tokenID}","https://generator.artblocks.io/{contractAddress}/{tokenID}","https://generator.artblocks.io/{tokenID}","https://generator.artblocks.io/0","https://generator.artblocks.io/0x0a1bbd57033f57e7b6743621b79fcb9eb2ce3676/11000083","Mainnet","Note: Contract address is required","Note: Contract address is required for Engine","Pattern","Provides an i-frame-able live-view for the art associated with a given Art Blocks token.","Sample","Testnet"]},{"i":"media-apimedia-server","l":"Media API/Media server","p":["Arbitrum One","Arbitrum Testnet","Contract Type","Engine","Flagship","HD Renders – https://media.artblocks.io/hd/{tokenID}.png","https://{enginePartner}-mainnet.s3.amazonaws.com/{tokenID}.png","https://{enginePartner}-mainnet.s3.amazonaws.com/thumb/{tokenID}.png","https://{enginePartner}-sepolia.s3.amazonaws.com/{tokenID}.png","https://art-blocks-artist-staging-goerli.s3.us-west-1.amazonaws.com/10000000.png","https://art-blocks-artist-staging-sepolia.s3.us-west-1.amazonaws.com/{tokenID}.png","https://bright-moments-goerli.s3.amazonaws.com/1000000.png","https://bright-moments-mainnet.s3.amazonaws.com/8000000.png","https://bright-moments-mainnet.s3.amazonaws.com/thumb/8000000.png","https://media-proxy-arbitrum-staging.artblocks.io/{contractAddress}/{tokenID}","https://media-proxy-arbitrum.artblocks.io/{contractAddress}/{tokenID}","https://media-proxy-staging.artblocks.io/{contractAddress}/{tokenID}.png","https://media-proxy-staging.artblocks.io/{tokenID}.png","https://media-proxy-staging.artblocks.io/0.png","https://media-proxy-staging.artblocks.io/0xe745243b82ebc46e5c23d9b1b968612c65d45f3d/1000001","https://media-proxy.artblocks.io/{contractAddress}/{tokenId}.png","https://media-proxy.artblocks.io/0x145789247973c5d612bf121e9e4eef84b63eb707/782.png","https://media.artblocks.io/{tokenID}.png","https://media.artblocks.io/0.png","In addition to the standard static renders provided for each token, there are two other static renders currently provided: \"HD\" and \"thumbnail\". These items can be found at:","Mainnet","Mainnet (Engine)","Note: Contract address is required","Pattern","Please also note that the Generator API and Media API links for a given token are included in the token response for that token from the Token API.","Please note that these additional static render formats are still currently being back-filled and may not yet be present for all tokens. Our current recommendation for those looking to depend on the \"HD\" or \"thumbnail\" responses is to a) first attempt the HD/thumb image resource that you would pefer, b) if this resource is not available, fall back to the standard sized image resource. For the current state of the ongoing backfill of HD and thumbnail assets, please refer to this spreadsheet.","Provides a static snapshot of the rendered live-view for a given Art Blocks token.","Render Type","Sample","Standard","Testnet","Thumbnail","Thumbnail Renders – https://media.artblocks.io/thumb/{tokenID}.png","We are working on a media server for Engine partners. Currently, media is accessible through individual s3 buckets."]},{"l":"Art Blocks Subgraph","p":["Art Blocks has a GraphQL API Endpoint hosted by The Graph called a subgraph for indexing and organizing data from the Art Blocks smart contracts.","This subgraph can be used to query for on-chain data related to the Art Blocks contracts, including minter suite data, token data, and project data.","Subgraph information is serviced by a decentralized group of server operators called Indexers."]},{"l":"Ethereum Mainnet","p":["Explorer Page","Graphql Endpoint: https://gateway-arbitrum.network.thegraph.com/api/[api-key]/subgraphs/id/6bR1oVsRUUs6czNiB6W7NNenTXtVfNd5iSiwvS4QbRPB","Code Repo"]},{"l":"Helpful Resources","p":["Video Tutorial on creating an API Key","Managing your API Key & setting your indexer preferences","Querying from an application","How to use the explorer and playground to query on-chain data"]},{"l":"Querying the Subgraph","p":["Art Blocks Data","Decentralized Graph Network","Environment","Hosted Service","https://thegraph.com/explorer/subgraphs/6bR1oVsRUUs6czNiB6W7NNenTXtVfNd5iSiwvS4QbRPB","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks-arbitrum","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks-artist-staging-sepolia","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks-staging-arbitrum","Limited Secondary Sales Data","No","Production","Recommendation: Using the above links, familiarize yourself with the subgraph’s schema, via the GraphQL playground.","Staging","The Art Blocks Arbitrum subgraphs can be queried at the URLs below:","The Art Blocks mainnet subgraph can currently be queried a few ways:","The Art Blocks testnet subgraph can be queried at the URL below:","The Graph Service","URL","Yes"]},{"l":"Getting Minter Details","p":["A few example queries are provided below to help you get started with querying the Art Blocks subgraph for data related to a project's minter. In addition to the subgraph, the fields are also able to be queried from our Hasura GraphQL API. In the future, Art Blocks will release an SDK that will interact with these data in an even more convenient way.","Note that only Engine contracts that have migrated to the shared minter suite will have their minters indexed and available on the subgraph and Hasura GraphQL API. Only globally approved minters are indexed, so custom, one-off minters designed by Engine partners will not be indexed.","A project's active minter configuration (as configured in the artist dashboard) may be queried by pulling it from the Project entity:","note: if querying the Hasura GraphQL API, use projects_metadata instead of project","The extraMinterDetails json field of minterConfiguration will contain a JSON string that can be parsed to obtain the project-minter-configuration details that may be specific to the minter type. For example, for a Dutch Auction minter, the extraMinterDetails field may contain the following JSON string:","note: if querying the Hasura GraphQL API, the returned type will be a JSONB","Additionally, the minter's extraMinterDetails will contain a JSON string that can be parsed to obtain any minter-specific configuration details. For example, for a Dutch Auction minter, the extraMinterDetails field may contain the following JSON string:","note: if querying the Hasura GraphQL API, use minters_metadata instead of minters, and the returned type will be a JSONB","All of these queries can help you to obtain information about a project's minter configuration, which can be used to display purchase information for the project on your website's. The data are available on both the subgraph, and the Hasura GraphQL API."]},{"l":"GraphQL API","p":["Provides a broader set of the data that our front-end consumes — this includes both on-chain and off-chain data.","Chain","Environment","URL","Ethereum","Production","https://data.artblocks.io/v1/graphql","Staging","https://ab-staging-sepolia.hasura.app/v1/graphql","Staging (deprecated)","https://ab-staging-goerli.hasura.app/v1/graphql","Arbitrum","https://ab-prod-arbitrum.hasura.app/v1/graphql","https://ab-staging-arbitrum.hasura.app/v1/graphql"]},{"l":"Authentication","p":["The following documentation explains how to authenticate with the Art Blocks API to retrieve a JSON Web Token (JWT). This JWT can then be used to gain authenticated access to our GraphQL API. The methods explained here are intended for a client-side environment where a signer is available to sign messages. The procedures are explained using two approaches: Direct API endpoints and GraphQL.","We recommend using the GraphQL-based approach as we have more control over it and can ensure its stability even if underlying API endpoints change. Note that the domain for authentication may change in the future for the Direct API-based approach, while the GraphQL endpoint will remain the same."]},{"i":"graphql-based-authentication-flow-recommended","l":"GraphQL-based Authentication Flow (Recommended)","p":["The GraphQL-based approach leverages the GraphQL schema provided by Art Blocks. This is the recommended approach for stability and future-proofing your implementation.","Here are the functions used in this flow:"]},{"l":"Direct API-based Authentication Flow","p":["The Direct API-based approach involves interacting with the https://artblocks.io/api/get-auth-message and https://artblocks.io/api/authenticate endpoints. We recommend using the GraphQL-based flow instead because of its improved stability and future-proofing, but we're providing the Direct API-based method for those who prefer it.","⚠️ Warning: The domain for authentication may change in the future for the Direct API-based approach. Using the GraphQL-based approach is recommended to avoid future disruptions.","Here are the functions used in this flow:","In both methods, you will find a placeholder /* code to sign message goes here */ where you should implement your code to sign the message using your client-side signer."]},{"l":"Using the JWT for Authenticated Access","p":["Once the JWT has been obtained using either of the above methods, it can be used to make authenticated requests to the Art Blocks GraphQL API. The JWT should be included in the Authorization header of the request. Here's an example:","For a full detailed overview of this GraphQL API, please reference: https://docs.artblocks.io/public-api-docs/","Additionally, you can use this interactive Hasura plaground to test out queries: https://cloud.hasura.io/public/graphiql?endpoint=https://data.artblocks.io/v1/graphql"]}],[{"l":"Artblocks Viewer","p":["An overview of live.artblocks.io"]},{"l":"Routes","p":["All routes are for the environment specified in .env file and act as such. i.e. Ropsten contracts will not work on mainnet and vice versa","live.artblocks.io/ Home page of the site which returns the latest rendered minted token from any of the Art Blocks contracts","live.artblocks.io/{CONTRACT_ADDRESS} enter any Art Blocks or Engine contract and you be presented with the latest rendered mint.","Example: Latest Artblocks_VO mint","live.artblocks.io/{CONTRACT_ADDRESS}/{PROJECT_INDEX} enter any Art Blocks or Engine contract followed by the index of the project and you be presented with the latest rendered mint.","Example: Latest Chromie Squiggle mint","live.artblocks.io/token/{TOKEN_ID} enter any Art Blocks or Engine token id and you are presented with that token.","Example: Chromie Squiggle mint #71","live.artblocks.io/random/{CONTRACT_ADDRESS} enter any Art Blocks or Engine contract address and you are presented with a random active project","Example: Random Art Blocks v3 contract","live.artblocks.io/random/{CONTRACT_ADDRESS}/{PROJECT_INDEX} enter any Art Blocks or Engine contract address and a project index you are presented with a random token from that project","Example: Random Chromie Squiggles"]},{"l":"Random Query Params","p":["You can add any query params from the customizable display listed below as well as two random specific query params.","reloadClick: this is to turn on click reloading where if you click the token it will give you a new token from that project. default: false","reloadDelay: this is to turn on auto refreshing after the specified time in seconds to give you a new token from that project. default: none","Example URLs:","Click turned on","Delay of 30 seconds and click turned on","Delay of 30 seconds with no click"]},{"l":"Contracts","p":["This is a running list of contract addresses for various Art Blocks and Engine","Mainnet:","Artblocks_VO: 0x059edd72cd353df5106d2b9cc5ab83a52287ac3a","Artblocks_V1: 0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270","ARTCODE: 0xd10e3dee203579fcee90ed7d0bdd8086f7e53beb","Doodle Labs: 0x28f2d3805652fb5d359486dffb7d08320d403240","CryptoCitizens: 0xbdde08bd57e5c9fd563ee7ac61618cb2ecdc0ce0","Flutter: 0x13aae6f9599880edbb7d144bb13f1212cee99533","MOMENT: 0x0a1bbd57033f57e7b6743621b79fcb9eb2ce3676","Plottables: 0xa319c382a702682129fcbf55d514e61a16f97f9c","TBOA: 0x62e37f664b5945629b6549a87f8e10ed0b6d923b"]},{"l":"Customizable Display","p":["A Plottables project (full screen)","Algobots (with text)","All of the customization that can be done and the default values are as follows:","backgroundColor: this can be any six digit hex color and is the background color of the page default: ffffff","Example URLs:","fontSize: this can be any valid html size and is the size of the text default: 20px","height: this can be any valid html size and is the height of the token being displayed default: 90vh","Latest Artblocks Mint","Latest Chimera","showText: this is whether or not to show the text information about the currently displayed token. All other text params depend on this to be true to work default: false","Streamlines #414","textBackground: this can be any six digit hex color and is the background color of the text default: none","textBottom: this can be any valid html size and is the distance from the bottom of the screen of the text default: 3em","textColor: this can be any six digit hex color and is the color of the text default: 000000","useCusomtomViewParams: this is to specify you are using the custom view display and all other params require this to be true. default: false","width: this can be any valid html size and is the width of the token being displayed default: 90vw","You can create a customizable display for any route on artblocks-viewer. This is done through query params added to the end of the url. In order to activate this ability you must first add ?useCustomViewParams=true to the end of the whatever route you are using. Here is the most basic customized url of Chromie Squiggle mint #71 with just the squiggle centered in the middle of the page."]}],[{"l":"Querying","p":["Below are some sample queries you can use to gather information from the Art Blocks contracts.","You can build your own queries using a GraphQL Explorer and enter your endpoint to limit the data to exactly what you need."]},{"l":"Subgraph Querying Walkthrough","p":["The following provides some examples on how to use the Art Blocks subgraph to perform a handful of common queries."]},{"l":"Important Notes","p":["Performance/indexing on the hosted subgraph service is oftentimes slower compared to the decentralized subgraph. That being said, the hosted subgraph is free while the decentralized one requires pay-per-query in GRT.","The Art Blocks subgraphs currently also index any PBAB (Powered by Artblocks) contracts, in addition to the core Art Blocks contracts. Please keep that in mind and make use of the contract_in filter to ensure you are working with Art Blocks data only, if that is your intention.","While querying against the mainnet subgraph if using the contract_in filter the Art Blocks contracts to restrict for are 0x059edd72cd353df5106d2b9cc5ab83a52287ac3a(for the V0 contract that supports projects 0-3) and 0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270(for the V1 contract that supports projects 4-current).","The Art Blocks contract to restrict for is 0xda62f67be7194775a75be91cbf9feedcc5776d4b on testnet."]},{"l":"The Basics","p":["Retrieving a specific Art Blocks project by short ID (no contract):","Retrieving a specific Art Blocks project by full ID (includes contract):","Retrieving a specific Art Blocks token by short ID (no contract):","Retrieving a specific Art Blocks token by full ID (includes contract):"]},{"l":"Beyond The Basics","p":["Retrieve the last 5 most recently created projects across Art Blocks and Powered by Art Blocks (remember that you can use a contract_in filter to restrict this to only specific contracts):","Retrieve the top 10 projects across Art Blocks and Powered by Art Blocks, based on # of invocations:","Retrieve the most recently minted Art Blocks token:","Retrieve all tokens owned by a specific address, across Art Blocks and Powered by Art Blocks:","Retrieve the general metadata/status for the Art Blocks subgraph (useful for debugging):","Retrieve the project script for a given project id","Pagination should be used for large queries. The Graph enforces upper limits on first and skip parameters since they generally perform poorly when set to large values (limits as of 01/2022 are first=1000 and skip=5000). It is much better to page through entities based on an attribute such as token ID, block number, or some other parameter. For more information, see The Graph documentation"]},{"l":"Project info","p":["Pull all projects and return their name, as well as lots of additional data:","Get all the wallet owners of a project (Replace PROJECT with the project name you are looking for)","If you're looking for the addresses of anyone that owns a mint from a project","Get that txnhash for squiggle 0, you could run the following query on the AB subgraph playground"]}],[{"l":"Entities","p":["Account","AccountProject","Contract","CoreRegistry","Dependency","DependencyAdditionalCDN","DependencyAdditionalRepository","DependencyRegistry","DependencyScript","Minter","MinterFilter","MinterFilterContractAllowlist","Project","ProjectExternalAssetDependency","ProjectMinterConfiguration","ProjectScript","ProposedArtistAddressesAndSplit","Receipt","Token","Transfer","Whitelisting"]},{"l":"Project","p":["A project is complete when it has reached its maximum invocations","Account!","AccountProject!","Accounts that own tokens of the project","activatedAt","active","additionalPayee","additionalPayeePercentage","additionalPayeeSecondarySalesAddress","additionalPayeeSecondarySalesPercentage","Address to split primary sales with the artist","Address to split Secondary sales with the artist","artist","Artist description of the project","Artist name","Artist or project website","Artist that created the project","Artist/additional payee royalty percentage","artistAddress","artistName","Aspect ratio of the project (see scriptJSON if null)","aspectRatio","baseIpfsUri","baseUri","BigInt","BigInt!","Boolean","Boolean!","Bytes","Bytes!","complete","completedAt","contract","Contract associated to project","Contract!","createdAt","Curated, playground, factory. A project with no curation status is considered factory","curationStatus","Currency symbol for ERC-20","currencyAddress","currencySymbol","Description","Description: get various details about a specific project","Determines if the project should be visible to the public","Does the project actually use the hash string","Does the project use media from ipfs","dynamic","ERC-20 contract address if the project is purchasable via ERC-20","externalAssetDependencies","externalAssetDependenciesLocked","externalAssetDependencyCount","Extra information about the script and rendering options","Field","For V3 and-on, this field is null, and projects lock 4 weeks after completedAt. Once the project is locked its script may never be updated again","id","ID of the project on the contract","ID!","Interplanetary File System function that meets the encrypted demands needed to solve for a blockchain computation","invocations","ipfsHash","Is the project dynamic or a static image","license","License for the project","locked","Lookup table to get the Sale history of the project","Maximum number of invocations allowed for the project","maxInvocations","Minter configuration for this project (not implemented prior to minter filters)","minterConfiguration","name","Number of times the project has been invoked - number of tokens of the project","Once the project's external asset dependencies are locked they may never be modified again","owners","Parts of the project script","paused","Percentage of artist's share of primary sales that goes to additional payee","Percentage of artist's share of secondary sales that goes to additional payee","pricePerTokenInWei","Project name","Project!","ProjectExternalAssetDependency!","projectId","ProjectMinterConfiguration","Projects external asset dependencies","Proposed Artist addresses and payment split percentages","ProposedArtistAddressesAndSplit","proposedArtistAddressesAndSplits","Purchases paused","royaltyPercentage","SaleLookupTable!","saleLookupTables","script","Script type and version (see scriptJSON if null)","scriptCount","scriptJSON","scripts","scriptTypeAndVersion","scriptUpdatedAt","String","The base URI is the mutual part among each NFT's URI. By default, the URI is baseURI/tokenId","The full script composed of scripts","The number of external asset dependencies stored on-chain","The number of scripts stored on-chain","Timestamp at which a project was completed","Token!","tokens","Tokens of the project","Type","Uniform Resource Identifier Interplanetary File System (IPFS) of of a nonfungible token","Unique identifier made up of contract address and project id","updatedAt","useHashString","useIpfs","Wallet address of the artist","website","Wei is the smallest denomination of ether—the cryptocurrency coin used on the Ethereum network. One ether = 1,000,000,000,000,000,000 wei (1018)","WHen project activated","When project inititated","When project updated","when the script was updated"]},{"l":"ProjectScript","p":["BigInt!","Description","Description: get specific details of the project script","Field","id","ID!","index","Name of project","project","Project!","script","Script of the project","String!","The dependency index","Type","Unique identifier made up of contract address and project id"]},{"l":"ProposedArtistAddressesAndSplit","p":["additionalPayeePrimarySalesAddress","additionalPayeePrimarySalesPercentage","additionalPayeeSecondarySalesAddress","additionalPayeeSecondarySalesPercentage","artistAddress","BigInt!","Bytes!","createdAt","Description","Description: get specific details on the pay flow for a specified artist","Field","id","ID!","project","Project associated with this proposed artist addresses and splits","Project!","Proposed artist additional payee address for primary sales","Proposed artist additional payee address for secondary sales","Proposed artist additional payee percentage for primary sales","Proposed artist additional payee percentage for secondary sales","Proposed artist address","Type","Unique identifier made up of contract address and project id","When address initiated"]},{"l":"CoreRegistry","p":["Description: Get specific details on the Art Blocks Core registry. At this time, this is used for indexing purposes of V3 contracts, as well as acting as an allowlist of core contracts that may mint on a shared minter filter.","Field","Type","Description","id","ID!","Unique identifier made up of the Core Registry's contract address. note: for legacy MinterFilters, this is a dummy ID, equal to the address of the single core contract associated with the minter filter","registeredContracts","[Contract!]","All core contracts that are registered on this CoreRegistry, when this is most recent Core Registry to add the contract"]},{"l":"Contract","p":["[Bytes!]!","Accounts whitelisted on the contract","Address that receives primary sales platform fees","Address that receives primary sales platform fees, only for V3_Engine contracts","Address that receives secondary sales platform royalties (null for pre-V3 contracts, check Royalty Registry)","Address that receives secondary sales platform royalties, only for V3_Engine contracts","Associated minter filter (if applicable)","autoApproveArtistSplitProposals","Automatically approve all artist split proposals (used on V3 Engine contracts)","Basis points of secondary sales allocated to the platform (null for pre-V3 contracts, check Royalty Registry)","Basis points of secondary sales allocated to the platform, only for V3_Engine contracts","BigInt","BigInt!","Boolean","Boolean!","Bytes","Bytes!","Core contract type","CoreType!","createdAt","Curation registry contract address","curationRegistry","Dependency registry contract address","dependencyRegistry","Description","Description: get specific information about contracts","enginePlatformProviderAddress","enginePlatformProviderPercentage","enginePlatformProviderSecondarySalesAddress","enginePlatformProviderSecondarySalesBPS","EngineRegistry","Field","id","ID!","Latest engine registry that this contract is registered with, if any (used for indexing purposes)","List of contracts that are allowed to mint","List of projects on the contract","List of tokens on the contract","minterFilter","mintWhitelisted","New projects forbidden (can only be true on V3+ contracts)","newProjectsForbidden","nextProjectId","Percentage of primary sales allocated to the platform","Percentage of primary sales allocated to the platform, only for V3_Engine contracts","preferredArweaveGateway","preferredIPFSGateway","Project ID listed on the contract","Project!","projects","Randomizer contract used to generate token hashes","randomizerContract","registeredOn","renderProviderAddress","renderProviderPercentage","renderProviderSecondarySalesAddress","renderProviderSecondarySalesBPS","String","The Engine Flex contract allows you to specify preferred gateways for the currently supported dependency types (IPFS & Arweave)","Token!","tokens","Type","Unique identifier made up of contract address","updatedAt","When contract initiated","When contract updated","whitelisted","Whitelisting!"]},{"l":"Whitelisting","p":["Description: get whitelist information","Field","Type","Description","id","ID!","Unique identifier whitelist account id","account","Account!","Account associated to whitelisting","contract","Contract!","contract associated to whitelisting"]},{"l":"Account","p":["AccountProject!","Contracts the account is whitelisted on","Description","Description: get specific information about an account","Field","id","ID!","Project!","Projects the account is listed as artist for","Projects the account owns tokens from","projectsCreated","projectsOwned","Token!","tokens","Tokens the account has","Type","Unique identifier account id","whitelistedOn","Whitelisting!"]},{"l":"AccountProject","p":["account","Account associated to project","Account!","count","Description","Description: get project account information","Field","id","ID!","Int!","Name of project","project","Project!","Total count of the project","Type","Unique identifier token id"]},{"l":"Token","p":["Account!","BigInt!","Bytes!","contract","Contract the token is on","Contract!","createdAt","Current owner of the token","Description","Description: get various token information","Field","hash","id","ID of the token on the contract","ID!","invocation","Invocation number of the project","Lookup table to get the Sale history","Next available sale id","nextSaleId","owner","project","Project of the token","Project!","SaleLookupTable!","saleLookupTables","Specifies the endpoint for retrieving access tokens when OAuth 2.0 authentication is enabled","String","tokenId","Transaction hash of token mint","transactionHash","Transfer!","transfers","Transfers of the token","Type","Unique identifier made up of contract address and token id","Unique string used as input to the tokens project script","updatedAt","uri","When token initiated","When token updated"]},{"l":"MinterFilter","p":["[Minter!]!","[MinterFilterContractAllowlist!]!","BigInt!","Core contract registry used by this MinterFilter. Note: For MinterFilter V0 and V1, a dummy CoreRegistry is used","coreRegistry","CoreRegistry!","Description","Description: get details about minters on a project","Field","id","ID!","Known minters that are tied to this MinterFilter, but are not necessarily approved on this MinterFilter","knownMinters","Minter!","minterFilterContractAllowlists","minterGlobalAllowlist","Minters allowlisted at a contract-level on this MinterFilter","Minters allowlisted globally on this MinterFilter","Type","Unique identifier made up of minter contract address","updatedAt","When minter updated"]},{"l":"MinterFilterContractAllowlist","p":["[Minter!]!","BigInt!","contract","Contract!","Core contract","Description","Description: Defines a contract-specific allowlist of minters specifically approved on a given shared minter filter. This is used to extend the set of allowlisted minters beyond a shared minter filter's set of globally allowlisted minters.","Field","id","ID!","Minter contract addresses allowed at the contract level (extending global MinterFilter allowlist)","minterContractAllowlist","minterFilter","MinterFilter contract","MinterFilter!","Type","Unique identifier made up of -","updatedAt","When last updated"]},{"l":"Minter","p":["[Receipt!]","Associated Minter Filter","BigInt!","Boolean representing if the Minter is globally allowed on its associated minter filter","Boolean!","Configuration details used by specific minters (json string)","Description","Description: get details about mint on a project","extraMinterDetails","Field","id","ID!","isGloballyAllowlistedOnMinterFilter","Minter type","minterFilter","MinterFilter!","MinterType!","receipts","Receipts for this minter, only for minters with settlement","String!","Type","Unique identifier made up of minter contract address","updatedAt","When the minter updated"]},{"l":"ProjectMinterConfiguration","p":["basePrice","BigInt","Boolean!","Bytes!","Configuration details used by specific minter project configurations (json string)","currency address as defined on minter - address(0) reserved for ether","currency symbol as defined on minter - ETH reserved for ether","currencyAddress","currencySymbol","Defines if purchasing token to another is allowed","Description","Description: get details of a specific mint","extraMinterDetails","Field","id","ID!","Maximum number of invocations allowed for the project (on the minter)","maxInvocations","minter","Minter!","price of token or resting price of Duch auction, in wei","priceIsConfigured","project","Project!","purchaseToDisabled","String!","The associated minter","The associated project","true if project's token price has been configured on minter","Type","Unique identifier made up of --"]},{"l":"Receipt","p":["account","Account!","BigInt!","Description","Description: get details about purchases on a minter with settlement","Field","id","ID!","Last updated timestamp","minter","Minter!","netPosted","numPurchased","project","Project!","The associated account","The associated minter","The associated project","The total net amount posted (set to settlement contract) for tokens","The total quantity of tokens purchased on the project","Type","Unique identifier made up of ---","updatedAt"]},{"l":"Transfer","p":["address transferred from","address transferred to","BigInt!","Bytes!","createdAt","Description","Description: transfer info on an NFT","Field","from","id","ID!","to","token","token address of NFT","Token!","transaction hash of transfer","transactionHash","Type","Unique identifier of transfer","when transfer initiated"]},{"l":"ProjectExternalAssetDependency","p":["BigInt!","cid","dependencyType","Description","Description: get info about projects external asset dependency","Field","id","ID!","index","project","Project!","ProjectExternalAssetDependencyType!","String!","The associated project","The dependency cid","The dependency index","The dependency type","Type","Unique identifier made up of projectId-index"]},{"l":"Dependency","p":["[DependencyAdditionalCDN!]!","[DependencyAdditionalRepository!]!","[DependencyScript!]!","Additional CDNs for this dependency","Additional repositories for this dependency","additionalCDNCount","additionalCDNs","additionalRepositories","additionalRepositoryCount","BigInt!","Concatenated string of all scripts for this dependency","Dependency registry contract that this dependency is registered on","dependencyRegistry","DependencyRegistry!","Description","Description: information about registered dependency (e.g. p5js@1.0.0)","Field","id","ID!","List of on-chain scripts that for this dependency","Number of additional CDNs for this dependency","Number of additional repositories for this dependency","Number of on-chain scripts for this dependency","Preferred CDN for this dependency","Preferred repository for this dependency","preferredCDN","preferredRepository","Reference website for this dependency (e.g. https://p5js.org)","referenceWebsite","script","scriptCount","scripts","String","String!","Timestamp of last update","Type","Unique identifier made up of dependency name and version separated by an @ symbol (e.g. p5js@1.0.0)","updatedAt"]},{"l":"DependencyRegistry","p":["[Contract!]!","[Dependency!]","BigInt!","Bytes!","Core contracts that this registry can provide dependency overrides for","Current owner of this contract","dependencies","Description","Description: information about a dependency registry contract","Field","id","List of dependencies that are registered on this registry contract","owner","supportedCoreContracts","Timestamp of last update","Type","Unique identifier made up of dependency registry contract address","updatedAt"]},{"l":"DependencyAdditionalCDN","p":["BigInt!","cdn","dependency","Dependency this additional CDN belongs to","Dependency!","Description","Description: information about an additional CDN for a dependency","Field","id","ID!","index","Index of this additional CDN","String!","Type","Unique identifier made up of dependency id and index","URL of the CDN"]},{"l":"DependencyAdditionalRepository","p":["BigInt!","dependency","Dependency this additional repository belongs to","Dependency!","Description","Description: information about an additional repository for a dependency","Field","id","ID!","index","Index of this additional repository","repository","String!","Type","Unique identifier made up of dependency id and index","URL of the repository"]},{"l":"DependencyScript","p":["address","Address of the bytecode storage contract for this script","BigInt!","Bytes!","Contents of script","dependency","Dependency this script belongs to","Dependency!","Description","Description: information about a script for a dependency","Field","id","ID!","index","Index of this script","script","String!","Type","Unique identifier made up of dependency id and index"]}]]
\ No newline at end of file
+[[{"i":"welcome-to-the-art-blocks-docs","l":"Welcome to the Art Blocks Docs!","p":["This documentation seeks to provide guidance for 3 primary audiences:","artists/creators preparing their projects to launch on Art Blocks or an Art Blocks Engine platform","current and prospective Engine partners","integrators/aggregators/marketplaces etc., looking to integrate with the Art Blocks APIs","You will find the three main sections in our documentation mirrors these three primary audiences. Please explore the docs here, and let us know if you have any questions.","For any issues with the docs, please file a bug here, or send us a PR with a suggested change!","GitPOAPs"]}],[{"i":"#","p":["An overview of different NFT metadata storage mechanisms used by Art Blocks NFTs."]},{"l":"NFT Metadata Storage at Art Blocks","p":["An overview of NFT metadata storage philosophy and implementations at Art Blocks."]},{"l":"Summary","p":["Art Blocks tokens store their metadata fully on-chain, ensuring collectors that their NFTs will always remain accessible and immutable.","For projects that require dependencies (e.g. p5js), Art Blocks provides the Art Blocks Dependency Registry, a fully on-chain software registry that can be used to optionally store dependency releases on-chain, as well as reference preferred software storage networks.","Art Blocks Engine Flex NFTs also provide the option to store metadata on decentralized storage networks, such as IPFS or Arweave, to enable larger sized assets to be used when generating outputs."]},{"l":"Overview of NFT Metadata Storage Options","p":["~ Yes","~ Yes ","Cost","Decentralized","Decentralized Storage Network","Fully On-Chain","Guaranteed to Persist Forever ","Hash On-Chain","High","Immutable","Low","Medium","No","No ","No, Very Low Risk","Servers/Hosting","Software Registry","Storage Type","While all NFTs track token ownership on a blockchain, the metadata for the NFT (image or audio information, artist information, etc.) may be stored in a variety of ways. Common options include:","Yes"]},{"i":"servershosting","l":"Servers/Hosting","p":["The metadata are stored on a server or cloud hosting service, such as AWS. This is a convenient and cheap option, but it has a few drawbacks:","The metadata can be changed by the server owner, so the NFT is not immutable.","The metadata can be lost if the server goes down or an admin decides not to discontinue paying for the service.","The metadata can be censored by the server owner."]},{"l":"Hash On-Chain","p":["The hash of the metadata is stored on-chain, and the metadata are stored on a server. Storing the hash of the metadata makes the NFT immutable, while keeping it much cheaper than storing all of the metadata on-chain. However, it has a few drawbacks:","The metadata can be lost if the server goes down or an admin decides not to discontinue paying for the service.","The metadata can be censored by the server owner.","Projects such as CryptoPunks originally stored the hash of the metadata on-chain, but the metadata were stored on a server. They have since upgraded to a fully on-chain solution."]},{"l":"Decentralized Storage Network","p":["The metadata are stored on a decentralized storage network, such as IPFS or Arweave. This is a popular option, and enables the NFT to be immutable. Drawbacks include:","The metadata must remain pinned by at least one party in order to be accessible."]},{"l":"Fully On-Chain","p":["The metadata are stored on the blockchain. This is the most expensive option, but it has many advantages. The metadata are always accessible and available, as long as the NFT exists. Collectors and artists never have to worry about a token's outputs disappearing."]},{"l":"Software Registries","p":["Some NFTs (like some Art Blocks project tokens) may rely on published software libraries when generating outputs. In these cases, the NFT metadata may include information about dependencies and where to find them (e.g. \"p5js, v1.0.0 on the cdnjs software registry\"). Software registries are a special form of decentralized storage, because of the distributed nature of the software repositories and many downloads on developers' computers worldwide."]},{"l":"Art Blocks Storage Solutions"},{"l":"Art Blocks Fully On-Chain","p":["Art Blocks Flagship and Art Blocks Engine NFTs only rely on fully on-chain storage solutions, plus allowing a single dependency to be housed on a software registry. This provides an extremely high level of confidence that the NFTs will remain fully accessible and immutable for the foreseeable future.","While Art Blocks originally relied on widly used software registries to house dependencies, the Art Blocks team has since created a fully on-chain software registry called the Art Blocks Dependency Registry. The registry is fully decentralized and is used by all Art Blocks Flagship NFTs. The registry enables dependencies to be stored fully on-chain, when the gas costs are justified. Art Blocks uploaded their first dependency, p5js v1.0.0, to the registry in January 2024, retiring any doubt that projects relying on p5js@1.0.0 would ever be unable to generate their outputs in the future."]},{"l":"Engine Flex","p":["Art Blocks Engine Flex NFTs provide an additional option for storing metadata. Flex NFTs can store metadata on-chain, or they can store the metadata immutably on the IPFS or Arweave decentralized storage networks. This allows Flex NFTs to utilize larger sized assets when generating outputs, while still providing the option for fully on-chain metadata where possible."]},{"l":"Examples"},{"l":"On-Chain Script Example","p":["Let's review an example of how to retrieve the token and script metadata for the first Art Blocks Token, token zero of project 0, Chromie Squiggle by Snowfro.","Note: Newer versions of Art Blocks core contracts have different function names than the V0 Art Blocks core contract shown in this example.","While we could query the Art Blocks Subgraph or API to retrieve the metadata, we will retrieve the metadata directly from the blockchain.","Visit the original Art Blocks Core Contract on Etherscan: 0x059EDD72Cd353dF5106D2B9cC5ab83a52287aC3a","Get project 0's metadata by calling the projectDetails function with the project ID as the input parameter:","projectDetails","Get project 0's script details by calling the projectScriptInfo function with the project ID as the input parameter:","scriptDetails","Get the script javascript by calling the projectScriptByIndex function with the project ID and index 0 as the input parameter. The returned text is the javascript code that is used to generate Chromie Squiggles!","scriptByIndex","Get token 0's token hash by calling the showTokenHashes function with the token ID as the input parameter. This is the hash that is injected into the script to generate the token's unique output.","tokenHash"]},{"l":"On-Chain Dependency Example","p":["Let's review an example of how to retrieve the dependency metadata for the first Art Blocks Token, token zero of project 0, Chromie Squiggle by Snowfro.","In this case, the project uses the p5js v1.0.0 dependency, which is stored fully on-chain via the Art Blocks Dependency Registry. While we could query the Art Blocks Subgraph or API to retrieve the metadata, we will retrieve the metadata directly from the blockchain.","Visit the Art Blocks Dependency Registry on Etherscan: 0x37861f95882ACDba2cCD84F5bFc4598e2ECDDdAF","Get the dependency details by calling the getDependencyDetails function with the dependency name and version as the input parameters. At this time, we translate from the string p5@1.0.0 to its bytes representation 0x703540312e302e30:","dependencyDetails","Get the dependency code by calling the getDependencyScript function with the dependency name and version as the input parameters. We again translate to the bytes representation 0x703540312e302e30, and can increment the index to get all 10 chunks of the dependency code:","dependencyScript","And that's it! We now have all of the information we need to generate the token's output, and we can be confident that the metadata will always be available and immutable!","Note: At this time, dependency scripts are stored compressed via gzip on-chain. Updates are planned to store code that can unzip the dependencies.","As long as the blockchain network continues to exist.","Requires ≥1 interested party","Typically hash of release is published to prevent tampering/changes"]}],[{"l":"Art Blocks Engine 101","p":["** Note: ** It is possible to use multisig wallets if our client's front-end properly populates access lists in their front end, but minting from Etherscan will not work.","8.** Repeat steps 2-7 for mainnet deployment.**","A high-level process map for Art Blocks Engine onboarding.","After testnet deployment, there are two steps that may proceed in parallel.","After the above has all been performed, you should run through the following \"pre-flight\" checklist and ensure there are no loose threads:","After the complete end-to-end integration has been vetted on testnet, the above process may proceed on mainnet.","After the terms of engagement are finalized, you’ll sign the Engine service and setup agreement.","After you've set up and tested an Engine project, you can request a script audit from Art Blocks to guarantee resolution-agnosticism and determinism.","An ETA for this infrastructure integration piece will be given at the time of testnet contract deployment. On average, this will take 1 week from the time of testnet deployment.","Art Blocks will need to integrate your newly deployed testnet smart contracts with our rendering infrastructure on testnet. After that, your team will connect to the staging site https://artist-staging.artblocks.io and interact with projects on the testing network you created as if they were on Art Blocks.","Art Blocks' will deploy a set of testnet smart contracts for your team to begin integrating with.","artist website","Create a new mainnet project shell on your smart contract using addProject, and upload all project details and project script using the artist interface at https://artblocks.io.","Deploy mainnet contracts.","etc.","If a 0% margin is used during a live NFT sale, the blockchain state will likely change between a user-submitted transaction and when it's mined. Therefore, small changes in the required Gas Limit will likely result in transaction failures if the gas necessary increases.","If accepting ETH, check that the wallets are not multisig wallets like Gnosis Safe (check the minter owner, rendering provider, artist, and any additional payee).","If actions of changing max invocations are expected, test those actions.","If actions of whitelisting/removing minters are expected, test those actions.","If you need help, the Art Blocks team will help guide you through the process.","Important for mainnet: Test-mint a token in each currency that will be accepted for a project. Verify that your front end is used to successfully mint using each currency to ensure a proper end-to-end test.","In summary, mainnet deployment entails:","Integrate mainnet contracts with Art Blocks' rendering and API infrastructure.","Interested in learning about an Art Blocks Engine partnership? Email engine@artblocks.io to get the conversation started!","Mint at least one piece (mint #0) in a controlled environment on mainnet, being sure to mint in each format you plan to for your open release.","project description","Provide the following information to Art Blocks for your Engine project: 1 The admin address to own these contracts. This address controls the core contract and the minter contract. 2 The name of tokens from your contract (e.g. for Art Blocks it is \"Art Blocks\" https://etherscan.io/address/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270#code). 3 The ticker for tokens from your contract (e.g. for Art Blocks it is \"BLOCKS\" https://etherscan.io/address/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270#code).","the license associated with outputs","To create a new project shell, you should use the addProject method of your newly deployed Engine Core Contract. This can be done by connecting to the contract via Etherscan.","Update your mainnet website to reference deployed mainnet contracts.","Vetting includes minting in (1) each minting format, (2) from the Engine partner's frontend minting experience, and (3) while integrated with the Art Blocks' provided rendering infrastructure.","Warning: if you opt-out of this step, it may result in undiagnosed issues with the rendered outputs. An unaudited project may not conform to the Art Blocks resolution-agnostic and deterministic standards. This means outputs may differ between screen sizes, devices, and operating systems or could be different from view to view.","When using your front-end to mint, ensure at least a 10% margin is added to each transaction's estimated Gas Limit, as originated by your frontend logic.","You are now ready to sync with the Art Blocks team on planning for a launch date, which is at least 1 week from when the above steps have all been completed.","Your team can integrate your front end to allow for minting via your new Engine smart contract (using deployed Engine smart contracts).","Your team will integrate a custom web frontend with your deployed Engine smart contracts (e.g., implementing their own purchase + display flow) and with the Art Blocks API as needed. An example of frontend purchase flow logic is provided here as a reference for integrating partners:","Your team will use https://artist-staging.artblocks.io site to upload your project script source code and configure all project metadata details:"]}],[{"i":"what-is-art-blocks-engine-and-engine-flex","l":"What is Art Blocks Engine and Engine Flex?","p":["Art Blocks Engine and Engine Flex are custom branded solutions from Art Blocks. Our offerings allow the generative NFT minting technology used by artists at Art Blocks to be integrated with third-party sites.","Engine allows partners to release generative outputs using our existing smart contracts and rendering infrastructure resulting in turnkey and branded generative projects. Engine partners own their smart contracts and can use them to release as many projects as they like as often as they like.","We currently partner with organizations from every sector that are interested in launching generative collections, but are particularly interested in the fashion, sports, media, manufacturing, and fine art industries.","For more information on Art Blocks Engine partnerships please contact: info@artblocks.io"]},{"i":"what-is-the-difference-between-art-blocks-engine-and-engine-flex","l":"What is the difference between Art Blocks Engine and Engine Flex?","p":["Art Blocks Engine is our offering that aligns most closely with the Art Blocks flagship product ( https://artblocks.io), and has the same technical approach to on-chain art where artists store the entirety of their generative algorithms on-chain within the Engine smart contract and are limited to a single, widely-distributed, off-chain dependency (e.g. p5js).","With Art Blocks Engine Flex artists are able to include off-chain assets, stored on the decentralized storage solutions of IPFS or Arweave, as additional inputs into their creative coding practice. This allows, for example, a project that takes an image as an input and creates 1of1ofX outputs applying a generative practice to this input image. This final output combines a generative script, a token hash, and additional off-chain assets."]},{"i":"how-does-art-blocks-engine-flex-work","l":"How does Art Blocks Engine Flex work?","p":["With Art Blocks Engine Flex contracts, a per-project (as opposed to per-contract) field is available on all projects that allows an artist to set a single off-chain dependency or set of multiple off-chain dependencies based on the content ID locations where these dependencies are stored on IPFS or Arweave.","Currently, we do not yet support the turnkey ability to programically upload/pin these dependencies to IPFS/Arweave within the Engine experience directly; however, our team is more than happy to assist partners in the process of uploading/pinning assets on IPFS/Arweave using existing third party solutions for doing so (e.g. Pinata in the case of IPFS).","Note that for a single project, it is possible to have a single off-chain dependency (e.g. a single image file) or a set of off-chain dependencies (e.g. a series of images from a set). This means that is possible, for example, to have a project that creates 1of1ofX generative variants of a single base image asset, or one in which for a given token a random image is selected from the base image asset set, and then a generative process is applied to it.","It is also important to note that images are not the only supported external asset dependency type. It is possible to reference any file type that can be pinned/uploaded to IPFS or Arweave and intelligbly incorporated into a generative algorithm to create interesting artistic outputs. For example, a project could use tensorflow.js as its single-depedency, have its generative script be a tensorflow based creative coding algorithm, and store the model file for the machine learning model on IPFS or Arweave to support a ML/AI based project."]},{"i":"what-is-the-smart-contract-architecture-for-art-blocks-engine","l":"What is the smart contract architecture for Art Blocks Engine?","p":["The Art Blocks Engine offers two core contract options: the V3 Engine core contract and the V3 Engine Flex core contract. These contracts are mutually exclusive, and partners should select the appropriate core contract based on their needs and whether they require the flex capabilities.","The V3 Engine core contract is an ERC-721 NFT contract that manages metadata for all Art Blocks NFTs, including artist scripts, token hashes, and token royalty data.","The V3 Engine Flex core contract includes everything in the V3 Engine contract, but also allows artists to use external assets in their Engine tokens. These external assets can be images, videos, audio, or other data and may be stored on decentralized storage systems such as IPFS, Arweave, or on the Ethereum blockchain","Both core contracts integrate with various peripheral contracts to provide flexible, customizable, and extensible functionality. These peripheral contracts are:","Admin Access Control List (ACL) contract: Manages granting admin access to the core contract and related contracts. It is designed to be highly flexible, extensible, and upgradable.","Randomizer contract: Generates pseudo-random numbers for the core contract when new tokens are minted. This architecture is designed to be highly flexible, enabling designs that may desire asynchronous random number generation or other hash generation methods.","Core Registry contract: Notifies the subgraph indexing service of new Art Blocks Engine tokens. When the Core Registry emits an event, the subgraph indexing service is notified, and the Engine contract is indexed and made available for querying on the Art Blocks subgraph. It also notifies a shared minter suite to allow the new Engine contract to be used by minters.","Minter Suite contracts: A collection of contracts used to mint Art Blocks Engine tokens. The Minter Suite is designed to be highly flexible and can be used to mint tokens in various ways.","Partners should choose between the V3 Engine core contract and the V3 Engine Flex core contract based on their project's goals and technical capabilities. The smart contract architecture for Art Blocks Engine provides a robust and flexible system for managing and creating generative NFTs while integrating with various peripheral contracts to extend its capabilities.","For additional context, please check out this architecture overview (with accompanying diagrams)."]},{"i":"what-is-the-minter-suite","l":"What is the \"minter suite\"?","p":["A summary of the division of responsibilities between the MinterFilter and individual Minters can be summarized as:","Assigns a specific minter to each project, which can be updated by the project's artist or the platform's Admin ACL.","Checks if the minter is the assigned minter for a project before allowing the token to be minted.","Checks that a project is on a registered Art Blocks Engine contract before allowing a minter to be assigned.","Defines price information for tokens in a project, including token price in wei, currency symbol, and currency address.","For additional context, please check out this architecture overview (with accompanying diagrams).","Handles the token purchase process through the \"purchase\" and \"purchaseTo\" functions for specific projects.","Legacy Minter Suite","Maintains a list of approved minters that can mint tokens for projects on the platform.","Managed the maximum number of invocations (for the given minter) for each project.","MinterFilter:","Minters:","Provides information about the minter type and associated core contract and MinterFilter addresses.","Shared Minter Suite","The Art Blocks minter suite is a collection of smart contracts that facilitate the secure and efficient minting of generative art tokens for all Art Blocks contracts in the V3 architecture. Originally, each contract had its own minter suite. The new shared minter suite enables Engine contracts use the same minting contracts as Art Blocks Flagship, which enables a seamless experience for collectors and artists.","The legacy minter suite is very similar to the new, shared minter suite, except that each minter filter and minter contract is connected to a single core contract. The general roles and responsibilities of the Minter Filter and Minter contracts are the same, except that they limit minting to a single core contract instead of a set of allowlisted core contracts.","tl;dr: The MinterFilter serves as a control layer that ensures the correct minter is used for each project, while Minters handle token purchase processes and project-specific settings. This division of responsibilities enables a secure, efficient, and flexible set of contracts that we call the \"minter suite\"."]},{"i":"what-is-generative-art","l":"What is generative art?","p":["Generative art is about developing systems that define rules for creating art. By introducing randomness to those systems, core concepts are expressed through unique outputs. In a contemporary sense, this means writing computer algorithms to define the system and introduce randomness, which allows for conceptual exploration and rapid iteration.","Creative coders write scripts with specific parameters that introduce and explore features, which generate the final outputs in a collection. With Art Blocks’ generative minting technology, collectors participate in the creation of the art. No one knows exactly what a piece will look like before it's minted, not even the artist. Each NFT is generated at the time of purchase using the buyer’s unique transaction hash to create a ‘1 of 1 of X’, which adds an extra layer of magic as the creator and collector watch a project come alive.","The interesting part of modern generative art is that it involves working in series - often a large series. So instead of pursuing a single compelling work of art, a generative artist creates an algorithm capable of tens, hundreds, or thousands of compelling works of art. Which, when taken as a whole, expresses the range of possibilities contained in a single algorithm."]},{"i":"what-are-nfts","l":"What are NFTs?","p":["Nonfungible tokens (NFT) are unique digital assets stored on blockchain technology that can represent any digital or physical asset."]},{"l":"On-chain vs. off-chain","p":["Art Blocks Engine enables creators to immutably store their generative NFT directly on the Ethereum blockchain (on-chain) or reference an external library or asset (off-chain). For an off-chain implimentation, partners can reference external off-chain assets using decentralized storage solutions like IPFS.","Decentralized and fully on-chain content is the most durable digital asset available. Typically, a creative coder writes a generative script in JavaScript and stores it directly on the blockchain. As long as you have access to a computer, a web browser, and Ethereum’s public ledger, you’ll always be able to reproduce the NFT in its original form and track ownership since creation. An on-chain NFT inherits the provenance, security, and durability of Ethereum itself, making them the highest quality digital asset available.","So, if Art Blocks ever shut down, all on-chain work would still be accessible since it's stored on the decentralized Ethereum blockchain and able to be viewed, bought, sold, and transferred without involving Art Blocks at all.","In contrast, if we store generative algorithms on an Art Blocks-owned database, the NFTs would rely on Art Blocks to return the assets - and if we go offline, the assets would not be retrievable. Similarly, if a script is stored on-chain but uses data from off-chain sources, it's vulnerable to the host of that off-chain data going offline.","Off-chain NFTs rely on assets stored on external servers. There are many reasons to reference off-chain assets - data storage is expensive on Ethereum, and using external assets can reduce the cost of putting data on-chain. It also allows for interesting applications of generative art using external assets. However, if your NFT references external sources and those sources go offline, the NFT will only track ownership of unretrievable data.","For this reason, we only allow certain external libraries to be used in project scripts given their general recognition as extremely reliable file storage sources.","Art Blocks Engine offers on-chain and off-chain solutions with our generative NFT minting technology. Which one is right for you depends on your project’s goals and technical capabilities."]},{"l":"Creating durable digital assets","p":["Creating on-chain generative NFTs ensures your collectors can expect their digital assets to stay the same forever. But if you choose to launch a generative project with off-chain assets, there are ways to mitigate the risk of going off-line using technology like IPFS or Arweave. We’re happy to chat about the right Art Blocks Engine implementation for your next project."]},{"l":"Potential use-cases","p":["The landscape of on-demand generative content has plenty of room to experiment. Some of our current partners include artists, galleries, art houses, online publications, and game developers. If you’re exploring an interesting project, get in touch, and let’s build together.","Current and upcoming use cases:","Fashion","Premier Artists","Media / Tech / Consumer brands","Gaming","Sports","BYOP - build your own platform"]}],[{"l":"Engine Partner Onboarding Steps","p":["An overview of the steps required to onboard as an Art Blocks Engine partner."]},{"l":"1. Initial outreach","p":["Interested in using Art Blocks Engine to launch a generative content platform?","Reach out to info@artblocks.io to get started. We'll discuss your needs, explain what we offer in a partnership, and align expectations.","Timeline: typically 1-2 weeks"]},{"l":"2. Project scope","p":["The Art Blocks team will work with you to determine the scope of the Art Blocks Engine project.","Timeline: 1-2 weeks"]},{"l":"3. Contract agreement","p":["Once the project objectives and scope are agreed upon, you'll work with our operations team to sign our partnership agreement.","Timeline: 1 week"]},{"l":"4. Smart contract details","p":["To get started, you'll provide our team with:","An Ethereum wallet address (that you currently own and control) you'll use to manage your Art Blocks Engine smart contracts","The name you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"Art Blocks\")","The ticker symbol you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"BLOCKS\")","Deployment Type: V3 Engine or V3 Engine Flex","Minter Type: flat price eth only, set price custom erc20, merkle tree allowlist, holder-gated, linear DA, exponential DA, and exponential DA with settlement","Starting project ID # (>=0):","Set autoApproveArtistSplitProposals: true or false","Regarding \"autoApproveArtistSplitProposals\" - It needs to be set at deployment and cannot be changed later.","tldr - if true, artist royalty wallet changes are auto-approved. If false, the contract admin will need to approve the artist's royalty wallet changes. This is an added check to ensure your artists aren't changing royalty wallets to a random address, which could complicate accounting/ OFAC compliance.","Note: We cannot deploy your contract until you provide the above information. The name and symbol tied to your contract cannot change once it’s deployed._","Timeline: 1-2 days"]},{"i":"5-contract-configuration--testnet-deployment","l":"5. Contract configuration & testnet deployment","p":["We will configure your smart contract before transferring ownership to Ethereum address provided in Step 4. Once we deploy your contract on the test network, you can start testing your generative script.","Timeline: 1 week"]},{"l":"6. Testnet infrastructure integration","p":["Art Blocks will integrate your contracts with our rendering infrastructure and provide access to our staging website for you to perform project onboarding and configuration via the Art Blocks site on the test network.","Contracts are deployed twice per month and typically take 1 week to complete and transfer.","Timeline: 1 week"]},{"i":"7-integration-with-partners-site","l":"7. Integration with partner’s site","p":["Your team will integrate your site’s front-end with the contract created by Art Blocks to test your outputs on the testnet.","Timeline: weeks-months (depends on partner)","Connect your front end to testnet contracts"]},{"l":"8. Test mints on partner site","p":["Your team ensures the minting process is working on the test network by minting your NFTs using the front-end of your site.","Timeline: weeks-months (depends on partner)","Mint test outputs","Test drop mechanic (flat price, Dutch Auction, whitelists, etc.)","Test purchase with custom ERC20 (if applicable)","Request a script audit from Art Blocks","Test your script across different hardware/software ( browserstack.com)","Let the Art Blocks team know testing is complete and you're ready for a mainnet deployment"]},{"l":"9. Deployment to mainnet","p":["Art Blocks deploys the mainnet version of your contract and integrates it with our infrastructure.","Timeline: 2 weeks"]},{"i":"10-infrastructure-integration-mainnet","l":"10. Infrastructure integration (mainnet)","p":["Your team integrates the mainnet contract with your site and prepares to generate your first NFT (mint #0)","Timeline: Depends on partner","Connect your front end with the new mainnet contracts, using the same minting mechanics from testnet (drop type & currency)","Mint #0 from your front end"]},{"i":"11-mint-0","l":"11. Mint #0","p":["You can mint your project's first official token via your site!"]},{"l":"12. Set secondary royalties","p":["Art Blocks will set our secondary royalty before we transfer contract ownership, but you are responsible for setting your own secondary royalty across all secondary marketplaces.","OpenSea - https://docs.opensea.io/docs/10-setting-fees-on-secondary-sales LooksRare - https://docs.looksrare.org/guides/collection-management/set-or-edit-collection-royalties x2y2 - https://docs.x2y2.io/guides/collection-management/manage-your-collection","Note: The vast majority of secondary activity takes place on OpenSea. Currently, OpenSea does not recognize on-chain roylaties and needs to be set through their interface. However, they plan to recognize Roylaty Registry in the near-ish future. We highly encourage you to sign up for the Royalty Registry to avoid missed secondary roylaties.","Instructions on setting up Royalty Registry - https://docs.artblocks.io/creator-docs/art-blocks-engine-onboarding/art-blocks-engine-101/engine-royalty-registry-setup/"]},{"l":"13. Project launch","p":["You can choose a launch date for your project. Please allow at least one week between a successful mint #0 and a go-live date.","Timeline: 1 week from completion of step 11"]}],[{"l":"Engine Project Deployment and Launch Guide","p":["This guide provides basic instructions for deploying and launching a new project on the V2 and V3 Engine smart contracts. You will learn how to create a project shell, assign a minter to each project, and setup the necessary configurations before minting and launching your project. This documentation aims to simplify the process and ensure a smooth project launch on the Art Blocks Engine platform.","There are slight variations between V2 and V3 contracts, which will be noted in the relevant sections."]},{"l":"Project Shell Deployment","p":["Collect the required information for the project:","Project title (e.g., \"Fun Lines\")","Artist's wallet address (e.g., 0x78592a6fBE68fEBf226040a5D25ad7e69F2FeAb6)","(V2 only) Price-per-mint specified in WEI (e.g., 350000000000000000, or 0.35 ETH)","Navigate to your Engine Core Contract on Etherscan and connect your wallet. You can find this link in your DEPLOYMENTS.md log. https://goerli.etherscan.io/address/0xd2363Acbf8CdF01A5FdfcB8f0295e0a5dF94518D#code)","Click the \"Write contract\" tab and use the addProject method to create a new project shell, specifying the information collected in step 1.","Connect to the Art Blocks website with the artist wallet used in in Step 3. Your artist should be able to begin entering project details.","Testnet URL: https://artist-staging.artblocks.io/engine/[flex OR fullyonchain]/projects/[coreContractAddress]/[projectID] example: https://artist-staging.artblocks.io/engine/flex/projects/0x28b82AA5bb6d00363ae0FBC5ecaD689Ae49BC82B/0","Mainnet URL: https://www.artblocks.io/engine/[flex OR fullyonchain]/projects/[coreContractAddress]/[projectID] example: https://www.artblocks.io/engine/fullyonchain/projects/0xa319C382a702682129fcbF55d514E61a16f97f9c/1","If you encounter issues finding or seeing your project on the Art Blocks site, disconnect and reconnect your wallet, ensuring you are connected with the previously specified artist wallet."]},{"i":"assigning-a-minter-v3-only-new-shared-minter-suite","l":"Assigning a Minter (V3 only, New Shared Minter Suite)","p":["Minters are assigned on a per-project basis on V3 contracts, and minters must be assigned by the artist's wallet.","note: for legacy minter suite directions, see the next section","Art Blocks is working on a new creator dashboard that will more easily facilitate the minter assignment process. This will only be possible using the new shared minter suite, because those minters are indexed by the subgraph. Until the new creator dashboard is released, please follow these instructions to assign a minter to your project.","Assign the minter to your project by using the MinterFilterV2 contract found in your deployment file. The artist's wallet should use function #9 setMinterForProject, entering the _projectID, _coreContract address, and _minter address. You can get the globally approved minter addresses via the getAllGloballyApprovedMinters() view function on the MinterFilterV2 contract.","Once the minter is linked to your project, set the project details on the minter contract.","For example, if you are using a shared Dutch Auction minter, navigate to the contract on Etherscan. Then, use the function setAuctionDetails to enter details like _projectId, _coreContract, _auctionTimestampStart, _priceDecayHalfLifeSeconds, _startPrice, and _basePrice. This must be done using the artist's wallet."]},{"i":"assigning-a-minter-v3-only-legacy-non-shared-minter-suite","l":"Assigning a Minter (V3 only, Legacy Non-Shared Minter Suite)","p":["We recommend using the new shared minter suite, which is easier to use and more flexible. If you are using the legacy non-shared minter suite, follow these instructions. For more information about migrating to the new shared minter suite, please see the Minter Suite Migration Runbook.","Minters are assigned on a per-project basis on V3 contracts, and minters must be assigned by the artist's wallet. For the artist wallet to assign a minter, follow these steps:","Assign the minter to your project by using the MinterFilterV1 contract found in your deployment file. The artist's wallet should use function #6 setMinterForProject, entering the _projectID and _minterAddress. You can find the minter address in your deployment log, which is pinned in your partner channel.","Once the minter is linked to your project, set the project details on the minter contract. The deployed minter addresses can be found in your deployment file.","For example, if Art Blocks deployed a Dutch Auction minter for your core contract, navigate to the MinterDAExpV4 contract on Etherscan (in your DEPLOYMENT.md log). Then, use the function setAuctionDetails to enter details like _projectId, _auctionTimestampStart, _priceDecayHalfLifeSeconds, _startPrice, and _basePrice. Make sure this is done using the artist's wallet."]},{"i":"pre-mint-0-flight-check","l":"Pre-mint-#0 Flight Check","p":["Before minting your first token (#0) on your new project shell, verify the following:","The baseTokenURI has been set, following the format:","Mainnet: http://token.artblocks.io/{CORE_CONTRACT_ADDRESS}/","Testnet: https://token.staging.artblocks.io/{CONTRACT_ADDRESS}/","The max invocations for the project have been set. (note: project size cannot be increased once set on V3 contracts)","Mint through your own front end. On testnet, you'll want to test each minter type and currency you plan to use on mainnet."]},{"i":"pre-launch-pre-open-minting-flight-check","l":"Pre-launch (pre-open-minting) Flight Check","p":["For a project to be avaialble for public purchase, the project must be activated by the admin, and unpaused by the artist.","tldr: inactive + paused (default state) = private project shell and unable to purchase active + paused = public project shell and only the artist wallet can purchase active + unpaused = open to purchase","Before launching your project for open minting, verify the following:","The project has been activated by the contract admin.","The project is not yet unpaused.","Once unpaused the project will be open, depending on the minter being used (DA will not open until specified startTime)"]}],[{"l":"Art Blocks Engine OpenSea Setup","p":["Setting up the OpenSea storefront for your Art Blocks Engine contract."]},{"l":"OpenSea Storefront Ownership Transfer","p":["After the first token has been minted on your new Art Blocks Engine contract, you should be able to see this token in the OpenSea storefront. You will find this in the format https://opensea.io/assets/{CONTRACT_ADDRESS}/{TOKEN_ID} e.g. https://opensea.io/assets/0x13aae6f9599880edbb7d144bb13f1212cee99533/1000167.","Once this first token is populated, the Art Blocks team will be able to transfer the OpenSea collection for your project to a wallet that you control. By default, the Art Blocks team will plan to use the same address for the OpenSea collection ownership as it is designated to be the admin of your smart contract. However, if you prefer that a different wallet address manages the OpenSea collection, please reach out to Art Blocks to request this before the project has been transferred to your team.","After your OpenSea collection has your designated wallet added as the collection administrator, you may remove the wallet that Art Blocks controls from being an additional admin. It’s added automatically at the time of collection creation based on the contract deployer wallet address at the time of collection creation. We recommend that you do so. That way, only you control your OpenSea storefront.","Please contact the Art Blocks and/or OpenSea teams if you have any issues during this process."]},{"l":"OpenSea Storefront Options","p":["For Art Blocks Engine projects, there are two options that OpenSea can provide for collection organization:","1. All projects are grouped in one large collection, where individual projects within a collection are shown as filter traits on the sidebar of the OpenSea UI.","All projects in one collection.","2. Each new project on your contract is handled as its own collection on OpenSea, where project traits are properties.","Each project as its own collection.","By default, collections are organized via method 1. above. However, if you would like your collection to be handled via method 2., please reach out to the Art Blocks team, and we can facilitate this change by OpenSea on your behalf."]}],[{"i":"art-blocks-engine-royalty-registry-setup-v2-contracts-only","l":"Art Blocks Engine Royalty Registry Setup (V2 contracts only)"},{"l":"Royalty Registry","p":["The Royalty Registry is an on-chain tool used by many marketplaces ((soon) OpenSea, Coinbase NFT, etc.) to query royalty payment addresses and percentages when a token is sold. The Royalty Registry lives on the Ethereum blockchain and is decentralized.","Art Blocks Engine contracts integrate with the Royalty Registry directly to handle many projects and artists on a single contract. Please do not use the Royalty Registry's \"Configure\" UI to configure the royalties for your Engine contracts. Doing so will result in incorrect royalty payments across many projects. Instead, see the documentation below.","Note that the Royalty Registry's \"Lookup\" UI is a great tool for confirming that your Engine contracts are configured correctly after the configuration steps below have been completed."]},{"l":"Royalty Payment Addresses","p":["For Engine contracts, the following addresses may receive royalties:","Party","Typical Royalty Percentage","Platform (Engine Partner)","default 2.5%","Render Provider (Art Blocks)","Artist","typically 5%, but configurable by artist","Additional Payee","split between Artist & Additional Payee varies across projects"]},{"l":"Configuring Royalties","p":["V3 and V2 Engine contracts are configured differently. V3 Engine contracts are the latest version of the Art Blocks Engine contracts. Since they were designed after the Royalty Registry was released, they automatically integrate with with the Royalty Registry. V2 Engine contracts also integrate with the Royalty Registry, but have a shim-layer that must also be configured. This is because V2 Engine contracts were designed before the Royalty Registry was released."]},{"l":"Configuring V3 Engine Contracts","p":["Simply configure the relevant royalty payment details on the token contract itself:","admin (contract-wide):","Ensuring platform and render provider payment addresses are correct, updateable by contract admin by calling updateProviderSalesAddresses on the Engine core contract","Ensuring platform and render provider payment percentages are correct, updateable by contract admin by calling updateProviderSecondarySalesBPS on the Engine core contract","artist (project-specific):","Ensuring the project's artist royalty percentage is correct, updateable on the website by the artist in their project dashboard.","Ensuring the project's artist and additional payee splits are correct, updateable on the website by the artist in their project dashboard."]},{"l":"Configuring V2 Engine Contracts"},{"l":"Required V2 Setup","p":["A. Pre-setup:","B. Royalty Registry Integration:","Call the setRoyaltyLookupAddress function with the following arguments:","Call the updatePlatformRoyaltyAddressForContract function with your Engine token contract address as _tokenContract, and your desired platform royalty payment address as _platformRoyaltyAddress","Connect your Engine admin wallet to the Art Blocks Engine royalty override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f, on etherscan","Create a new override on the Royalty Registry for your Engine core contract","Ensure every project has the desired artist royalty percentage set on the Engine contract.","IMPORTANT: This percentage represents the percentage of the total token sale that will be paid to a combination of artist & additional payee. It is typically 5%. Additionally, the default 2.5% to the Engine platform (you) and 2.5% to render provider (Art Blocks) will be also added by the Royalty Registry override contracts below.","Note: This percentage is different than what OpenSea has asked us to do with their off-chain royalty system. In the old system, typically 5%+2.5%+2.5%=10% was set on OpenSea's website because they only supported bulk payments to a single address. In the new on-chain system, payments to more than a single address will be supported.","Now you will automatically be receiving royalties from sales on secondary markets that support use of the Royalty Registry!","Only artists may update their project's royalty percentage. They can call updateProjectSecondaryMarketRoyaltyPercentage(_projectId, _royaltyPercentage) on the Engine contract from their artist wallet. Typically royalty percentage would be the number 5, representing 5%.","royaltyLookupAddress: The address of the standard Art Blocks Engine Royalty Registry override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f","Set your Platform royalty payment address","The following steps are required before Art Blocks Engine contracts will integrate properly with the Royalty Registry.","tokenAddress: The address of your Engine core contract","Using the Connect to Web3 button, connect your Engine admin wallet to etherscan when on the \"Write as Proxy\" tab.","View the Royalty Registry's mainnet registry contract on etherscan: https://etherscan.io/address/0xad2184fb5dbcfc05d8f056542fb25b04fa32a95d#writeProxyContract"]},{"l":"Optional V2 Configuring","p":["Royalty percentages of 2.5% are used by default by the Art Blocks Engine royalty override contract. The admin of any given Engine core contract can override these percentages by calling updatePlatformBpsForContract or updateRenderProviderBpsForContract on the Art Blocks Engine royalty override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f, on etherscan","Note that royalty proportions are defined in terms of Basis points. For example, 250 BPS = 2.5% royalty. See this article for more information.","After initial setup, the Platform (Engine partner) royalty payment address may be updated at any time by the admin of a given Engine core contract by calling the updatePlatformRoyaltyAddressForContract function on the Art Blocks Engine royalty override contract, 0x31E1cC72E6f9E27C2ECbB500d978de1691173F5f, on etherscan"]}],[{"l":"Embroidery on Art Blocks Engine","p":["In addition to providing a browser-based live view and media files generated from your project script, Art Blocks Engine provides tools to embroider your generative artwork on garments and accessories."]},{"l":"Requirements","p":["In order to get started, you will need:","Testnet project shell on Art Blocks Engine Refer to documentation for setup instructions*","Embroidery machine and software drivers compatible with DST or PES files If you are new to embroidery, we recommend the Brother PE800","JavaScript utilities for manipulating SVG markup Clone the embroidery template repository for an example: ‣"]},{"l":"Quick Start","p":["Deploy a new project shell to your Art Blocks Engine testnet contract","Upload a project script that includes a global function named generateEmbroiderySVG that returns a string containing SVG markup for embroidery","Use the Embroidery File Downloader to generate embroidery files for minted tokens"]},{"l":"Project Script Requirements","p":["In addition to following the typical guidelines and constraints for Art Blocks projects, your project script should include a global function that is only used for embroidery."]},{"l":"Generating SVG for Embroidery","p":["Implement a global function with the following type signature:","For example, you may include a function similar to code below:"]},{"l":"Functional Requirements","p":["In order to correctly generate files for embroidery, you must:","Implement a generateEmbroiderySVG global function that returns the full markup of an svg element as a string","Optional: accept a width and height parameter (millimeters) used to resize the contents of the SVG to accomodate different garment sizes","Render a digital-only version of the art using a separate svg or canvas that is displayed to the user and thumbnailed in token metadata (similar to any digital-only Art Blocks project)","Inline all libraries and code used in your project that are not configured as an on-chain dependency"]},{"l":"Known Limitations","p":["Avoid using SVG fills - instead, to create the visual appearance of a fill, the SVG should contains the exact paths the embroidery needle should follow","Avoid using asynchronous code or promises inside of the generateEmbroiderySVG function - the function should return valid SVG markup immediately","Provide margins (bleed) matching the precision of the embroidery machine to improve manufacturing yield","Match all colors used in your design to the colors of thread available to you for embroidering"]},{"l":"Embroidery in Production","p":["In addition to the typical steps required for moving an Art Blocks Engine project to mainnet, there are additional considerations for embroidery projects."]},{"l":"Logistics and Fulfillment","p":["There are three primary customer experiences enabled for embroidery on Art Blocks Engine:","Drop-shipped or batched production Consider the lead times, available materials, and the process for sending files to embroidery service providers.","Live in-person pop-up events Consider space constraints and measure the amount of time required to fulfill a single embroidered object.","At-home embroidery for token holders Consider how and when you would like to provide your users with a link to download embroidery files for a project."]},{"i":"option-1-batched-production","l":"Option 1: Batched Production","p":["To facilitate automated testing and batched production, we provide a rate-limited API for converting Art Blocks Engine projects into DST and PES embroidery files. Note: the API endpoints provided for batched production are rate-limited, and cannot be linked from a public web site.","For example, the following commands illustrate how you can download individual embroidery files for tokens on an Art Blocks Engine project:"]},{"i":"option-2-live-events","l":"Option 2: Live Events","p":["To facilitate live events, operators of a pop-up booth can use the Embroidery File Downloader on a laptop or iPad to quickly download the relevant embroidery files for a given minted token.","Embroidery File Downloader"]},{"i":"option-3-home-embroidery","l":"Option 3: Home Embroidery","p":["If you would like to provide your token holders with a link to download DST or PES files of their minted tokens, please contact us for access to the API dashboard. To generate embroidery files in an S3 bucket that may be linked from a public web site, you will need to add your project in the API dashboard here: https://minting-api.artblocks.io/admin/embroidery/embroideryproject/"]},{"l":"References","p":["https://github.com/embroidepy/vpype-embroidery/","https://github.com/EmbroidePy/pyembroidery","10 Best Print on Demand Companies and Sites (2023)","The 7 Best Embroidery Machines of 2023"]}],[{"l":"Mobile Minting for In-Person Activations","p":["The Art Blocks Mobile Minter is a specialized app for iPad and iPhone designed to streamline the minting process during in-person events. Unlike the standard Art Blocks website, which is accessible from any device, the Mobile Minter is tailored for events where minting is exclusive to attendees or offered as an event gift."]},{"l":"Features","p":["The Mobile Minter is capable of:","Minting Art Blocks tokens with a pre-funded wallet to cover gas fees","Minting tokens to an ENS name or a copied Ethereum address","Authenticating users with FaceID/TouchID for quick access during live events","Minting tokens without requiring manual signing and submission of Ethereum transactions"]},{"l":"Requirements","p":["The Mobile Minter is perfect for situations where:","A project is paused and not available for online minting","An artist wants to distribute their work at a live event","An iPad or iPhone with the latest iOS version is available","A small amount of Ethereum is on hand to cover gas fees for token recipients","You've set up a Stripe account to accept fiat payment (optional)"]},{"l":"Getting Started","p":["To use the Mobile Minter, follow these steps to set up your project and device according to the system requirements."]},{"l":"Step 1. Project Configuration","p":["To set up the Mobile Minter for your project:","Send a Slack message in Slack requesting access to the Mobile Minter","Art Blocks staff (@Shantanu Bala) will provide a wallet address that will be used to pay for gas fees for transactions Note: The app manages this wallet, and any remaining funds can be returned to you at any time","Pause your project to restrict minting to the artist only","Transfer artist ownership to the wallet address from Step #2, making the Mobile Minter the sole minting wallet for the project","After completing these steps, Art Blocks staff (@Shantanu Bala) will give you login details to start using the mobile app"]},{"l":"Step 2. Device Setup","p":["To prepare your mobile device:","Update your iPhone or iPad to the latest iOS version","Set up and ensure FaceID or TouchID is functional on your device","Download the TestFlight app from the App Store: TestFlight","Join the Mobile Minter beta on TestFlight:","Sign in, set up FaceID, and proceed to minting"]},{"l":"Step 3. Minting","p":["Mobile Minter iPad app","Click the link above to view a screen recording of the Mobile Minter app on iPad. This test demonstrates the steps to mint a project on the Goerli test network. To mint a new token, users follow these steps:","Open the Mobile Minter app on an iPhone or iPad device","Sign in using FaceID","Select a project from the list of available projects","Input an ENS name or wallet address","Confirm the minting details","Wait for the token minting transaction to be confirmed"]},{"l":"Payment Processing","p":["The Mobile Minter utilizes Stripe Terminal for handling payments. Art Blocks does not offer merchant accounts or handle tax remittance for partners. To process fiat payments with Stripe Terminal, all Art Blocks Engine partners must create and configure their own Stripe account.","The backend (Art Blocks Minting API) and point of sale (Mobile Minter app) software are provided by Art Blocks. However, the hardware must be procured by Art Blocks Engine customers."]},{"l":"Stripe Reader M2","p":["We recommend using the Stripe Reader M2 with the Mobile Minter due to its convenient NFC payment support, Bluetooth connectivity, long-term SDK support, and reliable chip/magstripe fallback. You will need to order the M2 directly from Stripe."]},{"l":"Direct Charges","p":["The Mobile Minter uses Stripe Connect to make a direct charge using your Stripe account. Stripe Connect processes direct charges for your Art Blocks Engine project using your own Stripe account (connected account) while using our platform - note that the charge amounts and fees are mock examples provided by Stripe."]},{"l":"Stripe API Secrets","p":["Do not share your live Stripe API keys with anyone, including Art Blocks employees. Instead, Art Blocks will supply a secure OAuth link from Stripe for your usage. Connected accounts are managed using the process outlined by Stripe:","Managing connected accounts with the Dashboard"]},{"l":"Displaying Live Mints","p":["Web-enabled TVs or displays can showcase a real-time view of the latest tokens minted through the Mobile Minter. The Art Blocks documentation site offers an overview of configuration options for the live viewer."]},{"l":"Example Embed","p":["You can embed live.artblocks.io using an iframe on a web page containing your organization’s branding.","[Example embed of live.artblocks.io without any configuration parameters ( docs)]( https://live.artblocks.io/)","Example embed of live.artblocks.io without any configuration parameters ( docs)"]},{"l":"Frequently Asked Questions"},{"i":"can-the-mobile-minter-be-used-with-projects-that-are-not-paused","l":"Can the Mobile Minter be used with projects that are not paused?","p":["Yes, the Mobile Minter can be used for active projects. However, pausing the project and transferring artist ownership to the app restricts minting exclusively through the app. If a project remains unpaused, anyone online can mint tokens."]},{"i":"can-users-pay-for-gas-fees-themselves","l":"Can users pay for gas fees themselves?","p":["Currently, gas fees must be pre-funded by the artist or the organization using the Mobile Minter app, through the Mobile Minter's hot wallet."]},{"i":"can-my-prepaid-gas-fee-balance-be-returned-to-me","l":"Can my prepaid gas fee balance be returned to me?","p":["Yes, please contact us to arrange the return of any remaining funds to the original depositing wallet. To have the remaining ETH returned, ensure that the funds were initially transferred to the Mobile Minter's hot wallet from an address capable of receiving ETH on behalf of your organization. The unspent ETH can only be sent back to the original sender's wallet."]},{"i":"can-multiple-projects-be-managed-simultaneously-through-the-mobile-minter-app","l":"Can multiple projects be managed simultaneously through the Mobile Minter app?","p":["Yes, the Mobile Minter app allows you to manage multiple projects for in-person events. You can easily switch between projects during the event, ensuring a seamless minting experience for attendees."]},{"i":"what-currencies-are-supported-for-payments-in-the-mobile-minter-app","l":"What currencies are supported for payments in the Mobile Minter app?","p":["The Mobile Minter app processes fiat payments via Stripe Terminal, which supports a variety of currencies. The available currencies depend on your Stripe account and the country where your business operates. You will be the merchant of record, and Art Blocks will collect its platform fees in ETH or USD. For a list of supported currencies for your customers, please refer to the Stripe documentation."]},{"i":"is-it-possible-to-customize-the-appearance-of-the-mobile-minter-app-for-my-event","l":"Is it possible to customize the appearance of the Mobile Minter app for my event?","p":["While the Mobile Minter app does not offer customization, you can embed live.artblocks.io inside of a page that showcases your event's theme and branding. Please refer to the Art Blocks documentation site for an overview of configuration options for the live viewer."]}],[{"l":"Using Pinata for External Assets","p":["Pinata is an excellent IPFS resource built with creators and non-technical users in mind, making it easy to upload content that you can use inside Art Blocks! This will walk you through the basics of uploading content to Pinata."]},{"l":"Signing Up","p":["You can sign up for a free account which will allow up to 100 files and 1GB of storage! To get started visit pinata.cloud and click the “Sign Up” button in the top right. It will ask you for a name, email, and password."]},{"l":"Uploading Content","p":["Once you’re signed in you will see the Files Page which looks something like this: setup","To start uploading content, simply click on the “Upload +” button and select “File” upload","Of course from there click “Select File” and choose the file on your computer select","Then give it a name, and click upload; that’s it! name","Once it’s done uploading you will see the file listed on your files page! complete","What’s important to note is the “CID” which stands for “Content Identifier.” It’s the core of IPFS and how files can be shared across the IPFS network. This is what you would input into the “cid” portion of an Art Blocks generative script and would look something like this:","QmNrCnsNazd54aAQixQCVtikJNfizEXGKR6yLhr9P1TTJV","If you want to preview your file you can simply click on the name of the file on the left side and it will open a preview in a new window.","The default Pinata gateway is https://gateway.pinata.cloud but keep in mind that it should only be used for testing files. For production work you may want to consider getting a Dedicated Gateway on a paid plan.","If you have further questions be sure to visit Pinata's docs and do not hesitate to send them an email at team@pinata.cloud! or reach out directly to the Art Blocks team."]}],[{"l":"Using Filebase for External Assets","p":["Filebase is a geo-redundant IPFS pinning service and decentralized storage provider. When a file is uploaded to an IPFS bucket on Filebase, it is automatically pinned to the IPFS network with 3 duplicate copies, each of which is stored on an IPFS node located across 3 unique, geographic regions.","Filebase offers an easy-to-use Web Console Dashboard for non-technical users, and an S3-compatible API for developers to utilize in a wide variety of tool configurations or SDKs."]},{"l":"Signing Up","p":["Filebase uses a web-based console that can be found at https://filebase.com/signup. Existing accounts can go directly to https://console.filebase.com.","To sign up for a Filebase account, navigate to https://filebase.com. To make a new account, click the ‘Try for Free’ button in the top right corner of the webpage. signup","Filebase is a free-to-use platform for all users. All users can store up to 5GB of data, with a maximum of 1,000 individual files on the IPFS network with no credit card required.","Next, fill out the fields of the form, including an email address and password, and agree to the Filebase terms to create your account.","You will receive an email with confirmation instructions. Click the link included in the email to confirm your account and finish the registration process. Once you’ve completed these steps, your Filebase account has been created."]},{"l":"Uploading Content","p":["Once signed in, you will be brought to the Filebase dashboard. web_dashboard","To upload content, first you will need an IPFS bucket. Select 'Buckets' from the left menu bar, then select 'Create Bucket'. buckets","Give your bucket a name, then select IPFS for the network. bucket_ipfs","Then, select your bucket from the Buckets menu and select 'Upload'. You can choose to upload a File, Folder, or existing IPFS CID to Filebase. For this example, we'll use a single file. upload","You will be prompted to select a file from your computer. Once uploaded, it'll be displayed in the Filebase web console and it will be given an IPFS CID value. cid","When a file is uploaded to IPFS, the file’s contents are used to generate a cryptographic hash value. Then, this hash value is used to generate another value, which is used as the file’s content identifier (CID). CIDs are used to access files stored on IPFS, but instead of locating the file on the network based on it's name, the CID is based on the file's contents. Any changes to the file's contents or metadata will result in a new, unique CID.","The CID value is what is used within an Art Blocks generative script, under the 'CID' field.","To preview your file using it's IPFS CID and the Filebase public gateway, you can use the following URL format in any web browser:","https://ipfs.filebase.io/ipfs/[CID]","The Filebase public IPFS gateway is https://ipfs.filebase.io/ipfs and can be used by all Filebase uses to host Filebase pinned CIDs. For increased configuration options, performance, content whitelisting, and custom branding, a Filebase Dedicated Gateway can be used through one of Filebase's paid IPFS plans.","For more information, visit Filebase's extensive documentation or send them an email at hello@filebase.com! or reach out directly to the Art Blocks team."]}],[{"l":"FAQs","p":["Core contract vs. Minter contract?","Does Art Blocks create a front-end site for our project?","Flex: Can JS external asset dependencies make external calls to other APIs/assets?","Flex: What are the limitations around file size and file type for external assets? How many external assets can a project have?","How can we add more team members to Discord?","How do we list Art Blocks Engine pieces on OpenSea?","How does autoApproveArtistSplitProposals work?","How does project size work on the Minter contract vs Core contract?","How long will each stage of the process take?","How long will the process take from start to public launch?","What are the Art Blocks Engine offerings?","What effect does ‘locking’ a project have?","What information do we need to provide?","What's included with Art Blocks Engine?","What's the difference between a testnet token and a mainnet token?","When should I enable GPU rendering?"]},{"i":"what-are-the-art-blocks-engine-offerings","l":"What are the Art Blocks Engine offerings?","p":["Art Blocks Engine: Used for on-chain storage of generative systems. Projects can use no dependencies or one dependency from a list of decentralized libraries. See the allowed dependencies here.","Art Blocks Engine Flex: Allows generative systems to reference off-chain assets stored on IPFS or Arweave, enabling creative tools like photography, AI, and GAN.","Email us at Engine@artblocks.io to discuss which offering best suits your needs."]},{"i":"whats-included-with-art-blocks-engine","l":"What's included with Art Blocks Engine?","p":["For a new partnership, the standard current Art Blocks Engine offerings include:","Deployment of Engine smart contracts suite to testnet and mainnet (includes gas costs).","Integration of deployed Core contract with decentralized Graph indexing architecture on testnet and mainnet, includes GRT costs incurred for subgraph update deployment.","Integration of deployed contracts and subgraph with Art Blocks' project setup site and rendering/metadata infrastructure (APIs: Token, Generator, Rendered Image).","(in-migration) Integration with the shared Art Blocks Minter Suite. Art Blocks is rolling out a shared minter suite that will be available for Engine Partners to use to mint their projects. Previously deployed V3 Engine contracts will have the ability to migrate to the new shared minter suite. This means the same minting contracts used for Art Blocks Flagship will be available for Engine partners. In addition to the ability to query minter state via subgraph or Hasura queries, Art Blocks has future plans to expand our offering to include the ability to configure minter settings in an Artist Dashboard, and the ability to use a new Art Blocks minting SDK to more easily mint tokens on your frontend."]},{"i":"what-effect-does-locking-a-project-have","l":"What effect does ‘locking’ a project have?","p":["A summary of how the smart contract functions behave:","addProjectScript","after being locked, maximum invocations may only be decreased","before being locked, maximum invocations may be increased","can only lock projects (i.e. locked projects can not be unlocked)","Locked projects can not be unlocked","Locking a project (specifically on V2 Contracts) permanently freezes the artist name, project name, project scripts, project license, and project IPFS hash on the blockchain. Additionally, maximum invocations of a project can never be increased.","only callable by admin whitelisted wallets on the core contract","project script changes:","removeProjectLastScript","The following functionality is affected by a project being unlocked vs. locked:","The following functionality is only allowed on unlocked projects:","toggleProjectIsLocked","updateProjectArtistName","updateProjectIpfsHash","updateProjectLicense","updateProjectMaxInvocations","updateProjectName","updateProjectScript","updateProjectScriptJSON"]},{"i":"changes-for-v3-contracts-deployed-after-march-23","l":"Changes for V3 contracts (deployed after March '23)","p":["In addition to the above, artists can update project description when project is unlocked. However, only contract admins can update project the description when the project is locked.","V3 contracts autolock four weeks after a project is complete."]},{"i":"how-can-we-add-more-team-members-to-discord","l":"How can we add more team members to Discord?","p":["Contact your account manager for an invite link to the private Discord server."]},{"i":"how-long-will-the-process-take-from-start-to-public-launch","l":"How long will the process take from start to public launch?","p":["The process typically takes 10 weeks from initial conversation to public launch, but is highly dependent on partner's resource allocation. To reduce delays, have a front-end developer, artist, go-to-market strategy, and sufficient onboarding time ready."]},{"i":"what-information-do-we-need-to-provide-to-deploy-our-smart-contracts","l":"What information do we need to provide to deploy our smart contracts?","p":["To get started, you'll provide our team with:","Network: (Mainnet or Testnet)","A testnet/mainnet Ethereum wallet address (that you currently own and control) you'll use to manage your Art Blocks Engine smart contracts.","The name you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"Art Blocks\")","The ticker symbol you’ll use for tokens from your contract (e.g., for Art Blocks, it is \"BLOCKS\")","Deployment Type: V3 Onchain Engine or V3 Flex Engine","Minter Type: set price eth only, set price custom erc20, merkle tree allowlist holder-gated, linear DA, exponential DA, and exponential DA with settlement","note: minter selection will not be needed after migrating to shared minter suite","Starting project ID # (>=0):","Set autoApproveArtistSplitProposals true or false**","**It needs to be set at deployment and cannot be changed later.","tldr - if true, artist royalty wallet changes are auto-approved. If false, the contract admin will need to approve the artist's royalty wallet changes. This is an added check to ensure your artists aren't changing royalty wallets to a random address, which could complicate accounting/ OFAC compliance.","We cannot deploy your contract until you provide the above information. The name and symbol tied to your contract cannot change once your contract is deployed."]},{"i":"does-art-blocks-create-a-front-end-site-for-our-project","l":"Does Art Blocks create a front-end site for our project?","p":["No, partners are responsible for creating and designing their customer-facing experience.","However, we do have a front-end React template with web3 functionality you need to launch a minting site. You will still be responsible for designing the user exerpeicne, but this significantly reduces the time needed to complete a front-end."]},{"i":"how-long-will-each-stage-of-the-process-take","l":"How long will each stage of the process take?","p":["Initial outreach - 1-2 weeks","Project scope - 1-2 weeks","Contract agreement - 1 week","Smart contract details - 1-2 days","Contract configuration & testnet deployment - 1 week","Testnet infrastructure integration -** 1 week**","Integration with partner’s site - Varies(dependent on partner)","Test mints on partner site - Varies(dependent on partner)","Deployment to mainnet - 1-2 weeks","Mainnet infrastructure integration -** Varies**(dependent on partner)","Mint #0 - Instant","Project launch! - 1 week after step 11"]},{"l":"Contract Ecosystem","p":["Core contract: This is the smart contract that controls the artwork created by the artist. No financial transactions occur on this smart contract.","AdminACL: By default, Engine smart contracts have two sets of permissions, Admin and Artist. The AdminACL contract controls which wallets can access which functions on your core contract. If you'd like to assign more granular control of your smart contract to different wallets, you can fork and customize the AdminACL contract.","Minter Filer: The minter filter configures minter-types to specific projects.","Minter contract: These smart contracts receive funds and split them between the artist(s) and the platform. Artists receive funds directly from these contracts."]},{"i":"how-do-we-list-art-blocks-engine-pieces-on-secondary-markets","l":"How do we list Art Blocks Engine pieces on secondary markets?","p":["Secondary marketplaces will automatically detect and display projects on your contract. If you’d like each project to have its own storefront on OpenSea, please contact an account manager to facilitate the change."]},{"i":"whats-the-difference-between-a-testnet-token-and-a-mainnet-token","l":"What's the difference between a testnet token and a mainnet token?","p":["Testnet tokens are free, unlimited, and worthless. They only exist as a tool for the testing environment before spending actual money (Ether) deploying on Ethereum’s mainnet."]},{"i":"flex-what-are-the-limitations-around-file-size-and-file-type-for-external-assets-how-many-external-assets-can-a-project-have","l":"Flex: What are the limitations around file size and file type for external assets? How many external assets can a project have?","p":["There are no explicit limitations on the contract side, neither for file size or type or how many external assets a project can have. Ultimately, this is at the discretion of the artist, but Art Blocks recommends paying close attention to ensure that artworks are as accessible as possible for as many different types of users as possible. Generally speaking, the above factors should be influenced by trying to achieve the best user experience for the artwork in terms of performance and load time.","Some additional recommendations:","Try to keep the overall download size for users viewing the work to be under ~ 10mb OR ensure the artwork description mentions the heavier load/longer loading time. Additionally, consider whether or not it may make sense to have a loading indicator as part of the artwork itself.","When working with less common file types, remember to test on various platforms/browsers, to ensure the best cross-platform compatibility possible."]},{"i":"flex-can-js-external-asset-dependencies-make-external-calls-to-other-apisassets","l":"Flex: Can JS external asset dependencies make external calls to other APIs/assets?","p":["Having your JS external asset dependencies making external calls, whether it's to an API or other assets, is not a supported use of the Engine Flex offering, as it breaks the assumption of only utilizing off-chain decentralized platforms. We encourage you to, instead, serialize any data you may need from these external calls into assets (JSON, TXT, etc) that are also stored on the platforms Engine Flex currently supports (IPFS and Arweave)."]},{"i":"for-the-status-of-a-project-on-the-contract-how-does-active-and-paused-differ","l":"For the status of a project on the contract, how does 'active' and 'paused' differ?","p":["The value of paused is determined by artist, whereas active is determined by contract admin. Both need to be in a mintable state ( paused=false, active=true) for a project to be publicly available to mint."]},{"i":"why-is-there-a-small-delay-between-the-tokens-mint-transaction-confirming-and-it-being-viewable-on-the-art-blocks-generator-live-view","l":"Why is there a small delay between the token's mint transaction confirming and it being viewable on the Art Blocks Generator (live view)?","p":["Art Blocks uses the decentralized Graph network to index on-chain data in our publicly available subgraph. There can be a slight delay between the first block confirmation on the ethereum network for a transaction and that transaction being indexed by our subgraph. To mitigate this, as an Art Blocks engine provider, your client should be waiting multiple block confirmations (we recommend at least 2 blocks) before it shows the generator view to the user. The generator will return an error message if the token is not indexed yet, accompanied by 4XX status code. Many clients also employ a polling strategy, only showing the requested generator view once the requested generator url is returning a 2XX status code."]},{"i":"how-does-project-size-work-on-the-minter-contract-vs-core-contract","l":"How does project size work on the Minter contract vs Core contract?","p":["A project's max invocations on Art Blocks contracts are handled differently on the Core contract and the Minter contract.","On the Core contract, setting a project size establishes the project's maximum size, and this value cannot be increased once set. The max invocations on the core contract define the absolute upper limit for the number of mints for a specific project.","On the other hand, each Minter contract allows you to set max invocations for the specific minter using the manuallyLimitProjectMaxInvocations function. This setting does not lock the project size but controls the maximum number of mints allowed by that particular minter. When updating the maxInvocations value for a project in the Minter contract, you must adhere to these conditions:","The new value of _maxInvocations should not be greater than the maxInvocations set in the core contract.","The new value of _maxInvocations should not be less than the current number of invocations."]},{"i":"how-does-autoapproveartistsplitproposals-work","l":"How does autoApproveArtistSplitProposals work?","p":["When true, aproveArtistSplitProposals is a feature thatallows artists to automatically change their royalty split payout address and the split percentage without requiring approval from the contract admin. This makes the process faster and more convenient for artists but may increase the risk of unauthorized changes to royalty wallets, which could complicate accounting or OFAC compliance.","If set to else the contract admin will need to approve any changes to the artist's royalty wallet, adding a layer of security and control."]},{"i":"when-should-i-enable-gpu-rendering","l":"When should I enable GPU rendering?","p":["If your image preview is showing a blank, incomplete, or invalid rendering for a token, turning on GPU rendering may resolve the issue. GPU rendering is managed by the Art Blocks team and enabling is determined on a case-by-case basis. Before requesting GPU rendering, check your project script code for any potential issues and/or try increasing your render delay (up to 10min). Reach out to the Art Blocks team to enable GPU rendering on a specific project if the token issues continue after adjusting the delay."]}],[{"l":"Art Blocks Engine Flex Technical Details","p":["This page goes deeper into some technical considerations when working with the most current version of Artblocks Engine Flex. The latest version of the Engine Flex contract (v3) and interface can be found here:","https://github.com/ArtBlocks/artblocks-contracts/blob/main/packages/contracts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol","https://github.com/ArtBlocks/artblocks-contracts/blob/main/packages/contracts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol"]},{"l":"Introduction To External Asset Dependencies","p":["The Engine Flex contract introduces the concept of external asset dependencies. These essentially function as on-chain pointers to off-chain assets stored using decentralized storage technologies and, with the latest version of flex, also supports fully on-chain data storage. An external asset dependency is comprised of its content identifier (CID), if it's using Arweave or IPFS, a bytecodeAddress if it's specifically dealing with fully on-chain data, and a dependencyType, which maps to an Engine Flex supported platform.","Engine Flex currently supports adding external asset dependencies of the following types:","IPFS","Arweave","Onchain (data lives entirely on the blockchain)"]},{"i":"adding-updating--removing-external-asset-dependencies","l":"Adding, Updating & Removing External Asset Dependencies","p":["When working with and manipulating a project's external asset dependencies, you'll be relying on the following functions:","Note the parameter _cidOrData, which allows you to either pass in a CID if you are working with the IPFS/Arweave dependencyTypes or a data string if you are working with the onchain dependencyType.","For convenience and utility, the contract also provides the following function, allowing you to easily grab a project's external asset dependency at a specific index:","This convenience function returns data in the form of the following format:","Note that for dependencyTypes other than onchain (IPFS, Arweave), the returned bytecodeAddress will be the zero address and data will be an empty string. Conversely, if the dependencyType is onchain, the returned cid will be an empty string.","Some important factors to keep in mind with the above functions:","Only allowlisted/artist addresses can call these.","ExternalAssetDependencyType _dependencyType is a solidity enum, which can be passed into these functions as a uint8. This enum only defines three options as of now, IPFS, ARWEAVE, and ONCHAIN, which can be represented as 0, 1, and 2 respectively."]},{"l":"Note On Removing External Asset Dependencies","p":["In the interest of saving gas, the removeProjectExternalAssetDependency() function is implemented in such a way that it does not preserve the order of the project's external asset dependency mapping. Specifically, the way this removal logic works is as follows: when an index to remove is passed in, the element at that index being removed is swapped with the element at the last index of the list of assets. Now that the last index holds the element to be removed, that element is removed off the list. This method, in addition to being more gas efficient, also ensures that our list/mapping does not have any \"holes\". The tradeoff, however, is that the removal causes the order of the external asset dependencies in this list to change, albeit in a deterministic manner: the element at the last index always moves to the removed index. This is important to keep in mind when writing your project script, though you can always update the ordering manually as you see fit by utilizing the updateProjectExternalAssetDependency() function.","You can view directly the full implementation of this removal function here: https://github.com/ArtBlocks/artblocks-contracts/blob/main/packages/contracts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol#L524"]},{"l":"Preferred Gateways","p":["The Engine Flex contract allows you to specify preferred gateways for the currently supported dependency types (IPFS & Arweave). Gateways are accessible HTTP interfaces and, when combined with an asset CID, expose urls for assets being stored on these off-chain decentralized platforms. These preferred gateways are updateable with a string param via the following functions: updateArweaveGateway()& updateIPFSGateway().","Please note that these preferred gateways are set per-contract, not per-project."]},{"l":"Working With External Asset Dependencies In Your Project Script","p":["When you request the live view for a given token of a project, the hash and tokenId of the token are provided in the tokenData object and the Art Blocks Generator injects this into the served HTML live view. This tokenData object has now been extended with the following external asset dependency related data, if it is available:","Your project script can then easily make use of these dependencies by combining the CID of the asset with the appropriate gateway, if you are dealing with IPFS/Arweave dependencies. As a simple example: If you have an external asset dependency with a CID QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg and a dependencyType of IPFS, you can construct the full url of your external asset dependency by combining the preferredIPFSGateway, which let's assume is https://ipfs.io/ipfs/, with the asset CID. This gives you the full url of the asset, https://ipfs.io/ipfs/QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg, and allows your project script to download it with fetch and use it as it sees fit. For fully onchain external asset dependencies, the full data string that is stored on the blockchain will be injected.","Note that for IPFS/Arweave external asset dependencies if your CID is pointing to a directory of assets, rather than a single asset, your project script will need to be aware of the file naming structure of this directory to fetch the assets individually. Using the previous example, imagine that CID QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg was pointing to a directory of 10 PNG images, with filenames corresponding to the numbers 1-10. Your project script would generate the same full url with the information provided, https://ipfs.io/ipfs/QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg, but also append the specific file you want to fetch by being aware of the naming conventions, ie https://ipfs.io/ipfs/QmXxgX5Qyhqz1t9wDFkvJtjVKYe1f8Uj714RV2n1LS76Pg/1.png."]},{"l":"Loading JS Libraries As External Asset Dependencies","p":["If you are specifically looking to utilize an IPFS/ARWEAVE type external asset dependency as a JavaScript library in your project script, you cannot simply add it as a script element onto the page. You must load it in a blocking manner so that the browser does not attempt to run your project script code before the lib is fully loaded. Here is an example of how to do this with ES6 dynamic imports (supported by most modern browsers: https://caniuse.com/es6-module-dynamic-import):","Here's another method without using ES6 dynamic imports, instead relying on using a callback that gets fired after the JS external asset dependency is injected into the html via a script tag:"]},{"i":"locking-a-projects-external-asset-dependencies","l":"Locking A Project's External Asset Dependencies","p":["Artists and allowlisted addresses also have the ability to lock a project's external asset dependencies:","This irreversible action removes the ability to add, update or remove from a project's external asset dependencies.","Important notes:","Preferred gateways do not get locked with this action and, in general, cannot be locked. This is intentional to allow support for modifying the preferred gateway over time, which may change while CIDs remain fixed/permanent.","You can lock a project's external asset dependencies regardless of whether or not the project itself is locked. And you can continue to modify a project's external dependencies even if the project is locked, as long as the external asset dependencies for the project are not locked."]},{"i":"why-should-i-use-the-engine-flex-specific-fields-for-cids-and-ipfs-gateways-rather-than-hard-coding-these-values-in-the-script","l":"Why should I use the Engine Flex specific fields for CIDs and IPFS gateways rather than hard-coding these values in the script?","p":["The Engine Flex contract was designed to expose specific on-contract fields for storing external asset dependencies (either via auxiliary on-chain storage, IPFS CIDs, or Arweave CIDs). For collectors and archivists preserving these art works, this increases the introspect-ability of where these external assets are stored, e.g. allowing for a more streamlined and robust process for replicating external assets stored on IPFS for a given project in the future.","Additionally, after project scripts are locked, if an IPFS gateway is hardcoded it isn't possible to update this in the future if the gateway (but not the underlying asset CIDs) needs to change for whatever reason (partner is migrating gateway providers from Pinata to Infura, partner is shutting down private gateway in favor of a public one, etc.). If using the specified on-chain fields, the CIDs can be locked independently from the gateway, allowing flexibility to preserve future compatibility of the on-chain generator down the road."]}],[{"l":"Common Custom Dashboard Mutations"},{"l":"Introduction","p":["As an Engine partner, you have the option to create a custom artist/admin dashboard. While the majority of your project configuration will occur through on-chain transactions, there are specific off-chain fields that need to be set directly via our GraphQL API.","This documentation outlines the permissions necessary for executing relevant actions and mutations. Please note that a user can only execute a mutation with the artist role for a project if their public address matches the artist address set for the project. A user can execute a mutation with the allowlisted role only if they are the super admin on the project's contract's ACL contract (V3 and up), or if they have been whitelisted on the project's contract (V2 and below).","For all mutations listed in this documentation, the user must include the x-hasura-role header in their request, specifying either artist or allowlisted as the role, as appropriate."]},{"l":"Actions","p":["Actions are specialized mutations that go beyond simple CRUD operations. Within your custom creator dashboard, you might find the updateFeatures and updateProjectMedia actions particularly useful.","The updateFeatures action initiates a test run of a feature script for a test token. Upon validating that the output aligns with the provided feature fields, it updates both the feature_fields and feature_script on the project. Both artists and allowlisted users can execute this action. Artists can make updates either before the project is completed, or afterwards, if the allowlisted user has toggled the enable_artist_update_after_completion flag on the project's associated features row.","The updateProjectMedia action refreshes various media assets linked to a project's tokens. The refreshed media depends on the parameters passed to the action, which may include different formats of preview images and features. This action is accessible to both artists and allowlisted users. However, the execution of this action is rate-limited to once 24 hours for artists.","Here are the parameters accepted by the updateProjectMedia action:","projectId: The ID of the project to be updated.","features: A boolean that indicates whether to recalculate features for the project's tokens.","render: A boolean that indicates whether to re-render the preview images for the project.","renderVideo: A boolean that indicates whether to re-render preview videos/gifs for the project.","All these actions are executed via specific mutations in the GraphQL API."]},{"l":"Tags","p":["Tags and projects share a many-to-many relationship, managed through the entity_tags table. Tags serve as non-functional descriptors that can be used to categorize projects. To associate a tag with a project, the insert_entity_tags mutation is used.","In the context of an Engine dashboard, you're likely most interested in presentation tags, which can be fetched with the following query:","Both the artist and contract admin roles have the permissions to execute the insert_entity_tags mutation. Here's an example of how to use this mutation:"]},{"l":"Project","p":["-","All these fields are updated using the update_projects_metadata_by_pk mutation.","Allowlisted Permission","Allows artists to acknowledge contributors, inspirations, or other sources of influence.","Artist Permission","artist_display_notes","artist_interview","charitable_giving_details","Contains the artist's intentions for how the artwork should be displayed.","creative_credit","Description","Determines whether GIFs and MP4s are generated during individual token refreshes, batch token refreshes, and new token mints.","disable_sample_generator","Enables the artist to specify a token ID to feature. Determines the token displayed as the project's cover image on our flagship site.","featured_token_id","Field","generate_video_assets*","Indicates the artist's preference for displaying project previews. Influences whether the \"explore possibilities\" modal is displayed on the project page on our flagship site.","link_to_license","Outlines any charitable giving aspects associated with the project.","Please note: In the tables above, 'X' stands for write permissions, and '-' stands for no write permissions.","preview_render_type","primary_render_type","Provides a link to an interview with the artist.","Provides a link to the copyright license for the project (e.g., \"https://creativecommons.org/licenses/by-nc-nd/4.0/\").","Provides specific details about the sales mechanics of the project.","render_delay*","sales_notes","Sets the delay (in seconds) before our renderer captures a snapshot of the project for preview images.","Sets the intended start time of the project, indicating when it will become unpaused and active.","Specifies the preferred format for displaying the project on detail pages.","Specifies the preferred format for the project's preview images.","start_date","The table below lists permissions for directly updating relevant off-chain fields on the project row. Many of these fields are optional and are intended to enrich the descriptive content on your frontend. Fields marked with an asterisk (*) have a functional impact on the project.","X"]}],[{"l":"Minter Suite Migration Runbook","p":["This documentation is a work in progress. Minter suite migration is ongoing, and initial migrations are being actively worked. Please reach out to the Art Blocks team with any questions.","This page provides a step-by-step guide on how to migrate a V3 Art Blocks Engine core contract from the legacy non-shared minter suite to the new shared minter suite. This migration is required for all V3 Engine contracts that want to use the new shared minter suite, which has the following benefits:","All minter contracts are indexed by the Art Blocks subgraph, and can therefore be configured in the new Artist Dashboard website (coming soon)","All minter Art Blocks Flagship minting contracts become available for use by Engine projects","Collectors can purchase from the same trusted contract they interact with on Flagship.","Art Blocks will release an SDK to simplify the minting process for Engine projects (coming soon)","Migration is not available for V2 Engine contracts; for Engine partners that wish to upgrade to a V3 Engine contract, please contact the Art Blocks team.","Migration is not required for V3 Engine contracts that wish to continue using the legacy non-shared minter suite. However, we recommend migrating to the new shared minter suite for the benefits listed above."]},{"l":"Migration Steps"},{"l":"1. Engine partner frontend updated to support new minter suite","p":["In the coming months, the Art Blocks team will be releasing a new minting SDK that can be used to support the new shared minter suite. Documentation for the SDK will be referenced here when it becomes available.","MinterDAExpHolderV5","MinterDAExpSettlementV3","MinterDAExpV5","MinterDALinHolderV5","MinterDALinV5","MinterSetPriceERC20V5","MinterSetPriceHolderV5","MinterSetPriceMerkleV5","MinterSetPricePolyptychERC20V5","MinterSetPricePolyptychV5","MinterSetPriceV5","The Engine partner's frontend must be updated to support the new shared minter suite. In general, the new shared minter suite requires the following changes:","The source code of all new, shared minter contracts is available on the Art Blocks smart contracts monrorepo. The complete list of all new, shared minter contracts is:","View functions on the minter contracts may have changed slightly. This is due to some minor architectural changes to the minter contracts that we believe simplifies their codebase and make them more extensible.","When specifying a project to configure or purchase from, an additional input arg of coreContract(address) must be specified. This is because one minter/minter filter contract is used for many core contracts."]},{"l":"2. Schedule downtime for any live projects","p":["The migration process requires all artists with live projects configure a new minter. All live projects should be paused during the migration process. Switching to the new minter filter is simple, but after migrating to the new minter filter, the artist of every live project must configure their minter in the new minter suite. This is also only a few transactions, but it is fully reliant on coordinating with artists to be ready to re-configure minters of open projects after switching to the new minter filter."]},{"i":"3-core-contract-admin-sends-migration-transactions-testnet-before-mainnet","l":"3. Core contract admin sends migration transactions (testnet before mainnet)","p":["0x13178A7a8A1A9460dBE39f7eCcEbD91B31752b91","0x28f2D3805652FB5d359486dFfb7D08320D403240","0x6a5976391E708fBf918c3786cd1FcbB88732fbc1","0x94560abECb897f359ee1A6Ed0E922315Da11752d","0xa07f47c30C262adcC263A4D44595972c50e04db7","0xa2ccfE293bc2CDD78D8166a82D1e18cD2148122b","0xC91CFC2062D8B4Ff53A7c8836CAEf925a7C78c81","0xD1d9aD8B1B520F19DFE43Cc975b9470840e8b824","Arbitrum One","Artist Staging Arbitrum-Sepolia","Artist Staging Goerli","Artist Staging Sepolia","Engine Admin calls updateMinterContract on the core contract, passing in the address of the shared minter filter.","Engine Admin calls updateRandomizerAddress on the core contract, passing in the address of the shared randomizer","Mainnet (Ethereum)","Network","Shared Minter Filter Contract Address","Shared Randomizer Contract Address","The Engine partner's core contract admin should send 2 transactions to the core contract:","You are now using the new shared minter suite!"]},{"l":"4. Artists re-configure minters for ALL LIVE PROJECTS","p":["AFTER step 3, artists must re-configure their minters for all live projects. This is a quick process, but requires coordination with artists to ensure they are ready to re-configure their minters after the switch.","Artists can re-configure their minters manually by following the instructions documented in the engine project launch/assigning a minter section. Additionally, soon, artists will be able to configure their project minters via the (new) Artist Dashboard.","The process for most open projects will likely be to switch to a fixed price minter.","After configuring a minter, the project is now using the new shared minter suite and live for minting!"]},{"l":"5. Engine partner monitors migration progress","p":["It is recommended that the Engine partner monitor the migration process to ensure that all artists have successfully re-configured their minters. Additionally, the Engine partner should use diligence to ensure that purchases and payment splits after the migration are working as expected."]},{"i":"6-add-any-custom-one-off-minters-to-the-shared-minter-suite","l":"6. Add any custom, one-off minters to the shared minter suite","p":["The new shared minter suite provides all Art Blocks Flagship minters to Engine projects. However, if the Engine partner has any custom, one-off minters that they would like to use for their core contract, they can be added for their specific contract. Please see please see the Adding custom, one-off minters page for steps on how to do this.","Note that at this time, custom, one-off minters will not be indexed in the Art Blocks Subgraph or API. This is likely not a change for custom minters being used prior to migration."]},{"l":"7. Explore new minter suite features","p":["The new shared minter suite provides all Art Blocks Flagship minters to Engine projects. Feel free to explore integrating new minters into your product!"]},{"l":"Migration FAQ"},{"i":"what-happens-if-an-artist-does-not-re-configure-their-minter","l":"What happens if an artist does not re-configure their minter?","p":["If an artist does not re-configure their minter, their project will not be able to mint tokens. The artist will need to re-configure their minter before their project can mint tokens."]},{"i":"what-happens-if-an-artist-re-configures-their-minter-incorrectly","l":"What happens if an artist re-configures their minter incorrectly?","p":["If an artist re-configures their minter incorrectly, best case scenario is that their project will not be able to mint tokens, and troubleshooting can identify the issue. Worst case scenario is that their project will be able to mint tokens, but the price per token will be incorrect (e.g. incorrect price entered) or the maximum invocations will be too high (e.g. forgot to set minter-max-invocations to a lower value than set on the core contract, if desired). For these reasons, artists should use diligence when re-configuring their minters."]},{"i":"what-happens-if-i-migrate-to-the-new-shared-minter-suite","l":"What happens if I migrate to the new shared minter suite?","p":["If you migrate to the new shared minter suite, you will be able to use any new minters developed for Art Blocks Flagship. Additionally, you will be able to use the Artist Dashboard to configure your minters, because your minter suite will be indexed. You will also be able to use the new minting SDK to simplify your minting process."]},{"i":"what-happens-if-i-do-not-migrate-to-the-new-shared-minter-suite","l":"What happens if I do not migrate to the new shared minter suite?","p":["If you do not migrate to the new shared minter suite, nothing will change, but you will miss out on new developments. You will not be able to use any new minters developed for Art Blocks Flagship. Additionally, you will not be able to use the Artist Dashboard to configure your minters, because your minter suite will not be indexed. You will need to continue to use the legacy non-shared minter suite."]},{"i":"what-happens-if-i-migrate-to-the-new-shared-minter-suite-but-i-do-not-want-to-use-the-coming-soon-artist-dashboard-to-configure-my-minters","l":"What happens if I migrate to the new shared minter suite, but I do not want to use the (coming soon) Artist Dashboard to configure my minters?","p":["There are many reasons why a partner might want to do this!","If you migrate to the new shared minter suite, but you do not want to use the Artist Dashboard to configure your minters, you can continue to configure your minters via your frontend, etherscan, etc., but your process will be slightly updated to support the new shared minter suite. Comparing the new minter contracts and the legacy minter contracts will help you understand the changes."]},{"i":"what-happens-if-i-migrate-to-the-new-shared-minter-suite-but-i-do-not-want-to-use-the-new-coming-soon-minting-sdk","l":"What happens if I migrate to the new shared minter suite, but I do not want to use the new (coming soon) minting SDK?","p":["No problem!","If you migrate to the new shared minter suite, but you do not want to use the new minting SDK, you can continue to use your existing minting process, but your process will be slightly updated to support the new shared minter suite."]}],[{"l":"Art Blocks 101 for Creators","p":["A guide on getting started as a creator with Art Blocks.","The primary audience for this document is artists who have already entered the pipeline for launching a project on Art Blocks. If you are an artist currently waiting in the applications queue or applying to Art Blocks, this documentation will provide a helpful guide for you in terms of what to expect, but many of the steps here will not be actionable for you until you have had a project shell set up by the Art Blocks team.","Artists will likely need to tweak/optimize their project code to get it working in the Art Blocks environment. Specifically, static images are rendered for all projects (used as thumbnails, on other platforms, etc.). To generate these, Art Blocks currently uses compute instances running headless Chromium with Puppeteer. Headless Chromium requires the use of SwiftShader, a CPU implementation of the GPU API. This means GPU intensive projects will render slower and may require code optimization and performance improvements from the artist. To closely replicate this environment on your end while developing, we recommend using Chrome and turning off\"Use Hardware Acceleration\" in Settings."]},{"l":"Documentation","p":["The Art Blocks platform hosts generative projects for the production of verifiably deterministic outputs. A generative script (using p5js for example) is stored immutably on the Ethereum blockchain for each project. When a user wants to purchase an iteration of a project hosted on the platform, they purchase an ERC721 compliant \"non-fungible\" token, also stored on the Ethereum blockchain, containing a provably unique \"seed\" which controls variables in the generative script. These variables, in turn, control the way the output looks and operates.","Each \"seed\", also known as a \"hash string\" is a hexadecimal string generated in a pseudo-random manner at the time the token is minted. Each character (0-9, a-f) represents a value from 0-15 and each pair of characters (\"aa\", or \"f2\") represents a value from 0-255.","For example:","This hash will be the source of entropy or variation use to determine the output of your algorithm. When your art is rendered on Art Blocks, your script will have access to a global variable called tokenData. One of the first lines in your script should be to read in the hash from this variable.","Included in the tokenData is also the tokenId. The tokenId encodes both the project and mint.","Please note: if you include using the tokenId as a way to determine the outputs of your script you must disclose this as part of the release communications for your project.","If your script needs to know the mint number or project number, it can do so like this:","When you are testing locally, this variable obviously will not be defined in your browser environment. This here is a simple function to generate valid hashes and tokenIds."]},{"l":"Safely deriving randomness from the token hash","p":["Art Blocks requires that all artists use an instance of the following Random class to feed all of their project's randomness. If you need to modify/customize the Random class, please flag this to our team during the review process.","Note that the class uses the prng algorithm sfc32, which was designed and coded by Chris Doty-Humphry and is public domain. More information can be found at http://pracrand.sourceforge.net.","The convenience methods random_num, random_int, random_bool, and random_choice may be removed if not needed for a specific project. Artists may also add their own convenience methods, but all randomness should be originally sourced from the random_dec() function.","We can get an instance of the Random class like so:","Now each time we need some randomness we can call various helper functions:","Every time one of these functions is called, random_dec() will also be called somewhere in the stack, applying the deterministic arithmetic to the seed and returning a new random number."]},{"i":"i-heard-i-shouldnt-use-mathrandom-why-not","l":"I heard I shouldn't use Math.random(). Why not?","p":["When users mint each piece, they are creating a hash token on the blockchain. All the attributes of your piece should be derived from that token so that user will be able to render their piece and get the same results each time. Math.random is derived from the computer's clock, so there is no guarantee you will get the same output on different computing environments in the future."]},{"l":"Guidelines and Constraints","p":["Now you have the basics here are some general principles you need to consider when making your art."]},{"l":"Limited Dependencies","p":["a-frame","Additional libraries may be added at moderator discretion, but the rule is only one external library per project.","babylon.js","Canvas element provided by template (#babylon-canvas)","Each project can have zero or one library dependency. The approved dependencies are currently the following:","http://paperjs.org","https://aframe.io","https://babylonjs.com","https://github.com/metafizzy/zdog","https://github.com/twitter/twemoji","https://p5js.org","https://processing.org","https://threejs.org","https://tonejs.github.io","Library","megavox","No Library at all","Notes","p5.js","paper.js","processing.js","r124","regl","Source","svg","three.js","tone.js","twemoji","v0.12.15","v1.0.0","v1.1.0-beta","v1.1.2","v1.2.0","v1.4.6","v14.0.2","v14.8.15","v2.1.0","v5.0.0","Vanilla JS, CSS, HTML, WebGL","Version","vox","Zdog"]},{"l":"Code templates by dependency type","p":["When uploading your project to testnet, you may refer to this script template: https://github.com/ArtBlocks/node-artblocks/blob/main/src/templates.js"]},{"l":"Deterministic","p":["Each output must be deterministic based on a single hash. More specifically, the initial output or frame must be the same. If your piece is animated, some randomness is okay. This is so when the art is rendered as an image (e.g. for OpenSea) it is always the same."]},{"l":"Dimensionless","p":["The output must be dimension agnostic. Meaning it scales seamlessly to any dimension. While you can control the dimension ratio (e.g. width/height can be 1.0, 1.5, 0.75 etc.) you have no control over the dimensions of the browser someone else might be using. The output will be rendered by the server at 2400x2400 (see below for ratios other than 1) and typically displayed in most browsers at 1000x1000 but your output should be the same at higher resolutions. Obviously, at lower resolutions, fewer pixels may limit what your output looks like, such as the smoothness of lines, which is okay. This is mainly to ensure your work can be reproduced at print quality.","A simple way to account for this is to define a default dimension and create a multiplier to scale coordinates or sizes relative to the canvas dimensions. Below uses p5js as an example but the same principle applies regardless of the language.","Before submitting your script, it's probably a good idea to test it in different resolutions and aspect ratios.","Set the hash to a constant value:","And then play with the browser window size, and refresh to check that your art looks the same at any resolution."]},{"l":"Shaders","p":["If you are using shaders, you must include the shader code in the script itself (not in a separate file). A typical vertex & fragment shader might be defined like the following:","These can then be used by the library you are using to render your art. For example, if using p5js:"]},{"l":"Cost","p":["Storing code on Ethereum is expensive! Taking average gas prices, you can generally expect to pay ~$10 for each full line of code your script requires. With that in mind - keep things efficient, maximize code reuse with functions, remove comments, and minify your finished code.","Based on previous projects, we've estimated the cost of uploading a script to be the following; where Bytes is the size of your project and gwei price is the price you set when submitting your transaction. It always helps to wait until non-peak hours to upload your script.","So a 10 KB project at 100 gwei would be:","Artists have recently targeted between ~5-20 KB for their code (without the library), but obviously this will vary by project scope."]},{"l":"Data Compression","p":["We allow artists to compress data stored within their scripts (e.g. SVG data); but in the case where the logic of the script itself is compressed to the point of obfuscating the auditing process we may ask that artists remove this level of compression."]},{"l":"Attribution","p":["Much (generative art) source code is published under permissive copyleft licenses, making it available to be used by everybody and depending on the license even for commercial purposes. In case your project's code contains any code not written by yourself, please inform the Art Blocks team about it so the appropriate considerations and attributions can be made.","Common source code licenses (in creative coding):","CC BY: The original author and license must be clearly and appropriately stated.","CC BY-SA: As CC BY, but all derivates must also be licensed under CC BY-SA.","CC BY-NC-SA: As CC BY-SA, but no commercial use is allowed.","MIT: similar to CC BY","GPL: similar to CC BY-SA","There are many other free-to-use licenses commonly used on open source software. Please carefully read the full details on any licensed code you re-use or modify, before including it in your project."]},{"l":"Testing on Goerli","p":["Once your application is approved and your script is ready, you will test it out on an Art Blocks staging site running on one of Ethereum's test networks (Goerli). This will make sure there aren't any bugs or errors and that if it's working on Goerli, it will work on Mainnet. You can connect to this site by changing the network in your browser wallet (e.g. the very top button of MetaMask). You'll still be using the same wallet and address, except on the test network.","Note: If you don't have \"Goerly ETH\" ask a mod or previous artist, we'll send you some to play with. Or if you don't feel like waiting, request some from the faucet: - - https://goerlifaucet.com/ https://goerli-faucet.pk910.de/(POW faucet so this can run in the background and accumulate goerliETH over time)"]},{"i":"ropsten--goerli-upgrade","l":"ROPSTEN > GOERLI UPGRADE","p":["As of Aug 2, 2022","Ropsten is being deprecated entirely as a network. New testnet means new smart contracts: Ropsten artist-staging data will be preserved in a read-only state to be accessed at https://ropsten-artist-staging.artblocks.io/ after August 2nd.","The website for AB core will remain the same: You will still visit https://artist-staging.artblocks.io/, but you will be asked to connect with the Goerli Test Network rather than the Ropsten Test Network.","If you previously had a testnet shell on the Ropsten network, you may still access your project shell using https://ropsten-artist-staging.artblocks.io/ as a frozen read-only set of data. If you are a returning artist, please send( Discord: madpinney#1183) a DM to set up a Goerli project shell.","As a reminder, you can stock up on Goerli ETH here: https://goerlifaucet.com/ https://goerli-faucet.pk910.de/(POW faucet so this can run in the background and accumulate goerliETH over time)"]},{"l":"Interacting with your Project","p":["If you made it this far, we have probably requested a project name and an Ethereum address from you. If not, that probably means your an artist who is in our pipeline and pending being onboarded–once we get you processed the following instructions will make more sense!","If you have provided a project name and Ethereum address to our team, this address you provided to our team will be used on mainnet and on Ropsten. So at this point change your network to Ropsten in MetaMask. On Ropsten, we'll practice uploading everything so that it all goes smooth on mainnet when the ETH is real. After loading the page and connecting your wallet, you should see a button labeled \"Edit Project\". A multi-tabbed form will pop up. You only need to focus on the following:"]},{"l":"Project","p":["This should all be self-explanatory. Just fill and submit each one separately."]},{"l":"Token","p":["In this tab you'll set the price and max invocations for your project. If you're accepting ETH as payment you don't need to worry about \"Updated Currency Information\" and should not change the currency address. To reiterate, do not update the currency address to be your wallet address–this field should only be set if you are accepting payment for your project in some non-ETH ERC20-compliant token.","You can though specify any ERC20-compliant token if you choose, just give someone on the Art Blocks team a heads up that you wish to go down this route.","Set the baseURI: https://api.artblocks.io/token/"]},{"l":"Script","p":["Here you'll first specify the dependency of your project including the script type and the version number of that dependency. For most scripts, you can leave the version blank or enter 1. The aspect ratio is a single number. E.g. 1 or 0.75 etc. If your piece takes a certain amount of time to fully render you can type in the render delay to let the server know when to render the canvas.","Once you've submitted your script details add your script to the \"Project Scripts\" box. Remember, tokenData.hash is a global variable in the environment this script will live in, so you do not need to define tokenData in your script, just expect your script will have access to it.","If your script is big, consider minifying it. If your script is so big that you cannot fit it in a single transaction (you're getting an error when you submit), you may need to split it up and submit each part subsequently."]},{"l":"Splitting","p":["Once you have a working minified version of your project, a recommended way of splitting the file in parts for upload is to use the \"split\" command in Unix systems (Linux, Mac), like this:","That will create an evenly distributed set of files with the splitted code, automatically. The maximum size you can upload to Artblocks per transaction is around 24KB (you can center that as -b 23900 in the split tool, since it does not take decimals)","if you are on Windows, you can use the same command if you have git bash, or a tool like 7-Zip, which allows you to split without compression."]},{"l":"Finishing Actions","p":["Once all of the necessary fields have been submitted, you can then click \"Purchases Paused\" to test out the minting. Once your test mints are working in the livescript view, mint 20-40.","Make sure you've tested your code on multiple browsers (Chrome / Firefox / Safari) and on multiple device types (desktop / mobile) to ensure consistent output."]},{"i":"how-does-my-project-get-those-opensea-attributes","l":"How does my project get those OpenSea attributes?","p":["Once your project is selected to be included in one of the Art Blocks collections, the onboarding team will help you with this. The one thing to keep in mind is that all of the attributes you want displayed should be directly generated from the transaction hash and should not depend on any other randomness.","This script is essentially a copy of your rendering script but without any dependencies present (the server won't have access to them).","For full details on how to structure your project features, please see Art Blocks Features Script."]}],[{"l":"Artist onboarding steps"},{"l":"Artist Onboarding Flow","p":["Artist Onboarding Process-1-page-001","Below, you'll find an overview of each step of our onboarding process, as well as an , estimated time required for each step."]},{"l":"1. Application","p":["You may apply using this link. We expect that artists have a creative history and the ability to provide an original generative script. If you plan to work collaboratively, please provide complete information for all contributors. All submitted work must be original. We do not intend to release projects that use licensed, purchased, or recycled content. Please make sure you’re bringing your unique project to Art Blocks. You will receive a project shell on our staging site when you apply. This project shell is where you will upload your project to Art Blocks for review. Only the wallet address connected to Art Blocks will have access to the project shell when applying. The shell creation ensures that all projects are compatible with Art Blocks and reviewed using a standard format.","To learn more about the application process please visit artblocks.io/apply."]},{"l":"2. Upload to testnet","p":["You'll be asked to upload your project to the artist staging site on the Goerli test network. Here you can mint test outputs of your project and work out any kinks in your script before the Art Blocks selection committee reviews it.","Ensure the work has a project description that explains the work's technical, aesthetic, and conceptual approaches. Prototypes should have 20-40 mints, as well as feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. To confirm you’ve included everything in your staging shell, refer to the [Testnet Checklist] (testnet-checklist.md). Required fields are marked in testnet with a “\uD83D\uDCC4: fields required for artist screening” indication. As you are uploading to testnet, you only need to fill in fields with this indication.","Please note that all Art Blocks team members are working within US time zones, which means that there may be a delay in processing requests.","Timeline: Artist-dependent, but most artists spend about 1 week on this step"]},{"l":"3. Script test runs and project review","p":["Before Art Blocks considers projects for release, the project must be completely finished and uploaded to artist-staging.artblocks.io. All staging shells must have 20-40 mints, a project description, an artist bio, and features traits that follow the conceptual and formal logic of the collection. We are superseding the chronological queue of applications. When your project is ready for review, you must email apply@artblocks.io indicating you are ready to be considered for release.","All prototypes should be completely finished before review. The team will let you know when the work will be screened and give you a timeline for the acceptance decision.","Successful projects will go through two screenings, the first is mediated by an internal committee on the Art Blocks team, and the second is by the Art Blocks Curation Board. Art Blocks Curation Board members are responsible for reviewing, critiquing, and selecting projects included in Art Blocks’ Curated Collection, a group of projects that have been recognized for significant accomplishment in aesthetics, conceptual rigor, technical quality, and innovation. Releasing on Art Blocks is a selective process, and projects should be outstanding in their aesthetics, innovation, technical quality, and concept. We are currently accepting 10% of projects submitted to release. Artists will receive, upon acceptance to the platform, the product category under which they will release, Presents or Curated, and collection size and pricing recommendations. Artists are provided clear and constructive feedback, opportunities to engage with artists, curators and collectors to promote learning, inquiry, and dialogue with on-chain generative art, and lastly, hands-on support in marketing and writing about the work. We appreciate your patience as you wait to be reviewed, accepted, and on-boarded onto Art Blocks.","Projects are selected for release based on the criteria outlined here: Project scoring rubric v1","If your project is selected, you'll move into the Creator Terms step.","Timeline: 3-6 weeks"]},{"l":"4. Creator terms","p":["Our team will send you Art Blocks' Creator Terms via email to sign. These documents include Creator Terms and a W-9 or W-8 form that is necessary for Art Blocks to pay you artist royalties. In addition, you will be asked to complete an Artist Information Form to collate your artist bio, recent exhibitions, projects, and press. You can move forward once we have received the proper paperwork.","Timeline: Artist dependent. Typically 1-2 days"]},{"l":"5. Discord DM Created","p":["Once creator terms have been accepted, the artist will be connected with the Art Team to prepare their project for release. Curated projects will be connected with the Artistic Director for 1:1 studio visit. You will have the opportunity to incorporate feedback from the selection review before moving to mainnet.","Timeline: 7-10 days"]},{"l":"6. Finalize your script and do QA testing","p":["After you’ve received notes from the Curation Board and made final edits to your project, our team will audit your script. Art Blocks’ audit ensures the project meets the technical requirements of the platform. During the audit, your project will be checked for security concerns and consistency across different resolutions and aspect ratios will be verified. Your script can be minified for the audit.","Timeline: 5-7 days"]},{"l":"8. Finalizations and upload to mainnet","p":["Once the audit is complete, you'll move on to the mainnet finalization stage and get your project ready for launch, as either Curated or Presents.","Timeline: Artist-dependent, but most artists spend about 1 week on this step"]},{"l":"9. Finalize project logistics and schedule project launch","p":["Lock in series size, price mechanics (Dutch Auction, Linear Auction, or Fixed Price), launch date, revenue splits, and charity component for your project. For more information about price mechanics, revenue splits, and the charity component, please see our FAQs. For more information about price mechanics and the charity component, please see our FAQs. Art Blocks releases three projects weekly; due to the number of artists in our pipeline, there is often a 2-6 week runway for release. After you have scheduled your project for release, you may begin promoting the project. For tips on marketing, please see our Marketing 101. After your project is scheduled, you must complete our Cover Pages, an official record of the agreed terms. You must complete the document to receive royalty payments.","Timeline: 1-2 days"]},{"i":"9a-artist-interview-curated-projects-only","l":"9a. Artist Interview [Curated projects only]","p":["Complete an interview with the Art Team to be published the week of your project launch. This interview will highlight your background, creative history, and Art Blocks project.","Timeline: dependant on release runway"]},{"l":"10. Project Launch","p":["Congratulations, you have made it! Your project is ready to be unpaused and opened for minting. You can participate in an optional live Pre-Drop Talk on Twitter with one of our Community Team members to answer questions and chat with the community.","Timeline: typically ~4-6 weeks after the completion of Step 8"]},{"l":"11. Post-Launch","p":["After you’ve released your project, you will be asked to fill out an Art Blocks Feedback Survey. In addition to your feedback, we will inquire about your interest in being considered for commissions, partnerships, contract work, and more with our Art Blocks Engine partners. Please also report charitable donations to your mainnet DM.","You may also personalize your collection layout on OpenSea. Learn how to do so here","Post-launch, you will still have access to your shell, where you can start uploading a new project at your leisure. Once your project has been 100% minted, you may submit another project for review."]}],[{"i":"#","p":["Best Practices for Applying Artists, Non-Selection Policy"]},{"l":"Best practices","p":["Aesthetic excellence: Your project description and or satellite site should closely outline aesthetic details such as color palette and compositional types, and variability. Each output should be distinctive but also clearly connected to other outputs within the project, and their relationship to each other should be an expression of the conceptual frame of the project as a whole","Anticipate and Address Questions: Think about potential questions that the screening committees will consider about your project. For instance, if you were asked about the new ground you're trying to break with your work, what would your provisional answer be? How does it relate to, or build on, other artistic work you have done in the past? How does it relate to the work of other artists working in creative coding and blockchain technology? How does this project advance the medium of generative art? These are tough questions, but they are the curation board's criteria in reviewing projects, and anticipating line of thinking can help you provide a richer description. Don’t be afraid to keep it simple and direct.","Art Blocks is a highly selective platform, and submitting a project for consideration is a multi-step process. With careful preparation and a keen focus on specific criteria, however, you can reduce the potential intensity of the process and significantly enhance the likelihood of a successful application. Remember, the process demands an investment of your time and effort that matches the high standard of projects Art Blocks looks to release. Even if your project is not selected, a strong application can provide inroads to other opportunities in our community such as the opportunity to connect with the Art Blocks Engine, an invitation to participate in artist-specific programming, or being identified as a potential future candidate for project release and mentorship. Numerous generative artists have gotten their start with an Art Blocks release, and we maintain a steadfast commitment to discovering and promoting a diverse range of unique talents.","Articulating your artistic vision effectively is key to capturing the interest and appreciation of the Art Blocks community. Here you will find effective strategies for successful applications:","Code Meets Platform Requirements: Please read the Guidelines & Constraints section of the creator documentation to ensure your project uses the approved code libraries and the outputs are dimensionless and deterministic.","Complete your Staging Shell: After you have minted your test outputs, make sure to include a project description, an artist bio, interactivity instructions (if applicable), and feature traits that align with the conceptual and visual logic of the project.","Distinctive Position: Your project should exhibit a distinctive and personal point of view. It should be designed and produced to communicate your intention and concept, while also leaving room for the viewer to bring their interpretation of your work.","First, let’s review the basics:","Focus on your own contribution: Ensure your project doesn't merely follow coding templates but rather showcases what you have done with code. Ideally, the visual outputs and underlying concepts align and strengthen each other.","Maximize Your Space: Use your project description space to speak directly to the viewer. This can be a simple, clear bit of text that elaborates on work's distinctiveness, the new territories it explores, and how it contributes to or diverges from the broader context of generative art and computational art history. It needn’t be more than 750 words. It is also recommended that you set up a space on a satellite site, which can be linked in the project description. This satellite site will allow additional space for you to outline your project’s history and evolution. It is a great place to showcase the iteration of your ideas, source materials, and examples of different types of outputs.","Notify Art Blocks: Once you have completed steps 1-3 and feel your project is ready for review, send an email to apply@artblocks.io indicating your readiness for consideration for release. Upon receipt of your email, a member of the Art Team will confirm your submission and provide an estimated timeline for the review process.","Project Completion: Your project needs to be completely finished and uploaded to artist-staging.artblocks.io before it is screened for release consideration.. Once your algorithm has been uploaded, you will need to mint test outputs, each staging shell should have between 40 to 60 test outputs for review.","Remember, applying to release a project on Art Blocks is a multi-step process that requires creativity, technical skill, and a deep understanding of the platform's requirements and expectations. Articulating your artistic vision effectively is key to capturing the interest and appreciation of the Art Blocks community. Thank you so much for bringing you project to Art Blocks for consideration. We really look forward to seeing what you have been working on!","Score 0: The project is not visually/sonically well composed.","Score 1: The project is visually/sonically well composed.","Score 2: The project demonstrates strong aesthetic choices, cohesive design and concepts, functional and appropriate programming techniques, and clear understanding of generative and computational aesthetics and concepts.","Score 3: The project shows careful consideration of aesthetic details, such as color palette and compositional rhythm. The visuals are unique, relevant, and supportive of the project concept. Code is functional, detailed, and well-executed, integrating computation and aesthetics effectively. The project uses common generative styles to create unique aesthetics & compositional forms.","Score 4: The work exhibits emotional, intellectual, and conceptual qualities through aesthetics, and is successful from an aesthetic point of view. It showcases an authentic and original point of view, clear communication of intention and concept, and a compelling description. Code employs inventive techniques and supports the underlying concept. The project covers new ground and brings something new into the world.","Screening Process: Once we’ve verified that your project code, the test outputs, project description, artist bio, and features list as complete, your project will go through two screenings: first by an internal Art Team committee and, second,by the Art Blocks Curation Board.","Technical excellence and innovation: Your project should integrate computation and aesthetics effectively, with well-designed and executed details. Innovative, never-before-seen coding techniques will score highly in review.","Understand the Process: Familiarize yourself with the application process, which can be found at artblocks.io/apply. This portal gives you access to the Art Blocks staging environment, where you can upload your algorithm onto the test network. Please use this guide to all form fields and buttons within testnet and mainnet project environments.","Understanding the Evaluation Criteria: Familiarize yourself with the Art Blocks scoring system, which ranges from 0 to 4.","Work on Your Project Description: Your project description is your opportunity to speak on behalf of your work. It is where you can express your intentions as an artist and help viewers get a foothold in what they are looking at. It's also a place for you to offer some bigger claims about your work. Consider the new ground you have been exploring—technical, conceptual, or aesthetic. Be sure to clarify your ideas about your project's purpose, significance, and distinctiveness. This can be challenging, but providing your own perspective can help frame the interpretation of your work for the internal selection committee, the Art Blocks Curation Board, and, eventually, the audience of collectors, artist peers, critics, and curators."]},{"l":"Non-Selection Policy","p":["At Art Blocks, we highly value the creative contributions of artists and creators who submit their work for consideration. However, due to the volume of submissions we receive, and limited release slots available, we do not provide specific feedback for rejected projects.","Reasons for Non-selection:","Please note that these reasons are not exhaustive, and our screening committees carefully assess each submission based on a range of factors. While we understand that receiving specific feedback can be helpful, we are unable to provide feedback for individual cases of non-selection"]}],[{"l":"Project Form Fields Guide","p":["Below, you'll find a guide to all form fields and buttons within testnet and mainnet project environments.","⛽: fields with associated gas costs\uD83D\uDCC4: fields required for artist screening"]},{"i":"project-page","l":"Project Page:"},{"l":"Purchases Paused","p":["The Purchases Paused button is located above additional details can be used to mint on both the artist staging platform and mainnet without unpausing your project. We suggest using this method to mint token #0 and mints on testnet to avoid any accidental early mints from other collectors."]},{"l":"Edit Project","p":["The Edit Project button will lead to the back end of your shell, where you will set up your project."]},{"i":"project","l":"Project:"},{"i":"project-name","l":"Project name ⛽\uD83D\uDCC4","p":["This is the public name of your project."]},{"i":"artist-name","l":"Artist name ⛽\uD83D\uDCC4","p":["This is how your name will appear on Art Blocks. What you choose to enter here is up to your personal preference."]},{"i":"project-website","l":"Project website ⛽","p":["This field is optional. The link entered in your project website field should lead to a place that exhibits more about your presented project or your background as an artist. This can link to a page specific to your project, your website, your Instagram, your Twitter, your GitHub, or something else.","Make sure to enter a fully defined website link, including the https://"]},{"i":"project-description","l":"Project description ⛽\uD83D\uDCC4","p":["The project description is a key opportunity to highlight your intentions and provide an interpretative frame around how you want a viewer/collector to approach your project. If you are struggling with this element, we have a series of prompts to guide your first draft.• Begin with a strong, clear opening sentence.","• Lead with the artistic inquiry; what questions can be prompted or answered through this work?","• How would you describe this project to someone unfamiliar with your work?","• What inspiration, color palette influences, themes, and techniques were used?","• Examine the outputs. What can the viewer see?","• Be sure to describe any interactivity features, if applicable.","• End by summarizing how the medium, outputs, and algorithm achieve your initial inquiry or concept."]},{"i":"project-license","l":"Project license ⛽","p":["Enter the copyright license here for your art (eg. NFT License 2.0, CC BY-NC 4.0, CC BY 4.0, etc)","Art Blocks recommends selecting a license that aligns with your values as a creator."]},{"i":"token","l":"Token:"},{"l":"Sales Notes","p":["This describes project-specific sales mechanics."]},{"l":"Charitable Giving Details","p":["This is where you will describe the charitable giving component of your drop, if applicable. The majority of projects released on Art Blocks choose to earmark at least 25% for this giving opportunity, but the final figure is up to you. An example of a charitable giving description is: 25% of proceeds above the resting price will be donated to non-profit educational organizations in Arizona dedicated to protecting the Sonoran Desert and its Native culture."]},{"i":"maximum-invocations","l":"Maximum invocations ⛽","p":["This is your total project series size."]},{"i":"base-uri","l":"Base uri ⛽","p":["[Mainnet Only] If you are an artist, your project base uri field should be: https://api.artblocks.io/token/."]},{"i":"script","l":"Script:"},{"i":"script-type","l":"Script type ⛽\uD83D\uDCC4","p":["Select your script type and the version number of that dependency from the drop-down menu provided. Artists must define the library AND version (when applicable)."]},{"i":"aspect-ratio-widthheight","l":"Aspect ratio (width/height)","p":["Your project’s outputs must be dimension agnostic, meaning they will scale seamlessly to any window size. See more on this here. This field sets the aspect ratio for image renders but does not impact an output’s live view.","While you can control the aspect ratio, you will have no control over the dimensions of the browser on which your project will be viewed.","Your aspect ratio should be a single number. This will be your token’s width divided by height. For example, if your tokens are square, your aspect ratio should be 1."]},{"i":"png-render-delay","l":"PNG Render delay \uD83D\uDCC4","p":["If your piece takes a certain amount of time to render fully, you can type in the render delay to let the server know when to render your output’s static images. This render time will be in milliseconds. If your algorithm is GPU intensive, and thumbnails do not render after the render delay, request Enhanced GPU Rendering. For accepted artists, file the request in your artist DM. For applying artists, file your request in the Art Blocks’ Discord Channel #artist-application-support."]},{"i":"canvas-mode-toggle","l":"Canvas Mode (toggle) \uD83D\uDCC4","p":["If checked, data is directly pulled from the Canvas element using .toDataURL() when producing static image renders. This additional rendering mode can be leveraged for projects with varying aspect ratios across different tokens.","Please note that scripts containing multiple Canvas elements may not render as intended."]},{"i":"generate-mp4-assets-toggle","l":"Generate MP4 assets (toggle) \uD83D\uDCC4","p":["If checked, GIFs and MP4s will be generated on individual token refreshes, batch token refreshes, and new token mints. There will be a link to the MP4 under the token display component when the MP4 is created and available for that token. If checked, the MP4 render delay, MP4 duration, MP4 frame rate, and MP4 aspect ratio settings will be visible in the UI.","Please note that scripts utilizing CSS rules for transitions and animations may not render as intended."]},{"l":"MP4 Render delay","p":["The render delay in milliseconds to start animation capture for GIF and MP4 outputs."]},{"l":"MP4 Duration","p":["The total length of the MP4, between 1 and 30 seconds. Setting this does not affect GIFs, they are set to 5 seconds."]},{"l":"MP4 Frame rate","p":["The number of frames per second of the MP4. Setting this does not affect GIFs, they are set to 24 fps."]},{"l":"MP4 Aspect ratio","p":["The aspect ratio of GIF and MP4 outputs. Due to limitations with the video codec the options are 1:1, 16:9, 9:16, 3:4, and 4:3."]},{"l":"Primary display format","p":["The project's primary view asset. This setting will be reflected on token and project detail pages on Art Blocks and secondary markets. For optimized performance, select PNG or MP4 for animated projects, if outputs take a long time to render."]},{"l":"Thumbnail preview format","p":["The project's thumbnail preview asset. This setting will be reflected on grid pages on Art Blocks and secondary markets. It will also be reflected in the gallery view section on project pages within Art Blocks. For the gallery view, if the chosen asset type is MP4 or GIF, an MP4 will be displayed due to the inferior resolution of GIF in this context. If PNG is selected, the gallery view will display the PNG asset."]},{"i":"project-scripts","l":"Project scripts ⛽\uD83D\uDCC4","p":["Here, you will upload your project’s script. Your features script should be separate from your project script.","Remember, tokenData.hash is a global variable in the environment this script will live in, so you do not need to define tokenData in your script, except your script will have access to it.","If your script is big, consider minifying it. There are no limits to the total script length. That said, scripts larger than 24 kilobytes will need to be broken up into segments of 24kb. Segments can be added using the \"add script segment\" button when uploading a script. Be aware that you will have to pay transaction gas fees proportional to the size of the script upload."]},{"l":"Features","p":["For filtering and rarity (% occurrence of different features) to be accessible via the Art Blocks website, the feature fields must be added in the artist interface UI on the Art Blocks website.","There are two types of feature fields: enum and number:","For enum fields, values should be outputted as strings in your features scripts. These should be entered as comma-delimited strings with no quotation marks.","For number fields, the step size set in the feature fields is used for the step size of the slider in the filters. This step size is set in the feature fields UI, not the script, and should be on a per-field basis.","Suppose there are only a few specific numerical values. In that case, you may want to use an enum field and output the enumerated possible numeric values as strings (e.g., if the slider UI would not be the best way to navigate these features)."]},{"l":"Feature script","p":["All code required for calculating your features (including any necessary helper functions) must be defined and implemented within the single top-level calculateFeatures function.","For many artists, the process for writing your features script will likely entail starting with your project script, copying it into the calculateFeatures interface/shell found [here](features.md #features-script-interface), and then trimming it down to remove all library (e.g., p5js) references and draw functionality and instead to build the relative key-value object map for your features."]},{"i":"minter","l":"Minter:","p":["For an overview of all minters available on Art Blocks, please see the Shared Minter Suite page."]},{"i":"configuring-your-minter","l":"Configuring Your Minter ⛽\uD83D\uDCC4","p":["Go to the Minter tab within your shell and select the ‘minter for project’ drop-down menu. From that menu, select your desired MinterSuite option. [Please note that mint #0 will be created using the Set Price- ETH option.]","Once the desired minter is selected, you will be able to input and configure your minter's pricing and other relevant information, performing any necessary transactions along the way. For help determining pricing and configuration, please see the Minting on Mainnet section below."]},{"l":"Minting on Staging","p":["After you’ve uploaded your script and you’re ready to start minting, ensure your minter is set to Set Price - ETH (V4). You’ll want to set your mint price at .0 since you’re using Goerli ETH."]},{"l":"Minting on Mainnet","p":["Artists are able to claim revenue after either:","Artists are responsible for crafting their allowlist and uploading a comma-separated list of ETH addresses in a .txt or .CSV file to the artist dashboard. These wallet addresses cannot be ENS names, but list the full address of the wallet. Premint is a super helpful tool for creating an allowlist by using social channels to reach collectors, friends, family, etc. In addition, Art Blocks hosts a Python script for retrieving & snapshotting either a list of all Art Blocks token holders or the token-holders of a specific project.","Artists may use the artist dashboard to pre-select a list of allowlisted Art Blocks or Art Blocks Engine projects, of which any valid token holders will be able to purchase for the upcoming project. Note that a \"snapshot\" won't apply to this minter -- after the project has been made public, users can purchase a token from any allowlisted project and mint freely.","Automated Exponential Dutch Auction (with settlement | without settlement)","Automated Linear Dutch Auction","Based on your selected minter option, you will need to set your project price. The different pricing mechanics are outlined below.","Click the Claim Revenue button that becomes available in your artist dashboard, which will prompt you to send a transaction","Consider Exponential Dutch auction was starting at 1 ETH and lowering to 0.1 ETH over 30 minutes.","Enter your fixed price","For exponential Dutch auctions, artists specify the start time, starting price, ending price, and half-life for price drops. These auction mechanisms aim to allow collectors to achieve price discovery on the blockchain.","For linear Dutch auctions, artists will specify the starting time, starting price, ending price, and ending time of the auction. The price will then linearly decrease each block over the total auction time.","Half-life is the least intuitive of the parameters. One way to determine half-life is to think of the total duration of the auction and then work backward to find the half-life at that total time. . For example:","If the button is selected after the auction reaches resting price, but before all tokens have been sold, revenue from previous purchases will be transferred. Revenue from subsequent purchases at resting price will be distributed immediately at the time of of each purchse.","If the button is selected after the project has sold out, all revenue from the project will be distributed at the time of claim","If using an ERC20 minter, the artist will need to specify the ERC20 token address for the custom token sale.","In addition to the information below, please see the Project Pricing: Dutch Auction Settings section for more information on how to determine the appropriate pricing parameters for your auction.","Note that all current production minters support the ability to limit the number of mints on that specific minter for your project. This means that multiple minters may be used sequentially for a given project.","One way to think of an exponential auction is that the rate of price percent decrease is constant throughout the auction.","Pricing of tokens on this minter is only supported as a fixed price, in ETH.","Select Set Price - ETH, Allowlisted Users Only","Set Price - ETH, Allowlisted Users Only","Set Price - ETH, Token Holders Only","Set Price Minters (ETH | ERC20)","the dutch auction reaches resting price","The price to purchase a token is set by the artist and is the same for all purchasers.","the project’s sell out, or","This section provides an overview of how to configure your selected minters on mainnet. The Art Blocks team can assist and advise in determining the best type of minter and associated pricing parameters.","To set up an allowlist for your project:","Upload your .csv or .txt file. See info box below for more details.","Using this calculator, the half-life can be determined to be 9 minutes (540 seconds). This means every 9 minutes, the price would gradually be cut in half. After 9 minutes, the auction will reach 0.5, and after 18 minutes, the auction will reach 0.25. The price drops within those half-life steps will gradually lower every block until the auction ends, at which point the auction will remain constant at the ending price.","We ask that artists promptly collect revenue when it becomes available. To collect revenue:","We recommend leaving the mint per wallet limit to 1 for allowlist. If you would like to adjust this, please let the Art Blocks Team know."]},{"l":"Tags","p":["Tags are labels you can assign to your project. Users can now filter collections based on the following tags: animated, interactive, evolving, audio, and responsive.","You may add tags to your project in edit project on the tags button in your shell. If you’ve already released your work on Art Blocks, we encourage you to go in and add relevant tags to your project.","animated- moving image projects","interactive- projects respond to user’s input","evolving- project tokens develop gradually over time","audio- project token incorporates sound elements","responsive- project outputs scale to any screen size","If you have a suggested tag for your project that you would like to be considered, please post your suggestions in Discord in #artist-general."]},{"i":"payout","l":"Payout ⛽","p":["Projects with multiple artists can use the additional payee address field to split project payments between multiple wallets for primary and secondary sales. When a project only has one artist, the additional payee field is commonly used to manage on-chain charitable donations. The charity’s wallet can be entered in the additional payee field. The percentage entered in the additional payee field will then be directly transferred to the charity as sales are made.","Artists must propose changes to their payment addresses (and splits between primary/additional) for admin approval. Approval is granted before Mint #0"]},{"l":"Revenue splits with multiple artists","p":["For projects with multiple artists, we recommend using 0xSplits to split revenue among the group. Instructions on how to create a Split can be found here. Once you’ve created your Split, paste the address into the additional payee field. You can also include a charitable giving donation directly in the Split."]},{"l":"Propose current artist address or add a new one","p":["This address will have access to edit the project in Art Blocks’ staging environment."]},{"l":"Propose additional payee address for primary sales","p":["Input collaborator’s or charity wallet address here."]},{"l":"Propose additional payee percentage for primary sales","p":["Payout percentages are at the artist’s discretion."]},{"l":"Propose additional payee address for secondary sales","p":["Additional address that will receive a portion of secondary sales."]},{"i":"propose-additional-payee-percentage-for-primary-sales-1","l":"Propose additional payee percentage for primary sales","p":["The royalty field should be entered as a number and does not require a % symbol."]},{"l":"Understanding secondary sales","p":["Secondary marketplaces can choose if they’d like to honor the secondary market royalty amount. Please note that OpenSea does not currently honor this field. On OpenSea, artists receive 5% of all secondary sales. Because of this, for consistency, we recommend setting your secondary market royalty to 5%. Note that all secondary details are for on-chain royalties, which OpenSea is not yet supporting (but we expect that will happen soon). For OpenSea royalties, Art Blocks will redistribute secondary sales monthly.","To learn more about royalty distributions, see here."]},{"i":"danger","l":"Danger:"},{"i":"artist-address","l":"Artist address ⛽","p":["This will be the wallet address you provide to us when setting up your shell. Should you need to transfer ownership, we cannot whitelist multiple wallets. Only the address entered in the artist address field will have access to the backend of your project.","This is the address that will be used for payout."]},{"l":"Unpause","p":["When it is time for your project to go live, you will press the “Unpause” button in your mainnet shell. Once the transaction clears, your project will be live for minting."]},{"l":"On Tokens"},{"l":"Refresh Token Image","p":["This button will queue your token thumbnail to be refreshed. The refresh takes time to process fully. If a script update was successful, and live views are correct, but thumbnails haven’t refreshed, please clear your cache. If you have cleared your cache and are still not seeing the correct thumbnail view,a subgraph delay may be the reason. Stay updated on system operations at [status.artblocks.io] (status.artblocks.io).","Rendering tokens does take computing power, of which we have a limited amount. Please feel free to refresh tokens after making updates, but note that if our rendering pipeline starts clogging up requests, we may have to consider rate-limiting refresh requests. In summary, use this button when testing out updates, but avoid spamming, or things will get jammed up.","With this button, you can refresh per token. The Art BlocksTeam has the power to refresh all thumbnails in a project at once, and we are happy to do so for you. Request a batch refresh after updating your script in your artist DM. If you are still in the application queue, you may request a batch refresh in the #artist-application-support channel in Discord."]},{"l":"Details","p":["The details page is specific to each token. On the details page, you will find the token’s features and links to secondary marketplaces."]},{"l":"Image","p":["The image button will generate a PNG of the token’s thumbnail."]},{"l":"Live","p":["As a note, the live generator view will give a bad request error until the project is public. To access the live view add /?render=true to the end of the generator link. I.e. https://generator-staging-goerli.artblocks.io/0x00000000000000000/46000000/?render=true","Once a project is public, this link will function. While a project is private, live views can also be viewed on the details section of the individual token."]}],[{"l":"Minter Suite","p":["Art Blocks has migrated to a new, shared minter suite! Please see the Shared Minter Suite page for more details."]}],[{"l":"Art Blocks Features Script","p":["A guide on how to structure the features script for your Art Blocks project."]},{"l":"Features Overview","p":["All feature attributes that you want displayed should be directly generated from the transaction hash and should not depend on any other randomness.","This function should essentially encapsulate the feature-determining logic within rendering script but without any library dependencies (e.g. p5js) present (the server won't have access to them).","The function should assume that it receives the tokenData object as an input (containing both a tokenId and hash string), and should use these to return the correct desired feature metadata for a given mint.","Properly displaying your project features requires both a a) feature calculation script and b) setting the feature fields for your project in the Art Blocks website's artist interface.","Updating the features script or features fields for a given project will recalculate features for all tokens within that project."]},{"l":"Features Script Interface","p":["Important Note: All code required for calculating your features (including any necessary helper functions) must be defined and implemented within the single top-level calculateFeatures function.","For many artists, the process for writing your features script will likely entail starting with your project script, copying it into the calculateFeatures interface/shell above, and then trimming it down to remove all library (e.g. p5js) references and draw functionality and instead to build the relative key-value object map for your features."]},{"l":"Features Fields","p":["In order for filtering and rarity (% occurrence of different features) to be accessible via the Art Blocks website, the feature fields must be added in the artist interface UI on the Art Blocks website.","There are three types of feature fields: enum, number, and boolean:","For enum fields, values should be outputted as strings in your features scripts.","For number fields, the step size set in the feature fields is used for the step size of the slider in the filters. This step size is set in the feature fields UI, not in the script, and should be on a per field basis.","For boolean fields, the only values are true and false, so you just need to give the field a name.","If there are only a few specific number values expected to be output, an artist might want to use an enum field and output the enumerated possible numeric values as strings (e.g. if the slider UI would not be the best way to navigate these features)."]},{"l":"Migration From Legacy Features Arrays","p":["Previously the features for a given project were defined in a less structured way, via a script that could set a given array of features (e.g. [Palette: Rosy, Scale: Big, Tilt: 72]) to a globally available features array.","This process is being standardized for the Art Blocks V2 website and token API, which may require some involvement from artists to migrate old projects in alignment with their desires.","To simplify this process, Rev Dan Catt has provided an amazing tool to generate a features script with the new format based on the features of existing projects, which you can find at https://rarity.guide/project/{ProjectNumber}/featurescript(where {ProjectNumber} is swapped out with your project of interest).","This tool is being used to assist the Art Blocks team in attempting to automatically migrate projects, but if you are an artist with an existing project that needs to or would like to modify the output of this automated result, Rev Dan's script is a great starting place."]},{"l":"Additional Notes","p":["For future projects (that have not yet minted out, which is necessary for Rev Dan's automated migration approach), it is necessary that this data be determined based on the tokenData itself rather than just mapping the tokenId to a given existing set of features as the features cannot be known until time of mint (unless all named features are purely based on the tokenId and not the hash).","You also have the option to upload a json file to set all of your feature fields. The shape of the file should be in the following format:","On upload of the json file it will overrwrite any existing feature fields in the current form. You also are able to download your existing feature fields as a json file using the buttons found in the feature fields form."]}],[{"i":"#","p":["Frequently asked questions."]},{"l":"FAQs","p":["To suggest a question to be added, fill out this form: Creator FAQs Suggestion Box"]},{"l":"Application"},{"i":"how-can-a-generative-artist-be-published-in-art-blocks","l":"How can a generative artist be published in Art Blocks?","p":["Art Blocks has an application form that generative artists can submit. Please note that we are becoming increasingly selective, only accepting around 2% of projects submitted for release.","You can find out an application here: artblocks.io/apply","You will receive a project shell on our staging site when you apply. This project shell is where you will upload your project to Art Blocks for review. Only the wallet address connected to Art Blocks will have access to the project shell when applying. The shell creation ensures that all projects are compatible with Art Blocks and reviewed using a standard format."]},{"i":"when-can-i-expect-to-hear-back-after-i-submit-an-application","l":"When can I expect to hear back after I submit an application?","p":["When you're ready to proceed to our screening stage, please email apply@artblocks.io with a link to your staging shell. Before the screening, ensure the work has a project description that explains the work's technical, aesthetic, and conceptual approaches. Prototypes should have 40-50 mints, as well as feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. All prototypes should be completely finished before review. The team will let you know when the work will be screened and give you a timeline for the acceptance decision."]},{"i":"are-we-notified-of-the-result-acceptedrejected-or-only-if-it-is-accepted","l":"Are we notified of the result (accepted/rejected) or only if it is accepted?","p":["After you notify the team that you are ready for review by emailing apply@artblocks.io, the team will let you know when the work will be screened and give you a timeline for the acceptance decision."]},{"i":"if-i-change-my-mind-about-the-collection-i-am-trying-to-release-can-i-just-change-it-in-my-current-project-id-or-should-i-re-apply","l":"If I change my mind about the collection I am trying to release, can I just change it in my current project id, or should I re-apply?","p":["Please reuse the shell that was created upon application if you’d like to submit a new project, and this process is applied to artists who were rejected and would like to re-submit a prototype for review. Upload your new script and refresh the thumbnails to update your staging shell."]},{"i":"what-happens-after-i-apply","l":"What happens after I apply?","p":["Once you apply, you will have access to a staging shell on testnet. There, you can upload your generative script and mint test outputs. Prototypes should have 40-50 mints, a project description, and feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. When you're ready to proceed to our screening stage, please email apply@artblocks.io with a link to your staging shell. All prototypes should be completely finished before review. The Art Blocks team will give you a timeline as to when the project will be reviewed and when you will be notified whether or not your project is selected for an Art Blocks launch. Please note, we are becoming increasingly selective, only accepting 2% of projects submitted for release. Take your time in the artistic process to ensure you are bringing forth your best work."]},{"i":"i-cannot-fill-out-the-application-form-on-typeform","l":"I cannot fill out the application form on Typeform.","p":["Please note that we have moved our application to artblocks.io/apply. You will receive a project shell on our staging site when you apply. This project shell is where you will upload your project to Art Blocks for review. Only the wallet address connected to Art Blocks will have access to the project shell when applying. The shell creation ensures that all projects are compatible with Art Blocks and reviewed using a standard format."]},{"i":"how-do-i-know-the-application-period-to-send-my-first-work","l":"How do I know the application period to send my first work?","p":["Applications will remain open indefinitely. To learn more about the application process, visit artblocks.io/apply."]},{"i":"what-is-the-process-for-submitting-my-first-work","l":"What is the process for submitting my first work?","p":["You may apply using this application form."]},{"i":"i-received-a-link-to-upload-my-prototype-but-its-not-working-what-should-i-do","l":"I received a link to upload my prototype, but it's not working; what should I do?","p":["Clear your cache and ensure you are connected to the wallet you applied with and using the Goerli test network."]},{"i":"at-the-time-of-submission-i-did-not-put-a-project-preview-if-i-do-it-now-does-it-restart-the-application-process-to-zero-can-it-help-in-the-process","l":"At the time of submission, I did not put a project preview. If I do it now, does it restart the application process to zero? Can it help in the process?","p":["Applications are logged in chronological order in our database. You will let us know that your prototype is ready to be reviewed for release by emailing apply@artblocks.io. Before the screening, ensure the work has a project description that explains the work's technical, aesthetic, and conceptual approaches. Prototypes should have 40-50 mints, a project description, and feature traits. Also include an artist profile and links to any ancillary material about the work on the project page. All prototypes should be completely finished before review."]},{"l":"Staging"},{"i":"is-it-possible-to-see-my-project-without-being-connected-to-my-wallet-so-i-can-test-it-across-different-devices-and-browsers-without-connecting","l":"Is it possible to see my project without being connected to my wallet? So I can test it across different devices and browsers without connecting?","p":["No, this is not currently possible. You'll need to be signed in with your wallet to access your project. You can however view live view links without being connected to a wallet. To view a live view link while your shell is private, add ?render=true/ to the end of the URL."]},{"i":"what-is-the-mintersuite-and-how-does-it-work","l":"What is the MinterSuite, and how does it work?","p":["The MinterSuite allows artists to set specific minting contracts on a per-project basis. The MinterSuite currently includes the following minter options, which will continue to be expanded over time:","Set Price - ETH is used for fixed price releases.","Automated Exponential Dutch Auction: For exponential Dutch auctions, artists specify the starting price, ending price, and the half-life for price drops.","Automated Linear Dutch Auction: For linear Dutch auctions, artists will specify the starting price, ending price, starting time, and ending time of the auction. The price will then gradually decrease each block over the total auction time.","Set price in custom ERC20: Set price in ERC20 is a fixed price for your sale with a custom token. Artists will specify the address for the custom token sale.","Set Price - ETH, Allowlisted Users Only (V1) these are addresses that are allowed to mint as many times as they want until they reach the mint limit (artists sets mint/wallet)","To find out how to set your project price using the MinterSuite visit this page."]},{"i":"the-documentation-states-that-only-one-external-library-can-be-used-and-then-there-is-a-list-of-some-libraries-im-unsure-if-this-is-the-list-of-libraries-allowed-to-use-or-only-examples-of-popular-libraries-can-i-for-example-use-a-game-engine-library-that-is-not-on-that-list","l":"The documentation states that only one external library can be used, and then there is a list of some libraries. I’m unsure if this is the list of libraries allowed to use or only examples of popular libraries. Can I, for example, use a game engine library that is not on that list?","p":["Everything on the limited dependencies list in our Creator Documentation is compatible with the platform. See here: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/#limited-dependencies"]},{"i":"i-have-opened-my-shell-on-the-staging-site-but-cannot-upload-sample-outputs-of-my-prototype","l":"I have opened my shell on the staging site but cannot upload sample outputs of my prototype.","p":["You must first upload your prototype script and then mint test outputs. Learn how to mint without unpausing your project here: https://docs.artblocks.io/creator-docs/creator-onboarding/testnet-checklist/#test-minting"]},{"i":"is-it-possible-to-create-a-project-on-the-site-without-a-library-code-is-it-possible-to-do-a-project-based-on-ipfs-or-should-everything-be-generated-exclusively-on-art-blocks","l":"Is it possible to create a project on the site without a library code? Is it possible to do a project based on ipfs, or should everything be generated exclusively on Art Blocks?","p":["All Art Blocks work is completely on-chain. Artists must upload their technically-compatible project scripts to their staging shell to produce a collection. All projects must use the limited dependencies outlined in our Creator Documentation: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/#limited-dependencies"]},{"i":"my-script-works-and-is-shown-in-explore-possibilities-but-my-test-mints-are-not-showing-the-console-is-showing-many-nextjs-script-errors-any-suggestions-could-it-be-my-scripts-fault","l":"My script works and is shown in \"Explore Possibilities,\" but my test mints are not showing. The console is showing many NextJs script errors. Any suggestions? Could it be my script's fault?","p":["Your script must be the same version of the limited dependencies accepted by the platform.","Consider using this starter template, which gives you an environment similar to Art Blocks: https://github.com/ArtBlocks/artblocks-starter-template"]},{"i":"where-do-i-add-my-public-files-in-the-staging-environment-html-css","l":"Where do I add my public files in the staging environment (html, CSS)?","p":["You only need to submit the prototype script, then you can choose a library in the script tab of the edit project which will add the container(canvas) and the script import."]},{"i":"there-is-a-difference-between-my-thumbnails-and-the-live-views","l":"There is a difference between my thumbnails and the live views.","p":["Randomness becomes deterministic when it's seeded, which is what's happening with the Art Blocks token data and suggested Random class. Once initialized, all calls to the random_dec method must remain consistent. Resolving anything random before starting to draw is handy in that regard, plus you'll also need to provide that code for the calculateFeatures function.","If you're getting inconsistent outputs, the first thing would be to ensure there's no any forgotten Math.random() in your code and that your token data looks okay."]},{"i":"my-artwork-depends-on-some-deterministic-random-function-calls-and-features-depend-on-it-in-the-staging-environment-the-features-script-is-completely-separated-from-the-artwork-script-how-can-i-calculate-the-features-the-only-solution-i-can-see-is-to-rewrite-the-random-calls-in-the-feature-script-in-the-same-order-they-are-called-in-the-artwork-script-any-different-simpler-and-safer-approach-to-suggest-me","l":"My artwork depends on some deterministic Random function calls, and features depend on it. In the staging environment, the features script is completely separated from the artwork script. How can I calculate the features? The only solution I can see is to rewrite the random calls in the feature script in the same order they are called in the artwork script. Any different, simpler, and safer. approach to suggest me?","p":["You will rewrite the random calls in the feature script in the same order they are called in the artwork script. More info here: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/features/"]},{"i":"i-set-up-the-features-types-and-options-in-my-staging-shell-and-copied-my-original-code-into-the-calculate-features-section-removed-all-the-p5js-drawing-then-set-it-up-to-build-key-value-pairs-right-now-i-have-the-key-value-pairs-being-assigned-to-an-object-called-features-how-do-i-get-the-script-to-return-the-right-object-the-code-isnt-giving-me-any-errors-but-no-features-appear-when-i-look-at-the-mints","l":"I set up the features, types, and options in my staging shell, and copied my original code into the Calculate Features section, removed all the p5.js drawing, then set it up to build key-value pairs. Right now, I have the key-value pairs being assigned to an object called \"features.\" How do I get the script to return the right object? The code isn't giving me any errors, but no features appear when I look at the mints.","p":["You should have the function return the dictionary with the features iirc, using the syntax return {object name}. If the problem still occurs, clear your cache. There may also be an authentication issue, so log out and log back into your wallet."]},{"i":"can-i-visually-verify-my-code-is-working-properly-through-the-art-blocks-staging-platform","l":"Can I visually verify my code is working properly through the Art Blocks staging platform?","p":["If you can mint test outputs successfully, your script will likely be compatible with the platform. Check out our technical documentation here: https://docs.artblocks.io/creator-docs/creator-onboarding/readme/#documentation"]},{"i":"where-is-the-mint-button-do-we-have-to-set-a-price","l":"Where is the mint button? Do we have to set a price?","p":["Learn how to mint without unpausing your project here: https://docs.artblocks.io/creator-docs/creator-onboarding/testnet-checklist/#test-minting"]},{"l":"Artist Pipeline"},{"i":"what-are-the-steps-in-the-process-and-how-do-i-know-when-ive-completed-them","l":"What are the steps in the process and how do I know when I've completed them?","p":["Please see Artist Onboarding Steps for a more detailed overview of the onboarding process."]},{"i":"approximately-how-long-will-each-step-of-the-process-take","l":"Approximately how long will each step of the process take?","p":["Once a project is accepted for release, it will take approximately 1-2 months to finalize your project on testnet, submit it for curation review, upload the script on mainnet, schedule a launch date, and finally release the project. The length of each step differs and depends somewhat on how quickly you, the artist, finalize your scripts. Please see our Artist Onboarding Steps for more information about the timeline of each step."]},{"i":"who-can-i-reach-out-to-if-i-have-questions","l":"Who can I reach out to if I have questions?","p":["For questions related to your application, please post your inquiry in #artist-applications. You may also use the #help channel"]},{"l":"Curation Review"},{"i":"what-are-the-general-standards-for-achieving-curation-status","l":"What are the general standards for achieving curation status?","p":["The Curated Collection is a group of projects that pushes the boundaries of Generative Art. A project in the Curated Collection covers new territory using code that employs inventive, never-before-seen techniques to support an original intention and concept. Board members look for collections that evoke emotional, intellectual, and conceptual qualities through aesthetics while sustaining the viewer’s interest."]},{"i":"are-rarities-judged-as-a-metric-for-curation","l":"Are rarities judged as a metric for curation?","p":["Rarities aren't included as a metric for determining curation status. However, the overall variety of a collection is important so that the project contains diversity over the course of a large number of mints."]},{"i":"will-i-receive-feedback-from-the-curation-board-on-my-submissions","l":"Will I receive feedback from the curation board on my submissions?","p":["Feedback from the Curation Board will be provided. The goal of this feedback will be to highlight observations that our Curation Board made about your current project upon their review."]},{"i":"who-is-on-the-curation-board","l":"Who is on the curation board?","p":["Art Blocks has invited individuals to our Curation Board based on their expertise, passion for the evolution and growth of on-chain generative art, and their industry leadership.","You can read more about the Curation Board here."]},{"l":"Technical Requirements"},{"i":"are-all-browsers-supported-for-art-blocks-drops-is-mobile-supported","l":"Are all browsers supported for Art Blocks drops? Is mobile supported?","p":["All modern browsers are supported (including mobile), though you may run into issues using Internet Explorer. We recommend using Browserstack https://www.browserstack.com/ to test across devices."]},{"i":"do-i-need-to-know-solidity-to-write-my-own-smart-contract","l":"Do I need to know Solidity (to write my own smart contract)?","p":["No. Art Blocks handles all of that for you. All you need to create is the artwork."]},{"i":"can-i-load-external-assets-into-my-project-textures-audio-etc","l":"Can I load external assets into my project (textures, audio, etc)?","p":["Not at this time. Currently, everything must be included in the script file. For small and critical assets, you may be able to use base-64 encoding to encode the asset into your script, but that will count as data to be stored."]},{"i":"can-i-use-text-what-fonts-can-i-use","l":"Can I use text? What fonts can I use?","p":["You can use text in your project! Font choice is technically at your discretion, but you're encouraged to embed them in your scripts directly or use the core web fonts to ensure universal support and maintain the piece's integrity over the longer term. ( serif, sans-serif, monospace, and less commonly, cursive and fantasy.)"]},{"i":"what-are-the-minimum-hardware-requirements-what-type-of-graphics-card-do-i-need","l":"What are the minimum hardware requirements? What type of graphics card do I need?","p":["Any computer with an internet connection will work! No special graphics cards are required."]},{"l":"Uploading Your Script to Mainnet"},{"i":"how-much-money--eth-do-i-need-to-upload-my-project","l":"How much money / ETH do I need to upload my project?","p":["The cost depends on the complexity of your project and how many lines of code it requires. See here for more specific information about how to budget for a drop."]},{"i":"my-project-is-uploaded-and-ready-to-go-how-do-i-mint-my-first-output","l":"My project is uploaded and ready to go. How do I mint my first output?","p":["You can use the “Purchases Paused” button to mint both on the artist staging platform and mainnet without unpausing your project. We suggest using this method to mint Token #0 to avoid any accidental early mints."]},{"i":"are-there-limits-on-script-length","l":"Are there limits on script length?","p":["If your script is big, consider minifying it. There are no limits to the total script length. That said, scripts that are larger than 24 kilobytes will need to be broken up into segments of 24kb. Segments can be added using the \"add script segment\" button when uploading a script. Be aware that you will have to pay transaction gas fees proportional to the size of the script upload."]},{"i":"does-the-size-include-the-library-that-im-using","l":"Does the size include the library that I'm using?","p":["No, the library you use is not stored on-chain with your project. A script tag linking to a CDN hosting the library you choose will be injected into the window scope when the project runs."]},{"l":"Preparing for your drop"},{"i":"what-information-will-i-need-to-provide-about-my-project","l":"What information will I need to provide about my project?","p":["If your project is selected for a drop on Art Blocks, you'll need to have the following information ready. This is typically collected near the end of the process, so you'll have time to make these decisions as you're onboarding."]},{"i":"can-i-share-information-about-my-drop-on-social-media-before-its-announced","l":"Can I share information about my drop on social media before it's announced?","p":["Once you finalize a drop date with the Art Blocks team, you're welcome to share and promote your drop on all social media! We have created a Marketing 101 document to support your efforts in the lead-up to your drop."]},{"i":"when-will-i-know-when-my-drop-is-scheduled-when-will-the-drop-be-announced","l":"When will I know when my drop is scheduled? When will the drop be announced?","p":["Once your application is approved, it takes approximately 6-8 weeks to reach a launch date for your project. You'll work closely with our team to schedule a drop date, which typically will be about 2 weeks after your project is finalized on mainnet. Every Friday, our team announces the following week's projects in the Discord channel, #upcoming-projects."]},{"i":"can-i-mint-pieces-of-my-own-artwork-how-many","l":"Can I mint pieces of my own artwork? How many?","p":["All artists on Art Blocks will mint the first piece (mint #0) of the collection for themselves. If you collaborated with other artists, you can each mint one of the first outputs before the project goes live.","If you're dropping in the Presents category and you'd like to mint more pieces of the collection (for gifts or giveaways), let us know in your artist DM. If you’d like to mint more than just Mint #0, wee ask that you clearly communicate why you're minting more than one to the community."]},{"l":"Price Mechanics"},{"i":"how-should-i-price-my-artwork","l":"How should I price my artwork?","p":["Once you near the finalization of your project, you'll be in close dialogue with our team about how to price your work. We have a Project Pricing Model that guides the decision on the pricing of Art Blocks collections."]},{"i":"what-percent-of-secondary-royalty-sales-do-artists-receive","l":"What percent of secondary royalty sales do artists receive?","p":["As an artist, you should be aware of recent changes in royalty rate determination at OpenSea and Blur, which have resulted in a range of royalty payment percentages (from 0% to 5%). Due to this change, we've had to adjust our royalty payout calculations.","We've chosen to uphold the same royalty split ratio between our Artists and Art Blocks (2/3 for the Artist and 1/3 for Art Blocks). Art Blocks handles the distribution of royalty payments received from marketplaces that do not offer direct splits through the Royalty Registry, following an internal review of secondary sales transactions.","If you have any questions regarding this updated split methodology or information regarding royalty payouts, please post in #artist-general on Discord."]},{"i":"how-can-i-customize-revenue-splits","l":"How can I customize revenue splits?","p":["Setting up revenue splits can be done through the Payout fields in your project form. You can use the additional payee field within the form directly to send a portion of the revenue to that account. Many artists use this to make a charitable donation. To split revenue with more than one account, we recommend using 0xSplits. Instructions on how to create a Split can be found here. Once your Split is created, paste the address into the additional payee field."]},{"i":"do-you-have-access-to-historical-data-of-other-art-blocks-sales","l":"Do you have access to historical data of other Art Blocks sales?","p":["There are a few helpful tools for this:","https://artacle.io/","This resource has most Art Blocks projects and will show the distribution of sales for Dutch Auctions.","https://rarity.guide/","This focuses on the rarity of mints per project, the time between mint #2, and the rate of sales."]},{"l":"Charitable Giving"},{"i":"what-is-art-blocks-commitment-to-charitable-giving","l":"What is Art Blocks' commitment to charitable giving?","p":["To maintain our commitment to charitable giving, we ask artists to consider donating 25% of sales above the resting price via Dutch auction to a charity of their choice. If you elect to participate in this way, please determine your chosen charity, and confirm its eligibility, before mint #0. To whom and how you donate is entirely up to you. Art Blocks does not require you to donate any proceeds in order to engage with our platform. If you do elect to donate to a charity, it is advisable to consider whether the charity which you choose to support qualifies under United States tax law to receive tax-deductible donations. If your project designates only one primary wallet, you may use the additional payee field to manage on-chain donations. All revenue may also be routed to a single wallet and donated after your drop. We encourage you to consult with a tax professional to understand any potential tax implications of your planned giving, as these can be widely variable."]},{"i":"where-can-i-find-a-list-of-charities-that-accept-crypto-donations","l":"Where can I find a list of charities that accept crypto donations?","p":["To find a list of charities, you can ask for advice in #artist-general and check the pinned messages for a charity guide.","If the charity you’d like to donate to is not set up to receive crypto donations, we recommend checking out endaoment.org or CryptoForCharity.io. They both enable on-chain donations to any US-based 501c(3). Endaoment uses a Donor Advised Fund (DAF) model and has a 1.5% fee; CryptoForCharity sends the gifts on as they're made and is zero fee. This method can also be done fully on-chain, so the donations go directly to the charity, as opposed to going through the project’s designated primary wallet. Please note: different methods of distribution can have different tax implications, and Art Blocks advises every artist to consult with a tax professional when making these plans.."]},{"i":"how-can-i-donate-to-charity","l":"How can I donate to charity?","p":["Here are a few donation options:","1) On-chain donations through Endaoment.org","Endaoment is a 501(c)(3) organization that accepts crypto and distributes donations to any US-based 501(c)(3) charity in good standing with the IRS. Donations through Endaoment are set at the contract level and automatically routed at the time of payment without touching your wallet (potentially avoiding tax liability/deductibility).","To use Endaoment, go to Endaoment.org, connect your wallet and create a fund. Then, enter your fund's contract address (shown on your newly created fund page) in the additional payee field. If using the additional payee field for donations, this field can be cleared before lowering to resting price. Many artists prefer this route so they can support multiple charities with smaller donations rather than a single charity with one large donation, but you can also set up organization as additional payee directly. In this case, go to Endaoment.org, use their search bar to locate the org in question, and copy the contract address directly from the organization's profile page to the payee field (you can do this for multiple charities if desired). If the organization(s) shows as 'Not Deployed', simply click 'Deploy' to create a smart contract for that nonprofit. When that process completes, a contract address will populate on the organization's profile page. After the mint concludes, contact Dan (Druid#4611 on Discord) with your fund’s URL or smart contract address. Endaoment will then process contributed ETH into USDC, allowing you to send donations in any amount to any charity in the US using their UI. Please note - Endaoment charges 1.5% to receive, convert, and distribute money to nonprofits.","You can also find a tutorial of how to use Endaoment here, can find direct support in their Discord server here by creating a ticket in the #\uD83D\uDE4B|get․help channel, and can read up on their documentation here.","2) Make a zero-fee on-chain donation with CryptoforCharity.io","CryptoForCharity is a zero-fee platform enabling donations in crypto assets directly to charity. You can support any US-based 501(c)(3) charity in good standing with the IRS, or donate to any of several cause funds focused on a specific issue.","Donations through CryptoForCharity are set at the contract level and automatically routed at the time of payment without touching your wallet (and potentially avoiding tax liability or the need to account for and deduct the income/donation). Donated funds can also be held for a short time following your drop, if you'd prefer to designate the charity or cause fund you wish to support after the fact, but they cannot be held indefinitely.","Generating a charity or cause fund wallet is straightforward -- simply fill out the form here. You can also reach out directly to SimonSays#0670 in the AB discord for help.","For a bit more on how it's set up under the hood, CryptoForCharity put together this tax guidance for NFT creators.","3) Create a second wallet","If you’d like to create a second wallet separate from your personal wallet, you can enter the wallet's address in the additional payee field to collect the total donation amount you intend to donate. If using the additional payee field for donations, this field can be cleared before lowering to resting price.","4) Receive funds in your primary wallet","If you’d like to receive all funds from your project’s sale in your primary wallet, that’s fine, but please communicate the total donations with Art Blocks and the community. Please be aware that receiving money in your personal wallet may incur tax obligations and reduce the total donation amount."]},{"i":"how-do-i-remove-charitable-giving-information-from-the-additional-payee-field-mid-dutch-auction","l":"How do I remove charitable giving information from the additional payee field mid-Dutch Auction?","p":["If charity information is entered as an additional payee field and you would like to remove this information prior to decreasing your tier below 0.25 ETH, please adjust the additional payee field to either 0x0000000000000000000000000000000000000000 or to your own wallet address and adjust the additional payee percentage to 0% before submitting the next price tier. These fields cannot be blank once the dutch auction has begun."]},{"i":"what-has-art-blocks-donated-to-charity-in-the-past","l":"What has Art Blocks donated to charity in the past?","p":["To learn more about Art Blocks commitment to charitable giving, see our Charity on Chain: 2021 Wrap-Up."]},{"l":"Security"},{"i":"where-can-i-learn-more-about-best-practices-for-security-including-hardware-wallets","l":"Where can I learn more about best practices for security, including hardware wallets?","p":["We recommend that all users have a hardware wallet that they use to interact with MetaMask.","You can learn more about security in the NFT space here(how to keep your collection safe) and here(how to avoid scams).","You can also check out our After Dinner Mints episode dedicated to security!"]},{"l":"Artist Community"},{"i":"is-there-a-place-i-can-connect-with-other-artists-and-chat","l":"Is there a place I can connect with other artists and chat?","p":["All artists are added to the artist-exclusive #artist-general channel in Discord, where you can interact with other Art Blocks artists, share projects, and ask questions. We encourage artists to participate in our Discord community. In addition, Art Blocks hosts a weekly Office Hours. This dedicated time is the place for artists to chat synchronously, meet the Art Blocks team, participate in artist development-focused programming, and group critiques. If your project has been chosen for an Art Blocks Curated release, we will establish a dedicated artist’s Discord channel for you to centralize discussions of that project. For all artists releasing on Art Blocks, , the #block-talk channel is a great place to interact with fellow artists, collectors, and community members."]},{"l":"Post-Drop"},{"i":"how-long-do-i-need-to-wait-before-releasing-a-project-through-art-blocks-again","l":"How long do I need to wait before releasing a project through Art Blocks again?","p":["When an artist’s project is 100% minted (i.e. “complete”), the artist is eligible to submit a new project for screening. Please note: there is a six month “cool-off” period after a Curated project is complete before the artist may submit another project for consideration as Curated.."]},{"i":"will-i-have-access-to-my-testnet-shell-after-i-release-my-project","l":"Will I have access to my testnet shell after I release my project?","p":["Yes. Please note, as of Aug 2, 2022, Art Blocks switched testing networks from Ropsten to Goerli.","If you previously had a testnet shell on the Ropsten network, you may still access your project shell using https://ropsten-artist-staging.artblocks.io/ as a read-only set of data. If you are a returning artist, please write in your artist DM, or in #artist-general."]},{"i":"what-is-the-process-upon-returning-to-art-blocks-as-a-non-curated-artist","l":"What is the process upon returning to Art Blocks as a non-Curated artist?","p":["After your project is completed, you will be eligible to submit a new project for screening consideration. You will continue to have access to your testnet shell. New projects can be submitted for review either via a working prototype or via your existing testnet shell, to which you will continue to have access. To submit a new project for screening by sending a message to your Artist DM.","The first screening determines if a work is accepted onto the platform. A committee made up of Art Blocks' staff and generative art experts conducts this screening. This review focuses on overall aesthetics, mint variety, and the degree to which a project explores new territory technically, visually, and conceptually. Returning artists are still subject to the highly-selective screening process.","If the work is accepted to be released on Art Blocks you will then move through the same onboarding process as your previous project, which is also outlined here."]}],[{"i":"#","p":["OpenSea Personalization"]},{"l":"OpenSea Personalization","p":["Artists will now automatically be added as editors to their Art Blocks project's OpenSea collection! Collection access will be based on the wallet address that created each collection (the same as the wallet in the artist address field under the danger tab in the back end of your AB project). Artists will not have access to adjust royalty information or payment token options. To maintain consistent branding across AB collections, collection banner images will revert to AB’s default image if adjusted."]},{"i":"please-read-the-following-to-understand-the-os-field-and-what-you-may-adjust","l":"Please read the following to understand the OS field and what you may adjust:"},{"l":"Logo image","p":["This image will also be used for navigation. 350 x 350 recommended. this should be a mint from your project or a branded logo for your project. OS accepts gifs as logo images, so this can be animated!"]},{"l":"Featured image","p":["This image will be used for featuring your collection on the homepage, category pages, or other promotional areas of OpenSea. 600 x 400 recommended. This should be a mint from your project or a branded logo for your project. OS accepts gifs as featured images, so this can be animated!"]},{"l":"Banner image","p":["This field cannot be altered by artists. while you can submit an alternative banner image, your banner image will revert to Art Blocks’ default banner once submitted. This is to maintain consistency across AB collections."]},{"l":"Project description","p":["We ask that you do not change your project description. project descriptions currently match the descriptions entered in your Art Blocks project shells. To maintain consistency between AB and OS, please keep your collection’s project description."]},{"i":"social-connections","l":"Social connections:","p":["Twitter (optional): feel free to connect your Twitter handle to your collection","Links: personal website: keep this link as your Art Blocks project link. This is important for maintaining a connection to your collection page on Art Blocks. Please do not change this link to your website.","Discord (optional): if you have a personal discord server, include the link here. You can also link to Art Blocks’ Discord server by adding /artblocks","Instagram handle (optional): add your Instagram handle here","Medium handle (optional): add your Medium handle here","Telegram handle (optional): add your Telegram handle here"]},{"i":"display-theme-paddedcontainedcovered","l":"Display theme (padded/contained/covered)","p":["For consistency across collections, please keep this setting contained."]},{"l":"Toggling attribute-based collection","p":["Allow people to make collection offers based on a specific attribute. You may turn this on if you’d like once your collection is sold out/once your attributes are finalized and won't change in the future."]}],[{"i":"#","p":["Charitable Donation Information"]},{"l":"Charitable Donation Information","p":["To maintain our commitment to charitable giving, we ask artists to consider donating a portion of artist proceeds to an eligible charity of their choice. To whom and how you donate is up to you but you should consider whether the charity or the cause you are donating to qualifies under United States tax laws as a charity/cause that is qualified to receive tax-deductible donations. We highly recommend consulting with a tax professional to understand your local tax liability, especially if you plan to personally receive all funds before donating. Below answers a number of common questions about how to donate and where to find crypto-friendly charities."]},{"i":"where-can-i-find-a-list-of-charities-that-accept-crypto-donations","l":"Where can I find a list of charities that accept crypto donations?","p":["To find a list of charities, you can ask for advice in #artist-general and check the pinned messages for a charity guide.","If the charity you’d like to donate to is not crypto-friendly, we recommend checking out endaoment.org. They are a 501(c)(3) that enables on-chain donations to any US-based 501(c)(3) via a Donor Advised Fund (DAF). This method can also be done fully on-chain, so the donations never touch your personal wallet."]},{"i":"how-can-i-donate-to-charity","l":"How can I donate to charity?","p":["Here are a few donation options:","1) On-chain donations through Endaoment.org","Endaoment is a 501(c)(3) organization that accepts crypto and distributes donations to any US-based 501(c)(3) charity in good standing with the IRS. Donations through Endaoment are set at the contract level and automatically routed at the time of payment without touching your wallet (potentially avoiding tax liability/deductibility).","To use Endaoment, go to Endaoment.org, connect your wallet and create a fund. Then, enter your fund's contract address (shown on your newly created fund page) in the additional payee field. If using the additional payee field for donations, this field can be cleared before lowering to resting price. Many artists prefer this route so they can support multiple charities with smaller donations rather than a single charity with one large donation, but you can also set up organization as additional payee directly. In this case, go to Endaoment.org, use their search bar to locate the org in question, and copy the contract address directly from the organization's profile page to the payee field (you can do this for multiple charities if desired). If the organization(s) shows as 'Not Deployed', simply click 'Deploy' to create a smart contract for that nonprofit. When that process completes, a contract address will populate on the organization's profile page. After the mint concludes, contact Dan (Druid#4611 on Discord) with your fund’s URL or smart contract address. Endaoment will then process contributed ETH into USDC, allowing you to send donations in any amount to any charity in the US using their UI. Please note - Endaoment charges 1.5% to receive, convert, and distribute money to nonprofits.","You can also find a tutorial of how to use Endaoment here, can find direct support in their Discord server here by creating a ticket in the #\uD83D\uDE4B|get․help channel, and can read up on their documentation here.","2) Make a zero-fee on-chain donation with CryptoforCharity.io","CryptoForCharity is a zero-fee platform enabling donations in crypto assets directly to charity. You can support any US-based 501(c)(3) charity in good standing with the IRS, or donate to any of several cause funds focused on a specific issue.","Donations through CryptoForCharity are set at the contract level and automatically routed at the time of payment without touching your wallet (and potentially avoiding tax liability or the need to account for and deduct the income/donation). Donated funds can also be held for a short time following your drop, if you'd prefer to designate the charity or cause fund you wish to support after the fact, but they cannot be held indefinitely.","Generating a charity or cause fund wallet is straightforward -- simply fill out the form here.","For a bit more on how it's set up under the hood, CryptoForCharity put together this tax guidance for NFT creators.","3) Create a second wallet","If you’d like to create a second wallet separate from your personal wallet, you can enter the wallet's address in the additional payee field to collect the total donation amount you intend to donate. If using the additional payee field for donations, this field can be cleared before lowering to resting price.","4) Receive funds in your primary wallet","If you’d like to receive all funds from your project’s sale in your primary wallet, that’s fine, but please communicate the total donations with Art Blocks and the community. Please be aware that receiving money in your personal wallet may incur tax obligations and reduce the total donation amount."]},{"i":"how-do-i-remove-charitable-giving-information-from-the-additional-payee-field-mid-dutch-auction","l":"How do I remove charitable giving information from the additional payee field mid-Dutch Auction?","p":["If charity information is entered as an additional payee field and you would like to remove this information prior to decreasing your tier below 0.25 ETH, please adjust the additional payee field to either 0x0000000000000000000000000000000000000000 or to your own wallet address and adjust the additional payee percentage to 0% before submitting the next price tier. These fields cannot be blank once the dutch auction has begun."]},{"i":"what-has-art-blocks-donated-to-charity-in-the-past","l":"What has Art Blocks donated to charity in the past?","p":["To learn more about Art Blocks commitment to charitable giving, see our Charity on Chain: 2021 Wrap-Up."]}],[{"i":"#","p":["Community Agreements"]},{"l":"Community Agreements","p":["These community guidelines have been inspired by BUFU By Us For Us, Flatbush Mixtape, Binch Press (BP), and Queer.Archive.Work (QAW) Community Agreements.","The aim of having community agreements is to provide a space that is welcoming, comfortable, inspiring, and beneficial for all. Using such practices and tools we can challenge ourselves and each other while still recognizing that we all contribute unique knowledge and experience, while hopefully creating a positive impact on our community/ies.","We respect the diversity of identities including gender, pronouns, race, nationality, immigrant status, religious background, disability status, work experiences, and other vibrant multi-faceted aspects of who we are. We honor each other's boundaries and communicate with care. Withhold unsolicited advice, and assumptions about other participants, and agree to disagree. Comment only from your own perspective, don’t interrupt others, and be mindful to allow time for others to speak. Please feel empowered to move up to take up more space, if that’s not your tendency. Move back to allow others to speak who might not be as heard, and listen with respect.","This is a consent-forward space, virtually and in-person. We commit to being accountable to one another. We strive to make our spaces safe and inclusive. If anyone is feeling disrespected or unsafe at any time, we hope you feel comfortable speaking directly with a member of Art Block’s team who is present to support our community’s comfort in this space. And to that end, we acknowledge these guidelines are a work in progress and welcome your suggestions and feedback."]},{"l":"Hard NOs","p":["No anti-Blackness. No violence, threats of violence, or violent language directed against another person. No sexist, racist, homophobic, transphobic, xenophobic, ableist, fat-shaming, or otherwise discriminatory jokes and language. No personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. No inappropriate physical contact. No unwelcome sexual attention. This includes sexualized comments or jokes, inappropriate touching, groping, and sexual advances. No deliberate intimidation, stalking or following (online or in-person). No “one-upping” or uninvited interruptions. No advocating for, or encouraging, any of the above behavior."]}],[{"i":"#","p":["Guide to Art Blocks’ Discord Server"]},{"l":"Discord"},{"i":"what-is-discord","l":"What is Discord?","p":["Discord is a free communications app that lets users share voice, video, and text chat with friends and various communities. Historically, its largest use case has been gaming-related but now with over 150 million monthly active users, the communities have blossomed across technology, art, music, investing universities, and fashion.","If you’re brand new to Discord, reviewing this Beginner’s Guide may be helpful as you set up your account."]},{"i":"why-does-art-blocks-use-discord","l":"Why does Art Blocks use Discord?","p":["Art Blocks Discord server is a virtual real-time hub for the Art Blocks community. Our server hosts over 46,000 members who collect, discuss, and learn about Art Blocks and generative art on a daily basis. It allows us to organize information into relevant and easily searchable topics and help artists connect directly with their collectors. Discord also allows for neat Bot integrations that keep the community safe and engaged such as Sales reporting and our own custom Bot, ArtBot!"]},{"i":"how-is-our-server-organized","l":"How is our Server organized?","p":["Our server is subdivided into various Category topics and beneath those Channel topics. Major Categories include Announcements, Info, Social, Trading, and Curated Artists. Some of these are read-only (Announcements & Info) but most allow for active communication. Additionally, as an Artist, you will have access to private Discord channels to receive updates from the Art Blocks team and connect with other Art Blocks artists! There are a large number of channels so don’t worry if it takes some time to become orientated."]},{"i":"as-an-artist-in-what-channels-should-i-be-spending-my-time","l":"As an artist, in what channels should I be spending my time?","p":["Wherever you enjoy! But we have some special channels for you as well as advice on engaging with the community:"]},{"i":"artist-announcements","l":"#artist-announcements","p":["This is for all Art Blocks artists to share announcements regarding an upcoming Art Blocks drop. Additionally, an artist may post a message if they are sharing info on physical mints, have upcoming exhibits, or an external site with an explanation of a project, cutting the total # of mints/setting the last day for their project to be open."]},{"i":"artist-general-private","l":"#artist-general (private)","p":["General discussion for Art Blocks artists. Most private updates from the team will be shared here too."]},{"i":"artist-tech-private","l":"#artist-tech (private)","p":["Tech-focused discussion for artists."]},{"i":"artist-project-feedback-private","l":"#artist-project-feedback (private)","p":["Channel for feedback from other artists on your Art Blocks works in progress."]},{"i":"curated-artists-private","l":"#curated-artists (private)","p":["Channel for Curated Artists."]},{"i":"os-private","l":"#os (private)","p":["To report any issues or scam collections to OpenSea."]},{"i":"block-talk","l":"#block-talk","p":["Our most popular channel with 50k+ messages a month. This is where a majority of discussion takes place and culture is shaped. Topics are primarily generative art and NFTs but can vary widely on daily events and which members are present.","ArtBot also has the most functionality here. Users can call any Art Blocks project and output at their will and sales are posted live as they occur.","Although discussion can move at a rapid pace, engaging here with the community will have the greatest reward for you as a new artist. Feel free to lurk and get a feel for the discussion but even reacting with emojis/GIFs will help the community become familiar with your name (Remember, as an artist you will have a special Role in the server including an Orange colored handle!)."]},{"i":"ab-only-project-share","l":"#ab-only-project-share","p":["For sharing your works-in-progress with the community. Sharing outputs on a regular basis here is a great way to get the community interested in an unannounced project and feel involved in the creation process."]}],[{"i":"#","p":["Marketing 101"]},{"l":"Marketing 101","p":["Marketing can help projects reach their widest audiences. Crypto markets are volatile, and sales are not guaranteed. One way artists achieve sustainable success can be to build an active and engaged audience. Art Blocks has a thriving community on several social media channels that is enthusiastic to engage with new artists and new projects. We encourage you to engage with this community and provide resources for doing so, as you prepare to release your work."]},{"l":"Guidelines","p":["Please adhere to the following guidelines for public communication prior to the launch of your Art Blocks drop:","If you are working on a project for Art Blocks without an approved release, announce it as a \"planned submission\" to Art Blocks.","If your project is approved for release but not yet scheduled, announce it as a \"planned release\" on Art Blocks.","If your project has a scheduled release date, announce it as an \"upcoming release\" on Art Blocks.","For artists with projects designated as Curated releases, wait to reveal the project and its Curated status until after Art Blocks has made an official announcement."]},{"l":"Art Blocks Promotion Resources"},{"l":"Art Blocks Presents Releases","p":["Twitter: Every Monday, we tweet links to the upcoming week’s events and releases. Newsletter: Art Blocks announces upcoming releases on Tuesday via our newsletter, The Link. Discord: The following week's releases are announced in #upcoming-projects on Discord at the end of each week."]},{"l":"Curated Releases","p":["Curated releases are included in the weekly Twitter roundup, newsletter, and #upcoming-projects announcement. Curated releases are also announced by the Art Team with a global ping in #community-announcements (typically) on the Thursday before their release. In addition, the Art Team will publish an interview with the artist. Curated artists will have their own dedicated Discord channel on the Art Blocks server to engage with community members."]},{"l":"Art Blocks Community Programming","p":["The Art Blocks community team hosts a series of public programs to help facilitate conversation around generative art and its contexts, upcoming projects, and the creative coding process. All Art Blocks artists are invited to participate in these programs. If you are interested in joining, please message your artist DM to be connected with our Community Team.","Pre-Drop Talk Pre-Drop Talks happen on Twitter Spaces 15 minutes prior to the release of your project. A member of the Community Team will ask you a series of questions to help collectors get to know more about your creative process and the decisions behind your project. Pre-drop talks are announced on Twitter a few days before release, and you’ll be connected with the host of your talk after your project is announced in #upcoming-projects. You will receive interview questions in advance of the live show. If you do not have a Twitter account, the Community Team will explore alternative ways to host this conversation with you.","Minters & Makers Minters & Makers is a weekly Twitter Space hosted by Art Blocks about generative art. Guests include artists, community members, curators, and generative art experts. Episodes are recorded and subsequently released as a podcast.","After Dinner Mints, ADM An Art Blocks show released on Youtube revolving around conversations with Art blocks artists, staff, and community members. Episodes are recorded and subsequently released as a podcast.","ADM: Behind the Code A subset of “After Dinner Mints” that happens bi-monthly and features artists’ behind the scenes discussions on the technical aspects of their Art Blocks project.","Artists are welcome to participate in all community programs and should reach out to on Discord if they are interested."]},{"l":"Marketing Tools for Artists","p":["One benefit of releasing on Art Blocks is that you are now entering a vibrant ecosystem of generative art experts and enthusiasts. Our main piece of advice for promoting your work/artist profile is to participate in the community. If you have been selected to release on our platform, your work is strong and valuable, no matter the curatorial status."]},{"l":"Art Blocks Discord Server","p":["#artist-general, #artist-tech, #artist-project-feedback Once you’ve been accepted to release on Art Blocks, you’ll be assigned an Artist role in Discord. Here’s your chance to tap into a community of artists preparing for their first release or have already released on Art Blocks! Building your audience begins with leveraging connections with your peers. This is a space to talk shop, ask technical questions, give feedback, and make friends. Build relationships here that extend outside the channel and into other spaces, both AFK (away from the keyboard) and online. Tweeted about your upcoming release? Ask fellow Art Blocks artists to engage with your content. Collaborate on boosting each other’s visibility. Social media can be emotionally taxing, so use this channel as a space to build supportive and genuine relationships. On Tuesdays at 11 PM CT/12 PM ET, Art Blocks hosts Office Hours on Google Meet. This meeting is an open invitation to chat with other artists and the Art Blocks team face-to-face (or audio-to-audio). With our communities spread worldwide, it can be difficult to connect. Through this standing meeting, we hope to bring artists together and strengthen our artist community. Add this meeting to your calendar here.","#artist-announcements Once your project is scheduled, you can use this channel to make an announcement for our larger discord audience. This is an opportunity to narrate the story behind your work. If you have created any additional content, like a Medium article or Youtube video, this would be the place to share.","#block-talk Block Talk is the water cooler for Art Blocks collectors. Our community team does its best to keep a good vibe, but as with any high-speed internet forum filled with many passionate contributors, the conversations can become negative. That being said, bearing in mind your mental health and capacity, it’s the prime location to get your name out there. Hanging out in Block Talk is like being in the kitchen at a big party. Jump in and participate in the conversation. Have some thoughts about the color and composition of a recent project? This would be the place to voice that. Participation is key. Not only do community members respond well to artist input on this channel, but it’s also a great way to build name recognition. This is also the place you’ll want to lurk during your drop; here, you can elucidate and respond to collectors in real-time.","#block-talk // #curated-artist#block-talk is the designated area for collector discussions about Presents projects. Artists can use this space to announce their releases and make updates about their projects to collectors. This is especially useful for upcoming exhibitions, updates on physical shipments, and other pertinent information regarding a specific drop.","Curated artists will have their own channels. Artists can use this space to announce their releases and directly engage with collectors.","Twitter Web3 trends towards Twitter and Discord. In addition to participating on the Art Blocks Discord Server, Twitter is a great place to promote your project. Again, our main piece of advice is to participate! Tweet, reply, and share works in progress. Engage with those who comment on your posts. Follow other generative artists and Web3 thought-leaders. Alongside Discord, this is the place to start conversations with fellow artists and collectors. Sharing your work is equally as important as participating in conversations.","Other Tips","Collaborate with an institution or gallery to showcase your work","Have a virtual hype-man? Gift them with a token! Show appreciation to your fans","Create additional materials that frame and give context to your work as an artist, this can be done through a project website, Youtube video, Medium article, etc."]},{"i":"mental-health--social-media","l":"Mental Health & Social Media","p":["As told by Natalie Christensen"]},{"i":"tips-for-managing-social-media-use","l":"Tips for managing social media use:","p":["For anyone who is considering reducing time on social media, it is a good idea to find out how much time you are spending there. There are apps that will help you get a baseline of how much time you are spending before setting a goal of reducing that time.","This article from March 2022 recommends the best apps for tracking and reducing time on social media."]},{"i":"make-a-routine-that-works-for-you","l":"Make a routine that works for you:","p":["After determining how much time you are spending on social media, start to pay close attention to the emotions you feel when scrolling through a social media feed. If the emotions are negative (FOMO, anxiety, jealousy, anger, or depression) it may not be the best place for you. Consider removing the apps that bring up this feeling most. Choose an activity that can replace social media at that time – taking a walk, reading a book, breathing exercises, calling a friend, etc. can be a remedy for these negative emotions.","For those of us who need to use social media for work, promoting art, etc. it can help to set specific times of day and a specific amount of time to attend to social media responsibilities and then set it aside for the day. Set daily limits and stick to it. That may not be easily done but keep setting it as a goal until you accomplish the daily time limits. Move on to other tasks after the time you allotted for social media is complete. Consider turning off social media notifications so your phone is not distracting you from other tasks."]},{"i":"other-things-to-consider","l":"Other things to consider:","p":["Sharing parts of your personal story on social media can be risky and uncomfortable. If you choose to share, do it safely and manage expectations. Tell other friends you will be doing this and ask for feedback before sharing. Ask for their support in the social media space if possible.","Using social media one hour or less before bedtime can interfere with sleep, the quality of sleep, etc. Consider keeping your phone in a place away from your bedside. Carefully consider the accounts you follow and consider their purpose and why you think it is important to follow them. If you don’t have a clear answer, consider unfollowing.","Avoid online arguments or engaging with users you perceive to be negative: If you post a controversial opinion, don’t engage if you are attacked or negatively confronted. Your social media is your own space and defending your work or beliefs constantly is emotionally depleting. If someone tries to pull you into an argument, remember that kindness is much more effective than anger."]},{"i":"remember-the-benefits-of-life-offline","l":"Remember the benefits of life offline:","p":["Remember why you set the goal of less time online. If it was due to negative emotions or too little time for other things, then that is a reason to continue working towards your goal. Limiting time improves sleep and prioritizing in-person connections also reduces negative emotions and comparisons to others."]}],[{"i":"project-pricing-dutch-auction-settings","l":"Project Pricing: Dutch Auction Settings","p":["This resource intends for artists to better understand exponential Dutch auction settings. Dutch auctions are the recommended model for project economics. The project pricing model has been updated to allow for more price discovery based on market conditions.","Dutch Auction settings are based on the project collection type (Curated vs. Presents) and whether the project is the first release by the artist. For exponential Dutch auctions, artists specify the starting price, ending price, and half-life for price drops. Each collection is assigned a recommended starting value and maximum resting price guided by the collection size and series category. The recommended starting price is the value you should use for the start of the auction. The maximum resting price refers to the base price of an auction; this is the final price tier of the auction sequence.","Art Blocks recommends using exponential decay with these values for no longer than an hour. We will monitor market conditions and adjust these values as needed over time. If you'd like to explore a project size of less than 100, alternate sales mechanics, or have an established sales history outside of these parameters, please speak with Art Blocks’ Art Team for a specialized recommendation."]},{"l":"Price Reductions","p":["A project's pricing cannot be altered after release. Instead, you may reduce your project size but must run the change by the Art Blocks Art Team in your [M_] DM on Discord. We recommend waiting at least 4 weeks before reducing collection size.","Our contract automatically locks projects FOUR WEEKS after their final mint.","Note: If the artist reduces maxInvocations to current invocations, that tx is considered the start of the four-week timer until lock."]}],[{"i":"#","p":["Staging Checklist"]},{"l":"Staging Shell Checklist","p":["For Accepted Artists: Ask questions in the Discord DM titled [G_] the Art Team provided to you For Applying Artists: Ask questions in #artist-applications on Art Blocks’ Discord Server"]},{"l":"Connect Your Wallet","p":["Within your MetaMask plugin, change your network to “Goerli Test Network”. You should see this as a drop-down option at the top of your MetaMask window. [Note: If you do not see this drop-down as an option, please go to Account > Settings > Advanced and toggle “Show test networks” to YES. Once toggled to YES, you should see Goerli Test Network and others as a drop-down option.]","Go to https://artist-staging.artblocks.io/","Click the Connect button in the upper right corner if you are not already connected, and sign the presented transaction. If you are not connected when accessing project pages, a 404 error will appear.","Note: For your Art Blocks application, please connect with a hot wallet. Hardware wallets are not currently compatible with Art Blocks staging."]},{"l":"Upload","p":["Please ensure that you have reviewed and abided by our Documentation and Guidelines & Constraints. Suppose you are assigning rarity to different things. In that case, Art Blocks strongly recommends using an instance of the Random class found here to feed all of your project's randomness. Before uploading, please verify that your script meets this requirement.","Ensure your wallet is funded with enough Goerli ETH to pay the gas fees for the upload and unpausing process. You can harvest Goerli here.","Submit one field at a time. Wait for that transaction to clear before attempting the next field.","Upload your script. Guide to uploading your script can be found in the Project Form Fields Guide"]},{"l":"Test Minting","p":["Before minting, go to the minter tab and set the minter to Set Price - ETH (V2). Set the base price low as to not waste GoerliEth.","After you submit the minter to Set Price - ETH (V2) and entered the base price, go back to your project page and scroll down.","You will find the button that says Artist Mint. By pressing this button, you can mint outputs without unpausing your project.","Press PURCHASE.","Success! You've minted your first test output. In order for your project shell to be reviewed by the internal screening committee, you will need to mint 50-70 test outputs."]},{"l":"Features","p":["Please see Features for full details on how you set your project features as an artist."]},{"l":"Add your project description","p":["The project description is an opportunity for you to highlight your intentions and provide an interpretative frame around how you want the viewer/collector to approach your project. For this reason, we find it very important. We have a series of prompts to help artists get started with this. Here is a suggested guideline.","• Begin with a strong, clear opening sentence.","• Lead with the artistic inquiry; what questions can be prompted or answered through this work?","• How would you describe this project to someone unfamiliar with your work?","• What inspiration, color palette influences, themes, and techniques were used?","• Examine the outputs. What can the viewer see?","• Be sure to describe any interactivity features, if applicable.","• End by summarizing how the medium, outputs, and algorithm achieve your initial inquiry or concept."]},{"l":"Updating your script","p":["If you make changes to your script, you may individually refresh your tokens. If you’ve refreshed your tokens, but do not see changes reflected, make sure that you have cleated your cache."]}],[{"i":"#","p":["A project checklist to walk through for Curated projects."]},{"l":"Checklist for Curated Projects","p":["Before proceeding to mainnet upload, please verify that your script behaves as expected across all major web browsers (e.g. Chrome, Firefox, Safari, etc.). We recommend using Browserstack to test across devices. If you do not already have an account, select Get started free and set up a free account."]},{"l":"Upload","p":["Please ensure that you have reviewed and abided by our Documentation and Guidelines & Constraints. If you are assigning rarity to different things, Art Blocks requires that you use an instance of the Random class found here to feed all of your project's randomness. Prior to uploading, please verify that your script meets this requirement.","Ensure your wallet is funded with enough ETH to pay the gas fees for the upload and unpausing process. For more information on the estimated cost of these steps, click here.","Submit one field at a time. Wait for that transaction to clear before attempting the next field.","When you upload your script, please copy it exactly from testnet.","Please double-check, triple-check, and then check again the generated features script results on staging to ensure they are 100% accurate. This is extremely important to get right, as it changes to fix any bugs you may introduce in this script may have a massive impact on how the artwork is perceived by collectors and may cause confusion in the secondary market. It is your responsibility to guarantee that your features script is properly verified in the artist staging environment."]},{"l":"Features","p":["Please see Features for full details on how you set your project features as an artist.","The features script for your project should first be tested on the Goerli testnet ( https://artist-staging.artblocks.io) alongside your art script. Ensure that your features are being displayed as expected on testnet before proceeding to project deployment to mainnet.","When uploading your feature script to mainnet ( https://www.artblocks.io/), please ensure that you are uploading the same features script, taking the same care that you would with your art script itself.","While the features script is not stored on-chain like the art script is, bugs in your features script will cause meaningful disruptions for collectors trying to explore your work on a per-feature basis."]},{"l":"Tags","p":["Add relevant tags to your project. More on tags here."]},{"l":"Economics","p":["Review the Project Pricing Model for Dutch auctions here","Consider the overall economics of your project for a successful release.","Artists can only have one active project at a time.","As a note, we require artists to take a 6 month cooldown period between considerations for Curated projects. The cooldown period begins when your project sells out (i.e. when minting is 100% complete)."]},{"l":"Charity Component","p":["To maintain our commitment to charitable giving, we ask artists to consider donating 25% of sales above the resting price via Dutch auction to a charity of their choice. If you elect to participate in this way, please determine your chosen charity, and confirm its eligibility, before mint #0. To whom and how you donate is entirely up to you. Art Blocks does not require you to donate any proceeds in order to engage with our platform. If you do elect to donate to a charity, it is advisable to consider whether the charity which you choose to support qualifies under United States tax law to receive tax-deductible donations. If your project designates only one primary wallet, you may use the additional payee field to manage on-chain donations. All revenue may also be routed to a single wallet and donated after your drop. We encourage you to consult with a tax professional to understand any potential tax implications of your planned giving, as these can be widely variable.","Learn more about Charitable Donation here."]},{"i":"approve-additional-payee-info-for-primary-and-secondary-sales","l":"Approve additional payee info for primary and secondary sales⛽","p":["Include the wallet addresses for primary and secondary sales to be distributed. Once submitted, the details will be approved by the Art Team. If you do not have additional wallet addresses that will receive funds from primary or secondary sales you must input 0x0000000000000000000000000000000000000000 in the blank fields."]},{"i":"mint-0","l":"Mint #0","p":["Note: Mint #0 will be completed with the Set Price minter. Set the minter to Set Price ETH with the set price as your Dutch Auction’s base price for Mint #0. Mint #0 must be left up to chance, artists cannot use tokenId to control the features of the output.","Before minting Mint #0, ensure that your \"additional payee wallet\" has been set for the same configuration that you will use it for in your project release. E.g., if you are using the \"additional payee wallet\" field to donate to charity at the time of mint, you must set this before minting your #0. This is done to ensure that this full functionality is tested end-to-end as part of the mint #0 process, and that there are no issues with the wallet selected for the additional payee. Please note: Art Blocks does not currently support sending primary sales payments into a multi-sig contract and there are known issues when attempting to do so. While we plan to update our minting smart contracts in the near future to resolve this, multi-sig wallets should not be used for this purpose at this time.","Once your project information has been uploaded, please confirm in your artist DM that you're ready for mint #0. The Art Blocks Team will look over your project shell and then give you the go-ahead to mint #0.","Mint #0 must occur before your release can be scheduled."]},{"l":"Payout Details","p":["Be sure that you've input information in all field forms. If you do not have an additional payee for primary or secondary sales, you may put 0x0000000000000000000000000000000000000000 in the field and 0% for the payee percentage."]},{"l":"Initiating your Minter Suite choice","p":["We have a variaty of minters available for you to choose from to best suit your project.","For an overview of all minters available for artists, please see the Shared Minter Suite page.","For more detailed instructions on how to configure your selected minter, please see the Minter section of the Project Form Fields Guide.","If you are using the Dutch auction - Exponential Price Decrease(with or without settlement) or Dutch auction - Linear Price Decrease, you will need to unpause your project before your auction's start time. Your project can be unpaused under the Danger tab any time prior to the starting time of your auction. We recommend unpausing projects on the morning of your release. Once unpaused, your project will be marked as “Upcoming,” and the Dutch auction will automatically begin at your start time, leaving the beginning of the auction hands-free."]},{"l":"Scheduling","p":["Once mint #0 and the features script are in place, Art Blocks will work with you to schedule/announce your curated release.","Curated releases will include an artist feature with a Q&A to be gathered following scheduling.","Curated artists will also have an artist channel created in Discord. To pin messages in your artist channel, you must enable two-factor authentication within User Settings > My Account in Discord.","After your project has been scheduled, you are free to announce and promote your project on your social media."]},{"l":"Pre-Drop Talk","p":["Pre-Drop Talks happen on Twitter Spaces 15 minutes prior to the release of your project. A member of the Community Team will ask you a series of questions to help collectors get to know more about your creative process and the decisions behind your project. Pre-drop talks are announced on Twitter a few days before release, and you’ll be connected with the host of your talk after your project is announced in #upcoming-projects. You will receive interview questions in advance of the live show. If you do not have a Twitter account, the Community Team will explore alternative ways to host this conversation with you."]},{"l":"Unpausing","p":["When it's time, you'll click the Unpause button under the Danger tab.","You may unpause your Dutch auction release up to 24 hours in advance.","For fixed price releases, please send in the tx 30 seconds prior to the top of the hour. To unpause the project, please send high gas (2-3x what is suggested as high gas on https://etherscan.io/gastracker). If you have questions about what you should set your gas to, please ask in your project DM and the Art Blocks Team can advise.","Once the transaction clears, your project will be live for minting."]},{"l":"Rarities","p":["Do not discuss odds or feature rarities about your project until it is completely sold out."]},{"l":"Finishing Steps","p":["If you are using Settlement in your auction, after the auction has completed, you must go to Payout Tab and claim revenue.","Once your project is completely sold out, you may reset the Additional Payee Percentage to 0% for any charitable giving that was conducted during minting. If removing, you will need to edit the secondary payee info to your wallet or set the percentage to 0. In order to successfully complete this change, you will need to input information in all fields in the Payout tab.","Report final charity donation totals in your Mainnet DM","Please fill out the appropriate form to add bot-support to your Discord channel for your completed project: https://github.com/ArtBlocks/artbot/issues/new/choose.","Personalize your OpenSea Collection. Learn more about doing so here.","Last, please feel free to hang out as much or as little as you'd like in your channel going forward. If you plan to take an extended amount of time away from the community in the next month, we'd appreciate it if you would communicate that you are disconnecting to your collectors in case they have any questions in the interim."]}],[{"i":"#","p":["A project checklist to walk through for Presents projects."]},{"l":"Checklist for Presents Projects","p":["Before proceeding to mainnet upload, please verify that your script behaves as expected across all major web browsers (e.g. Chrome, Firefox, Safari, etc.) We recommend using Browserstack to test across devices. If you do not already have an account, select Get started free and set up a free account."]},{"l":"Upload","p":["Please ensure that you have reviewed and abided by our Documentation and Guidelines & Constraints. If you are assigning rarity to different things, Art Blocks strongly recommends that you use an instance of the Random class found here to feed all of your project's randomness. Prior to uploading, please verify that your script meets this requirement.","Ensure your wallet is funded with enough ETH to pay the gas fees for the upload and unpausing process. For more information on the estimated cost of these steps, click here.","Submit one field at a time. Wait for that transaction to clear before attempting the next field.","When you upload your script, please copy it exactly from testnet.","Please double-check, triple-check, and then check again the generated features script results on staging to ensure they are 100% accurate. This is extremely important to get right, as it changes to fix any bugs you may introduce in this script may have a massive impact on how the artwork is perceived by collectors and may cause confusion in the secondary market. It is your responsibility to guarantee that your features script is properly verified in the artist staging environment."]},{"l":"Features","p":["Please see Features for full details on how you set your project features as an artist.","The features script for your project should first be tested on the Goerli testnet ( https://artist-staging.artblocks.io), alongside your art script. Ensure that your features are being displayed as expected on testnet before proceeding to project deployment to mainnet.","When uploading your feature script to mainnet ( https://www.artblocks.io/), please ensure that you are uploading the exact same features script, taking the same care that you would with your art script itself.","While the features script is not stored on-chain like the art script is, bugs in your features script will cause meaningful disruptions for collectors trying to explore your work on a per-feature basis."]},{"l":"Tags","p":["Add relevant tags to your project. More on tags here."]},{"l":"Economics","p":["Review the Project Pricing Model for Dutch auctions here","Consider the overall economics of your project for a successful release.","Artists can only have one active project at a time.","In order to submit a new project, your previous project must be closed (sold out/completed)."]},{"l":"Charity Component","p":["To maintain our commitment to charitable giving, we ask artists to consider donating 25% of sales above the resting price via Dutch auction to a charity of their choice. If you elect to participate in this way, please determine your chosen charity, and confirm its eligibility, before mint #0. To whom and how you donate is entirely up to you. Art Blocks does not require you to donate any proceeds in order to engage with our platform. If you do elect to donate to a charity, it is advisable to consider whether the charity which you choose to support qualifies under United States tax law to receive tax-deductible donations. If your project designates only one primary wallet, you may use the additional payee field to manage on-chain donations. All revenue may also be routed to a single wallet and donated after your drop. We encourage you to consult with a tax professional to understand any potential tax implications of your planned giving, as these can be widely variable.","Learn more about Charitable Donation here."]},{"i":"approve-additional-payee-info-for-primary-and-secondary-sales","l":"Approve additional payee info for primary and secondary sales⛽","p":["Include the wallet addresses for primary and secondary sales to be distributed. Once submitted, the details will be approved by the Art Team. If you do not have additional wallet addresses that will receive funds from primary or secondary sales you must input 0x0000000000000000000000000000000000000000 in the blank fields."]},{"i":"mint-0","l":"Mint #0","p":["Note: Mint #0 will be completed with the Set Price minter. If you use a fixed price, your project will be unpaused under the Danger tab right before your project’s release. Once a project using Set Price - ETH or Custom ERC20 is unpaused, it will be live for minting. If your project is sold via a Dutch auction, please set the minter to Set Price ETH with the set price as your Dutch Auction’s base price for Mint #0. Mint #0 must be left up to chance, artists cannot use tokenId to control the features of the output.","Before minting Mint #0, ensure that your \"additional payee wallet\" has been set for the same configuration that you will use it for in your project release. E.g., if you are using the \"additional payee wallet\" field to donate to charity at the time of mint, you must set this before minting your #0. This is done to ensure that this full functionality is tested end-to-end as part of the mint #0 process, and that there are no issues with the wallet selected for the additional payee. Please note: Art Blocks does not currently support sending primary sales payments into a multi-sig contract and there are known issues when attempting to do so. While we plan to update our minting smart contracts in the near future to resolve this, multi-sig wallets should not be used for this purpose at this time.","Once your project information has been uploaded, please confirm in your artist DM that you're ready for mint #0. The Art Blocks Team will look over your project shell and then give you the go-ahead to mint #0.","Mint #0 must occur before your release can be scheduled."]},{"l":"Payout Details","p":["Be sure that you've input information in all field forms. If you do not have an additional payee for primary or secondary sales, you may put 0x0000000000000000000000000000000000000000 in the field and 0% for the payee percentage."]},{"l":"Initiating your Minter Suite choice","p":["We have a variaty of minters available for you to choose from to best suit your project.","For an overview of all minters available for artists, please see the Shared Minter Suite page.","For more detailed instructions on how to configure your selected minter, please see the Minter section of the Project Form Fields Guide.","If you are using the Dutch auction - Exponential Price Decrease(with or without settlement) or Dutch auction - Linear Price Decrease, you will need to unpause your project before your auction's start time. Your project can be unpaused under the Danger tab any time prior to the starting time of your auction. We recommend unpausing projects on the morning of your release. Once unpaused, your project will be marked as “Upcoming,” and the Dutch auction will automatically begin at your start time, leaving the beginning of the auction hands-free."]},{"l":"Scheduling","p":["Once mint #0 and the features script are in place, Art Blocks will work with you to schedule/announce your release.","After your project has been scheduled, you are free to announce and promote your project on your social media.","Refer to our Marketing 101 Guide here"]},{"l":"Pre-Drop Talk","p":["Pre-Drop Talks happen on Twitter Spaces 15 minutes prior to the release of your project. A member of the Community Team will ask you a series of questions to help collectors get to know more about your creative process and the decisions behind your project. Pre-drop talks are announced on Twitter a few days before release, and you’ll be connected with the host of your talk after your project is announced in #upcoming-projects. You will receive interview questions in advance of the live show. If you do not have a Twitter account, the Community Team will explore alternative ways to host this conversation with you."]},{"l":"Unpausing","p":["When it's time, you'll click the Unpause button under the Danger tab.","You may unpause your Dutch auction release up to 24 hours in advance.","For unpausing fixed price releases, please send in the tx 30 seconds prior to the top of the hour. To unpause the project, please send high gas (2-3x what is suggested as high gas on https://etherscan.io/gastracker). If you have questions about what you should set your gas to, please ask in your project DM and the Art Blocks Team can advise.","Once the transaction clears, your project will be live for minting."]},{"l":"Rarities","p":["Do not discuss odds or feature rarities about your project until it is completely sold out."]},{"l":"Finishing Steps","p":["If you are using Settlement in your auction, after the auction has completed, you must go to Payout Tab and claim revenue.","Once your project is complete, you may reset the “Additional Payee Percentage” to 0% for any charitable giving conducted during minting. If removing, you will need to edit the secondary payee info to your wallet or set the percentage to 0. In order to successfully update payout details, you will need to enter information into all fields to submit the change.","Report final charity donation totals in your artist DM","Personalize your OpenSea Collection. Learn more about doing so here.","[For previously Curated only] Please fill out the appropriate form to add bot support to your Discord channel for your completed project: https://github.com/ArtBlocks/artbot/issues/new/choose."]}],[{"i":"#","p":["An overview of minting philosophy at Art Blocks."]},{"l":"Minting Philosophy","p":["An overview of the generative art minting philosophy at Art Blocks."]},{"l":"Introduction","p":["At Art Blocks, minting is a particularly special occasion where a new generative art piece is created. It is the final step in the generative art creation process, and enables collectors to partner with artists to create a unique, one-of-a-kind piece of generative art!","On a blockchain, \"minting\" is the process of creating new tokens. So not only is minting the process of creating new generative art pieces, it is also the process of creating new tokens on a blockchain. Typically, minting is also the point where a collector will pay for the generative art piece.","A few key points about minting at Art Blocks:","Minting is the process of creating new generative art pieces.","Minting is the process of creating new tokens on a blockchain.","Minting generally involves a collector paying for the right to create a generative art piece."]},{"l":"Core Principles","p":["At Art Blocks, we are committed to providing a transparent minting toolkit for artists, and a transparent minting experience for collectors.","The following principles, when used together, are important ideals that we believe enable artists to achieve some sort of \"fairness\" during their drop. They also are key to collector safety when interacting on a blockchain."]},{"l":"1. Transparency","p":["We believe that minting should be transparent and easy to understand for collectors. Verified source code is provided for all minter smart contracts, and we develop our minters publically in our open source GitHub repository."]},{"i":"2-decentralized--trust-minimized","l":"2. Decentralized & Trust-Minimized","p":["We believe that minting should rely heavily on immutable smart contract code deployed to decentralized networks, and should be as trustless as possible. We aim to minimize the amount of trust in any centralized party when minting. This is important because collectors must feel safe when purchasing high-value generative art pieces, and trusting a centralized party to mint a generative art piece is often not an acceptable option.","Of course Artists and Art Blocks will have some elevated privileges, such as configuring auctions, but we aim to minimize those privileges and implement only when necessary. Those privileges will be documented and transparent, and should align incentives."]},{"l":"3. Non-Custodial","p":["Minting should be a transaction between the collector and the minter smart contract, and the contract should handle logic related to settlements, price changes over time, etc.","The minter smart contract should empower the collector to make their own decisions, and should not be custodial in nature."]},{"l":"4. Honest","p":["Blockchains have a unique set of technical quirks that can be exploited by opportunistic or malicious actors. These result in frequent discussions about bots, \"flipping\", and front-running.","We are committed to providing solutions to help alleviate these issues, but we are also committed to being honest about their limitations. Solutions must have sound fundamentals, and ones that only hide or obfuscate minting bots or other issues are not real solutions, and therefore should not be implemented. See the Lessons Learned section for more examples of this."]},{"l":"5. Flexible","p":["In some situations, a project may desire to mint in a way that is highly centralized or in some other non-traditional manner. An example of this would be a project that utilizes in-person minting at an event. In this case, the project may choose to mint from a single, centralized mobile device, but should be transparent about that decision."]},{"i":"fairness-ideals","l":"\"Fairness\" Ideals","p":["Fairness is a concept that is often discussed in the context of minting, and is worth investigating in some amount of nuance.","In an abstract sense, fairness is easy to define. Merriam-Webster defines fairness as:","\"marked by impartiality and honesty: free from self-interest, prejudice, or favoritism\".","In practice, however, fairness of a project's mint is much more difficult to define. In one sense, Art Blocks drops are entirely fair:","Open sale at a defined price or auction","Mint success is determined by transaction time/order","Transaction confirmation time is determined by the network's gas price auction","In another sense, there are many different ways to define fairness, and each definition has its own set of tradeoffs. In general, we believe there are a few types of fairness that are important to consider when an artist is considering how to distribute their project to collectors:"]},{"l":"1. Capitalist Fairness","p":["Capitalist fairness suggests that those who are willing to pay the most for a given drop should be the ones who are able to participate.","An example of a drop paradigm that is capitalist fair is a Dutch auction. In a Dutch auction, the price of a generative art piece starts high, and decreases over time until a collector is willing to pay the price. This ensures that the collector who is willing to pay the most for a generative art piece is the one who is able to mint it."]},{"l":"2. Insider Fairness","p":["Insider fairness suggests that those within an existing community should be the ones who are able to participate.","An example of a drop paradigm that is insider fair is an allowlist. In that paradigm, a collector must have reached out to an artist before the project was released to be allowed to mint. This ensures that the collector who is most involved and interested in a community is the one who is able to mint a generative art piece."]},{"l":"3. Communist Fairness","p":["Communist fairness suggests that all collectors should have an equal chance to participate, regardless of their technical skills or willingness to pay.","An example of a drop paradigm that optimizes for communist fairness would be a pure lottery, where all collectors have an equal chance to mint a generative art piece. This ensures that all collectors have an equal chance to mint a generative art piece."]},{"l":"Fairness in Practice","p":["In practice, it is difficult to achieve any of the above definitions of fairness in a pure sense. For example, a pure lottery is not possible on Ethereum, because the network is not able to discern humans from bots, and therefore a pure lottery would be susceptible to bots spamming entries and disproportionately winning the lottery.","Art Blocks aims to provide a variety of minting options for artists to choose from, each with their own set of tradeoffs. We believe that artists should be able to choose the minting paradigm that best fits their project's goals.","The minters provided by Art Blocks are intended to follow our design principles while also achieving some kind of fairness. However, each minter's amount of fairness and suceptibility to bots will vary based on:","project demand/hype","project price","market conditions","gas prices","etc.","For example, if a highly-anticipated project is sold at a low fixed-price, it is likely that bots will be able to mint a large number of generative art pieces. However, if a less-anticipated project is sold at a fixed-price, it is likely that bots will not mint a large number of generative art pieces because the speculative value of the generative art piece is not high enough to flip for a short-term profit.","The minters provided by Art Blocks are not inherently fair or unfair in nature, but that when used carefully, they can provide a minting experience that stays true to our principles while also providing some amount of fairness. We believe that it is important for artists to understand the tradeoffs of each minter, and to choose the minter(s) that best fits their project's goals."]},{"l":"Minter Suite","p":["The minter suite is a collection of smart contracts that aim to provide different options for artists to distribute their project's tokens to collectors. A variety of minters are available for artists to choose from that can be used to create a variety of different minting experiences. The minters are designed to be flexible and extensible, but also to provide a consistent and familiar minting experience for collectors.","The shared minter suite is used by Art Blocks, and is also available for use with Art Blocks Engine contracts (V3 only).","More details will be added regarding the shared minter suite in the future, but for now, please see the Shared Minter Suite page for an overview of all available flagship minters at this time."]},{"l":"Lessons Learned","p":["Below is a collection of lessons that we have learned from our experience with minting generative art pieces on Ethereum."]},{"i":"one-mint-per-wallet-does-not-prevent-bots-without-an-allowlist","l":"One mint per wallet does not prevent bots (without an allowlist)","p":["In the past, we have implemented a \"1 mint per wallet\" rule, which was intended to prevent bots from minting a large number of generative art pieces. However, this rule was not effective, and actually gave an advantage to bots.","For a botter, minting from 1 or 100 wallets is nearly the same difficulty. However, for a typical collector not using bots, minting from multiple wallets adds a lot of difficulty. Ultimately, the \"1-per\" restriction puts the average collector at a huge disadvantage relative to a botter.","The \"1 mint per wallet\" rule is also somewhat misleading because it may lead collectors to believe that a project's distribution is well-diversified, when in reality, it might only be owned by a network of bots operating at many addresses.","In the end, this rule was not effective, harmed less-technical collectors, and was therefore abandoned.","Note: Limiting the number of mints per wallet on an allowlist is a different paradigm, and is a valid way to limit the number of mints per wallet."]},{"l":"Disabling minting from smart contracts does not prevent bots","p":["In the past, we have implemented a rule that prevented minting from smart contracts. This was intended to prevent bots from minting a large number of generative art pieces. However, this rule was not effective, because bots are able to mint from EOAs (externally owned accounts), and therefore are still able to mint a large number of generative art pieces.","The \"no minting from smart contracts\" rule is also somewhat misleading because it may cause collectors to believe that a project's was bot-resistant, when in reality, it is not an effective way to prevent bots from minting.","In the end, this rule was not effective, harmed collectors that wanted to mint from a smart contract (including from security-forward multi-sig wallets such as Gnosis Safe), and was therefore abandoned."]},{"l":"One mint per transaction does not prevent bots","p":["This is a rule that is implemented by some NFT projects, and is intended to prevent bots from minting a large number of generative art pieces. However, this rule is not effective, because bots are able to mint a large number of generative art pieces by submitting multiple transactions to the network's pending transaction pool.","Additionally, most implementations of this rule prevent minting from smart contracts, which is harmful to collectors that want to mint from multi-sig wallets. Other solutions require collectors to pay for additional gas fees for on-chain storage to support the rule's logic, which is also harmful to collectors.","In the end, this rule is not effective, harms less-technical and/or security-conscious collectors, and was therefore abandoned."]},{"i":"low-fixed-prices-favor-bots","l":"Low, fixed prices favor bots","p":["In general, low, fixed prices favor bots because they are able to mint a large number of generative art pieces and flip them for a short-term profit. This is especially true when the project is highly-anticipated, and when the project's generative art pieces are expected to have a high speculative value.","Bots have a large advantage over humans when it comes to minting at low, fixed prices, because they are able to submit transactions to the network's pending transaction pool at a high rate, and are able to pay high gas prices to ensure that their transactions are confirmed quickly.","In general, we recommend that artists consider using a Dutch auction or an allowlist to mitigate the effects of bots when minting at low, fixed prices."]}],[{"l":"Shared Minter Suite","p":["This page provides an overview of the Art Blocks Shared Minter Suite, which enables artists to choose how they distribute their artwork to collectors.","The Shared Minter Suite is available for all projects, including Art Blocks Engine projects.","Only projects on contracts that have been migrated to the Shared Minter Suite will be able to use the new minter options. Engine core contract admins can view the Minter Migration Runbok for more details."]},{"l":"Mix-and-Match","p":["Artists can mix-and-match minter options to create a custom minter configuration for their project. For example, an artist could initially use the allowlist minter to allow a specific set of collectors to mint one token per allowlisted wallet, and then could open up minting to the public via a switch to a Dutch auction with settlement minter.","Each minter supports limiting to a certain number of project invocations. For example, an artist could allow Minter A to be used for the first 1000 project invocations, and then switch to Minter B for the remaining project invocations."]},{"l":"Globally Available Minter Options","p":["The current available Minter options are discussed below. We are continually expanding our shared minter suite over time."]},{"i":"set-price-eth","l":"Set Price, ETH","p":["The set price minter is used for fixed price releases. It is the simplest minter and prices all tokens at the same price, in ETH."]},{"i":"set-price-erc20","l":"Set Price, ERC20","p":["Set price in ERC20 is a fixed price minter that allows accepting any ERC20 token as payment for your sale of tokens. In addition to specifying a fixed price, artists will specify the ERC20 token address for the custom token sale.","Custom ERC20 tokens can be used for a variety of purposes, including for a \"mint pass\" style experience."]},{"i":"dutch-auction-with-settlement---exponential-price-decrease","l":"Dutch Auction with Settlement - Exponential Price Decrease","p":["When this minter is used, all collectors will pay the same net-price as the final purchaser. This is typically the most fair and equitable Dutch auction type for buyers because all buyers pay the same price, making it a great auction type for many projects.","Collectors who purchase above the lowest price will be able to claim a settlement after the auction. The settlement will be the difference between the price they purchased at and the final purchase price. All funds are held non-custodially by the smart contract until the auction ends and revenues are collected by the artist or admin.","If an artist reduces the max supply of their project mid-auction, and the project sells out above auction base price, revenues must be withdrawn by core contract admin. This was implemented to protect collectors from an artist unilaterally potentially inflating sellout price during an action, and immediately withdrawing revenues. Admin concurrence is required to withdraw revenues in this case.","For supplemental information about the auction reset process, please see the Auction Reset Process section.","For Art Blocks Flagship, please see the Project Pricing: Dutch Auction Settings section for more information on how to determine the appropriate pricing parameters for your auction."]},{"l":"Dutch Auction without Settlement","p":["For Dutch auctions without settlement, artists specify the starting price, ending price, and the half-life for price drops. Collectors will pay more for tokens purchased earlier in the auction, and less for tokens purchased later in the auction.","Two price curves are available for Dutch auctions without settlement: exponential and linear. Exponential price curves approximate a constant percent decrease over time, while linear price curves provide a constant price decrease over time.","Variants of this minter are also provided that support limiting purchasing to wallets that hold a token from a specified list of allowlisted Art Blocks or Art Blocks Engine projects.","For supplemental information about the auction reset process, please see the Auction Reset Process section."]},{"i":"set-price-allowlisted-users-only","l":"Set Price, Allowlisted Users Only","p":["This minter enables the artist to limit minting of their project's tokens to a predetermined list of wallet addresses. Artists upload a list of allowlisted wallet addresses, and may also specify the number of mints allowed per wallet. Mints per wallet can be set to a value, or may be set to unlimited (limited only by project maximum invocations).","Artists are responsible for crafting their allowlist and uploading a comma-separated list of ETH addresses in a .txt or .CSV file to the creator dashboard. These wallet addresses cannot be ENS names, but list the full address of the wallet. Premint is a super helpful tool for creating an allowlist by using social channels to reach collectors, friends, family, etc. In addition, Art Blocks hosts a Python script for retrieving & snapshotting either a list of all Art Blocks token holders or the token-holders of a specific project.","Variants of this minter are provided that support purchasing in ETH, or in a custom ERC20 token.","Allowlists use Merkle trees, which enables them to be verified on-chain and to be decentralized. It also is efficient, enabling very large allowlists. For example, ~ 40,000 wallet addresses were used for the Friendship Bracelet project's allowlist.","Note that vault delegation via Delegate Cash is available for the Allowlisted Users minter. Only V1 of the delegation registry is supported at this time. For more details please visit this video walkthrough."]},{"i":"set-price-token-holders-only","l":"Set Price, Token Holders Only","p":["This minter allows tokens to be minted with ETH when the purchaser owns a token from one or more allowlisted Art Blocks or Art Blocks Engine project. This contract does not track if a purchaser has/has not minted already (ie. a \"mint limit\" is not available) -- it simply restricts purchasing to anybody that holds one or more of a specified list of ERC-721 NFTs.","Artists may use the artist dashboard to pre-select a list of allowlisted Art Blocks or Art Blocks Engine projects, of which any valid token holders will be able to purchase for the upcoming project. Note that a \"snapshot\" won't apply to this minter -- after the project has been made public, users can purchase a token from any allowlisted project and mint freely.","Note that vault delegation via Delegate Cash is available for the Token Holders Only minter. Only V1 of the delegation registry is supported at this time. For more details please visit this video walkthrough."]},{"i":"serial-english-auction-sea","l":"Serial English Auction (SEA)","p":["The Serial English Auction (SEA) minter allows for a series of English auctions for individual tokens to be run in sequence. The minter was originally inspired by the popular nouns.wtf project, and was implemented with minor adjustments to provide a seamless experience for Art Blocks artists and collectors.","Artists may configure future token auction parameters, such as starting auction price and minimum auction length. Collectors may then kick off token auctions by submitting a bid for a pre-minted token. Once an auction begins, any wallet may submit a higher bid for the token up for sale. Losing bids are refunded automatically when outbid. If a bid is submitted near the end of an auction, the auction is extended such that a human is able to submit a higher bid, ensuring a human can fairly compete against a bot.","Once an auction is complete, another token auction may be started by any collector submitting a bid for the next token, while also sending the previous auction winner their token.","The minter pre-mints tokens before their auction, so bids are placed on an already-existing token, not on hypothetical tokens.","The minter may be used for any project, and is certainly ideal for projects that have a series of tokens that are released in a sequence. It may also be used to auction off a 1:1 token. The minter is also ideal for projects that have a strong community, as it allows for community members to participate in the auction process over a long period of time, carefully considering each generative output.","Bids and auction parameters are stored on-chain, and the Art Blocks subgraph and API index all historical bids in bids_metadata as well as auction parameters in project_minter_configurations."]},{"i":"set-price-polyptych","l":"Set Price, Polyptych","p":["This minter enables the artist to mint tokens with identical token hashes. This is useful for projects that are intended to be displayed as a polyptych.","This minter allows either artists to mint child tokens to a parent token holder's wallet, or allows the parent token holder to mint child tokens.","An artist's script must work closely with the minter to ensure that the correct frame is used for each token number. For example, if a project has 3 frames, the artist's script must ensure that e.g. tokens 0-99 are minted with frame 1, tokens 100-199 are minted with frame 2, and tokens 200-299 are minted with frame 3. The artist is able to increment the frame number for their project on the minter.","This minter is technically complex, and artists must also configure the shared randomizer when using this minter.","Limited creator dashboard support is available for this minter at this time, so some interactions with the minter must be done via a service such as [Etherscan]]( https://etherscan.io/).","Despite the complexity of this minter, the resulting outputs can be very powerful and rewarding for artists and collectors!"]},{"i":"custom-one-off-minters","l":"Custom, One-Off Minters","p":["Engine partners can also create custom, one-off minters for their projects. These minters are only available to projects on the Engine contract that approves them, extending the globally set of available minters for their contract.","For more information about adding custom minters to your Engine contract, please see the Minter Migration Runbok."]}],[{"i":"custom-one-off-minters","l":"Custom, One-Off Minters","p":["Some Engine partners may wish to add custom, one-off minters to the shared minter suite. This is able to be done by the admin of an Engine partner's core contract.","Due to the high flexibility available to custom minters, they are not indexed by the Art Blocks subgraph, and therefore are not able to be configured by artists via the Art Blocks frontend. Instead, the custom minter will need to be configured via the Engine partner's frontend, etherscan, etc.","The steps to add a custom, one-off minter to the shared minter suite are as follows:"]},{"l":"1. Write the custom minter contract","p":["The Engine partner will need to write the custom minter contract. The Art Blocks team can assist with providing guidance on how to translate a previously written, non-shared custom minter contract to be compatible with the new shared minter suite, if needed.","At a minimum, the custom minter contract will need to implement the ISharedMinterRequired interface, which is available in the Art Blocks smart contracts monrorepo. This interface requires the custom minter contract to implement the following functions:","Additionally, the custom minter contract will need to call the mint_joo function on the shared minter filter contract to mint tokens. This function is included in the IMinterFilterV1 interface in the Art Blocks smart contracts monrorepo."]},{"l":"2. Deploy the custom minter contract","p":["The Engine partner will need to deploy the custom minter contract to the desired network."]},{"l":"3. Allowlist the minter for the core contract on the shared minter filter contract","p":["The Engine partner will need to allowlist the custom minter contract for their contract, on the shared minter filter contract. This is done by doing the following:","Engine Admin calls approveMinterForContract on the shared minter filter contract, passing in the address of their core contract, and the custom minter contract","The custom minter is now ready to be used by projects on the Engine partner's core contract!"]},{"l":"4. Artist configures the custom minter for their project","p":["The artist will need to configure the custom minter for their project. Custom, one-off minters are not indexed by the Art Blocks subgraph (due to the minter being arbitrary and open-ended), so the artist will need to configure the custom minter via the Engine partner's frontend, etherscan, etc. Note that the typical minter filter function for setting a minter for a project, setMinterForProject should be used by the artist or admin to assign the custom minter for the project."]}],[{"l":"Minter Suite Supplemental Information","p":["This page provides supplemental information for the Art Blocks Shared Minter Suite.","The information below is generally most relevant for Engine core contract admins."]},{"l":"Auction Reset Process","p":["A subset of minters utilize automated, scheduled auctions to distribute artwork to collectors. The auction reset process is a mechanism that allows artists to pause and reschedule their auction, within certain limitations, if an issue arises during a live project release. Example situations may be:","Unexpected website downtime","Artist unintentionally left project in a paused state","Auction parameters were not set as intended","Some of the possible failure modes above can result in a state where:","Collectors are not able to purchase tokens from the website","Bots are still able to purchase tokens by submitting transactions directly to the blockchain","If in a state where bots can purchase but humans can not, the situation requires immediate action to prevent or minimize damage."]},{"i":"1-urgent-pause-the-auction","l":"1. [URGENT] Pause the Auction","p":["The most important step in the auction reset process is for the Artist pause the auction. This prevents any further purchases from being made.","Tips:","Ensure that the project is not already paused (i.e. this step is already complete), and do not toggle the pause button more than once (i.e. pause then unpause)","Artist should use a very high gas price to ensure that the pause transaction is mined quickly","Artist should use a tool like Etherscan to monitor the status of the pause transaction","Verify the paused state of the contract by checking the project's core contract on a tool like Etherscan","DA with Settlement: This step is especially urgent! Settlement minters require that every new purchase price is less than or equal to the previous purchase price (even after an auction is reset). If a bot purchases a token prior to a project being paused, that project’s reconfigured auction (even after reset) is constrained to only be able to start at the bot’s purchase price."]},{"l":"2. Reset auction","p":["When using a Dutch auction, the auction will need to be reset and reconfigured.","This is a 2-step provess, and requires admin-intervention for security:","ADMIN - Call resetAuctionDetails on the minter contract","ARTIST - Configure the auction parameters via your typical process (e.g. artist dashboard)"]},{"i":"3-communicate-and-enjoy","l":"3. Communicate and enjoy!","p":["Ensure your collectors are aware of the new auction parameters, and enjoy the new auction!"]},{"i":"allowlist-minter-details-non-shared-minter-suite-only","l":"Allowlist Minter Details (non-shared minter suite only)","p":["The Allowlist Minter uses a Merkle tree to gas-efficiently allow a set of addresses to mint tokens from a project.","Merkle trees are a data structure that allow for efficient verification of whether a given element is contained in a set. In the case of the Allowlist Minter, the Merkle root is stored on-chain, and Merkle proofs are included with every purchase transaction to verify that a given address is allowed to mint a token.","The information below is included to assist Engine partners in using the Allowlist minter with their projects. However, if using the shared minter suite, the Art Blocks subgraph and api are available to index Engine minter suite data, and this information is not required.","Fundamentals","The Merkle allowlist minter follows the following basic process:","An allowlist of wallet addresses is stored off-chain (e.g. in a csv file)","The artist uploads the Merkle root of the list of addresses to the Minter contract via function updateMerkleRoot","Collectors calculate and include a Merkle proof with their purchase transaction to verify that their address is included in the allowlist","Example Usage","The following typescript code demonstrates how a Merkle root and proof may be calculated for a given allowlist:"]}],[{"l":"API Overview","p":["An overview of the current Art Blocks APIs.","Quick Links:","Token API","Generator API","Media API/Media Server","Art Blocks Subgraph","GraphQL API"]},{"l":"Hosted APIs","p":["As a quick overview, the main APIs that exist currently are:"]},{"l":"Token API","p":["Arbitrum One","Arbitrum Testnet","Contract Type","Engine","Flagship","https://token.arbitrum-staging.artblocks.io/{contractAddress}/{tokenID}","https://token.arbitrum.artblocks.io/{contractAddress}/{tokenID}","https://token.artblocks.io/0","https://token.artblocks.io/0x0a1bbd57033f57e7b6743621b79fcb9eb2ce3676/110000","https://token.staging.artblocks.io/0x81236b5a105d3ad6b56ac41a03e1fd8893a08859/1000001","https://token.staging.artblocks.io/0xda62f67be7194775a75be91cbf9feedcc5776d4b/103000000","https:token.artblocks.io/{contractAddress}/{tokenID}","https:token.artblocks.io/{tokenID}","https:token.staging.artblocks.io/{contractAddress}/{tokenID}","Mainnet","Note: Contract address is required","Note: Contract address is required for Engine","Pattern","Provides the token metadata for a given Art Blocks token.","Sample","Testnet"]},{"l":"Generator API","p":["Arbitrum One","Arbitrum Testnet","Contract Type","Engine","Flagship","https://generator-staging-goerli.artblocks.io/0xda62f67be7194775a75be91cbf9feedcc5776d4b/8000002","https://generator-staging-goerli.artblocks.io/0xe745243b82ebc46e5c23d9b1b968612c65d45f3d/1000001","https://generator-staging-sepolia.artblocks.io/{contractAddress}/{tokenID}","https://generator.arbitrum-staging.artblocks.io/{contractAddress}/{tokenID}","https://generator.arbitrum.artblocks.io/{contractAddress}/{tokenID}","https://generator.artblocks.io/{contractAddress}/{tokenID}","https://generator.artblocks.io/{tokenID}","https://generator.artblocks.io/0","https://generator.artblocks.io/0x0a1bbd57033f57e7b6743621b79fcb9eb2ce3676/11000083","Mainnet","Note: Contract address is required","Note: Contract address is required for Engine","Pattern","Provides an i-frame-able live-view for the art associated with a given Art Blocks token.","Sample","Testnet"]},{"i":"media-apimedia-server","l":"Media API/Media server","p":["Arbitrum One","Arbitrum Testnet","Contract Type","Engine","Flagship","HD Renders – https://media.artblocks.io/hd/{tokenID}.png","https://{enginePartner}-mainnet.s3.amazonaws.com/{tokenID}.png","https://{enginePartner}-mainnet.s3.amazonaws.com/thumb/{tokenID}.png","https://{enginePartner}-sepolia.s3.amazonaws.com/{tokenID}.png","https://art-blocks-artist-staging-goerli.s3.us-west-1.amazonaws.com/10000000.png","https://art-blocks-artist-staging-sepolia.s3.us-west-1.amazonaws.com/{tokenID}.png","https://bright-moments-goerli.s3.amazonaws.com/1000000.png","https://bright-moments-mainnet.s3.amazonaws.com/8000000.png","https://bright-moments-mainnet.s3.amazonaws.com/thumb/8000000.png","https://media-proxy-arbitrum-staging.artblocks.io/{contractAddress}/{tokenID}","https://media-proxy-arbitrum.artblocks.io/{contractAddress}/{tokenID}","https://media-proxy-staging.artblocks.io/{contractAddress}/{tokenID}.png","https://media-proxy-staging.artblocks.io/{tokenID}.png","https://media-proxy-staging.artblocks.io/0.png","https://media-proxy-staging.artblocks.io/0xe745243b82ebc46e5c23d9b1b968612c65d45f3d/1000001","https://media-proxy.artblocks.io/{contractAddress}/{tokenId}.png","https://media-proxy.artblocks.io/0x145789247973c5d612bf121e9e4eef84b63eb707/782.png","https://media.artblocks.io/{tokenID}.png","https://media.artblocks.io/0.png","In addition to the standard static renders provided for each token, there are two other static renders currently provided: \"HD\" and \"thumbnail\". These items can be found at:","Mainnet","Mainnet (Engine)","Note: Contract address is required","Pattern","Please also note that the Generator API and Media API links for a given token are included in the token response for that token from the Token API.","Please note that these additional static render formats are still currently being back-filled and may not yet be present for all tokens. Our current recommendation for those looking to depend on the \"HD\" or \"thumbnail\" responses is to a) first attempt the HD/thumb image resource that you would pefer, b) if this resource is not available, fall back to the standard sized image resource. For the current state of the ongoing backfill of HD and thumbnail assets, please refer to this spreadsheet.","Provides a static snapshot of the rendered live-view for a given Art Blocks token.","Render Type","Sample","Standard","Testnet","Thumbnail","Thumbnail Renders – https://media.artblocks.io/thumb/{tokenID}.png","We are working on a media server for Engine partners. Currently, media is accessible through individual s3 buckets."]},{"l":"Art Blocks Subgraph","p":["Art Blocks has a GraphQL API Endpoint hosted by The Graph called a subgraph for indexing and organizing data from the Art Blocks smart contracts.","This subgraph can be used to query for on-chain data related to the Art Blocks contracts, including minter suite data, token data, and project data.","Subgraph information is serviced by a decentralized group of server operators called Indexers."]},{"l":"Ethereum Mainnet","p":["Explorer Page","Graphql Endpoint: https://gateway-arbitrum.network.thegraph.com/api/[api-key]/subgraphs/id/6bR1oVsRUUs6czNiB6W7NNenTXtVfNd5iSiwvS4QbRPB","Code Repo"]},{"l":"Helpful Resources","p":["Video Tutorial on creating an API Key","Managing your API Key & setting your indexer preferences","Querying from an application","How to use the explorer and playground to query on-chain data"]},{"l":"Querying the Subgraph","p":["Art Blocks Data","Decentralized Graph Network","Environment","Hosted Service","https://thegraph.com/explorer/subgraphs/6bR1oVsRUUs6czNiB6W7NNenTXtVfNd5iSiwvS4QbRPB","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks-arbitrum","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks-artist-staging-sepolia","https://thegraph.com/hosted-service/subgraph/artblocks/art-blocks-staging-arbitrum","Limited Secondary Sales Data","No","Production","Recommendation: Using the above links, familiarize yourself with the subgraph’s schema, via the GraphQL playground.","Staging","The Art Blocks Arbitrum subgraphs can be queried at the URLs below:","The Art Blocks mainnet subgraph can currently be queried a few ways:","The Art Blocks testnet subgraph can be queried at the URL below:","The Graph Service","URL","Yes"]},{"l":"Getting Minter Details","p":["A few example queries are provided below to help you get started with querying the Art Blocks subgraph for data related to a project's minter. In addition to the subgraph, the fields are also able to be queried from our Hasura GraphQL API. In the future, Art Blocks will release an SDK that will interact with these data in an even more convenient way.","Note that only Engine contracts that have migrated to the shared minter suite will have their minters indexed and available on the subgraph and Hasura GraphQL API. Only globally approved minters are indexed, so custom, one-off minters designed by Engine partners will not be indexed.","A project's active minter configuration (as configured in the artist dashboard) may be queried by pulling it from the Project entity:","note: if querying the Hasura GraphQL API, use projects_metadata instead of project","The extraMinterDetails json field of minterConfiguration will contain a JSON string that can be parsed to obtain the project-minter-configuration details that may be specific to the minter type. For example, for a Dutch Auction minter, the extraMinterDetails field may contain the following JSON string:","note: if querying the Hasura GraphQL API, the returned type will be a JSONB","Additionally, the minter's extraMinterDetails will contain a JSON string that can be parsed to obtain any minter-specific configuration details. For example, for a Dutch Auction minter, the extraMinterDetails field may contain the following JSON string:","note: if querying the Hasura GraphQL API, use minters_metadata instead of minters, and the returned type will be a JSONB","All of these queries can help you to obtain information about a project's minter configuration, which can be used to display purchase information for the project on your website's. The data are available on both the subgraph, and the Hasura GraphQL API."]},{"l":"GraphQL API","p":["Provides a broader set of the data that our front-end consumes — this includes both on-chain and off-chain data.","Chain","Environment","URL","Ethereum","Production","https://data.artblocks.io/v1/graphql","Staging","https://ab-staging-sepolia.hasura.app/v1/graphql","Staging (deprecated)","https://ab-staging-goerli.hasura.app/v1/graphql","Arbitrum","https://ab-prod-arbitrum.hasura.app/v1/graphql","https://ab-staging-arbitrum.hasura.app/v1/graphql"]},{"l":"Authentication","p":["The following documentation explains how to authenticate with the Art Blocks API to retrieve a JSON Web Token (JWT). This JWT can then be used to gain authenticated access to our GraphQL API. The methods explained here are intended for a client-side environment where a signer is available to sign messages. The procedures are explained using two approaches: Direct API endpoints and GraphQL.","We recommend using the GraphQL-based approach as we have more control over it and can ensure its stability even if underlying API endpoints change. Note that the domain for authentication may change in the future for the Direct API-based approach, while the GraphQL endpoint will remain the same."]},{"i":"graphql-based-authentication-flow-recommended","l":"GraphQL-based Authentication Flow (Recommended)","p":["The GraphQL-based approach leverages the GraphQL schema provided by Art Blocks. This is the recommended approach for stability and future-proofing your implementation.","Here are the functions used in this flow:"]},{"l":"Direct API-based Authentication Flow","p":["The Direct API-based approach involves interacting with the https://artblocks.io/api/get-auth-message and https://artblocks.io/api/authenticate endpoints. We recommend using the GraphQL-based flow instead because of its improved stability and future-proofing, but we're providing the Direct API-based method for those who prefer it.","⚠️ Warning: The domain for authentication may change in the future for the Direct API-based approach. Using the GraphQL-based approach is recommended to avoid future disruptions.","Here are the functions used in this flow:","In both methods, you will find a placeholder /* code to sign message goes here */ where you should implement your code to sign the message using your client-side signer."]},{"l":"Using the JWT for Authenticated Access","p":["Once the JWT has been obtained using either of the above methods, it can be used to make authenticated requests to the Art Blocks GraphQL API. The JWT should be included in the Authorization header of the request. Here's an example:","For a full detailed overview of this GraphQL API, please reference: https://docs.artblocks.io/public-api-docs/","Additionally, you can use this interactive Hasura plaground to test out queries: https://cloud.hasura.io/public/graphiql?endpoint=https://data.artblocks.io/v1/graphql"]}],[{"l":"Artblocks Viewer","p":["An overview of live.artblocks.io"]},{"l":"Routes","p":["All routes are for the environment specified in .env file and act as such. i.e. Ropsten contracts will not work on mainnet and vice versa","live.artblocks.io/ Home page of the site which returns the latest rendered minted token from any of the Art Blocks contracts","live.artblocks.io/{CONTRACT_ADDRESS} enter any Art Blocks or Engine contract and you be presented with the latest rendered mint.","Example: Latest Artblocks_VO mint","live.artblocks.io/{CONTRACT_ADDRESS}/{PROJECT_INDEX} enter any Art Blocks or Engine contract followed by the index of the project and you be presented with the latest rendered mint.","Example: Latest Chromie Squiggle mint","live.artblocks.io/token/{TOKEN_ID} enter any Art Blocks or Engine token id and you are presented with that token.","Example: Chromie Squiggle mint #71","live.artblocks.io/random/{CONTRACT_ADDRESS} enter any Art Blocks or Engine contract address and you are presented with a random active project","Example: Random Art Blocks v3 contract","live.artblocks.io/random/{CONTRACT_ADDRESS}/{PROJECT_INDEX} enter any Art Blocks or Engine contract address and a project index you are presented with a random token from that project","Example: Random Chromie Squiggles"]},{"l":"Random Query Params","p":["You can add any query params from the customizable display listed below as well as two random specific query params.","reloadClick: this is to turn on click reloading where if you click the token it will give you a new token from that project. default: false","reloadDelay: this is to turn on auto refreshing after the specified time in seconds to give you a new token from that project. default: none","Example URLs:","Click turned on","Delay of 30 seconds and click turned on","Delay of 30 seconds with no click"]},{"l":"Contracts","p":["This is a running list of contract addresses for various Art Blocks and Engine","Mainnet:","Artblocks_VO: 0x059edd72cd353df5106d2b9cc5ab83a52287ac3a","Artblocks_V1: 0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270","ARTCODE: 0xd10e3dee203579fcee90ed7d0bdd8086f7e53beb","Doodle Labs: 0x28f2d3805652fb5d359486dffb7d08320d403240","CryptoCitizens: 0xbdde08bd57e5c9fd563ee7ac61618cb2ecdc0ce0","Flutter: 0x13aae6f9599880edbb7d144bb13f1212cee99533","MOMENT: 0x0a1bbd57033f57e7b6743621b79fcb9eb2ce3676","Plottables: 0xa319c382a702682129fcbf55d514e61a16f97f9c","TBOA: 0x62e37f664b5945629b6549a87f8e10ed0b6d923b"]},{"l":"Customizable Display","p":["A Plottables project (full screen)","Algobots (with text)","All of the customization that can be done and the default values are as follows:","backgroundColor: this can be any six digit hex color and is the background color of the page default: ffffff","Example URLs:","fontSize: this can be any valid html size and is the size of the text default: 20px","height: this can be any valid html size and is the height of the token being displayed default: 90vh","Latest Artblocks Mint","Latest Chimera","showText: this is whether or not to show the text information about the currently displayed token. All other text params depend on this to be true to work default: false","Streamlines #414","textBackground: this can be any six digit hex color and is the background color of the text default: none","textBottom: this can be any valid html size and is the distance from the bottom of the screen of the text default: 3em","textColor: this can be any six digit hex color and is the color of the text default: 000000","useCustomViewParams: this is to specify you are using the custom view display and all other params require this to be true. default: false","width: this can be any valid html size and is the width of the token being displayed default: 90vw","You can create a customizable display for any route on artblocks-viewer. This is done through query params added to the end of the url. In order to activate this ability you must first add ?useCustomViewParams=true to the end of the whatever route you are using. Here is the most basic customized url of Chromie Squiggle mint #71 with just the squiggle centered in the middle of the page."]}],[{"l":"Querying","p":["Below are some sample queries you can use to gather information from the Art Blocks contracts.","You can build your own queries using a GraphQL Explorer and enter your endpoint to limit the data to exactly what you need."]},{"l":"Subgraph Querying Walkthrough","p":["The following provides some examples on how to use the Art Blocks subgraph to perform a handful of common queries."]},{"l":"Important Notes","p":["Performance/indexing on the hosted subgraph service is oftentimes slower compared to the decentralized subgraph. That being said, the hosted subgraph is free while the decentralized one requires pay-per-query in GRT.","The Art Blocks subgraphs currently also index any PBAB (Powered by Artblocks) contracts, in addition to the core Art Blocks contracts. Please keep that in mind and make use of the contract_in filter to ensure you are working with Art Blocks data only, if that is your intention.","While querying against the mainnet subgraph if using the contract_in filter the Art Blocks contracts to restrict for are 0x059edd72cd353df5106d2b9cc5ab83a52287ac3a(for the V0 contract that supports projects 0-3) and 0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270(for the V1 contract that supports projects 4-current).","The Art Blocks contract to restrict for is 0xda62f67be7194775a75be91cbf9feedcc5776d4b on testnet."]},{"l":"The Basics","p":["Retrieving a specific Art Blocks project by short ID (no contract):","Retrieving a specific Art Blocks project by full ID (includes contract):","Retrieving a specific Art Blocks token by short ID (no contract):","Retrieving a specific Art Blocks token by full ID (includes contract):"]},{"l":"Beyond The Basics","p":["Retrieve the last 5 most recently created projects across Art Blocks and Powered by Art Blocks (remember that you can use a contract_in filter to restrict this to only specific contracts):","Retrieve the top 10 projects across Art Blocks and Powered by Art Blocks, based on # of invocations:","Retrieve the most recently minted Art Blocks token:","Retrieve all tokens owned by a specific address, across Art Blocks and Powered by Art Blocks:","Retrieve the general metadata/status for the Art Blocks subgraph (useful for debugging):","Retrieve the project script for a given project id","Pagination should be used for large queries. The Graph enforces upper limits on first and skip parameters since they generally perform poorly when set to large values (limits as of 01/2022 are first=1000 and skip=5000). It is much better to page through entities based on an attribute such as token ID, block number, or some other parameter. For more information, see The Graph documentation"]},{"l":"Project info","p":["Pull all projects and return their name, as well as lots of additional data:","Get all the wallet owners of a project (Replace PROJECT with the project name you are looking for)","If you're looking for the addresses of anyone that owns a mint from a project","Get that txnhash for squiggle 0, you could run the following query on the AB subgraph playground"]}],[{"l":"Entities","p":["Account","AccountProject","Contract","CoreRegistry","Dependency","DependencyAdditionalCDN","DependencyAdditionalRepository","DependencyRegistry","DependencyScript","Minter","MinterFilter","MinterFilterContractAllowlist","Project","ProjectExternalAssetDependency","ProjectMinterConfiguration","ProjectScript","ProposedArtistAddressesAndSplit","Receipt","Token","Transfer","Whitelisting"]},{"l":"Project","p":["A project is complete when it has reached its maximum invocations","Account!","AccountProject!","Accounts that own tokens of the project","activatedAt","active","additionalPayee","additionalPayeePercentage","additionalPayeeSecondarySalesAddress","additionalPayeeSecondarySalesPercentage","Address to split primary sales with the artist","Address to split Secondary sales with the artist","artist","Artist description of the project","Artist name","Artist or project website","Artist that created the project","Artist/additional payee royalty percentage","artistAddress","artistName","Aspect ratio of the project (see scriptJSON if null)","aspectRatio","baseIpfsUri","baseUri","BigInt","BigInt!","Boolean","Boolean!","Bytes","Bytes!","complete","completedAt","contract","Contract associated to project","Contract!","createdAt","Curated, playground, factory. A project with no curation status is considered factory","curationStatus","Currency symbol for ERC-20","currencyAddress","currencySymbol","Description","Description: get various details about a specific project","Determines if the project should be visible to the public","Does the project actually use the hash string","Does the project use media from ipfs","dynamic","ERC-20 contract address if the project is purchasable via ERC-20","externalAssetDependencies","externalAssetDependenciesLocked","externalAssetDependencyCount","Extra information about the script and rendering options","Field","For V3 and-on, this field is null, and projects lock 4 weeks after completedAt. Once the project is locked its script may never be updated again","id","ID of the project on the contract","ID!","Interplanetary File System function that meets the encrypted demands needed to solve for a blockchain computation","invocations","ipfsHash","Is the project dynamic or a static image","license","License for the project","locked","Lookup table to get the Sale history of the project","Maximum number of invocations allowed for the project","maxInvocations","Minter configuration for this project (not implemented prior to minter filters)","minterConfiguration","name","Number of times the project has been invoked - number of tokens of the project","Once the project's external asset dependencies are locked they may never be modified again","owners","Parts of the project script","paused","Percentage of artist's share of primary sales that goes to additional payee","Percentage of artist's share of secondary sales that goes to additional payee","pricePerTokenInWei","Project name","Project!","ProjectExternalAssetDependency!","projectId","ProjectMinterConfiguration","Projects external asset dependencies","Proposed Artist addresses and payment split percentages","ProposedArtistAddressesAndSplit","proposedArtistAddressesAndSplits","Purchases paused","royaltyPercentage","SaleLookupTable!","saleLookupTables","script","Script type and version (see scriptJSON if null)","scriptCount","scriptJSON","scripts","scriptTypeAndVersion","scriptUpdatedAt","String","The base URI is the mutual part among each NFT's URI. By default, the URI is baseURI/tokenId","The full script composed of scripts","The number of external asset dependencies stored on-chain","The number of scripts stored on-chain","Timestamp at which a project was completed","Token!","tokens","Tokens of the project","Type","Uniform Resource Identifier Interplanetary File System (IPFS) of of a nonfungible token","Unique identifier made up of contract address and project id","updatedAt","useHashString","useIpfs","Wallet address of the artist","website","Wei is the smallest denomination of ether—the cryptocurrency coin used on the Ethereum network. One ether = 1,000,000,000,000,000,000 wei (1018)","WHen project activated","When project inititated","When project updated","when the script was updated"]},{"l":"ProjectScript","p":["BigInt!","Description","Description: get specific details of the project script","Field","id","ID!","index","Name of project","project","Project!","script","Script of the project","String!","The dependency index","Type","Unique identifier made up of contract address and project id"]},{"l":"ProposedArtistAddressesAndSplit","p":["additionalPayeePrimarySalesAddress","additionalPayeePrimarySalesPercentage","additionalPayeeSecondarySalesAddress","additionalPayeeSecondarySalesPercentage","artistAddress","BigInt!","Bytes!","createdAt","Description","Description: get specific details on the pay flow for a specified artist","Field","id","ID!","project","Project associated with this proposed artist addresses and splits","Project!","Proposed artist additional payee address for primary sales","Proposed artist additional payee address for secondary sales","Proposed artist additional payee percentage for primary sales","Proposed artist additional payee percentage for secondary sales","Proposed artist address","Type","Unique identifier made up of contract address and project id","When address initiated"]},{"l":"CoreRegistry","p":["Description: Get specific details on the Art Blocks Core registry. At this time, this is used for indexing purposes of V3 contracts, as well as acting as an allowlist of core contracts that may mint on a shared minter filter.","Field","Type","Description","id","ID!","Unique identifier made up of the Core Registry's contract address. note: for legacy MinterFilters, this is a dummy ID, equal to the address of the single core contract associated with the minter filter","registeredContracts","[Contract!]","All core contracts that are registered on this CoreRegistry, when this is most recent Core Registry to add the contract"]},{"l":"Contract","p":["[Bytes!]!","Accounts whitelisted on the contract","Address that receives primary sales platform fees","Address that receives primary sales platform fees, only for V3_Engine contracts","Address that receives secondary sales platform royalties (null for pre-V3 contracts, check Royalty Registry)","Address that receives secondary sales platform royalties, only for V3_Engine contracts","Associated minter filter (if applicable)","autoApproveArtistSplitProposals","Automatically approve all artist split proposals (used on V3 Engine contracts)","Basis points of secondary sales allocated to the platform (null for pre-V3 contracts, check Royalty Registry)","Basis points of secondary sales allocated to the platform, only for V3_Engine contracts","BigInt","BigInt!","Boolean","Boolean!","Bytes","Bytes!","Core contract type","CoreType!","createdAt","Curation registry contract address","curationRegistry","Dependency registry contract address","dependencyRegistry","Description","Description: get specific information about contracts","enginePlatformProviderAddress","enginePlatformProviderPercentage","enginePlatformProviderSecondarySalesAddress","enginePlatformProviderSecondarySalesBPS","EngineRegistry","Field","id","ID!","Latest engine registry that this contract is registered with, if any (used for indexing purposes)","List of contracts that are allowed to mint","List of projects on the contract","List of tokens on the contract","minterFilter","mintWhitelisted","New projects forbidden (can only be true on V3+ contracts)","newProjectsForbidden","nextProjectId","Percentage of primary sales allocated to the platform","Percentage of primary sales allocated to the platform, only for V3_Engine contracts","preferredArweaveGateway","preferredIPFSGateway","Project ID listed on the contract","Project!","projects","Randomizer contract used to generate token hashes","randomizerContract","registeredOn","renderProviderAddress","renderProviderPercentage","renderProviderSecondarySalesAddress","renderProviderSecondarySalesBPS","String","The Engine Flex contract allows you to specify preferred gateways for the currently supported dependency types (IPFS & Arweave)","Token!","tokens","Type","Unique identifier made up of contract address","updatedAt","When contract initiated","When contract updated","whitelisted","Whitelisting!"]},{"l":"Whitelisting","p":["Description: get whitelist information","Field","Type","Description","id","ID!","Unique identifier whitelist account id","account","Account!","Account associated to whitelisting","contract","Contract!","contract associated to whitelisting"]},{"l":"Account","p":["AccountProject!","Contracts the account is whitelisted on","Description","Description: get specific information about an account","Field","id","ID!","Project!","Projects the account is listed as artist for","Projects the account owns tokens from","projectsCreated","projectsOwned","Token!","tokens","Tokens the account has","Type","Unique identifier account id","whitelistedOn","Whitelisting!"]},{"l":"AccountProject","p":["account","Account associated to project","Account!","count","Description","Description: get project account information","Field","id","ID!","Int!","Name of project","project","Project!","Total count of the project","Type","Unique identifier token id"]},{"l":"Token","p":["Account!","BigInt!","Bytes!","contract","Contract the token is on","Contract!","createdAt","Current owner of the token","Description","Description: get various token information","Field","hash","id","ID of the token on the contract","ID!","invocation","Invocation number of the project","Lookup table to get the Sale history","Next available sale id","nextSaleId","owner","project","Project of the token","Project!","SaleLookupTable!","saleLookupTables","Specifies the endpoint for retrieving access tokens when OAuth 2.0 authentication is enabled","String","tokenId","Transaction hash of token mint","transactionHash","Transfer!","transfers","Transfers of the token","Type","Unique identifier made up of contract address and token id","Unique string used as input to the tokens project script","updatedAt","uri","When token initiated","When token updated"]},{"l":"MinterFilter","p":["[Minter!]!","[MinterFilterContractAllowlist!]!","BigInt!","Core contract registry used by this MinterFilter. Note: For MinterFilter V0 and V1, a dummy CoreRegistry is used","coreRegistry","CoreRegistry!","Description","Description: get details about minters on a project","Field","id","ID!","Known minters that are tied to this MinterFilter, but are not necessarily approved on this MinterFilter","knownMinters","Minter!","minterFilterContractAllowlists","minterGlobalAllowlist","Minters allowlisted at a contract-level on this MinterFilter","Minters allowlisted globally on this MinterFilter","Type","Unique identifier made up of minter contract address","updatedAt","When minter updated"]},{"l":"MinterFilterContractAllowlist","p":["[Minter!]!","BigInt!","contract","Contract!","Core contract","Description","Description: Defines a contract-specific allowlist of minters specifically approved on a given shared minter filter. This is used to extend the set of allowlisted minters beyond a shared minter filter's set of globally allowlisted minters.","Field","id","ID!","Minter contract addresses allowed at the contract level (extending global MinterFilter allowlist)","minterContractAllowlist","minterFilter","MinterFilter contract","MinterFilter!","Type","Unique identifier made up of -","updatedAt","When last updated"]},{"l":"Minter","p":["[Receipt!]","Associated Minter Filter","BigInt!","Boolean representing if the Minter is globally allowed on its associated minter filter","Boolean!","Configuration details used by specific minters (json string)","Description","Description: get details about mint on a project","extraMinterDetails","Field","id","ID!","isGloballyAllowlistedOnMinterFilter","Minter type","minterFilter","MinterFilter!","MinterType!","receipts","Receipts for this minter, only for minters with settlement","String!","Type","Unique identifier made up of minter contract address","updatedAt","When the minter updated"]},{"l":"ProjectMinterConfiguration","p":["basePrice","BigInt","Boolean!","Bytes!","Configuration details used by specific minter project configurations (json string)","currency address as defined on minter - address(0) reserved for ether","currency symbol as defined on minter - ETH reserved for ether","currencyAddress","currencySymbol","Defines if purchasing token to another is allowed","Description","Description: get details of a specific mint","extraMinterDetails","Field","id","ID!","Maximum number of invocations allowed for the project (on the minter)","maxInvocations","minter","Minter!","price of token or resting price of Duch auction, in wei","priceIsConfigured","project","Project!","purchaseToDisabled","String!","The associated minter","The associated project","true if project's token price has been configured on minter","Type","Unique identifier made up of --"]},{"l":"Receipt","p":["account","Account!","BigInt!","Description","Description: get details about purchases on a minter with settlement","Field","id","ID!","Last updated timestamp","minter","Minter!","netPosted","numPurchased","project","Project!","The associated account","The associated minter","The associated project","The total net amount posted (set to settlement contract) for tokens","The total quantity of tokens purchased on the project","Type","Unique identifier made up of ---","updatedAt"]},{"l":"Transfer","p":["address transferred from","address transferred to","BigInt!","Bytes!","createdAt","Description","Description: transfer info on an NFT","Field","from","id","ID!","to","token","token address of NFT","Token!","transaction hash of transfer","transactionHash","Type","Unique identifier of transfer","when transfer initiated"]},{"l":"ProjectExternalAssetDependency","p":["BigInt!","cid","dependencyType","Description","Description: get info about projects external asset dependency","Field","id","ID!","index","project","Project!","ProjectExternalAssetDependencyType!","String!","The associated project","The dependency cid","The dependency index","The dependency type","Type","Unique identifier made up of projectId-index"]},{"l":"Dependency","p":["[DependencyAdditionalCDN!]!","[DependencyAdditionalRepository!]!","[DependencyScript!]!","Additional CDNs for this dependency","Additional repositories for this dependency","additionalCDNCount","additionalCDNs","additionalRepositories","additionalRepositoryCount","BigInt!","Concatenated string of all scripts for this dependency","Dependency registry contract that this dependency is registered on","dependencyRegistry","DependencyRegistry!","Description","Description: information about registered dependency (e.g. p5js@1.0.0)","Field","id","ID!","List of on-chain scripts that for this dependency","Number of additional CDNs for this dependency","Number of additional repositories for this dependency","Number of on-chain scripts for this dependency","Preferred CDN for this dependency","Preferred repository for this dependency","preferredCDN","preferredRepository","Reference website for this dependency (e.g. https://p5js.org)","referenceWebsite","script","scriptCount","scripts","String","String!","Timestamp of last update","Type","Unique identifier made up of dependency name and version separated by an @ symbol (e.g. p5js@1.0.0)","updatedAt"]},{"l":"DependencyRegistry","p":["[Contract!]!","[Dependency!]","BigInt!","Bytes!","Core contracts that this registry can provide dependency overrides for","Current owner of this contract","dependencies","Description","Description: information about a dependency registry contract","Field","id","List of dependencies that are registered on this registry contract","owner","supportedCoreContracts","Timestamp of last update","Type","Unique identifier made up of dependency registry contract address","updatedAt"]},{"l":"DependencyAdditionalCDN","p":["BigInt!","cdn","dependency","Dependency this additional CDN belongs to","Dependency!","Description","Description: information about an additional CDN for a dependency","Field","id","ID!","index","Index of this additional CDN","String!","Type","Unique identifier made up of dependency id and index","URL of the CDN"]},{"l":"DependencyAdditionalRepository","p":["BigInt!","dependency","Dependency this additional repository belongs to","Dependency!","Description","Description: information about an additional repository for a dependency","Field","id","ID!","index","Index of this additional repository","repository","String!","Type","Unique identifier made up of dependency id and index","URL of the repository"]},{"l":"DependencyScript","p":["address","Address of the bytecode storage contract for this script","BigInt!","Bytes!","Contents of script","dependency","Dependency this script belongs to","Dependency!","Description","Description: information about a script for a dependency","Field","id","ID!","index","Index of this script","script","String!","Type","Unique identifier made up of dependency id and index"]}]]
\ No newline at end of file
diff --git a/sitemap.xml.gz b/sitemap.xml.gz
index faec952d..f5ac02d1 100644
Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ