Back to home

What is this post really about?How Did I Learn The Basics About NFTs?Using Code To Generate The ArtworkHow Did I Start Minting NFTs?Putting My First NFT Up For SaleObtaining The Metadata For My NFTsThe Final Problem: Automating The Process Of Selling NFTsBuilding A Website For The CollectionTake Aways And LearningsSummaryResources and further reading
In My First 5 Days Of NFTs I Minted 2460 Collectibles From Hotel Quarantine main image

In My First 5 Days Of NFTs I Minted 2460 Collectibles From Hotel Quarantine

This post is a recount of my last 5 days generating my first NFT collection "Shiba Inu Dresses Up". Find more information about the collection website or peruse the collection on OpenSea

I continually hear the hype around NFTs and their tight-knit communities, but I have yet to have the chance to explore NFTs and learn about these communities behind it all. That was until this week.

To set the scene: I have just moved interstate in Australia from Melbourne up north to the city of Brisbane.

You may already know the story, but Melbourne was self-proclaimed as the most locked down city in the world* during the pandemic with 277 days of "stay at home" orders over the span of six city lockdowns. In addition to that, I was (un)lucky enough to visit Brisbane twice during their lockdowns for an additional 10 days to that total. Adding into account my current predicament of 14-days mandatory hotel quarantine (at my own expense), I will come out of my hotel room on November 10th having spent 301 days of stay-at-home order since March 2020.

If you read the attached article "Josh Frydenberg says Melbourne is the world's most locked down city. Is that correct?", there are debates on that claim. Regardless, I can attest to how awful the time is when you're stuck at home for that long and feel for anyone in a similar boat (or worse).

Since March 2020, it has been a very painful stay at Melbourne. I love the city, but working from home and all of that time alone was unreasonably unhealthy for any human. I haven't made a new friend since. Times had to change, so I made the decision to move to Brisbane... which resulting in a pain-staking 75 days stranded (alongside thousands of other Queenslanders) while trying to move back my family home across the closed Queensland border. Finally I arrived where I am today: 14-days of mandatory hotel quarantine in Brisbane before I can go home (that they will charge a cool $3,220 for).

A sneak peek at my delightful hotel room

A sneak peek at my delightful hotel room

The recent period being stuck away from my home and paying thousands to keep a roof on my head lead me to my zen moment: I am taking time off to recovery and doing whatever the fuck I actually want to do.

This all brings me to now: I didn't want to die of boredom in the hotel room (I have no job), so I finally took the opportunity to look into NFTs.

What is this post really about?

This post will be a recount of my six days and how I went from NFT-n00b to NFT-n00b-plus-one-level.

I am certainly not an authority on NFTs after these five measly days in any way. I am also not an expert on blockchain technology. I am still a n00b. But I am someone who is keen to use my creativity to try come up with some cool shit and learn a thing or two during my stay at the hotel.

This post will be covering the following:

  1. How did I learn the basics about NFTs?
  2. Using code to generate the artwork.
  3. How did I start minting NFTs?
  4. Putting my first NFT up for sale.
  5. Obtaining the metadata for the remaining NFTs.
  6. The final problem: automating the process of selling NFTs.
  7. Building a website for the collection.
  8. Takeaways and learnings.

Join me on this journey as I share pictures from my personal Instagram stories and code from my journey into generating 2460 NFTs in a collection I aptly named, "Shiba Inu Dresses Up".

I decided to make the artwork on everyone's favorite Shiba Inu after reading that Shiba Inu passed Dogecoin. Atypical of me to not think that others already made significant collections in the community like The Shiboshis (which is also a far cooler collection name).

How Did I Learn The Basics About NFTs?

How does one start learning about anything? The top result on Google and a subreddit of course.

I get way too excited too early, so I only spent about 20 minutes parsing through the article and subreddit to learn what NFTs are, how do people sell them and a little bit about the community.

Quite frankly, I didn't spend enough time. I did the bare minimum to learn about where to sell NFTs, how to get some of that sweet, sweet ETH and wallets that can be used for the NFT platforms.

