Skip to content

Instantly share code, notes, and snippets.

@rpaskin
Created June 21, 2024 15:59
Show Gist options
  • Save rpaskin/c7334ac9ebf07827c17fd753e598e28a to your computer and use it in GitHub Desktop.
Save rpaskin/c7334ac9ebf07827c17fd753e598e28a to your computer and use it in GitHub Desktop.
// 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