The official docs say
ERC721 token with storage based token URI management.
If someone could elaborate more on what exactly this means and when to use it, I'd be grateful.
Ethereum Stack Exchange is a question and answer site for users of Ethereum, the decentralized application platform and smart contract enabled blockchain. It only takes a minute to sign up.Sign up to join this community
It means that the tokenURIs are also stored in "storage". The base implementation in ERC721.sol reads the baseURI in memory and concatenates the resulting String on-the-fly, without storing them as a state var.
It is used if you want to decouple the tokenURIs from the baseURI. Otherwise if no baseURI is set, the base implementation returns empty string. Afaiu, this is used if you want to store metadata off-chain and be able to set individual tokenURIs, see also here.
Usually, metadata is not stored directly on chain. There has to be a link (tokenURI) in your contract pointing to that external metadata.
ERC721URIStorage extension provides storage for token URIs which means that uris are stored on-chain. Without this extension, URIs are NOT going to be stored on-chain.
If Uri's are not stored on-chain, token URI's are simply generated dynamically by concatenating the base Uri and token id. this makes storage efficient. The downside of this token Uri's are coupled to the token IDs. Because token id is contained inside the uri. Or what if you are using ipfs which has content identifier to store your metadata. The content identifier is going to be a hash of the input data which looks like this.
As you this has no pattern like sequentially increasing token id. In this case you cannot generate the token URI by concatenating the token id and the base uri.
As a note, it is possible to use ipfs without uri storage. However this involves uploading folder to ipfs and then the folder is used as base Uri. that way you can dynamically generate token uris by concatentaing the ipfs base uri and token id.