> For the complete documentation index, see [llms.txt](https://valter-lobo.gitbook.io/fase-1-solidity-basico/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://valter-lobo.gitbook.io/fase-1-solidity-basico/material-encontro-3/desafio-tipos-em-solidity.md).

# Desafio Tipos em Solidity

Vamos desvendar os segredos dos tipos em Solidity!

**Dica:** Antes de iniciar aprenda um pouco sobre os tipos de solidity e struct.

**Desafio:**

Crie um contrato inteligente em Solidity que utilize os tipos `int`, `bool`, `string` e `address` para realizar as seguintes tarefas:

**1. Loja de Heróis:**

* **Inventário:** Armazene informações sobre seus heróis favoritos em um array de structs. Cada struct deve conter os seguintes atributos:
  * `name`: Nome do herói (tipo `string`)
  * `power`: Poder do herói (tipo `int`)
  * `active`: Herói está ativo? (tipo `bool`)
* **Funções:**
  * `addHero`: Adicione um novo herói ao inventário.
  * `removeHero`: Remova um herói do inventário.
  * `getHero`: Obtenha as informações de um herói específico.
  * `activateHero`: Ative um herói para que ele possa ser usado em batalhas.
  * `deactivateHero`: Desative um herói para que ele descanse e treine.

**2. Sistema de Voto:**

* **Votantes:** Armazene o endereço de cada votante em um array.
* **Votos:** Registre os votos de cada votante em um mapping. A chave do mapping será o endereço do votante e o valor será um `string` que indica o voto ("Sim" ou "Não").
* **Regras:**
  * Apenas quem esta registrado como votantes pode votar;
  * Apenas o Juiz registrado no contrato pode adicionar votantes.
  * Registrar o final da votação apos um tempo inicial, dica ver sobre *block.timestamp*
* **Funções:**
  * `addVoter`: Adicione um novo votante ao sistema.
  * `vote`: Permita que um votante registre seu voto.
  * `getVoteCount`: Obtenha a contagem de votos "Sim" e "Não".

**3. Loja de Equipamentos:**

* **Equipamentos:** Armazene informações sobre seus equipamentos em um array de structs. Cada struct deve conter os seguintes atributos:
  * `name`: Nome do equipamento (tipo `string`)
  * `type`: Tipo do equipamento (tipo `string`, por exemplo, "armadura", "arma", "poção")
  * `price`: Preço do equipamento (tipo `int`)
* **Funções:**
  * `addItem`: Adicione um novo equipamento à loja.
  * `removeItem`: Remova um equipamento da loja.
  * `buyItem`: Permita que um jogador compre um equipamento.
  * `getInventory`: Obtenha a lista de equipamentos disponíveis na loja.

**4. Contrato de Registro de Mensagens:**

Vamos desenvolver um contrato em Solidity que permita aos usuários registrar mensagens em um blockchain. O contrato funcionará como um mural digital descentralizado e imutável, onde cada mensagem é armazenada permanentemente e pode ser visualizada por qualquer pessoa.

* **Funções:**
  * `Registrar de Mensagens` : Os usuários podem enviar mensagens de texto livremente. As mensagens são armazenadas na blockchain de forma permanente e imutável. Cada mensagem recebe um identificador único (ID).
  * `Visualização de Mensagens`: Os usuários podem visualizar todas as mensagens registradas.

**Regras Gerais:**

* Utilize os tipos `int`, `bool`, `string` e `address` de forma correta e eficiente em cada tarefa.
* Siga boas práticas de codificação para garantir a clareza, legibilidade e segurança do seu contrato.
* Teste o contrato com diferentes cenários para garantir que ele funcione conforme o esperado.

**Dicas:**

* Adicione funcionalidades extras para tornar seu contrato ainda mais épico!
* Compartilhe seu código com a comunidade para que todos possam aprender juntos.
