Co właściwie robi ta transakcja na Ethereum?
Patrzysz na transakcję smart contractu (program działający na blockchainie Ethereum) i widzisz coś w stylu 0xa9059cbb000000...0de0b6b3a7640000. Pierwsze dziesięć znaków to nie przypadek. To function selector, krótki identyfikator, który mówi kontraktowi: *„wywołaj funkcję transfer"*.
To narzędzie robi dwie rzeczy. Pierwsza: wpisujesz nazwę funkcji jak transfer(address,uint256), dostajesz jej 4-bajtowy identyfikator (0xa9059cbb). To te 4 bajty, które pojawiają się na początku każdej transakcji do tego kontraktu.
Druga: wklejasz całą calldatę (cały hex z transakcji), narzędzie wyciąga selector, sprawdza w bazie ~30 najpopularniejszych funkcji (ERC-20, NFT, Uniswap, WETH, proxy, ENS) i pokazuje, jakie argumenty zostały podane.
Wszystko liczy się lokalnie w przeglądarce, żadnych zapytań do API, żadnych wycieków danych. Idealne do debugowania transakcji z portfela, czytania pending tx na Etherscan, albo nauki, jak w ogóle działa ABI.
Jak używać
- Wybierz tryb na górze: Wylicz selector (znasz nazwę funkcji, chcesz identyfikator) albo Odszyfruj calldatę (masz hex z transakcji, chcesz wiedzieć, co robi).
- W trybie Wylicz selector: wpisz podpis funkcji w stylu nazwaFunkcji(typArg1,typArg2). Bez spacji, bez nazw argumentów, tylko same typy. Wynik (4-bajtowy hex) pojawia się od razu.
- W trybie Odszyfruj calldatę: wklej cały hex transakcji (z 0x lub bez). Narzędzie wyciąga pierwsze 4 bajty i szuka w wbudowanej bazie. Jeśli znajdzie, pokazuje nazwę funkcji + tabelę argumentów. Jeśli nie, możesz wpisać podpis funkcji ręcznie.
- Klikaj przykłady pod polem (transfer, approve, swap), żeby zobaczyć, jak to wygląda dla popularnych operacji.
- Lista na dole to wbudowana baza selectorów (~30 najczęstszych). Kliknij dowolny, żeby autouzupełnić pole.
- Argumenty typu string, bytes i tablice są oznaczone jako *„(typ dynamiczny)"* i pomijane, ich pełne dekodowanie wymaga skomplikowanej logiki offsetów (nie ten tool).
Kiedy się przydaje
Sześć typowych sytuacji, w których selector daje Ci konkretną odpowiedź:
- Debugujesz dziwną transakcję z portfela. Coś zniknęło z Twojego wallet i nie wiesz, co kliknąłeś. Kopiujesz calldatę z Etherscana, wklejasz tu, od razu widzisz: *„ahh, to było approve nieskończonej kwoty USDT dla jakiegoś losowego kontraktu"*. Już wiesz, co odwołać.
- Czytasz pending transakcję na Etherscan. Chcesz wiedzieć, co kontrakt ma zrobić, zanim potwierdzisz w MetaMask. Wklejasz *„Input Data"*, widzisz: *„to swapExactTokensForTokens, czyli zamiana tokenów na DEXie"*. Mózg się uspokaja.
- Programujesz integrację ze smart contractem. Musisz skonstruować calldatę ręcznie (np. dla multicall albo niestandardowego frameworka). Wyliczasz selector każdej funkcji, sklejasz z argumentami. Tu robisz krok pierwszy.
- Uczysz się, jak działa ABI. Pierwsze starcie z Solidity i ktoś rzuca pojęciem *„function selector"*. Wpisujesz transfer(address,uint256), widzisz 0xa9059cbb, zmieniasz na Transfer(...) (wielka litera), selector zupełnie inny. Aha, więc nawet wielkość liter ma znaczenie.
- Robisz audyt bezpieczeństwa kontraktu. Masz złośliwą transakcję, która rzekomo wywołała funkcję *„claimAirdrop"*, ale Ty masz wątpliwości. Wyliczasz selector dla claimAirdrop() i sprawdzasz, czy zgadza się z pierwszymi 4 bajtami calldaty. Jeśli nie, ktoś próbował Cię oszukać.
- Piszesz testy w Foundry/Hardhat. Potrzebujesz hardkodować selector w teście (np. dla expectRevert(bytes4)). Wyliczasz tutaj, kopiujesz, wklejasz do testu. Bez instalowania cast ani innych narzędzi.