SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
15.11.2024

Lição: 033: Enums em Solidity

Enums (enumerações) são um recurso no Solidity que permitem que os desenvolvedores definam um tipo personalizado com um conjunto fixo de valores. Isso pode aumentar a legibilidade e a manutenibilidade do código ao usar nomes significativos em vez de números inteiros constantes para representar estados ou categorias.

Nesta aula, vamos explorar como definir e usar enums em Solidity com exemplos.

Definindo um Enum

Um enum é definido usando a palavra-chave enum, seguida pelo nome do enum e seus possíveis valores entre chaves. Aqui está um exemplo simples:

pragma solidity ^0.8.0;

contract SimpleEnum {
    enum Estado { Criado, Ativo, Concluído, Cancelado }

    Estado public estadoAtual;

    constructor() {
        estadoAtual = Estado.Criado; // Estado inicial
    }
}

Neste exemplo, definimos um enum chamado Estado com quatro valores: Criado, Ativo, Concluído, e Cancelado. Também declaramos uma variável de estado estadoAtual do tipo Estado.

Usando Enums

Você pode usar enums em funções para mudar o estado ou para executar lógica condicionalmente com base no estado atual. Aqui está uma extensão do exemplo anterior:

pragma solidity ^0.8.0;

contract Tarefa {
    enum Estado { Criado, Ativo, Concluído, Cancelado }

    Estado public estadoAtual;

    constructor() {
        estadoAtual = Estado.Criado; // Estado inicial
    }

    function ativar() public {
        require(estadoAtual == Estado.Criado, "Só é possível ativar uma tarefa que foi criada.");
        estadoAtual = Estado.Ativo; // Mudar estado para Ativo
    }

    function concluir() public {
        require(estadoAtual == Estado.Ativo, "Só é possível concluir uma tarefa ativa.");
        estadoAtual = Estado.Concluído; // Mudar estado para Concluído
    }

    function cancelar() public {
        require(estadoAtual != Estado.Concluído, "Não é possível cancelar uma tarefa concluída.");
        estadoAtual = Estado.Cancelado; // Mudar estado para Cancelado
    }
}

Neste exemplo, adicionamos três funções: ativar, concluir, e cancelar. Cada função verifica o estado atual antes de transitar para o próximo estado. As instruções require garantem que as transições de estado sejam válidas.

Enums e Valores Inteiros

Internamente, os enums são representados como inteiros sem sinal. O primeiro valor no enum tem o valor de 0, o segundo 1, e assim por diante. Você pode converter valores de enum para inteiros e vice-versa:

pragma solidity ^0.8.0;

contract IntegerEnum {
    enum Estado { Criado, Ativo, Concluído, Cancelado }

    Estado public estadoAtual;

    constructor() {
        estadoAtual = Estado.Criado;
    }

    function obterEstadoAtualComoInteiro() public view returns (uint) {
        return uint(estadoAtual); // Converter enum para inteiro
    }

    function definirEstado(uint _estado) public {
        require(_estado <= uint(Estado.Cancelado), "Valor de estado inválido");
        estadoAtual = Estado(_estado); // Converter inteiro de volta para enum
    }
}

Neste contrato, adicionamos uma função obterEstadoAtualComoInteiro que retorna o estado atual como um inteiro. A função definirEstado permite definir o estado usando um valor inteiro enquanto valida-o.

Conclusão

Nesta aula, introduzimos enums em Solidity, demonstrando como defini-los e usá-los em contratos inteligentes. Os enums melhoram a clareza do código ao substituir inteiros simples por nomes descritivos, tornando mais fácil entender os possíveis estados de um contrato.

À medida que você continua a construir seus contratos inteligentes, considere usar enums sempre que aplicável para melhorar a manutenibilidade e a legibilidade do seu código.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!