Created
June 21, 2024 15:59
-
-
Save rpaskin/c7334ac9ebf07827c17fd753e598e28a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.20; | |
contract RefriToken { | |
// dono do contrato | |
address public donoDoContrato = msg.sender; | |
// unidades (ether, data/hora, etc.) | |
// https://docs.soliditylang.org/en/latest/units-and-global-variables.html | |
uint public precoBase = 0.001 ether; | |
// Struct - estrutura de dados personalizada | |
// https://docs.soliditylang.org/en/latest/types.html | |
// atributos de um refrigerante | |
struct Refri { | |
address dono; | |
string sabor; | |
string marca; | |
uint preco; | |
bool compravel; | |
} | |
// Mapping - estrutura de dados que mapeia chaves e valores | |
// https://docs.soliditylang.org/en/latest/style-guide.html#mappings | |
// listagem (dicionario) de refrigerantes, indexado por id | |
mapping(uint => Refri) public refriTokens; | |
// dicionario para rapidamente achar refris do mesmo dono | |
mapping(address => uint[]) public donos; | |
event Bloqueio(address quemBloqueou, uint id, bool bloqueado); | |
// modifier - ajusta a semantica de funcoes | |
// https://docs.soliditylang.org/en/latest/structure-of-a-contract.html#function-modifiers | |
modifier apenasDonoDoContrato() { | |
require(msg.sender == donoDoContrato, "Apenas o dono do contrato pode fazer isso"); | |
_; | |
} | |
modifier apenasDonoDoRefri(uint _id) { | |
require(msg.sender == refriTokens[_id].dono, "Apenas o dono do NFT pode fazer isso"); | |
_; | |
} | |
// cria um NFT | |
function mint(uint _id, address _dono, string memory _sabor, string memory _marca, uint _preco, bool _compravel) payable external { | |
require(refriTokens[_id].dono == address(0), "ID ja existe!"); | |
require(msg.value == precoBase, "Enviado valor errado!"); | |
// paga o dono do contrato | |
payable(donoDoContrato).transfer(msg.value); | |
// cria o refri | |
refriTokens[_id] = Refri({ | |
dono: _dono, | |
sabor: _sabor, | |
marca: _marca, | |
preco: _preco, | |
compravel: _compravel | |
}); | |
// guarda na lista de nfts daquele dono | |
donos[_dono].push(_id); | |
} | |
// compra um NFT que esteja a venda | |
function comprar(uint _id, uint _novoPreco) external payable { | |
require(refriTokens[_id].compravel); | |
require(msg.value == refriTokens[_id].preco, "'Deve enviar o preco da lata!"); | |
payable(refriTokens[_id].dono).transfer(msg.value); | |
refriTokens[_id].dono = msg.sender; | |
refriTokens[_id].preco = _novoPreco; | |
} | |
function ajustarVenda(uint _id, bool _compravel) external apenasDonoDoRefri(_id) { | |
// abaixo nao e necessário pois temos o modifier acima | |
// require(msg.sender == refriTokens[_id].dono, "Apenas o dono pode bloquear a venda!"); | |
emit Bloqueio(msg.sender, _id, _compravel); | |
refriTokens[_id].compravel = _compravel; | |
} | |
function ajustaPrecoBase(uint _novoPreco) external apenasDonoDoContrato { | |
precoBase = _novoPreco; | |
} | |
// EXERCICIOS: | |
// ajustar preco de um NFT | |
// transferir saldo restante do contrato | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment