From eecd579385ce4e5785a291445d8f3057313e7c4c Mon Sep 17 00:00:00 2001 From: Divine Orji Date: Mon, 18 Jul 2022 12:48:31 +0100 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20=E2=9C=8F=EF=B8=8F=20[ARTICLE]=20Cr?= =?UTF-8?q?ypto=20Tokens:=20ERC20,=20ERC721,=20and=20ERC1155?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I wrote an article explaining the features of ERC20, ERC721, and ERC1155 tokens. I also added my bio details and picture. ✅ Closes: #6 --- .../About.md | 19 +++ .../Article.md | 126 ++++++++++++++++++ .../images/divi.jpg | Bin 0 -> 39915 bytes 3 files changed, 145 insertions(+) create mode 100644 info-articles/crypto-tokens-erc20-erc721-erc1155/About.md create mode 100644 info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md create mode 100644 info-articles/crypto-tokens-erc20-erc721-erc1155/images/divi.jpg diff --git a/info-articles/crypto-tokens-erc20-erc721-erc1155/About.md b/info-articles/crypto-tokens-erc20-erc721-erc1155/About.md new file mode 100644 index 0000000..fa35c93 --- /dev/null +++ b/info-articles/crypto-tokens-erc20-erc721-erc1155/About.md @@ -0,0 +1,19 @@ +# About + +## Name + +Divine Orji + +## Bio + +Divine is a software engineer passionate about building fast, scalable apps with beautiful user interfaces and seamless user experience. + +He is an avid learner and enjoys sharing knowledge as part of a community. + +## Social + +[Website](https://dpkreativ.dev), [Blog](https://blog.dpkreativ.dev), [Twitter](https://twitter.com/dpkreativ), [LinkedIn](https://www.linkedin.com/in/dpkreativ). + +## Image + +![Divine Orji](./images/divi.jpg) diff --git a/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md b/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md new file mode 100644 index 0000000..93effb0 --- /dev/null +++ b/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md @@ -0,0 +1,126 @@ +## Introduction + +With the rise in popularity of blockchain technologies and cryptocurrencies, we are seeing many more tokens being created. But what are they, exactly? This post will go over three of the most common types of crypto tokens: ERC20, ERC721, and ERC1155. + +## What are Tokens? + +Tokens are digital assets built on a cryptocurrency’s blockchain. They differ from coins because while a coin is built on its native blockchain, a token is built on an existing blockchain. + +For example, ETH is the official coin for the Ethereum blockchain, while Basic Attention Token (BAT), Chainlink (LINK), and OmiseGo (OMG) are tokens built on Ethereum. + +Tokens are often a quicker way to leverage the existing standards of a successful and popular blockchain while building digital assets. Their most common use case is smart contracts on decentralized applications (DApps). + +### ERCs and EIPs + +Before the adoption of token standards, blockchain developers created tokens according to personal preferences, often causing token ecosystems to experience difficulties when interacting. + +To solve this problem, Ethereum developers now create ERCs (Ethereum Request for Comments) and EIPs (Ethereum Improvement Proposals). These help to define the rules and required functions for tokens created on the Ethereum blockchain, making integrations and interactions much more accessible. + +## ERC20 Tokens + +[**ERC20**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) is a protocol that defines standard APIs for creating fungible tokens in a smart contract. It was created in 2015 by Fabian Vogelsteller. + +Its main methods include: + +- **`name()`** (_optional_): The name of the token. +- **`symbol()`** (_optional_): The symbol of the token. +- **`decimals()`** (_optional_): The decimal places of the token. This allows for fungibility. +- **`totalSupply()`**: The total number of existing tokens. +- **`balanceOf()`**: The total number of tokens owned by a particular `account`. +- **`transfer()`**: Moves a number of tokens from the caller’s account to a specified `address`. +- **`transferFrom()`**: Same as `transfer()`, but it also specifies the address to move tokens from. +- **`allowance()`**: The number of tokens a `spender` is allowed to spend on behalf of the `owner` via `transferFrom()`. +- **`approve()`**: Sets the number of tokens a `spender` is allowed to spend. + +All these methods are strictly required in an ERC20 smart contract, apart from the first three marked “(_optional_)” which help to improve usability. + +An ERC20 also has two events - **`Transfer`** (which triggers when tokens are transferred) and **`Approved`** (which triggers on any successful call to the `approve()` method). + +Many projects use ERC20 tokens during their fundraising period (known as ICO - Initial Coin Offering). They are also widely used for trading purposes - some exchanges only support trading in tokens that adhere to this standard due to their popularity among investors and traders. + +## ERC721 Tokens + +[**ERC721**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md) is a standard for creating non-fungible tokens (NFTs) on Ethereum. It was created in 2018 by Dieter Shirley, Jacob Evans, Natassia Sachs, and William Entriken. + +A few examples include: +Rare collectibles (e.g., CryptoKitties). +Unique digital assets for video games. +Limited edition items like sneakers and art prints. + +A basic ERC721 smart contract contains methods like: + +- **`balanceOf()`**: The number of tokens in the `owner`'s account. +- **`ownerOf()`**: The `tokenId` of the owner. +- **`safeTransferFrom()`**: Safely transfers tokens from owner's address to recipient’s address. The `tokenId` must be specified as a parameter. +- **`transferFrom()`**: Same function as `safeTransferFrom()`, but generally not recommended. +- **`approve()`**: Allows an address to transfer a token identified by its `tokenId`, into another account. It triggers the `Approval` event. +- **`setApprovalForAll()`**: Allows an `operator` to call `safeTransferFrom` or `transferFrom` for any token owned by the caller. +- **`getApproved()`**: Gets the approved account for a specific `tokenId`. +- **`isApprovedForAll()`**: Checks if an `operator` is allowed to manage all the assets of the `owner`. + +It also contains events like **`Transfer`** (which triggers when ownership of any NFT changes) and **`Approval`** (which activates when the approved address for an NFT is changed). + +ERC721 has multiple extensions split across different contracts. Here are two such extensions: + +### ERC721Enumerable + +The [**ERC721Enumerable**](https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#IERC721Enumerable) contains all the methods available in the original ERC721 and three extra methods: + +- **`totalSupply()`**: The total amount of tokens in the contract. +- **`tokenOfOwnerByIndex()`**: The `tokenId` of an owner’s address at a given `index` in its token list. You can use it with `balanceOf` to enumerate all of the `owner`'s tokens. +- **`tokenByIndex()`**: The `tokenId` at a given `index`. You can use it with `totalSupply` to enumerate all tokens. + +This extension is often not implemented because enumerating tokens on the blockchain could significantly spike gas costs. + +### ERC721A + +[**ERC721A**](https://github.com/chiru-labs/ERC721A) is an extension of ERC721 that aims to significantly reduce transaction fees by allowing users to mint multiple unique NFTs in a single transaction. + +It was created by the Azuki team in 2022 and is currently used by projects like Dastardly Ducks and Zero Gravity Club. + +In addition to the original ERC721 methods, it contains extra methods like: + +- **`_startTokenId()`**: The starting token ID. +- **`_nextTokenId()`**: The next token ID to be minted. +- **`_totalMinted()`**: The total amount of minted tokens. +- **`_numberMinted()`**: The number of tokens minted by an `owner`. +- **`_getAux()`**: Gets the auxiliary data for an `owner` (e.g., the number of whitelist mint slots used.) +- **`_setAux()`**: Sets the auxiliary data for an `owner` +- **`_ownershipOf()`**: The token ownership data for a specific `tokenId`. +- **`_initializeOwnershipAt()`**: This can be used to initialize some tokens in a large batch to reduce first-time transfer costs. It initializes token ownership data at the `index` slot. +- **`_mint()`**: Mints a number of tokens and transfers them to a specific address. +- **`_safeMint()`**: Same functionality as `_mint`, but it contains a `data` parameter which gets forwarded to contract recipients in `IERC721Receiver.onERC721Received`. +- **`_beforeTokenTransfers()`**: This hook is called **before** a token ID set is about to be transferred. It is also called before burning one token. It contains the `startTokenId` and the `quantity` of tokens. +- **`_afterTokenTransfers()`**: This hook is called **after** a set of token IDs are to be transferred. + +## ERC1155 Tokens + +The [**ERC1155**](https://docs.openzeppelin.com/contracts/4.x/erc1155) protocol combines the abilities of ERC20 and ERC721, allowing tokens to have fungible and non-fungible characteristics. It was created by Witek Radomski and made public in 2019. + +ERC1155 provides a way to model assets and their ownership, as well as a way to create, transfer, and settle those assets. With these capabilities, you can trade fungible assets like gold bullion, or collectibles such as art, baseball cards, loyalty points, etc., using the same smart contract. + +In an ERC1155 smart contract, the **`balanceOf()`** method contains an `id` argument to identify the token you want to query its balance. + +It also contains other methods like: + +- **`balanceOfBatch()`**: It returns the balance in a batch of accounts with specified ids. +- **`setApprovalForAll()`**: Allows an `operator` to transfer a `caller`'s tokens. +- **`isApprovedForAll()`**: Checks if an `operator` is allowed to transfer a `caller`'s tokens. +- **`safeTransferFrom()`**: Transfers a number of tokens from a `caller`'s address to a recipient’s address. The tokens must have a type of `id`. +- **`safeBatchTransferFrom()`**: Same functionality as `safeTransferFrom()` but in batches. + +## Conclusion + +The first step in creating a smart contract is deciding the right tool for the job. We hope you’ve enjoyed this brief overview of the different types of tokens! + +If you want to learn more about crypto and see what is happening in this space, check out our blog or these resources listed below. + +## Resources + +- [Token vs Coin: What's the Difference? (bitdegree.org)](https://www.bitdegree.org/crypto/tutorials/token-vs-coin) +- [7 Most Popular Ethereum Based Tokens (brokerxplorer.com)](https://www.brokerxplorer.com/article/7-most-popular-ethereum-based-tokens-2185) +- [Tokens - OpenZeppelin Docs](https://docs.openzeppelin.com/contracts/4.x/tokens) +- [ERC-721A - Azuki](https://www.azuki.com/erc721a) +- [Token standards: ERC20 vs ERC721 vs ERC1155 (leewayhertz.com)](https://www.leewayhertz.com/erc-20-vs-erc-721-vs-erc-1155/) +- [ERC20 & ERC721: How Do They Work? - CoinMarketCap Blog](https://blog.coinmarketcap.com/2019/02/25/erc20-erc721-how-do-they-work/) +- [What is ERC-721? The Ethereum NFT Token Standard - Decrypt](https://decrypt.co/resources/erc-721-ethereum-nft-token-standard) diff --git a/info-articles/crypto-tokens-erc20-erc721-erc1155/images/divi.jpg b/info-articles/crypto-tokens-erc20-erc721-erc1155/images/divi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3e5a204bba1b6d61aa4f2021045a495662d05d2 GIT binary patch literal 39915 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¨-Kbo#R<2xCq~&FrDMLsQY|} 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%0DySco+Pqr-JfPI+{EwD0zqMQN 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 literal 0 HcmV?d00001 From 8a5c2425e2d05e0a85ef2c8276acddcca3fdfdf4 Mon Sep 17 00:00:00 2001 From: Divine Orji Date: Wed, 27 Jul 2022 08:04:55 +0100 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20=E2=9C=8F=EF=B8=8F=20Update=20Artic?= =?UTF-8?q?le.md=20to=20include=20suggestions=20from=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Here I added ERC777 to the list of tokens, explained the difference between fungible and non-fungible tokens, added links to token creators and projects that implement each of the listed tokens. I also updated the Conclusion section ✅ Closes: #6 --- .../Article.md | 58 ++++++++++++++----- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md b/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md index 93effb0..0e60ba1 100644 --- a/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md +++ b/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md @@ -1,6 +1,6 @@ ## Introduction -With the rise in popularity of blockchain technologies and cryptocurrencies, we are seeing many more tokens being created. But what are they, exactly? This post will go over three of the most common types of crypto tokens: ERC20, ERC721, and ERC1155. +With the rise in popularity of blockchain technologies and cryptocurrencies, we are seeing many more tokens being created. But what are they, exactly? This post will go over some of the most common types of crypto tokens: ERC20, ERC777, ERC721, and ERC1155. ## What are Tokens? @@ -10,15 +10,23 @@ For example, ETH is the official coin for the Ethereum blockchain, while Basic A Tokens are often a quicker way to leverage the existing standards of a successful and popular blockchain while building digital assets. Their most common use case is smart contracts on decentralized applications (DApps). +### Fungible and Non-fungible Tokens + +Tokens generally fall under two categories: fungible tokens and non-fungible tokens. + +Fungible tokens are divisible digital assets that you can swap for other assets of the same type. No single unit is worth more or less than another. Think about how a dollar bill is similar to another one and can be easily exchanged. + +On the other hand, non-fungible tokens (also known as NFTs) are digital assets that you cannot easily exchange for other assets due to their uniqueness. For example, consider an artwork that holds a particular value for its owner and would be difficult to exchange for another artwork because their perceived values are different. + ### ERCs and EIPs -Before the adoption of token standards, blockchain developers created tokens according to personal preferences, often causing token ecosystems to experience difficulties when interacting. +Before the adoption of token standards, blockchain developers often created tokens according to personal preferences, causing token ecosystems to experience difficulties when interacting. To solve this problem, Ethereum developers now create ERCs (Ethereum Request for Comments) and EIPs (Ethereum Improvement Proposals). These help to define the rules and required functions for tokens created on the Ethereum blockchain, making integrations and interactions much more accessible. ## ERC20 Tokens -[**ERC20**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) is a protocol that defines standard APIs for creating fungible tokens in a smart contract. It was created in 2015 by Fabian Vogelsteller. +[**ERC20**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) is a protocol that defines standard APIs for creating fungible tokens in a smart contract. It was created in 2015 by [Fabian Vogelsteller](https://twitter.com/feindura). Its main methods include: @@ -36,22 +44,42 @@ All these methods are strictly required in an ERC20 smart contract, apart from t An ERC20 also has two events - **`Transfer`** (which triggers when tokens are transferred) and **`Approved`** (which triggers on any successful call to the `approve()` method). +Examples of ERC20 tokens are [USDC](https://www.circle.com/en/usdc), a stablecoin pegged to the dollar, or [UNI](https://www.coingecko.com/en/coins/uniswap), the governance token used in Uniswap to vote on changes on the platform. + Many projects use ERC20 tokens during their fundraising period (known as ICO - Initial Coin Offering). They are also widely used for trading purposes - some exchanges only support trading in tokens that adhere to this standard due to their popularity among investors and traders. +## ERC777 Tokens + +The [**ERC777**](https://eips.ethereum.org/EIPS/eip-777) standard offers improvements in how users interact with fungible tokens in a smart contract while remaining backward compatible with ERC20. It was created in 2017 by [Jacques Dafflon](https://github.com/0xjac), [Jordi Baylina](https://github.com/jbaylina), and Thomas Shabibi. + +Some of its improvements include clearing the confusion around decimals in a smart contract and introducing hooks that allow your smart contract to react when you send or receive tokens. These help to prevent tokens from getting locked forever or lost when sent to the wrong address. + +ERC777 contains methods like: + +- **`granularity()`**: The smallest part of the token that is not divisible. +- **`send()`**: Sends a specific `amount` of tokens to a `recipient` +- **`burn()`**: Destroys a specific `amount` of tokens, which reduces the `totalSupply`. +- **`isOperatorFor()`**: Checks if an account is an operator. +- **`authorizeOperator()`**: Makes an account an operator. +- **`revokeOperator()`**: Revokes an account's operator status. +- **`defaultOperators()`**: Returns a list of token holders who are default operators. +- **`tokensToSend()`**: This hook is called when tokens are about to be destroyed or moved `from` a specific holder's address. It is triggered **_before_** the smart contract's state is updated and can prevent the operation from being executed. +- **`tokensReceived()`**: This hook is called when tokens are about to be destroyed or moved `to` a specific holder's address. It is triggered **_after_** the smart contract's state is updated, which can prevent the operation from being executed. + +Popular implementations of ERC777 include [Lab10](https://lab10.coop/) and [Global Crypto Alliance](https://gcalliance.io/call-token/). + ## ERC721 Tokens -[**ERC721**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md) is a standard for creating non-fungible tokens (NFTs) on Ethereum. It was created in 2018 by Dieter Shirley, Jacob Evans, Natassia Sachs, and William Entriken. +[**ERC721**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md) is a standard for creating non-fungible tokens (NFTs) on Ethereum. It was created in 2018 by [Dieter Shirley](https://twitter.com/dete73), Jacob Evans, [Natassia Sachs](https://github.com/nastassiasachs), and [William Entriken](https://twitter.com/fulldecent). -A few examples include: -Rare collectibles (e.g., CryptoKitties). -Unique digital assets for video games. -Limited edition items like sneakers and art prints. +A few examples include rare collectibles (e.g., [CryptoKitties](https://www.cryptokitties.co/) and [Gods Unchained](https://godsunchained.com/)), or limited edition items like [sneakers](https://www.nytimes.com/2022/05/26/style/nike-nft-sneaker.html) and [art prints](https://onlineonly.christies.com/s/beeple-first-5000-days/beeple-b-1981-1/112924). +They can also signify membership in a community, like [Developer DAO](https://www.developerdao.com/). A basic ERC721 smart contract contains methods like: - **`balanceOf()`**: The number of tokens in the `owner`'s account. - **`ownerOf()`**: The `tokenId` of the owner. -- **`safeTransferFrom()`**: Safely transfers tokens from owner's address to recipient’s address. The `tokenId` must be specified as a parameter. +- **`safeTransferFrom()`**: Safely transfers tokens from the owner's address to the recipient’s. The `tokenId` must be specified as a parameter. - **`transferFrom()`**: Same function as `safeTransferFrom()`, but generally not recommended. - **`approve()`**: Allows an address to transfer a token identified by its `tokenId`, into another account. It triggers the `Approval` event. - **`setApprovalForAll()`**: Allows an `operator` to call `safeTransferFrom` or `transferFrom` for any token owned by the caller. @@ -76,7 +104,7 @@ This extension is often not implemented because enumerating tokens on the blockc [**ERC721A**](https://github.com/chiru-labs/ERC721A) is an extension of ERC721 that aims to significantly reduce transaction fees by allowing users to mint multiple unique NFTs in a single transaction. -It was created by the Azuki team in 2022 and is currently used by projects like Dastardly Ducks and Zero Gravity Club. +It was created by the Azuki team in 2022 and is currently used by projects like [Dastardly Ducks](https://www.dastardlyducks.com/) and [Zero Gravity Club](https://www.thezerogravity.club/). In addition to the original ERC721 methods, it contains extra methods like: @@ -95,7 +123,7 @@ In addition to the original ERC721 methods, it contains extra methods like: ## ERC1155 Tokens -The [**ERC1155**](https://docs.openzeppelin.com/contracts/4.x/erc1155) protocol combines the abilities of ERC20 and ERC721, allowing tokens to have fungible and non-fungible characteristics. It was created by Witek Radomski and made public in 2019. +The [**ERC1155**](https://docs.openzeppelin.com/contracts/4.x/erc1155) protocol combines the abilities of ERC20 and ERC721, allowing tokens to have fungible and non-fungible characteristics. It was created by [Witek Radomski](https://twitter.com/witekradomski) and made public in 2019. ERC1155 provides a way to model assets and their ownership, as well as a way to create, transfer, and settle those assets. With these capabilities, you can trade fungible assets like gold bullion, or collectibles such as art, baseball cards, loyalty points, etc., using the same smart contract. @@ -109,11 +137,13 @@ It also contains other methods like: - **`safeTransferFrom()`**: Transfers a number of tokens from a `caller`'s address to a recipient’s address. The tokens must have a type of `id`. - **`safeBatchTransferFrom()`**: Same functionality as `safeTransferFrom()` but in batches. +Popular ERC1155 projects include [FingerNFT](https://www.fingerchar.com/) and [Valorem](https://github.com/valorem-labs-inc/valorem-core). + ## Conclusion -The first step in creating a smart contract is deciding the right tool for the job. We hope you’ve enjoyed this brief overview of the different types of tokens! +The first step in creating a smart contract is deciding the right tool for the job. You can choose to create a simple fungible token based on ERC20, improve its features based on ERC777, create NFTs with ERC721, or hybrid smart contracts with ERC1155. -If you want to learn more about crypto and see what is happening in this space, check out our blog or these resources listed below. +Other token standards exist with their specific use-cases, and you can learn more about crypto tokens through our blog or these resources listed below. ## Resources @@ -124,3 +154,5 @@ If you want to learn more about crypto and see what is happening in this space, - [Token standards: ERC20 vs ERC721 vs ERC1155 (leewayhertz.com)](https://www.leewayhertz.com/erc-20-vs-erc-721-vs-erc-1155/) - [ERC20 & ERC721: How Do They Work? - CoinMarketCap Blog](https://blog.coinmarketcap.com/2019/02/25/erc20-erc721-how-do-they-work/) - [What is ERC-721? The Ethereum NFT Token Standard - Decrypt](https://decrypt.co/resources/erc-721-ethereum-nft-token-standard) +- [ERC-721: An Intro to the ERC-721 Token Standard](https://komodoplatform.com/en/academy/erc-721-token-standard/) +- [ERC-1155: An NFT Standard for Online Games and Gamified Apps – The New Stack](https://thenewstack.io/erc-1155-an-nft-standard-for-online-games-and-gamified-apps/) From 537add2aa20983b207a92f62b3bc62117b9a9383 Mon Sep 17 00:00:00 2001 From: Divine Orji Date: Wed, 27 Jul 2022 08:07:57 +0100 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20=E2=9C=8F=EF=B8=8F=20Update=20folde?= =?UTF-8?q?r=20containing=20article=20details?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I changed the name of my folder from crypto-tokens-erc20-erc721-erc1155 to crypto-tokens-erc20-erc777-erc721-erc1155 ✅ Closes: #6 --- .../About.md | 0 .../Article.md | 0 .../images/divi.jpg | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename info-articles/{crypto-tokens-erc20-erc721-erc1155 => crypto-tokens-erc20-erc777-erc721-erc1155}/About.md (100%) rename info-articles/{crypto-tokens-erc20-erc721-erc1155 => crypto-tokens-erc20-erc777-erc721-erc1155}/Article.md (100%) rename info-articles/{crypto-tokens-erc20-erc721-erc1155 => crypto-tokens-erc20-erc777-erc721-erc1155}/images/divi.jpg (100%) diff --git a/info-articles/crypto-tokens-erc20-erc721-erc1155/About.md b/info-articles/crypto-tokens-erc20-erc777-erc721-erc1155/About.md similarity index 100% rename from info-articles/crypto-tokens-erc20-erc721-erc1155/About.md rename to info-articles/crypto-tokens-erc20-erc777-erc721-erc1155/About.md diff --git a/info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md b/info-articles/crypto-tokens-erc20-erc777-erc721-erc1155/Article.md similarity index 100% rename from info-articles/crypto-tokens-erc20-erc721-erc1155/Article.md rename to info-articles/crypto-tokens-erc20-erc777-erc721-erc1155/Article.md diff --git a/info-articles/crypto-tokens-erc20-erc721-erc1155/images/divi.jpg b/info-articles/crypto-tokens-erc20-erc777-erc721-erc1155/images/divi.jpg similarity index 100% rename from info-articles/crypto-tokens-erc20-erc721-erc1155/images/divi.jpg rename to info-articles/crypto-tokens-erc20-erc777-erc721-erc1155/images/divi.jpg