Ever wondered how much time, effort or money goes into making a web3 collection?
Well I’m going to detail everything about 1337 Skulls launch of 1337 Zeros - our first generative Ordinal collection.
1337 was very early to ordinals. In the first week of Feb 2023, after suddenly deciding it needed to happen, we went into crunch mode and created the 69 golden 1/1s that formed the 1337 Ordinals.
Over that weekend I ran out and bought a new SSD, span up a local node and started inscribing them in batches of 10. The first one hitting the blockchain as Inscription #8440 Unfortunately there was an infamous slooooow block that caught us (and bunch of other early inscribers) out and we only got 40 of our 69 sub10k. The whole collection was in sub11k though.
Skip to Jan 1st 2024 and the 532’s of 1337 are starting to get that pixel itch again. It had been months since 1337 Brians and we wanted to create something together again.
Flashrekt came up with the idea of 1337 h4x0rz - “1337 skulls that are #00FF00 and always wearing hoods”. At the start we weren’t sure whether it was going to be generative or 1/1s like the Ordinals, which gave us a few mentalists like this:
After a little FAFO we settled on a strict green n grey palette of 16 colors, 32x32 pixels in 4 layers:
Background
Skull
Hood
Vision
One bonus of creating for ordinals rather than an eth project is that it is really easy to include animated traits! With the restricted color palette and 32x32 dimensions the filesizes are teeny, so we had to take advantage of that…
We trialled creating some 1/1’s 1337 Ordinals in the Zero palette but decided not to include them.
But how do you curate the art for a collection like this? Luckily we have a Hoanh!
Hoanh’s heroic efforts meant that not only did we have a place to upload our art but we could curate the % chance of each trait being used. Then on the Simulate page we could create a full run of the collection giving us a breakdown of how common each trait was. We (flash) could replace an individual Zero with a newly generated one. We could even export the entire collection as json detailing the traits used.
Flashrekt was up next, he created a python script that could check the entire simulated run for “primary” or “secondary” duplicates. Ensuring that each Zero in the collection felt unique with almost no trait overlaps. It took an insane amount of runs to get it right, every day for a week or 2 he asked us to give the latest another pair of eyes.
After god-knows how many runs of Zeros we hit it, the perfect rarity chart where each and every Zero passed a Quality Control check. We were ready…
So we have our art but how do you get it onchain in a 1337 way?
Just uploading flattened PNGs felt a bit lame compared to what you can do on Eth and it wasn’t until I saw The Pepes on MagicEden that Recursion struck me.
The gist is that any Ordinal can load the content of any other ordinal by simply referencing it in the source of your inscription.
e.g. <img src=”/content/[inscriptionId]”>
would load the image of an ordinal with a given inscriptionId (assuming the inscription is an image).MagicEden actually loads these “Recursive Submodules” and links to them from your Ordinal page. If these are images, then it will actually display them. That means that if your final Inscription is a layered Image of different traits, it will actually break down the traits and show them individually - pretty neat! So that inspired us to inscribe all of our traits individually. The other problem to overcome is how do you prove that these traits are apart of the 1337 Zeros collection and not just random inscriptions? With Provenance.
Provenance basically allows you to create child inscriptions from a specific Ordinal you own, proving the hierarchy, and declaring that these inscriptions make up our collection. Flashrekt’s golden thong hood 1337 Ordinal was a natural choice to use as our parent giving the Zeros sub10k inscription provenance - awesome! We inscribed the 1337 Zeros logo using the 1337 Ordi as the parent, that would then set the logo as the “top parent level” of the collection with the intention that anything linked to it should be considered as part of the 1337 Zeros Collection. Great, time for the traits inscriptions.
First though we had to convert our collection json into inscribable data, a little help from GPT and Python and boom we have a batch script ready to inscribe all our traits against the 1337 Zeros logo.
Here’s a snippet showing you a few inscriptions, we also added the metadata of each trait - it’s not used anywhere but still damn 1337.
mode: separate-outputs
parent: 9a8db4559b2dfdfd2e06dd6d139f5de597f6e257423bc7b21debc85a27782954i0
postage: 550
inscriptions:
- file: F:\Inscribe\Traits\Skull\Ape.png
metadata:
author: 1337
collection: 1337 Zeros
trait type: Skull
trait name: Ape
animated: false
- file: F:\Inscribe\Traits\Skull\BALAPA.png
metadata:
author: 1337
collection: 1337 Zeros
trait type: Skull
trait name: BALAPA
animated: false
We inscribed these in separate batches for each trait type which all together came out at ~1,260,000 sats @ 35 sats/VB ($518 when BTC was $36,500)
OK, so we have traits and a logo, how do you create a layered 1337 Zero? First up was an incredibly painful (for me) step to manually add all these trait inscription id’s into our trait json. The responses that came out of the ord wallet after inscribing were luckily still in order so it was a straight copy from side to side - still 4 hours of my life gone…Now we have a beautiful JSON collection detailing the traits and where they are on the blockchain.
[
{
"inscription_id": "657ca4d196268cadaf63f9e0c300668167036c5abd666dcb4644442d53b4fd8ci0",
"type": "Background",
"name": "9m",
"filename": "9m.png",
"animated": false
},
{
"inscription_id": "657ca4d196268cadaf63f9e0c300668167036c5abd666dcb4644442d53b4fd8ci1",
"type": "Background",
"name": "Beam",
"filename": "Beam.png",
"animated": false
},
...
]
Next up it’s time to finally create the 1337 Zero SVG files. They’re pretty straightforward, just some basic setup of an SVG and a chunk of CSS to get them to render correctly in Safari.The important part is the “background-image:”
here we’re loading the traits directly from the inscribed traits and layering them from top to bottom layer.
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="1337 Zeros"
viewBox="0 0 320 320"
style="
background-repeat:no-repeat;
background-size:contain;
background-position:center;
image-rendering:-webkit-optimize-contrast;
-ms-interpolation-mode:nearest-neighbor;
image-rendering:-moz-crisp-edges;
image-rendering:pixelated;
background-color:transparent;
background-image:
url(/content/892e4e613d4e66920a23a6b457e3d9a5bf1e1bc612f157202f32d18f706f09d5i10),
url(/content/5bb9032f95e0a3d296b87151d7292c913aad8de39f15fdef5fc6eb119fa4adc4i19),
url(/content/7b0d5cad8f3c6372072141e03a3b2292488c0eef8bbd17715aacd3289679b20di4),
url(/content/657ca4d196268cadaf63f9e0c300668167036c5abd666dcb4644442d53b4fd8ci14)
">
</svg>
Great, now with more help from GPT / Python we could take the exported collection JSON from the art curation site and link it with the full trait json to spit out ALL 1,337 of the final Zeros!
Our initial plan was to launch the collection through InscribeNow - a pretty neat service that lets you upload all of your final inscription files and then your minters self-inscribe the Ordinal taking on that inscription fee.
On the one hand that meant it would be completely free for us to launch (!) and handle all of the allowlists but it would mean missing out on the Zeros having onchain provenance to the collection. Still, as a team that never takes mint fees (we do this for the culture) it was a pill we felt we had to swallow.We then went about collecting wallets for 2 separate phases, first up would be guaranteed mints for the 532s (team) and the 1337 Force the 30+ members of our community that show a little spark and contribute to all things 1337. Phase 2 was made up from a massively varied pool of 1337 skull holders, holders of major Ordinal collections like Bitcoin Puppets and holders of 1337 Eth NFT collections like Cryptoadz. Phase 2 was oversubscribed roughly 2:1 so that we could try our best to guarantee a day-1 mint out without disappointing too may people, we figured we would lose a bunch of allowlisters during the InscribeNow process.3 days out this looked like the plan…
So we had promised everyone that the collection was going to launch on the Friday but Monday / Tuesday the price of RSICs flew and our 1337 Ordinals team wallet happened to own 3. Suddenly we had the opportunity to pay for the inscriptions ourselves, use the 1337 Zeros logo as parent, so that we had sub 10k provenance on each Zero and airdrop these mofos to our holders as a surprise. FOR FREE. So we let those 3 RSICs go but we still had one problem… our allowlist was double the Zero collection size - gah! 48hrs to go we needed to randomly and as fairly as possible cut this list down to 1337 max. Randomly assign a 1337 Zero to each winner and build up the inscription batches similar to the traits batches.
Another fun coincidence, a few weeks before launch the 1337 community managed to get hold of The Worm NFT and we’d been passing it between each other with the goal of getting the 1337 Skulls deployer wallet #1337!
Seemed like perfect timing to use this in some way… Flatmap created a totally fair randomisation script that took the eth transaction id of us receiving the worm, as a seed and gave every allowlist entrant a score between 0 and 1, 0.5 or above and you’re in :) - below and you’re out :(I didn’t have the heart to check who made and didn’t make the cut so just took the list and with more help from GPT created the inscription batch scripts setting the destination address. We created 7 batches of 200 (well, one has 137) to make sure we got them in and didn’t clog up a whole block. Due to the way provenance works that meant we needed to inscribe these batches across 7 separate blocks.
Literally hours to spare before Friday, we’re ready. We had 18mil sats to our name and a likely short window in the UTC early hours where the fees would be low enough to inscribe. We’d estimated we had the funds to inscribe/airdrop if fees were ~30 sats/VB
I’m up at 5:30AM local time to get these things inscribed but…. BAM turned out an hour or two earlier CC0 Cats had launched and was clogging up the mempool with 45+ fee blocks - GAH!
Luckily things went our way and after an hour a run of quick blocks being mined the fees were back down to 30 and we had our window!I pushed out the batches with one very painful 40min wait at one point but otherwise smooth sailing. For a total cost of 11,117,000 sats @ 30 sats/VB ($4,810 when BTC was $43,000).Then we sat back and watched as our community slowly began to realise they’d been airdropped their Zero for free!
Thanks for reading!
Here’s a few links to check out what 133 is all about: