Vamos criar um desafio em Solidity para desenvolver um contrato de consórcio.
O contrato de consórcio permitirá que os participantes contribuam com um valor específico e, após um período determinado, possam adquirir uma cota do consórcio. O contrato também deve lidar com a administração e a confirmação de transações.
Aqui está um exemplo básico de como você pode estruturar esse contrato:
// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;contract Consorcio {addresspublic admin;uint256public prazo; // prazo em segundosuint256public valor; // valor da cota em weiuint256public valorTotal; // valor total do consórciouint256public percentualAdministracao; // percentual de administração (0.2%)uint256public quantidadeCotas;uint256public dataInicio;uint256public dataFim;mapping(address=>uint256) public cotas;mapping(address=>bool) public participantes;address[] public listaParticipantes;eventParticipacaoConfirmada(address participante, uint256 valorContribuido);eventTransacaoConfirmada(address participante, uint256 valor, uint256 quantidadeCotas);constructor(uint256_prazo,uint256_valor,uint256_valorTotal,uint256_quantidadeCotas ) { admin = msg.sender; prazo = _prazo; valor = _valor; valorTotal = _valorTotal; percentualAdministracao =20; // 0.2% como inteiro quantidadeCotas = _quantidadeCotas; dataInicio = block.timestamp; dataFim = dataInicio + prazo; }modifieronlyAdmin() {require(msg.sender == admin,"Acesso negado: Apenas o admin pode realizar esta ação"); _; }modifierconsorcioAberto() {require(block.timestamp < dataFim,"O consórcio foi encerrado"); _; }functionparticipar() externalpayableconsorcioAberto {require(!participantes[msg.sender],"Participante já registrado");require(msg.value >= valor,"Valor enviado é menor que o valor da cota");uint256 valorComTaxa = msg.value;uint256 valorTaxa = (valorComTaxa * percentualAdministracao) /10000; valorComTaxa -= valorTaxa; cotas[msg.sender] +=1; participantes[msg.sender] =true; listaParticipantes.push(msg.sender);payable(admin).transfer(valorTaxa);emitParticipacaoConfirmada(msg.sender, valorComTaxa); }functionconfirmarTransacao() external {require(participantes[msg.sender],"Você não está registrado no consórcio");uint256 quantidade = cotas[msg.sender];uint256 valorReembolsado = valor * quantidade;require(address(this).balance >= valorReembolsado,"Saldo insuficiente no contrato"); cotas[msg.sender] =0; participantes[msg.sender] =false;payable(msg.sender).transfer(valorReembolsado);emitTransacaoConfirmada(msg.sender, valorReembolsado, quantidade); }functionsaldoContrato() externalviewreturns (uint256) {returnaddress(this).balance; }functionlistarParticipantes() externalviewreturns (address[] memory) {return listaParticipantes; }}
Explicação:
Variáveis:
prazo: Duração do consórcio em segundos.
valor: Valor de cada cota em wei.
valorTotal: Valor total do consórcio.
percentualAdministracao: Percentual de administração (0.2% representado como 20/10000).
quantidadeCotas: Quantidade total de cotas disponíveis.
dataInicio e dataFim: Para controlar o período do consórcio.
Funções:
participar(): Permite que um usuário participe do consórcio, enviando o valor da cota. Deduz a taxa de administração e registra o participante.
confirmarTransacao(): Permite que um participante confirme a transação e receba o valor referente às cotas.
saldoContrato(): Retorna o saldo atual do contrato.
listarParticipantes(): Retorna a lista de participantes.
Esse contrato é um ponto de partida e pode ser expandido com mais funcionalidades conforme necessário. Por exemplo, pode-se adicionar verificações adicionais, funcionalidades para calcular o valor exato da administração, e controles de segurança mais robustos.