SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
18.11.2024

Lição: 061: Enviando Ether em Solidity

Nesta aula, vamos explorar como enviar Ether entre endereços em Solidity, a linguagem de programação utilizada para escrever contratos inteligentes na blockchain Ethereum. O Ether é a criptomoeda nativa da rede Ethereum, e ser capaz de enviá-lo e recebê-lo é essencial para muitas funcionalidades de contratos inteligentes.

Enviando Ether Usando Transfer

A maneira mais simples de enviar Ether em Solidity é utilizando o método transfer. Este método envia um valor especificado em Wei (a menor unidade de Ether) de um endereço para outro. Ele automaticamente gera um erro se a transferência falhar devido a fundos insuficientes ou um revert durante a execução.

Aqui está um exemplo básico de como enviar Ether usando o método transfer:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EnviadorDeEther {
    address payable public destinatario;

    constructor(address payable _destinatario) {
        destinatario = _destinatario;
    }

    function enviarEther() public payable {
        // Enviar 0.1 Ether (100.000.000.000.000.000 Wei)
        require(msg.value == 0.1 ether, "Envie exatamente 0.1 Ether");
        destinatario.transfer(msg.value);
    }

    // Função para retirar Ether do contrato
    function retirar() public {
        selfdestruct(destinatario);
    }
}

Explicação

  • destinatario: Este é o endereço para o qual o Ether será enviado.
  • constructor: Inicializamos o endereço do destinatário quando o contrato é implantado.
  • enviarEther: Esta função permite que os usuários enviem 0.1 Ether para o destinatário. Ela utiliza require para garantir que a quantia correta seja enviada e, em seguida, chama o método transfer para realizar a transferência.
  • retirar: Esta função permite que o proprietário do contrato retire todo o Ether do contrato.

Enviando Ether Usando Send

Outro método para enviar Ether é o send. A função send é semelhante ao transfer, mas retorna um valor booleano indicando sucesso ou falha, em vez de gerar um erro.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EnviadorDeEther {
    address payable public destinatario;

    constructor(address payable _destinatario) {
        destinatario = _destinatario;
    }

    function enviarEther() public payable {
        // Enviar 0.1 Ether
        require(msg.value == 0.1 ether, "Envie exatamente 0.1 Ether");

        // Enviar Ether e verificar se foi bem-sucedido
        bool enviado = destinatario.send(msg.value);
        require(enviado, "Falha ao enviar Ether");
    }
}

Explicação

Neste código, a função send envia Ether e retorna um valor booleano (enviado). Nós verificamos esse valor usando require para garantir que a transferência foi bem-sucedida.

Enviando Ether Usando Call (Recomendado)

O método call é o mais flexível e é recomendado para enviar Ether devido à sua natureza de baixo nível e flexibilidade. Este método é particularmente útil nas versões atuais do Solidity, pois encaminha o gás restante para o destinatário.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EnviadorDeEther {
    address payable public destinatario;

    constructor(address payable _destinatario) {
        destinatario = _destinatario;
    }

    function enviarEther() public payable {
        // Enviar 0.1 Ether
        require(msg.value == 0.1 ether, "Envie exatamente 0.1 Ether");

        // Enviar Ether usando call
        (bool enviado, ) = destinatario.call{value: msg.value}("");
        require(enviado, "Falha ao enviar Ether");
    }
}

Explicação

Neste exemplo, usamos call para enviar Ether. Ele retorna um booleano indicando o sucesso da transação e quaisquer dados retornados. Nós verificamos se o Ether foi enviado com sucesso usando uma declaração require.

Escolhendo o Método Correto

  • transfer: Reverte automaticamente em caso de falha e encaminha uma quantidade fixa de gás (2300). É adequado para a maioria das transferências simples, mas pode falhar se o destinatário for um contrato que requer mais gás.

  • send: Retorna um booleano para indicar sucesso ou falha. É menos recomendado, pois não lida bem com falhas automaticamente.

  • call: A opção mais versátil e flexível. Permite encaminhar todo o gás disponível para o receptor e geralmente é o método preferido em contratos modernos.

Conclusão

Nesta aula, aprendemos como enviar Ether em Solidity usando vários métodos: transfer, send e call. É crucial lidar corretamente com erros ao enviar Ether em contratos inteligentes, pois falhas podem levar a comportamentos inesperados e perda potencial de fundos. Sempre escolha o método apropriado com base nas necessidades específicas do seu contrato.

Sinta-se à vontade para experimentar os exemplos fornecidos e integrá-los em seus projetos!

Video

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

Thank you for voting!