forked from AmazingAng/WTF-Solidity
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNFTSwap.sol
125 lines (107 loc) · 4.05 KB
/
NFTSwap.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
import "../34_ERC721/IERC721.sol";
import "../34_ERC721/IERC721Receiver.sol";
import "../34_ERC721/WTFApe.sol";
contract NFTSwap is IERC721Receiver {
event List(
address indexed seller,
address indexed nftAddr,
uint256 indexed tokenId,
uint256 price
);
event Purchase(
address indexed buyer,
address indexed nftAddr,
uint256 indexed tokenId,
uint256 price
);
event Revoke(
address indexed seller,
address indexed nftAddr,
uint256 indexed tokenId
);
event Update(
address indexed seller,
address indexed nftAddr,
uint256 indexed tokenId,
uint256 newPrice
);
// Definindo a estrutura 'order'
struct Order {
address owner;
uint256 price;
}
// Mapeamento de Pedido NFT
mapping(address => mapping(uint256 => Order)) public nftList;
fallback() external payable {}
// Venda pendente: O vendedor listou um NFT, com o endereço do contrato _nftAddr, tokenId _tokenId e preço _price em Ethereum (unidade wei).
function list(address _nftAddr, uint256 _tokenId, uint256 _price) public {
// Declaring variable for IERC721 interface contract
// Contrato autorizado
// Preço maior que 0
//Definir o detentor e o preço do NF
_order.owner = msg.sender;
_order.price = _price;
// Transferir NFT para um contrato.
_nft.safeTransferFrom(msg.sender, address(this), _tokenId);
// Liberar evento de List
emit List(msg.sender, _nftAddr, _tokenId, _price);
}
// Compra: O comprador adquire um NFT, com contrato _nftAddr e tokenId _tokenId, ao chamar a função, é necessário fornecer ETH.
function purchase(address _nftAddr, uint256 _tokenId) public payable {
// Obter Pedido
// O preço do NFT é maior que 0
// O preço de compra é maior do que o preço de etiqueta
// Declaring variable for IERC721 interface contract
IERC721 _nft = IERC721(_nftAddr);
// NFT está presente no contrato.
// Transferir o NFT para o comprador
_nft.safeTransferFrom(address(this), msg.sender, _tokenId);
// Transferir ETH para o vendedor e reembolsar o comprador com o ETH excedente
payable(_order.owner).transfer(_order.price);
payable(msg.sender).transfer(msg.value - _order.price);
// Remover pedido
// Liberar evento de compra
emit Purchase(msg.sender, _nftAddr, _tokenId, _order.price);
}
// Cancelar pedido: O vendedor cancela a ordem.
function revoke(address _nftAddr, uint256 _tokenId) public {
// Obter Pedido
// Deve ser iniciado pelo titular
// Declaring variable for IERC721 interface contract
IERC721 _nft = IERC721(_nftAddr);
// NFT está presente no contrato.
// Transferir o NFT para o vendedor.
_nft.safeTransferFrom(address(this), msg.sender, _tokenId);
// Remover pedido
// Liberar o evento Revoke
emit Revoke(msg.sender, _nftAddr, _tokenId);
}
// Ajuste de preço: o vendedor ajusta o preço do pedido pendente
function update(
address _nftAddr,
uint256 _tokenId,
uint256 _newPrice
) public {
// O preço do NFT é maior que 0
// Obter Pedido
// Deve ser iniciado pelo titular
// Declaring variable for IERC721 interface contract
IERC721 _nft = IERC721(_nftAddr);
// NFT está presente no contrato.
// Ajustar o preço do NFT
_order.price = _newPrice;
// Liberar evento de atualização
emit Update(msg.sender, _nftAddr, _tokenId, _newPrice);
}
// Implemente o onERC721Received do {IERC721Receiver} para receber tokens ERC721
function onERC721Received(
address operator,
address from,
uint tokenId,
bytes calldata data
) external override returns (bytes4) {
return IERC721Receiver.onERC721Received.selector;
}
}