In a tl;dr of this section, I ended up coming to conclusion that I needed three things and where I would obtain such three things:

  1. An NFT marketplace to sell my soon-to-be-NFTs. I found OpenSea to be a good fit.
  2. A wallet to connect to OpenSea. I chose to go with MetaMask. The bonus reason was this course "Ethereum and Solidarity: The Complete Developers Guide" using that wallet that I am thinking of taking over the coming week or so.
  3. A cryptocurrency exchange. Since I am based in Australia, I went with Swyftx. I am not even sure if this is required, but I wanted somewhere local to Australia that would be easy to deposit money as well as low fees for trading for Ethereum before withdrawing to my MetaMask wallet.

With the "cryptocurrency exchange to buy and withdraw to my MetaMask wallet" approach, it ended up costing me a bit in fees in the end, so there may be a far better way. You need money in your account wallet in order to pay for gas when selling your first NFT on OpenSea. There will be more on this later.

After going through the process of setting up each of those components, I was "ready" to start generating some collectibles!

I say ready very loosely, because at this stage I hadn't thought ahead about the fees required to pay for the gas when selling your first NFT nor did I understand the process of creating and then selling on OpenSea at this stage.

Never mind that though, it was onwards and upwards towards some coding!

Using Code To Generate The Artwork

At this stage, I had looked at a few collections on OpenSea and concluded that I wanted to make some pixel art.

I had zero idea how to make pixel art, but I knew I wanted the following:

  1. An accessible way for me to create pixel art.
  2. A simplified process for creating new "traits".
  3. An easy way to update these traits via code.

Traits are special properties on the item.

I had to define a few traits that I wanted to update in my own pixel art. The traits that I ended up deciding on that would vary were the following:

  1. Accessory: which accessory type is the Shiba Inu wearing.
  2. Fur color: an original color plus three variants.
  3. Background color: a set of 41 color schemes.

I didn't realize it at this stage, but traits are generally used in with collectibles to create scarce and rare collectibles.

In my first interpretation, I figured that all my collectibles would come with some commonality that would be generated through code and so each trait is basically the same rarity (with the caveat of the "original" fur type which has a different color scheme per accessory).

Once that was decided, I perused the internet for some quick tips on making some digital art.

As an aside for fun, I had made some art pieces when I was learning to code a few years ago (see my Digital Art Instagram), but I had never done pixel art. After finding few tutorials, I had decided one thing: it would take time to learn and I wasn't ready to commit just yet. I hadn't even created a single NFT yet! It was too early to consider investing a week or two into learning pixel art (not to mention the many hours required after).

Instead, I came up with an idea to fill the void in the meantime: why not create some ASCII art in code and convert that to pixels?

After some searching, I found a JavaScript library DataPixel.js that looked like it could fulfill my needs, and so I went to work on a spike with the library.

An example of the DataPixel.js library in action

An example of the DataPixel.js library in action

After tweaking the code a bit, I came up with my first Shiba Inu and I was ready to pull the trigger and see my amazing creation:

First attempt at generating pixel art from the ASCII art

First attempt at generating pixel art from the ASCII art

Okay... so, at this stage, my output was absolute garbage. On the image above, the right-hand side was the ASCII art that I had come up with while the left-hand side was the initial output.

I went back to the drawing board at this stage and continued to tweak the ASCII art and some params until I had come up with right proportions. This part was some tedious work, but after a few hours I managed to finally get there.

By the time things were tweaked and sorted, I had ventured into Day 2 of the project. By this stage, I was ready to start creating my ASCII art variants, and so after finding some inspiration, I went to work creating out the fifteen accessory variants.

The work itself actually took longer than I was hoping, so my initial dream of 3k to 10k assets had to be simmered down a bit. I didn't want to lose interest in the project before the finish line.

Once the accessory variants were there and my ASCII art had the affiliated letters required in the code, I had the capability of iterating through some color schemes that I had picked out to start changing aspects of the pixel art: namely the fur color and background color that I had decided upon earlier.

By this stage, I was able to run the code that I currently had and came out with my successful first variant.

First variant

First variant

Once the dummy run was completed, I decided to let rip and finish the script to iterate through all 2460 possible variations to create all the variants (as mentioned above, I cut down my expectations from the 3k to 10k I mentioned on my Instagram story!).

Variants completed

Variants completed

By the time I had gotten to this point, I was officially into Day 3.

I am skipping out on the manual work required for the ASCII art, but it took far longer than I was hoping for and I had also forced myself to ensure I was getting proper exercise and breaks in between each piece.

To take myself to the finish line of Day 3, it was time to explore how to create the NFTs!

How Did I Start Minting NFTs?

Full disclosure: I had not yet even looked at how to create an NFT on OpenSea. Bad idea.

I followed some of the guidelines on OpenSea Support to look for an answer, but quickly realized that all the website support documentation was for individually uploading an NFT manually. Uh oh... there was no way I was going to do that 2460 times. I was sure it had to be feasible, there were collections of 10k+ NFTs up on OpenSea.

As a next step, I checked the OpenSea Developer Platform to read through the SDK and API reference only to find that bulk uploading did not look to be feasible (at least, I did not see a way).

Back to the drawing board. After I began searching for answers through Google, I was very concerned at what I had found on Reddit regarding bulk uploads to OpenSea.

"You'd have to do it with smart contracts and it will cost a bomb in gas fees."

When I first saw this comment, I became worried that this might not be a feasible venture.

I am damn broke thanks how much it had cost me to get from Melbourne to Brisbane thanks to these Australian border restrictions. I had a budget to work with!

"There isn't an automated method available for bulk creating or listing on OpenSea at the moment. Many of the 10k pfp projects write their own smart contracts and have users pay for the minting fees in order to generate the NFTs on their website. They create images and "traits" for their assets which are then randomly assembled upon minting, they don't create each item individually beforehand."

That last comment from the moderators themselves had me concerned about the process I had taken. Maybe I had jumped the gun a little too fast without knowing enough about OpenSea.

So finally, I jumped onto YouTube and watched a couple of videos like "Bulk NFT upload to OpenSea - 10,000 automated" to see if it would get me any further, but alas it was not exactly the process I wanted to follow. I was hoping for something a bit more "programmatically script-y" to go along with my software development skillset.

At this stage, I figured I would have to start searching for a way to programmatically do this. I had written a lot of e2e tests with Puppeteer before, so I started looking for ways to use that to run a locally script to automate the upload for me.

Straight away I ran into an issue: logging into OpenSea and signing requests.

I had a deeper look at possible Puppeteer helpers for MetaMask, and wouldn't you believe it, there was a forked NPM package on the chainsafe/dappeteer repo that I, in turn, could fork and update for my own needs.

After a few hours of tinkering, I had hit gold! My first successful NFT was created through my script. That being said, it looked like it took about 10 seconds to create one NFT, so I knew I was in for up to 7 hours of waiting... it had just hit night time for Day 2 at this stage, so I bought some more data for my phone (did I mention I am hot spotting from my iPhone for internet in hotel quarantine? Thanks Australia.) and let the script run overnight.

At the start of my automation script for creating the NFTs

At the start of my automation script for creating the NFTs

The script itself was pretty raw at the stage, so I was counting my lucky stars when I woke up for Day 3 and saw the script managed to successfully complete during the night!

Completion of the script

Completion of the script

After about 10 minutes of celebration, I was humbled when I realized that two of my accessory variants with the original fur color (80 items) had failed during my initial artwork generation from the start of the Day 2... this meant that I had to bite the bullet, fix those 80 collectibles and manually update them (yes, the Instagram story says 50 but I was wrong).

Incorrectly generated pieces that were uploaded

Incorrectly generated pieces that were uploaded

Was it possible to automate this fix? Yes, but I severely underestimated the time it would take to manually do it - I thought that the script to write might take longer. Oh well... you live, you learn.

Most of Day 3 in the morning was spent doing this manual work. Very unfortunate.

Come afternoon once this was completed, I had finally come to the exciting part of the project: I was ready to put my first NFT up for sale!

Putting My First NFT Up For Sale

For this step, I went back to the OpenSea support docs for "How do I sell an NFT?" and followed along until I hit my next snag: you need to pay fees for your first listing.

You gotta be in it to win it. But I am also dead broke. I went to check out how much the gas fee would be for initializing the wallet and my initial reaction was tears:

Fee involved with initializing a wallet with OpenSea

Fee involved with initializing a wallet with OpenSea

Ooft, that is a LOT of money when you are dead broke (not to beat a dead horse, but just want to insert another "fuck you Australian COVID restrictions from keeping me from my home" for using all of my savings).

As it currently sits, I don't actually have the money to even afford the $3,220 mandatory hotel quarantine in Brisbane, but I did just receive my bond back for my last place in Melbourne ($1000).

I had to make a choice: commit to this venture or call it quits. And so I channelled my inner "to the moon" memes and committed to the cause. What's the worst that could happen? Things could only go up from here.

