WEB3DEV

Cover image for Construindo um Contrato Inteligente de Plataforma de Financiamento Coletivo usando a RPC QuickNode
Adriano P. Araujo
Adriano P. Araujo

Posted on

Construindo um Contrato Inteligente de Plataforma de Financiamento Coletivo usando a RPC QuickNode

Pré-requisitos:

  • O que é uma plataforma de financiamento coletivo.
  • Principais recursos e componentes de um Contrato Inteligente de Plataforma de Financiamento Coletivo.
  • Casos de uso de um Contrato Inteligente de Plataforma de Financiamento Coletivo.
  • Escrevendo um Contrato Inteligente de Plataforma de Financiamento Coletivo.
  • Implantação com o RPC QuickNode.

O QUE É UMA PLATAFORMA DE FINANCIAMENTO COLETIVO?

Uma plataforma de financiamento coletivo é uma plataforma online que permite a indivíduos, empresas e organizações arrecadar fundos para projetos específicos, iniciativas ou empreendimentos de um grande número de pessoas, geralmente pela internet. Ela atua como intermediária, conectando criadores de projetos (ou financiadores) a possíveis apoiadores (ou investidores).

Existem diferentes tipos de plataformas de financiamento coletivo, cada uma atendendo a um propósito específico:

  1. Financiamento com Recompensas:

    • Neste tipo, financiadores contribuem com fundos para um projeto em troca de recompensas não financeiras, como acesso antecipado a um produto, mercadorias especiais ou outros incentivos relacionados ao projeto.
  2. Financiamento com Participação Acionária:

    • O financiamento com participação acionária envolve financiadores investindo em um projeto ou negócio em troca de participação acionária ou ações. Se o projeto for bem-sucedido, os investidores podem receber uma parte dos lucros.
  3. Financiamento por Doações:

    • Este tipo permite que financiadores façam contribuições para um projeto sem esperar nenhum retorno financeiro. É frequentemente usado para causas filantrópicas ou de caridade.
  4. Financiamento com Dívidas (Empréstimo entre Pares):

    • Financiadores emprestam dinheiro a um projeto ou indivíduo, esperando ser reembolsados com juros ao longo do tempo.
  5. Financiamento Imobiliário:

    • Isso se concentra especificamente em projetos imobiliários. Investidores contribuem com fundos para um empreendimento imobiliário e, em troca, podem receber uma parte da renda de aluguel ou lucros com a venda de propriedades.
  6. Financiamento Baseado em Blockchain (Ofertas Iniciais de Moedas — ICOs):

    • Usando a tecnologia blockchain, as ICOs permitem que startups arrecadem capital emitindo tokens ou criptomoedas para financiadores. Esses tokens podem representar participação em um projeto ou ter utilidade específica dentro de uma plataforma.

Elas oferecem uma maneira acessível e eficiente para empreendedores, artistas, organizações sem fins lucrativos e outros financiarem seus empreendimentos ou projetos. Elas aproveitam o poder coletivo de um grande número de indivíduos, frequentemente fornecendo oportunidades para apoiadores apoiarem causas ou ideias nas quais acreditam.

