CryptOrchids is an experimental Ethereum based game that uses Non Fungible Tokens (NFTs) of the ERC721 variety.

The project was created by me, @sammybauch for a hackathon. This is my first foray into smart contract development, so it's important you understand the risk involved before deciding to spend real money on these assets. You should, as they say, Do Your Own Research on the project and NFTs more generally. I would personally only buy a CryptOrchid or any NFT if I had money to burn from other crypto-related earnings. Prices are just too high right now to convert from fiat to ETH and get involved, I'm waiting until the hype cycle dies down a bit. This is not financial or investment advice.

The goal of CryptOrchids was to explore some ideas in the NFT space and get my feet wet with smart contracts. I was interested in experimenting with NFTs that aren't guaranteed to remain pristine and perfect forever. I also wanted to explore on-chain metadata, and how I could create a game that could continue to exist even if the CryptOrchids site went down. I'm interested in decentralization, in allowing owners to interact with NFTs in various metaverses, and representation of items in different metaverses. Read more about this below in Philosophy.

How to Play

CryptOrchids is a lightweight game that requires you to water your flower exactly every 7 days from the time it is germinated. When you mint a new token, you're buying CryptOrchid seeds. Seeds are generic, can be sold, and don't require watering.

Once you're ready to start growing, you can germinate your seed - this requires a small amount of gas to randomize the species and save the species data to the Ethereum blockchain. Germinating your seed starts the game's clock - you will need to water your CryptOrchid 7 days after germination is confirmed. You're given a 3 hour window to water your orchid - so if you germinate on Monday at 10am, you must water it the following Monday between 10am and 1pm. Watering your plant requires writing data to the Ethereum blockchain, so it will cost a small amount of gas and could take some time to complete.

When you start the game the Greenhouse will give you some help for a few weeks. We'll let you know if your "watering window" is open, and when it opens if it's currently closed. After 4 weeks, the Water button will be disabled if your watering window is closed, but we won't tell you when the watering window opens. After 6 weeks, you'll need to keep track of this yourself. You can figure out when you need to water your CryptOrchid by examining the relevant transactions on the Ethereum blockchain. Note that overwatering your CryptOrchid, or watering before your watering window is open, will also kill it!

Watering logic is embedded in the contract itself and it's final. If you kill your CryptOrchid there is nothing anyone can do - not you, not me, not anyone. Dead is dead.

Flowering CryptOrchids can be bought and sold freely on OpenSea until they die. Once a CryptOrchid is dead it cannot be sold. The only thing to do with a dead CryptOrchid is compost it - this "burns" the token by transferring it to a null address but allows for a new CryptOrchid seed to be purchased and planted. There can only ever be 10,000 CryptOrchids across seeds, flowering and dead plants.

You have a few options for watering your CryptOrchid.

CryptOrchids website

You can water the CryptOrchids you own by visiting the Greenhouse on this here CryptOrchids website. This is the easiest way to water your plants if you're not an engineer. The Greenhouse also includes a little bit of a game layer - when you first start playing, the website UI holds your hand a bit, helping you not kill your CryptOrchids.

The drawback of using the website to water your plants is that you are depending on the website to exist, to be up, to not have any bugs. The source code for this website is not (yet?) open source, so if I end up not being able to pay my hosting bill, you may not be able to water your plants.

CryptOrchids Watering Can

I also wrote a script that's open source that allows you to water your CryptOrchid by using typescript to call the `water` function via an Ethereum JSON-RPC API. The CryptOrchids Watering Can is available on GitHub. It includes some instructions for hooking up your watering can to a Discord bot, plus a simple way to deploy your script to Heroku so that you can run it as a scheduled task. This allows you to set and forget your watering, allowing your CryptOrchids to grow, at least in value.

There is some danger in automating this task - you won't be able to manually set gas limits for current prices, and you're still depending on a few centralized points of failure. I also haven't written any tests for it and make no guarantees about the code quality or appropriateness.

Directly on the Ethereum blockchain

You water your CryptOrchid by calling the water function on the main CryptOrchid contract with a tokenId parameter. Only the CryptOrchid owner can water their plant. You can view the `water` function on the verified contract source code on Etherscan, and the source code for the contract, including tests, is available on Github.


These are the members of the CryptOrchid species and their rarity

Rarer species are of course desirable, but the hypothesis is that the primary driver of value is the amount of time a CryptOrchid has been alive.


White Moth

phalaenopsis micholitzii

Frequency:3074 per 10,000

Orange Cattelya

guarianthe aurantiaca

Frequency:3000 per 10,000

Blue Vanda

vanda coerulea

Frequency:2000 per 10,000

Yellow Lady's Slipper

cypripedium calceolus

Frequency:1000 per 10,000

Vietnamese Paphiopedilum

paphiopedilum vietnamense

Frequency:500 per 10,000

Kayasima Miltonia

miltonia kayasimae

Frequency:250 per 10,000
Super Rare

Hochstetter's Butterfly Orchid

platanthera azorica

Frequency:100 per 10,000
Super Rare

Ghost Orchid

dendrophylax lindenii