Believe it or not, but when you have to pay so much for mandatory quarantine, it actually makes it easy to justify a USD$450 gas fee. The actual conversation I had with myself was "1 Hotel Quarantine fee is still more than 4 initialization fees". I was in. Not sure if this is a healthy heuristic to use going forward financially though, ha!

I went through the process of depositing around $700 of that bond money into the Swyftx Exchange, purchasing some Ethereum and then withdrawing that to my MetaMask wallet. That in itself had a number of fees to pay (which I think is standard), so fair warning: there may be a more cost-effective way to go through this. I had considered purchasing directly through MetaMask, but at first thought the fees were higher (although I didn't take into account the withdrawal fee from Swyftx).

Finally, with the money across and me being trigger-happy, I closed my eyes and initialized my wallet. As soon as that was done, my first NFT was up for sale!

First NFT for sale

First NFT for sale

This was a massive milestone in the project. I was stoked that I had even made it this far!

After a short celebration with my hotel-provided apple juice, it was time to set the assets up for sale.

Obtaining The Metadata For My NFTs

The next problem was how I was going to grab all the newly created links for my NFTs.

I didn't want to use Puppeteer to do this - the last script had take 7 hours just to run and I wasn't sure on the mots efficient way to write something for that.

And so, I went back to the OpenSea developer platform and under the OpenSea API reference I found the "Getting Assets" endpoint that I could grab and, using my owner address, fetch all my assets that I had created.

The script that I wrote looks like the following:

require("dotenv").config(); const axios = require("axios"); const fs = require("fs"); /** * Chunk all requests into batches of 50. * Write all results out to JSON to use in another script to set up sales. */ async function main() { for (let i = 0; i < 50; i++) { console.log("Index:", i); const { data } = await axios.get( `https://api.opensea.io/api/v1/assets?owner=${ process.env.OPENSEA_OWNER }&order_direction=desc&offset=${i * 50}&limit=50` ); fs.writeFileSync( `data/offset-${i}.json`, JSON.stringify(data, null, 2), "utf-8" ); } console.log("Completed"); } void main();

Something to note: the API call has a limit of 50 assets per call. Given that I knew I would need to fetch all 2460 assets, I simply divided it by 50 to know I needed to make 50 calls and hardcoded the loop.

I synchronously ran the loop in case I would be rate-limited (not sure what the rules are there), and after each response I would write out the result to a file called offset-N.json where N refers to the iteration number.

Metadata script running

Metadata script running

Now that this data was available, it was time to set the NFTs for sale.

The Final Problem: Automating The Process Of Selling NFTs

At this stage, I ran into one last problem: how do I set all the remaining items for sale?

At first, I went and found on the OpenSea SDK that there is function for "Making Lists/Selling Items".

I began to follow that but then got overly confused with the "Getting Started" section. I don't know enough about Web3 nor the providers at this stage to confidently know if this was the correct avenue or if I was going down a rabbit hole.

Given that I was hoping to do that Udemy Course later (and do it properly over a few weeks), I decided to go back to hard mode and do one last automated script.

My first version of this script was a bad idea: I had no idea how to sign and go back and forth between the MetaMask tab and the OpenSea tab.

I decided to bite the bullet and just have it so that when the signature was required, I would sign it myself. No biggy right? I only have to sign 2460 times... unsurprisingly, that was a terrible idea.

After about an hour of clicking, I had only done about 200 NFTs.

First attempt at automating with one manual step

First attempt at automating with one manual step

I decided to cancel the script and hack a fix. After a bit of effort and some elbow grease, I successfully managed to update my script to do my signing for me. As a bonus, I had even managed to add some self-healing capability for errors!

The caveat with this approach though was that the chance of success is not entirely certain, and it also depending on waiting for a lot of signing and timeouts. With all the buffered time that I had added in, it was going to take about 21 hours to complete. Woof... it was about 2pm on Day 4 at this stage, so I started the script and took the rest of the day off to read (and even joined in to listen to some NFT Twitter Spaces!).

Come Day 5 at 11am, I come back to check my script and boom: we have success*.

NFTs up for sale

NFTs up for sale

*: It is worth noting that I genuinely did not factor in a nice way to check that everything successfully managed to go up for sale. There is a real possibility that some unforeseen failures meant that some NFTs are not currently up for sale.

The celebration truly commences! I was pretty stoked to have come this far. Best of all, 5 days of hotel quarantine were done and dusted in no time!

However, I still had a couple of things left on my list for this project to do before I could call all the tasks complete, with the main pieces left being to write a recount of the venture (what you are currently reading) and to build a website to interactively view the generated items (which is surprisingly hard to do from a UX perspective on OpenSea).

Building A Website For The Collection

And so finally, the last thing I wanted to do before writing the blog post was build a website for the collection.

I won't dive into this part, but basically on Day 5 from 4:30pm right up until midnight I put together a website to display the collection and link to individual assets.

The final website

The final website

You can view the website at https://shibainudressesup.dennisokeeffe.com/.

Take Aways And Learnings

What a 5-day journey that was! The project ran from October 29th to November 2nd.

It is now November 3rd as I am writing this, and I am definitely keen to publish the article and then walk away and decompress.

There were quite a few fascinating learnings along the way (as well as things that I do not understand) that I wanted to openly share about the journey:

  1. NFTs are rad. Although I am at the tip of the iceberg, I love the concept. Some of the coolest collections that I saw along the way involved media such as music as well. It would be super dope to try generative music as another NFT project!
  2. The initial cost can be high if you are in some financial trouble. I still think the money was worth it to play around and get involved (especially when comparing the cost to my hotel quarantine)!
  3. There are some awesome communities around the place. I was listening in to some Twitter NFT Spaces while on break and they had some fascinating insight into a successful collection. From what I could tell, a lot are community-driven and successful collections invest heavily into community management.
  4. There are dedicated teams that work on NFT collections. I had absolutely no idea that there were teams on this. I heard some advice about the team members required for an NFT collection which included a community manager, devs, designers and more. There was even advice to set a 2-month runway to do marketing and outreach for a project when you are about to release. Clearly I did none of that!
  5. I have no idea how to market these bad boyos. My blog has high SEO thanks to the other posts that I made on software development, but I wouldn't have a clue otherwise. As far as I could tell from what I had listened to, the art form really is in hyping up the collectibles and building a community around them.
  6. I still have no idea how to price NFTs. I saw an article suggesting 0.5ETH (which seemed awfully high to me), so I just priced them between 0.005ETH and 0.3ETH just to see what happens.
  7. When there is a will, there is a way. I ran into many barriers along the way, but thinking creatively helped me to work things out (even if I had to brute force my way!).

Summary

This post has been a recount of my first 5 days with NFTs and how I created my first collection (while navigating around in the NFT dark).

You can find the outcome at the "Shiba Inu Dresses Up" OpenSea Collection

As of the time of publishing this post, I am proud to announce that I have successfully sold 0 pieces of artwork (ha!).

It has been an enjoyable adventure! It gave me ideas for new collections and thoughts about the idea of donating NFTs to other users.

As a disclaimer: Please take everything on this post with a grain of salt. This is not expert advice. A week ago, I didn't even know anything about NFTs. I must reiterate that I am at the tip of the iceberg and I am not trying to claim anything more. It is important that you apply your own methods and thinking to the space. This project was about keeping me sane in this hotel room and trying to learn the sheer basics (if even that). If you have any feedback or advice, then please do share!

My aim in the future is to take a course on blockchain technology and Web3. Hopefully that will help me to slowdown and comprehend a lot more of what is happening under the hood when it comes to smart contracts and NFTs. I know the dev community is split on the buzzwords and hype (see The Lindy Effect) but after the last two years, I just want a break and to pursue things for the enjoyment of it. I have nothing to lose anyway.

I have one week left of hotel quarantine (yay?), so I am going to share this article around and pick up another project in a domain away from blockchain tech and NFTs and just let things ride while I finish off my hotel quarantine and finally get home to my parent's place... don't laugh! It's a temporary fort while I re-ignite my life, ha! I will get back to any responses after I reach freedom.

If you are reading this before November 10th, 2021 - then I am still here in this darn hotel room. Send me some positive vibes, please!

Resources and further reading

Photo credit: fakurian

Personal image

Dennis O'Keeffe

@dennisokeeffe92
  • Melbourne, Australia

Hi, I am a professional Software Engineer. Formerly of Culture Amp, UsabilityHub, Present Company and NightGuru.
I am currently working on workingoutloud.dev, Den Dribbles and LandPad .

1,200+ PEOPLE ALREADY JOINED ❤️️

Get fresh posts + news direct to your inbox.

No spam. We only send you relevant content.