# Desafio Solidity: Implementação de um Token

## Objetivo

O objetivo deste desafio é implementar um contrato de token que siga a interface fornecida. Este exercício ajudará a entenderem melhor os conceitos de Solidity, como interfaces, eventos, e funções de leitura e escrita.

## Interface do Token

A interface `IToken` define os métodos que o contrato de token deve implementar. Abaixo está a interface que vocês devem seguir:

```solidity
interface IToken {
    // Getters
    function totalSupply() external view returns(uint256);
    function getName() external view returns (string memory);
    function getSymbol() external view returns (string memory);
    function balanceOf(address account) external view returns (uint256);

    // Functions
    function transfer(address recipient, uint256 amount) external returns (bool);
    
    // Event
    event Transfer(address indexed from, address indexed to, uint256 value);
}
```

## Requisitos

1. **Nome e Símbolo do Token**:
   * O token deve ter um nome (`name`) e um símbolo (`symbol`).
2. **Total Supply**:
   * O token deve ter um total de tokens emitidos (`totalSupply`).
3. **Saldo de Tokens**:
   * Cada endereço pode possuir um saldo de tokens (`balanceOf`).
4. **Transferência de Tokens**:
   * Deve ser possível transferir tokens de um endereço para outro (`transfer`).
5. **Evento de Transferência**:
   * O contrato deve emitir um evento `Transfer` sempre que uma transferência de tokens for realizada.

## Tarefas

1. **Entender a Interface**:
   * Compreender os métodos definidos na interface `IToken`.
2. **Implementar o Contrato**:
   * Implementar o contrato `MyToken` que segue a interface `IToken`.
3. **Testar o Contrato**:
   * Testar o contrato.
   * Verificar se os métodos de leitura (`totalSupply`, `getName`, `getSymbol`, `balanceOf`) funcionam corretamente.
   * Realizar transferências de tokens e verificar se o evento `Transfer` é emitido corretamente.

## Checklist para Verificação

* **Conformidade com a Interface**: O contrato deve implementar todos os métodos definidos na interface `IToken`.
* **Corretude**: O contrato deve funcionar conforme esperado, sem erros ou bugs.
* **Eventos**: O evento `Transfer` deve ser emitido corretamente durante as transferências de tokens.
* **Código Limpo**: O código deve ser bem organizado e comentado, seguindo as melhores práticas de programação Solidity.

Boa sorte com o desafio! Este exercício irá ajudá-los a dominar os conceitos fundamentais de Solidity e a prática de implementação de contratos inteligentes.
