{"id":16038,"date":"2021-09-27T03:30:00","date_gmt":"2021-09-27T03:30:00","guid":{"rendered":"https:\/\/hederav2stg.wpenginepowered.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/"},"modified":"2025-12-09T17:13:36","modified_gmt":"2025-12-09T17:13:36","slug":"mapping-hedera-token-service-standards-to-erc20-erc721-erc1155","status":"publish","type":"post","link":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/","title":{"rendered":"Mapping Hedera Token Service Standards to ERC20, ERC721, &#038; ERC1155"},"content":{"rendered":"<div class=\"body-text BodyCopy mb-40 style-1\">\n<p dir=\"ltr\">Hedera released the <a href=\"https:\/\/hedera.com\/blog\/hedera-token-service-hts-live-on-mainnet-with-over-60-initial-ecosystem-partners\">Hedera Token Service<\/a> on February 9th, 2021. This service offers configuration and issuance of native fungible and non-fungible tokens in a fast, secure, and <a href=\"https:\/\/hedera.com\/blog\/going-carbon-negative-at-hedera-hashgraph\">sustainable<\/a> way with <a href=\"https:\/\/docs.hedera.com\/hedera\/networks\/mainnet\/fees#token-service\">low, predictable fees<\/a>.\u00a0<\/p>\n<p dir=\"ltr\">At Hedera, we\u2019re often asked how Hedera Token Service (HTS) tokens map to the most ubiquitous fungible and non-fungible token models: ERC20, ERC721 and ERC1155. Let\u2019s dive deeper into the Hedera Token Service and highlight how Hedera token models and ERC token models overlap.<\/p>\n<p dir=\"ltr\">In this blog post, we\u2019ll take a look at how Hedera token models extend beyond ERC models through built-in configurable compliance and programmability, such as custom token fees and scheduled transactions.<\/p>\n<p dir=\"ltr\">While there may have been evolutions of the ERC models over time, or developer-own customizations, we have used the following OpenZeppelin implementation as a reference:<\/p>\n<ul>\n<li dir=\"ltr\">\n<p dir=\"ltr\">ERC20: Fungible Token Standard (<a href=\"https:\/\/github.com\/OpenZeppelin\/openzeppelin-contracts\/tree\/master\/contracts\/token\/ERC20\">link<\/a>)\u00a0<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">ERC721: Non-Fungible Token Standard (<a href=\"https:\/\/github.com\/OpenZeppelin\/openzeppelin-contracts\/tree\/master\/contracts\/token\/ERC721\">link<\/a>)\u00a0<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">ERC1155: Multi Token Standard (<a href=\"https:\/\/github.com\/OpenZeppelin\/openzeppelin-contracts\/tree\/master\/contracts\/token\/ERC1155\">link<\/a>)<\/p>\n<\/li>\n<\/ul>\n<p dir=\"ltr\">Note: Only functions and getters that are external in the contract definitions, along with events are documented here. Likewise, interfaces have not been included.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Token Identification using Hedera Token Service<\/h4>\n<p dir=\"ltr\">Tokens on Hedera are identified by a Token Id, made of three numerals separated by a dot; for example, 0.0.123344. The Token Id is allocated by the network when a token is first issued and cannot change. The Id is the equivalent to a smart contract address for an ERC token.<\/p>\n<p dir=\"ltr\">Just like ERC tokens, there is no enforcement of the uniqueness of a token\u2019s name or symbol. Two tokens with the same name and\/or symbol may exist on the Hedera network but they will have different token Ids.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Mapping | ERC20: Fungible Token Standard<\/h4>\n<p dir=\"ltr\">The ERC20 token specification is the simplest standard of the three. It maps to the Hedera Token Service as follows:<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC20 contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">constructor method<\/h4>\n<p dir=\"ltr\">A <strong>tokenCreate<\/strong> transaction constructs a new token on Hedera, returning the token\u2019s unique identifier known as Token Id (e.g. 0.0.123433).<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">name, symbol, decimals and totalSupply getters<\/h4>\n<p dir=\"ltr\">The <strong>getInfo <\/strong>query for a particular Token Id will return the properties of the token. This includes its name, symbol, decimals, and total supply.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">balanceOf getter<\/h4>\n<p dir=\"ltr\">Querying the balance of an account for a given Account Id will return a list of tokens which are held by the account and the balance of each token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">transfer method<\/h4>\n<p dir=\"ltr\">The <strong>cryptoTransfer<\/strong> Hedera transaction enables a token to be transferred between accounts. Moreover, the same transaction supports complex atomic swaps including one or more tokens and optionally some hbar in the same transaction. Should any of the specified transfers fail due to insufficient balances or incorrect signatures, the entire transaction is cancelled.<\/p>\n<p dir=\"ltr\">An example atomic transfer may be Alice sending 5 blue tokens to Bob and Bob sending 2 yellow tokens to Carol while Carol sends 20 hbar to Alice.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">mint method<\/h4>\n<p dir=\"ltr\">Subject to the token having a <strong>supplyKey<\/strong>, additional tokens may be minted in a quantity expressed in the decimal value of the token via the <strong>mintToken<\/strong> transaction. Note that if the token has a <strong>finite supply<\/strong>, it is not possible to mint more than the <strong>maxSupply <\/strong>specified when the token was issued (see <strong>ERC20Capped<\/strong> below).<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">burn method<\/h4>\n<p dir=\"ltr\">Subject to the token having a <strong>supplyKey<\/strong>, tokens may be burnt in a quantity expressed in the decimal value of the token via the <strong>burnToken<\/strong> transaction.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">allowance related methods<\/h4>\n<p dir=\"ltr\">The allowance features of an ERC20 token comprise <strong>approve<\/strong>, <strong>transferFrom<\/strong>, <strong>increaseAllowance<\/strong> and <strong>decreaseAllowance<\/strong>. There is no direct equivalent of these methods in the Token Service API, however through the use of the native multi-sig capabilities of Hedera Accounts, it is possible to effect an allowance as explained below.<\/p>\n<p dir=\"ltr\">First, create a new account with at least two keys (could be more to enable allowance towards multiple people at once), these keys would be subject to a threshold such as 1 of M and one of the keys would be known to the token holder wishing to allow others to spend on his\/her behalf.<\/p>\n<p dir=\"ltr\">Second, transfer the desired amount of tokens to be approved to this new account from the token holding account. From this point, any of the key holders in the threshold list is able to <strong>transfer<\/strong> tokens from this new account to any other. This satisfies the <strong>approve<\/strong> (transfer to the new account) and <strong>transferFrom<\/strong> (a key from the keylist can transfer from the new account) methods in the ERC20 contract.<\/p>\n<p dir=\"ltr\">Similarly, by transferring additional tokens to this new account, or inversely, transferring from the new account, the allowance can be <strong>increased<\/strong> or <strong>decreased<\/strong>, thus satisfying the <strong>increaseAllowance<\/strong> and <strong>decreaseAllowance<\/strong> features of the ERC20 contract.<\/p>\n<p dir=\"ltr\">Finally, querying the balance of the new account would return the remaining allowance which is equivalent to the <strong>allowance<\/strong> getter in the ERC20 contract.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">transfer event<\/h4>\n<p dir=\"ltr\">The equivalent of an event is a transaction recorded on a mirror node, by querying a mirror node for <strong>CRYPTOTRANSFER<\/strong> transactions for a given account, the token transfers included in the transaction can be identified.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">approval event<\/h4>\n<p dir=\"ltr\">Similarly to the transfer event, this would require querying a mirror node for <strong>CRYPTOTRANSFER<\/strong> transactions involving the approving account and token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC20Burnable contract<\/h4>\n<p dir=\"ltr\">This contract implements additional burn-related methods.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">burn method<\/h4>\n<p dir=\"ltr\">Subject to the token having a <strong>supplyKey<\/strong>, tokens may be burnt in a quantity expressed in the decimal value of the token via the <strong>burnToken<\/strong> transaction.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">burnFrom method<\/h4>\n<p dir=\"ltr\">Subject to the token being issued with a <strong>wipeKey<\/strong>, a quantity of tokens may be removed from an account which will also burn the same quantity from the token itself.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC20Capped contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">constructor method<\/h4>\n<p dir=\"ltr\">When issuing a new token, it\u2019s possible to specify the token\u2019s <strong>supplyType<\/strong> which may be <strong>FINITE<\/strong> or <strong>INFINITE<\/strong>.<\/p>\n<p dir=\"ltr\">In the event the <strong>supplyType <\/strong>is <strong>FINITE<\/strong>, a <strong>maxSupply<\/strong> amount has to be specified which essentially determines the <strong>supply<\/strong> <strong>cap<\/strong> on the token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">cap getter<\/h4>\n<p dir=\"ltr\"><strong>getInfo<\/strong> on a token will return the <strong>maxSupply<\/strong> and <strong>supplyType<\/strong> for the token. If the <strong>maxSupply<\/strong> is 0, the token is considered to have infinite supply (in fact limited to 2^63-1).<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC20Pausable contract<\/h4>\n<p dir=\"ltr\">There is no equivalent implementation of this, except that if the token has a <strong>freezeKey<\/strong>, the appropriate key holder(s) could iteratively <strong>freeze<\/strong> all accounts that hold a balance of the token, then later <strong>unfreeze<\/strong> those accounts if necessary.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Ownable contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">owner getter<\/h4>\n<p dir=\"ltr\">The owner of the token can be identified by querying the token via a <strong>getInfo<\/strong> and inspecting the <strong>treasuryAccountId<\/strong> for the token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">onlyOwner function<\/h4>\n<p dir=\"ltr\">This is native to the Token Service whereby operations on the token can only occur if signed by the appropriate private key(s).<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">transferOwnership method<\/h4>\n<p dir=\"ltr\">If the token has an <strong>adminKey<\/strong>, it is possible to update the <strong>treasuryAccountId<\/strong> for the token, thus transferring ownership of the token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ownershipTransferred event<\/h4>\n<p dir=\"ltr\">This can be determined by querying a mirror node for a <strong>TOKENUPDATE<\/strong> operation involving the token and seeing a change in <strong>treasuryAccountId<\/strong>.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC20PresetFixedSupply<\/h4>\n<p dir=\"ltr\">When issuing a token, it is possible to define an <strong>initialSupply<\/strong> in the decimal denomination of the token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Summary<\/h4>\n<p dir=\"ltr\">The table below summarizes the mappings described above. To review documentation for the Hedera Token Service equivalent API call, please visit the <a href=\"https:\/\/hedera.com\/token-service\">documentation<\/a>.<\/p>\n<p><grammarly-extension class=\"cGcvT\" data-grammarly-shadow-root=\"true\"><\/grammarly-extension><grammarly-extension class=\"cGcvT\" data-grammarly-shadow-root=\"true\"><\/grammarly-extension><grammarly-extension class=\"cGcvT\" data-grammarly-shadow-root=\"true\"><\/grammarly-extension><grammarly-extension class=\"cGcvT\" data-grammarly-shadow-root=\"true\"><\/grammarly-extension><\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p dir=\"ltr\"><strong>Solidity Contract<\/strong><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\"><strong>Method\/function\/event<\/strong><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\"><strong>HTS Equivalent<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">constructor<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenCreate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">name, symbol, decimals and totalSupply getters<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetInfo<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">balanceOf and allowance getters<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">cryptoGetAccountBalance<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">transfer method<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">cryptoTransfer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">mint method<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenMint<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">burn method<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenBurn<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">approve, transferFrom, increaseAllowance and decreaseAllowance methods<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use multisig feature of Hedera accounts.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">transfer event<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use mirror node<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">approve event<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use mirror node<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20Burnable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">burn<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenBurn<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20Burnable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">burnFrom<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenWipe<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20Capped<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">constructor<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenCreate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20Capped<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">cap getter<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetInfo<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ECR20Pausable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">all<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenFreeze and tokenUnfreeze on all accounts holding the token<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">Ownable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">owner getter<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetInfo<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">Ownable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">onlyOwner function<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Only approved keys can operate the token natively<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">Ownable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">transferOwnership method<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenUpdate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">Ownable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">ownershipTransferred method<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use mirror node<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20PresetFixedSupply<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">all<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenCreate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ECDSA<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">all<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Not required<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">SafeMath<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">all<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Not necessary, the Hedera Token Service takes care of the necessary calculations<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">TokenTimeLock<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">all<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Not necessary due to the atomicity of transfer transactions which can involve multiple tokens at once<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC20FlashMint<\/p>\n<p dir=\"ltr\">ERC20Snapshot<\/p>\n<p dir=\"ltr\">ERC20Votes<\/p>\n<p dir=\"ltr\">ERC20VotesComp<\/p>\n<p dir=\"ltr\">ERC20Wrapper<\/p>\n<p dir=\"ltr\">ERC20PresetMinterPauser<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">all<\/p>\n<\/td>\n<td spellcheck=\"false\">\n<p dir=\"ltr\">No equivalent at the time of writing this blog.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Mapping | ERC721: Non-Fungible Token Standard<\/h4>\n<p dir=\"ltr\">The ERC721 token specification introduces the ability to support non fungible tokens. It maps to the Hedera Token Service as follows:<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC721 contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">constructor method<\/h4>\n<p dir=\"ltr\">A <strong>tokenCreate<\/strong> transaction constructs a new token on Hedera, returning the token\u2019s unique identifier known as Token Id (e.g. 0.0.123433).<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">supportsInterface getter<\/h4>\n<p dir=\"ltr\">There is no direct equivalent to this function<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">balanceOf getter<\/h4>\n<p dir=\"ltr\">A <strong>TokenGetAccountNftInfosQuery<\/strong> will return the list of non fungible tokens held by a given Account Id.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ownerOf getter<\/h4>\n<p dir=\"ltr\">A <strong>TokenGetNftInfoQuery<\/strong> will return the AccountId which owns a given NFT token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">name and symbol getters<\/h4>\n<p dir=\"ltr\">A <strong>getInfo<\/strong> on the Token Id will return its name and symbol.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">tokenURI getter<\/h4>\n<p dir=\"ltr\">A <strong>tokenGetNFTInfoQuery<\/strong> on a given NFT Id will return a <strong>metadata <\/strong>value which may contain the URI of the NFT or any other arbitrary binary data up to 100 bytes.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">approve, transferFrom and safeTransferFrom methods<\/h4>\n<p dir=\"ltr\">There are no direct equivalent of these methods in the Token Service API, however through the use of the native multi-sig capabilities of Hedera Accounts, it is possible to effect an approval as explained below.<\/p>\n<p dir=\"ltr\">First, create a new account with at least two keys (could be more to enable approval towards multiple people at once), these keys would be subject to a threshold such as 1 of M and one of the keys would be known to the token holder wishing to allow others to spend on his\/her behalf.<\/p>\n<p dir=\"ltr\">Second, transfer the desired tokens to be approved to this new account from the token holding account. From this point, any of the key holders in the threshold list is able to <strong>transfer<\/strong> tokens from this new account to any other. This satisfies the <strong>approve<\/strong> (transfer to the new account) and <strong>transferFrom<\/strong> (a key from the keylist can transfer from the new account) methods in the ERC20 contract.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">getApproved getter<\/h4>\n<p dir=\"ltr\">A <strong>TokenGetNftInfoQuery<\/strong> will return the AccountId which owns a given NFT token. If this Account Id has multiple keys associated with it, it\u2019s likely the NFT has been approved previously, a query against mirror node using the public keys would enable anyone to identify the approved accounts.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">setApprovalForAll method<\/h4>\n<p dir=\"ltr\">A token is associated with a treasury Account Id which holds all newly minted NFTs. Using Hedera\u2019s native multisig capabilities, the keys on the treasury account can be updated to include as many other approved keys as required in order to allow these keys to transfer tokens from treasury to other accounts.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">isApprovedForAll method<\/h4>\n<p dir=\"ltr\">Querying the keys associated with the token\u2019s treasury Account Id (<strong>cryptoGetInfo<\/strong>) would yield one or more keys. If more than one key is returned, the token is approved for transfer by more than one key. Querying a mirror node using the public keys would identify which Account Ids are approved.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">transfer event<\/h4>\n<p dir=\"ltr\">The equivalent of an event is a transaction recorded on a mirror node, by querying a mirror node for <strong>CRYPTOTRANSFER<\/strong> transactions for a given account, the token transfers included in the transaction can be identified.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">approval event<\/h4>\n<p dir=\"ltr\">Similarly to the transfer event, this would require querying a mirror node for <strong>CRYPTOTRANSFER<\/strong> transactions involving the approving account and token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">approvalForAll event<\/h4>\n<p dir=\"ltr\">An approve for all operation would be performed by updating the keys on the token\u2019s treasury Account Id, this transaction can be witnessed on a mirror node.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC721Burnable contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">burn method<\/h4>\n<p dir=\"ltr\">Subject to the token having a <strong>supplyKey<\/strong>, NFTs may be burnt individually or in bulk by supplying a list of NFTs to burn via a <strong>tokenBurn<\/strong> transaction.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC721Enumerable contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">supportsInterface method<\/h4>\n<p dir=\"ltr\">There is no equivalent in the Hedera Token Service.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">tokenOfOwnerByIndex getter<\/h4>\n<p dir=\"ltr\">A <strong>TokenGetAccountNftInfosQuery<\/strong> query will return an array of NFTs owned by a given Account Id. By specifying the start and end indices of the range of NFTs to return, it\u2019s possible to get the owned NFTs by index.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">totalSupply getter<\/h4>\n<p dir=\"ltr\">A <strong>tokenGetInfo<\/strong> will return the total supply for a given token.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">tokenByIndex getter<\/h4>\n<p dir=\"ltr\">A <strong>TokenGetNftInfosQuery<\/strong> query will return an array of NFTs for a given Token Id. The range of returned NFTs can be specified with a start and end index.<\/p>\n<p dir=\"ltr\">ERC721Storage contract<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">tokenURI getter<\/h4>\n<p dir=\"ltr\">A <strong>tokenGetNFTInfoQuery<\/strong> on a given NFT Id will return a <strong>metadata <\/strong>value which may contain the URI of the NFT or any other arbitrary binary data up to 100 bytes.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC721PresetMinterPauserAutoId contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">constructor<\/h4>\n<p dir=\"ltr\">A <strong>tokenCreate<\/strong> transaction constructs a new token on Hedera, returning the token\u2019s unique identifier known as Token Id (e.g. 0.0.123433).<\/p>\n<p dir=\"ltr\">This constructor takes a <strong>baseTokenURI<\/strong> which in HTS could either be stored in the token\u2019s <strong>memo<\/strong> or <strong>symbol<\/strong> although this value isn\u2019t used by subsequently minted NFTs.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">mint method<\/h4>\n<p dir=\"ltr\">The <strong>tokenMint<\/strong> transaction enables one or more NFTs to be minted. Indeed an array of <strong>metadata<\/strong> may be supplied which will determine the number of NFTs to mint and will associate each <strong>metadata<\/strong> value to its corresponding NFT. The receipt for the transaction will include an array of serial numbers uniquely identifying the newly minted NFTs.<\/p>\n<p dir=\"ltr\">Note that this transaction mints the NFTs to the treasury, subsequent <strong>cryptoTransfer<\/strong> transactions are necessary to transfer the minted NFTs to their owner unless they are to be kept in treasury.<\/p>\n<p dir=\"ltr\">Minting can only take place if the token has a <strong>supplyKey<\/strong>.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">pause and unpause methods<\/h4>\n<p dir=\"ltr\">There is no equivalent implementation of this, except that if the token has a <strong>freezeKey<\/strong>, the appropriate key holder(s) could iteratively <strong>freeze<\/strong> all accounts that hold a balance of the token, then later <strong>unfreeze<\/strong> those accounts if necessary.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">supportsInterface getter<\/h4>\n<p dir=\"ltr\">There is no equivalent in the Hedera Token Service.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Summary<\/h4>\n<p dir=\"ltr\">The table below summarizes the mappings described above. To review documentation for the Hedera Token Service equivalent API call, please visit the <a href=\"https:\/\/hedera.com\/token-service\">documentation<\/a>.<\/p>\n<p><\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p dir=\"ltr\"><strong>Solidity Contract<\/strong><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\"><strong>Method\/function\/event<\/strong><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\"><strong>HTS Equivalent<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">constructor<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenCreate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">supportsInterface<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">No equivalent<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">balanceOf<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetAccountNftInfosQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">ownerOf<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetNftInfoQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">name and symbol\u00a0<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetInfo<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenURI<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetNFTInfoQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">approve, transferFrom and safeTransferFrom<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use multisig feature of Hedera accounts and cryptoTransfer transaction to make the transfers<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">getApproved<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetNftInfoQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">setApprovalForAll<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use multisig feature of Hedera accounts.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">isApprovedForAll<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Query keys on token\u2019s treasury account<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Transfer, approval and approvalForAll<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use mirror node<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721Burnable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">burn<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenBurn<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721Enumerable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">supportsInterface<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">No equivalent<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721Enumerable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenOfOwnerByIndex<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetAccountNftInfosQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721Enumerable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">totalSupply<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetInfo<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721Enumerable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenByIndex<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetNftInfosQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721Storage<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenURI<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetNFTInfoQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721PresetMinterPauserAutoId<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">constructor<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenCreate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721PresetMinterPauserAutoId<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">mint<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenMint<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721PresetMinterPauserAutoId<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">pause and unpause<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenFreeze and tokenUnfreeze on all accounts holding the token<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC721PresetMinterPauserAutoId<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">supportsInterface<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">No equivalent<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Mapping | ERC1155: Multi Token Standard<\/h4>\n<p dir=\"ltr\">The ERC1155 token specification introduces the ability to support fungible and non fungible tokens within the same contract definition. It maps to the Hedera Token Service as follows:<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC1155 contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">constructor method<\/h4>\n<p dir=\"ltr\">There is no direct equivalent in the Hedera Token Service. Once could consider that HTS implements ERC1155 natively, allowing any and all token types to be created without instantiating a contract in the first place.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">supportsInterface getter<\/h4>\n<p dir=\"ltr\">There is no equivalent in the Hedera Token Service for this.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">uri getter<\/h4>\n<p dir=\"ltr\">There is no equivalent in the Hedera Token Service for this, although NFT tokens may be minted with empty metadata and the corresponding URI be derived from the token type\u2019s metadata + the id of the resulting NFT.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">balanceOf getter<\/h4>\n<p dir=\"ltr\">Querying the balance (<strong>cryptoGetBalance)<\/strong> of an Account Id will return the balance of all Fungible Tokens owned by this account.<\/p>\n<p dir=\"ltr\">Querying <strong>TokenGetAccountNftInfosQuery<\/strong> for a given Account Id will return the NFTs the account owns.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">balanceOfBatch getter<\/h4>\n<p dir=\"ltr\">There is no equivalent in the Hedera Token Service for this other than querying each account in turn.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">setApprovalForAll method<\/h4>\n<p dir=\"ltr\">A token is associated with a treasury Account Id which holds all newly minted NFTs. Using Hedera\u2019s native multisig capabilities, the keys on the treasury account can be updated to include as many other approved keys as required in order to allow these keys to transfer tokens from treasury to other accounts.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">isApprovedForAll method<\/h4>\n<p dir=\"ltr\">Querying the keys associated with the token\u2019s treasury Account Id (<strong>cryptoGetInfo<\/strong>) would yield one or more keys. If more than one key is returned, the token is approved for transfer by more than one key. Querying a mirror node using the public keys would identify which Account Ids are approved.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">safeTransferFrom and safeBatchTransferFrom methods<\/h4>\n<p dir=\"ltr\">All token exchanges are performed atomically through a <strong>cryptoTransfer<\/strong> transaction listing the senders, tokens, amounts and recipients. Subject to the necessary signatures being present on the transaction to validate it, transfers occur atomically as a batch (or single token).<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC1155Burnable contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">burn method<\/h4>\n<p dir=\"ltr\">A <strong>tokenBurn<\/strong> transaction will burn a number of tokens or a list of NFTs from the treasury account for a given Token Id.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">burnBatch method<\/h4>\n<p dir=\"ltr\">A <strong>tokenBurn<\/strong> transaction will burn a number of tokens or a list of NFTs from the treasury account for a given Token Id. If multiple token types need to be burnt from, a separate <strong>tokenBurn<\/strong> transaction must be issued for each token type.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC1155Supply contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">totalSupply getter<\/h4>\n<p dir=\"ltr\">A <strong>tokenGetInfo<\/strong> query will return the token\u2019s total supply amongst other token details.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">exists getter<\/h4>\n<p dir=\"ltr\">A <strong>tokenGetInfo<\/strong> query for a Token Id will return its details, indicating it exists. If a non-existent Token Id is supplied, the query would return an error.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">ERC1155PresetMinterPauser contract<\/h4>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">constructor<\/h4>\n<p dir=\"ltr\">No Hedera Token Service equivalent.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">mint function<\/h4>\n<p dir=\"ltr\">Subject to having a <strong>supplyKey<\/strong>, any token may be minted with a <strong>tokenMint<\/strong> transaction. If the token is fungible, a quantity to mint is required. If the token is non fungible, an array of metadata for each minted NFT determines the quantity to mint.<\/p>\n<p dir=\"ltr\">Note: The mint operation mints to the token\u2019s treasury Account Id, subsequent transfers are required to send the minted tokens to other accounts than treasury.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">mintBatch function<\/h4>\n<p dir=\"ltr\">A <strong>tokenMint<\/strong> transaction mints to a specific Token Id, if multiple tokens need to be minted, a transaction needs to be issued for each Token Id.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">pause and unpause methods<\/h4>\n<p dir=\"ltr\">There is no equivalent implementation of this, except that if the token has a <strong>freezeKey<\/strong>, the appropriate key holder(s) could iteratively <strong>freeze<\/strong> all accounts that hold a balance of the token, then later <strong>unfreeze<\/strong> those accounts if necessary. If multiple tokens need to be paused, then transactions have to be issued for each Token Id.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">supportsInterface method<\/h4>\n<p dir=\"ltr\">There is no equivalent in the Hedera Token Service.<\/p>\n<h4 class=\"color-ultraviolet\" dir=\"ltr\">Summary<\/h4>\n<p dir=\"ltr\">The table below summarizes the mappings described above. To review documentation for the Hedera Token Service equivalent API call, please visit the <a href=\"https:\/\/hedera.com\/token-service\">documentation<\/a>.<\/p>\n<p><grammarly-extension class=\"cGcvT\" data-grammarly-shadow-root=\"true\"><\/grammarly-extension><grammarly-extension class=\"cGcvT\" data-grammarly-shadow-root=\"true\"><\/grammarly-extension><\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p dir=\"ltr\"><strong>Solidity Contract<\/strong><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\"><strong>Method\/function\/event<\/strong><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\"><strong>HTS Equivalent<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">constructor<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">No equivalent<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">supportsInterface<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">No equivalent<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">uri<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Mint tokens with empty metadata. Use token type\u2019s metadata + NFTid for uri<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">balanceOf<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">cryptoGetBalance and tokenGetAccountNftInfosQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">balanceOf<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">repeat cryptoGetBalance and tokenGetAccountNftInfosQuery<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">setApprovalForAll<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Use multisig feature of Hedera accounts.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">isApprovedForAll<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Query keys on token\u2019s treasury account<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">safeTransferFrom and safeBatchTransferFrom<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">cryptoTransfer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155Burnable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">burn<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenBurn<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155Burnable<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">burnBatch<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Repeat tokenBurn for each token type<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155Supply<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">totalSupply<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetInfo<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155Supply<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">exists<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenGetInfo (fails if Token Id doesn\u2019t exist)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155PresetMinterPauser<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">constructor<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">No equivalent<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155PresetMinterPauser<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">mint<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenMint<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155PresetMinterPauser<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">mintBatch<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenMint (optionally multiple times)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155PresetMinterPauser<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">pause and unpause<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">tokenFreeze and tokenUnfreeze<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p dir=\"ltr\">ERC1155PresetMinterPauser<\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">supportsInterface<\/p>\n<\/td>\n<td spellcheck=\"false\">\n<p dir=\"ltr\">No equivalent<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>At Hedera, we\u2019re often asked how Hedera Token Service (HTS) tokens map to the most ubiquitous fungible and non-fungible token models: ERC20, ERC721, and ERC1155. Let\u2019s dive deeper into the Hedera Token Service and highlight how Hedera token models and ERC token models overlap.<\/p>\n","protected":false},"author":10,"featured_media":17451,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[1],"tags":[45],"ppma_author":[43],"class_list":["post-16038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-technical"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mapping Hedera Token Service Standards to ERC20, ERC721, &amp; ERC1155 | Hedera<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mapping Hedera Token Service Standards to ERC20, ERC721, &amp; ERC1155 | Hedera\" \/>\n<meta property=\"og:description\" content=\"At Hedera, we\u2019re often asked how Hedera Token Service (HTS) tokens map to the most ubiquitous fungible and non-fungible token models: ERC20, ERC721, and ERC1155. Let\u2019s dive deeper into the Hedera Token Service and highlight how Hedera token models and ERC token models overlap.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/\" \/>\n<meta property=\"og:site_name\" content=\"Hedera\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-27T03:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-09T17:13:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hedera Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/\"},\"author\":{\"name\":\"Hedera Team\",\"@id\":\"https:\/\/hedera.com\/#\/schema\/person\/2dc6146f9f20a44d3de58c834d52e9f4\"},\"headline\":\"Mapping Hedera Token Service Standards to ERC20, ERC721, &#038; ERC1155\",\"datePublished\":\"2021-09-27T03:30:00+00:00\",\"dateModified\":\"2025-12-09T17:13:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/\"},\"wordCount\":3210,\"publisher\":{\"@id\":\"https:\/\/hedera.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg\",\"keywords\":[\"technical\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/\",\"url\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/\",\"name\":\"Mapping Hedera Token Service Standards to ERC20, ERC721, & ERC1155 | Hedera\",\"isPartOf\":{\"@id\":\"https:\/\/hedera.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg\",\"datePublished\":\"2021-09-27T03:30:00+00:00\",\"dateModified\":\"2025-12-09T17:13:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage\",\"url\":\"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg\",\"contentUrl\":\"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/hedera.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mapping Hedera Token Service Standards to ERC20, ERC721, &#038; ERC1155\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/hedera.com\/#website\",\"url\":\"https:\/\/hedera.com\/\",\"name\":\"Hedera\",\"description\":\"Hello future\",\"publisher\":{\"@id\":\"https:\/\/hedera.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/hedera.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/hedera.com\/#organization\",\"name\":\"Hedera\",\"url\":\"https:\/\/hedera.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/hedera.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/hedera.com\/wp-content\/uploads\/2025\/09\/hedera_logo.png\",\"contentUrl\":\"https:\/\/hedera.com\/wp-content\/uploads\/2025\/09\/hedera_logo.png\",\"width\":500,\"height\":375,\"caption\":\"Hedera\"},\"image\":{\"@id\":\"https:\/\/hedera.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mapping Hedera Token Service Standards to ERC20, ERC721, & ERC1155 | Hedera","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/","og_locale":"en_US","og_type":"article","og_title":"Mapping Hedera Token Service Standards to ERC20, ERC721, & ERC1155 | Hedera","og_description":"At Hedera, we\u2019re often asked how Hedera Token Service (HTS) tokens map to the most ubiquitous fungible and non-fungible token models: ERC20, ERC721, and ERC1155. Let\u2019s dive deeper into the Hedera Token Service and highlight how Hedera token models and ERC token models overlap.","og_url":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/","og_site_name":"Hedera","article_published_time":"2021-09-27T03:30:00+00:00","article_modified_time":"2025-12-09T17:13:36+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg","type":"image\/jpeg"}],"author":"Hedera Team","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#article","isPartOf":{"@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/"},"author":{"name":"Hedera Team","@id":"https:\/\/hedera.com\/#\/schema\/person\/2dc6146f9f20a44d3de58c834d52e9f4"},"headline":"Mapping Hedera Token Service Standards to ERC20, ERC721, &#038; ERC1155","datePublished":"2021-09-27T03:30:00+00:00","dateModified":"2025-12-09T17:13:36+00:00","mainEntityOfPage":{"@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/"},"wordCount":3210,"publisher":{"@id":"https:\/\/hedera.com\/#organization"},"image":{"@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage"},"thumbnailUrl":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg","keywords":["technical"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/","url":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/","name":"Mapping Hedera Token Service Standards to ERC20, ERC721, & ERC1155 | Hedera","isPartOf":{"@id":"https:\/\/hedera.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage"},"image":{"@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage"},"thumbnailUrl":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg","datePublished":"2021-09-27T03:30:00+00:00","dateModified":"2025-12-09T17:13:36+00:00","breadcrumb":{"@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#primaryimage","url":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg","contentUrl":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005.jpeg","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/hedera.com\/blog\/mapping-hedera-token-service-standards-to-erc20-erc721-erc1155\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hedera.com\/"},{"@type":"ListItem","position":2,"name":"Mapping Hedera Token Service Standards to ERC20, ERC721, &#038; ERC1155"}]},{"@type":"WebSite","@id":"https:\/\/hedera.com\/#website","url":"https:\/\/hedera.com\/","name":"Hedera","description":"Hello future","publisher":{"@id":"https:\/\/hedera.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hedera.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/hedera.com\/#organization","name":"Hedera","url":"https:\/\/hedera.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hedera.com\/#\/schema\/logo\/image\/","url":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/09\/hedera_logo.png","contentUrl":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/09\/hedera_logo.png","width":500,"height":375,"caption":"Hedera"},"image":{"@id":"https:\/\/hedera.com\/#\/schema\/logo\/image\/"}}]}},"featured_image_src":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005-600x400.jpeg","featured_image_src_square":"https:\/\/hedera.com\/wp-content\/uploads\/2025\/12\/Blog-Posting-Templatessss.005-600x600.jpeg","author_info":{"display_name":"Hedera Team","author_link":"https:\/\/hedera.com\/blog\/author\/hedera-team\/"},"authors":[{"term_id":43,"user_id":10,"is_guest":0,"slug":"hedera-team","display_name":"Hedera Team","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/7ed01931dc9498365746508c4ca49ed0507ef65e04e0b82ffe88c50ef9242b1d?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":""}],"_links":{"self":[{"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/posts\/16038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/comments?post=16038"}],"version-history":[{"count":0,"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/posts\/16038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/media\/17451"}],"wp:attachment":[{"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/media?parent=16038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/categories?post=16038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/tags?post=16038"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/hedera.com\/wp-json\/wp\/v2\/ppma_author?post=16038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}