RECURSOS-CHAVE E COMPONENTES DE UM CONTRATO INTELIGENTE DE PLATAFORMA DE FINANCIAMENTO COLETIVO.

  1. Registro de Projeto:

    • Permite que criadores de projetos registrem seus projetos na plataforma. Isso inclui fornecer detalhes sobre o projeto, meta de financiamento, duração da campanha e quaisquer recompensas ou incentivos para financiadores.
  2. Mecanismo de Financiamento:

    • Define o método pelo qual financiadores podem contribuir com fundos para um projeto. Isso pode envolver a aceitação de criptomoedas, moeda fiduciária ou outros métodos de pagamento suportados pela plataforma.
  3. Meta de Financiamento e Prazo:

    • Define o valor-alvo que o criador do projeto pretende arrecadar. A campanha é considerada bem-sucedida se atingir ou exceder essa meta dentro de um período de tempo especificado.
  4. Serviços de Custódia:

    • Utiliza um sistema de custódia para manter fundos com segurança até que a campanha atinja sua meta ou prazo. Uma vez que a meta seja alcançada, os fundos são liberados para o criador do projeto. Caso contrário, eles podem ser devolvidos aos financiadores.
  5. Mecanismo de Reembolso:

    • Especifica as condições sob as quais os financiadores podem solicitar um reembolso, como se a campanha não atingir sua meta de financiamento dentro do tempo alocado.
  6. Distribuição de Recompensas:

    • Define como os criadores de projetos distribuem recompensas ou incentivos para financiadores com base em seu nível de contribuição. Isso pode incluir produtos digitais, acesso antecipado ou outros benefícios.
  7. Governança de Contrato Inteligente:

    • Inclui mecanismos para criadores de projetos gerenciarem e atualizarem suas campanhas. Isso pode envolver a edição de detalhes do projeto, a prorrogação da duração da campanha ou o cancelamento de uma campanha (sob circunstâncias específicas).
  8. Autenticação e Verificação de Financiadores:

    • Garante que os financiadores sejam elegíveis e autorizados a participar de uma campanha. Isso pode envolver a verificação de identidades ou a realização de verificações de Conheça Seu Cliente (KYC).
  9. Visibilidade e Descoberta de Projetos:

    • Fornece uma interface de plataforma para os usuários navegarem e descobrirem projetos. Pode incluir recursos de pesquisa, filtros e categorias para ajudar os usuários a encontrar projetos de interesse.
  10. Integração de Carteira de Usuário:

    • Permite que os usuários conectem suas carteiras digitais à plataforma para facilitar as contribuições e o recebimento de recompensas ou reembolsos.
  11. Relatórios e Análises:

    • Oferece ferramentas para criadores de projetos acompanharem o progresso de suas campanhas, visualizarem o histórico de contribuições e gerarem relatórios sobre o desempenho da campanha.
  12. Ferramentas de Comunicação:

    • Facilita a comunicação entre criadores de projetos e financiadores, permitindo que eles façam perguntas, recebam atualizações e abordem preocupações.
  13. Resolução de Conflitos:

    • Inclui um mecanismo para lidar com disputas entre criadores de projetos e financiadores, fornecendo um processo de resolução justo.
  14. Conformidade e Considerações Legais:

    • Garante que a plataforma e as campanhas sigam os requisitos legais e regulatórios, que podem variar dependendo da jurisdição.
  15. Medidas de Segurança:

    • Implementa protocolos de segurança para proteger contra possíveis vulnerabilidades ou ataques, protegendo os fundos e dados dos usuários.

