Olá terráqueos. Me surgiu uma ideia, e com ela uma proposta de trabalho. Descobri que com esforço, se realiza qualquer coisa. Recentemente descobri outra coisa: uma comunidade unida muda vidas. É muito gratificante poder compartilhar conhecimento e aprender no processo, não é verdade?
Pois bem, a minha ideia, que se refere ao título, foi humildemente colocada em prática pelo modesto código abaixo:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract Carteirinha {
address public minter;
struct Torcedor {
uint256 cpf;
string nome;
string email;
}
struct Historico {
string conquista;
}
// criando uma array do tipo objeto torcedor e historico.
Torcedor[] public torcedor;
Historico[] public historico;
mapping(uint256 => address) public donoCarteirinha;
mapping(address => uint256) public qtdCarteirinha;
event Sent(address from, address to, uint256 _cpf);
constructor() {
minter = msg.sender; // Grava endereço de quem criou o NFT na variavel minter
}
function _exists(uint256 _cpf) internal view returns(bool) {
address owner = donoCarteirinha[_cpf]; // adiciona o endereço do dono indicado pelo ID na variavel owner
return owner != address(0); // retorna se este endereço NÃO é um address inválido ou vazio. (true or false)
}
function adicionarTorcedor(uint256 _cpf, string memory _nome, string memory _email) public {
require(qtdCarteirinha[msg.sender] == 0, "ERRO: Carteirinha ja foi criada para esse ID"); // Limita a quantidade de carteirinhas por ID (CPF) para apenas uma.
require(!_exists(_cpf), "ERRO: Carteirinha ja existe"); // verifica se o token ainda nao foi gerado pelo ID informado, pois so pode haver 1 por CPF
require(msg.sender == minter); // Se o msg.sender é de fato quem criou o contrato
donoCarteirinha[_cpf] = msg.sender; // quem está mintando a carteirinha será que receberá a carteirinha oficialmente
qtdCarteirinha[msg.sender] += 1; // armazena a quantidade de NFTs que o endereço tem
torcedor.push(Torcedor(_cpf, _nome, _email)); // adiciona os parametros passados na funcao para dentro da array Torcedor[]
}
function adicionarConquistaHistorico(string memory _conquista) public {
historico.push(Historico(_conquista));
}
function _ownerOf(uint256 _cpf) internal view returns(address) {
address owner = donoCarteirinha[_cpf];
require(owner != address(0), "ERRO: Token invalido");
return owner;
}
function send(address receiver, uint256 _cpf) public {
require(_ownerOf(_cpf) == msg.sender);
require(receiver != address(0), "ERRO: Receiver Invalido");
donoCarteirinha[_cpf] = receiver;
qtdCarteirinha[receiver] += 1;
qtdCarteirinha[msg.sender] -= 1;
emit Sent(msg.sender, receiver, _cpf);
}
}
O que eu precisava, era deixar esse código pronto para produção, com adaptações de segurança pelo @openzeppelin e outras libs, em padrão ERC721, com os dados dos torcedores imutáveis, e com um objeto/array de histórico de conquistas, como "comprou camisa" e "comprou ingresso" e um incremento de pontuação (bônus) para serem usados na webstore frontend posteriormente.
Também criei um outro contrato separado, para mintar esse NFT, e precisava buscar por ele tb, os dados que foram cadastrado em cada NFT e armazenado em uma Array com todos os endereços dos possuidores do NFT. Consegui concretizar tal código, porém, de maneira muito inicial e sem proteção. Por algum motivo, não consegui realizar as funções de leitura (get) dos dados do NFT dentro da array. Somente dentro de variáveis isoladas. Mas como preciso acessar a array do Historico[], me senti, e me sinto frustrado por ainda não ter conseguido realizar este simples código, que é de ler uma array de outro contrato.
Segue abaixo, o codigo em solidity deste outro contrato de mint:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
//o objetivo do FabricaCarteirinha é fazer deploys e interações do contrato carteirinha.sol atravez de funções chamadas neste contrato.
// importando o contrato Carteirinha criado anteriormente:
import "./Carteirinha.sol";
//contract FabricaCarteirinha is Carteirinha { -> se colocar assim, herda todas as funçoes do Carteirinha() + as funcoes do FabricaCarteirinha() juntas.
contract FabricaCarteirinha {
Carteirinha[] public carteirinhaArray;
function criarCarteirinha() public {
//fazendo deploy (gerando uma carteirinha) e ao mesmo tempo, declarando objeto do tipo Carteirinha para usar neste contrato:
Carteirinha carteirinha = new Carteirinha();
//armazena o endereço do contrato criado que foi feito deploy, no ultimo lugar da lista, nesse caso, posiçao 0.
//pensei em usar CPF como index, mas pode cer celular, email, etc...
carteirinhaArray.push(carteirinha); // ISSO RETORNA O ENDEREÇO HASH DO NFT / CARTEIRINHA CRIADO - ARMAZENAR EM BANCO DE DADOS SQL
}
// passa os dados pelos parametros _simpleStoreIndex, que será 0 (posiçao da lista simpleStorageArray), e numero favorito, chamando a funçao '.store()' do contrato SimpleStorage(), e essa funcao pode ser publica
function fcAdicionarTorcedor(uint256 _carteirinhaArrayIndex, uint256 _cpf, string memory _nome, string memory _email) public payable {
//SimpleStorage(0xd840735F4B6a0d1AF8Fa48EcE560f4778c007397.adicionarTorcedor(01235546675, anso, rua araponga 50, 31986793422, [email protected]) - os dados são passados dando o numero do contrato + "." + função, no caso, a .store.
Carteirinha(address(carteirinhaArray[_carteirinhaArrayIndex])).adicionarTorcedor(_cpf, _nome, _email);
}
function fcAdicionarHistorico(uint256 _carteirinhaArrayIndex, string memory _conquista) public payable {
Carteirinha(address(carteirinhaArray[_carteirinhaArrayIndex])).adicionarConquistaHistorico(_conquista);
}
}
Quero que saibam que, qualquer ajuda, terei uma gratidão enorme e pretendo ajudar a comunidade com o que puder. É a oportunidade da minha vida :-)
Latest comments (0)