SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
03.12.2024

Aula 214: Contratos de Bloqueio de Tempo

Nesta aula, exploraremos contratos de bloqueio de tempo em Solidity. Contratos de bloqueio de tempo permitem o adiamento de certas ações até que um tempo especificado tenha passado. Eles são comumente utilizados para governança em aplicações de finanças descentralizadas (DeFi), permitindo que os usuários bloqueiem fundos ou tokens de governança por um período predeterminado.

Conceitos Chave

  • Bloqueio de Tempo: Um mecanismo que impede que certas ações sejam executadas até que um tempo específico tenha passado.
  • Duração do Bloqueio: O período durante o qual os fundos estão bloqueados e não podem ser acessados.
  • Liberação: A ação que pode ser executada após o término da duração do bloqueio.

Estrutura Básica de um Contrato de Bloqueio de Tempo

Vamos começar com uma implementação simples de um contrato de bloqueio de tempo. Este contrato permite que um usuário bloqueie Ether por uma duração especificada e o retire após o período de bloqueio expirar.

Código de Exemplo

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

contract BloqueioDeTempo {
    address public dono;
    uint256 public tempoDeFimDoBloqueio;
    uint256 public duracaoDoBloqueio;

    event FundosBloqueados(uint256 duracao);
    event FundosRetirados(uint256 quantia);

    modifier somenteDono() {
        require(msg.sender == dono, "Você não é o dono");
        _;
    }

    modifier bloqueioNaoExpirado() {
        require(block.timestamp < tempoDeFimDoBloqueio, "Período de bloqueio expirou");
        _;
    }

    modifier bloqueioExpirado() {
        require(block.timestamp >= tempoDeFimDoBloqueio, "Período de bloqueio ainda está ativo");
        _;
    }

    constructor() {
        dono = msg.sender;
    }

    function bloquearFundos(uint256 duracao) external payable somenteDono {
        require(msg.value > 0, "Deve enviar Ether para bloquear");
        require(duracao > 0, "Duração deve ser maior que 0");

        duracaoDoBloqueio = duracao;
        tempoDeFimDoBloqueio = block.timestamp + duracao;

        emit FundosBloqueados(duracao);
    }

    function retirarFundos() external somenteDono bloqueioExpirado {
        uint256 quantia = address(this).balance;
        require(quantia > 0, "Sem fundos para retirar");

        (bool sucesso, ) = dono.call{value: quantia}("");
        require(sucesso, "Transferência falhou");

        emit FundosRetirados(quantia);
    }

    receive() external payable {
        bloquearFundos(0);
    }
}

Explicação do Código

  1. Variáveis de Estado:

    • dono: O endereço que implantou o contrato e possui direitos de propriedade.
    • tempoDeFimDoBloqueio: O timestamp até o qual os fundos estão bloqueados.
    • duracaoDoBloqueio: A duração pela qual os fundos serão bloqueados.
  2. Modifiers:

    • somenteDono: Restringe o acesso a funções ao dono do contrato.
    • bloqueioNaoExpirado: Garante que certas funções só possam ser chamadas quando o bloqueio ainda está em efeito.
    • bloqueioExpirado: Garante que certas funções só possam ser chamadas após o bloqueio ter expirado.
  3. Funções:

    • bloquearFundos(uint256 duracao): Permite que o dono bloqueie Ether por uma duração especificada. Define o tempoDeFimDoBloqueio com base no timestamp atual e na duração desejada.
    • retirarFundos(): Permite que o dono retire os fundos assim que o bloqueio tiver expirado.
    • receive() external payable: Uma função de fallback que permite ao contrato receber Ether.

Implantando o Contrato

Para implantar o contrato:

  1. Use o Remix ou qualquer ambiente de desenvolvimento Ethereum.
  2. Certifique-se de definir a versão do Solidity para 0.8.0 ou superior.
  3. Implemente o contrato e envie um pouco de Ether para bloqueá-lo usando bloquearFundos.

Interagindo com o Contrato

  • Chame a função bloquearFundos, fornecendo a duração em segundos (por exemplo, 3600 para 1 hora).
  • Você pode verificar a variável tempoDeFimDoBloqueio para saber quando os fundos estarão disponíveis para retirada.
  • Após a duração do bloqueio ter expirado, invoque retirarFundos para transferir o Ether de volta para a conta do dono.

Melhorias

Esta implementação básica pode ser melhorada com os seguintes recursos:

  • Múltiplos Bloqueios: Suporte para múltiplos bloqueios de tempo para diferentes quantias ou durações.
  • Bloqueio de Tokens: Em vez de Ether, permitir que os usuários bloqueiem tokens ERC20, aumentando a versatilidade do contrato.
  • Registro de Eventos: Emitir eventos para ações adicionais, como bloquear ativos diferentes ou alterar durações de bloqueio.

Conclusão

Contratos de bloqueio de tempo são um conceito fundamental no desenvolvimento de Solidity, particularmente úteis no espaço DeFi. Ao implementar um mecanismo de bloqueio de tempo, você pode controlar o acesso aos fundos e automatizar processos de governança. Experimente com o código fornecido e melhore-o para atender às necessidades do seu projeto!

Video

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

Thank you for voting!