SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
25.11.2024

Lição: 139: Contratos de Empréstimo e Empréstimo em Solidity

Os contratos de empréstimo e empréstimo são componentes essenciais das aplicações de finanças descentralizadas (DeFi), permitindo que os usuários emprestem seus ativos para ganhar juros ou tomem emprestado ativos com a promessa de pagá-los posteriormente com juros. Nesta aula, exploraremos as bases dos contratos de empréstimo e empréstimo em Solidity, fornecendo exemplos de sua implementação.

Conceitos Básicos

Antes de mergulhar no código, vamos apresentar brevemente os principais conceitos envolvidos nos contratos de empréstimo e empréstimo:

  1. Credores: Usuários que fornecem seus ativos ao contrato em troca de juros.
  2. Devedores: Usuários que tomam ativos emprestados do contrato e concordam em pagá-los de volta com juros.
  3. Colateral: Ativos oferecidos pelo devedor como garantia do empréstimo. Se o devedor não cumprir, o colateral pode ser liquidado para pagar os credores.
  4. Taxa de Juros: A taxa na qual os devedores pagam juros sobre o valor emprestado, normalmente expressa como uma porcentagem anual.

Exemplo de Código de Contrato de Empréstimo e Empréstimo

Aqui está um exemplo simples de um contrato de empréstimo e empréstimo implementado em Solidity:

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

contract Empréstimo {
    struct Emprestimo {
        uint256 valor;
        uint256 taxaJuros; // Taxa de juros em porcentagem
        uint256 duracao; // Duração do empréstimo em segundos
        uint256 colateral;
        bool ativo;
    }

    mapping(address => Emprestimo) public empréstimos;
    mapping(address => uint256) public saldos;

    event EmpréstimoSolicitado(address indexed devedor, uint256 valor, uint256 colateral);
    event EmpréstimoAprovado(address indexed devedor, uint256 valor, uint256 taxaJuros);
    event EmpréstimoQuitado(address indexed devedor, uint256 valor);
    event ColateralReivindicado(address indexed devedor, uint256 valorColateral);

    function emprestar(uint256 valor) external {
        require(valor > 0, "O valor deve ser maior que zero");
        saldos[msg.sender] += valor;
    }

    function solicitarEmpréstimo(uint256 valor, uint256 colateral, uint256 taxaJuros, uint256 duracao) external {
        require(valor > 0, "O valor deve ser maior que zero");
        require(saldos[msg.sender] >= colateral, "Colateral insuficiente");
        require(empréstimos[msg.sender].ativo == false, "Empréstimo ativo existente");

        empréstimos[msg.sender] = Emprestimo(valor, taxaJuros, duracao, colateral, true);
        saldos[msg.sender] -= colateral; // Bloqueia o colateral

        emit EmpréstimoSolicitado(msg.sender, valor, colateral);
    }

    function aprovarEmpréstimo(address devedor) external {
        Emprestimo storage empréstimo = empréstimos[devedor];
        require(empréstimo.ativo, "Nenhum empréstimo ativo encontrado");

        // Aqui deveríamos transferir os fundos para o devedor (para simplificação, omitido)
        emit EmpréstimoAprovado(devedor, empréstimo.valor, empréstimo.taxaJuros);
    }

    function quitarEmpréstimo() external payable {
        Emprestimo storage empréstimo = empréstimos[msg.sender];
        require(empréstimo.ativo, "Nenhum empréstimo ativo encontrado");

        uint256 totalQuitacao = empréstimo.valor + (empréstimo.valor * empréstimo.taxaJuros) / 100;
        require(msg.value >= totalQuitacao, "Fundos insuficientes para quitar o empréstimo");

        empréstimo.ativo = false;
        saldos[msg.sender] += empréstimo.colateral; // Retorna colateral
        emit EmpréstimoQuitado(msg.sender, empréstimo.valor);
    }

    function reivindicarColateral() external {
        Emprestimo storage empréstimo = empréstimos[msg.sender];
        require(empréstimo.ativo == true, "Nenhum empréstimo ativo ou já quitado");

        empréstimo.ativo = false; // Marca empréstimo como inativo
        emit ColateralReivindicado(msg.sender, empréstimo.colateral);
    }
}

Explicação do Código

  1. Estruturas e Mapeamentos:

    • A estrutura Emprestimo contém todas as informações pertinentes ao empréstimo: valor, taxa de juros, duração, colateral e um indicador que mostra se o empréstimo está ativo.
    • Dois mapeamentos são definidos: empréstimos para armazenar os detalhes do empréstimo de cada devedor e saldos para acompanhar o saldo de cada credor.
  2. Funções:

    • emprestar: Permite que os credores depositem seus ativos no contrato.
    • solicitarEmpréstimo: Permite que os usuários solicitem um empréstimo especificando o valor, colateral, taxa de juros e duração. O colateral é bloqueado nesse processo.
    • aprovarEmpréstimo: Esta função é chamada para aprovar um empréstimo. Em um contrato de produção, isso envolveria transferir os fundos do empréstimo para o devedor.
    • quitarEmpréstimo: Permite que os devedores quitam seus empréstimos, junto com os juros. O contrato retorna o colateral ao devedor após a quitação.
    • reivindicarColateral: Permite ao credor reivindicar o colateral se o devedor não cumprir, o que simplificamos nesta implementação.

Conclusão

Nesta aula, apresentamos a estrutura básica e a funcionalidade de um contrato de empréstimo e empréstimo em Solidity. Embora este exemplo seja simplificado, muitos protocolos DeFi em nível de produção incluem funcionalidades adicionais, como gestão de taxas de juros, mecanismos de liquidação e uma gestão mais robusta dos usuários.

À medida que você aprender mais sobre Solidity e aplicações DeFi, considere experimentar esses conceitos, aprimorar a segurança e implementar funcionalidades adicionais nos contratos de empréstimo e empréstimo. O mundo das finanças descentralizadas possui um enorme potencial, e sua jornada como desenvolvedor Solidity está apenas começando!

Video

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

Thank you for voting!