CASOS DE USO DE UM CONTRATO INTELIGENTE DE PLATAFORMA DE FINANCIAMENTO COLETIVO.

  1. Empreendimentos Empresariais:

    • Empreendedores e startups podem usar plataformas de financiamento coletivo para arrecadar capital semente para o lançamento de novos negócios ou o desenvolvimento de produtos e serviços inovadores.
  2. Projetos Criativos:

    • Artistas, músicos, cineastas e escritores podem buscar financiamento para empreendimentos criativos, como a produção de álbuns, filmes, a publicação de livros ou a criação de obras de arte.
  3. Tecnologia e Inovação:

    • Inovadores e inventores de tecnologia podem mostrar seus protótipos ou conceitos e reunir fundos para levar suas inovações ao mercado.
  4. Causas Sociais e Organizações sem Fins Lucrativos:

    • Organizações sem fins lucrativos e indivíduos que trabalham em causas sociais ou ambientais podem usar o financiamento coletivo para arrecadar fundos para projetos ou campanhas específicas.
  5. Desenvolvimento Imobiliário:

    • Desenvolvedores e profissionais imobiliários podem utilizar o financiamento coletivo para financiar projetos de desenvolvimento imobiliário, permitindo que investidores detenham participações fracionárias na propriedade.
  6. Pesquisa Médica e Iniciativas de Saúde:

    • Pesquisadores e profissionais de saúde podem usar o financiamento coletivo para financiar estudos médicos, ensaios clínicos e iniciativas voltadas para encontrar curas ou melhorar serviços de saúde.
  7. Projetos Comunitários:

    • Comunidades podem se unir para financiar iniciativas locais, como a construção de parques, a renovação de espaços públicos ou a organização de eventos em benefício da comunidade.
  8. Educação e Desenvolvimento de Habilidades:

    • Indivíduos, educadores ou organizações podem buscar financiamento para programas educacionais, cursos, workshops ou iniciativas de desenvolvimento de habilidades.
  9. Projetos Ambientais:

    • Iniciativas focadas em conservação, sustentabilidade ou proteção ambiental podem usar o financiamento coletivo para financiar projetos como esforços de reflorestamento, preservação da vida selvagem ou soluções de energia limpa.
  10. Gadgets e Tecnologia Inovadora:

    • Inventores e entusiastas de tecnologia podem apresentar protótipos de gadgets, projetos de software ou hardware para reunir fundos para produção e desenvolvimento.

ESCREVENDO UM CONTRATO INTELIGENTE DE PLATAFORMA DE FINANCIAMENTO COLETIVO.

Ei, chega de fundamentos, é hora de ficar técnico!

Abaixo está o código de um contrato inteligente de plataforma de financiamento coletivo.

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

contract CrowdfundingPlatform {
    struct Project {
        address creator;
        uint256 goal;
        uint256 deadline;
        uint256 totalContributions;
        bool projectActive;
    }

    mapping(uint256 => Project) public projects;
    mapping(uint256 => mapping(address => uint256)) public contributions;

    address public owner;
    uint256 public nextProjectId = 1;
    uint256 public fractionalDecimal = 3;

    event ProjectCreated(uint256 indexed projectId, address indexed creator, uint256 goal, uint256 deadline);
    event ContributionMade(uint256 indexed projectId, address indexed contributor, uint256 amount);
    event ProjectFunded(uint256 indexed projectId);

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can call this function");
        _;
    }

    constructor() {
        owner = msg.sender;
    }

    function createProject(uint256 _goal, uint256 _deadline) external {
        require(_goal > 0, "Goal must be greater than zero");
        require(_deadline > block.timestamp, "Deadline must be in the future");

        projects[nextProjectId] = Project({
            creator: msg.sender,
            goal: _goal,
            deadline: _deadline,
            totalContributions: 0,
            projectActive: true
        });

        emit ProjectCreated(nextProjectId, msg.sender, _goal, _deadline);
        nextProjectId++;
    }

    function contributeToProject(uint256 _projectId, uint256 _amount) external {
        Project storage project = projects[_projectId];
        require(project.projectActive, "Project is not active");
        require(block.timestamp <= project.deadline, "Project deadline has passed");
        require(_amount > 0, "Contribution amount must be greater than zero");

        contributions[_projectId][msg.sender] += _amount;
        project.totalContributions += _amount;

        emit ContributionMade(_projectId, msg.sender, _amount);

        if (project.totalContributions >= project.goal) {
            project.projectActive = false;
            emit ProjectFunded(_projectId);
        }
    }

    function withdrawFunds(uint256 _projectId) external onlyOwner {
        Project storage project = projects[_projectId];
        require(!project.projectActive, "Project is still active");
        require(project.totalContributions >= project.goal, "Project did not reach its goal");

        uint256 totalContributions = project.totalContributions;
        address creator = project.creator;

        project.totalContributions = 0;
        for (uint256 i = 1; i <= nextProjectId; i++) {
            delete contributions[_projectId][creator];
        }

        payable(creator).transfer(totalContributions);
    }
}
Enter fullscreen mode Exit fullscreen mode
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract CrowdfundingPlatform {
Enter fullscreen mode Exit fullscreen mode
  • Esta é a definição do contrato. Ele é chamado de CrowdfundingPlatform.
struct Project {
        address creator;
        uint256 goal;
        uint256 deadline;
        uint256 totalContributions;
        bool projectActive;
    }
Enter fullscreen mode Exit fullscreen mode
  • Aqui, uma estrutura chamada Project é definida. Ela representa um projeto de financiamento coletivo e contém as seguintes propriedades:
  • creator: Endereço do criador do projeto.
  • goal: A meta de financiamento do projeto.
  • deadline: O carimbo de data/hora em que o período de financiamento do projeto termina.
  • totalContributions: Valor total contribuído para o projeto.
  • projectActive: Um booleano que indica se o projeto ainda está aberto para contribuições.
mapping(uint256 => Project) public projects;
    mapping(uint256 => mapping(address => uint256)) public contributions;
Enter fullscreen mode Exit fullscreen mode
  • Esses são mapeamentos que associam IDs de projeto com suas respectivas estruturas do Project e contribuições. O mapeamento projects associa IDs de projeto a estruturas do Project, enquanto o mapeamento contributions associa IDs de projeto aos endereços dos contribuintes e aos valores das contribuições deles.
  address public owner;
    uint256 public nextProjectId = 1;
    uint256 public fractionalDecimal = 3;
Enter fullscreen mode Exit fullscreen mode
  • Essas são variáveis de estado:
  • owner: Endereço do proprietário (implantador) do contrato.
  • nextProjectId: Um contador para acompanhar o próximo ID de projeto disponível.
  • fractionalDecimal: Um número inteiro que indica o nível de propriedade fracionada (neste caso, está definido como 3).
event ProjectCreated(uint256 indexed projectId, address indexed creator, uint256 goal, uint256 deadline);
    event ContributionMade(uint256 indexed projectId, address indexed contributor, uint256 amount);
    event ProjectFunded(uint256 indexed projectId);
Enter fullscreen mode Exit fullscreen mode
  • Esses são eventos que serão emitidos durante certas ações do contrato. Eles oferecem uma maneira para sistemas externos acompanharem atividades específicas no contrato.
modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can call this function");
        _;
    }
