Cryptobabies, bitbirds, that cool NFT you just picked up. It probably has chaindata with poor composability and poor authenticity verification. Why?
Hundreds or Thousands of new NFT tokens are being minted in monolithic contracts that contain other art projects. Particularly glaring examples are the OpenSeaSharedStorefront contract and the Rarible contract. Each of those contracts contain a jumbled mismash of thousands of different art project tokens from thousands of artists.
In the contract, token ID 18338 might be a ThiccPokemon and token ID 918101 might be a Cryptobaby. Token ID 19002181 might be a fake ThiccPokemon. This is very bad because they all share the same contract address.
It’s not bad for humans, or for centralized platforms. We can tell the difference. Its bad for solidity programmers. Inside of solidity code, it is nearly impossible to tell apart these tokens, find their attributes, their authenticity, and their type. In fact, the only way to do it is to spend millions of gas to hardcode an enormous 'whitelist' of TokenIDs so that the solidity code knows which is which. It won’t happen.
Older NFT projects tokens do not have this problem. Every real Cryptopunk uses the same contract and shares the contract with no other NFT token. Same with Mooncats or CryptovoxelsParcels. It’s extremely easy to identify a real Cryptopunk inside of Solidity code; you just use the contract address. In fact, that is the only way. Without the ability to use that technique, NFTs sharing a giant monolithic contract have virtually zero composability and will not work with most NFT tools like NFTX, BuyTheFloor, and future tools that are being built every day.
I hope NFT collectors are paying attention to the programmability of their artworks and I hope NFT artists spend the extra gas to deploy a unique contract for their project. Otherwise, their artworks will be deeply limited in capability.
Edit: Looking forward, one way to partially solve this issue is to use a new standard method, such as 'TokenIdToProjectId' that Artblocks uses to separate tokens from each other by ProjectId.