Frequency:50 per 10,000

Gold of Kinabalu

paphiopedilum rothschildianum

Frequency:25 per 10,000

Shenzhen Nongke Orchid

shenzhenica orchidaceae

Frequency:1 per 10,000


Species Randomization

All of the species selection and random generation for CryptOrchids is done on-chain. Most current similar NFT projects that include a notion of rarity and attributes run an off-chain algorithm to create their items prior to minting. Projects like Avastars run the algorithm in the browser, allowing web visitors to search for rare attributes and then mint whatever combination of attributes they find to create the NFT. Others, like Chubbies I assume created their assets offline, allowed users to mint them, and then updated their metadata on Arweave and IPFS. There's nothing particularly wrong with this, but it does require some trust that the project creators are playing fairly.

CryptOrchids on the other hand uses Chainlink VRF to generate a verifiably random number. We then use that number to pick the species, according to an `n` per 10k heuristic. We separate this from the minting process to help you start the game when you want, and also to help ensure that purchasers get their token without needing to finesse the gas required for the randomness stuff from Chainlink. Once you own a token, you can call the germinate function to get your species and start the game.

I don't actually think we can guarantee there will only be 1 Shenzen Nongke, there might be 0. But that's just how math and probabilities work, it's probabilities not "definitelies" after all. You can follow the transactions on Etherscan to see what random number was generated for your minting, and then verify on the contract itself that you got the expected species.


CryptOrchids stores metadata both on and off-chain. The on-chain data contains what we might think of as the sort of universal essence of a flower, or at least a very rudimentary understanding of such. We store a latin species, the timestamp a CryptOrchid was planted, and the current water level on chain. Other metadata, like an english name, some attributes for rarity, and a 2d representation in an illustrated style are stored on IPFS and pointed at using the `tokenUri` on the ERC721 contract. The off-chain metadata is primarily used to support 3rd party marketplaces.

The idea here is to try and make the things stored on chain into universal, interpretable instructions for what a specific token represents. Latin is as close as we have for a universal language, especially in disciplines like botany, and by using real-world species there's at least a reference point for what each species could look like visually. And then the whole game aspect is pretty simple - there's a water level integer. The plant is alive if the water level is equal to the floor of a plant's age divided by the growth cycle. The watering window adds a buffer such that the plant is also alive if the first condition is not true, but that the age modulus of the growth cycle is less than the watering window. I want to see a metaverse add CryptOrchids, and I want the metaverse to implement watering. But I don't want to see CryptOrchids show up in a metaverse NFT art gallery as 2-dimensional posters.

One thing that I was not able to solve is some idea of syncing the on-chain game state data to the off-chain but still decentralized metadata on IPFS. It's really dumb! I could write a JSON API that takes the tokenId and then queries the blockchain for the on-chain data and return it as JSON, but that seems really backwards? Maybe this is a short-term problem of 3rd parties like OpenSea and Rainbow Wallet, and in the future creators will be able to specify schema for on-chain metadata, or tell third parties how to query for it? I looked into Graph Protocol, but I think that would really be more useful for 3rd party dApps to use for getting on-chain data, rather than continuing down this path of a tokenUri and JSON APIs?


The illustrations for CryptOrchids were done by Elizabed Chlaidze, an illustrator I found and hired on Fiverr. She really did a wonderful job, I absolutely plan on sending her further compensation if this project takes off. But contracting a hired gun here was an intentional choice to de-prioritize the visual representation in order to highlight the idea that the current focus of NFTs on 2-dimensional art is an underwhelming application of blockchain technology.

I'm not criticizing crypto pixel-art projects, they're fine, to create is human and I wouldn't tell anyone not to create. But crypto art today is most similar to college dorm room posters - collectors buy and display them as an expression of self-identity, right at a juncture in time when they are entering a new community, trying on new identities, shedding an old one. As we enter a virtual-first or more virtual existence, owning a CryptoPunk is an in-group signal that you "got it" before it was mainstream.

What I find a lot more interesting is moving beyond 2d posters and towards cross-metaverse objects. Multiverse objects? A CryptOrchid should look different in CryptoVoxels versus Mirandus versus Sommnium Space. I've been chatting with another engineer who is building a space-based NFT game, and I'd love to put CryptOrchids in space, but then maybe it's not as simple to water - water is a scarce resource in space! If you work on a metaverse, I'd love to chat.

Some projects are starting to bump up against this. Take Zed Run for example. They've got some great art for their horses, but I've been enjoying watching races in the top-down view. Each horse is visually represented by a colored dot with a number. But the essence of the racehorse - its sex, age, speed, endurance - remain. What would be incredibly cool is if I could ride my Zed Run horse as transportation in another metaverse.


Thanks to the following folks who have been chatting ideas, advising me on smart contract dev and the ethereum blockchain. None of these folks are compensated or have a financial interest in the project, unless they end up purchasing a CryptOrchid: AJ Vaynerchuk, Andy Kopas, Harper Reed, Patrick Collins, Sam Carmichael, Shawn Annabel, trent e, Victor Sanchez, and Xavier Armand.