Behind the Scenes of an NFT Collection, Part 1: An Introduction to Generative Art

Published in
7 min readDec 23, 2021

--

This is part 1 of a 3-part series providing a behind-the-scenes look at the launch of Orcanauts, an impact-driven NFT collection on Solana.

In late November this year, the Orca team and I watched a wonderful scene unfold. For a few hours, the Orca community — old-timers and newcomers alike — came together for the chance to adopt one of 10,000 unique Orcanauts. We took a radical course with this NFT launch, donating 75% of the mint revenue (over $900,000 USD) to charity. This donation will be going to Aflatoun International, who will be using the funds to develop a cryptocurrency-focused curriculum for children who want to learn more about the future of finance. The remaining 25% of the revenue went to the artist behind the project, the wonderful @corcorarium, to support her work. It was humbling to see everyone band together to support a good cause.

As the engineer that helped bring Orcanauts to life, I’ve learned a lot throughout the process that I wanted to share with the community: the different phases of the project, the tradeoffs to consider, and what we ended up doing to get to a successful launch. This journey will be split into three parts: an introduction to generative art, the technology behind NFTs on the Solana blockchain, and distribution logistics for NFTs. Without further ado, let’s begin!

An Introduction to Generative Art

We’ll start at the heart of the matter — what exactly goes into the Orcanaut NFTs? How were they designed, and how were they built? This article will focus on the tooling and technology behind the generative art; the story of how this looks from the artist’s perspective is better told by @corcorarium herself. See her blog post about that here. For the technical details though… keep on going!

The Art Itself

A montage of various Orcanauts with different combinations of traits.

We’ll start with the art. In the simplest terms, generative art typically consists of a patterned design with a few variables — you’ll see in the GIF above a showcase of the different “traits” associated to the image. Those traits are combined to create a “composite” (the final image), and will have a different rarity associated with them within the entire collection.

Generative art typically consists of a patterned design with some key variables. Taking a look at the Orcanauts GIF above, each image is referred to as a “composite”, an image where we’ve combined the different variables together. Those variables are called “traits” — for example, the Orcanaut composite has six traits: the background, the body, the eyes, the mouth, the hat, and the accessory. Each of those “traits” has a set of values associated to them: the accessory might be “kelp”, “scallop”, or even the adorable “SAMO”.

The SAMO accessory

When generating a composite, we go through all the traits and assign values to those traits based on a pre-determined rarity (see the next section for how we calculated that!).

We then layer the image in the order defined by the metadata (see an example of the associated metadata here), but there are certain exceptions to take into account. Some layers cannot be combined (an Orcanaut with both an astronaut helmet and a snorkel just doesn’t make sense) and some layers need to be re-ordered (when you have a helmet, it should be on top of all other layers). Once you’ve established your layers and the various values to combine into composites, you can start generating those composites!

One strategy that I found really helpful: optimize for change. It may have felt like premature optimization, but early on I invested in scripts to collate information from different sources of truth and adapt them into my local tooling, rather than try and leak those implementation details into places like Google Sheets or Figma. I worked with @corcorarium on her terms, not mine. That made changes (even last-minute ones) easy and painless to accommodate. And trust me, there will be last-minute changes!

Trait Rarity

The rarity chart for the “background” trait

For generative art projects, particularly NFTs, something folks are looking for is just how rare certain combinations occur in the context of the entire collection. Every trait and value we picked during the design phase was provided a “weight” — across 10,000 Orcanauts, how many would exhibit this particular trait? We had five levels of rarity: common (82%), uncommon (5%), remarkable (1.25%), rare (.2%), epic (0.09%), and legendary (0.01%). That’s right, a legendary trait might only show up once in a collection of 10,000! In practice, our two rarest traits (the “epic” Tokyo and “legendary” SOL Season backgrounds) only showed up 20 times in total.

However, it is not as simple as picking randomly through those traits and generating an image. For any given Orcanaut, we don’t see traits in isolation, we always see them with other traits. And we also want to make sure that we don’t ever see the same Orcanaut twice in a collection; they’re supposed to be unique after all! In our generative art tooling, the individual values for each trait of an Orcanaut combine into something called the “DNA” which is unique across the entire collection. As a result, even though a legendary trait may be intended to occur only once in a collection based on the rarity provided to it, all previous combinations with that trait may have been exhausted. The only choice may be to create a new combination with a legendary trait!

For the purposes of determining whether the DNA of an Orcanaut was unique, we always excluded the background trait. Why? Because if we included it, we would potentially have two identical Orcanauts whose only distinction was the background, and given how many backgrounds we had, that would have resulted in a lot of visual duplication. This tweet thread has a better breakdown of the sentiment from a renowned collector.

Generating Composites

Once you have the trait values and rarity roughly planned out, it is really helpful to start (randomly) generating composites. While @corcorarium was able to design for combinations that she had already anticipated, when we started seeing 10,000 randomly generated Orcanauts we found very obvious flaws: certain colors clashed, layering logic was flawed for certain traits, and we even found that the Orcanaut was slightly off-center! We ran this process over-and-over again; by the time we launched, I must have generated almost a hundred thousand Orcanauts to make sure they would be as adorable as possible.

A portion of the 10,000 Orcanauts in gallery mode.

While there are a handful of different systems and tools for generating images, I found hashlips_art_engine to be the most flexible. It did take a fair amount of own work to handle things like pre-made combinations and invalid trait combinations, but it has support for nice things like creating GIFs, creating large galleries, or even calculating the rarity of certain traits.

theskeletoncrew/treat-toolbox is a UI-driven tool for generating images and token metadata, and has support for invalid trait combinations and other layering exceptions. Worth taking a gander if hashlips is not for you!

Token Metadata

We’ll cover the detailed version of this in the third part of the series around “logistics”, but I’ll just briefly mention that all NFTs on the Solana blockchain folllow the Token Metadata standard established by Metaplex. When considering any generative image tooling, you should make sure that those tools will also support creating the associated metadata files, since you will need those when you start creating your NFTs.

That is all on the art front — at this point, we’ve gone through every iteration of the Orcanaut and we’re now ready to start turning them into NFTs. Watch out for @corcorarium’s upcoming post about the same topic from the artist’s perspective, and continue on to parts two and three to learn more about how to generate your NFTs and get them into people’s hands.

Thank you to 0xScuba, Corcorarium, Nikhil, and Ori for reviewing this!

Disclaimer: The content of this communication is not financial advice and should not be relied on by any persons as financial advice. This communication has not been provided in consideration of any recipient’s financial needs. We have not conducted any financial assessment based on the personal circumstances of any recipients. All persons are encouraged to seek their own independent financial advice prior to taking any further action.

--

--