SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
24.11.2024

Lição 124: Vendas Coletivas e Ofertas Iniciais de Moedas (ICOs)

No mundo do blockchain e das criptomoedas, as Vendas Coletivas e as Ofertas Iniciais de Moedas (ICOs) são mecanismos populares de captação de recursos para startups. Elas permitem que os desenvolvedores levantem fundos para novos projetos vendendo tokens para investidores. Esta lição abordará o básico sobre vendas coletivas e ICOs, juntamente com exemplos simples de código em Solidity para ilustrar como esses conceitos podem ser implementados em contratos inteligentes.

O que é uma Venda Coletiva?

Uma venda coletiva é um evento onde uma empresa oferece seus tokens à venda ao público em troca de criptomoedas (comumente Ethereum). As vendas coletivas podem ser estruturadas de várias maneiras e são normalmente usadas para distribuir tokens que serão utilizados em um projeto ou plataforma específica.

O que é uma Oferta Inicial de Moedas (ICO)?

Uma ICO é um tipo de venda coletiva onde empresas emitem novos tokens de criptomoeda para investidores, geralmente em troca de Ether (ETH) ou outras criptomoedas. As ICOs podem ser estruturadas como vendas públicas, vendas privadas ou pré-vendas, cada uma com regras diferentes quanto à participação e à distribuição de tokens.

Componentes Básicos de um Contrato Inteligente de Venda Coletiva

Um contrato típico de venda coletiva inclui os seguintes componentes:

  1. Token - Um token de criptomoeda que será vendido durante a venda coletiva.
  2. Duração da Venda - O período durante o qual a venda coletiva está ativa.
  3. Preço - A taxa de câmbio entre o token e a criptomoeda aceita.
  4. Meta de Financiamento - O valor mínimo de recursos que a venda coletiva precisa captar.
  5. Propriedade - Mecanismos para garantir que apenas usuários autorizados possam gerenciar a venda coletiva.

Exemplo: Contrato Simples de Venda Coletiva

Abaixo está uma implementação simples de um contrato inteligente de venda coletiva em Solidity. Este contrato permite que os usuários comprem tokens durante um período especificado:

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

// Importando a interface do token ERC20
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract SimpleCrowdsale is Ownable {
    IERC20 public token;                  // O token que está sendo vendido
    uint public rate;                     // O número de unidades do token que o comprador recebe por wei
    uint public openingTime;              // O horário de início da venda coletiva
    uint public closingTime;              // O horário de término da venda coletiva
    address payable public wallet;        // Um endereço onde os fundos são coletados
    uint public raisedAmount;              // Valor total arrecadado em wei

    event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint value, uint amount);

    constructor(
        uint _rate,
        address payable _wallet,
        IERC20 _token,
        uint _openingTime,
        uint _closingTime
    ) {
        require(_rate > 0, "A taxa deve ser maior que 0");
        require(_wallet != address(0), "O endereço da carteira não pode ser zero");
        require(address(_token) != address(0), "O endereço do token não pode ser zero");
        require(_openingTime >= block.timestamp, "O horário de abertura deve estar no futuro");
        require(_closingTime > _openingTime, "O horário de fechamento deve ser após o horário de abertura");

        rate = _rate;
        wallet = _wallet;
        token = _token;
        openingTime = _openingTime;
        closingTime = _closingTime;
    }

    // Função de fallback para aceitar pagamentos
    receive() external payable {
        buyTokens(msg.sender);
    }

    // Função para comprar tokens
    function buyTokens(address beneficiary) public payable {
        require(block.timestamp >= openingTime, "A venda coletiva ainda não começou");
        require(block.timestamp <= closingTime, "A venda coletiva terminou");
        require(msg.value > 0, "O valor deve ser maior que 0");

        uint tokens = msg.value * rate;       // Calcula a quantidade de tokens a serem enviados
        raisedAmount += msg.value;            // Atualiza o total arrecadado

        token.transfer(beneficiary, tokens);  // Transfere tokens para o comprador
        emit TokensPurchased(msg.sender, beneficiary, msg.value, tokens); // Emite um evento
        wallet.transfer(msg.value);            // Envia os fundos para a carteira
    }

    // Função para encerrar a venda coletiva
    function endCrowdsale() public onlyOwner {
        require(block.timestamp > closingTime, "A venda coletiva ainda não terminou");
        selfdestruct(wallet);                 // Destrói o contrato e envia os fundos restantes para a carteira
    }
}

Explicação do Código

  1. Declaração do Contrato: O contrato SimpleCrowdsale herda de Ownable, permitindo que o proprietário gerencie a venda coletiva.

  2. Variáveis de Estado: O contrato utiliza variáveis de estado para armazenar informações importantes, incluindo a taxa, endereço da carteira, horários de abertura e fechamento.

  3. Construtor: O construtor inicializa os atributos da venda coletiva, garantindo verificações de validação, como valores diferentes de zero.

  4. Função de Fallback: A função de fallback permite que os usuários enviem Ether para o contrato diretamente, acionando a função buyTokens.

  5. Lógica de Compra de Tokens: A função buyTokens verifica se a venda coletiva está ativa, calcula os tokens com base no Ether enviado e transfere os tokens para o comprador enquanto envia os fundos para a carteira especificada.

  6. Encerrar Venda Coletiva: A função endCrowdsale permite que o proprietário encerre a venda coletiva e destrói o contrato, transferindo quaisquer fundos restantes para a carteira.

Conclusão

Vendas coletivas e ICOs são componentes fundamentais do cenário de criptomoedas e blockchain, fornecendo um mecanismo para que projetos levantem os fundos necessários, permitindo que investidores tenham acesso antecipado a novos tokens. Esta lição apresentou um exemplo simples de como implementar uma venda coletiva usando Solidity.

Ao desenvolver um contrato de venda coletiva, sempre assegure testes rigorosos e avaliações de segurança para mitigar riscos e proteger os fundos.

Video

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

Thank you for voting!