O que é um seletor de função?
Um seletor de função são os primeiros 4 bytes do hash Keccak-256 da assinatura canônica de uma função: o nome seguido dos tipos dos parâmetros entre parênteses, sem espaços nem nomes, por exemplo transfer(address,uint256) → 0xa9059cbb. Ele forma os primeiros 4 bytes do calldata de toda chamada de contrato e diz ao contrato qual função executar; os bytes restantes são os argumentos codificados em ABI.
Seletores comuns
A tabela é calculada nesta página com a mesma implementação de Keccak usada pela ferramenta, então ela também serve como autoteste. Cole qualquer seletor na caixa acima para consultá-lo.
Exemplo prático
Pegue function approve(address spender, uint256 amount) external returns (bool). Remova a palavra-chave, os nomes dos parâmetros, a visibilidade e o tipo de retorno para obter approve(address,uint256). O Keccak-256 dessa string ASCII começa com 0x095ea7b3…, então o seletor é 0x095ea7b3. O calldata para aprovar 1 USDT (6 decimais) é o seletor, o endereço do spender preenchido à esquerda até 32 bytes, e 1000000 como uma palavra de 32 bytes: 4 + 32 + 32 = 68 bytes.
Seletores ERC-20 que você mais vai ver
| Assinatura | Seletor |
|---|---|
totalSupply() | 0x18160ddd |
balanceOf(address) | 0x70a08231 |
transfer(address,uint256) | 0xa9059cbb |
transferFrom(address,address,uint256) | 0x23b872dd |
approve(address,uint256) | 0x095ea7b3 |
allowance(address,address) | 0xdd62ed3e |
Erros comuns
- Fazer o hash de
uintem vez deuint256.transfer(address,uint)gera um valor diferente; a forma canônica sempre escreve a largura por extenso. - Incluir nomes de parâmetros ou espaços.
transfer(address to, uint256 amount)não é uma assinatura canônica. - Usar o nome da struct para tuplas. Structs são escritas como os tipos de seus campos entre parênteses, nunca como
MyStruct. - Confundir seletor e tópico. Funções usam 4 bytes; eventos usam o hash completo de 32 bytes.
Formatos de entrada aceitos
transfer(address,uint256): forma canônica.function transfer(address to, uint256 amount) external returns (bool): declaração Solidity; nomes, visibilidade e returns são removidos.event Transfer(address indexed from, address indexed to, uint256 value): a palavra-chaveindexedé ignorada no hash do tópico.0xa9059cbbou um tópico de 32 bytes: consulta reversa na lista embutida.
Para montar ou ler calldata completo, continue no codificador / decodificador ABI.