Agora transformaremos nosso contrato Item
simples em um contrato Marketplace
mais complexo. O contrato do Marketplace
manterá uma lista de itens à venda, fornecerá uma maneira para os usuários listarem novos itens à venda e fornecerá uma maneira para os usuários comprarem itens.
Para fazer isso, adicionaremos alguns novos recursos ao nosso contrato:
Cada item agora terá um endereço seller
, que representa o proprietário do item.
Apresentaremos uma nova função listItemForSale
que permite aos usuários listar novos itens à venda.
Apresentaremos uma nova função buyItem
que permite aos usuários comprar um item.
Marketplace
:Solidez
// Identificador de licença SPDX: solidez do pragma MIT
^0.8.6;
contract Marketplace {
// Define uma nova estrutura para os itens
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Array para conter todos os itens
Item[] public items;
// Evento que será emitido quando um novo item for criado
event NewItem(uint itemId, string itemName, uint itemPrice, address seller);
// Evento que será emitido quando um item for colocado à venda
event ItemListed(uint itemId, string itemName, uint itemPrice, address seller);
// Evento que será emitido quando um item for comprado
event ItemBought(uint itemId, string itemName, uint itemPrice, endereço vendedor, endereço comprador);
// Função para criar um novo item, mas não listá-lo para venda imediatamente
function createItem(string memory _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Função para listar um item para venda
function listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Função para comprar um item
function buyItem(uint _itemId) public payable {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Uma estrutura Item
que agora inclui um endereço seller
e um booleano forSale
. O seller
é o proprietário do item e forSale
indica se o item está atualmente listado para venda.
Uma função createItem
que cria um novo item e atribui msg.sender
como vendedor. O msg.sender
é uma variável global no Solidity que representa o endereço da pessoa (ou contrato inteligente) que é chamada de função atual. No entanto, o item não está listado para venda imediatamente.
Uma função listItemForSale
que permite ao vendedor de um item listá-lo para venda. Usamos a função require
para garantir que apenas o vendedor possa listar o item à venda.
Uma função buyItem
que permite que alguém compre um item. A função verifica se o item está à venda, se o comprador não é o vendedor e se o preço correto foi enviado. Se essas condições forem atendidas, a função envia o dinheiro ao vendedor e marca o item como não à venda.
Depois de redigir o contrato Marketplace
, a próxima etapa é compilá-lo e implantá-lo. Você pode usar o plugin Solidity Compiler no Remix para compilar o contrato, assim como fizemos na Lição 1.
Para implantar o contrato, acesse o plugin Deploy & Run Transactions (aquele com o ícone do cubo) no painel direito. Escolha o ambiente apropriado (JavaScript VM para simulação), selecione o contrato do Marketplace
no menu suspenso Contrato e clique no botão Implantar.
Assim que o contrato for implantado, ele aparecerá na seção Contratos Implantados. Você pode expandi-lo para ver suas variáveis e funções de estado público. Você pode criar, listar e comprar itens chamando essas funções.
Para criar um item, insira um nome e um preço e clique no botão createItem
. Para listar um item à venda, insira o ID do item e clique no botão listItemForSale
. Para comprar um item, insira o ID do item, envie a quantidade correta de Ether e clique no botão buyItem
.
Parabéns! Agora você sabe como criar um mercado descentralizado básico na blockchain Ethereum.
Na próxima lição, melhoraremos nosso mercado adicionando funcionalidades para remover itens da venda e atualizar o preço de um item. Fique atento!
Agora transformaremos nosso contrato Item
simples em um contrato Marketplace
mais complexo. O contrato do Marketplace
manterá uma lista de itens à venda, fornecerá uma maneira para os usuários listarem novos itens à venda e fornecerá uma maneira para os usuários comprarem itens.
Para fazer isso, adicionaremos alguns novos recursos ao nosso contrato:
Cada item agora terá um endereço seller
, que representa o proprietário do item.
Apresentaremos uma nova função listItemForSale
que permite aos usuários listar novos itens à venda.
Apresentaremos uma nova função buyItem
que permite aos usuários comprar um item.
Marketplace
:Solidez
// Identificador de licença SPDX: solidez do pragma MIT
^0.8.6;
contract Marketplace {
// Define uma nova estrutura para os itens
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Array para conter todos os itens
Item[] public items;
// Evento que será emitido quando um novo item for criado
event NewItem(uint itemId, string itemName, uint itemPrice, address seller);
// Evento que será emitido quando um item for colocado à venda
event ItemListed(uint itemId, string itemName, uint itemPrice, address seller);
// Evento que será emitido quando um item for comprado
event ItemBought(uint itemId, string itemName, uint itemPrice, endereço vendedor, endereço comprador);
// Função para criar um novo item, mas não listá-lo para venda imediatamente
function createItem(string memory _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Função para listar um item para venda
function listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Função para comprar um item
function buyItem(uint _itemId) public payable {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Uma estrutura Item
que agora inclui um endereço seller
e um booleano forSale
. O seller
é o proprietário do item e forSale
indica se o item está atualmente listado para venda.
Uma função createItem
que cria um novo item e atribui msg.sender
como vendedor. O msg.sender
é uma variável global no Solidity que representa o endereço da pessoa (ou contrato inteligente) que é chamada de função atual. No entanto, o item não está listado para venda imediatamente.
Uma função listItemForSale
que permite ao vendedor de um item listá-lo para venda. Usamos a função require
para garantir que apenas o vendedor possa listar o item à venda.
Uma função buyItem
que permite que alguém compre um item. A função verifica se o item está à venda, se o comprador não é o vendedor e se o preço correto foi enviado. Se essas condições forem atendidas, a função envia o dinheiro ao vendedor e marca o item como não à venda.
Depois de redigir o contrato Marketplace
, a próxima etapa é compilá-lo e implantá-lo. Você pode usar o plugin Solidity Compiler no Remix para compilar o contrato, assim como fizemos na Lição 1.
Para implantar o contrato, acesse o plugin Deploy & Run Transactions (aquele com o ícone do cubo) no painel direito. Escolha o ambiente apropriado (JavaScript VM para simulação), selecione o contrato do Marketplace
no menu suspenso Contrato e clique no botão Implantar.
Assim que o contrato for implantado, ele aparecerá na seção Contratos Implantados. Você pode expandi-lo para ver suas variáveis e funções de estado público. Você pode criar, listar e comprar itens chamando essas funções.
Para criar um item, insira um nome e um preço e clique no botão createItem
. Para listar um item à venda, insira o ID do item e clique no botão listItemForSale
. Para comprar um item, insira o ID do item, envie a quantidade correta de Ether e clique no botão buyItem
.
Parabéns! Agora você sabe como criar um mercado descentralizado básico na blockchain Ethereum.
Na próxima lição, melhoraremos nosso mercado adicionando funcionalidades para remover itens da venda e atualizar o preço de um item. Fique atento!