Enter fullscreen mode Exit fullscreen mode
  • Este é um modificador chamado onlyOwner. Ele restringe a chamada de determinadas funções apenas ao proprietário do contrato.
constructor() {
        owner = msg.sender;
    }
Enter fullscreen mode Exit fullscreen mode
  • Esta é a função construtora. Ela define o owner como o endereço que implantou o contrato.
function createProject(uint256 _goal, uint256 _deadline) external {
        require(_goal > 0, "Goal must be greater than zero");
        require(_deadline > block.timestamp, "Deadline must be in the future");

        projects[nextProjectId] = Project({
            creator: msg.sender,
            goal: _goal,
            deadline: _deadline,
            totalContributions: 0,
            projectActive: true
        });

        emit ProjectCreated(nextProjectId, msg.sender, _goal, _deadline);
        nextProjectId++;
    }
Enter fullscreen mode Exit fullscreen mode
  • Esta função permite que qualquer pessoa crie um novo projeto de financiamento coletivo. Ela exige uma meta de financiamento (_goal) e um prazo (_deadline) em carimbos de data/hora. Em seguida, cria uma nova estrutura do Project e emite um evento ProjectCreated.
function contributeToProject(uint256 _projectId, uint256 _amount) external {
        Project storage project = projects[_projectId];
        require(project.projectActive, "Project is not active");
        require(block.timestamp <= project.deadline, "Project deadline has passed");
        require(_amount > 0, "Contribution amount must be greater than zero");

        contributions[_projectId][msg.sender] += _amount;
        project.totalContributions += _amount;

        emit ContributionMade(_projectId, msg.sender, _amount);

        if (project.totalContributions >= project.goal) {
            project.projectActive = false;
            emit ProjectFunded(_projectId);
        }
    }
