Since our site does not have much information about the details of the project, and not everyone is able to read and understand the source code of the contract - we have made an overview of the features of the Terrarium project.
These features were not advertised and did not have an interface on the website.
ใคโ_โใค๐
As you know from the website - the owners of some public domain collections (Loot, HyperLoot, Genesis Adventurers, Goblintown, Cryptoadz, Blitnauts, Chainrunners, Nouns, Wagdie) have an option to mint one mushroom for free.
This functionality is implemented in a separate function in the contract, which not only removes the cost of the mint from 0.042 eth to 0, but also sets an additional property for the minted NFT in the contract-level metadata.
This property is the spore flag: sporeMushrooms[shroomId] = true;
This means that this mushroom has a spore, and the owner of this mushroom can create another mushroom from it (but only one), for example for his friend. No fees, just gas.
However, if another mushroom is minted with this mushroom, this mushroom will no longer be spore-bearing. So, if spore-bearing mushrooms in the future will have features in the derivative projects, this mushroom will no longer belong to them.
// for cc0 frens ใคโ_โใค ๐
function claimMushroom() external nonReentrant {
uint256 shroomId = totalSupply();
...
sporeMushrooms[shroomId] = true;
}
// in case of mushroomed ser want to send a shroom to fren ใคโ_โใค ๐
function dropSporeToFren(address fren, uint256 shroomId) external nonReentrant mintConditions(1) {
require(msg.sender != fren);
require(ownerOf(shroomId) == msg.sender);
require(sporeMushrooms[shroomId], "no spores in ur shroom");
_safeMint(fren, 1);
sporeMushrooms[shroomId] = false;
}
Not so long ago there was a project called ๐๐ข ๐๐ฏ๐ข ๐๐ฉ๐ฉ ๐๐ฌ๐ฆ๐ซ๐ค ๐ฑ๐ฌ ๐๐ฆ๐ข, and some holders of this project, began to burn their NFT (no one knows where this will lead).
๐ก "Burning" โ is the sending of an NFT to an address outside of anyone's control, which takes the NFT out of circulation.
The cycle of life is designed so that the death of one gives the beginning of life to someone else. That's why we implemented the feature to mint a free mushroom for each burned wagdie.
You can track burned wagdies on etherscan.
// ใคโ_โใค ๐๐
function rebirthTheDead() external nonReentrant mintConditions(1) {
require(!claimStatuses[msg.sender], "Mushroom already claimed");
require(
grewUpOnTheDead < IToken(wagdie_address).balanceOf(fertile_ground),
"All the dead already reborn."
);
_safeMint(msg.sender, 1);
grewUpOnTheDead += 1;
claimStatuses[msg.sender] = true;
}
๐ก You can directly interact with the smart-contracts on etherscan website, even if you donโt know programming.
Try here: https://etherscan.io/address/0xc8d5517fd038206a65263bc25b230f6809ac7e3a#writeContract
In addition to spore-bearing mushrooms, the contract also includes the possibility of creating another special mushrooms - ๐ย The Royal Mushrooms.
These mushrooms are also created with a separate function - mintRoyal() and have an increased cost - 0.31337 eth. In total 10 such mushrooms can exist (at the moment of writing 9 of 10 mushrooms are minted).
The appearance of royal mushrooms, like the others, is chosen at random. Therefore, royal mushrooms have no visual differences from ordinary mushrooms. But they, like the spore-bearing ones, have a difference in metadata at the contract-level and the ability to use an additional function - Broadcast Mycelial Message()
Also, royal mushrooms have metaphysical meaning, but their role on the future of mycelium has yet to be determined (royal mushrooms themselves).
๐ Mycelian Truth
There is a text field in the contract (called mycelianTruth) that displays the current truth expressed by the mycelium. This field can only be changed by royal mushrooms, by sending a new mushroomed message to the contract.
History of mycelian truth:
// ใคโ_โใค ๐๐
function mintRoyal() external payable nonReentrant {
uint256 shroomId = totalSupply();
...
require(msg.value >= LEET_PRICE, unicode"Royal Shrooms requiring ใคโ_โใค 0.31337 ether");
_safeMint(msg.sender, 1);
royalSpores -= 1;
isRoyal[shroomId] = true;
}
// ใคโ_โใค ๐ฌ
function broadcastMycelialMessage (uint256 shroomId, string calldata message) public {
require(msg.sender == ownerOf(shroomId), "Mushrooms: sender not owner");
require(isRoyal[shroomId], "Mushroom isn't royal");
mycelianTruth = message;
}
A member of the Loot community developed a new standard for interaction between tokens and gamification, which we used in the Terrarium project. Check out a couple of quotes that describes it very well and help you understand what's going on.
We want to create a world that is fun, exciting, and magical. We believe magic is most powerful when it is created together.
EIP-5050 is the metaverse standard for truly decentralized game building, where the game world is the blockchain itself, and anyone can build on top of it. Any smart contract can become castable just by adding a receiver.
โ spells.quest
So, Terrarium is the first project implementing this standard and compatible with spells.
We decided to implement two functions - Spells cast()
handling and eatMushroom()
handling.
Spells are on-chain magic. Functional ERC-721 tokens that can be
cast()
over the blockchain on other NFTs and addresses.
The Spells project is currently in development and is scheduled to launch shortly. You can learn more about this project on the website.
In the near future, when Spells project is launched, each mushroom holder will be able to cast()
a spell on his mushroom, which will make your mushroom magical and lead to some โจchanges, which we will not talk about now, let it be a surprise ใคโ_โใค ๐ฎ
There are only 420๐ magic mushrooms possible. So donโt miss the moment.
if (action.selector == CAST_SELECTOR){
require(action.from._address == spells, "Mushrooms: invalid action.from");
require(action.user == ownerOf(action.to._tokenId), "Mushrooms: sender not owner of this mushroom");
require(!magicMushrooms[action.to._tokenId], "Only one cast per tokenID");
require(myceliumMana > 0, "No mana left");
magicMushrooms[action.to._tokenId] = true;
myceliumMana -= 1;
}
ใคโ_โใค ๐
Terrarium contract includes the feature to eat a mushroom once per 5000 blocks through handling EIP5050 eat_shroom
action.
At the moment this feature is not used anywhere, but it is implied that in the future, perhaps someone will implement a project in which the characters or anyone else can eat mushrooms. Feel free to be imaginative, maybe you'll be one of those who will come up with some interesting project and implement this feature!
if (action.selector == EAT_SHROOM_SELECTOR){
require(action.user == ownerOf(action.to._tokenId), "Mushrooms: sender not owner of this mushroom");
require(eatCooldown[action.to._tokenId] - block.number < 5000, "You can eat mushrooms only once per 5000 blocks");
emit MushroomEaten(action.to._tokenId);
eatCooldown[action.to._tokenId] = block.number;
}
We are driven by a desire to learn, teach and explore the possibilities and limits of composable and expandable systems, the world of blockchain and the web3, and we encourage everyone to join us. There's no limit to our imagination, so we don't even know what the future holds - a game, a cartoon, a quest, a community-club or anything else (a lot of ideas for development in our heads). This is a story that is being written right now by all of us in blockchain.
Let's go! ๐
Everyone who has read to this point is welcome to join the ๐พMycelium Discord (still not announced in public), get to know each other and take part in the brainstorming!