Codificador / Decodificador ABI do Ethereum

Transforme uma assinatura de função mais argumentos em calldata exato, ou cole o calldata de uma transação e decodifique-o. Suporte completo a ABI v2: arrays aninhados, tuplas, bytes dinâmicos e strings, com detalhamento palavra por palavra.

Inteiros podem ser decimais ou hex 0x (aspas opcionais). Endereços, bytes e strings vão entre aspas. bytesN aceita hex 0x ou texto.
Exemplos:

Calculado no seu navegador com JavaScript. Os endereços nunca são enviados nem armazenados.

O que é codificação ABI?

A codificação ABI é a regra da especificação de ABI de contratos Solidity para transformar uma chamada de função em bytes: um seletor de 4 bytes seguido dos argumentos empacotados em palavras de 32 bytes, com valores estáticos inline e valores dinâmicos (bytes, strings, arrays dinâmicos) colocados depois de um cabeçalho (head) que guarda seus offsets em bytes. Um codificador ABI monta esse calldata a partir de uma assinatura e de valores; um decodificador faz o caminho inverso.

Como funciona o layout

Para f(uint256,uint32[],bytes10,bytes) chamada com (0x123, [0x456, 0x789], "1234567890", "Hello, world!") a codificação é: o seletor 0x8be65246, depois o head de quatro palavras (o uint256, um offset de 0x80 para o array, o bytes10 preenchido à direita, um offset de 0xe0 para os bytes), depois o tail: o tamanho do array 2 e seus dois elementos, depois o tamanho dos bytes 13 e os dados preenchidos. Clique em "f() da documentação Solidity" acima para ver palavra por palavra.

Regras em resumo

Exemplo prático: uma transferência ERC-20

transfer(address,uint256) com destinatário 0x1111111111111111111111111111111111111111 e 25 USDT (25.000.000 unidades brutas) codifica em 68 bytes: seletor a9059cbb, depois 12 bytes zero de preenchimento à esquerda seguidos do endereço de 20 bytes, depois 25.000.000 = 0x17d7840 preenchido à esquerda até uma palavra de 32 bytes. Toda transferência ERC-20 em todo explorador tem exatamente esse formato, e é por isso que o decodificador consegue nomear a função e recuperar os argumentos só a partir do seletor.

Relacionados

Calcule apenas seletores com a ferramenta de seletor de função; converta quantidades de tokens em inteiros brutos com o conversor de decimais de token; inspecione palavras individuais com o conversor de hex para decimal.

Perguntas frequentes

O que é codificação ABI?

A Application Binary Interface define como os argumentos são dispostos no campo de dados de uma transação: um seletor de 4 bytes seguido de palavras de 32 bytes. Tipos estáticos ficam inline; tipos dinâmicos (bytes, string, arrays dinâmicos, tuplas que os contêm) são referenciados por um offset no head e colocados no tail.

Como escrevo os argumentos?

Como um array JSON na ordem dos parâmetros. Inteiros podem ser simples ou hex 0x, com ou sem aspas; valores grandes devem ir entre aspas ou escritos em hex. Endereços e strings vão entre aspas. Arrays e tuplas são arrays aninhados, por exemplo [[1,2],[3]] para uint256[][].

Por que meu valor decodificado aparece como string?

Inteiros maiores que 253 não podem ser representados com exatidão como números JSON, então todos os inteiros são mostrados como strings decimais. Endereços são mostrados com checksum EIP-55.

Posso decodificar uma transação do Etherscan?

Sim. Copie o input data, cole junto com a assinatura da função, e o seletor é conferido com a assinatura antes de decodificar. Se o seletor não bater você recebe um erro em vez de lixo.

Qual é a diferença entre abi.encode e abi.encodePacked?

abi.encode segue as regras padrão acima e preenche todo valor até 32 bytes, então pode ser decodificado. abi.encodePacked concatena os valores na largura mínima, sem preenchimento nem offsets; é mais curto, mas ambíguo e não pode ser decodificado sem conhecer os tipos. Esta ferramenta implementa apenas a codificação padrão.

Suporta erros customizados e eventos?

As regras de codificação são idênticas, então você pode codificar ou decodificar dados de erro com a assinatura do erro. Logs de eventos são diferentes: parâmetros não indexados são codificados em ABI no campo data, então decodifique essa parte com uma assinatura contendo apenas os tipos não indexados.