SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
26.11.2024

Aula 145: Contratos de Fábrica

No mundo do Ethereum e dos contratos inteligentes, os contratos de fábrica desempenham um papel crucial. Um contrato de fábrica é um tipo de contrato inteligente projetado para criar e implantar outros contratos inteligentes. Esse padrão é útil para gerenciar um grande número de instâncias de contratos sem sobrecarregar a blockchain ou implantar cada um manualmente.

Nesta aula, exploraremos o conceito de contratos de fábrica em Solidity, como eles funcionam e forneceremos exemplos de implementação de um contrato de fábrica simples.

O que é um Contrato de Fábrica?

Um contrato de fábrica é essencialmente um contrato que contém a lógica para criar novas instâncias de outro contrato. Ele pode armazenar os endereços dos contratos implantados, fornecer funções para gerenciá-los e ajudar a minimizar os custos de gás, reduzindo a redundância de implantação.

Os contratos de fábrica são particularmente úteis em cenários onde você precisa implantar contratos semelhantes com pequenas variações, como contratos de token, contratos de NFT ou qualquer outro tipo de contrato inteligente que siga uma estrutura semelhante.

Exemplo: Criando uma Fábrica de Tokens Simples

Vamos passar por um exemplo simples que cria uma fábrica de tokens. Vamos criar dois contratos: um contrato de token e um contrato de fábrica que implantará múltiplos contratos de token.

Passo 1: Criando o Contrato de Token

Primeiro, implementaremos um contrato de token ERC20 básico:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

contract MeuToken is ERC20 {
    constructor(string memory nome, string memory simbolo, uint256 suprimentoInicial) ERC20(nome, simbolo) {
        _mint(msg.sender, suprimentoInicial);
    }
}

Neste exemplo, MeuToken é um token ERC20 simples que cunha um suprimento inicial de tokens para o endereço do implanta. Estamos usando a implementação ERC20 da OpenZeppelin para simplicidade e segurança.

Passo 2: Criando o Contrato de Fábrica de Token

Agora, vamos implementar um contrato de fábrica que implantará instâncias de MeuToken:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./MeuToken.sol";

contract FábricaDeToken {
    MeuToken[] public tokens;

    event TokenCriado(address enderecoToken);

    function criarToken(string memory nome, string memory simbolo, uint256 suprimentoInicial) public {
        MeuToken novoToken = new MeuToken(nome, simbolo, suprimentoInicial);
        tokens.push(novoToken);
        emit TokenCriado(address(novoToken));
    }

    function obterTokens() public view returns (MeuToken[] memory) {
        return tokens;
    }
}

Explicação do Contrato de Fábrica

  1. Variáveis de Estado: Declaramos um array tokens para acompanhar todos os tokens criados pela fábrica. Cada entrada neste array contém o endereço de um contrato MeuToken.

  2. Eventos: O evento TokenCriado é emitido sempre que um novo token é criado. Isso fornece uma maneira fácil de rastrear a criação de tokens.

  3. Criando Tokens: A função criarToken recebe os parâmetros necessários para o token (nome, símbolo, suprimento inicial), implanta uma nova instância de MeuToken e adiciona seu endereço ao array tokens.

  4. Visualizando Tokens: A função obterTokens permite que qualquer pessoa recupere a lista de contratos de token implantados a partir da fábrica.

Passo 3: Implantando o Contrato de Fábrica

Após implantar o contrato FábricaDeToken, você pode chamar a função criarToken várias vezes para criar diferentes tokens. Cada vez que um token é criado, seu endereço é armazenado no array tokens.

Exemplo de Interação com o Contrato de Fábrica

Supondo que tenhamos implantado a FábricaDeToken, veja como você pode interagir com ela:

// Código JavaScript para interagir com o contrato FábricaDeToken

const enderecoFabrica = '0x...'; // O endereço da FábricaDeToken implantada
const abiFabrica = [...] // ABI do contrato FábricaDeToken

const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const fabricaDeToken = new ethers.Contract(enderecoFabrica, abiFabrica, signer);

// Criar um novo token
await fabricaDeToken.criarToken("MeuToken1", "MT1", 1000);
await fabricaDeToken.criarToken("MeuToken2", "MT2", 2000);

// Obter a lista de tokens criados
const tokens = await fabricaDeToken.obterTokens();
console.log(tokens);

Conclusão

Os contratos de fábrica são ferramentas poderosas em Solidity que agilizam o processo de implantação e gerenciamento de contratos semelhantes. Ao usar um padrão de fábrica, você pode aumentar a modularidade, escalabilidade e organização de suas aplicações de contratos inteligentes. Esta aula forneceu um exemplo concreto de uma fábrica de tokens, demonstrando como criar e gerenciar várias instâncias de contratos de forma simples.

Bom codificação!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!