Wallet-approvals: controleren en intrekken
Eén ding wil ik eerst rechtzetten, omdat het het beeld van veel mensen over "gehackt worden" op zijn kop zet: een flink deel van de wallets die worden leeggehaald, gaat niet die dag mis. De aanzet ligt weken of maanden eerder, bij een approval die je ooit ergens in een DApp hebt goedgekeurd. Misschien was je op een swap-pagina munten aan het omwisselen, of klikte je op een claim-pagina op "wallet verbinden om je aanspraak te bevestigen", drukte je snel op akkoord, en klaar. Jij was het vergeten. De approval niet — die bleef rustig on-chain hangen, wachtend op de dag dat het goedgekeurde contract stuk zou gaan, of dat het gewoon een phishingcontract was dat nog niet had toegeslagen. Tegen de tijd dat het echt misgaat, is het geld al weg, en pas achteraf ontdek je dat de bron die vergeten approval was.
Deze tekst gaat daarom niet over vage theorie, maar behandelt één concreet klusje van A tot Z: wat een approval precies is, waarom sommige extra gevaarlijk zijn, hoe je al je eigen approvals één keer op een rij zet, hoe je de dingen die je niet wilt intrekt, en hoe je er een gewoonte van maakt zodat het niet weer uit de hand loopt. De vakwoorden leg ik in gewone taal uit, maar niet zo dat het onjuist wordt. Na het lezen zou je zelfstandig een "approval-schoonmaak" moeten kunnen doen. Kun je approvals en handtekeningen nog niet uit elkaar houden, lees dan Risico's bij ondertekenen met je wallet erbij — die twee worden door oplichters vaak door elkaar gebruikt.
Wat is een approval (approve / allowance) precies
Begin bij een onderliggend feit: je tokens (op Ethereum de ERC-20's) zijn geen bestand dat "in je wallet-app zit". Het is een regel met cijfers in het grootboek van het tokencontract — hoeveel saldo er onder een bepaald adres staat, bepaalt dat boek. Je wallet-app is alleen het gereedschap dat je private key vasthoudt en instructies mag ondertekenen zoals "verplaats het saldo dat op mijn naam staat". Over de tokenstandaard zelf geeft de ERC-20-uitleg van de Ethereum Foundation een vrij compleet beeld.
Nu het probleem: als je op een gedecentraliseerde beurs (DEX) munt A wilt omwisselen naar munt B, moet dat beurscontract "namens jou" munt A wegsturen en B terugbrengen. Maar het heeft je private key niet en kan je saldo dus niet zomaar aanraken. Daarom is het mechanisme zo opgezet: je stuurt eerst een transactie die het contract van munt A vertelt "ik sta toe dat contractadres zus-en-zo maximaal N stuks van munt A onder mijn naam wegneemt". Die transactie is de approve, het maximale aantal dat weggenomen mag worden (N) heet de allowance, en de partij die de toestemming krijgt heet de spender.
Wat er daarna gebeurt is cruciaal: zolang de allowance niet op is, hoeft dat goedgekeurde contract je niet opnieuw te laten ondertekenen of bevestigen om dit soort token telkens weer weg te nemen. Dat is geen kwetsbaarheid — het is de basis waarop DeFi automatisch draait. Je keurt één keer goed, en daarna hoeven swaps, liquiditeit toevoegen of aflossen niet elke stap opnieuw handmatig langs jou. Maar juist in dat "één keer goedkeuren, langdurig geldig" zit het addertje: de rechten heb jij weggegeven, ze komen niet vanzelf terug, tenzij jij ze actief intrekt.
Een approval en "inloggen met een handtekening" zijn twee verschillende dingen. Een approval is een on-chain transactie die het recht om een bepaald token van je te bewegen weggeeft; een gewone handtekening bewijst meestal alleen dat je de eigenaar van de wallet bent. Maar er bestaat een soort handtekening (permit) die gelijkstaat aan een approval, en dat is nou juist het gevaarlijke — zie Risico's bij ondertekenen met je wallet.
Een niet helemaal correcte maar makkelijk te onthouden vergelijking: approve is als een machtiging die je aan een incassobedrijf geeft, met daarop "je mag van mijn bankkaart maximaal N euro afschrijven". Binnen dat bedrag hoeft het niet elke keer te vragen. Zolang je de machtiging niet intrekt, blijft ze geldig — ook al gebruik je de dienst van dat bedrijf allang niet meer. Een on-chain approval is precies zoiets, alleen is de partij een contract en gaat het om je tokens.
Waarom setApprovalForAll bij NFT's gevaarlijker is
Bij ERC-20-tokens kun je de approval tenminste nog aan een maximaal aantal N binden. Bij NFT's (ERC-721 / ERC-1155) heet de gebruikelijke manier van goedkeuren setApprovalForAll, en de betekenis daarvan is een stuk grimmiger: het is geen "goedkeuring om één NFT te beheren", maar "goedkeuring dat een adres al mijn NFT's uit deze collectie mag beheren, zonder limiet op aantal of aantal keer". Eén handtekening, en de beschikkingsmacht over de hele collectie is weg. De standaard en goedkeuringswijze voor NFT's staan officieel gedefinieerd in de ERC-721-uitleg van de Ethereum Foundation.
Waarom gebruiken marktplaatsen zo'n "alles goedkeuren"? Omdat een marktplaatscontract bij het aanbieden van een NFT het recht moet hebben om jouw NFT op het moment van verkoop aan de koper over te dragen, terwijl jij vooraf niet weet welke wordt verkocht of wanneer. Daarom vraagt het beheerrecht over de hele collectie aan. Bij een legitieme marktplaats is dat normaal. Maar hetzelfde mechanisme in handen van een phisher is angstaanjagend: een pagina die zich voordoet als "gratis mint" of "claim je limited NFT" laat je misschien precies een setApprovalForAll ondertekenen, met het adres van de oplichter als goedgekeurde partij. Jij denkt dat je gratis een NFT krijgt, maar in werkelijkheid geef je het overdrachtsrecht over je hele — mogelijk waardevolle — collectie weg.
Zie je in je wallet-pop-up iets als Set Approval For All of "alles goedkeuren" verschijnen terwijl je alleen maar één NFT wilt claimen of kopen, stop dan en controleer of de goedgekeurde partij wel het contract van een marktplaats is die je vertrouwt. Behandel "alles goedkeuren" als een hoog-risicohandeling die extra bevestiging verdient, niet als een routinestap waar je achteloos overheen klikt.
Net als bij ERC-20 is setApprovalForAll een on-chain registratie: op te vragen en in te trekken. De tools verderop voor het bekijken en intrekken werken ook voor NFT-approvals. Let er tijdens het opruimen op dat je de NFT-approvals meeneemt en niet alleen naar tokens kijkt.
De gevaren van onbeperkte approvals
Terug naar de allowance N bij ERC-20. In theorie kun je N precies zo hoog zetten als je voor deze transactie nodig hebt. Maar in de praktijk vragen veel DApps standaard een N aan die extreem groot is (bijna oneindig), zodat je later niet telkens opnieuw hoeft goed te keuren. Dat heet onbeperkte approval (unlimited approval). Qua gebruiksgemak scheelt het inderdaad — één keer goedkeuren en je hebt er geen omkijken naar. De prijs is dat je risico maximaal wordt opengezet.
Onbeperkt betekent: zodra dat goedgekeurde contract kwaadaardig is, of oorspronkelijk netjes maar later gekraakt of overgenomen wordt, kan het je volledige saldo van dat ene token wegnemen, onbeperkt vaak, zonder dat jij nog hoeft te bevestigen. Let op de grens: het kan alleen het token aanraken dat je hebt goedgekeurd, niet je andere bezittingen en niet je seed phrase. Maar voor dat ene token staat onbeperkt gelijk aan het langdurig weggeven van de kluissleutel.
- Het risico zit niet in "nu", maar in "later". Het contract dat je goedkeurt is op dat moment misschien echt veilig, maar de approval blijft langdurig geldig. Contracten kunnen worden geüpgraded, private keys gestolen, teams kunnen ervandoor gaan. Onbeperkt maakt dat "op elk toekomstig moment iets misgaat" je hele saldo van dat token kan raken.
- Phishing houdt van onbeperkt. Een phishingpagina verpakt "airdrop claimen" als een onbeperkte approve naar het eigen contract. Op het moment dat je klikt, heeft het langdurig het recht om dat token bij je leeg te halen.
- Je hebt waarschijnlijk niet goed gezien aan wie je goedkeurt. De pop-up toont het spender-adres, maar veel mensen drukken direct op akkoord. Onbeperkt plus de partij niet gecontroleerd is de meest voorkomende blundercombinatie.
De conclusie is niet "onbeperkt mag nooit", maar: kun je een limiet zetten, doe dat dan liever dan gemakzuchtig onbeperkt open te zetten, en ruim onbeperkte approvals extra vaak op. Hoe je beide doet, komt hieronder concreet aan bod.
Hoe je je eigen approval-lijst bekijkt
Het goede nieuws: omdat een approval een echte on-chain registratie is, kun je stuk voor stuk terugvinden welke contracten je welke allowance hebt gegeven. Er zijn twee ingangen die algemeen als goed bekendstaan.
Met de Etherscan Token Approval Checker
Etherscan biedt de Token Approval Checker aan. Vul je adres in (of verbind je wallet), en het toont alle nog geldige ERC-20-approvals onder dat adres, inclusief het goedgekeurde contract (spender), het bijbehorende token, en of de allowance beperkt of onbeperkt is. Etherscan is een van de meest gebruikte blockchain-explorers voor Ethereum, dus de bron die de on-chain-data uitleest is betrouwbaar. Deze stap is puur "kijken" — je hoeft niets te ondertekenen en het kost niets.
Let bij het bekijken vooral op drie kolommen: ten eerste wie de goedgekeurde partij is — zit er een contract tussen dat je totaal niet herkent of waarvan je je niet kunt herinneren waar je het hebt goedgekeurd; ten tweede of de allowance onbeperkt is — let met voorrang op alles wat als unlimited of een extreem groot getal staat; ten derde of je die approval nu nog gebruikt — veel zijn restanten van oude DApps die je allang niet meer gebruikt. Deze drie soorten zijn de belangrijkste kandidaten om in te trekken.
Met revoke.cash: bekijken en intrekken in één
Een handiger hulpmiddel is revoke.cash, dat speciaal gemaakt is voor het bekijken en intrekken van approvals. Je kunt eerst alleen een adres invullen voor een read-only overzicht (kijken kan ook zonder je wallet te verbinden). Het zet zowel ERC-20-approvals als de setApprovalForAll van NFT's op een rij, en markeert per approval het risicopunt. Anders dan een kale blockchain-explorer combineert het "verdachte approval ontdekken" en "met één klik intrekken" in dezelfde interface, wat voor gewone gebruikers vriendelijker is. Pas als je echt wilt intrekken, verbind je je wallet.
Bij de eerste keer kijken schrikken veel mensen van het aantal approvals — hoe meer je hebt gefarmd en hoe meer sites je hebt verbonden, hoe meer er vaak hangt. Geen paniek: dat is juist het signaal dat je moet opruimen. Kijk eerst, kring de verdachte en ongebruikte aan, en trek ze in de volgende sectie in één keer in.
Intrekken: revoke.cash en de Etherscan Token Approval Checker
Intrekken (revoke) komt er in de kern op neer dat je nóg een transactie stuurt die de allowance terug op 0 zet: je vertelt het tokencontract "de allowance die ik een bepaald adres eerder gaf, wordt nu 0". Zodra dat 0 is, kan dat contract je token niet meer aanraken. Beide tools kunnen dit.
Met revoke.cash gaat het meestal zo:
- Open de site en verbind de wallet die je wilt opruimen (controleer of je niet het verkeerde adres verbindt).
- Zoek in de lijst met approvals de regel die je wilt intrekken — geef voorrang aan onbeperkte allowances, onbekende spenders en oude DApps die je niet meer gebruikt.
- Klik op "Intrekken / Revoke" bij die approval. Je wallet toont een transactieverzoek; controleer het en onderteken om te verzenden.
- Wacht tot de transactie on-chain is bevestigd. Daarna staat de allowance van die approval op nul en ververst de lijst.
- Voor de
setApprovalForAllvan NFT's werkt het net zo: zoek het bijbehorende item en klik op intrekken.
Met de Etherscan Token Approval Checker is het vergelijkbaar: na het verbinden van je wallet staat er rechts van elke approval een intrek-ingang. Klik je die aan, dan start ook hier een transactie die de allowance op nul zet; ondertekenen en bevestigen, klaar. De onderliggende handeling van beide tools is dezelfde, alleen de interface verschilt — pak wat jou het beste ligt.
Ook de intrek-tools zelf kunnen worden nagemaakt. Gebruik voor het intrekken de officiële domeinen: bewaar revoke.cash en Etherscan als bladwijzer en ga er elke keer via die bladwijzer heen. Zoek ze niet steeds opnieuw op via een zoekbalk, en klik zeker niet op de advertentielinks bovenaan de zoekresultaten. Meer manieren om officiële kanalen te herkennen lees je in Nep-airdrops en approval-phishing.
En dan een tijdsverschil dat ik duidelijk wil maken: intrekken beperkt de schade, het haalt niets terug. Heeft de tegenpartij met jouw approval al tokens weggehaald, dan voorkomt intrekken alleen dat er "in de toekomst nog meer wordt weggehaald"; wat al weg is, komt niet terug. Vermoed je dat een approval niet klopt, trek dan snel in — maar zie intrekken niet als wondermiddel: het beschermt tegen de toekomst, niet tegen het verleden.
Intrekken is een transactie en kost gas
Dit loopt veel mensen de eerste keer vast, dus apart benoemd: een approval intrekken is een echte on-chain transactie, die je met je wallet moet ondertekenen en waarvoor je gas betaalt. Net als bij de oorspronkelijke approve moeten validators de handeling "zet de allowance terug op 0" in een blok verwerken, en dat kost een transactiekosten.
Dat betekent twee dingen. Ten eerste moet er in de wallet die je wilt opruimen wat van de basismunt zitten om gas te betalen — op Ethereum-mainnet is dat ETH, op andere chains de native munt van die chain. Zit er helemaal geen gas in de wallet, dan kan de intrek-transactie niet worden verzonden. Ten tweede zijn de gaskosten variabel en hangen ze af van hoe druk het netwerk op dat moment is; op een druk Ethereum-mainnet lopen de kosten van één handeling merkbaar op, op een rustig moment zijn ze veel lager. Hoe het precies wordt berekend en waarom het schommelt, staat in de uitleg over gas en transactiekosten van de Ethereum Foundation. Onze eigen adrescontrole-tool helpt je bovendien om vóór een overdracht of interactie te bevestigen dat een adres niet verkeerd is overgenomen (en vóór het intrekken bevestigen dat je de juiste wallet hebt verbonden, is net zo belangrijk).
Heb je een stapel approvals in te trekken en is het gas op mainnet net duur, doe het dan geconcentreerd op een rustig moment, of trek eerst alleen de gevaarlijkste paar in (onbeperkt plus onbekende partij) en ruim de rest op wanneer de kosten laag zijn. Red eerst het gevaarlijkste, doe de rest van de schoonmaak rustig aan.
Nog even iets over verschillende chains: gas op Ethereum-mainnet is relatief duur, en veel mensen zijn dagelijks actief op Layer 2, waar de kosten veel lager liggen. Approvals per chain staan los van elkaar: op welke chain je hebt goedgekeurd, daar moet je ook kijken en intrekken — revoke.cash ondersteunt het wisselen van netwerk. Wil je meer weten over het L2-landschap, dan is L2BEAT een vaak aangehaalde neutrale databron met een overzicht per L2.
Dagelijkse gewoontes: limiteren, wallets scheiden, periodiek nakijken
Bekijken en intrekken zijn herstelacties; rustiger leef je als je van meet af aan minder goedkeurt en het risico klein houdt. De gewoontes hieronder kosten weinig en gebruik ik zelf voortdurend.
Kun je limiteren, zet dan niet onbeperkt open
Nogal wat wallets laten je in de approve-pop-up de allowance handmatig van de standaard "onbeperkt" naar "precies genoeg voor deze keer" veranderen. Een tiental seconden extra, en je verandert het risico "dit contract kan later dit token bij me leeghalen" in "hooguit deze ene keer wordt dit bedrag bewogen". Of je het elke keer aanpast mag je zelf afwegen, maar bij grote bedragen en bij minder bekende contracten is limiteren de moeite waard.
Wallets scheiden: kluis en experiment uit elkaar
Splits het in minstens twee lagen. Eén "kluis-wallet" die alleen langetermijnbezit bewaart, vrijwel geen enkele DApp verbindt en het liefst een hardware-wallet gebruikt; en één "experimenteer-wallet" waarmee je nieuwe sites verbindt, airdrops claimt en taken doet, met alleen een klein bedrag dat je kunt missen. Zo blijft, ook als de experimenteer-wallet ooit door een kwaadaardige approval wordt geraakt, de schade beperkt tot dat kleine bedrag, en blijft de kluis onaangeroerd. Dit is de meest kosteneffectieve verdedigingslinie. Hoe je meerdere wallets beheert en je private key en seed phrase goed bewaart, lees je in Seed-phrase-veiligheid.
Maak van intrekken een periodieke schoonmaak
Approvals stapelen zich op. Maak er een gewoonte van om periodiek (bijvoorbeeld maandelijks) met revoke.cash of Etherscan je approval-lijst langs te lopen en alles wat je niet meer gebruikt of wat er verdacht uitziet in te trekken. Hoe schoner de lijst, hoe kleiner de kans dat een allang vergeten oud contract je meesleept. Je kunt onze Approval-risico-checklist als naslag gebruiken en punt voor punt nagaan wat je intrekt.
Herken eerst de nep-airdrop, voordat je goedkeurt
De bron van veel gevaarlijke approvals is een phishingpagina waar je überhaupt niet had moeten komen. De allereerste stap is dus het herkennen van een nep-airdrop — een pagina die je tokens belooft maar je wil laten goedkeuren of een gestructureerd bericht wil laten ondertekenen heeft de richting omgedraaid. Die beoordeling behandelen we uitgebreid in Nep-airdrops en approval-phishing, en samen met dit artikel lees je het vollediger. Voor de veiligheidsinstellingen van de wallet zelf houd je de officiële documentatie van jouw wallet aan, bijvoorbeeld het MetaMask Support-centrum.
Toen ik voor het eerst mijn approval-lijst tevoorschijn haalde, was ik ook even stil — zoveel approvals waarvan ik allang niet meer wist waar ik ze had aangezet, en een paar met onbeperkte allowance. Toen ze eenmaal weg waren, voelde dat opgelucht. Later maakte ik er een vast maandelijks ritueel van, en sindsdien is dat lichte ongemak van "ik weet niet waar er nog een bom hangt" verdwenen.
Ik rond af. De kern van een approval is simpel: om een DApp te gebruiken geef je het recht om "een bepaald token te bewegen" weg, dat recht komt niet vanzelf terug, en onbeperkt maakt het gevaarlijker. De oplossing is even nuchter — limiteer waar het kan, scheid kluis en experiment, ruim ongebruikte approvals periodiek met een betrouwbare tool op, en herken altijd eerst de nep-airdrop voordat je beslist of je ondertekent. Maak dat tot gewoonte, en het scenario waarin "een oude approval van jaren geleden je plotseling pakt" landt niet snel bij jou.