Um Guia Simples sobre Tokens ERC-1155 no Ethereum

Explore a versatilidade do padrão de token ERC-1155 do Ethereum, saiba como ele simplifica o gerenciamento de ativos digitais e siga um guia passo a passo para criar...

4 min de leitura
Um Guia Simples sobre Tokens ERC-1155 no Ethereum

A blockchain do Ethereum transformou significativamente a criação e o gerenciamento de ativos digitais. Entre esses avanços, o padrão ERC-1155 surge como uma inovação notável. Introduzido pela equipe da Enjin, o ERC-1155 foi projetado para simplificar e aumentar a eficiência dos ativos digitais em toda a blockchain, permitindo a criação de tokens fungíveis, não fungíveis e semifungíveis — tudo dentro de um único smart contract.

O ERC-1155 foi desenvolvido para resolver ineficiências em padrões de token anteriores, como o ERC-20 e o ERC-721. Enquanto o ERC-20 é adequado para tokens fungíveis (em que cada token é idêntico e intercambiável) e o ERC-721 para tokens não fungíveis (em que cada token é único), esses padrões apresentam limitações de escopo e eficiência ao lidar com múltiplos tipos de tokens.

Alguns dos principais benefícios do ERC-1155 são:

  • Transferências em lote: O ERC-1155 suporta transferências em lote, permitindo que múltiplos tipos de tokens sejam movidos em uma única transação. Isso reduz significativamente os custos de gas e aumenta a velocidade das transações.

  • Contrato único para múltiplos tokens: Esse padrão permite que um único contrato gerencie tanto tokens fungíveis quanto não fungíveis, simplificando a implantação e reduzindo custos.

  • Verificações de transferência segura: O ERC-1155 garante que os tokens sejam enviados para endereços compatíveis, aumentando a segurança das transações e evitando perdas por erros.

Confira algumas aplicações práticas do ERC-1155:

  • Games: Permite que toda uma economia de itens dentro do jogo, de consumíveis a equipamentos raros, seja gerenciada em um único contrato.

  • Arte digital: Permite que artistas emitam tanto peças de edição limitada quanto de edição aberta de forma simples.

  • Ativos tokenizados: Ativos do mundo real podem ser tokenizados e gerenciados usando o ERC-1155.

Criando e implantando um token ERC-1155

Neste tutorial, criaremos um token ERC-1155 básico chamado RAD Token. Este exemplo demonstrará como diferentes ativos podem ser gerenciados dentro de um único framework de contrato.

  1. Configure seu ambiente de desenvolvimento: Antes de começar, certifique-se de ter o Node.js e o npm instalados. Em seguida, configure seu projeto Hardhat:

mkdir rad-token
cd rad-token
npm init -y
Copiar
  1. Instale o Hardhat e os contratos OpenZeppelin

npm install --save-dev hardhat 
npm install @openzeppelin/contracts
Copiar
  1. Inicialize o Hardhat

npx hardhat

Escolha "Create an empty hardhat.config.js" quando solicitado.

  1. Escreva o contrato RADToken: Crie um novo arquivo contracts/RADToken.sol e cole o código do contrato abaixo.


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

import "@openzeppelin/contracts/access/Ownable.sol";

import "@openzeppelin/contracts/utils/Strings.sol";

contract RADToken is ERC1155, Ownable {

    constructor(address initialOwner, string memory baseURI) ERC1155(baseURI) Ownable(initialOwner) {

        // Initialize contract with metadata URI

 }

    function mint(address account, uint256 id, uint256 amount, bytes memory data)

        public

        onlyOwner

 {

        _mint(account, id, amount, data);

 }

    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)

        public

        onlyOwner

 {

        _mintBatch(to, ids, amounts, data);

 }

    function setURI(string memory newuri) public onlyOwner {

        _setURI(newuri);

 }

    function uri(uint256 tokenId) public view override returns (string memory) {

        return string(abi.encodePacked(super.uri(tokenId), Strings.toString(tokenId), ".json"));

 }

    function burn(address account, uint256 id, uint256 amount) public onlyOwner {

        _burn(account, id, amount);

 }

    function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts)

        public

        onlyOwner

 {

        _burnBatch(account, ids, amounts);

 }

}
Copiar
  1. Escreva o script de implantação: Crie um novo arquivo ignition/modules/RadToken.js para o módulo de implantação do Hardhat Ignition e adicione o código abaixo.

