Aula 128: Construindo um Contrato de Câmbio Simples
Nesta aula, construiremos um contrato de câmbio descentralizado simples em Solidity. Este câmbio permitirá que os usuários comprem e vendam tokens. Vamos mergulhar no código passo a passo.
Pré-requisitos
Antes de começarmos, certifique-se de ter uma compreensão básica de Solidity e de como configurar um ambiente de desenvolvimento local utilizando ferramentas como Remix ou Truffle.
Configurando o Contrato
Começaremos criando nosso contrato de Câmbio. O contrato gerenciará um mercado para os usuários trocarem tokens ERC20.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract SimpleExchange {
address public owner;
struct Order {
address trader;
uint amount;
uint price; // preço em wei por 1 token
}
mapping(address => Order[]) public orders;
event OrderPlaced(address indexed trader, uint amount, uint price);
event OrderFilled(address indexed trader, uint amount, uint price);
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Apenas o dono pode chamar esta função");
_;
}
function placeOrder(uint amount, uint price) external {
require(amount > 0, "A quantidade deve ser maior que 0");
require(price > 0, "O preço deve ser maior que 0");
orders[msg.sender].push(Order(msg.sender, amount, price));
emit OrderPlaced(msg.sender, amount, price);
}
function fillOrder(address trader, uint orderIndex) external payable {
require(orderIndex < orders[trader].length, "Índice de ordem inválido");
Order storage order = orders[trader][orderIndex];
require(msg.value == order.amount * order.price, "Quantidade de pagamento incorreta");
// Transferir os tokens do trader para o comprador (msg.sender)
IERC20(address(this)).transferFrom(trader, msg.sender, order.amount);
// Remover a ordem cumprida
delete orders[trader][orderIndex];
emit OrderFilled(trader, order.amount, order.price);
}
}
Análise do Contrato
Variáveis de Estado
- owner: O endereço do criador do contrato.
- orders: Um mapeamento que armazena todas as ordens ativas feitas pelos usuários.
Eventos
- OrderPlaced: Emitido quando uma ordem é feita.
- OrderFilled: Emitido quando uma ordem é cumprida com sucesso.
Modificadores
- onlyOwner: Permite que apenas o dono do contrato execute certas funções.
Funções
-
placeOrder: Esta função permite que usuários façam uma ordem para comprar tokens. Ela recebe a quantidade de tokens e o preço em wei como parâmetros.
-
fillOrder: Esta função é chamada para cumprir uma ordem existente. Ela recebe o endereço do trader e o índice da ordem. A função verifica se o pagamento correto foi feito e transfere os tokens do trader para o comprador antes de excluir a ordem cumprida.
Testando o Câmbio
Você pode implantar o contrato SimpleExchange
utilizando ferramentas como o Remix e testar a colocação e o cumprimento de ordens.
-
Implantar o Contrato: Implemente o contrato
SimpleExchange
na sua rede Ethereum local usando o Remix. -
Fazer Ordens: Um usuário pode chamar
placeOrder
especificando a quantidade de tokens que deseja vender e o preço. -
Cumprir Ordens: Outro usuário pode chamar
fillOrder
, enviando a quantia correta de Ether que corresponde ao preço total da ordem.
Conclusão
Nesta aula, criamos um contrato de câmbio descentralizado simples utilizando Solidity. Embora este exemplo seja básico, ele fornece uma base para a criação de recursos mais complexos, como correspondência de ordens, cancelamentos ou integração com tokens ERC20 existentes. Sempre tenha em mente as taxas de gás e as considerações de segurança ao desenvolver contratos inteligentes.
No futuro, você pode expandir este contrato para incluir recursos mais avançados, como livros de ordens, suporte a múltiplos tokens ou até mesmo construir uma aplicação front-end para interagir com seus contratos inteligentes. Boa codificação!