¿Qué hace realmente esta transacción de Ethereum?
Estás mirando una transacción a un smart contract (un programa que corre en la blockchain de Ethereum) y ves algo como 0xa9059cbb000000...0de0b6b3a7640000. Los diez primeros caracteres no son random. Son el function selector, un identificador corto que le dice al contrato: *"llama a la función transfer"*.
Esta herramienta hace dos cosas. Primero: escribes una firma de función tipo transfer(address,uint256) y obtienes su identificador de 4 bytes (0xa9059cbb). Son los 4 bytes que aparecen al principio de cada transacción que llama a esa función.
Segundo: pegas un blob crudo de calldata (el hex de una transacción) y la herramienta extrae el selector, lo busca en un registro interno de ~30 funciones comunes (ERC-20, NFTs, Uniswap, WETH, proxies, ENS) y te muestra los argumentos que se pasaron.
Todo corre en local en tu navegador, sin llamadas a APIs, sin datos saliendo de tu dispositivo. Perfecto para depurar transacciones de wallet, leer transacciones pendientes en Etherscan o aprender cómo funciona el ABI de la EVM.
Cómo usarla
- Elige un modo arriba: Calcular selector (conoces el nombre de la función y quieres el identificador) o Decodificar calldata (tienes un blob hex y quieres saber qué hace).
- En modo Calcular selector: escribe la firma de la función tipo nombreFuncion(tipoArg1,tipoArg2). Sin espacios, sin nombres de argumentos, solo los tipos. El resultado de 4 bytes aparece al instante.
- En modo Decodificar calldata: pega el hex completo de la transacción (con 0x o sin él). La herramienta lee los 4 primeros bytes y los busca en el registro interno. Si lo encuentra, muestra el nombre de la función y una tabla de parámetros. Si no, puedes pegar la firma a mano.
- Pulsa los chips de ejemplo bajo el campo (transfer, approve, swap) para ver cómo lucen las operaciones comunes.
- La lista de abajo es el registro de selectores interno (~30 comunes). Pulsa cualquier entrada para autorrellenar el campo.
- Los argumentos string, bytes y arrays se marcan como *"(tipo dinámico)"* y se saltan: la decodificación completa requiere lógica compleja de offsets (fuera de alcance aquí). Direcciones y enteros decodifican sin problema.
Cuándo es útil
Seis situaciones típicas en las que el selector da una respuesta concreta:
- Depurar una transacción de wallet rara. Algo desapareció de tu wallet y no sabes qué pulsaste. Copia el calldata de Etherscan, pégalo aquí y ves al momento: *"ah, esto era approve por USDT ilimitado a un contrato random"*. Ya sabes qué revocar.
- Leer una transacción pendiente en Etherscan. Quieres saber qué va a hacer el contrato antes de firmar en MetaMask. Pega el campo *"Input Data"* y verás: *"swapExactTokensForTokens, un swap DEX"*. El cerebro respira.
- Construir una integración con un smart contract. Necesitas construir calldata a mano (p. ej. para un multicall o un framework no estándar). Calculas el selector de cada función y lo concatenas con los argumentos. Es el paso uno.
- Aprender cómo funciona el ABI. Primer día con Solidity y alguien te suelta *"function selector"*. Escribes transfer(address,uint256), obtienes 0xa9059cbb, lo cambias a Transfer(...) (con T mayúscula) y sale un selector totalmente distinto. Hasta la capitalización importa. Lección aprendida.
- Revisión de seguridad de un contrato. Tienes una transacción sospechosa que supuestamente llamó a *"claimAirdrop"*, pero algo no cuadra. Calcula el selector de claimAirdrop() y comprueba si coincide con los 4 primeros bytes del calldata. Si no, alguien intentó engañarte.
- Escribir tests de Foundry / Hardhat. Necesitas hardcodear un selector en un test (p. ej. para expectRevert(bytes4)). Calcúlalo aquí, copia y pega en el test. Sin necesidad de instalar cast o montar otro toolchain.