Lição: 060: Tipo de Endereço e Endereço Pagável em Solidity
Nesta aula, vamos explorar o tipo address
e o tipo address payable
em Solidity. Ambos são essenciais para gerenciar endereços Ethereum ao trabalhar com contratos inteligentes, especialmente quando lidamos com transações em Ether.
Compreendendo o Tipo Address
Em Solidity, o tipo address
é usado para armazenar endereços Ethereum. Um endereço é um valor hexadecimal de 20 bytes, manipulado como uma string de 40 caracteres. O tipo address
vem com métodos embutidos que permitem a interação com outros contratos ou o envio de Ether.
Exemplo do Tipo Address
Aqui está um contrato básico que demonstra o uso do tipo address
:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ExemploEndereço {
address public dono;
constructor() {
dono = msg.sender; // Define o dono como a conta que implantou o contrato
}
function getDono() public view returns (address) {
return dono;
}
}
Neste exemplo, o construtor define a variável dono
para o endereço que implantou o contrato. A função getDono
retorna esse endereço quando chamada.
Compreendendo o Tipo Address Pagável
O tipo address payable
é uma versão especializada de address
que permite enviar e receber Ether. Você pode converter um address
em address payable
, mas não o contrário diretamente.
Exemplo do Tipo Address Pagável
Vamos modificar o exemplo anterior para incluir a capacidade de enviar Ether ao dono do contrato. Usaremos o tipo address payable
para o dono:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ExemploEndereçoPagável {
address payable public dono;
constructor() {
dono = payable(msg.sender); // Define o dono como quem implantou e faz a conversão para pagável
}
function retirar(uint256 quantia) public {
require(msg.sender == dono, "Apenas o dono pode retirar fundos");
require(address(this).balance >= quantia, "Saldo insuficiente");
dono.transfer(quantia); // Transfere Ether ao dono
}
// Função para receber Ether
receive() external payable {}
}
Análise do Exemplo
-
Construtor: Definimos o
dono
como o endereço que implantou o contrato e o convertendo parapayable
. -
Função Retirar: A função
retirar
permite que o dono retire uma quantia específica de Ether do contrato. Ela verifica se o chamar é o dono e se o contrato possui saldo suficiente antes de transferir os fundos. -
Função Receber: A função
receive
é definida para permitir que o contrato aceite Ether enviado a ele.
Observações Importantes
- Apenas
address payable
pode iniciar transferências com os métodos.transfer()
ou.send()
. - Enviar Ether utilizando o método
transfer
requer que o destinatário tenha gás suficiente; falhas reverterão a transação.
Conclusão
Nesta aula, cobrimos os tipos address
e address payable
em Solidity. Lembre-se, quando precisar lidar com transferências de Ether em seus contratos inteligentes, utilize address payable
para garantir o funcionamento adequado.
Com esses conceitos, você pode começar a construir contratos inteligentes Ethereum mais complexos que gerenciam transações de criptomoeda entre usuários e contratos de forma eficaz.