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:
- Credores: Usuários que fornecem seus ativos ao contrato em troca de juros.
- Devedores: Usuários que tomam ativos emprestados do contrato e concordam em pagá-los de volta com juros.
- 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.
- 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
-
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 esaldos
para acompanhar o saldo de cada credor.
- A estrutura
-
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!