I am looking to incorporate NFTs into my ICP application. Based on my research it seems that the prevailing NFT token standard is the following:
- Utilize ICRC3 to keep a transaction record
- Utilize ICRC7 as the base NFT token standard
- Utilize ICRC37 to allow for extended ownership capabilities
Is this currently the best libraries to use to go about creating a NFT collection?
If so why does the ICRC7 github page have the following warning ---- Warning: ICRC7 has not been finalized. This is Beta software and should not be used in production until it has been reviewed, audited, and the standard finalized ----
Is ICRC7 ready to be used in a production setting yet? I am also seeing a bunch of new token standards looking to be used in the future - NFT Working Group - Next Steps - ICRC-8, ICRC-56, ICRC-59, ICRC-60
Does this mean that ICRC3, ICRC7, ICRC37 standards will be outdated in the near future? I am just confused on what I should be using to ensure my collection will function to the best ICP has now and still work for years to come. Any guidance on how I should proceed/the current state of NFTs on ICP will be greatly appreciated.
EDIT: Is this the best place to get started? Is main.mo a good approach to setting up the whole stack? icrc_nft.mo/example at main · PanIndustrial-Org/icrc_nft.mo · GitHub
You’re probably looking at an older GitHub page for ICRC-7, latest NNS voted version can be found here ICRC/ICRCs/ICRC-7/ICRC-7.md at main · dfinity/ICRC · GitHub
Most WG GitHub repos have various standards that are currently or previously under discussion, but only the standards in the ICRC repo above are considered finalized and passed NNS voting.
Regarding the relation between ICRC-7, 37 and 3, you’re correct.
There are currently no plans to replace ICRC-7 at this moment within the NFT WG, future plans intend to extend ICRC-7 with more functionality similarly to how ICRC-37 is an extension.
The ICRC-97 Metadata standard is currently an ongoing topic, any feedback would be highly appreciated Request for feedback: ICRC-97 NFT metadata standard
As for the implementation link in your post, yes that’s the current implementation made by one of the active WG members that I’d recommend. More implementations in e.g. Rust are being worked on.
Really appreciate the feedback, when I find some time, I’ll look into the WG GitHub repo and make PRs where necessary to clear up some of this confusion.
2 Likes
Thank you for the quick response! You really helped clear up a lot of my confusion.
BTW the ICRC-7 github page I was referring to with the warning is- icrc7.mo/README.md at main · PanIndustrial-Org/icrc7.mo · GitHub - it is commonly referred to in the ICP Developer documentation on the ICP website
Also, your ICRC-97 Metadata standard is a really great idea. If I am understanding correctly, its goal is to provide a set of Metadata standards which are used to parse native ICP NFT Metadata across many different applications such as OpenSea. This will be very useful in helping wide spread adoption of ICP. I will certainly keep up to date on all your progress!
To clarify, the ICRC-97 metadata standard defines a structure for common metadata like e.g. the image and attributes of an NFT.
It’s structure, specifically regarding attributes, is inspired by the Open Sea metadata standard. Additionally the ICRC-97 standard has incorporated ways to enable extending it further with other ICRC standards.
On another note, keep in mind that while an ICRC standard itself might be final, any Motoko/Rust/Azle implementation of this ICRC standard you find on GitHub might not be production ready. Make sure to double check the GitHub page of the implementation or contact the dev if things are unclear in this regard.
1 Like
Yes thank you for the clarity. I realize not everything on github is final. I just assumed that - GitHub - PanIndustrial-Org/icrc7.mo: ICRC7 implementation in motoko. - should be production ready as it is used directly in the ICP Developer Documentation - Creating an NFT collection | Internet Computer .
Also, in terms of ICRC-97 I think I understand it more now. You are creating a standard set of attributes for NFTs so that future applications can easily display NFT metadata based on predefined widely used attributes.
1 Like
Hello. I think the Pan Industrial library is robust enough to use in your application, but it has not been audited yet. This is mostly due to it not being used extensively by anyone with enough cash to pay for an audit(I would audit it but I wrote it and I don’t think that would be best). So please, use it and supply pull requests if you’d like and if you build a robust enough application with it I’ll be happy to help you raise/submit for a grant to try to hire someone besides me to audit it.
ICDevs is currently using this library in its ChainFusion NFT application so you will not be alone in using it.
We need a robust effort in the motoko community to audit libraries like this so that developers can plug and play them with confidence.
2 Likes
Thank you! I will be sure to keep you updated on when the application is ready so hopefully we can try and raise some money for the audit. It seems like the Pan Industrial library is the best route for me to go. I did not really see an other complete implementations of ICRC3, ICRC7 and ICRC37. I trust that if ICDevs are currently using it and if it was directly linked from the ICP Developer documentation that it should be good for now.
Appreciate all of the hard work you did to get those implementations out. It is certainly going to be of huge help to me!
Hey, thanks again for the reply. Correct me if I am wrong, but its my understanding that - icrc_nft.mo/example/main.mo at main · PanIndustrial-Org/icrc_nft.mo · GitHub - is the combination of all three standards ICRC-3, ICRC-7 and ICRC-37, each of which are just modules. Does this mean that ICRC-3, ICRC-7 and ICRC-37 do not each have their own canister and therefore all data from all three modules is stored within the same main.mo canister? If so is there any concern with using more than the 4GB of heap memory associated with a current ICP canister?
Also, say I were to create some extra custom minting functionality that required the user to possess a certain number of my custom ICRC-1 tokens. To make this work would I reference my ICRC-1 token canister in the NFT main.mo canister and then make a call to my ICRC-1 token canister to check someone’s token balance and make the transfer?
Also, you mentioned that ICDevs are currently using the Pan Industrial library in a ChainFusion NFT application. Is that a public repo I could check out to see what they are doing? Or if it is not do you know of any production builds that use this library?
Thanks again for the help
Yes…they all go in the same canister. The data should be negligible in the current implementation. Depending on what you put in your metadata that might change. The ICRC3 component has parameters to auto archive and it takes care of moving transactions off the main canister for you.
1 Like
When you say the data should be negligible do you mostly mean that the metadata (mostly consisting of just text values) is so small that I would not have to worry about exceeding 4GB? What if in theory I needed to mint 10s of thousands of NFTs for a game? What do you think my limit is?
Also, did the strategy I gave for requiring tokens to mint an NFT sound correct? Thanks.
Should be small if you keep it small.
You likely just need to do some math. How much text in your metadata? Multiply it out. As we get more Orthogonal persistence that number will go up. You could write metadata to stable storage if you want(you’d need to update the library), but I doubt you’ll need that soon.
Love the idea of gating.
My stuff isn’t in a public repo yet, but it isn’t much different than the example you sighted. Hopefully soon.
1 Like