ERC-1155 URI Storage

The OpenZeppelin ERC-1155 URI Storage extension is needed to manage and store URIs for individual tokens. This extension allows each token to have its own unique URI, which can point to metadata about the token, such as images, descriptions, and other attributes. This is particularly useful for non-fungible tokens (NFTs) where each token is unique and may have different metadata.

Usage

In order to make an ERC-1155 token with URI Storage flavour, your token should also use ERC-1155 Metadata URI extension to provide additional URI metadata for each token. You need to create a specified contract as follows:

use openzeppelin_stylus::{
    token::erc1155::{
        extensions::{Erc1155MetadataUri, Erc1155UriStorage},
        Erc1155,
    },
    utils::introspection::erc165::IErc165,
};

#[entrypoint]
#[storage]
struct Erc1155MetadataUriExample {
    #[borrow]
    erc1155: Erc1155,
    metadata_uri: Erc1155MetadataUri,
    uri_storage: Erc1155UriStorage,
}

#[public]
#[inherit(Erc1155)]
impl Erc1155MetadataUriExample {
    fn uri(&self, token_id: U256) -> String {
        self.uri_storage.uri(token_id, &self.metadata_uri)
    }

    #[selector(name = "setTokenURI")]
    fn set_token_uri(&mut self, token_id: U256, token_uri: String) {
        self.uri_storage.set_token_uri(token_id, token_uri, &self.metadata_uri)
    }

    #[selector(name = "setBaseURI")]
    fn set_base_uri(&mut self, base_uri: String) {
        self.uri_storage.set_base_uri(base_uri)
    }

    fn supports_interface(interface_id: FixedBytes<4>) -> bool {
        Erc1155::supports_interface(interface_id)
            || Erc1155MetadataUri::supports_interface(interface_id)
    }
}

Additionally, you need to ensure proper initialization during contract deployment. Make sure to include the following code in your Solidity Constructor:

contract Erc1155Example {
    // ...

    string private _uri;
    string private _baseUri;

    mapping(uint256 => string) _tokenUris;

    constructor(string memory uri_) {
        // ...
        _uri = uri_;
        // ...
    }
}