]>
| description | Minimal EVM bytecode to irreversibly destroy ETH. |
| last change | Sun, 4 Oct 2026 03:25:57 +0000 (20:25 -0700) |
| URL | https://git.ardis.lu/minimal-eth-burner.git |
| ssh://git@git.ardis.lu/~/minimal-eth-burner.git | |
| git@git.ardis.lu:minimal-eth-burner.git |
Important
EIP-8246 (scheduled for inclusion in Glamsterdam, targeting December 2026) will disable this method of burning ETH.
On Ethereum, it's common to "burn" (destroy) ETH by sending it to a "burner address" like 0x000000000000000000000000000000000000dead.
However, ETH sent to burner addresses is theoretically recoverable if private keys associated with the burner addresses are ever discovered. The only way to actually destroy ETH is by either:
SELFDESTRUCT and sends its ETH to itself in the same transaction that the smart contract is created.This repository contains the minimal amount of code to create a new smart contract that immediately calls SELFDESTRUCT and sends its ETH to itself. All ETH sent to the smart contract creation transaction will be irreversibly destroyed.
Code repository mirrors: GitHub, Codeberg, git.ardis.lu
See example JavaScript below. Copy this code into the DevTools console in any web browser where you have an EIP-1193 wallet (e.g., MetaMask) installed.
Caution
All ETH sent in this transaction will be irreversibly destroyed.
const addr = (await ethereum.request({ method: 'eth_requestAccounts' }))[0]; // Current address
const deployer = '0x696130ff5f526002601ef35f525f5f5f5f5f600a601634f05af1'; // See deployer.eas
const burn = '100000000000000000'; // Amount of ETH to burn (in wei)
// Irreversibly destroys all ETH sent
await ethereum.request({
method: 'eth_sendTransaction',
params: [{
from: addr,
data: deployer,
value: `0x${BigInt(burn).toString(16)}`
}]
});
If you have multiple wallets installed, use the EIP-6963 events to select which wallet you want to use:
const wallets = [];
window.addEventListener('eip6963:announceProvider', e => wallets.push(e.detail));
window.dispatchEvent(new Event('eip6963:requestProvider'));
console.table(wallets.map(w => w.info.name));
const { provider } = wallets[0]; // Replace 0 with the index of the wallet you want to use
// The remainder is the same as above except using `provider` instead of `ethereum`
const addr = (await provider.request({ method: 'eth_requestAccounts' }))[0]; // Current address
const deployer = '0x696130ff5f526002601ef35f525f5f5f5f5f600a601634f05af1'; // See deployer.eas
const burn = '100000000000000000'; // Amount of ETH to burn (in wei)
// Irreversibly destroys all ETH sent
await provider.request({
method: 'eth_sendTransaction',
params: [{
from: addr,
data: deployer,
value: `0x${BigInt(burn).toString(16)}`
}]
});
EIP-6780 (which went live in the Dencun upgrade in March 2024) updates the behavior of the SELFDESTRUCT opcode so that a smart contract calling SELFDESTRUCT will only delete itself when it's called in the same transaction that created it.
Since the deployer.eas bytecode creates a new smart contract and then immediately calls it in the same transaction, its behavior is not changed by EIP-6780.
Use geas to assemble the files:
geas burner.eas
geas deployer.eas
| 2 weeks ago | main | shortlog | log | tree |