Skip to content

Commit 162c1c1

Browse files
authored
Merge pull request #850 from dkrizhanovskyi/issues/830
Daniil Krizhanovskyi <[email protected]>
2 parents c75871d + c6dbb1f commit 162c1c1

File tree

1 file changed

+51
-52
lines changed

1 file changed

+51
-52
lines changed
+51-52
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.21;
33

4-
import "../34_ERC721/IERC721.sol";
5-
import "../34_ERC721/IERC721Receiver.sol";
6-
import "../34_ERC721/WTFApe.sol";
4+
import "../../../34_ERC721/IERC721.sol";
5+
import "../../../34_ERC721/IERC721Receiver.sol";
6+
import "../../../34_ERC721/WTFApe.sol";
77

88
contract NFTSwap is IERC721Receiver {
99
event List(
@@ -30,96 +30,95 @@ contract NFTSwap is IERC721Receiver {
3030
uint256 newPrice
3131
);
3232

33-
// Definindo a estrutura 'order'
3433
struct Order {
3534
address owner;
3635
uint256 price;
3736
}
38-
// Mapeamento de Pedido NFT
37+
3938
mapping(address => mapping(uint256 => Order)) public nftList;
4039

4140
fallback() external payable {}
4241

43-
// Venda pendente: O vendedor listou um NFT, com o endereço do contrato _nftAddr, tokenId _tokenId e preço _price em Ethereum (unidade wei).
4442
function list(address _nftAddr, uint256 _tokenId, uint256 _price) public {
45-
// Declaring variable for IERC721 interface contract
46-
// Contrato autorizado
47-
// Preço maior que 0
48-
49-
//Definir o detentor e o preço do NF
50-
_order.owner = msg.sender;
51-
_order.price = _price;
52-
// Transferir NFT para um contrato.
43+
require(_price > 0, "Price must be greater than 0");
44+
45+
IERC721 _nft = IERC721(_nftAddr);
46+
require(
47+
_nft.ownerOf(_tokenId) == msg.sender,
48+
"Only the owner can list the NFT"
49+
);
50+
require(
51+
_nft.getApproved(_tokenId) == address(this),
52+
"Contract is not approved to transfer this NFT"
53+
);
54+
55+
nftList[_nftAddr][_tokenId] = Order(msg.sender, _price);
5356
_nft.safeTransferFrom(msg.sender, address(this), _tokenId);
5457

55-
// Liberar evento de List
5658
emit List(msg.sender, _nftAddr, _tokenId, _price);
5759
}
5860

59-
// Compra: O comprador adquire um NFT, com contrato _nftAddr e tokenId _tokenId, ao chamar a função, é necessário fornecer ETH.
6061
function purchase(address _nftAddr, uint256 _tokenId) public payable {
61-
// Obter Pedido
62-
// O preço do NFT é maior que 0
63-
// O preço de compra é maior do que o preço de etiqueta
64-
// Declaring variable for IERC721 interface contract
62+
Order memory order = nftList[_nftAddr][_tokenId];
63+
require(order.price > 0, "NFT is not listed for sale");
64+
require(msg.value >= order.price, "Insufficient ETH to purchase NFT");
65+
6566
IERC721 _nft = IERC721(_nftAddr);
66-
// NFT está presente no contrato.
67+
require(
68+
_nft.ownerOf(_tokenId) == address(this),
69+
"NFT is not in the contract"
70+
);
71+
72+
delete nftList[_nftAddr][_tokenId];
6773

68-
// Transferir o NFT para o comprador
6974
_nft.safeTransferFrom(address(this), msg.sender, _tokenId);
70-
// Transferir ETH para o vendedor e reembolsar o comprador com o ETH excedente
71-
payable(_order.owner).transfer(_order.price);
72-
payable(msg.sender).transfer(msg.value - _order.price);
75+
payable(order.owner).transfer(order.price);
7376

74-
// Remover pedido
77+
if (msg.value > order.price) {
78+
payable(msg.sender).transfer(msg.value - order.price);
79+
}
7580

76-
// Liberar evento de compra
77-
emit Purchase(msg.sender, _nftAddr, _tokenId, _order.price);
81+
emit Purchase(msg.sender, _nftAddr, _tokenId, order.price);
7882
}
7983

80-
// Cancelar pedido: O vendedor cancela a ordem.
8184
function revoke(address _nftAddr, uint256 _tokenId) public {
82-
// Obter Pedido
83-
// Deve ser iniciado pelo titular
84-
// Declaring variable for IERC721 interface contract
85+
Order memory order = nftList[_nftAddr][_tokenId];
86+
require(order.owner == msg.sender, "You are not the owner of this NFT");
87+
8588
IERC721 _nft = IERC721(_nftAddr);
86-
// NFT está presente no contrato.
89+
require(
90+
_nft.ownerOf(_tokenId) == address(this),
91+
"NFT is not in the contract"
92+
);
93+
94+
delete nftList[_nftAddr][_tokenId];
8795

88-
// Transferir o NFT para o vendedor.
8996
_nft.safeTransferFrom(address(this), msg.sender, _tokenId);
90-
// Remover pedido
9197

92-
// Liberar o evento Revoke
9398
emit Revoke(msg.sender, _nftAddr, _tokenId);
9499
}
95100

96-
// Ajuste de preço: o vendedor ajusta o preço do pedido pendente
97101
function update(
98102
address _nftAddr,
99103
uint256 _tokenId,
100104
uint256 _newPrice
101105
) public {
102-
// O preço do NFT é maior que 0
103-
// Obter Pedido
104-
// Deve ser iniciado pelo titular
105-
// Declaring variable for IERC721 interface contract
106-
IERC721 _nft = IERC721(_nftAddr);
107-
// NFT está presente no contrato.
106+
require(_newPrice > 0, "Price must be greater than 0");
107+
108+
Order storage order = nftList[_nftAddr][_tokenId];
109+
require(order.owner == msg.sender, "You are not the owner of this NFT");
108110

109-
// Ajustar o preço do NFT
110-
_order.price = _newPrice;
111+
order.price = _newPrice;
111112

112-
// Liberar evento de atualização
113113
emit Update(msg.sender, _nftAddr, _tokenId, _newPrice);
114114
}
115115

116-
// Implemente o onERC721Received do {IERC721Receiver} para receber tokens ERC721
117116
function onERC721Received(
118-
address operator,
119-
address from,
120-
uint tokenId,
121-
bytes calldata data
122-
) external override returns (bytes4) {
117+
address,
118+
address,
119+
uint256,
120+
bytes calldata
121+
) external pure override returns (bytes4) {
123122
return IERC721Receiver.onERC721Received.selector;
124123
}
125124
}

0 commit comments

Comments
 (0)