{"id":459,"date":"2025-04-17T22:51:44","date_gmt":"2025-04-17T22:51:44","guid":{"rendered":"https:\/\/slavy.site\/?page_id=459"},"modified":"2025-04-17T22:53:29","modified_gmt":"2025-04-17T22:53:29","slug":"binance-nft-factory","status":"publish","type":"page","link":"https:\/\/slavy.site\/index.php\/binance-nft-factory\/","title":{"rendered":"Binance NFT Factory"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\ud83c\udfa8 How to Deploy an ERC721 NFT Factory Contract with IPFS Metadata<br>\ud83d\udee0 Step 1: Use the Correct Smart Contract Code<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ SPDX-License-Identifier: MIT<br>pragma solidity ^0.8.20;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">import &#8220;@openzeppelin\/contracts\/security\/ReentrancyGuard.sol&#8221;;<br>import &#8220;@openzeppelin\/contracts\/token\/ERC721\/extensions\/ERC721URIStorage.sol&#8221;;<br>import &#8220;@openzeppelin\/contracts\/access\/Ownable.sol&#8221;;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/**<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>@title IvanovNftFactory<\/li>\n\n\n\n<li>@notice A secure ERC721 NFT factory that cycles through a preset list of URIs.<br>*\/<br>contract IvanovNftFactory is ERC721URIStorage, Ownable, ReentrancyGuard {<br>uint256 public tokenCounter;<br>mapping(address =&gt; bool) public additionalOwners;<br>string[] public uriList;<br>uint256 public currentURIIndex; event NFTMinted(address indexed to, uint256 tokenId, string tokenURI); constructor(string[] memory initialUris)<br>ERC721(&#8220;CharlyNFT&#8221;, &#8220;TNFT1&#8221;)<br>Ownable(msg.sender)<br>{<br>require(initialUris.length &gt; 0, &#8220;CharlyNft: need at least one URI&#8221;);<br>tokenCounter = 0;<br>for (uint256 i = 0; i &lt; initialUris.length; i++) {<br>uriList.push(initialUris[i]);<br>}<br>currentURIIndex = 0;<br>} function updateURIList(string[] memory newUris) external onlyOwner {<br>require(newUris.length &gt; 0, &#8220;CharlyNft: need at least one URI&#8221;);<br>delete uriList;<br>for (uint256 i = 0; i &lt; newUris.length; i++) {<br>uriList.push(newUris[i]);<br>}<br>currentURIIndex = 0;<br>} function addUri(string calldata newUri) external onlyOwner {<br>uriList.push(newUri);<br>} function addUris(string[] calldata newUris) external onlyOwner {<br>for (uint256 i = 0; i &lt; newUris.length; i++) {<br>uriList.push(newUris[i]);<br>}<br>} function mintNFT(address to, string memory tokenURI)<br>external<br>onlyOwner<br>nonReentrant<br>returns (uint256)<br>{<br>uint256 tokenId = tokenCounter;<br>_safeMint(to, tokenId);<br>_setTokenURI(tokenId, tokenURI);<br>tokenCounter += 1;<br>emit NFTMinted(to, tokenId, tokenURI);<br>return tokenId;<br>} function addOwner(address newOwner) external onlyOwner {<br>additionalOwners[newOwner] = true;<br>} modifier onlyOwners() {<br>require(<br>owner() == msg.sender || additionalOwners[msg.sender],<br>&#8220;CharlyNft: not authorized&#8221;<br>);<br>_;<br>} function mintExactNFT(address to)<br>external<br>nonReentrant<br>onlyOwners<br>returns (uint256)<br>{<br>require(uriList.length &gt; 0, &#8220;CharlyNft: no URIs available&#8221;); <code>uint256 tokenId = tokenCounter; string memory uri = uriList[currentURIIndex]; _safeMint(to, tokenId); _setTokenURI(tokenId, uri); emit NFTMinted(to, tokenId, uri); tokenCounter += 1; currentURIIndex = (currentURIIndex + 1) % uriList.length; return tokenId;<\/code> }<br>}<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83e\udde9 Step 2: Prepare Your Image Files<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Create a folder and add all your 512x512 or 1024x1024 images.\n\nRename them cleanly to charly1.png, charly2.png, etc.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udda5 Rename in Ubuntu:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a=1; for f in *.png; do mv &#8220;$f&#8221; &#8220;charly${a}.png&#8221;; ((a++)); done<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udccc This assumes all files are .png. Change the extension if needed.<br>\ud83d\udce4 Step 3: Upload to IPFS (via Pinata)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Go to https:\/\/app.pinata.cloud\n\nUpload the folder with all renamed images\n\nYou\u2019ll receive a CID like:\n\nbafybeibtxyt5gwhbywi6z6y6gdqach4bxoq62yp7kl24mvkrlc6ii54zte<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now your images live at:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ipfs:\/\/bafy\u2026\/charly1.png<br>ipfs:\/\/bafy\u2026\/charly2.png<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udcc4 Step 4: Generate Metadata JSON Files<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a file called generateMetadata.js:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const fs = require(&#8220;fs&#8221;);<br>const path = require(&#8220;path&#8221;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">const imageCID = &#8220;bafybeibtxyt5gwhbywi6z6y6gdqach4bxoq62yp7kl24mvkrlc6ii54zte&#8221;;<br>const total = 58;<br>const outputDir = &#8220;.\/metadata&#8221;;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">for (let i = 1; i &lt;= total; i++) {<br>const metadata = {<br>name: <code>Charly NFT #${i}<\/code>,<br>description: &#8220;Part of the official Charly NFT collection&#8221;,<br>image: <code>ipfs:\/\/${imageCID}\/charly${i}.png<\/code>,<br>attributes: [<br>{ trait_type: &#8220;Breed&#8221;, value: &#8220;White Swiss Shepherd&#8221; },<br>{ trait_type: &#8220;Generation&#8221;, value: &#8220;Genesis&#8221; },<br>{ trait_type: &#8220;Edition&#8221;, value: <code>${i}<\/code> }<br>]<br>};<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fs.writeFileSync(<br>path.join(outputDir, <code>${i}.json<\/code>),<br>JSON.stringify(metadata, null, 2)<br>);<br>}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">console.log(<code>\u2705 Done. Metadata written to ${outputDir}\/<\/code>);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then run it:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npm init -y<br>node generateMetadata.js<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udce4 Step 5: Upload Metadata to IPFS<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Upload the entire \/metadata folder to Pinata\n\nYou\u2019ll get a CID like:\n\nbafybeihm5albdxvs5xosbfuczd5hbqi72apyrxpyttt4bkjymtdm5tgrge<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now your URIs are:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ipfs:\/\/bafy\u2026\/1.json<br>ipfs:\/\/bafy\u2026\/2.json<br>\u2026<br>ipfs:\/\/bafy\u2026\/58.json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\ude80 Step 6: Deploy Your Contract<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use Remix:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the constructor, paste:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[<br>&#8220;ipfs:\/\/bafy\u2026\/1.json&#8221;,<br>&#8220;ipfs:\/\/bafy\u2026\/2.json&#8221;,<br>&#8220;ipfs:\/\/bafy\u2026\/3.json&#8221;<br>\/\/ \u2026 up to 58<br>]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If Remix slows down, split into chunks and use the addUris() function.<br>\ud83d\udc36 Step 7: Mint the NFTs!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use mintExactNFT(to) to mint NFTs one by one using the next URI in the cycle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019ll start from 1.json, then 2.json, then wrap around.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 Pro Tip: Use AI to generate your full URI array if you don\u2019t want to write it manually. Just provide:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Your IPFS metadata CID\n\nThe number of files<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example output:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[<br>&#8220;ipfs:\/\/bafy\u2026\/1.json&#8221;,<br>&#8220;ipfs:\/\/bafy\u2026\/2.json&#8221;,<br>\u2026<br>&#8220;ipfs:\/\/bafy\u2026\/58.json&#8221;<br>]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;re done! \ud83c\udf89 You now have a full ERC721 NFT factory setup ready for production or testnet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let me know if you&#8217;d like me to turn this into a PDF, Markdown, or help embed it in a custom webpage for your project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ChatGPT can make mistakes. Check important info.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/testnet.bscscan.com\/address\/0x57F750337032B09155964d24b818bF374fd83907\">https:\/\/testnet.bscscan.com\/address\/0x57F750337032B09155964d24b818bF374fd83907<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83c\udfa8 How to Deploy an ERC721 NFT Factory Contract with IPFS Metadata\ud83d\udee0 Step 1: Use the Correct Smart Contract Code<\/p>\n<p><a href=\"https:\/\/slavy.site\/index.php\/binance-nft-factory\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\">Binance NFT Factory<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-459","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/pages\/459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/comments?post=459"}],"version-history":[{"count":2,"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/pages\/459\/revisions"}],"predecessor-version":[{"id":461,"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/pages\/459\/revisions\/461"}],"wp:attachment":[{"href":"https:\/\/slavy.site\/index.php\/wp-json\/wp\/v2\/media?parent=459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}