MoonCatAcclimator FAQ
Highlights
- The Acclimator smart contract is a “wrapper”-style contract that allows MoonCats to interact with and own other NFTs
- It adheres to the ERC721 standard (so many wallets will automatically show which MoonCats you own directly in their interfaces), and keeps intact each MoonCat’s full trait-metadata (rescue order, name, color, fur pattern, etc).
- Acclimated MoonCats are fully supported by the ecosystem, including accessories and future projects
- Other wrappers do not have these benefits. They are not officially supported and don’t support the maintaining team nor the wider MoonCatRescue ecosystem.
MoonCat Acclimation Basics
Why should I wrap my MoonCats?
- So that they can interact with the world! The official wrapping contract at allows your MoonCats to interact with wallets and marketplaces that use the ERC-721 Non-Fungible Token Standard. ERC-721 is the standard that many marketplaces (e.g. OpenSea) use for NFTs. MoonCatRescue was created before the original draft this standard was even submitted(!), and that’s why the MoonCats need to be brought up to date.
- So that they can own things! The wrapping contract also implements a new, proposed standard: the ERC-998 Composable Non-Fungible Token Standard. ERC-998 is a standard that allows ERC-721 tokens to own other tokens directly (rather than just being owned by the same address), and therefore allow transferring ownership of whole collections of ERC-721s together take just a single transaction.
- So you can support continued MoonCat development! If you use the official wrapping contract’s collection on NFT marketplaces and pool platforms, some of them give the option to send a fraction of each sale to the MoonCatRescue development team. So, if you appreciate what work that team has done, and wish to support further development of the MoonCat ecosystem of applications, doing it via the official collection helps contribute to that cause.
Is wrapping permanent?
Nope! It’s not a permanent process; if you wish, you can “unwrap” your MoonCat and return it to its original state at any time.
But wait, isn’t there already a wrapper?
Yes, an unofficial ERC-721 wrapper (located at tokenURI
metadata and doesn’t preserve the “rescue order” (mint order) of MoonCats, which has caused some confusion about what different IDs mean. So, while the old wrapper does provide some functionality, it has several missing features that make it not recommended.
Do I HAVE to wrap or re-wrap my MoonCats?
No, your MoonCats from the original MoonCatRescue contract and those wrapped with the 0x7c40c3...
do not have any known security flaws, so there is no rush to Acclimate them. The 0x7c40c3...
wrapping contract has an unwrap
function that is not time-dependent, so you can do that at any time in the future. Future tooling and applications created by the MoonCatRescue team will focus on supporting MoonCats wrapped with the new wrapper, so if you choose to not re-wrap your MoonCats, they may not be able to play fully with their other brethren.
Deeper Down the MoonCat Crater
(Everything else you ever wanted to know about MoonCat Acclimation, and for those who wish to engage the contract directly)
Why is Metamask setting the gas limits so high?
When using the Acclimator web UI, your browser popup for Metamask will auto-compute how much the gas limit is needing to be. But if you compare that “gas limit” value to completed transactions on the blockchain from who have acclimated before you, you may notice that the actual gas charged for those transactions is a lot less. And so the overall final price paid for the transaction’s gas looks like it will be much higher, but ends up being lower. This is especially evident when doing batched actions. Why is that?
It has to do with how the Ethereum EVM refunds gas when state is freed/deleted from the blockchain. When doing a “re-wrap” action on a formerly-wrapped MoonCat, the old token’s state is deleted in the process, and that earns a refund, but that refund only gets applied at the very end of the transaction’s execution. So what you see in completed transactions is really the net gas cost (the gross total gas needed to run all the smart contract actions, minus the gas refunded by state-freeing actions). If you set the “gas limit” of your transaction to be just at that “net gas cost”, the transaction will fail, because it needs to first do the actions up to the “gross gas cost” first, before getting the refund.
Final gas units that get used for the various actions are:
- Preparing a never-been-wrapped-before MoonCat: about 58,000 gas per MoonCat
- Batch Wrapping never-been-wrapped-before MoonCats: about 170,000 gas per MoonCat for small batches (down to about 152,000 per MoonCat for a batch of 8)
- Preparing all previously-wrapped MoonCats: about 46,000 gas
- Batch Re-wrapping previously-wrapped MoonCats: about 240,000 gas per MoonCat for small batches (down to about 202,000 per MoonCat for a batch of 8)
Using those figures you can estimate what the final costs will be, even though the transaction must be submitted with higher gas limits to be successful.
How do I wrap my MoonCats with the new wrapping contract myself?
The MoonCat Acclimator web application structures the interaction transactions for you, but if you want to craft the transactions yourself (or just want to peek under the hood and see what it’s doing), the next few questions detail which functions on the smart contracts are available for different situations.
How do I wrap my MoonCats who have never been wrapped before?
You must first make an adoption offer to the wrapping contract to adopt your MoonCat for zero ETH (makeAdoptionOfferToAddress
function on the MoonCatRescue contract, targeting address , which is the official wrapping contract. You’ll need the MoonCat’s five-byte hexadecimal ID for this call). Once that has succeeded, call the wrap
function on the official wrapping contract, passing in the MoonCat’s rescue order as the function’s parameter. If you have many MoonCats you’d like to wrap this way, you’ll still need to call the makeAdoptionOfferToAddress
function once for each MoonCat, but then you can use the batchWrap
function to submit multiple rescue order numbers at once, and wrap them all, using just one transaction. (m + 1
transactions needed, for m
MoonCats)
How do I re-wrap my MoonCats who have been wrapped with the 0x7c40c3...
wrapping contract?
To transition these MoonCats, they will need to be unwrapped from the old contract and re-wrapped into the new one. To use these methods, you’ll need to know the token ID of the wrapped MoonCat in the 0x7c40c3...
wrapping contract, as well as the rescue order for each of your MoonCats. There’s a few options built into the official wrapping contract to support different needs for different users:
- Re-wrap several MoonCats now, and maintain current owner as owner of them all: On the
0x7c40c3...
wrapping contract, callsetApprovalForAll
, targeting contract (the Acclimator official wrapping contract). Then you can callbatchReWrap
on the official wrapping contract, passing in a list of rescue orders and other-wrapping-contract token IDs. (2 transactions needed, for any number of MoonCats) - Re-wrap one MoonCat, maintaining its current owner: On the
0x7c40c3...
wrapping contract, call thesafeTransferFrom
function (using the variant of that function that has an additionaldata
parameter). Thedata
parameter needs to be the rescue order of the MoonCat being transferred. Convert that value to hexadecimal and then add zeroes on the left end of it to pad it out to 32 bytes long. Then use thesafeTransferFrom
function to send the token to the official wrapper (the four parameters are_from
(your address; the owner of the MoonCat currently),_to
(0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69
, the official wrapping contract),_tokenId
(the token ID of the MoonCat in the other wrapping contract), anddata
(rescue order of that MoonCat, as a hex value, padded out to 32 bytes long)). (one transaction per MoonCat) - Re-wrap on first transfer: There is a separate “Lookup” contract at
0x7c40c3...
wrapping contract and rescue orders. Use thesubmitRescueOrder
function on the Lookup contract to save the link between existing token IDs and rescue order (it’s a batch function so you can submit all your MoonCats at once). Then, on the0x7c40c3...
wrapping contract, callsetApprovalForAll
, targeting contract0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69
(the official wrapping contract). At this point, the official wrapping contract will be able to enumerate all your MoonCats on the0x7c40c3...
wrapping contract as well as your MoonCats in the official wrapper (now callingbalanceOf
on the official Wrapping contract will return a total sum of your0xc3f733...
MoonCats and0x7c40c3...
MoonCats). The first time they’re transferred (using thesafeTransferFrom
function on the official wrapping contract, not on the0x7c40c3...
wrapping contract), they will automatically be re-wrapped. This would allow you to do things like list them for sale on an ERC721 marketplace (as an officially-wrapped MoonCat), and the first buyer will pay the transaction fee for wrapping as they buy/transfer the MoonCat. (one setup transaction for any number of MoonCats, and then one transaction per MoonCat to wrap and transfer) , which can be used to record the mappings between token IDsfor the