Enter fullscreen mode Exit fullscreen mode
  • Esta função permite que contribuintes contribuam para um projeto específico (_projectId). Ela verifica se o projeto está ativo e se o prazo não passou. Também garante que o valor da contribuição seja válido. Se todas as condições forem atendidas, ela atualiza o mapeamento de contribuições e as contribuições totais do projeto. Se a meta de financiamento for alcançada, marca o projeto como inativo e emite um evento ProjectFunded.
function withdrawFunds(uint256 _projectId) external onlyOwner {
        Project storage project = projects[_projectId];
        require(!project.projectActive, "Project is still active");
        require(project.totalContributions >= project.goal, "Project did not reach its goal");

        uint256 totalContributions = project.totalContributions;
        address creator = project.creator;

        project.totalContributions = 0;
        for (uint256 i = 1; i <= nextProjectId; i++) {
            delete contributions[_projectId][creator];
        }

        payable(creator).transfer(totalContributions);
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Esta função permite que o proprietário retire fundos de um projeto quando ele não estiver mais ativo e tiver atingido sua meta de financiamento. Ela transfere as contribuições totais para o criador do projeto.

Este contrato possibilita a criação e gestão de projetos de financiamento coletivo, permitindo que contribuidores financiem projetos e que os criadores dos projetos retirem os fundos uma vez que suas metas sejam alcançadas. Este contrato também mantém transparência por meio de eventos e mapeamentos públicos.

Vamos escrever este código em nosso ambiente de desenvolvimento integrado REMIX.

DEPLOYMENT COM RPC QUICKNODE.

PASSO 1.

Crie um novo nó Sepolia no QuickNode. Você precisa acessar o Painel do QuickNode e clicar em "Create".

Em seguida, certifique-se de selecionar a cadeia Ethereum. Veja a captura de tela abaixo:

Clique em Sepolia:

Depois, clique em 'continue' para prosseguir. Finalmente, clique em 'create endpoint' para obter seu URL Sepolia.

PASSO 2.

Clique em "Add network". Siga as instruções sobre como adicionar o URL RPC ao seu navegador de carteira.

Clique em "Add network manually".

PASSO 3.

Digite um nome (qualquer nome) já que você está usando o QuickNode, você pode usar 'QKN'), copie/cole seu endpoint (ponto de extremidade) Web3 (certifique-se de incluir a barra no final), insira o ChainID e clique em "Salvar".

Estamos usando a Rede de Testes Sepolia, portanto, é aconselhável usar o Chain ID da Sepolia, que é '11155111'.

Finalmente, você obterá o resultado abaixo:

Perfeito! Estamos quase terminando. Agora vamos solicitar um pouco de Ether (ETH) da Rede de Testes Sepolia para poder implantar nosso contrato inteligente.

PASSO 4.

Agora, para obter taxas de gás, vamos usar https://faucet.quicknode.com/drip. Abaixo está o procedimento.

Então conecte a carteira e adquira algum Eth.

Depois de fazer isso, você obterá o resultado abaixo:

Com isso, estamos prontos para implantar nosso contrato inteligente da plataforma de financiamento coletivo.

Implantando o código do contrato inteligente na Rede de TestesSepolia.

Clique em 'confirm' para finalizar as transações.

Conclusão

Parabéns por criar com sucesso sua própria plataforma de financiamento coletivo na Ethereum!

Inscreva-se na newsletter QuickNode para mais artigos e guias sobre a Ethereum. Se você tiver algum feedback, sinta-se à vontade para entrar em contato conosco pelo Twitter. Você sempre pode conversar conosco em nosso servidor do Discord, que tem alguns dos desenvolvedores mais legais que você pode conhecer :)


Este artigo foi escrito por Playboi.eth e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.

Top comments (0)