Aula 215: Contratos de Escrow
Nesta aula, vamos nos aprofundar no conceito de contratos de escrow, que são uma parte fundamental das finanças descentralizadas e contratos inteligentes na blockchain do Ethereum. Um contrato de escrow atua como um terceiro imparcial que retém fundos ou ativos até que certas condições sejam atendidas. Isso garante confiança e segurança nas transações, especialmente quando as partes não confiam umas nas outras.
O que é um Contrato de Escrow?
Um contrato de escrow é um contrato inteligente que retém fundos em nome de duas partes. Os fundos são liberados apenas quando os termos do acordo são cumpridos, garantindo que nenhuma das partes possa quebrar o contrato sem perder seu investimento. Esse tipo de contrato é comumente utilizado em transações que envolvem imóveis, marketplaces online e outros negócios onde a confiança é uma preocupação.
Estrutura Básica de um Contrato de Escrow
Vamos dar uma olhada na estrutura básica de um contrato de escrow em Solidity. Nosso exemplo envolverá duas partes: um comprador e um vendedor. O contrato reterá os fundos do comprador até que os bens sejam entregues ou uma condição pré-determinada seja atendida.
Passo 1: Definindo o Contrato
Vamos definir um contrato de escrow simples com os estados e funções necessárias.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Escrow {
address public comprador;
address public vendedor;
address public árbitro;
enum Estado { AGUARDANDO_PAGAMENTO, AGUARDANDO_ENTREGA, COMPLETO }
Estado public estadoAtual;
constructor(address _vendedor, address _árbitro) {
comprador = msg.sender; // O criador do contrato é o comprador
vendedor = _vendedor;
árbitro = _árbitro;
estadoAtual = Estado.AGUARDANDO_PAGAMENTO;
}
// Função para finalizar o pagamento
function pagar() external payable {
require(estadoAtual == Estado.AGUARDANDO_PAGAMENTO, "Pagamento não é aguardado.");
require(msg.value > 0, "Deve enviar algum ether.");
estadoAtual = Estado.AGUARDANDO_ENTREGA;
}
}
Passo 2: Gerenciando o Estado do Escrow
Em seguida, precisamos adicionar a lógica para a entrega dos bens e a liberação dos fundos.
// Função para confirmar a entrega
function confirmarEntrega() external {
require(msg.sender == vendedor, "Somente o vendedor pode confirmar a entrega.");
require(estadoAtual == Estado.AGUARDANDO_ENTREGA, "Entrega não é aguardada.");
estadoAtual = Estado.COMPLETO;
payable(vendedor).transfer(address(this).balance); // Transferir fundos para o vendedor
}
// Função para resolver disputas
function resolverDisputa(bool _liberarParaVendedor) external {
require(msg.sender == árbitro, "Somente o árbitro pode resolver disputas.");
require(estadoAtual == Estado.AGUARDANDO_ENTREGA, "Não está no estado de entrega aguardada.");
estadoAtual = Estado.COMPLETO;
if (_liberarParaVendedor) {
payable(vendedor).transfer(address(this).balance);
} else {
payable(comprador).transfer(address(this).balance);
}
}
}
Passo 3: Código Final do Contrato
Vamos combinar todas as partes que discutimos em um contrato de escrow completo:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Escrow {
address public comprador;
address public vendedor;
address public árbitro;
enum Estado { AGUARDANDO_PAGAMENTO, AGUARDANDO_ENTREGA, COMPLETO }
Estado public estadoAtual;
constructor(address _vendedor, address _árbitro) {
comprador = msg.sender; // O criador do contrato é o comprador
vendedor = _vendedor;
árbitro = _árbitro;
estadoAtual = Estado.AGUARDANDO_PAGAMENTO;
}
function pagar() external payable {
require(estadoAtual == Estado.AGUARDANDO_PAGAMENTO, "Pagamento não é aguardado.");
require(msg.value > 0, "Deve enviar algum ether.");
estadoAtual = Estado.AGUARDANDO_ENTREGA;
}
function confirmarEntrega() external {
require(msg.sender == vendedor, "Somente o vendedor pode confirmar a entrega.");
require(estadoAtual == Estado.AGUARDANDO_ENTREGA, "Entrega não é aguardada.");
estadoAtual = Estado.COMPLETO;
payable(vendedor).transfer(address(this).balance); // Transferir fundos para o vendedor
}
function resolverDisputa(bool _liberarParaVendedor) external {
require(msg.sender == árbitro, "Somente o árbitro pode resolver disputas.");
require(estadoAtual == Estado.AGUARDANDO_ENTREGA, "Não está no estado de entrega aguardada.");
estadoAtual = Estado.COMPLETO;
if (_liberarParaVendedor) {
payable(vendedor).transfer(address(this).balance);
} else {
payable(comprador).transfer(address(this).balance);
}
}
}
Conclusão
Nesta aula, desenvolvemos um contrato de escrow simples que efetivamente retém fundos entre um comprador e um vendedor, garantindo que o pagamento seja feito apenas quando as condições acordadas forem atendidas. Também introduzimos um árbitro para lidar com disputas, adicionando uma camada extra de confiança.
Contratos de escrow são ferramentas poderosas para garantir segurança em transações dentro de contratos inteligentes, tornando-os indispensáveis no mundo das finanças descentralizadas. Sinta-se à vontade para experimentar o código e aprimorar suas funcionalidades com base em suas necessidades. Boa codificação!