Werkzeug AT-W36REV. 2026-A
Funktions-Selektor und Event-Topic berechnen, auch rückwärts
Der Funktions-Selektor sind die ersten 4 Byte des Keccak-256-Hashes der kanonischen Signatur, also Name und Parametertypen ohne Leerzeichen und ohne Namen. Aus transfer(address,uint256) wird 0xa9059cbb. Ein Event-Topic0 ist derselbe Hash in voller Länge, ein Fehler-Selektor entsteht wie der einer Funktion. Der Rechner bildet die kanonische Form aus Quelltext oder ABI selbst und schlägt Selektoren in einer Liste von 401 bekannten Signaturen nach.
- kostenlos
- ohne Anmeldung
- rechnet im Browser
01 / RECHNER
Signatur einfügen, Selektor und Topic ablesen
Rechner · Selektor, Topic0, Fehler-Selektor und Rückwärtssuche
Der Rechner bildet Signaturen nach der Solidity-ABI-Spezifikation. Er liest keine Blockchain und löst keine Transaktion aus. Ob ein Vertrag eine Funktion wirklich hat, zeigt nur sein Bytecode oder der geprüfte Quelltext.
Rechnet in Ihrem Browser. Es wird nichts gesendet oder gespeichert.
02 / REGEL
So entsteht ein Selektor
Eine Transaktion an einen Vertrag beginnt mit 4 Byte. Der Vertrag vergleicht sie am Anfang seines Codes mit den Selektoren seiner Funktionen und springt zur passenden; die Argumente folgen danach. Woher die 4 Byte kommen, legt die ABI-Spezifikation von Solidity fest: Man schreibt die Signatur in eine feste Form, hasht sie mit Keccak-256 und nimmt den Anfang. Weil dieser Vergleich im Bytecode steht, lassen sich die Selektoren eines Vertrags auch ohne Quelltext auslesen Grech u. a. 2019.
Abb. 1 · Keccak-256 über die kanonische Signatur, gerechnet mit demselben Code wie das Werkzeug.
Die kanonische Form
Kanonisch heißt: Name, Klammer, die Typen mit genau einem Komma dazwischen. Parameternamen, memory und calldata, Sichtbarkeit, Modifier und der Rückgabetyp gehören nicht dazu. Ein einziges Leerzeichen ergibt einen ganz anderen Hash. Dazu kommen Ersetzungen, weil das ABI manche Solidity-Typen nicht kennt:
| Solidity | Beispiel | Im Selektor | Regel |
|---|---|---|---|
| uint, int | uint menge, int delta | f(uint256,int256) | immer mit Bitzahl |
| address payable | address payable an | f(address) | payable fällt weg |
| Vertrag, Interface | IERC20 token | f(address) | wird zur Adresse |
| enum | Status s mit enum Status { Offen, Beendet } | f(uint8) | uint8; vor 0.8.0 bei über 256 Werten größer |
| eigener Werttyp | Preis p mit type Preis is uint128 | f(uint128) | der Grundtyp |
| struct | Gebot g mit struct Gebot { address bieter; uint betrag; } | f((address,uint256)) | Tupel in Klammern, auch verschachtelt |
| Arrays | uint[] a, address[3] b | f(uint256[],address[3]) | Länge bleibt, Elementtyp wird kanonisch |
| fixed, ufixed | fixed x | f(fixed128x18) | fixed128x18 bzw. ufixed128x18 |
| byte (bis 0.7) | byte b | f(bytes1) | bytes1 |
| Funktionstyp | function(uint) external returns (bool) cb | f(function) | function, kodiert wie bytes24 |
| öffentliche Variable | mapping(address => mapping(address => uint)) public allowance | allowance(address,address) | Getter: je mapping ein Schlüssel, je Array-Ebene uint256 |
Regeln nach der Solidity-ABI-Spezifikation, Abschnitte „Types" und „Mapping Solidity to ABI types", Stand 14. November 2026.
Gleichnamige Funktionen mit anderen Typen sind verschiedene Funktionen. ERC-721 hat zwei safeTransferFrom: mit Datenfeld 0xb88d4fde, ohne 0x42842e0e. Eine öffentliche Zustandsvariable bekommt einen Getter mit eigenem Selektor; mapping(address => uint256) public balanceOf ergibt balanceOf(address) und damit 0x70a08231, genau wie die Funktion aus ERC-20. Bibliotheken bilden Selektoren für storage-Zeiger und structs nach einer eigenen Regel mit Typnamen; solche Funktionen rechnet das Werkzeug nicht und sagt das auch.
03 / EVENTS UND FEHLER
Topic0 für Events, Selektoren für Fehler
Ein Log-Eintrag trägt bis zu vier Topics. Das erste ist der volle Hash der Event-Signatur, die übrigen sind die indexierten Parameter, höchstens drei. Die nicht indexierten stehen im Datenteil. Wer Logs abfragt, filtert deshalb über das Topic0: Studien zum Token-Ökosystem bauen ihre Daten genau so aus den Event-Logs auf Chen u. a. 2020.
- Gleicher Name, gleicher Hash. Transfer aus ERC-20 und Transfer aus ERC-721 haben beide das Topic0 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. Ob ein Parameter indexiert ist, ändert die Signatur nicht. Unterscheiden lassen sich die beiden an der Zahl der Topics: drei bei ERC-20, vier bei ERC-721.
- Indexierte Texte und Arrays. Bei
string,bytes, Arrays und structs steht im Topic nur der Keccak-Hash des Werts. Den Text selbst bekommen Sie aus dem Log nicht zurück. - Anonyme Events. Mit
anonymousentfällt das Topic0, dafür darf ein vierter Parameter indexiert sein. Filtern geht dann nur über die Adresse und die Werte.
Fehler beim Abbruch
Bricht ein Vertrag ab, beginnen die Rückgabedaten mit einem Fehler-Selektor, gebildet wie bei Funktionen. Zwei sind fest eingebaut: 0x08c379a0 steht für Error(string) aus require oder revert mit Text, 0x4e487b71 für Panic(uint256) mit einem Code. Seit Solidity 0.8.4 gibt es eigene Fehler wie error ERC20InsufficientBalance(address,uint256,uint256), Selektor 0xe450d38c. Die Werte 0x00000000 und 0xffffffff sind reserviert; trifft ein eigener Fehler einen davon, warnt der Rechner.
| Code | Ursache |
|---|---|
| 0x00 | allgemeiner, vom Compiler eingefügter Abbruch |
| 0x01 | assert mit falscher Bedingung |
| 0x11 | Über- oder Unterlauf außerhalb von unchecked |
| 0x12 | Division oder Modulo durch null |
| 0x21 | zu großer oder negativer Wert für ein enum |
| 0x22 | falsch kodiertes Byte-Array im Storage |
| 0x31 | .pop() auf leerem Array |
| 0x32 | Index außerhalb eines Arrays, bytesN oder Slice |
| 0x41 | zu viel Speicher angefordert oder zu großes Array |
| 0x51 | Aufruf einer nicht gesetzten internen Funktionsvariable |
04 / RÜCKWÄRTS
Was ein Selektor verrät und was nicht
Einen Hash kann man nicht umkehren. Man kann nur nachsehen, ob eine bekannte Signatur denselben Wert ergibt. Genau das tut die Rückwärtssuche, mit einer eigenen Liste von 263 Funktionen, 69 Events und 69 Fehlern aus den Standards und den Bibliotheken, die fast jeder Vertrag nutzt. Dass so eine Liste weit trägt, liegt am Ökosystem: Über 96 Prozent der untersuchten Verträge hatten Duplikate He u. a. 2020, und mehr als 80 Prozent der Teilverträge stammen aus fremden Quellen, ein gutes Drittel davon sind Interfaces für Standards Sun u. a. 2023.
Ein Treffer heißt trotzdem nur: Diese Signatur passt. Öffentliche Datenbanken mit Millionen Einträgen sind unvollständig, deshalb lesen Forscher Selektor und Parametertypen direkt aus dem Bytecode, mit 98,7 Prozent Trefferquote Chen u. a. 2022. Auch Decompiler leiten die Argumente ab Grech u. a. 2022, sind aber nicht fehlerfrei Liu u. a. 2023. Und ein Vertrag, der alle ERC-20-Selektoren hat, ist noch kein ordentlicher Token: Die Erkennung am Interface findet die Standard-Token zuverlässig, Token, die den Standard bewusst meiden, aber nur über ihr Verhalten Fröwis u. a. 2019. Welche Standards ein Vertrag erfüllt, lässt sich aus dem Bytecode prüfen di Angelo und Salzer 2020; die Interface-IDs nach ERC-165 rechnet der Rechner dafür mit.
Vier Byte sind schnell gefunden
Ein Selektor hat 2³² mögliche Werte, rund 4,3 Milliarden. Das klingt nach viel, reicht aber nicht gegen Absicht. Schon bei etwa 77.163 beliebigen Signaturen liegt die Wahrscheinlichkeit für irgendein Paar mit gleichem Selektor bei 50 Prozent. Wer gezielt einen bestimmten Selektor treffen will, probiert Namen durch, bis es passt. Das ist für heutige Rechner keine Hürde:
| Selektor | Signatur A | Signatur B | Bekannt als |
|---|---|---|---|
| 0x42966c68 | burn(uint256) | collate_propagate_storage(bytes16) | Lehrbeispiel für Proxys |
| 0x23b872dd | transferFrom(address,address,uint256) | gasprice_bit_ether(int128) | ERC-20 gegen eine sinnlose Signatur |
| 0x41973cd9 | putCurEpochConPubKeyBytes(bytes) | f1121318093(bytes,bytes,uint64) | Poly Network, August 2021 |
Beim Angriff auf Poly Network im August 2021 hat der Angreifer genau so einen Funktionsnamen gesucht: Sein Aufruf landete bei putCurEpochConPubKeyBytes(bytes), weil beide 0x41973cd9 ergeben (Vorfallsbericht bei rekt.news). Der Rechner warnt deshalb, wenn ein eingegebener Selektor in der Liste zu einer anderen Signatur gehört, und meldet gleiche Selektoren innerhalb Ihrer Eingabe. Wer wissen will, was eine konkrete Transaktion tut, liest die Calldata mit dem Calldata-Decoder und prüft die Zieladresse mit dem Ethereum-Adress-Prüfer.
05 / PROXY
Proxys: wenn zwei Verträge sich einen Selektor teilen
Viele Verträge lassen sich austauschen. Ein Proxy hält die Daten und reicht jeden Aufruf per delegatecall an eine Implementierung weiter, die sich später ersetzen lässt. Gemessen wurden 1,4 Millionen solcher Proxys, und rund die Hälfte ließ sich von einer einzelnen Adresse umstellen Salehi u. a. 2023. Eine Folgestudie beschreibt sechs gängige Muster und fand über 10.000 Ketten tatsächlicher Austausche Li u. a. 2024. Zur Einordnung: Über alle Verträge gerechnet sind nur 3 Prozent austauschbar, und davon wurden nur 0,34 Prozent je ausgetauscht Qasse u. a. 2025. Für die Selektoren heißt das: Hinter derselben Adresse können morgen andere Funktionen stehen.
Haben Proxy und Implementierung eine Funktion mit demselben Selektor, läuft die des Proxys, und die der Implementierung ist von außen nicht erreichbar. Das Transparent-Muster trennt deshalb Admin und Nutzer, beim UUPS-Muster liegt die Upgrade-Funktion in der Implementierung. Eine Messung über 36 Millionen Verträge fand 54,2 Prozent Proxys und rund 1,5 Millionen Verträge mit mindestens einer Kollision von Funktionen oder Speicher Chen u. a. 2025. Fügen Sie Proxy und Implementierung zusammen in den Rechner ein; gleiche Selektoren meldet er über Vertragsgrenzen hinweg.
Speicherplätze nach EIP-1967
Teilen sich zwei Verträge den Speicher und deuten ihn verschieden, entstehen Speicherkollisionen Ruaro u. a. 2024. EIP-1967 legt die Adresse der Implementierung deshalb an einen Platz, der aus einem Hash entsteht und mit keiner normalen Variable zusammenfällt: keccak256("eip1967.proxy.implementation") − 1. Wer einen 32-Byte-Wert nachschlägt, bekommt diese Plätze und die Upgrade-Events angezeigt.
| Was | Wert |
|---|---|
| EIP-1967-Speicherplatz der Implementierung | 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc |
| EIP-1967-Speicherplatz des Admins | 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103 |
| EIP-1967-Speicherplatz des Beacons | 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50 |
| Event Upgraded(address) | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b |
| Event AdminChanged(address,address) | 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f |
| Event BeaconUpgraded(address) | 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e |
Diamanten nach EIP-2535 gehen weiter: Ein Vertrag ordnet jeden Selektor einzeln einer Facette zu. Die Funktion dafür nimmt ein Array von structs mit einem enum, kanonisch diamondCut((address,uint8,bytes4[])[],address,bytes), Selektor 0x1f931c1c. Ein gutes Beispiel dafür, warum der Rechner structs und enums selbst auflöst: Von Hand vertippt man sich hier leicht.
06 / LISTE
Die Liste bekannter Signaturen
401 Signaturen in 48 Gruppen, jede mit Quelle und Version. Die Signaturen stammen aus den Quelldateien selbst, gelesen mit dem Parser dieses Werkzeugs; jeder Wert unten ist gerechnet. Wo eine Gruppe ein Interface genau abbildet, steht die Interface-ID nach ERC-165 dabei. Stand 14. November 2026.
Solidity (eingebaut) 2
Quelle: Solidity-Doku: Panic via assert und Error via require
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| Error(string) | Fehler | 0x08c379a0 |
| Panic(uint256) | Fehler | 0x4e487b71 |
ERC-20 8 · ID 0x36372b07
Quelle: EIP-20: Token Standard
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| totalSupply() | Funktion | 0x18160ddd |
| balanceOf(address) | Funktion | 0x70a08231 |
| transfer(address,uint256) | Funktion | 0xa9059cbb |
| allowance(address,address) | Funktion | 0xdd62ed3e |
| approve(address,uint256) | Funktion | 0x095ea7b3 |
| transferFrom(address,address,uint256) | Funktion | 0x23b872dd |
| Transfer(address,address,uint256) | Event | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
| Approval(address,address,uint256) | Event | 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925 |
ERC-20 Metadata 3 · ID 0xa219a025
Quelle: OpenZeppelin v5.4.0: IERC20Metadata
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| name() | Funktion | 0x06fdde03 |
| symbol() | Funktion | 0x95d89b41 |
| decimals() | Funktion | 0x313ce567 |
ERC-20 Burnable 2
Quelle: OpenZeppelin v5.4.0: ERC20Burnable
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| burn(uint256) | Funktion | 0x42966c68 |
| burnFrom(address,uint256) | Funktion | 0x79cc6790 |
ERC-20 (OpenZeppelin 4.x) 7
Quelle: OpenZeppelin v4.9.6: ERC20 und ERC20PresetMinterPauser
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| increaseAllowance(address,uint256) | Funktion | 0x39509351 |
| decreaseAllowance(address,uint256) | Funktion | 0xa457c2d7 |
| mint(address,uint256) | Funktion | 0x40c10f19 |
| pause() | Funktion | 0x8456cb59 |
| unpause() | Funktion | 0x3f4ba83a |
| MINTER_ROLE() | Funktion | 0xd5391393 |
| PAUSER_ROLE() | Funktion | 0xe63ab1e9 |
ERC-2612 Permit 6 · ID 0x9d8ff7da
Quelle: EIP-2612: Permit Extension for EIP-20 Signed Approvals
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| permit(address,address,uint256,uint256,uint8,bytes32,bytes32) | Funktion | 0xd505accf |
| nonces(address) | Funktion | 0x7ecebe00 |
| DOMAIN_SEPARATOR() | Funktion | 0x3644e515 |
| ERC2612ExpiredSignature(uint256) | Fehler | 0x62791302 |
| ERC2612InvalidSigner(address,address) | Fehler | 0x4b800e46 |
| InvalidAccountNonce(address,uint256) | Fehler | 0x752d88c0 |
ERC-6093 Fehler 21
Quelle: EIP-6093: Custom errors for commonly-used tokens
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| ERC20InsufficientBalance(address,uint256,uint256) | Fehler | 0xe450d38c |
| ERC20InvalidSender(address) | Fehler | 0x96c6fd1e |
| ERC20InvalidReceiver(address) | Fehler | 0xec442f05 |
| ERC20InsufficientAllowance(address,uint256,uint256) | Fehler | 0xfb8f41b2 |
| ERC20InvalidApprover(address) | Fehler | 0xe602df05 |
| ERC20InvalidSpender(address) | Fehler | 0x94280d62 |
| ERC721InvalidOwner(address) | Fehler | 0x89c62b64 |
| ERC721NonexistentToken(uint256) | Fehler | 0x7e273289 |
| ERC721IncorrectOwner(address,uint256,address) | Fehler | 0x64283d7b |
| ERC721InvalidSender(address) | Fehler | 0x73c6ac6e |
| ERC721InvalidReceiver(address) | Fehler | 0x64a0ae92 |
| ERC721InsufficientApproval(address,uint256) | Fehler | 0x177e802f |
| ERC721InvalidApprover(address) | Fehler | 0xa9fbf51f |
| ERC721InvalidOperator(address) | Fehler | 0x5b08ba18 |
| ERC1155InsufficientBalance(address,uint256,uint256,uint256) | Fehler | 0x03dee4c5 |
| ERC1155InvalidSender(address) | Fehler | 0x01a83514 |
| ERC1155InvalidReceiver(address) | Fehler | 0x57f447ce |
| ERC1155MissingApprovalForAll(address,address) | Fehler | 0xe237d922 |
| ERC1155InvalidApprover(address) | Fehler | 0x3e31884e |
| ERC1155InvalidOperator(address) | Fehler | 0xced3e100 |
| ERC1155InvalidArrayLength(uint256,uint256) | Fehler | 0x5b059991 |
ERC-165 1 · ID 0x01ffc9a7
Quelle: EIP-165: Standard Interface Detection
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| supportsInterface(bytes4) | Funktion | 0x01ffc9a7 |
ERC-721 12 · ID 0x80ac58cd
Quelle: EIP-721: Non-Fungible Token Standard
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| balanceOf(address) | Funktion | 0x70a08231 |
| ownerOf(uint256) | Funktion | 0x6352211e |
| safeTransferFrom(address,address,uint256,bytes) | Funktion | 0xb88d4fde |
| safeTransferFrom(address,address,uint256) | Funktion | 0x42842e0e |
| transferFrom(address,address,uint256) | Funktion | 0x23b872dd |
| approve(address,uint256) | Funktion | 0x095ea7b3 |
| setApprovalForAll(address,bool) | Funktion | 0xa22cb465 |
| getApproved(uint256) | Funktion | 0x081812fc |
| isApprovedForAll(address,address) | Funktion | 0xe985e9c5 |
| Transfer(address,address,uint256) | Event | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
| Approval(address,address,uint256) | Event | 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925 |
| ApprovalForAll(address,address,bool) | Event | 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31 |
ERC-721 Metadata 3 · ID 0x5b5e139f
Quelle: EIP-721: Metadata-Erweiterung
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| name() | Funktion | 0x06fdde03 |
| symbol() | Funktion | 0x95d89b41 |
| tokenURI(uint256) | Funktion | 0xc87b56dd |
ERC-721 Enumerable 3 · ID 0x780e9d63
Quelle: EIP-721: Enumeration-Erweiterung
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| totalSupply() | Funktion | 0x18160ddd |
| tokenOfOwnerByIndex(address,uint256) | Funktion | 0x2f745c59 |
| tokenByIndex(uint256) | Funktion | 0x4f6ccce7 |
ERC-721 Receiver 1 · ID 0x150b7a02
Quelle: EIP-721: ERC721TokenReceiver
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| onERC721Received(address,address,uint256,bytes) | Funktion | 0x150b7a02 |
ERC-1155 10 · ID 0xd9b67a26
Quelle: EIP-1155: Multi Token Standard
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| balanceOf(address,uint256) | Funktion | 0x00fdd58e |
| balanceOfBatch(address[],uint256[]) | Funktion | 0x4e1273f4 |
| setApprovalForAll(address,bool) | Funktion | 0xa22cb465 |
| isApprovedForAll(address,address) | Funktion | 0xe985e9c5 |
| safeTransferFrom(address,address,uint256,uint256,bytes) | Funktion | 0xf242432a |
| safeBatchTransferFrom(address,address,uint256[],uint256[],bytes) | Funktion | 0x2eb2c2d6 |
| TransferSingle(address,address,address,uint256,uint256) | Event | 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62 |
| TransferBatch(address,address,address,uint256[],uint256[]) | Event | 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb |
| ApprovalForAll(address,address,bool) | Event | 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31 |
| URI(string,uint256) | Event | 0x6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b |
ERC-1155 Metadata URI 1 · ID 0x0e89341c
Quelle: EIP-1155: Metadata-Erweiterung
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| uri(uint256) | Funktion | 0x0e89341c |
ERC-1155 Receiver 2 · ID 0x4e2312e0
Quelle: EIP-1155: ERC1155TokenReceiver
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| onERC1155Received(address,address,uint256,uint256,bytes) | Funktion | 0xf23a6e61 |
| onERC1155BatchReceived(address,address,uint256[],uint256[],bytes) | Funktion | 0xbc197c81 |
ERC-2981 Royalties 1 · ID 0x2a55205a
Quelle: EIP-2981: NFT Royalty Standard
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| royaltyInfo(uint256,uint256) | Funktion | 0x2a55205a |
ERC-4906 Metadaten-Update 2
Quelle: EIP-4906: EIP-721 Metadata Update Extension
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| MetadataUpdate(uint256) | Event | 0xf8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7 |
| BatchMetadataUpdate(uint256,uint256) | Event | 0x6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c |
ERC-7572 contractURI 2
Quelle: ERC-7572: Contract-level metadata via contractURI()
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| contractURI() | Funktion | 0xe8a3d485 |
| ContractURIUpdated() | Event | 0xa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962 |
ERC-4626 Vault 18
Quelle: EIP-4626: Tokenized Vaults
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| asset() | Funktion | 0x38d52e0f |
| totalAssets() | Funktion | 0x01e1d114 |
| convertToShares(uint256) | Funktion | 0xc6e6f592 |
| convertToAssets(uint256) | Funktion | 0x07a2d13a |
| maxDeposit(address) | Funktion | 0x402d267d |
| previewDeposit(uint256) | Funktion | 0xef8b30f7 |
| deposit(uint256,address) | Funktion | 0x6e553f65 |
| maxMint(address) | Funktion | 0xc63d75b6 |
| previewMint(uint256) | Funktion | 0xb3d7f6b9 |
| mint(uint256,address) | Funktion | 0x94bf804d |
| maxWithdraw(address) | Funktion | 0xce96cb77 |
| previewWithdraw(uint256) | Funktion | 0x0a28a477 |
| withdraw(uint256,address,address) | Funktion | 0xb460af94 |
| maxRedeem(address) | Funktion | 0xd905777e |
| previewRedeem(uint256) | Funktion | 0x4cdad506 |
| redeem(uint256,address,address) | Funktion | 0xba087652 |
| Deposit(address,address,uint256,uint256) | Event | 0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7 |
| Withdraw(address,address,address,uint256,uint256) | Event | 0xfbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db |
ERC-1271 Signaturprüfung 1
Quelle: EIP-1271: Standard Signature Validation Method for Contracts
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| isValidSignature(bytes32,bytes) | Funktion | 0x1626ba7e |
ERC-5267 EIP-712-Domäne 2
Quelle: EIP-5267: Retrieval of EIP-712 domain
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| eip712Domain() | Funktion | 0x84b0196e |
| EIP712DomainChanged() | Event | 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31 |
Ownable 6
Quelle: OpenZeppelin v5.4.0: Ownable
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| owner() | Funktion | 0x8da5cb5b |
| renounceOwnership() | Funktion | 0x715018a6 |
| transferOwnership(address) | Funktion | 0xf2fde38b |
| OwnershipTransferred(address,address) | Event | 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 |
| OwnableUnauthorizedAccount(address) | Fehler | 0x118cdaa7 |
| OwnableInvalidOwner(address) | Fehler | 0x1e4fbdf7 |
Ownable2Step 3
Quelle: OpenZeppelin v5.4.0: Ownable2Step
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| pendingOwner() | Funktion | 0xe30c3978 |
| acceptOwnership() | Funktion | 0x79ba5097 |
| OwnershipTransferStarted(address,address) | Event | 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700 |
AccessControl 10 · ID 0x7965db0b
Quelle: OpenZeppelin v5.4.0: IAccessControl
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| hasRole(bytes32,address) | Funktion | 0x91d14854 |
| getRoleAdmin(bytes32) | Funktion | 0x248a9ca3 |
| grantRole(bytes32,address) | Funktion | 0x2f2ff15d |
| revokeRole(bytes32,address) | Funktion | 0xd547741f |
| renounceRole(bytes32,address) | Funktion | 0x36568abe |
| RoleAdminChanged(bytes32,bytes32,bytes32) | Event | 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff |
| RoleGranted(bytes32,address,address) | Event | 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d |
| RoleRevoked(bytes32,address,address) | Event | 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b |
| AccessControlUnauthorizedAccount(address,bytes32) | Fehler | 0xe2517d3f |
| AccessControlBadConfirmation() | Fehler | 0x6697b232 |
AccessControl-Rolle 1
Quelle: OpenZeppelin v5.4.0: AccessControl
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| DEFAULT_ADMIN_ROLE() | Funktion | 0xa217fddf |
AccessControlEnumerable 2 · ID 0x5a05180f
Quelle: OpenZeppelin v5.4.0: IAccessControlEnumerable
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| getRoleMember(bytes32,uint256) | Funktion | 0x9010d07c |
| getRoleMemberCount(bytes32) | Funktion | 0xca15c873 |
Pausable 5
Quelle: OpenZeppelin v5.4.0: Pausable
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| paused() | Funktion | 0x5c975abb |
| Paused(address) | Event | 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258 |
| Unpaused(address) | Event | 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa |
| EnforcedPause() | Fehler | 0xd93c0665 |
| ExpectedPause() | Fehler | 0x8dfc202b |
Votes (Governance) 9
Quelle: OpenZeppelin v5.4.0: IVotes
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| getVotes(address) | Funktion | 0x9ab24eb0 |
| getPastVotes(address,uint256) | Funktion | 0x3a46b1a8 |
| getPastTotalSupply(uint256) | Funktion | 0x8e539e8c |
| delegates(address) | Funktion | 0x587cde1e |
| delegate(address) | Funktion | 0x5c19a95c |
| delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32) | Funktion | 0xc3cda520 |
| DelegateChanged(address,address,address) | Event | 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f |
| DelegateVotesChanged(address,uint256,uint256) | Event | 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724 |
| VotesExpiredSignature(uint256) | Fehler | 0x4683af0e |
OpenZeppelin-Hilfsfehler 14
Quelle: OpenZeppelin v5.4.0: Address, Errors, SafeERC20, ECDSA, ReentrancyGuard, Initializable
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| Initialized(uint64) | Event | 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2 |
| ReentrancyGuardReentrantCall() | Fehler | 0x3ee5aeb5 |
| AddressEmptyCode(address) | Fehler | 0x9996b315 |
| FailedCall() | Fehler | 0xd6bda275 |
| FailedDeployment() | Fehler | 0xb06ebf3d |
| InsufficientBalance(uint256,uint256) | Fehler | 0xcf479181 |
| MissingPrecompile(address) | Fehler | 0x42b01bce |
| SafeERC20FailedOperation(address) | Fehler | 0x5274afe7 |
| SafeERC20FailedDecreaseAllowance(address,uint256,uint256) | Fehler | 0xe570110f |
| ECDSAInvalidSignature() | Fehler | 0xf645eedf |
| ECDSAInvalidSignatureLength(uint256) | Fehler | 0xfce698f7 |
| ECDSAInvalidSignatureS(bytes32) | Fehler | 0xd78bce0c |
| InvalidInitialization() | Fehler | 0xf92ee8a9 |
| NotInitializing() | Fehler | 0xd7e6bcf8 |
Proxy (EIP-1967, UUPS, Transparent, Beacon) 17
Quelle: EIP-1967 und OpenZeppelin v5.4.0: proxy/
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| upgradeToAndCall(address,bytes) | Funktion | 0x4f1ef286 |
| proxiableUUID() | Funktion | 0x52d1902d |
| UPGRADE_INTERFACE_VERSION() | Funktion | 0xad3cb1cc |
| upgradeAndCall(address,address,bytes) | Funktion | 0x9623609d |
| implementation() | Funktion | 0x5c60da1b |
| upgradeTo(address) | Funktion | 0x3659cfe6 |
| Upgraded(address) | Event | 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b |
| AdminChanged(address,address) | Event | 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f |
| BeaconUpgraded(address) | Event | 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e |
| ERC1967InvalidImplementation(address) | Fehler | 0x4c9c8ce3 |
| ERC1967InvalidAdmin(address) | Fehler | 0x62e77ba2 |
| ERC1967InvalidBeacon(address) | Fehler | 0x64ced0ec |
| ERC1967NonPayable() | Fehler | 0xb398979f |
| UUPSUnauthorizedCallContext() | Fehler | 0xe07c8dba |
| UUPSUnsupportedProxiableUUID(bytes32) | Fehler | 0xaa1d49a4 |
| ProxyDeniedAdminAccess() | Fehler | 0xd2b576ec |
| BeaconInvalidImplementation(address) | Fehler | 0x847ac564 |
Proxy (OpenZeppelin 4.x) 6
Quelle: OpenZeppelin v4.9.6: TransparentUpgradeableProxy, Initializable
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| admin() | Funktion | 0xf851a440 |
| implementation() | Funktion | 0x5c60da1b |
| changeAdmin(address) | Funktion | 0x8f283970 |
| upgradeTo(address) | Funktion | 0x3659cfe6 |
| upgradeToAndCall(address,bytes) | Funktion | 0x4f1ef286 |
| Initialized(uint8) | Event | 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498 |
EIP-2535 DiamondCut 2 · ID 0x1f931c1c
Quelle: EIP-2535: Diamonds, Multi-Facet Proxy
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| diamondCut((address,uint8,bytes4[])[],address,bytes) | Funktion | 0x1f931c1c |
| DiamondCut((address,uint8,bytes4[])[],address,bytes) | Event | 0x8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673 |
EIP-2535 DiamondLoupe 4 · ID 0x48e2b093
Quelle: EIP-2535: Diamonds, Loupe-Funktionen
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| facets() | Funktion | 0x7a0ed627 |
| facetFunctionSelectors(address) | Funktion | 0xadfca15e |
| facetAddresses() | Funktion | 0x52ef6b2c |
| facetAddress(bytes4) | Funktion | 0xcdffacc6 |
Multicall3 16
Quelle: Multicall3 (mds1/multicall3)
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| aggregate((address,bytes)[]) | Funktion | 0x252dba42 |
| tryAggregate(bool,(address,bytes)[]) | Funktion | 0xbce38bd7 |
| tryBlockAndAggregate(bool,(address,bytes)[]) | Funktion | 0x399542e9 |
| blockAndAggregate((address,bytes)[]) | Funktion | 0xc3077fa9 |
| aggregate3((address,bool,bytes)[]) | Funktion | 0x82ad56cb |
| aggregate3Value((address,bool,uint256,bytes)[]) | Funktion | 0x174dea71 |
| getBlockHash(uint256) | Funktion | 0xee82ac5e |
| getBlockNumber() | Funktion | 0x42cbb15c |
| getCurrentBlockCoinbase() | Funktion | 0xa8b0574e |
| getCurrentBlockDifficulty() | Funktion | 0x72425d9d |
| getCurrentBlockGasLimit() | Funktion | 0x86d516e8 |
| getCurrentBlockTimestamp() | Funktion | 0x0f28c97d |
| getEthBalance(address) | Funktion | 0x4d2301cc |
| getLastBlockHash() | Funktion | 0x27e86d6e |
| getBasefee() | Funktion | 0x3e64a696 |
| getChainId() | Funktion | 0x3408e470 |
Multicall (OpenZeppelin, Uniswap) 3
Quelle: Uniswap swap-router-contracts: IMulticallExtended
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| multicall(bytes[]) | Funktion | 0xac9650d8 |
| multicall(uint256,bytes[]) | Funktion | 0x5ae401dc |
| multicall(bytes32,bytes[]) | Funktion | 0x1f0464d1 |
Uniswap V2 Router 24
Quelle: Uniswap v2-periphery: IUniswapV2Router02
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| factory() | Funktion | 0xc45a0155 |
| WETH() | Funktion | 0xad5c4648 |
| addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256) | Funktion | 0xe8e33700 |
| addLiquidityETH(address,uint256,uint256,uint256,address,uint256) | Funktion | 0xf305d719 |
| removeLiquidity(address,address,uint256,uint256,uint256,address,uint256) | Funktion | 0xbaa2abde |
| removeLiquidityETH(address,uint256,uint256,uint256,address,uint256) | Funktion | 0x02751cec |
| removeLiquidityWithPermit(address,address,uint256,uint256,uint256,address,uint256,bool,uint8,bytes32,bytes32) | Funktion | 0x2195995c |
| removeLiquidityETHWithPermit(address,uint256,uint256,uint256,address,uint256,bool,uint8,bytes32,bytes32) | Funktion | 0xded9382a |
| swapExactTokensForTokens(uint256,uint256,address[],address,uint256) | Funktion | 0x38ed1739 |
| swapTokensForExactTokens(uint256,uint256,address[],address,uint256) | Funktion | 0x8803dbee |
| swapExactETHForTokens(uint256,address[],address,uint256) | Funktion | 0x7ff36ab5 |
| swapTokensForExactETH(uint256,uint256,address[],address,uint256) | Funktion | 0x4a25d94a |
| swapExactTokensForETH(uint256,uint256,address[],address,uint256) | Funktion | 0x18cbafe5 |
| swapETHForExactTokens(uint256,address[],address,uint256) | Funktion | 0xfb3bdb41 |
| quote(uint256,uint256,uint256) | Funktion | 0xad615dec |
| getAmountOut(uint256,uint256,uint256) | Funktion | 0x054d50d4 |
| getAmountIn(uint256,uint256,uint256) | Funktion | 0x85f8c259 |
| getAmountsOut(uint256,address[]) | Funktion | 0xd06ca61f |
| getAmountsIn(uint256,address[]) | Funktion | 0x1f00ca74 |
| removeLiquidityETHSupportingFeeOnTransferTokens(address,uint256,uint256,uint256,address,uint256) | Funktion | 0xaf2979eb |
| removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address,uint256,uint256,uint256,address,uint256,bool,uint8,bytes32,bytes32) | Funktion | 0x5b0d5984 |
| swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256) | Funktion | 0x5c11d795 |
| swapExactETHForTokensSupportingFeeOnTransferTokens(uint256,address[],address,uint256) | Funktion | 0xb6f9de95 |
| swapExactTokensForETHSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256) | Funktion | 0x791ac947 |
Uniswap V2 Pair 19
Quelle: Uniswap v2-core: IUniswapV2Pair
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| PERMIT_TYPEHASH() | Funktion | 0x30adf81f |
| MINIMUM_LIQUIDITY() | Funktion | 0xba9a7a56 |
| factory() | Funktion | 0xc45a0155 |
| token0() | Funktion | 0x0dfe1681 |
| token1() | Funktion | 0xd21220a7 |
| getReserves() | Funktion | 0x0902f1ac |
| price0CumulativeLast() | Funktion | 0x5909c0d5 |
| price1CumulativeLast() | Funktion | 0x5a3d5493 |
| kLast() | Funktion | 0x7464fc3d |
| mint(address) | Funktion | 0x6a627842 |
| burn(address) | Funktion | 0x89afcb44 |
| swap(uint256,uint256,address,bytes) | Funktion | 0x022c0d9f |
| skim(address) | Funktion | 0xbc25cf77 |
| sync() | Funktion | 0xfff6cae9 |
| initialize(address,address) | Funktion | 0x485cc955 |
| Mint(address,uint256,uint256) | Event | 0x4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f |
| Burn(address,uint256,uint256,address) | Event | 0xdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496 |
| Swap(address,uint256,uint256,uint256,uint256,address) | Event | 0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822 |
| Sync(uint112,uint112) | Event | 0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1 |
Uniswap V2 Factory 10
Quelle: Uniswap v2-core: IUniswapV2Factory, IUniswapV2Callee
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| feeTo() | Funktion | 0x017e7e58 |
| feeToSetter() | Funktion | 0x094b7415 |
| getPair(address,address) | Funktion | 0xe6a43905 |
| allPairs(uint256) | Funktion | 0x1e3dd18b |
| allPairsLength() | Funktion | 0x574f2ba3 |
| createPair(address,address) | Funktion | 0xc9c65396 |
| setFeeTo(address) | Funktion | 0xf46901ed |
| setFeeToSetter(address) | Funktion | 0xa2e74af6 |
| uniswapV2Call(address,uint256,uint256,bytes) | Funktion | 0x10d1e85c |
| PairCreated(address,address,address,uint256) | Event | 0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9 |
Uniswap V3 Pool 36
Quelle: Uniswap v3-core: IUniswapV3Pool (Actions, State, Immutables, DerivedState, Events)
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| initialize(uint160) | Funktion | 0xf637731d |
| mint(address,int24,int24,uint128,bytes) | Funktion | 0x3c8a7d8d |
| collect(address,int24,int24,uint128,uint128) | Funktion | 0x4f1eb3d8 |
| burn(int24,int24,uint128) | Funktion | 0xa34123a7 |
| swap(address,bool,int256,uint160,bytes) | Funktion | 0x128acb08 |
| flash(address,uint256,uint256,bytes) | Funktion | 0x490e6cbc |
| increaseObservationCardinalityNext(uint16) | Funktion | 0x32148f67 |
| slot0() | Funktion | 0x3850c7bd |
| feeGrowthGlobal0X128() | Funktion | 0xf3058399 |
| feeGrowthGlobal1X128() | Funktion | 0x46141319 |
| protocolFees() | Funktion | 0x1ad8b03b |
| liquidity() | Funktion | 0x1a686502 |
| ticks(int24) | Funktion | 0xf30dba93 |
| tickBitmap(int16) | Funktion | 0x5339c296 |
| positions(bytes32) | Funktion | 0x514ea4bf |
| observations(uint256) | Funktion | 0x252c09d7 |
| factory() | Funktion | 0xc45a0155 |
| token0() | Funktion | 0x0dfe1681 |
| token1() | Funktion | 0xd21220a7 |
| fee() | Funktion | 0xddca3f43 |
| tickSpacing() | Funktion | 0xd0c93a7c |
| maxLiquidityPerTick() | Funktion | 0x70cf754a |
| observe(uint32[]) | Funktion | 0x883bdbfd |
| snapshotCumulativesInside(int24,int24) | Funktion | 0xa38807f2 |
| uniswapV3SwapCallback(int256,int256,bytes) | Funktion | 0xfa461e33 |
| uniswapV3MintCallback(uint256,uint256,bytes) | Funktion | 0xd3487997 |
| uniswapV3FlashCallback(uint256,uint256,bytes) | Funktion | 0xe9cbafb0 |
| Initialize(uint160,int24) | Event | 0x98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95 |
| Mint(address,address,int24,int24,uint128,uint256,uint256) | Event | 0x7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde |
| Collect(address,address,int24,int24,uint128,uint128) | Event | 0x70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0 |
| Burn(address,int24,int24,uint128,uint256,uint256) | Event | 0x0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c |
| Swap(address,address,int256,int256,uint160,uint128,int24) | Event | 0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67 |
| Flash(address,address,uint256,uint256,uint256,uint256) | Event | 0xbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca633 |
| IncreaseObservationCardinalityNext(uint16,uint16) | Event | 0xac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a |
| SetFeeProtocol(uint8,uint8,uint8,uint8) | Event | 0x973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b133 |
| CollectProtocol(address,address,uint128,uint128) | Event | 0x596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151 |
Uniswap V3 Factory 9
Quelle: Uniswap v3-core: IUniswapV3Factory
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| owner() | Funktion | 0x8da5cb5b |
| feeAmountTickSpacing(uint24) | Funktion | 0x22afcccb |
| getPool(address,address,uint24) | Funktion | 0x1698ee82 |
| createPool(address,address,uint24) | Funktion | 0xa1671295 |
| setOwner(address) | Funktion | 0x13af4035 |
| enableFeeAmount(uint24,int24) | Funktion | 0x8a7c195f |
| OwnerChanged(address,address) | Event | 0xb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c |
| PoolCreated(address,address,uint24,int24,address) | Event | 0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118 |
| FeeAmountEnabled(uint24,int24) | Event | 0xc66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc |
Uniswap V3 SwapRouter 11
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| exactInputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160)) | Funktion | 0x414bf389 |
| exactInput((bytes,address,uint256,uint256,uint256)) | Funktion | 0xc04b8d59 |
| exactOutputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160)) | Funktion | 0xdb3e2198 |
| exactOutput((bytes,address,uint256,uint256,uint256)) | Funktion | 0xf28c0498 |
| exactInputSingle((address,address,uint24,address,uint256,uint256,uint160)) | Funktion | 0x04e45aaf |
| exactInput((bytes,address,uint256,uint256)) | Funktion | 0xb858183f |
| exactOutputSingle((address,address,uint24,address,uint256,uint256,uint160)) | Funktion | 0x5023b4df |
| exactOutput((bytes,address,uint256,uint256)) | Funktion | 0x09b81346 |
| unwrapWETH9(uint256,address) | Funktion | 0x49404b7c |
| refundETH() | Funktion | 0x12210e8a |
| sweepToken(address,uint256,address) | Funktion | 0xdf2ab5bb |
Uniswap V3 Positionen 9
Quelle: Uniswap v3-periphery: INonfungiblePositionManager
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| positions(uint256) | Funktion | 0x99fbab88 |
| mint((address,address,uint24,int24,int24,uint256,uint256,uint256,uint256,address,uint256)) | Funktion | 0x88316456 |
| increaseLiquidity((uint256,uint256,uint256,uint256,uint256,uint256)) | Funktion | 0x219f5d17 |
| decreaseLiquidity((uint256,uint128,uint256,uint256,uint256)) | Funktion | 0x0c49ccbe |
| collect((uint256,address,uint128,uint128)) | Funktion | 0xfc6f7865 |
| burn(uint256) | Funktion | 0x42966c68 |
| IncreaseLiquidity(uint256,uint128,uint256,uint256) | Event | 0x3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f |
| DecreaseLiquidity(uint256,uint128,uint256,uint256) | Event | 0x26f6a048ee9138f2c0ce266f322cb99228e8d619ae2bff30c67f8dcf9d2377b4 |
| Collect(uint256,address,uint256,uint256) | Event | 0x40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f01 |
Uniswap Universal Router 9
Quelle: Uniswap universal-router: UniversalRouter, IUniversalRouter
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| execute(bytes,bytes[],uint256) | Funktion | 0x3593564c |
| execute(bytes,bytes[]) | Funktion | 0x24856bc3 |
| executeSigned(bytes,bytes[],bytes32,bytes32,bool,bytes32,bytes,uint256) | Funktion | 0x44684dc3 |
| signedRouteContext() | Funktion | 0xd04d79a2 |
| ExecutionFailed(uint256,bytes) | Fehler | 0x2c4029e9 |
| ETHNotAccepted() | Fehler | 0x1231ae40 |
| TransactionDeadlinePassed() | Fehler | 0x5bf6f916 |
| LengthMismatch() | Fehler | 0xff633a38 |
| InvalidEthSender() | Fehler | 0x38bbd576 |
Permit2 31
Quelle: Uniswap permit2: IAllowanceTransfer, ISignatureTransfer, PermitErrors, SignatureVerification
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| allowance(address,address,address) | Funktion | 0x927da105 |
| approve(address,address,uint160,uint48) | Funktion | 0x87517c45 |
| permit(address,((address,uint160,uint48,uint48),address,uint256),bytes) | Funktion | 0x2b67b570 |
| permit(address,((address,uint160,uint48,uint48)[],address,uint256),bytes) | Funktion | 0x2a2d80d1 |
| transferFrom(address,address,uint160,address) | Funktion | 0x36c78516 |
| transferFrom((address,address,uint160,address)[]) | Funktion | 0x0d58b1db |
| lockdown((address,address)[]) | Funktion | 0xcc53287f |
| invalidateNonces(address,address,uint48) | Funktion | 0x65d9723c |
| nonceBitmap(address,uint256) | Funktion | 0x4fe02b44 |
| permitTransferFrom(((address,uint256),uint256,uint256),(address,uint256),address,bytes) | Funktion | 0x30f28b7a |
| permitWitnessTransferFrom(((address,uint256),uint256,uint256),(address,uint256),address,bytes32,string,bytes) | Funktion | 0x137c29fe |
| permitTransferFrom(((address,uint256)[],uint256,uint256),(address,uint256)[],address,bytes) | Funktion | 0xedd9444b |
| permitWitnessTransferFrom(((address,uint256)[],uint256,uint256),(address,uint256)[],address,bytes32,string,bytes) | Funktion | 0xfe8ec1a7 |
| invalidateUnorderedNonces(uint256,uint256) | Funktion | 0x3ff9dcb1 |
| DOMAIN_SEPARATOR() | Funktion | 0x3644e515 |
| NonceInvalidation(address,address,address,uint48,uint48) | Event | 0x55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f3 |
| Approval(address,address,address,uint160,uint48) | Event | 0xda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b |
| Permit(address,address,address,uint160,uint48,uint48) | Event | 0xc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec |
| Lockdown(address,address,address) | Event | 0x89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4 |
| UnorderedNonceInvalidation(address,uint256,uint256) | Event | 0x3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d |
| AllowanceExpired(uint256) | Fehler | 0xd81b2f2e |
| InsufficientAllowance(uint256) | Fehler | 0xf96fb071 |
| ExcessiveInvalidation() | Fehler | 0x24d35a26 |
| InvalidAmount(uint256) | Fehler | 0x3728b83d |
| LengthMismatch() | Fehler | 0xff633a38 |
| SignatureExpired(uint256) | Fehler | 0xcd21db4f |
| InvalidNonce() | Fehler | 0x756688fe |
| InvalidSignatureLength() | Fehler | 0x4be6321b |
| InvalidSignature() | Fehler | 0x8baa579f |
| InvalidSigner() | Fehler | 0x815e1d64 |
| InvalidContractSignature() | Fehler | 0xb0669cbc |
Safe (Multisig) 46
Quelle: Safe Smart Account v1.4.1: Safe, OwnerManager, ModuleManager, GuardManager, FallbackManager
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| setup(address[],uint256,address,bytes,address,address,uint256,address) | Funktion | 0xb63e800d |
| execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes) | Funktion | 0x6a761202 |
| checkSignatures(bytes32,bytes,bytes) | Funktion | 0x934f3a11 |
| checkNSignatures(bytes32,bytes,bytes,uint256) | Funktion | 0x12fb68e0 |
| approveHash(bytes32) | Funktion | 0xd4d9bdcd |
| domainSeparator() | Funktion | 0xf698da25 |
| encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256) | Funktion | 0xe86637db |
| getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256) | Funktion | 0xd8d11f78 |
| VERSION() | Funktion | 0xffa1ad74 |
| nonce() | Funktion | 0xaffed0e0 |
| signedMessages(bytes32) | Funktion | 0x5ae6bd37 |
| approvedHashes(address,bytes32) | Funktion | 0x7d832974 |
| addOwnerWithThreshold(address,uint256) | Funktion | 0x0d582f13 |
| removeOwner(address,address,uint256) | Funktion | 0xf8dc5dd9 |
| swapOwner(address,address,address) | Funktion | 0xe318b52b |
| changeThreshold(uint256) | Funktion | 0x694e80c3 |
| getThreshold() | Funktion | 0xe75235b8 |
| isOwner(address) | Funktion | 0x2f54bf6e |
| getOwners() | Funktion | 0xa0e67e2b |
| enableModule(address) | Funktion | 0x610b5925 |
| disableModule(address,address) | Funktion | 0xe009cfde |
| execTransactionFromModule(address,uint256,bytes,uint8) | Funktion | 0x468721a7 |
| execTransactionFromModuleReturnData(address,uint256,bytes,uint8) | Funktion | 0x5229073f |
| isModuleEnabled(address) | Funktion | 0x2d9ad53d |
| getModulesPaginated(address,uint256) | Funktion | 0xcc2f8452 |
| setGuard(address) | Funktion | 0xe19a9dd9 |
| setFallbackHandler(address) | Funktion | 0xf08a0323 |
| getStorageAt(uint256,uint256) | Funktion | 0x5624b25b |
| simulateAndRevert(address,bytes) | Funktion | 0xb4faba09 |
| getChainId() | Funktion | 0x3408e470 |
| checkTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes,address) | Funktion | 0x75f0bb52 |
| checkAfterExecution(bytes32,bool) | Funktion | 0x93271368 |
| SafeSetup(address,address[],uint256,address,address) | Event | 0x141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8 |
| ApproveHash(bytes32,address) | Event | 0xf2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c |
| SignMsg(bytes32) | Event | 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4 |
| ExecutionFailure(bytes32,uint256) | Event | 0x23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23 |
| ExecutionSuccess(bytes32,uint256) | Event | 0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e |
| AddedOwner(address) | Event | 0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26 |
| RemovedOwner(address) | Event | 0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf |
| ChangedThreshold(uint256) | Event | 0x610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93 |
| EnabledModule(address) | Event | 0xecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440 |
| DisabledModule(address) | Event | 0xaab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276 |
| ExecutionFromModuleSuccess(address) | Event | 0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8 |
| ExecutionFromModuleFailure(address) | Event | 0xacd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375 |
| ChangedGuard(address) | Event | 0x1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2 |
| ChangedFallbackHandler(address) | Event | 0x5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0 |
Safe ProxyFactory und MultiSend 6
Quelle: Safe Smart Account v1.4.1: SafeProxyFactory, MultiSend
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| proxyCreationCode() | Funktion | 0x53e5d935 |
| createProxyWithNonce(address,bytes,uint256) | Funktion | 0x1688f0b9 |
| createChainSpecificProxyWithNonce(address,bytes,uint256) | Funktion | 0xec9e80bb |
| createProxyWithCallback(address,bytes,uint256,address) | Funktion | 0xd18af54d |
| multiSend(bytes) | Funktion | 0x8d80ff0a |
| ProxyCreation(address,address) | Event | 0x4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235 |
WETH9 4
Quelle: WETH9 (gnosis/canonical-weth)
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| deposit() | Funktion | 0xd0e30db0 |
| withdraw(uint256) | Funktion | 0x2e1a7d4d |
| Deposit(address,uint256) | Event | 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c |
| Withdrawal(address,uint256) | Event | 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65 |
Chainlink Preis-Feed 5
Quelle: Chainlink: AggregatorV3Interface
| Signatur | Art | Selektor bzw. Topic0 |
|---|---|---|
| decimals() | Funktion | 0x313ce567 |
| description() | Funktion | 0x7284e416 |
| version() | Funktion | 0x54fd4d50 |
| getRoundData(uint80) | Funktion | 0x9a6fc8f5 |
| latestRoundData() | Funktion | 0xfeaf968c |
07 / VORGEHEN
So prüfen Sie Selektoren in der Praxis
- Signatur aus dem verifizierten Quelltext nehmen. Nicht aus einem Forum und nicht aus einer Datenbank. Ganze Dateien samt struct- und enum-Definitionen können Sie direkt einfügen.
- Selektor im Bytecode suchen. Steht der Wert nicht im Code des Vertrags, hat er die Funktion nicht, egal was die Oberfläche sagt.
- Bei Proxys die Implementierung lesen. Ihre Adresse steht im EIP-1967-Speicherplatz. Proxy und Implementierung zusammen in den Rechner geben, Kollisionen prüfen.
- Events über das Topic0 filtern und an der Zahl der Topics prüfen, welcher Standard dahintersteht.
- Fehler entschlüsseln. Die ersten 4 Byte der Rückgabe nachschlagen; Text und Argumente zeigt der Calldata-Decoder.
Wo der Rechner aufhört
- Keine Blockchain. Er rechnet aus Text. Ob ein Vertrag eine Funktion hat, zeigt erst sein Bytecode.
- Unbekannte Typen. Ist ein struct oder enum nicht mit eingefügt, rechnet er die Signatur nicht. Namen nach dem Muster IName wertet er als Interface und sagt das dazu.
- Bibliotheken. Externe Bibliotheksfunktionen mit storage-, struct- oder enum-Parametern folgen einer eigenen Regel und bleiben außen vor.
- Rückwärtssuche als Kandidat. Die Liste ist kuratiert, nicht vollständig. Ein Treffer ist eine passende Signatur, kein Beweis.
Mehr Werkzeuge rund um Verträge und Wallets stehen in der Web3-Übersicht, darunter der Gas-Rechner. Wie wir Smart Contracts und die Oberflächen dazu bauen, steht unter Web3-Entwicklung.
08 / FORSCHUNG
Was die Forschung dazu sagt
Fünf Befunde, die das Werkzeug prägen. Die vollständige Liste mit Prüfvermerk steht weiter unten.
- Selektoren stecken im Bytecode. Decompiler lesen über 99,98 Prozent der Verträge Grech u. a. 2019, Signaturen samt Typen lassen sich zu 98,7 Prozent zurückgewinnen Chen u. a. 2022. Darum verweist der Rechner bei jeder Unsicherheit auf den Bytecode.
- Wenige Standards decken viel ab. Verträge sind stark kopiert He u. a. 2020 und bestehen großteils aus fremden Bausteinen Sun u. a. 2023. Deshalb ist die Liste nach Bibliotheken gegliedert und nennt die Version.
- Selektoren beweisen keinen Standard. Token lassen sich am Interface erkennen, solche ohne Standard nur am Verhalten Fröwis u. a. 2019.
- Proxys sind häufig, Kollisionen auch. Mehr als jeder zweite aktive Vertrag ist ein Proxy, rund 1,5 Millionen zeigen eine Kollision Chen u. a. 2025. Der Rechner prüft deshalb über Vertragsgrenzen hinweg.
- Speicher braucht feste Plätze. Speicherkollisionen sind ein eigenes Risiko Ruaro u. a. 2024; die EIP-1967-Plätze erkennt der Rechner beim Nachschlagen.
09 / FÜR KI-ASSISTENTEN
Dieses Werkzeug aus einem KI-Assistenten nutzen
Assistenten wie Claude oder ChatGPT, die das Model Context Protocol (MCP) sprechen, können die Rechnung dieser Seite direkt aufrufen, statt sie nachzubauen. Der Server ist öffentlich, braucht keine Anmeldung und speichert nichts. Die Antwort enthält immer den Link auf diese Seite, den Stand der Daten und die Grenzen des Ergebnisses.
- Endpunkt
- https://aureum-tech.com/mcp
- Werkzeug
- werkzeug_selektor_rechner
- Transport
- Streamable HTTP, nur lesend
| Name | Pflicht | Bedeutung |
|---|---|---|
| eingabe | ja | Was berechnet oder nachgeschlagen werden soll, als Text: eine Signatur („transfer(address,uint256)"), eine oder mehrere Zeilen Solidity („function transfer(address to, uint amount) external returns (bool);", „event Transfer(address indexed from, …)", „error X(uint256)"), ein ganzer Vertrag oder ein Interface mit struct-, enum- und type-Definitionen, eine ABI als JSON (auch ein Hardhat-/Foundry-Artefakt mit „abi") oder Hex-Werte zum Nachschlagen (4-Byte-Selektor, 32-Byte-Topic, Calldata). |
Fragen, bei denen ein Assistent es aufrufen sollte
- „Welcher Funktions-Selektor gehört zu transfer(address,uint256)?"
- „Zu welcher Funktion gehört der Selektor 0x095ea7b3?"
- „Wie lautet das Topic0 für event Transfer(address indexed from, address indexed to, uint256 value)?"
- „Rechne mir aus dieser ABI alle Selektoren aus und prüfe, ob zwei Funktionen kollidieren."
- „Welche Interface-ID nach ERC-165 hat dieses Solidity-Interface?"
Wie die Anbindung funktioniert und was MCP im eigenen Betrieb leisten kann, steht auf der Seite zu MCP-Integrationen.
10 / HÄUFIGE FRAGEN
Häufige Fragen zu Selektoren und Topics
Was ist ein Funktions-Selektor?
Die ersten 4 Byte der Calldata, mit denen eine Transaktion sagt, welche Funktion eines Vertrags laufen soll. Sie sind die ersten 4 Byte des Keccak-256-Hashes der kanonischen Signatur, also Name und Parametertypen ohne Leerzeichen, Parameternamen und Rückgabe. Aus transfer(address,uint256) wird 0xa9059cbb, aus approve(address,uint256) 0x095ea7b3.
Wie berechne ich den Selektor einer Funktion mit struct-Parameter?
Das struct wird zum Tupel: seine Feldtypen in Klammern, in der Reihenfolge der Deklaration, verschachtelte structs ebenso. Ein enum wird uint8, ein Vertrag oder Interface address. exactInputSingle von Uniswap V3 nimmt ein struct mit acht Feldern und lautet kanonisch exactInputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160)), Selektor 0x414bf389. Fügen Sie dem Rechner die struct-Definition mit ein, dann löst er das selbst auf.
Warum haben Transfer bei ERC-20 und ERC-721 dasselbe Topic0?
Beide Events heißen Transfer(address,address,uint256), also ist auch der Hash gleich: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. Die indexierten Parameter gehören nicht zur Signatur. Unterscheiden lassen sich die beiden an der Zahl der Topics: ERC-20 indexiert Absender und Empfänger (drei Topics), ERC-721 zusätzlich die Token-ID (vier Topics).
Kann man aus einem Selektor die Funktion zurückrechnen?
Nein, ein Hash lässt sich nicht umkehren. Man kann nur nachsehen, welche bekannte Signatur denselben Wert ergibt. Der Rechner kennt 401 Signaturen verbreiteter Standards und Bibliotheken, öffentliche Datenbanken kennen Millionen. Weil 4 Byte nur rund 4,3 Milliarden Werte haben, lassen sich passende Signaturen gezielt erzeugen; ein Treffer ist deshalb ein Kandidat, keine Gewissheit.
Was bedeutet 0x08c379a0 in einer fehlgeschlagenen Transaktion?
0x08c379a0 ist der Selektor von Error(string): Der Vertrag hat mit require oder revert und einem Text abgebrochen, der Text folgt ABI-kodiert dahinter. 0x4e487b71 steht für Panic(uint256), etwa bei einem Überlauf (Code 0x11) oder einer Division durch null (0x12). Eigene Fehler wie ERC20InsufficientBalance haben eigene Selektoren, die der Rechner nachschlägt.
Was ist eine Interface-ID nach ERC-165?
Das XOR der Selektoren aller Funktionen, die ein Interface selbst deklariert. Ein Vertrag meldet über supportsInterface(bytes4), welche Interfaces er umsetzt. ERC-721 hat die ID 0x80ac58cd, ERC-1155 0xd9b67a26. Fügen Sie ein Interface im Quelltext ein, dann rechnet das Werkzeug die ID mit.
Wo hört der Selektor-Rechner auf?
Er bildet Signaturen nach der ABI-Spezifikation und schlägt in einer kuratierten Liste nach. Er liest keine Blockchain, also weiß er nicht, ob ein bestimmter Vertrag eine Funktion wirklich hat, und hinter einem Proxy kann sich die Implementierung jederzeit ändern. Bibliotheksfunktionen mit storage-, struct- oder enum-Parametern rechnet er nicht. Wenn Sie Verträge und die Anwendung dazu brauchen, entwickeln wir das mit Ihnen.
11 / STUDIEN UND QUELLEN
Worauf sich das Werkzeug stützt
Die Richtwerte und Hinweise oben beruhen auf diesen 14 wissenschaftlichen Arbeiten. Jede ist über ihren DOI bzw. die Seite des Verlags geprüft (zuletzt am 14. November 2026): Es gibt sie, sie ist nicht zurückgezogen, und ihr Befund trägt für die Frage heute noch.
Chen, T.; Li, Z.; Luo, X. u. a. (2022): SigRec: Automatic Recovery of Function Signatures in Smart Contracts. IEEE Transactions on Software Engineering 48 (8), S. 3066–3086
Befund Bytecode enthält keine Typinformation; bisherige Werkzeuge stützten sich auf unvollständige Datenbanken bekannter Signaturen. SigRec liest Selektor und Parametertypen aus dem Verhalten der EVM und trifft in 98,7 Prozent der Fälle.
Im Werkzeug Begründet, warum die Rückwärtssuche nur Kandidaten liefert: Eine Liste kennt nur, was jemand eingetragen hat; Gewissheit gibt erst der Bytecode.
doi.org/10.1109/TSE.2021.3078342 · Fachzeitschrift
Grech, N.; Brent, L.; Scholz, B.; Smaragdakis, Y. (2019): Gigahorse: Thorough, Declarative Decompilation of Smart Contracts. IEEE/ACM 41st International Conference on Software Engineering (ICSE), S. 1176–1186
Befund Ein Decompiler kann über 99,98 Prozent der veröffentlichten Verträge aus dem Bytecode in eine lesbare Zwischenform bringen, ohne den Quelltext zu kennen.
Im Werkzeug Stützt den Hinweis, dass sich die Selektoren eines Vertrags aus seinem Bytecode lesen lassen, auch wenn er nicht verifiziert ist.
doi.org/10.1109/ICSE.2019.00120 · Konferenzbeitrag
Grech, N.; Lagouvardos, S.; Tsatiris, I.; Smaragdakis, Y. (2022): Elipmoc: advanced decompilation of Ethereum smart contracts. Proceedings of the ACM on Programming Languages 6 (OOPSLA1), S. 1–27
Befund Der Nachfolger von Gigahorse leitet Argumente und Rückgaben der Funktionen ab und löst 99,5 Prozent der Operanden auf (Gigahorse: 62,8 Prozent); er deckt deutlich mehr ab als der Decompiler im Block-Explorer.
Im Werkzeug Zeigt, dass Parametertypen aus dem Bytecode erschlossen werden; der Rechner sagt deshalb, eine gefundene Signatur sei ein Kandidat, keine Gewissheit.
doi.org/10.1145/3527321 · Fachzeitschrift
Liu, X.; Hua, B.; Wang, Y.; Pan, Z. (2023): An Empirical Study of Smart Contract Decompilers. IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER), S. 1–12
Befund Erste große Vergleichsstudie von fünf Decompilern: Die Autoren benennen wiederkehrende Ursachen für Fehlschläge und unvollständige Ergebnisse und raten, das Werkzeug je nach Zweck zu wählen, statt dem Ergebnis blind zu trauen.
Im Werkzeug Begründet die Grenze: Wer wissen muss, was ein Vertrag tut, braucht den geprüften Quelltext, nicht nur dekompilierte Selektoren.
doi.org/10.1109/SANER56733.2023.00011 · Konferenzbeitrag
Fröwis, M.; Fuchs, A.; Böhme, R. (2019): Detecting Token Systems on Ethereum. Financial Cryptography and Data Security, Lecture Notes in Computer Science, S. 93–112
Befund Token-Verträge lassen sich am ERC-20-Interface im Bytecode erkennen (in der Prüfmenge vollständig). Eine Erkennung am Verhalten fand 89 Prozent und auch Token, die den Standard bewusst nicht umsetzen.
Im Werkzeug Der Rechner nennt passende Standards zu einem Selektor, sagt aber dazu, dass die Selektoren allein nicht beweisen, dass ein Vertrag den Standard wirklich erfüllt.
doi.org/10.1007/978-3-030-32101-7_7 · Konferenzbeitrag
di Angelo, M.; Salzer, G. (2020): Tokens, Types, and Standards: Identification and Utilization in Ethereum. IEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), S. 1–10
Befund Token-Verträge werden aus dem Bytecode identifiziert, indem man prüft, welche Standards ihre Funktionen erfüllen; ausgewertet bis Block 8.750.000 (Oktober 2019).
Im Werkzeug Trägt die Gliederung der Liste nach Standards und die Interface-ID je Standard (ERC-165), mit der Verträge sich selbst ausweisen.
doi.org/10.1109/DAPPS49028.2020.00001 · Konferenzbeitrag
He, N.; Wu, L.; Wang, H.; Guo, Y.; Jiang, X. (2020): Characterizing Code Clones in the Ethereum Smart Contract Ecosystem. Financial Cryptography and Data Security, Lecture Notes in Computer Science, S. 654–675
Befund Von 10 Millionen untersuchten Verträgen hatten über 96 Prozent Duplikate; das Ökosystem ist stark gleichförmig.
Im Werkzeug Erklärt, warum eine kuratierte Liste von wenigen hundert Standard-Signaturen einen großen Teil der Aufrufe im Alltag trifft.
doi.org/10.1007/978-3-030-51280-4_35 · Konferenzbeitrag
Sun, K.; Xu, Z.; Liu, C. u. a. (2023): Demystifying the Composition and Code Reuse in Solidity Smart Contracts. ESEC/FSE 2023, Proceedings of the 31st ACM Joint European Software Engineering Conference, S. 796–807
Befund In über 350.000 Verträgen stammten mehr als 80 Prozent der Teilverträge aus fremden Quellen, rund 35 Prozent davon waren Interfaces für Standards und Protokolle.
Im Werkzeug Begründet, die Liste nach den verbreiteten Bibliotheken zu führen (OpenZeppelin, Uniswap, Safe, Permit2) und je Gruppe die Quelle mit Version zu nennen.
doi.org/10.1145/3611643.3616270 · Konferenzbeitrag
Chen, W.; Zhang, T.; Chen, Z.; Zheng, Z.; Lu, Y. (2020): Traveling the token world: A graph analysis of Ethereum ERC20 token ecosystem. Proceedings of The Web Conference 2020, S. 1411–1421
Befund Über 80 Prozent der ICOs setzten auf ERC-20-Token. Die Studie baut das Ökosystem aus Transaktionen und Event-Logs nach und erkennt darin Beziehungen zwischen Konten.
Im Werkzeug Beispiel dafür, dass Auswertungen Events über das Topic0 filtern; der Rechner liefert genau diesen Wert und weist darauf hin, dass ERC-20 und ERC-721 dasselbe Transfer-Topic0 haben.
doi.org/10.1145/3366423.3380215 · Konferenzbeitrag
Salehi, M.; Clark, J.; Mannan, M. (2023): Not so Immutable: Upgradeability of Smart Contracts on Ethereum. Financial Cryptography and Data Security. FC 2022 International Workshops, Lecture Notes in Computer Science, S. 539–554
Befund Sechs Muster für austauschbare Verträge beschrieben und gemessen: 1,4 Millionen Proxy-Verträge, davon 8.225 eigenständige; rund die Hälfte ließ sich von einer einzelnen Adresse umstellen.
Im Werkzeug Begründet den Abschnitt zu Proxys: Hinter einer Adresse kann später ein anderer Code stehen, also auch andere Selektoren.
doi.org/10.1007/978-3-031-32415-4_33 · Konferenzbeitrag
Li, X.; Yang, J.; Chen, J.; Tang, Y.; Gao, X. (2024): Characterizing Ethereum Upgradable Smart Contracts and Their Security Implications. Proceedings of the ACM Web Conference 2024, S. 1847–1858
Befund Sechs gängige Muster austauschbarer Verträge; über 60 Millionen Verträge ohne Quelltext untersucht, 10.218 Ketten von Upgrades rekonstruiert.
Im Werkzeug Stützt die Aufzählung der Proxy-Muster (Transparent, UUPS, Beacon, Diamond) und den Hinweis, die Upgrade-Events Upgraded und AdminChanged zu beobachten.
doi.org/10.1145/3589334.3645640 · Konferenzbeitrag
Qasse, I.; Hamdaqa, M.; Jónsson, B. Þ. (2025): Immutable in principle, upgradeable by design: exploratory study of smart contract upgradeability. Empirical Software Engineering 31 (2), Art. 39
Befund Von über 44 Millionen Verträgen trugen nur 3 Prozent Merkmale der Austauschbarkeit, und nur 0,34 Prozent davon wurden tatsächlich ausgetauscht.
Im Werkzeug Ordnet ein: Die meisten Verträge sind nicht austauschbar; wo doch, lohnt der Blick auf den EIP-1967-Speicherplatz.
doi.org/10.1007/s10664-025-10779-y · Fachzeitschrift
Chen, C.-K.; Chu, W.-Y.; Tran, M. u. a. (2025): Uncovering Hidden Proxy Smart Contracts for Finding Collision Vulnerabilities in Ethereum. IEEE 45th International Conference on Distributed Computing Systems (ICDCS), S. 1099–1109
Befund Von über 36 Millionen aktiven Verträgen (2015 bis 2023) waren 54,2 Prozent Proxys; rund 1,5 Millionen zeigten mindestens eine Kollision von Funktionen oder Speicher zwischen Proxy und Logik.
Im Werkzeug Grund für die Kollisionsprüfung über mehrere eingefügte Verträge: Proxy und Implementierung zusammen einfügen, dann meldet der Rechner gleiche Selektoren.
doi.org/10.1109/ICDCS63083.2025.00110 · Konferenzbeitrag
Ruaro, N.; Gritti, F.; McLaughlin, R. u. a. (2024): Not your Type! Detecting Storage Collision Vulnerabilities in Ethereum Smart Contracts. Network and Distributed System Security Symposium (NDSS) 2024
Befund Teilen zwei Verträge per delegatecall ihren Speicher und deuten ihn verschieden, entstehen Speicherkollisionen; das System CRUSH untersuchte rund 14,2 Millionen Verträge und erzeugte Beweis-Angriffe.
Im Werkzeug Begründet, warum EIP-1967 Speicherplätze aus einem Hash ableitet; der Rechner erkennt diese drei Plätze beim Nachschlagen.
doi.org/10.14722/ndss.2024.24713 · Konferenzbeitrag
Normen, Behörden und Herstellerangaben
- Contract ABI Specification: Function Selector, Types, Events, Errors · Solidity-Dokumentation
- Panic via assert and Error via require (Panic-Codes) · Solidity-Dokumentation
- EIP-165: Standard Interface Detection · Ethereum Improvement Proposals
- EIP-1967: Proxy Storage Slots · Ethereum Improvement Proposals
- EIP-2535: Diamonds, Multi-Facet Proxy · Ethereum Improvement Proposals
- Proxy Upgrade Pattern: Function Clashes, Transparent und UUPS · OpenZeppelin
- Polynetwork – REKT: Selektor-Kollision 0x41973cd9 · rekt.news (Vorfallsbericht)
- Ethereum Signature Database (öffentliche Einträge) · 4byte.directory
12 / WEITERE WERKZEUGE
Noch eine Frage offen?
- AT-W32 · Betriebe
Blockchain-Eignungs-Check
Braucht Ihr Vorhaben wirklich eine Blockchain, oder reicht eine Datenbank? - AT-W33 · Betriebe
MiCA-Check
Fällt Ihr Token unter MiCA, und welche Pflichten folgen daraus? - AT-W34 · Privat & Betriebe
Gas-Rechner
Was kostet eine Transaktion auf Ethereum, Arbitrum, Optimism, Base oder Polygon? - AT-W35 · Privat & Betriebe
Ethereum-Adress-Prüfer
Ist diese Ethereum-Adresse gültig und richtig geschrieben? Prüfsumme nach EIP-55 und Vergleich zweier Adressen. - AT-W37 · Betriebe
Calldata-Decoder
Was macht diese Transaktion? Calldata lesbar machen, bevor Sie unterschreiben. - AT-W38 · Betriebe
Merkle-Allowlist-Generator
Allowlist für Mint oder Airdrop: Merkle-Root und Beweise aus einer Adressliste.
Sie planen einen Smart Contract oder eine Anwendung, die Verträge anspricht? Schicken Sie uns kurz, worum es geht, gern mit dem kopierten Ergebnis. Wir entwickeln die Verträge und die Oberflächen dazu, aus Rodewisch im Vogtland.
+49 3744 4399760[email protected]Mo–Fr 8–17 Uhr · Straße der Jugend 5, 08228 Rodewisch