The Elrond protocol introduces native NFT support by adding metadata and attributes on top of the already existing ESDT. This way, one can issue a semi-fungible token or a non-fungible token which is quite similar to an ESDT, but has a few more attributes, as well as an assignable URI. Once owning a quantity of a NFT/SFT, users will have their data store directly under their account, inside the trie.
One has to perform an issuance transaction in order to register a non-fungible token. Non-Fungible Tokens are issued via a request to the Metachain, which is a transaction submitted by the Account which will manage the tokens. When issuing a token, one must provide a token name, a ticker and optionally additional properties.
IssuanceTransaction { Sender: <account address of the token manager> Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u Value: 50000000000000000 # (0.05 EGLD) GasLimit: 60000000 Data: "issueNonFungible" + "@" + <token name in hexadecimal encoding> + "@" + <token ticker in hexadecimal encoding> }
Optionally, the properties can be set when issuing a token. Example:
IssuanceTransaction { Sender: <account address of the token manager> Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u Value: 50000000000000000 # (0.05 EGLD) GasLimit: 60000000 Data: "issueNonFungible" + "@" + <token name in hexadecimal encoding> + "@" + <token ticker in hexadecimal encoding> + "@" + <"canFreeze" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> + "@" + <"canWipe" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> + "@" + <"canPause" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> + "@" + <"canTransferNFTCreateRole" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> + "@" + <"canChangeOwner" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> + "@" + <"canUpgrade" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> + "@" + <"canAddSpecialRoles" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> + ... }
The receiver address erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
is a built-in system smart contract (not a VM-executable contract), which only handles token issuance and other token management operations, and does not handle any transfers. The contract will add a random string to the ticker thus creating the token identifier. The random string starts with “-” and has 6 more random characters. For example, a token identifier could look like ALC-6258d2.
One has to perform an issuance transaction in order to register a semi-fungible token. Semi-Fungible Tokens are issued via a request to the Metachain, which is a transaction submitted by the Account which will manage the tokens. When issuing a semi-fungible token, one must provide a token name, a ticker and optionally additional properties.
IssuanceTransaction { Sender: <account address of the token manager> Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u Value: 50000000000000000 # (0.05 EGLD) GasLimit: 60000000 Data: "issueSemiFungible" + "@" + <token name in hexadecimal encoding> + "@" + <token ticker in hexadecimal encoding> }
Issue your own SFT or NFT.
In order to be able to perform actions over a token, one needs to have roles assigned. The existing roles are:
For NFT:
For SFT:
Roles can be assigned by sending a transaction to the Metachain from the ESDT manager. Within a transaction of this kind, any number of roles can be assigned (minimum 1).
RolesAssigningTransaction { Sender: <address of the ESDT manager> Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u Value: 0 GasLimit: 60000000 Data: "setSpecialRole" + "@" + <token identifier in hexadecimal encoding> + "@" + <address to assign the role(s) in a hexadecimal encoding> + "@" + <role in hexadecimal encoding> + "@" + <role in hexadecimal encoding> + ... }
Fields of an NFT/SFT:
NFTCreationTransaction { Sender: <address with ESDTRoleNFTCreate role> Receiver: <same as sender> Value: 0 GasLimit: 3000000 + Additional gas (see below) Data: "ESDTNFTCreate" + "@" + <token identifier in hexadecimal encoding> + "@" + <initial quantity in hexadecimal encoding> + "@" + <NFT name in hexadecimal encoding> + "@" + <Royalties in hexadecimal encoding> + "@" + <Hash in hexadecimal encoding> + "@" + <Attributes in hexadecimal encoding> + "@" + <URI in hexadecimal encoding> + "@" + <URI in hexadecimal encoding> + ... }
Create your own NFT.
Example of NFT Creation:
{ Sender: <address with ESDTRoleNFTCreate role> Receiver: <same as sender> Value: 0 GasLimit: 3000000 Data: "ESDTNFTCreate" + "@414c432d317132773365" + # previously fetched token identifier "@01" + # quantity: 1 "@42656175746966756c20736f6e67" + # NFT name: 'Beautiful song' in hexadecimal encoding "@1d4c" + # Royalties: 7500 =75%c in hexadecimal encoding "@00" + # Hash: 00 in hexadecimal encoding "@6d657461646174613a697066734349442f736f6e672e6a736f6e3b746167733a736f6e672c62656175746966756c2c6d75736963" + # Attributes: metadata:ipfsCID/song.json;tags:song,beautiful,music in hexadecimal encoding> + "@55524c5f746f5f646563656e7472616c697a65645f73746f726167652f736f6e672e6d7033" + # URI: URL_to_decentralized_storage/song.mp3 in hexadecimal encoding> + "@" + <additional optional URI in hexadecimal encoding> + }
Transfer NFT Creation Role, Stop NFT creation, Change NFT Attributes, Add URIs to NFT, Wiping a single NFT, etc..
TransferTransaction { Sender: <account address of the sender> Receiver: <same as sender> Value: 0 GasLimit: 1000000 + length of Data field in bytes * 1500 Data: "ESDTNFTTransfer" + "@" + <collection identifier in hexadecimal encoding> + "@" + <the NFT nonce in hexadecimal encoding> + "@" + <quantity to transfer in hexadecimal encoding> + "@" + <destination address in hexadecimal encoding> }
Transfer your NFT to erd1xex9ptczwwce4w9zejpjranj6mt8q5sqseenfj7ym55gfcpgq7cq5e9amz
.
TransferTransaction { Sender: <account address of the sender> Receiver: <same as sender> Value: 0 GasLimit: 1000000 + extra for smart contract call Data: "ESDTNFTTransfer" + "@" + <collection identifier in hexadecimal encoding> + "@" + <the nonce after the NFT creation in hexadecimal encoding> + "@" + <quantity to transfer in hexadecimal encoding> + "@" + <destination address in hexadecimal encoding> + "@" + <name of method to call in hexadecimal encoding> + "@" + <first argument of the method in hexadecimal encoding> + "@" + <second argument of the method in hexadecimal encoding> + <...> }