The issuer is the controlling body of the NFT issue, which in the vast majority of cases is a contract. The data in the standards on this page must all be visible in that contract, and anyone can access that data from the contract at any time. The contract must also implement all of the interactive interfaces described on this page.

Standards

Below is the JSON Schema for the issuer:

jsonCopy code
{
    "title": "",
    "type": "object",
    "properties": {
        "max": {
            "type": "integer",
            "description": "Maximum issuance quantity of the NFT"
        },
        "issuer": {
            "type": "string",
            "description": "Unique identifier of the issuer of INFTs"
        },
        "owner": {
            "type": "string",
            "description": "Ownership of the issuer, which can be a contract address"
        },
        "metadata": {
            "type": "string",
            "description": "Descriptive resource address, such as HTTP(s)/IPFS URI"
        },
        "protocol": {
            "type": "string",
            "description": "The protocol used by the NFT, in the format of protocol name:protocol contract address (address can be omitted)"
        },
        "properties": {
            "type": "array",
            "description": "Set of rules for NFT properties",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "description": "Property name, must be consistent with the protocol"
                    },
                    "data": {
                        "type": "integer" | "string" | "array",
                        "description": "Default value of the property"
                    },
                    "rule": {
                        "type": "object",
                        "description": "Rules to be followed for the property",
                        "properties": {
                            "variable": {
                                "type": "string",
                                "enum": ["immut", "conserves", "consume", "auto", "protocol"],
                                "description": "Data change limitation for the property"
                            },
                            "slot": {
                                "type": "object",
                                "description": "Slot rules",
                                "properties": {
                                    "whitelist": {
                                        "type": "array",
                                        "description": "Collection of issuing parties allowed to add to this NFT, [] means not allowed, ['*'] means no restrictions",
                                        "items": {
                                            "type": "string",
                                            "description": "Contract address allowed to add to this NFT slot",
                                        },
                                    },
                                    "protocol": {
                                        "type": "object",
                                        "description": "Protocol used by the slot and data interaction with the protocol",
                                        "properties": {
                                            "name": {
                                                "type": "string",
                                                "description": "Protocol for the property, empty for default, in the format of protocol name:protocol contract address (address can be omitted)",
                                            },
                                            "params": {
                                                "type": "array",
                                                "description": "Parameters submitted to the protocol contract",
                                            }
                                        }
                                    }
                                }
                            },
                        },
                        "required": ["variable", "slot"]
                    },
                },
                "required": ["name", "data", "rules"]
            }
        },
        "required": ["max", "issuer", "owner", "metadata"]
    }
}

max

The maximum issuance quantity of the NFT.

issuer

The issuer of the NFT. In most cases, it should be a minting factory contract address. However, this standard does not limit it because in some cases, a verifying party address must be used, such as property certificates issued by centralized institutions.

owner

The ownership of the issuer of the NFT, which can be a contract address. It has the permission to modify the contract state within the range allowed by the contract, thus allowing DAOs to manage the NFT issuance.

protocol

The protocol describes what the NFT is and serves as the logical layer for interactions between NFTs. The interaction between NFTs is first handled by the minting contract to ensure compliance with the corresponding permissions and the property's variable. If necessary, the protocol contract interface is called to process the data.

The format of the protocol is a combination of protocol name, version number, and contract address. In most cases, the contract address is not required, and it is preferable to use automatic addressing through the protocol name to avoid unnecessary deployment duplication and reduce the burden on developers. For the community, standardized protocols reduce the burden of auditing.

Format

The format of the protocol is protocol name_version number:protocol address, where the protocol address can be omitted. In such cases, the MIM system should provide a mechanism similar to a registry for the contract to obtain a unique protocol contract address through protocol name_version number.

Example of the complete protocol format:

makefileCopy code
apple_1_1:0xaaa24678f36c28baa3beaf86bd065dd18a85df24

Example of the format without the protocol address:

Copy code
apple_1_1

Rules