> 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-4/quiz-required-and-revert.md).

# Quiz : REQUIRED AND REVERT

**1. Em Solidity, o que acontece quando uma função marca explicitamente um erro com \`revert\`?**

a) A execução da função continua normalmente, mas um aviso é gerado no console.

b) A execução da função é revertida imediatamente e todas as alterações de estado são desfeitas.

c) A função retorna um valor de erro que pode ser tratado pelo contrato chamador.

**2. Qual é a principal razão para usar \`revert\` em contratos inteligentes?**

a) Para interromper a execução do contrato e lançar um erro personalizado.

b) Para forçar uma exceção não tratada e encerrar o contrato abruptamente.

c) Para notificar o usuário sobre erros de execução do contrato.

**3. Quando você pode utilizar \`require\` em vez de \`revert\` em Solidity?**

a) Quando você quer retornar um valor específico ao invés de lançar uma exceção.

b) Quando você quer apenas registrar um aviso no console, mas continuar a execução.

c) Quando você quer impor condições para a execução de uma função e reverter se essas condições não forem atendidas.

**4. O que o modificador \`required\` faz em Solidity?**

a) Ele verifica se uma variável foi inicializada corretamente antes de permitir a execução de uma função.

b) Ele define um requisito que deve ser cumprido para que a função seja executada com sucesso.

c) Ele reverte a execução de uma função se uma condição específica não for atendida.

**5. Qual é a diferença principal entre \`required\` e \`assert\` em Solidity?**

a) \`required\` é usado para verificar condições de entrada em uma função, enquanto \`assert\` é usado para verificar invariantes internas do contrato.

b) \`required\` é usado para interromper a execução de uma função se uma condição não for atendida, enquanto \`assert\` é usado para validar expressões internas do contrato.

c) \`required\` e \`assert\` são sinônimos em Solidity e podem ser usados de forma intercambiável.

**6. Quando é mais apropriado usar \`required\` em vez de \`revert\` em Solidity?**

a) Quando a verificação é sobre condições externas, como entradas de usuário.

b) Quando a validação está relacionada a invariantes internos do contrato.

c) Não há diferença significativa entre eles em termos de uso apropriado.

**7. Como o bloco de código a seguir, em Solidity, trata a validação de um índice de um array?**

```solidity
if (index >= mensagens.length)  revert ERRORInvalidIndex(index);
```

a) Reverte a execução do contrato se o índice fornecido for maior ou igual ao comprimento do array, lançando uma exceção com uma mensagem de erro personalizada.

b) Ignora a condição do índice e continua a execução do contrato normalmente, independentemente do valor fornecido.

c) Retorna um aviso no console se o índice estiver fora dos limites do array, mas não reverte a execução do contrato.

**8. Como o bloco de código a seguir, em Solidity, trata a validação de um índice de um array?**

```solidity
require(index <= mensagens.length, "INDEX INVALID");
```

a) Interrompe a execução do contrato se o índice fornecido for maior do que o comprimento do array, lançando uma exceção com a mensagem "INDEX INVALID".

b) Continua a execução do contrato mesmo se o índice estiver fora dos limites do array, mas imprime um aviso no console.

c) Retorna um valor booleano indicando se o índice fornecido é válido ou não, sem interromper a execução do contrato.

**Respostas:**

1\. b) A execução da função é revertida imediatamente e todas as alterações de estado são desfeitas.

2\. a) Para interromper a execução do contrato e lançar um erro personalizado.

3\. c) Quando você quer impor condições para a execução de uma função e reverter se essas condições não forem atendidas.

4\. b) Ele define um requisito que deve ser cumprido para que a função seja executada com sucesso.

5\. a) \`required\` é usado para verificar condições de entrada em uma função, enquanto \`assert\` é usado para verificar invariantes internas do contrato.

6\. a) Quando a verificação é sobre condições externas, como entradas de usuário.

7\. a) Reverte a execução do contrato se o índice fornecido for maior ou igual ao comprimento do array, lançando uma exceção com uma mensagem de erro personalizada.

8.a) Interrompe a execução do contrato se o índice fornecido for maior do que o comprimento do array, lançando uma exceção com a mensagem "INDEX INVALID".