const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");
module.exports = buildModule("RADTokenModule", (m) => {
  const deployer = m.getAccount(0);
  const baseURI = m.getParameter(
    "baseURI",
"<https://gateway.pinata.cloud/ipfs/Qmar8RRAZ5QoVPTzvrRk9PcFSm9YKbkanxmd951nXk2bgM/>"
);
  const radToken = m.contract("RADToken", [deployer, baseURI]);
  return { radToken };
});
Copiar
  1. Escreva os scripts de teste: Crie um novo arquivo test/RadToken.js para testar o contrato e adicione o código abaixo:

const { expect } = require("chai");
const { ethers } = require("hardhat");
const {
  loadFixture,
} = require("@nomicfoundation/hardhat-toolbox/network-helpers");

describe("RADToken", function () {
  async function deployRADTokenFixture() {
    const [owner, addr1, addr2, ...addrs] = await ethers.getSigners();
    const RADToken = await ethers.getContractFactory("RADToken");
    const baseURI =
      "https://gateway.pinata.cloud/ipfs/Qmar8RRAZ5QoVPTzvrRk9PcFSm9YKbkanxmd951nXk2bgM/";
    const radToken = await RADToken.deploy(owner.address, baseURI);

    return { radToken, owner, addr1, addr2, addrs };
 }

  describe("Minting", function () {
    it("Should mint a token", async function () {
      const { radToken, addr1 } = await loadFixture(deployRADTokenFixture);
      await radToken.mint(addr1.address, 1, 100, "0x");
      expect(await radToken.balanceOf(addr1.address, 1)).to.equal(100);
 });

    it("Should mint multiple tokens in batch", async function () {
      const { radToken, addr1 } = await loadFixture(deployRADTokenFixture);
      await radToken.mintBatch(addr1.address, [1, 2], [100, 200], "0x");
      expect(await radToken.balanceOf(addr1.address, 1)).to.equal(100);
      expect(await radToken.balanceOf(addr1.address, 2)).to.equal(200);
 });
 });

  describe("URI Management", function () {
    it("Should return correct token URI", async function () {
      const { radToken } = await loadFixture(deployRADTokenFixture);
      expect(await radToken.uri(1)).to.equal(
        "https://gateway.pinata.cloud/ipfs/Qmar8RRAZ5QoVPTzvrRk9PcFSm9YKbkanxmd951nXk2bgM/1.json"
 );
 });

    it("Should set new URI and return correct token URI", async function () {
      const { radToken } = await loadFixture(deployRADTokenFixture);
      const newBaseURI = "https://newbase.uri/";
      await radToken.setURI(newBaseURI);
      expect(await radToken.uri(1)).to.equal("https://newbase.uri/1.json");
 });
 });
});
Copiar
  1. Teste o código do contrato: Execute os testes com o seguinte comando:

npx hardhat test
  1. Implante o contrato RADToken: Compile e implante o contrato com os seguintes comandos:

npx hardhat compile 
npx hardhat ignition --network localhost --show-logs ignition/modules/RadToken.js
Copiar

O que vem a seguir?

O ERC-1155 representa um avanço significativo nos padrões de token do Ethereum, oferecendo maior flexibilidade, eficiência e utilidade do que seus predecessores. O exemplo do RAD Token demonstra a facilidade com que múltiplos tipos de tokens podem ser gerenciados em um único contrato, abrindo caminho para uma nova geração de aplicações descentralizadas.

Recursos úteis

Traduzido por IA. Pode conter erros. Por favor, verifique sempre as informações.

Avalie a tradução