(Everything you ever wanted to know about MoonCat Acclimation)
Why should I wrap my MoonCats?
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, a lot of community members have been using the existing "unofficial" ERC-721 wrapper (located at 0x7c40c393dc0f283f318791d746d894ddd3693572
). This wrapper was expeditiously put together so that the new community was able to use platforms like OpenSea and NFT20 as soon as possible. Unfortunately, that wrapper doesn't contain tokenURI
metadata and doesn't preserve the "rescue order" (mint order) of MoonCats, which has caused some confusion about what different IDs mean. Besides using official metadata, using the original mint order, and allowing batch-wrapping, the official wrapping contract will also implement ERC-998 functionality (think accessories!).
Do I have to wrap or re-wrap my MoonCats?
No, your existing MoonCats wrapped with the 0x7c40c3...
wrapping contract will continue to work as ERC-721 tokens, and projects that wish to support them can choose to do so. 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.
(Everything else you ever wanted to know about MoonCat Acclimation)
(For those who wish to engage the contract directly)
Do I have to re-wrap my MoonCats NOW?
No, the 0x7c40c3...
wrapping contract has an unwrap
function that is not time-dependent, so you can do that at any time in the future. The MoonCatRescue team has not found any security vulnerabilities in the 0x7c40c3...
wrapping contract, so there's very little risk in having your MoonCats stay wrapped with that contract longer-term.
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:
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 is a community tool that 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 0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69
, 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:
0x7c40c3...
wrapping contract, call setApprovalForAll
, targeting contract 0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69
(the official wrapping contract). Then you can call batchReWrap
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)0x7c40c3...
wrapping contract, call the safeTransferFrom
function (using the version that has an additional data
parameter). The data
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 the safeTransferFrom
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), and data
(rescue order of that MoonCat, as a hex value, padded out to 32 bytes long)). (one transaction per MoonCat)0x7c40c3...
wrapping contract and rescue orders. Use the submitRescueOrder
function on the Lookup contract to save the link between existing token ID and rescue order (it's a batch function so you can submit all your MoonCats at once). Then, on the 0x7c40c3...
wrapping contract, call setApprovalForAll
, targeting contract 0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69
(the official wrapping contract). At this point, the official wrapping contract will be able to enumerate all your MoonCats on the 0x7c40c3...
wrapping contract as well as your MoonCats in the official wrapper (now calling balanceOf
on the official Wrapping contract will return a total sum of your 0xc3f733...
MoonCats and 0x7c40c3...
MoonCats). The first time they're transferred (using the safeTransferFrom
function on the official wrapping contract, not on the 0x7c40c3...
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)