I’m creating this post as a discussion point for the Grant that ICDevs.org is wrapping up around the concept of ckNFTs.
We are currently in the process of discussing the future of the tech we’ve written with a couple of other projects and will release the source code as soon as we have a clear path forward. In the meantime it is likely worth discussing a brief set of the functions and asking a few questions of the community/DFINITY as we move toward release.
Functionality:
As of now the the code lets you port an NFT off of an evm onto the IC. Each source contract on an EVM gets its own ckNFT canister that is a fully featured ICRC 7/37/3 NFT canister. Once the NFT is on the IC you can do all the normal NFT things with it.
Once on the IC the NFT can either be burned back to its native chain by an eventual owner, or cast to a remote EVM chain via the ICRC-99 cast standard that we’ve authored. This lets the canister hold the NFT in escrow while it is minted on a new chain and allowed to flow freely as an NFT on that chain.
For example, one can take a mainnet ethereum NFT, move it to the IC, sell it on an ICRC7-compatible marketplace. The buyer can move it to Base and list it on opensea with reduced fees.
The system makes extensive use of the EVM-RPC canister developed by DFINITY and allows configuration to use one or many RPC providers to provide enhanced security.
The first big question to answer would be what to call this thing. We’ll have the ICRC-99 standard and so we could just call it that. ckNFT would be nice, but to date we haven’t called anything “ck” that wasn’t developed by DFINITY. They’d need to weigh in on that I’d imagine and the community would need to generally get in line with what we want to call it.
Fun facts: ckNFT is a bit easier than your standard ckERC20 because you don’t need an input/output queue. Because things are ‘non-fungible’ you can kind of just keep them where they stand on their respective EVMs and keep track of who currently has access to potentially redeem those assets.
Annoying Fact: Gas is hard. I’m currently struggling with how to properly estimate gas and pass it through to the RPC canister. It seems I’m doing something horribly wrong as I can’t get contract creation transactions out of the mem pool despite setting(what seems to be) decent gas limits and prices. If anyone has done evm transactions and has figured out how to do generic calculations across evms, let me know as I’m about done with it all and could use some help.
I was able to take a bitfinity test net NFT: Testnet Bitfinity address details for 0x2dbCFA4f869DafaBc34b264064Cf0d79CA9973D2 | Blockscout
And cast it to my local replica here: Testnet Bitfinity transaction 0x7b32917aedba70c126303e6c62f8b540feb54e6b14499728bef4fdea59337b62 | Blockscout
I’m currently in no-mans-land trying to cast it to Base, but hopefully, I’ll get it soon enough and I’ll update this thread. Then onto mainnet.
I’m open to creative ideas and directions to take the code.